コード例 #1
0
        protected override void DoEffect(PlayerController player)
        {
            BraveUtility.RandomElement(ImprovedCandies.PositiveCandyEffects).Invoke(player);
            player.BloopItemAboveHead(base.sprite);

            ETGModConsole.Log("GJ idiot ...");
        }
コード例 #2
0
        private IEnumerator KillInventoryCompanion(PlayerController user)
        {
            //ETGModConsole.Log("KillInventoryCompanion Triggered");

            PickupObject item         = BraveUtility.RandomElement(CompanionItems);
            Gun          gunness      = item.gameObject.GetComponent <Gun>();
            DebrisObject debrisObject = SpecialDrop.DropItem(user, item, gunness != null);


            yield return(new WaitForSeconds(1f));

            if (debrisObject != null)
            {
                AkSoundEngine.PostEvent("Play_WPN_smileyrevolver_shot_01", gameObject);
                Instantiate <GameObject>(EasyVFXDatabase.TeleporterPrototypeTelefragVFX, debrisObject.sprite.WorldCenter, Quaternion.identity);
                GameManager.Instance.StartCoroutine(DoReward(user, debrisObject.sprite.WorldCenter, item.PickupObjectId));
                UnityEngine.Object.Destroy(debrisObject.gameObject);
            }
            else
            {
                ETGModConsole.Log("DebrisObject was null in the kill code, this should never happen.");
            }

            yield break;
        }
コード例 #3
0
        private void Start()
        {
            Dungeon              m_dungeonPrefab     = DungeonDatabase.GetOrLoadByName("finalscenario_guide");
            DungeonFlow          dungeonFlowPrefab   = m_dungeonPrefab.PatternSettings.flows[0];
            PrototypeDungeonRoom GuidePastRoom       = dungeonFlowPrefab.AllNodes[0].overrideExactRoom;
            GameObject           GuidePastRoomObject = GuidePastRoom.placedObjects[0].nonenemyBehaviour.gameObject;
            GameObject           m_RainPrefab        = GuidePastRoomObject.transform.Find("Rain").gameObject;

            GameObject m_ThunderStorm = Instantiate(m_RainPrefab);

            m_ThunderStorm.name = "ExpandRain";
            m_StormController   = m_ThunderStorm.GetComponent <ThunderstormController>();
            ParticleSystem m_CachedParticleSystem = m_StormController.RainSystemTransform.GetComponent <ParticleSystem>();

            if (useCustomIntensity)
            {
                BraveUtility.SetEmissionRate(m_CachedParticleSystem, RainIntensity);
            }
            m_StormController.DecayVertical = isLocalToRoom;
            m_StormController.DoLighting    = false;
            LightningRenderers = m_StormController.LightningRenderers;
            m_ThunderStorm.transform.parent = gameObject.transform;

            dungeonFlowPrefab = null;
            m_dungeonPrefab   = null;

            isActive = true;
        }
コード例 #4
0
 public void Invisible(Projectile proj, float f)
 {
     if (proj != null && proj.sprite != null)
     {
         proj.sprite.renderer.enabled = false;
     }
     if (proj.GetComponentInChildren <TrailController>() != null)
     {
         Destroy(proj.GetComponentInChildren <TrailController>());
     }
     proj.StartCoroutine(this.DelayedDestroyParticles(proj));
     if (proj.ParticleTrail != null)
     {
         BraveUtility.EnableEmission(proj.ParticleTrail, false);
     }
     if (proj.particleSystem != null)
     {
         Destroy(proj.particleSystem);
     }
     if (proj.CustomTrailRenderer != null)
     {
         proj.CustomTrailRenderer.enabled = false;
     }
     if (proj.TrailRenderer != null)
     {
         proj.TrailRenderer.enabled = false;
     }
     if (proj.TrailRendererController != null)
     {
         proj.TrailRendererController.enabled = false;
     }
 }
コード例 #5
0
        private void Awake()
        {
            m_hasAwoken = true;
            if (!m_gun)
            {
                m_gun = GetComponent <Gun>();
            }
            if (m_gun)
            {
                m_gun.OnInitializedWithOwner = (Action <GameActor>)Delegate.Combine(m_gun.OnInitializedWithOwner, new Action <GameActor>(OnGunInitialized));
                m_gun.OnDropped = (Action)Delegate.Combine(m_gun.OnDropped, new Action(OnGunDroppedOrDestroyed));
                if (m_gun.CurrentOwner != null)
                {
                    OnGunInitialized(m_gun.CurrentOwner);
                }

                if (TransfmorgifyTargetGUIDs != null && TransfmorgifyTargetGUIDs.Count <= 0 && IsBootlegShotgun)
                {
                    List <string> m_GUIDlist = new List <string>()
                    {
                        ExpandCustomEnemyDatabase.BootlegShotgunManBlueGUID,
                        ExpandCustomEnemyDatabase.BootlegShotgunManRedGUID
                    };
                    m_GUIDlist = m_GUIDlist.Shuffle();
                    TransfmorgifyTargetGUIDs.Add(BraveUtility.RandomElement(m_GUIDlist));
                }
            }
        }
