public bool GetDmg2Role(RoleBase role, out long dmgVal, out bool crit) { dmgVal = 0; crit = false; if (role == m_RoleBase) { return(false); } if (m_EftType == DamageEftType.One && m_TarRole != null && m_TarRole != role) { return(false); } if (this.IsRoleEffected(role)) { return(false); } dmgVal = (long)((float)(m_DamageVal + m_Add_Dmg) * m_EftMultiple); switch (role.m_BaseType) { case RoleBaseType.Castle: { dmgVal += m_AddDmg_Castle; } break; case RoleBaseType.Land: { dmgVal += m_AddDmg_Land; } break; case RoleBaseType.Air: { dmgVal += m_AddDmg_Air; } break; case RoleBaseType.OnCastle: { dmgVal += m_AddDmg_OnCastle; } break; default: break; } float critPer = m_CritPercent + m_Add_Crit; float critDmg = m_CritDmg + m_Add_CritDmg; float randomCritVal = UnityEngine.Random.Range(0, 100f); crit = randomCritVal < critPer; if (crit) { dmgVal = (int)(critDmg * (float)dmgVal); } if (m_EftType == DamageEftType.One && m_TarRole != null && m_TarRole == role) { Destroy(gameObject); } // regist this.RegistEffectedRole(role); // report to RoleBase if (m_RoleBase != null) { m_RoleBase.AffectedOther(m_DmgName, role); } return(true); }