public void killCharacter(CharacterInstance target, CharacterInstance killer, bool critted, bool instantDestruction, [Optional, DefaultParameterValue(0)] SkillType fromSkill) { ActiveDungeon activeDungeon = GameLogic.Binder.GameState.ActiveDungeon; if (this.m_characterDestructionQueue.Contains(target)) { if (instantDestruction) { this.m_characterDestructionTimers[target] = 0f; } } else { CmdKillCharacter.ExecuteStatic(target, killer, critted, instantDestruction, fromSkill); if ((target == activeDungeon.PrimaryPlayerCharacter) && !instantDestruction) { for (int i = 0; i < GameLogic.Binder.GameState.PersistentCharacters.Count; i++) { CharacterInstance instance = GameLogic.Binder.GameState.PersistentCharacters[i]; if (instance != target) { this.killCharacter(instance, null, false, false, SkillType.NONE); } } } if (!target.IsPersistent) { this.m_characterDestructionQueue.Add(target); if (instantDestruction) { this.m_characterDestructionTimers.Add(target, 0f); } else { float num2 = (ConfigGameplay.DEATH_ENTRY_DURATION + ConfigGameplay.DEATH_REMAIN_DURATION) + UnityEngine.Random.Range((float)0f, (float)1f); if (Time.timeScale > 1f) { num2 *= Time.timeScale; } this.m_characterDestructionTimers.Add(target, num2); } } if ((!target.IsPlayerCharacter && activeDungeon.hasDungeonModifier(DungeonModifierType.MonsterExploding)) && (UnityEngine.Random.Range((float)0f, (float)1f) <= ConfigDungeonModifiers.MonsterExploding.ProcChance)) { ExplosionSkill.ExecuteStatic(null, target.PositionAtTimeOfDeath, null, ConfigDungeonModifiers.MonsterExploding.DamagePct); } } }
private void onDungeonBoostActivated(DungeonBoost dungeonBoost, SkillType fromSkill) { if (dungeonBoost.Properties.Type == DungeonBoostType.EmptyBox) { ActiveDungeon activeDungeon = GameLogic.Binder.GameState.ActiveDungeon; Player player = GameLogic.Binder.GameState.Player; double baseCoinReward = App.Binder.ConfigMeta.MinionCoinDropCurve(activeDungeon.Floor); double v = player.calculateStandardCoinRoll(baseCoinReward, GameLogic.CharacterType.UNSPECIFIED, 1) * App.Binder.ConfigMeta.DUNGEON_BOOST_EMPTY_BOX_COIN_GAIN_CONTROLLER; if (activeDungeon.hasDungeonModifier(DungeonModifierType.DungeonBoostBoxBonusCoins)) { v *= ConfigDungeonModifiers.DungeonBoostBoxBonusCoins.CoinMultiplier; } v = MathUtil.Clamp(v, 1.0, double.MaxValue); CmdGainResources.ExecuteStatic(player, ResourceType.Coin, v, true, "TRACKING_ID_GAMEPLAY_LOOT_GAIN", new Vector3?(dungeonBoost.Transform.position)); } }
protected void FixedUpdate() { ActiveDungeon activeDungeon = GameLogic.Binder.GameState.ActiveDungeon; if (((activeDungeon != null) && (activeDungeon.ActiveRoom != null)) && ((!activeDungeon.ActiveRoom.MainBossSummoned && !activeDungeon.ActiveRoom.CompletionTriggered) && (!activeDungeon.isTutorialDungeon() && (activeDungeon.CurrentGameplayState == GameplayState.ACTION)))) { Player player = GameLogic.Binder.GameState.Player; bool flag = true; for (int i = 0; i < activeDungeon.ActiveRoom.ActiveCharacters.Count; i++) { CharacterInstance instance = activeDungeon.ActiveRoom.ActiveCharacters[i]; if (!instance.IsPlayerCharacter && !instance.IsDead) { flag = false; break; } } if (flag) { int num3; int num2 = activeDungeon.ActiveRoom.getNextCharacterSpawnpointIndex(this.m_prevMobSpawnpointIndex); if (activeDungeon.hasDungeonModifier(DungeonModifierType.HordeMaxSize)) { num3 = App.Binder.ConfigMeta.FRENZY_MOB_SPAWNCOUNT_PER_SPAWNPOINT_MAX; } else if (GameLogic.Binder.FrenzySystem.isFrenzyActive()) { num3 = Mathf.FloorToInt(Mathf.Lerp((float)App.Binder.ConfigMeta.FRENZY_MOB_SPAWNCOUNT_PER_SPAWNPOINT_MIN, (float)App.Binder.ConfigMeta.FRENZY_MOB_SPAWNCOUNT_PER_SPAWNPOINT_MAX, player.ActiveCharacter.getSpurtBuffStrength())); } else { num3 = Mathf.FloorToInt(Mathf.Lerp((float)ConfigGameplay.MOB_SPAWNCOUNT_PER_SPAWNPOINT_MIN_RANGE.getRandom(), (float)ConfigGameplay.MOB_SPAWNCOUNT_PER_SPAWNPOINT_MAX_RANGE.getRandom(), player.ActiveCharacter.getSpurtBuffStrength())); } int num4 = player.getRemainingMinionKillsUntilFloorCompletion(activeDungeon.Floor, activeDungeon.isTutorialDungeon(), player.getLastBossEncounterFailed(false)); if (!activeDungeon.isBossFloor() && (num4 < num3)) { num3 = num4; } this.spawnRoomMinionHordeAtSpawnpoint(activeDungeon.ActiveRoom, activeDungeon.ActiveRoom.CharacterSpawnpoints[num2], num3, null); this.m_prevMobSpawnpointIndex = num2; } if (this.m_pendingWildBossSpawn) { this.trySummonWildBoss(); } } }
private void onPrimaryHeroDealtDamage(CharacterInstance sourceCharacter, CharacterInstance targetCharacter, Vector3 worldPos, double amount, bool critted, bool damageReduced, DamageType damageType, SkillType fromSkill) { Buff buff3; ActiveDungeon activeDungeon = GameLogic.Binder.GameState.ActiveDungeon; List <KeyValuePair <PerkInstance, BuffSource> > perkInstancesOfType = CharacterStatModifierUtil.GetPerkInstancesOfType(targetCharacter, PerkType.WoundedArmor); for (int i = 0; i < perkInstancesOfType.Count; i++) { KeyValuePair <PerkInstance, BuffSource> pair = perkInstancesOfType[i]; KeyValuePair <PerkInstance, BuffSource> pair2 = perkInstancesOfType[i]; GameLogic.Binder.BuffSystem.startBuffFromPerk(targetCharacter, PerkType.WoundedArmor, ConfigPerks.SHARED_DATA[PerkType.WoundedArmor].DurationSeconds, (double)pair.Key.Modifier, pair2.Value, null); } perkInstancesOfType = CharacterStatModifierUtil.GetPerkInstancesOfType(targetCharacter, PerkType.WoundedAttackSpeed); for (int j = 0; j < perkInstancesOfType.Count; j++) { KeyValuePair <PerkInstance, BuffSource> pair3 = perkInstancesOfType[j]; KeyValuePair <PerkInstance, BuffSource> pair4 = perkInstancesOfType[j]; GameLogic.Binder.BuffSystem.startBuffFromPerk(targetCharacter, PerkType.WoundedAttackSpeed, ConfigPerks.SHARED_DATA[PerkType.WoundedAttackSpeed].DurationSeconds, (double)pair3.Key.Modifier, pair4.Value, null); } perkInstancesOfType = CharacterStatModifierUtil.GetPerkInstancesOfType(targetCharacter, PerkType.WoundedDamage); for (int k = 0; k < perkInstancesOfType.Count; k++) { KeyValuePair <PerkInstance, BuffSource> pair5 = perkInstancesOfType[k]; KeyValuePair <PerkInstance, BuffSource> pair6 = perkInstancesOfType[k]; GameLogic.Binder.BuffSystem.startBuffFromPerk(targetCharacter, PerkType.WoundedDamage, ConfigPerks.SHARED_DATA[PerkType.WoundedDamage].DurationSeconds, (double)pair5.Key.Modifier, pair6.Value, null); } if ((sourceCharacter != null) && (damageType == DamageType.Ranged)) { float num4 = targetCharacter.getGenericModifierForPerkType(PerkType.RangedDamageDeflection); if (num4 > 0f) { double baseAmount = MathUtil.Clamp(Math.Round((double)(amount * num4)), 0.0, double.MaxValue); if (baseAmount > 0.0) { CmdDealDamageToCharacter.ExecuteStatic(targetCharacter, sourceCharacter, baseAmount, false, damageType, SkillType.NONE); } } } if (sourceCharacter != null) { float num6 = targetCharacter.getGenericModifierForPerkType(PerkType.DamageDeflection); if (num6 > 0f) { double num7 = MathUtil.Clamp(Math.Round((double)(amount * num6)), 0.0, double.MaxValue); if (num7 > 0.0) { CmdDealDamageToCharacter.ExecuteStatic(targetCharacter, sourceCharacter, num7, false, damageType, SkillType.NONE); } } } float num8 = targetCharacter.getGenericModifierForPerkType(PerkType.MassDamageDeflection); if (num8 > 0f) { double num9 = MathUtil.Clamp(Math.Round((double)(amount * num8)), 0.0, double.MaxValue); if (num9 > 0.0) { List <CharacterInstance> list2 = activeDungeon.ActiveRoom.getEnemyCharactersWithinRadius(targetCharacter.PhysicsBody.Transform.position, ConfigPerks.MassDamageDeflection.Radius, targetCharacter); for (int m = 0; m < list2.Count; m++) { CmdDealDamageToCharacter.ExecuteStatic(targetCharacter, list2[m], num9, false, damageType, SkillType.NONE); } } } if ((sourceCharacter != null) && activeDungeon.hasDungeonModifier(DungeonModifierType.MonsterStun)) { float num11 = !sourceCharacter.IsBoss ? ConfigDungeonModifiers.MonsterStun.MinionProcChance : ConfigDungeonModifiers.MonsterStun.BossProcChance; if (UnityEngine.Random.Range((float)0f, (float)1f) <= num11) { float num12 = !sourceCharacter.IsBoss ? ConfigDungeonModifiers.MonsterStun.MinionBuffDurationSeconds : ConfigDungeonModifiers.MonsterStun.BossBuffDurationSeconds; buff3 = new Buff(); buff3.Stuns = true; buff3.DurationSeconds = num12; Buff buff = buff3; GameLogic.Binder.BuffSystem.startBuff(targetCharacter, buff); } } if ((sourceCharacter != null) && activeDungeon.hasDungeonModifier(DungeonModifierType.MonsterFreeze)) { float num13 = !sourceCharacter.IsBoss ? ConfigDungeonModifiers.MonsterFreeze.MinionProcChance : ConfigDungeonModifiers.MonsterFreeze.BossProcChance; if (UnityEngine.Random.Range((float)0f, (float)1f) <= num13) { float num14 = !sourceCharacter.IsBoss ? ConfigDungeonModifiers.MonsterFreeze.MinionBuffDurationSeconds : ConfigDungeonModifiers.MonsterFreeze.BossBuffDurationSeconds; buff3 = new Buff(); BuffSource source = new BuffSource(); source.Object = ConfigDungeonModifiers.MODIFIERS[DungeonModifierType.MonsterFreeze]; buff3.Source = source; buff3.BaseStat1 = BaseStatProperty.AttacksPerSecond; buff3.BaseStat2 = BaseStatProperty.MovementSpeed; buff3.Modifier = ConfigPerks.GlobalFrostEffect.SpeedModifier; buff3.DurationSeconds = num14; Buff buff2 = buff3; GameLogic.Binder.BuffSystem.startBuff(targetCharacter, buff2); } } }
public void awardBossRewards(ActiveDungeon ad, GameLogic.CharacterType killedBossType, bool wildBoss) { ad.VisualizableBossRewards = new ActiveDungeon.BossRewards(); CharacterInstance primaryPlayerCharacter = ad.PrimaryPlayerCharacter; Player owningPlayer = primaryPlayerCharacter.OwningPlayer; int floor = ad.Floor; double baseCoinReward = App.Binder.ConfigMeta.BossCoinDropCurve(floor, owningPlayer.BossTrain.Active); double num3 = owningPlayer.calculateStandardCoinRoll(baseCoinReward, killedBossType, 1); ad.VisualizableBossRewards.CoinDropCount = UnityEngine.Random.Range(3, 7); ad.VisualizableBossRewards.CoinsPerDrop = num3 / ((double)ad.VisualizableBossRewards.CoinDropCount); bool isHighestFloor = ad.Floor == owningPlayer.getHighestFloorReached(); double num4 = App.Binder.ConfigMeta.XpFromBossKill(ad.Floor, isHighestFloor) / ((double)ad.VisualizableBossRewards.CoinDropCount); float num5 = primaryPlayerCharacter.getCharacterTypeXpModifier(killedBossType) + primaryPlayerCharacter.UniversalXpBonus(true); num4 += num4 * num5; ad.VisualizableBossRewards.XpPerDrop = num4; bool flag2 = !ad.hasDungeonModifier(DungeonModifierType.MonsterNoCoins); for (int i = 0; i < ad.VisualizableBossRewards.CoinDropCount; i++) { if (flag2) { Vector3?nullable = null; CmdGainResources.ExecuteStatic(owningPlayer, ResourceType.Coin, ad.VisualizableBossRewards.CoinsPerDrop, true, "TRACKING_ID_GAMEPLAY_LOOT_GAIN", nullable); } Vector3?worldPt = null; CmdGainResources.ExecuteStatic(owningPlayer, ResourceType.Xp, ad.VisualizableBossRewards.XpPerDrop, true, string.Empty, worldPt); } bool flag3 = false; if (!wildBoss) { flag3 = this.grantRetirementTriggerChestIfAllowed(); } if (!wildBoss && owningPlayer.canRetire()) { Reward reward = owningPlayer.getFirstUnclaimedRetirementTriggerChest(); ad.VisualizableBossRewards.Tokens = App.Binder.ConfigMeta.RetirementTokenReward(primaryPlayerCharacter, ad.Floor); reward.TokenDrops.Add(ad.VisualizableBossRewards.Tokens); if (App.Binder.ConfigMeta.BossShouldDropFrenzyPotionAtFloor(ad.Floor)) { ad.VisualizableBossRewards.FrenzyPotions = 1; reward.FrenzyPotions += ad.VisualizableBossRewards.FrenzyPotions; } } if ((wildBoss || owningPlayer.hasRetired()) || !flag3) { ad.VisualizableBossRewards.MainDrops.Add(CmdRollDropLootTable.ExecuteStatic(App.Binder.ConfigLootTables.BossDropLootTable, owningPlayer, Vector3.zero, killedBossType, null, ChestType.NONE)); int num7 = owningPlayer.CumulativeRetiredHeroStats.BossesBeat + owningPlayer.ActiveCharacter.HeroStats.BossesBeat; if ((owningPlayer.getPerkInstanceCount(PerkType.ChesterChestDrop) > 0) && ((((float)num7) % Mathf.Floor(ConfigPerks.GetBestModifier(PerkType.ChesterChestDrop))) == 0f)) { ad.VisualizableBossRewards.MainDrops.Add(CmdRollDropLootTable.ExecuteStatic(App.Binder.ConfigLootTables.BossDropLootTable, owningPlayer, Vector3.zero, killedBossType, null, ChestType.ChesterChest)); } } if ((!wildBoss && owningPlayer.canRetire()) && ConfigMeta.BOSS_ADDITIONAL_DROPS_ENABLED) { if (flag3 && !owningPlayer.hasRetired()) { Reward item = CmdRollDropLootTable.ExecuteStatic(App.Binder.ConfigLootTables.BossAdditionalDropLootTable, owningPlayer, Vector3.zero, killedBossType, ChestType.RewardBoxCommon.ToString(), ChestType.NONE); item.clearContent(); item.ShopEntryId = "CoinBundleSmall"; double num8 = App.Binder.ConfigMeta.CoinBundleSize(owningPlayer, item.ShopEntryId, 0.0); item.CoinDrops.Add(num8); ad.VisualizableBossRewards.RiggedRewards.Add(item); } else if (App.Binder.ConfigMeta.BossShouldDropRewardBoxAtFloor(ad.Floor)) { ad.VisualizableBossRewards.AdditionalDrop = CmdRollDropLootTable.ExecuteStatic(App.Binder.ConfigLootTables.BossAdditionalDropLootTable, owningPlayer, Vector3.zero, killedBossType, null, ChestType.NONE); } } }