コード例 #6
0
        private DungeonData.Direction GetFacingDirection(IntVector2 pos1, IntVector2 pos2)
        {
            DungeonData data = GameManager.Instance.Dungeon.data;

            if (data.isWall(pos1 + IntVector2.Down) && data.isWall(pos1 + IntVector2.Up))
            {
                return(DungeonData.Direction.EAST);
            }
            if (data.isWall(pos2 + IntVector2.Down) && data.isWall(pos2 + IntVector2.Up))
            {
                return(DungeonData.Direction.WEST);
            }
            if (data.isWall(pos1 + IntVector2.Down) && data.isWall(pos2 + IntVector2.Down))
            {
                return(DungeonData.Direction.NORTH);
            }
            if (data.isWall(pos1 + IntVector2.Up) && data.isWall(pos2 + IntVector2.Up))
            {
                return(DungeonData.Direction.SOUTH);
            }
            Debug.LogError("Not able to determine the direction of a wall mimic! Using random direction instead!");
            // return DungeonData.Direction.SOUTH;
            return(BraveUtility.RandomElement(new List <DungeonData.Direction>()
            {
                DungeonData.Direction.EAST,
                DungeonData.Direction.WEST,
                DungeonData.Direction.NORTH,
                DungeonData.Direction.SOUTH
            }
                                              ));
        }
コード例 #7
0
        public static void AddRandomCurse(bool doPopup = false)
        {
            List <CurseData> refinedData = new List <CurseData>();

            refinedData.AddRange(CursePrefabs);
            if (CurrentActiveCurses.Count > 0)
            {
                for (int i = (refinedData.Count - 1); i >= 0; i--)
                {
                    if (CurseManager.CurseIsActive(refinedData[i].curseName))
                    {
                        refinedData.RemoveAt(i);
                    }
                    else if (cursesLastFloor != null && cursesLastFloor.Contains(refinedData[i].curseName))
                    {
                        refinedData.RemoveAt(i);
                    }
                    else if (bannedCursesThisRun != null && bannedCursesThisRun.Contains(refinedData[i].curseName))
                    {
                        refinedData.RemoveAt(i);
                    }
                }
            }
            if (refinedData.Count > 0)
            {
                CurseData pickedCurse = BraveUtility.RandomElement(refinedData);
                AddCurse(pickedCurse.curseName, doPopup);
            }
        }
コード例 #8
0
 protected override void OnTrigger(Vector2 damageDirection)
 {
     if (m_hasTriggered)
     {
         return;
     }
     m_hasTriggered = true;
     if (guaranteedSpawnGenerations <= 0f && chanceToSpawn < 1f && UnityEngine.Random.value > chanceToSpawn)
     {
         return;
     }
     if (!string.IsNullOrEmpty(spawnVfx))
     {
         aiAnimator.PlayVfx(spawnVfx, null, null, null);
     }
     string[] array = null;
     if (enemySelection == EnemySelection.All)
     {
         array = enemyGuidsToSpawn;
     }
     else if (enemySelection == EnemySelection.Random)
     {
         array = new string[UnityEngine.Random.Range(minSpawnCount, maxSpawnCount)];
         for (int i = 0; i < array.Length; i++)
         {
             array[i] = BraveUtility.RandomElement(enemyGuidsToSpawn);
         }
     }
     SpawnEnemies(array);
 }
コード例 #9
0
 protected override void DoEffect(PlayerController user)
 {
     if (user.carriedConsumables.KeyBullets == 1)
     {
         Vector2      yourPosition   = user.sprite.WorldCenter + new Vector2(-0.5f, 0f);
         List <Chest> possibleChests = new List <Chest>
         {
             GameManager.Instance.RewardManager.D_Chest,
             GameManager.Instance.RewardManager.C_Chest,
             GameManager.Instance.RewardManager.B_Chest,
         };
         Chest chest = Chest.Spawn(BraveUtility.RandomElement(possibleChests), yourPosition, yourPosition.GetAbsoluteRoom());
         chest.IsLocked = false;
         user.carriedConsumables.KeyBullets -= 1;
     }
     else if (user.carriedConsumables.KeyBullets > 1 && user.carriedConsumables.KeyBullets < 7)
     {
         Vector2      yourPosition   = user.sprite.WorldCenter + new Vector2(-0.5f, 0f);
         List <Chest> possibleChests = new List <Chest>
         {
             GameManager.Instance.RewardManager.A_Chest,
             GameManager.Instance.RewardManager.S_Chest,
         };
         Chest chest = Chest.Spawn(BraveUtility.RandomElement(possibleChests), yourPosition, yourPosition.GetAbsoluteRoom());
         chest.IsLocked = false;
         user.carriedConsumables.KeyBullets -= 2;
     }
     else
     {
         Vector2 yourPosition = user.sprite.WorldCenter + new Vector2(-0.5f, 0f);
         Chest   chest        = Chest.Spawn(GameManager.Instance.RewardManager.Rainbow_Chest, yourPosition, yourPosition.GetAbsoluteRoom());
         chest.IsLocked = false;
         user.carriedConsumables.KeyBullets -= 7;
     }
 }
