public static SkillBuff AsStruct(this ISkillBuff buff) { return(new SkillBuff() { Id = buff.Id, Name = buff.Name, ReflectChance = buff.ReflectChance, Remaining = buff.Remaining, }); }
override public void OnBuff(CharacterActionBuffComponent buff_component, bool is_lighting, float apply_scale) { if (buff_index >= Skill.Info.Actions.Count) { Debug.LogErrorFormat("buff index failed : {0} in {1}", buff_index, Skill.Info.ID); return; } SkillInfo.Action buff_action = Skill.Info.Actions[buff_index++]; if (m_Creature.IsDead == true || buff_action.check_distance == true && Character.MoveDistance > BattleConfig.Instance.HitDistance) { return; } ISkillBuff apply_buff = DoBuff(buff_action, Skill.Creature, m_Creature, Skill, m_TargetIndex, null); if (apply_buff != null) { CharacterActionBuff new_action = buff_component.data.CreateAction(buff_component, Character.PlaybackTime, Character, apply_buff.Duration, is_lighting, apply_scale); apply_buff.Action = new_action; } for (int sub_index = 0; sub_index < buff_action.SubActions.Count; ++sub_index) { var sub_action = buff_action.SubActions[sub_index]; var sub_buff = DoBuff(sub_action, Skill.Creature, m_Creature, Skill, m_TargetIndex, apply_buff); if (sub_buff == null) { continue; } if (apply_buff == null) { apply_buff = sub_buff; if (buff_component.sub_components.Length == 0) { CharacterActionBuff new_action = buff_component.data.CreateAction(buff_component, Character.PlaybackTime, Character, apply_buff.Duration, is_lighting, apply_scale); apply_buff.Action = new_action; } } if (sub_index < buff_component.sub_components.Length) { var sub_component = buff_component.sub_components[sub_index]; CharacterActionBuff new_action = sub_component.data.CreateAction(sub_component, Character.PlaybackTime, Character, apply_buff.Duration, is_lighting, apply_scale); sub_buff.Action = new_action; } } }
public Buff(BattleCreature creature, BattleSkill skill, SkillInfo.Action action_info, int value, float duration, ISkillBuff parent) : base(duration) { Parent = parent; m_Creature = creature; Skill = skill; this.ActionInfo = action_info; switch (action_info.actionType) { case eActionType.dot_damage: case eActionType.dot_damage_mana: case eActionType.dot_heal: case eActionType.dot_heal_mana: this.Value = Mathf.RoundToInt(value / duration); break; default: this.Value = value; break; } this.StartTime = m_Creature.PlaybackTime; eBuffColorType buff_color = eBuffColorType.None; if (action_info.actionType == eActionType.shield && action_info.value > 0) { AffectValue = value; AffectValueMax = value; buff_color = eBuffColorType.Shield; } else { AffectValue = 1; AffectValueMax = 1; } if (skill != null && skill.Creature != null && IsMainBuff == true && skill.Info.ShowIcon == true) { if (buff_color != eBuffColorType.Shield) { buff_color = creature.IsTeam == skill.Creature.IsTeam ? eBuffColorType.Buff : eBuffColorType.DeBuff; } BuffContainer.Alloc(); BuffContainer.Asset.Init(Skill.Info.IconID, buff_color, Duration > 0f); BuffContainer.Asset.OnUpdate(0f, 1f); } }
static public ISkillBuff DoBuff(SkillInfo.Action buff_action, BattleCreature creature, BattleCreature target_creature, BattleSkill skill, int target_index, ISkillBuff parent) { switch (buff_action.actionType) { case eActionType.stun: case eActionType.hidden: case eActionType.sleep: { if (target_creature.InvokeImmune(eImmuneType.cc, skill.Creature.Info.AttackType, skill.Level) == true) { return(null); } int value = skill.GetValueWithTargetIndex(buff_action, target_index, -(target_creature.Level - skill.Level) * GameConfig.Get <int>("stun_level_decrease")); if (BattleBase.Instance.Rand.NextRange(1, 10000) > value) { TextManager.Instance.PushMessage(target_creature, Localization.Get("Miss"), eBuffColorType.Immune, eTextPushType.Normal); return(null); } float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); TextManager.Instance.PushMessage(target_creature, Localization.Get(buff_action.actionType.ToString()), eBuffColorType.Stun, eTextPushType.Normal); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } return(buff); } case eActionType.ignore_defense_damage: case eActionType.ignore_defense_damaged: case eActionType.worldboss: case eActionType.shield: case eActionType.immune: case eActionType.provoke: case eActionType.buff: case eActionType.buff_percent: { int value = skill.GetValueWithTargetIndex(buff_action, target_index, 0); float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } target_creature.SetWait(); if (buff_action.statType == eStatType.AttackSpeed && duration > 0f) { buff.Duration *= (1f + value * 0.0001f); } return(buff); } case eActionType.debuff: case eActionType.debuff_percent: { eImmuneType immune_type = eImmuneType.debuff; switch (buff_action.actionType) { default: if (target_creature.InvokeImmune(immune_type, skill.Creature.Info.AttackType, skill.Level) == true) { return(null); } break; } int value = -skill.GetValueWithTargetIndex(buff_action, target_index, 0); float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } target_creature.SetWait(); if (buff_action.statType == eStatType.AttackSpeed && duration > 0f) { buff.Duration *= (1f - value * 0.0001f); } return(buff); } case eActionType.dot_damage: { int value = -skill.GetValueWithTargetIndex(buff_action, target_index, creature.GetDamageValue()); value = Mathf.RoundToInt(value * (1f + (creature.GetValue(eStatType.IncreaseDamagePercent) - creature.GetValue(eStatType.DecreaseDamagePercent)) * 0.0001f)); float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } target_creature.SetWait(); return(buff); } case eActionType.dot_damage_mana: { int value = -skill.GetValueWithTargetIndex(buff_action, target_index, 0); float decrease = (10000 - (target_creature.Level - skill.Level) * GameConfig.Get <int>("mana_level_decrease")) * 0.0001f; value = Mathf.RoundToInt(value * (1f + (creature.GetValue(eStatType.IncreaseDamagePercent) - creature.GetValue(eStatType.DecreaseDamagePercent)) * 0.0001f + decrease)); float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } target_creature.SetWait(); return(buff); } case eActionType.dot_heal: { int value = skill.GetValueWithTargetIndex(buff_action, target_index, creature.GetDamageValue()); value = Mathf.RoundToInt(value * (1f + creature.GetValue(eStatType.IncreaseDamagePercent) * 0.0001f)); float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } target_creature.SetWait(); return(buff); } case eActionType.dot_heal_mana: { int value = skill.GetValueWithTargetIndex(buff_action, target_index, 0); float decrease = (10000 - (target_creature.Level - skill.Level) * GameConfig.Get <int>("mana_level_decrease")) * 0.0001f; value = Mathf.RoundToInt(value * (1f + creature.GetValue(eStatType.IncreaseDamagePercent) * 0.0001f) * decrease); float duration = skill.GetDuration(buff_action, target_index); Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent); if (duration == 0f) { buff.DoAction(); } else if (duration > 0f || duration == -1f) { target_creature.AddBuff(buff, skill.Info.CanStack); } else { Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name); } target_creature.SetWait(); return(buff); } } return(null); }
public BattleCreature(MapCreatureInfo map_creature_info, CharacterContainer character_container, float attack_next_time, GameObject hpBarPrefab, GameObject skillPrefab) { MapStageDifficulty stage_info = Network.BattleStageInfo; IsTeam = false; Info = map_creature_info.CreatureInfo; SkinName = map_creature_info.SkinName; MapCreature = map_creature_info; Grade = map_creature_info.Grade; Level = map_creature_info.Level; GradePercent = map_creature_info.GradePercent; Enchant = map_creature_info.Enchant; if (map_creature_info.UseLeaderSkillType != pe_UseLeaderSkillType.Manual && Info.TeamSkill != null) { SetLeader(map_creature_info.UseLeaderSkillType, BattleStage.Instance.OnUseEnemyLeaderSkill); } switch (map_creature_info.CreatureType) { case eMapCreatureType.Elite: Scale = 1.2f; break; case eMapCreatureType.Boss: Scale = 1.4f; if (stage_info.MapInfo.MapType == "boss") { Level = Boss.CalculateLevel(Level, stage_info); Grade = Boss.CalculateGrade(Level); Enchant = Boss.CalculateEnchant(Level); GradePercent = CreatureInfoManager.Instance.Grades[Grade].enchants[Enchant].stat_percent * GameConfig.Get <float>("boss_grade_percent"); } Battle.Instance.m_BossHP.Init(this); break; case eMapCreatureType.WorldBoss: Scale = 2.5f; BattleWorldboss.Instance.m_BossHP.Init(this, true); IgnoreTween = true; TextOffset = -20f; // IsShowText = false; break; } Stat = new CreatureStat(map_creature_info.GetStat(Level, GradePercent, Enchant)); AutoSkillIndex = map_creature_info.AutoSkillIndex; InitCommon(character_container, attack_next_time, hpBarPrefab, skillPrefab); if (map_creature_info.CreatureType == eMapCreatureType.WorldBoss) { HPBar.gameObject.SetActive(false); } foreach (SkillInfo skill_info in Info.Skills) { if (skill_info.Type != eSkillType.active) { continue; } Skills.Add(new BattleSkill(skill_info, this, map_creature_info.Level)); } if (map_creature_info.PassiveInfos.Count > 0) { foreach (var passive_info in map_creature_info.PassiveInfos) { bool first = true; var battle_skill = new BattleSkill(passive_info.SkillInfo, this, map_creature_info.Level); foreach (var action in passive_info.SkillInfo.Actions) { ISkillBuff buff = SkillTarget.DoBuff(action, this, this, battle_skill, 0, null); if (first == true && string.IsNullOrEmpty(passive_info.SkillInfo.ActionName) == false) { first = false; var comp = AssetManager.GetCharacterPrefab("PassiveEtc_" + passive_info.SkillInfo.ActionName).GetComponent <CharacterActionBuffComponent>(); // comp.data.InitEffect(); CharacterActionBuff new_action = comp.data.CreateAction(comp, PlaybackTime, Character, 999f, false, 1f); buff.Action = new_action; } } } var buff_worldboss = Buffs.Find(b => b.ActionInfo.actionType == eActionType.worldboss); if (buff_worldboss != null) { Stat.HP = Stat.MaxHP = buff_worldboss.ActionInfo.value; } else { Stat.HP = Stat.MaxHP = Stat.Stat.MaxHP; } Stat.MP = Stat.Stat.ManaInit; } }
static public int SortByEndTime(ISkillBuff a, ISkillBuff b) { return(a.EndTime.CompareTo(b.EndTime)); }
public static FighterBuffAppliedTick ApplyBuff(this IFighterStats target, IFighterStats actor, float chance, ISkillBuff buff) { if (!chance.Chance()) { return(null); } target.States.Add(buff); return(new FighterBuffAppliedTick() { Buff = buff.AsStruct(), Fighter = actor.AsStruct(), Target = actor.AsStruct(), }); }