コード例 #10
0
        private void DoSpawn()
        {
            DisplacedEnemy enemy = BraveUtility.RandomElement(listOfDisplacedEnemies.DisplacedEnemies);

            var        Enemy = EnemyDatabase.GetOrLoadByGuid(enemy.GUID);
            IntVector2?bestRewardLocation = m_player.CurrentRoom.GetRandomVisibleClearSpot(2, 2);
            AIActor    TargetActor        = AIActor.Spawn(Enemy.aiActor, bestRewardLocation.Value, GameManager.Instance.Dungeon.data.GetAbsoluteRoomFromPosition(bestRewardLocation.Value), true, AIActor.AwakenAnimationType.Default, true);

            PhysicsEngine.Instance.RegisterOverlappingGhostCollisionExceptions(TargetActor.specRigidbody, null, false);
            if (TargetActor.IsBlackPhantom && !enemy.ISJAMMED)
            {
                TargetActor.UnbecomeBlackPhantom();
            }
            else if (!TargetActor.IsBlackPhantom && enemy.ISJAMMED)
            {
                TargetActor.BecomeBlackPhantom();
            }
            TargetActor.healthHaver.ForceSetCurrentHealth(enemy.HEALTH);


            listOfDisplacedEnemies.DisplacedEnemies.Remove(enemy);

            AkSoundEngine.PostEvent("Play_OBJ_chestwarp_use_01", gameObject);
            var tpvfx = (PickupObjectDatabase.GetById(573) as ChestTeleporterItem).TeleportVFX;

            SpawnManager.SpawnVFX(tpvfx, TargetActor.sprite.WorldCenter, Quaternion.identity, true);
        }
コード例 #11
0
        private void HitEnemy(Projectile projectile, SpeculativeRigidbody enemy, bool killed)
        {
            projectile.Speed           *= 1.2f;
            projectile.baseData.damage *= .8f;

            PierceProjModifier orAddComponent = projectile.gameObject.GetOrAddComponent <PierceProjModifier>();

            orAddComponent.penetratesBreakables = true;
            orAddComponent.penetration++;
            Vector2 dirVec = UnityEngine.Random.insideUnitCircle;
            float   num    = this.ChanceToSeekEnemyOnBounce;

            if (UnityEngine.Random.value < num && enemy.aiActor)
            {
                Func <AIActor, bool> isValid = (AIActor a) => a && a.HasBeenEngaged && a.healthHaver && a.healthHaver.IsVulnerable;
                AIActor closestToPosition    = BraveUtility.GetClosestToPosition <AIActor>(enemy.aiActor.ParentRoom.GetActiveEnemies(RoomHandler.ActiveEnemyType.All), enemy.UnitCenter, isValid, new AIActor[]
                {
                    enemy.aiActor
                });
                if (closestToPosition)
                {
                    dirVec = closestToPosition.CenterPosition - projectile.transform.position.XY();
                }
            }
            projectile.SendInDirection(dirVec, false, true);
        }
コード例 #12
0
        public static void HandleLoadout(PlayerController player)
        {
            var starterGuns = AllStarterGuns[Random.Range(0, AllStarterGuns.Length)];

            player.inventory.AddGunToInventory(Gungeon.Game.Items[starterGuns.First] as Gun, false);
            if (!string.IsNullOrEmpty(starterGuns.Second))
            {
                player.inventory.AddGunToInventory(Gungeon.Game.Items[starterGuns.Second] as Gun, false);
            }
            if (BraveUtility.RandomBool())
            {
                var gun = GetWeightedRandomItem <Gun>();
                player.startingGunIds.Add(gun.PickupObjectId);
                LootEngine.TryGivePrefabToPlayer(gun.gameObject, player, true);
            }
            else
            {
                var active = GetWeightedRandomItem <PlayerItem>();
                player.startingActiveItemIds.Add(active.PickupObjectId);
                LootEngine.TryGivePrefabToPlayer(active.gameObject, player, true);
            }
            var passive = GetWeightedRandomItem <PassiveItem>();

            passive.CanBeDropped = false;
            player.startingGunIds.Add(passive.PickupObjectId);
            LootEngine.TryGivePrefabToPlayer(passive.gameObject, player, true);
        }
コード例 #13
0
 public override void OnReloadPressed(PlayerController player, Gun gun, bool bSOMETHING)
 {
     if (ActiveBullets.Count > 0)
     {
         foreach (Projectile bullet in ActiveBullets)
         {
             if (bullet)
             {
                 Vector2 dirVec               = UnityEngine.Random.insideUnitCircle;
                 Vector2 bulletPosition       = bullet.sprite.WorldCenter;
                 Func <AIActor, bool> isValid = (AIActor a) => a && a.HasBeenEngaged && a.healthHaver && a.healthHaver.IsVulnerable;
                 IntVector2           bulletPositionIntVector2 = bulletPosition.ToIntVector2();
                 AIActor closestToPosition = BraveUtility.GetClosestToPosition <AIActor>(GameManager.Instance.Dungeon.data.GetAbsoluteRoomFromPosition(bulletPositionIntVector2).GetActiveEnemies(RoomHandler.ActiveEnemyType.All), bullet.sprite.WorldCenter, isValid, new AIActor[]
                 {
                 });
                 if (closestToPosition)
                 {
                     dirVec = closestToPosition.CenterPosition - bullet.transform.position.XY();
                 }
                 bullet.SendInDirection(dirVec, false, true);
                 if (!player.PlayerHasActiveSynergy("Pistols Requiem"))
                 {
                     BulletsToRemoveFromActiveBullets.Add(bullet);
                 }
             }
         }
         foreach (Projectile bullet in BulletsToRemoveFromActiveBullets)
         {
             ActiveBullets.Remove(bullet);
         }
         BulletsToRemoveFromActiveBullets.Clear();
     }
     base.OnReloadPressed(player, gun, bSOMETHING);
 }
コード例 #14
0
        private void Start()
        {
            //base.aiActor.HasBeenEngaged = true;
            base.aiActor.healthHaver.OnPreDeath += (obj) =>
            {
                //AkSoundEngine.PostEvent("Play_ENM_beholster_death_01", base.aiActor.gameObject);
                //Chest chest2 = GameManager.Instance.RewardManager.SpawnTotallyRandomChest(spawnspot)rg;
                //chest2.IsLocked = false;
            };
            base.healthHaver.healthHaver.OnDeath += (obj) =>
            {
                float itemsToSpawn = UnityEngine.Random.Range(3, 6);
                float spewItemDir  = 360 / itemsToSpawn;
                // new Vector2(spewItemDir * itemsToSpawn, 0);

                for (int i = 0; i < itemsToSpawn; i++)
                {
                    int id = BraveUtility.RandomElement <int>(TheStranger.Lootdrops);
                    LootEngine.SpawnItem(PickupObjectDatabase.GetById(id).gameObject, base.aiActor.sprite.WorldCenter, new Vector2(spewItemDir * itemsToSpawn, spewItemDir * itemsToSpawn), 2.2f, false, true, false);
                }

                Chest chest2 = GameManager.Instance.RewardManager.SpawnTotallyRandomChest(GameManager.Instance.PrimaryPlayer.CurrentRoom.GetRandomVisibleClearSpot(1, 1));
                chest2.IsLocked = false;
            };;
            this.aiActor.knockbackDoer.SetImmobile(true, "nope.");
        }
コード例 #15
0
        private void HandleRatBossSetup()
        {
            GameObject SpecialRatBoss = DungeonPlaceableUtility.InstantiateDungeonPlaceable(EnemyDatabase.GetOrLoadByGuid("6868795625bd46f3ae3e4377adce288b").gameObject, m_ParentRoom, new IntVector2(17, 28), true, AIActor.AwakenAnimationType.Awaken, true);
            AIActor    RatBossAIActor = SpecialRatBoss.GetComponent <AIActor>();

            if (RatBossAIActor != null)
            {
                PickupObject.ItemQuality targetQuality = (UnityEngine.Random.value >= 0.2f) ? ((!BraveUtility.RandomBool()) ? PickupObject.ItemQuality.C : PickupObject.ItemQuality.D) : PickupObject.ItemQuality.B;
                GenericLootTable         lootTable     = (!BraveUtility.RandomBool()) ? GameManager.Instance.RewardManager.GunsLootTable : GameManager.Instance.RewardManager.ItemsLootTable;
                PickupObject             item          = LootEngine.GetItemOfTypeAndQuality <PickupObject>(targetQuality, lootTable, false);
                PickupObject             item2         = LootEngine.GetItemOfTypeAndQuality <PickupObject>(targetQuality, lootTable, false);
                Destroy(RatBossAIActor.gameObject.GetComponent <ResourcefulRatDeathController>());
                Destroy(RatBossAIActor.gameObject.GetComponent <ResourcefulRatRewardRoomController>());
                RatBossAIActor.State        = AIActor.ActorState.Awakening;
                RatBossAIActor.StealthDeath = true;
                RatBossAIActor.healthHaver.gameObject.AddComponent <ExpandSpawnGlitchObjectOnDeath>();
                ExpandSpawnGlitchObjectOnDeath ObjectSpawnerComponent = RatBossAIActor.healthHaver.gameObject.GetComponent <ExpandSpawnGlitchObjectOnDeath>();
                ObjectSpawnerComponent.spawnRatCorpse     = true;
                ObjectSpawnerComponent.ratCorpseSpawnsKey = true;
                ObjectSpawnerComponent.parentEnemyWasRat  = true;
                if (item && item2)
                {
                    RatBossAIActor.AdditionalSafeItemDrops = new List <PickupObject> {
                        item, item2
                    };
                }
                RatBossAIActor.healthHaver.enabled = true;
                RatBossAIActor.healthHaver.forcePreventVictoryMusic = true;
                RatBossAIActor.ConfigureOnPlacement(m_ParentRoom);
                RatBossAIActor.specRigidbody.CollideWithOthers = true;
            }
        }
コード例 #16
0
 private void PickStats()
 {
     if (hasPicked)
     {
         return;
     }
     else
     {
         for (int i = 0; i < 2; i++)
         {
             Effect effect = BraveUtility.RandomElement(statEffects);
             statEffects.Remove(effect);
             if (effect.modifyMethod == StatModifier.ModifyMethod.MULTIPLICATIVE)
             {
                 AddStat(effect.statToEffect, effect.amount, StatModifier.ModifyMethod.MULTIPLICATIVE);
             }
             else
             {
                 AddStat(effect.statToEffect, effect.amount, StatModifier.ModifyMethod.ADDITIVE);
             }
         }
         Owner.stats.RecalculateStats(Owner, true, false);
         hasPicked = true;
     }
 }
コード例 #17
0
        private void AssignPillPools()
        {
            BlueBluePillEffect = BraveUtility.RandomElement(pillEffectPool);
            pillEffectPool.Remove(BlueBluePillEffect);

            PillPoolsAssigned = true;
        }
コード例 #18
0
        public static void ChestPreOpen(Chest self, PlayerController opener)
        {
            JammedChestBehav jamness = self.gameObject.GetComponent <JammedChestBehav>();

            if (jamness != null)
            {
                self.PredictContents(opener);
                if (UnityEngine.Random.value <= 0.5f)
                {
                    List <PickupObject> items = GenerateContents(self.lootTable, self.breakertronLootTable, opener, 0, new System.Random());
                    self.contents.AddRange(items);
                }
                else
                {
                    int          lootID = BraveUtility.RandomElement(LootIDs);
                    PickupObject obj    = PickupObjectDatabase.GetById(lootID);
                    self.contents.Add(obj);
                }
            }
            if (jamness != null)
            {
                SaveAPIManager.RegisterStatChange(CustomTrackedStats.JAMMED_CHESTS_OPENED, 1);
                LootEngine.SpawnCurrency(self.sprite.WorldCenter, UnityEngine.Random.Range(10, 21), false);
                if (UnityEngine.Random.value <= 0.25f && opener.name != "PlayerShade(Clone)")
                {
                    opener.healthHaver.ApplyDamage(1f, Vector2.zero, "Jammed Chest");
                }
            }
        }
コード例 #19
0
            private void ApplyLinearDamage(Vector2 p1, Vector2 p2)
            {
                float damage = damagePerHit;

                if (PassiveItem.IsFlagSetForCharacter(Owner, typeof(BattleStandardItem)))
                {
                    damage *= BattleStandardItem.BattleStandardCompanionDamageMultiplier;
                }

                for (int i = 0; i < StaticReferenceManager.AllEnemies.Count; i++)
                {
                    AIActor aiactor = StaticReferenceManager.AllEnemies[i];
                    if (!this.m_damagedEnemies.Contains(aiactor))
                    {
                        if (aiactor && aiactor.HasBeenEngaged && aiactor.IsNormalEnemy && aiactor.specRigidbody)
                        {
                            Vector2 zero = Vector2.zero;
                            bool    flag = BraveUtility.LineIntersectsAABB(p1, p2, aiactor.specRigidbody.HitboxPixelCollider.UnitBottomLeft, aiactor.specRigidbody.HitboxPixelCollider.UnitDimensions, out zero);
                            if (flag)
                            {
                                aiactor.healthHaver.ApplyDamage(this.damagePerHit, Vector2.zero, "Chain Lightning", CoreDamageTypes.Electric, DamageCategory.Normal, false, null, false);
                                GameManager.Instance.StartCoroutine(this.HandleDamageCooldown(aiactor));
                            }
                        }
                    }
                }
            }
コード例 #20
0
 protected override void OnTrigger(Vector2 damageDirection)
 {
     if (m_hasTriggered)
     {
         return;
     }
     m_hasTriggered = true;
     if (chanceToSpawn < 1f && UnityEngine.Random.value > chanceToSpawn)
     {
         return;
     }
     if (spawnRatKey)
     {
         SpawnRatKey(); return;
     }
     GameObject[] array = null;
     if (objectSelection == ObjectSelection.All)
     {
         array = objectsToSpawn;
     }
     else if (objectSelection == ObjectSelection.Random)
     {
         array = new GameObject[UnityEngine.Random.Range(minSpawnCount, maxSpawnCount)];
         for (int i = 0; i < array.Length; i++)
         {
             array[i] = BraveUtility.RandomElement(objectsToSpawn);
         }
     }
     if (parentEnemyWasRat)
     {
         PickupObject.RatBeatenAtPunchout = true;
     }
     SpawnObjects(array);
 }
コード例 #21
0
        private void InitStorm()
        {
            Dungeon              m_dungeonPrefab     = DungeonDatabase.GetOrLoadByName("finalscenario_guide");
            DungeonFlow          dungeonFlowPrefab   = m_dungeonPrefab.PatternSettings.flows[0];
            PrototypeDungeonRoom GuidePastRoom       = dungeonFlowPrefab.AllNodes[0].overrideExactRoom;
            GameObject           GuidePastRoomObject = GuidePastRoom.placedObjects[0].nonenemyBehaviour.gameObject;
            GameObject           m_RainPrefab        = GuidePastRoomObject.transform.Find("Rain").gameObject;

            m_ThunderStorm      = Instantiate(m_RainPrefab);
            m_ThunderStorm.name = "ChaosRain";
            ThunderstormController stormController        = m_ThunderStorm.GetComponent <ThunderstormController>();
            ParticleSystem         m_CachedParticleSystem = stormController.RainSystemTransform.GetComponent <ParticleSystem>();

            if (useCustomIntensity)
            {
                BraveUtility.SetEmissionRate(m_CachedParticleSystem, RainIntensity);
            }
            m_cachedEmissionRate          = m_CachedParticleSystem.emission.rate.constant;
            stormController.DecayVertical = false;
            stormController.DoLighting    = false;
            m_ChaosLightning = new GameObject("ChaosLightning");
            m_ChaosLightning.AddComponent <ChaosWeatherController>();
            ChaosWeatherController LightningComponent = m_ChaosLightning.GetComponent <ChaosWeatherController>();

            LightningComponent.LightningRenderers = stormController.LightningRenderers;
            dungeonFlowPrefab = null;
            m_dungeonPrefab   = null;
        }
        public static Vector2 GetVectorToNearestEnemy(this Vector3 bulletPos, float angleFromAim = 0, float angleVariance = 0, PlayerController playerToScaleAccuracyOff = null)
        {
            Vector2 dirVec               = UnityEngine.Random.insideUnitCircle;
            Vector2 bulletPosition       = bulletPos;
            Func <AIActor, bool> isValid = (AIActor a) => a && a.HasBeenEngaged && a.healthHaver && a.healthHaver.IsVulnerable;
            IntVector2           bulletPositionIntVector2 = bulletPosition.ToIntVector2();
            AIActor closestToPosition = BraveUtility.GetClosestToPosition <AIActor>(GameManager.Instance.Dungeon.data.GetAbsoluteRoomFromPosition(bulletPositionIntVector2).GetActiveEnemies(RoomHandler.ActiveEnemyType.All), bulletPosition, isValid, new AIActor[]
            {
            });

            if (closestToPosition)
            {
                dirVec = closestToPosition.CenterPosition - bulletPosition;
            }
            if (angleFromAim != 0)
            {
                dirVec = dirVec.Rotate(angleFromAim);
            }
            if (angleVariance != 0)
            {
                if (playerToScaleAccuracyOff != null)
                {
                    angleVariance *= playerToScaleAccuracyOff.stats.GetStatValue(PlayerStats.StatType.Accuracy);
                }
                float positiveVariance = angleVariance * 0.5f;
                float negativeVariance = positiveVariance * -1f;
                float finalVariance    = UnityEngine.Random.Range(negativeVariance, positiveVariance);
                dirVec = dirVec.Rotate(finalVariance);
            }
            return(dirVec);
        }
コード例 #23
0
 private void EndEffect(PlayerController player)
 {
     if (UnityEngine.Random.value < this.m_exhaustionChance)
     {
         player.StartCoroutine(this.EndEffectCR(player));
     }
     if (UnityEngine.Random.value < this.m_exhaustionChance)
     {
         List <RoomHandler> rooms = new List <RoomHandler>();
         foreach (RoomHandler room in GameManager.Instance.Dungeon.data.rooms)
         {
             if (!room.hasEverBeenVisited)
             {
                 rooms.Add(room);
             }
         }
         if (rooms.Count > 0)
         {
             RoomHandler randomRoom          = BraveUtility.RandomElement(rooms);
             IntVector2? randomAvailableCell = randomRoom.GetRandomAvailableCell(new IntVector2?(GreenChamberEyeController.hallucinationEyePrefab.GetComponent <GreenChamberEyeController>().specRigidbody.UnitDimensions.ToIntVector2(VectorConversions.Ceil)),
                                                                                 new CellTypes?(CellTypes.FLOOR | CellTypes.PIT), false, null);
             if (randomAvailableCell.HasValue)
             {
                 Instantiate(GreenChamberEyeController.hallucinationEyePrefab, randomAvailableCell.Value.ToVector3(0), Quaternion.identity).GetComponent <GreenChamberEyeController>().BindWithRoom(randomRoom);
             }
         }
     }
     this.m_exhaustionChance = Mathf.Min(this.m_exhaustionChance += 0.01f, 0.05f);
     AkSoundEngine.PostEvent("Play_ENM_lighten_world_01", player.gameObject);
     this.spriteAnimator.Play("unmelt");
 }
        public static Vector2 GetPositionOfNearestEnemy(this Vector2 startPosition, bool canTargetNonRoomClear, bool targetSprite = false, List <AIActor> excludedActors = null)
        {
            List <AIActor> exclude = new List <AIActor>();

            if (excludedActors != null && excludedActors.Count > 0)
            {
                exclude.AddRange(excludedActors);
            }
            Func <AIActor, bool> isValid           = (AIActor a) => a && a.HasBeenEngaged && a.healthHaver && a.healthHaver.IsVulnerable && a.healthHaver.IsAlive && !a.IsGone && !exclude.Contains(a) && a.IsWorthShootingAt && a.isActiveAndEnabled && a.CanTargetPlayers && a.GetComponent <CompanionController>() == null;
            IntVector2           intVectorStartPos = startPosition.ToIntVector2();

            RoomHandler.ActiveEnemyType enemyType = RoomHandler.ActiveEnemyType.RoomClear;
            if (canTargetNonRoomClear)
            {
                enemyType = RoomHandler.ActiveEnemyType.All;
            }
            AIActor closestToPosition = BraveUtility.GetClosestToPosition <AIActor>(GameManager.Instance.Dungeon.data.GetAbsoluteRoomFromPosition(intVectorStartPos).GetActiveEnemies(enemyType), startPosition, isValid, new AIActor[] { });

            if (closestToPosition == null)
            {
                return(Vector2.zero);
            }
            if (targetSprite && closestToPosition.sprite)
            {
                return(closestToPosition.sprite.WorldCenter);
            }
            else
            {
                return(closestToPosition.specRigidbody.UnitCenter);
            }
        }
コード例 #25
0
 public override void OnEffectApplied(GameActor actor, RuntimeGameActorEffectData effectData, float partialAmount = 1f)
 {
     base.OnEffectApplied(actor, effectData, partialAmount);
     effectData.OnActorPreDeath = delegate(Vector2 dir)
     {
         GameActorWitherEffect.DestroyFlames(effectData);
     };
     actor.healthHaver.OnPreDeath += effectData.OnActorPreDeath;
     {
         if (effectData.vfxObjects == null)
         {
             effectData.vfxObjects = new List <Tuple <GameObject, float> >();
         }
         effectData.OnFlameAnimationCompleted = delegate(tk2dSpriteAnimator spriteAnimator, tk2dSpriteAnimationClip clip)
         {
             if (effectData.destroyVfx || !actor)
             {
                 spriteAnimator.AnimationCompleted = (Action <tk2dSpriteAnimator, tk2dSpriteAnimationClip>)Delegate.Remove(spriteAnimator.AnimationCompleted, effectData.OnFlameAnimationCompleted);
                 UnityEngine.Object.Destroy(spriteAnimator.gameObject);
                 return;
             }
             if (UnityEngine.Random.value < this.flameMoveChance)
             {
                 Vector2 a = actor.specRigidbody.HitboxPixelCollider.UnitDimensions / 2f;
                 Vector2 b = BraveUtility.RandomVector2(-a + this.flameBuffer, a - this.flameBuffer);
                 Vector2 v = actor.specRigidbody.HitboxPixelCollider.UnitCenter + b;
                 spriteAnimator.transform.position = v;
             }
             spriteAnimator.Play(clip, 0f, clip.fps * UnityEngine.Random.Range(1f - this.flameFpsVariation, 1f + this.flameFpsVariation), false);
         };
     }
 }
コード例 #26
0
        public static bool IsHeartInRoom(Action <CaterpillarDevourHeartBehavior> orig, CaterpillarDevourHeartBehavior self)
        {
            AIActor          m_aiActor      = (AIActor)typeof(CaterpillarDevourHeartBehavior).GetField("m_aiActor", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self);
            PlayerController companionOwner = m_aiActor.CompanionOwner;

            if (!companionOwner || companionOwner.CurrentRoom == null)
            {
                return(false);
            }
            List <HealthPickup> componentsAbsoluteInRoom = companionOwner.CurrentRoom.GetComponentsAbsoluteInRoom <HealthPickup>();

            for (int i = 0; i < componentsAbsoluteInRoom.Count; i++)
            {
                HealthPickup healthPickup = componentsAbsoluteInRoom[i];
                if (healthPickup)
                {
                    if (healthPickup.armorAmount != 0)
                    {
                        componentsAbsoluteInRoom.RemoveAt(i);
                        i--;
                    }
                }
            }
            HealthPickup closestToPosition = BraveUtility.GetClosestToPosition <HealthPickup>(componentsAbsoluteInRoom, m_aiActor.CenterPosition, new HealthPickup[0]);

            if (closestToPosition != null)
            {
                typeof(CaterpillarDevourHeartBehavior).GetField("m_targetHeart", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(self, closestToPosition);
                return(true);
            }
            return(false);
        }
コード例 #27
0
        // This function doesn't null check orLoadByGuid. If non fake prefab custom enemies are spawned (like the special rats on Hollow), then this would cause exception.
        // Added fall back GUIDs and use one of those for AIActor instead if this happens.
        public void AddSpecificEnemyToRoomProcedurallyFixed(RoomHandler room, string enemyGuid, bool reinforcementSpawn = false, Vector2?goalPosition = null)
        {
            AIActor orLoadByGuid = EnemyDatabase.GetOrLoadByGuid(enemyGuid);

            if (!orLoadByGuid)
            {
                List <string> FallbackGUIDs = new List <string>()
                {
                    ExpandCustomEnemyDatabase.BootlegBullatGUID,
                    ExpandCustomEnemyDatabase.BootlegBulletManGUID,
                    ExpandCustomEnemyDatabase.BootlegBulletManBandanaGUID,
                    ExpandCustomEnemyDatabase.BootlegShotgunManBlueGUID,
                    ExpandCustomEnemyDatabase.BootlegShotgunManRedGUID
                };
                FallbackGUIDs = FallbackGUIDs.Shuffle();
                orLoadByGuid  = EnemyDatabase.GetOrLoadByGuid(BraveUtility.RandomElement(FallbackGUIDs));
            }
            IntVector2    clearance     = orLoadByGuid.specRigidbody.UnitDimensions.ToIntVector2(VectorConversions.Ceil);
            CellValidator cellValidator = delegate(IntVector2 c) {
                for (int i = 0; i < clearance.x; i++)
                {
                    int x = c.x + i;
                    for (int j = 0; j < clearance.y; j++)
                    {
                        int y = c.y + j;
                        if (GameManager.Instance.Dungeon.data.isTopWall(x, y))
                        {
                            return(false);
                        }
                    }
                }
                return(true);
            };
            IntVector2?intVector;

            if (goalPosition != null)
            {
                intVector = room.GetNearestAvailableCell(goalPosition.Value, new IntVector2?(clearance), new CellTypes?(CellTypes.FLOOR), false, cellValidator);
            }
            else
            {
                intVector = room.GetRandomAvailableCell(new IntVector2?(clearance), new CellTypes?(CellTypes.FLOOR), false, cellValidator);
            }
            if (intVector != null)
            {
                AIActor aiactor = AIActor.Spawn(orLoadByGuid, intVector.Value, room, true, AIActor.AwakenAnimationType.Spawn, false);
                if (aiactor && reinforcementSpawn)
                {
                    if (aiactor.specRigidbody)
                    {
                        aiactor.specRigidbody.CollideWithOthers = false;
                    }
                    aiactor.HandleReinforcementFallIntoRoom(0f);
                }
            }
            else
            {
                Debug.LogError("failed placement");
            }
        }
コード例 #28
0
 private void PickStats()
 {
     if (hasPicked)
     {
         return;
     }
     else
     {
         PlayableCharacters characterIdentity = Owner.characterIdentity;
         Effect             effect            = BraveUtility.RandomElement(statEffects);
         statEffects.Remove(effect);
         if (effect.modifyMethod == StatModifier.ModifyMethod.MULTIPLICATIVE)
         {
             AddStat(effect.statToEffect, effect.amount, StatModifier.ModifyMethod.MULTIPLICATIVE);
         }
         else
         {
             if (effect.statToEffect == PlayerStats.StatType.Health && characterIdentity == PlayableCharacters.Robot)
             {
                 LootEngine.GivePrefabToPlayer(PickupObjectDatabase.GetById(120).gameObject, Owner);
             }
             AddStat(effect.statToEffect, effect.amount, StatModifier.ModifyMethod.ADDITIVE);
         }
         Owner.stats.RecalculateStats(Owner, true, false);
         hasPicked = true;
     }
 }
コード例 #29
0
        private void RandomToadieAirDrop(GameObject lootCratePrefab, RoomHandler currentRoom, IntVector2?Clearence = null)
        {
            if (!Clearence.HasValue)
            {
                Clearence = new IntVector2(2, 2);
            }

            IntVector2?DropLocation = FindRandomDropLocation(currentRoom, Clearence.Value);

            if (DropLocation.HasValue)
            {
                EmergencyCrateController lootCrate = Instantiate(lootCratePrefab, DropLocation.Value.ToVector2().ToVector3ZUp(1f), Quaternion.identity).GetComponent <EmergencyCrateController>();
                if (lootCrate == null)
                {
                    return;
                }

                lootCrate.ChanceToExplode    = 0;
                lootCrate.ChanceToSpawnEnemy = 1;
                lootCrate.EnemyPlaceable     = m_CustomEnemyPlacable(BraveUtility.RandomElement(ToadieGUIDs));

                lootCrate.Trigger(new Vector3(-5f, -5f, -5f), DropLocation.Value.ToVector3() + new Vector3(15f, 15f, 15f), currentRoom, true);
                currentRoom.ExtantEmergencyCrate = lootCrate.gameObject;
            }
            return;
        }
コード例 #30
0
 private void OnPreSpawn(AIActor actor)
 {
     if (Owner && actor && (actor.EnemyGuid == "699cd24270af4cd183d671090d8323a1" || actor.EnemyGuid == "a446c626b56d4166915a4e29869737fd"))
     {
         actor.AdditionalSafeItemDrops.Add(PickupObjectDatabase.GetById(BraveUtility.RandomElement(lootIDlist)));
     }
 }