Elin Decompiled Documentation EA 23.299 Nightly
Loading...
Searching...
No Matches
AttackProcess Class Reference
Inheritance diagram for AttackProcess:
EClass

Public Member Functions

string GetText ()
 
void Prepare (Chara _CC, Thing _weapon, Card _TC=null, Point _TP=null, int _attackIndex=0, bool _isThrow=false)
 
void PlayRangedAnime (int numFire, float delay=0f)
 
int GetRocketPower ()
 
long GetRawDamage (float dmgMulti, bool crit, bool maxRoll)
 
bool Perform (int count, bool hasHit, float dmgMulti=1f, bool maxRoll=false, bool subAttack=false)
 
bool CalcHit ()
 
string GetAttackText (AttackType type, int id)
 

Static Public Member Functions

static int GetWeaponEnc (Chara CC, Thing w, int ele, bool addSelfEnc=false)
 
static int GetTwoHandEncBonus (Chara CC, Thing w)
 
static void ProcShieldEncs (Chara CC, Card TC, int mtpChance=100)
 
static void ProcAbility (List< Element > list, Chara CC, Card TC, int bonus, bool subAttack=false, int mtpChance=100)
 
static void ProcAbility (Element e, Chara CC, Card TC, int bonus, bool subAttack=false, int mtpChance=100)
 
- Static Public Member Functions inherited from EClass
static int rndSeed (int a, int seed)
 
static int rnd (long a)
 
static int rnd (int a)
 
static int curve (long _a, int start, int step, int rate=75)
 
static int sqrt (int a)
 
static int rndHalf (int a)
 
static float rndf (float a)
 
static int rndSqrt (int a)
 
static void Wait (float a, Card c)
 
static void Wait (float a, Point p)
 
static int Bigger (int a, int b)
 
static int Smaller (int a, int b)
 

Public Attributes

long toHit
 
long toHitBase
 
long evasion
 
int dNum
 
int dDim
 
int dBonus
 
int toHitFix
 
int penetration
 
int distMod
 
int attackIndex
 
int dNumAmmo
 
int dDimAmmo
 
int dBonusAmmo
 
int numFire
 
int numFireWithoutDamageLoss
 
float dMulti
 
bool crit
 
bool critFury
 
bool hit
 
bool evadePlus
 
bool isThrow
 
bool ignoreAnime
 
bool ignoreAttackSound
 
Chara CC
 
Card TC
 
Point TP
 
Point posRangedAnime
 
Element weaponSkill
 
Thing weapon
 
Thing ammo
 
TraitToolRange toolRange
 
AttackType attackType
 
AttackStyle attackStyle
 

Static Public Attributes

static AttackProcess Current = new AttackProcess()
 
- Static Public Attributes inherited from EClass
static Core core
 

Properties

bool IsMartial [get]
 
bool IsMartialWeapon [get]
 
bool IsRanged [get]
 
bool IsCane [get]
 
- Properties inherited from EClass
static Game game [get]
 
static bool AdvMode [get]
 
static Player player [get]
 
static Chara pc [get]
 
static UI ui [get]
 
static Map _map [get]
 
static Zone _zone [get]
 
static FactionBranch Branch [get]
 
static FactionBranch BranchOrHomeBranch [get]
 
static Faction Home [get]
 
static Faction Wilds [get]
 
static Scene scene [get]
 
static BaseGameScreen screen [get]
 
static GameSetting setting [get]
 
static GameData gamedata [get]
 
static ColorProfile Colors [get]
 
static World world [get]
 
static SourceManager sources [get]
 
static SourceManager editorSources [get]
 
static SoundManager Sound [get]
 
static CoreDebug debug [get]
 

Private Member Functions

bool Crit ()
 
bool EvadePlus ()
 

Detailed Description

Definition at line 6 of file AttackProcess.cs.

Member Function Documentation

◆ CalcHit()

bool AttackProcess.CalcHit ( )
inline

Definition at line 993 of file AttackProcess.cs.

994 {
996 {
997 return Crit();
998 }
999 if (critFury)
1000 {
1001 return Crit();
1002 }
1003 if (CC.HasCondition<ConSevenSense>() && (CC.HasElement(1244) || CC.HasElement(1246) || CC.HasElement(1247)))
1004 {
1005 return true;
1006 }
1007 if (TC != null)
1008 {
1009 if (TC.HasCondition<ConDim>() && EClass.rnd(4) == 0)
1010 {
1011 return Crit();
1012 }
1013 if (TC.IsDeadOrSleeping)
1014 {
1015 return Crit();
1016 }
1017 int num = TC.Evalue(151);
1018 if (num != 0 && toHit < num * 10)
1019 {
1020 float num2 = (float)(evasion * 100) / Mathf.Clamp(toHit, 1f, toHit);
1021 if (num2 > 300f && EClass.rnd(num + 250) > 100)
1022 {
1023 return EvadePlus();
1024 }
1025 if (num2 > 200f && EClass.rnd(num + 250) > 150)
1026 {
1027 return EvadePlus();
1028 }
1029 if (num2 > 150f && EClass.rnd(num + 250) > 200)
1030 {
1031 return EvadePlus();
1032 }
1033 }
1034 int num3 = TC.Evalue(57);
1035 if (num3 > 0)
1036 {
1037 if (num3 > EClass.rnd(100))
1038 {
1039 return EvadePlus();
1040 }
1041 }
1042 else if (num3 < 0 && num3 * -1 > EClass.rnd(100))
1043 {
1044 return true;
1045 }
1046 }
1047 if (EClass.rnd(20) == 0)
1048 {
1049 return true;
1050 }
1051 if (EClass.rnd(20) == 0)
1052 {
1053 return false;
1054 }
1055 if (toHit < 1)
1056 {
1057 return false;
1058 }
1059 if (evasion < 1)
1060 {
1061 return true;
1062 }
1063 if (EClass.rnd(toHit) < EClass.rnd(evasion * (IsRanged ? 150 : 125) / 100))
1064 {
1065 return false;
1066 }
1067 if (EClass.rnd(5000) < CC.Evalue(73) + 50)
1068 {
1069 return Crit();
1070 }
1071 if ((float)(CC.Evalue(90) + ((weapon != null) ? weapon.Evalue(90, ignoreGlobalElement: true) : 0)) + Mathf.Sqrt(CC.Evalue(134)) > (float)EClass.rnd(200))
1072 {
1073 return Crit();
1074 }
1075 if (CC.Evalue(1420) > 0)
1076 {
1077 int num4 = Mathf.Min(100, 100 - CC.hp * 100 / CC.MaxHP) * (50 + CC.Evalue(1420) * 50) / 100;
1078 if (num4 >= 50 && num4 * num4 * num4 * num4 / 3 > EClass.rnd(100000000))
1079 {
1080 return Crit();
1081 }
1082 }
1083 return true;
1084 }
int hp
Definition: Card.cs:245
int Evalue(int ele)
Definition: Card.cs:2613
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:6190
bool HasCondition(string alias)
Definition: Chara.cs:9635
override int MaxHP
Definition: Chara.cs:722
Definition: ConDim.cs:2
Definition: EClass.cs:6
static int rnd(long a)
Definition: EClass.cs:59
Definition: TC.cs:4

References CC, Crit(), critFury, EvadePlus(), Card.Evalue(), evasion, Chara.HasCondition(), Card.HasElement(), Card.hp, IsRanged, Chara.MaxHP, EClass.rnd(), toHit, and weapon.

Referenced by Perform().

◆ Crit()

bool AttackProcess.Crit ( )
inlineprivate

Definition at line 981 of file AttackProcess.cs.

982 {
983 crit = true;
984 return true;
985 }

References crit.

Referenced by CalcHit().

◆ EvadePlus()

bool AttackProcess.EvadePlus ( )
inlineprivate

Definition at line 987 of file AttackProcess.cs.

988 {
989 evadePlus = true;
990 return false;
991 }

References evadePlus.

Referenced by CalcHit().

◆ GetAttackText()

string AttackProcess.GetAttackText ( AttackType  type,
int  id 
)
inline

Definition at line 1086 of file AttackProcess.cs.

1087 {
1088 return Lang.GetList("attack" + type)[id];
1089 }
Definition: Lang.cs:6
static string[] GetList(string id)
Definition: Lang.cs:116

References Lang.GetList().

Referenced by Perform().

◆ GetRawDamage()

long AttackProcess.GetRawDamage ( float  dmgMulti,
bool  crit,
bool  maxRoll 
)
inline

Definition at line 468 of file AttackProcess.cs.

469 {
470 bool flag = CC.HasCondition<ConReload>();
471 long num = Dice.Roll(dNum, dDim, dBonus, CC);
472 if (ammo != null && !flag)
473 {
475 }
476 if (crit || maxRoll)
477 {
478 num = Dice.RollMax(dNum, dDim, dBonus);
479 if (ammo != null && !flag)
480 {
482 }
483 if (crit && (IsMartial || IsMartialWeapon))
484 {
485 dMulti *= 1.25f;
486 }
487 }
488 if (CC.Evalue(1355) > 0)
489 {
490 num++;
491 }
492 num = (long)(dMulti * (float)num * dmgMulti);
493 long num2 = 99999999L;
494 ConStrife condition = CC.GetCondition<ConStrife>();
495 if (condition != null)
496 {
497 num = num * (100 + condition.lv * 10) / 100;
498 num2 = num2 * (100 + condition.lv * 5) / 100;
499 }
500 return (long)Mathf.Clamp(num, 0f, num2);
501 }
bool IsMartialWeapon
Definition: Dice.cs:5
static int RollMax(int num, int sides, int bonus=0)
Definition: Dice.cs:70
static int Roll(int num, int sides, int bonus=0, Card card=null)
Definition: Dice.cs:48

References ammo, CC, crit, dBonus, dBonusAmmo, dDim, dDimAmmo, dMulti, dNum, dNumAmmo, Card.Evalue(), Chara.HasCondition(), IsMartial, IsMartialWeapon, Dice.Roll(), and Dice.RollMax().

Referenced by ActMelee.Attack(), and Perform().

◆ GetRocketPower()

int AttackProcess.GetRocketPower ( )
inline

Definition at line 463 of file AttackProcess.cs.

464 {
465 return (30 + (dNum * dDim + dBonus) + (dNumAmmo * dDimAmmo + dBonusAmmo)) * (100 + (int)Mathf.Sqrt(weaponSkill.Value) * 8) / 100;
466 }
Element weaponSkill
int Value
Definition: ELEMENT.cs:297

References dBonus, dBonusAmmo, dDim, dDimAmmo, dNum, dNumAmmo, Element.Value, and weaponSkill.

Referenced by ActRanged.Perform().

◆ GetText()

string AttackProcess.GetText ( )
inline

Definition at line 138 of file AttackProcess.cs.

139 {
140 string text = dNum + "d" + dDim;
141 text = text + ((dBonus >= 0) ? "+" : "") + dBonus;
142 string @ref = (IsMartial ? "evalHand".lang() : "evalWeapon".lang((attackIndex + 1).ToString() ?? ""));
143 return "attackEval".lang(@ref, text, dMulti.ToString("F2") ?? "", toHit.ToString() ?? "", penetration.ToString() ?? "");
144 }

References attackIndex, dBonus, dDim, dMulti, dNum, IsMartial, penetration, and toHit.

Referenced by Thing.AddAttackEvaluation().

◆ GetTwoHandEncBonus()

static int AttackProcess.GetTwoHandEncBonus ( Chara  CC,
Thing  w 
)
inlinestatic

Definition at line 129 of file AttackProcess.cs.

130 {
131 if (CC == null || CC.body.GetAttackStyle() != AttackStyle.TwoHand || w == null || !w.IsWeapon)
132 {
133 return 0;
134 }
135 return Mathf.Clamp(CC.Evalue(130) / 15, 0, 2) * 25;
136 }
AttackStyle
Definition: AttackStyle.cs:2
bool IsWeapon
Definition: Card.cs:2248
AttackStyle GetAttackStyle()
Definition: CharaBody.cs:479
CharaBody body
Definition: Chara.cs:94

References Chara.body, CC, Card.Evalue(), CharaBody.GetAttackStyle(), and Card.IsWeapon.

Referenced by GetWeaponEnc(), Perform(), and Thing.WriteNote().

◆ GetWeaponEnc()

static int AttackProcess.GetWeaponEnc ( Chara  CC,
Thing  w,
int  ele,
bool  addSelfEnc = false 
)
inlinestatic

Definition at line 114 of file AttackProcess.cs.

115 {
116 int num = w?.Evalue(ele) ?? 0;
118 {
119 num += EClass.pc.faction.charaElements.Value(ele);
120 }
121 num = num * (100 + GetTwoHandEncBonus(CC, w)) / 100;
122 if (addSelfEnc)
123 {
124 num += CC.Evalue(ele);
125 }
126 return num;
127 }
static int GetTwoHandEncBonus(Chara CC, Thing w)
bool IsPCFactionOrMinion
Definition: Card.cs:2314
Faction faction
Definition: Chara.cs:429
static Chara pc
Definition: EClass.cs:15
int Value(int ele)
ElementContainerFaction charaElements
Definition: FACTION.cs:146

References CC, Faction.charaElements, Card.Evalue(), Chara.faction, GetTwoHandEncBonus(), Card.IsPCFactionOrMinion, EClass.pc, and ElementContainer.Value().

Referenced by ActMelee.Attack(), and Perform().

◆ Perform()

bool AttackProcess.Perform ( int  count,
bool  hasHit,
float  dmgMulti = 1f,
bool  maxRoll = false,
bool  subAttack = false 
)
inline

Definition at line 590 of file AttackProcess.cs.

591 {
592 bool flag = CC.HasCondition<ConReload>();
593 bool flag2 = CC.HasElement(486) && CC.IsPCFactionOrMinion;
594 hit = CalcHit();
595 if (CC.id == "tsunami")
596 {
597 hit = true;
598 }
599 long num = GetRawDamage(dmgMulti, crit, maxRoll);
600 if (IsRanged && count >= numFireWithoutDamageLoss)
601 {
602 num = num * 100 / (100 + (count - numFireWithoutDamageLoss + 1) * 30);
603 }
604 if (CC.isRestrained)
605 {
606 num /= 2;
607 }
608 List<Element> list = new List<Element>();
609 int num2 = CC.Evalue(91);
610 string id = CC.id;
611 if ((id == "stalker" || id == "stalker_shadow") && TC.isChara && TC.Chara.CanSee(CC))
612 {
613 num2 = 0;
614 }
615 int num3 = 0;
616 if (weapon != null)
617 {
618 list = weapon.elements.dict.Values.ToList();
619 if (ammo != null && !flag)
620 {
621 list = list.Concat(ammo.elements.dict.Values).ToList();
622 }
623 num2 += weapon.Evalue(91, ignoreGlobalElement: true);
624 num3 += weapon.Evalue(603, ignoreGlobalElement: true);
625 }
626 if (!IsRanged && !isThrow && CC.HasElement(1426))
627 {
628 list.Add(Element.Create(6650, 100));
629 }
630 int bane;
631 if (TC?.Chara != null)
632 {
633 bane = 0;
634 AddBane(valid: true, 468, 50);
635 AddBane(TC.Chara.IsUndead, 461, 100);
636 AddBane(TC.Chara.IsAnimal, 463, 100);
637 AddBane(TC.Chara.IsHuman, 464, 100);
638 AddBane(TC.Chara.IsDragon, 460, 100);
639 AddBane(TC.Chara.IsGod, 466, 100);
640 AddBane(TC.Chara.IsMachine, 465, 100);
641 AddBane(TC.Chara.IsFish, 467, 100);
642 AddBane(TC.Chara.IsFairy, 462, 100);
643 if (bane != 0)
644 {
645 num = num * (100 + bane * 3) / 100;
646 }
647 }
648 if (CC.IsPCFaction)
649 {
650 foreach (Element value in EClass.pc.faction.charaElements.dict.Values)
651 {
652 if (value.Value > 0)
653 {
654 list.Add(value);
655 }
656 }
657 }
658 if (hit && num2 > EClass.rnd(100))
659 {
660 CC.Say("vopal");
661 penetration = 100;
662 }
663 if (crit)
664 {
665 CC.Say((critFury ? "fury_" : "") + (CC.IsHostile() ? "critical_enemy" : "critical"));
666 if (CC.IsPC)
667 {
668 CC.PlaySound("critical");
669 }
670 }
671 if (CC.isSynced || (TC != null && TC.isSynced))
672 {
673 if (toolRange != null && (!IsRanged || count == 0) && !flag && !ignoreAnime)
674 {
676 }
677 if (hit && TC != null && !hasHit)
678 {
679 PlayHitEffect();
680 }
681 }
682 if (TC == null)
683 {
684 if (weapon == null || !(weapon.trait is TraitToolRangeGunRocket))
685 {
686 CC.Say(IsRanged ? "attack_air_range" : "attack_air", CC);
687 }
688 return true;
689 }
690 if (!hit)
691 {
692 if (TC != null)
693 {
694 if (CC.IsPCParty)
695 {
696 CC.Say(evadePlus ? "evadePlus2" : "evade2", CC, TC);
697 }
698 else
699 {
700 TC.Say(evadePlus ? "evadePlus" : "evade", TC, CC);
701 }
702 ModExpDef(150, 90);
703 ModExpDef(151, 90);
704 }
705 ProcAbility(list, CC, TC, weaponSkill.Value * (100 + GetTwoHandEncBonus(CC, weapon)) / 100, subAttack);
706 return false;
707 }
708 if (TC.IsPC)
709 {
710 Msg.SetColor("attack_pc");
711 EClass.pc.Say("attackMeleeToPC", CC, TC, GetAttackText(attackType, 3));
712 }
713 else
714 {
715 CC.Say("attackMelee", CC, TC, GetAttackText(attackType, 0));
716 }
717 bool showEffect = true;
718 int num4 = 0;
719 int num5 = 0;
720 int num6 = 0;
721 ConWeapon conWeapon = null;
722 if (weapon != null)
723 {
724 foreach (Element value2 in weapon.elements.dict.Values)
725 {
726 if (value2.source.categorySub == "eleConvert")
727 {
728 num4 = EClass.sources.elements.alias[value2.source.aliasRef].id;
729 num5 = 50 + value2.Value * 2;
730 num6 = Mathf.Min(value2.Value, 100);
731 break;
732 }
733 }
734 }
735 if (num4 == 0)
736 {
738 {
739 conWeapon = CC.GetCondition<ConWeapon>();
740 num4 = conWeapon.sourceElement.id;
741 num5 = conWeapon.power / 2;
742 num6 = (int)Mathf.Min(40f + MathF.Sqrt(conWeapon.power), 80f);
743 }
744 if (conWeapon == null && (weapon == null || IsMartialWeapon) && (CC.MainElement != Element.Void || CC.HasElement(1565)))
745 {
746 num4 = (CC.HasElement(1565) ? 915 : CC.MainElement.id);
747 num5 = CC.Power / 3 + EClass.rnd(CC.Power / 2);
748 if (CC.MainElement != Element.Void)
749 {
750 num5 += CC.MainElement.Value;
751 }
752 showEffect = false;
753 num6 = 50;
754 }
755 if (conWeapon == null && weapon != null && weapon.trait is TraitToolRangeCane)
756 {
757 IEnumerable<Element> enumerable = weapon.elements.dict.Values.Where((Element e) => e.source.categorySub == "eleAttack");
758 if (enumerable.Count() > 0)
759 {
760 num4 = enumerable.RandomItem().id;
761 num5 = num4 switch
762 {
763 920 => 30,
764 914 => 50,
765 918 => 50,
766 _ => 100,
767 };
768 }
769 num6 = 50;
770 }
771 }
772 long num7 = num;
773 long num8 = num * num6 / 100;
774 num -= num8;
775 long num9 = num * penetration / 100;
776 num -= num9;
777 num = TC.ApplyProtection(num) + num9 + num8;
778 int weaponEnc = GetWeaponEnc(CC, weapon, 609, addSelfEnc: true);
779 TC.DamageHP(num, num4, num5, (!IsRanged && !isThrow) ? AttackSource.Melee : AttackSource.Range, CC, showEffect, weapon);
780 if (conWeapon != null && (weaponEnc <= 0 || !(Mathf.Min(10f + Mathf.Sqrt(weaponEnc) * 5f, 90f) > (float)EClass.rnd(100))))
781 {
782 conWeapon.Mod(-1);
783 }
784 bool flag3 = IsCane || (weapon != null && weapon.Evalue(482) > 0);
785 int attackStyleElement = CC.body.GetAttackStyleElement(attackStyle);
786 if (!subAttack)
787 {
788 int mod2 = 100 / (count + 1);
789 if (!IsRanged || count == 0)
790 {
791 ModExpAtk(weaponSkill.id, mod2);
792 ModExpAtk(flag3 ? 304 : (IsRanged ? 133 : 132), mod2);
793 }
794 if (crit)
795 {
796 ModExpAtk(134, 50);
797 }
798 if (count == 0 && attackStyleElement != 0)
799 {
800 ModExpAtk(attackStyleElement, 100);
801 }
802 }
803 if (!CC.IsAliveInCurrentZone || !TC.IsAliveInCurrentZone)
804 {
805 return true;
806 }
807 if (EClass.rnd(8) == 0 && TC.isChara && CC.HasElement(1219))
808 {
809 CC.Say("abCrab", CC, TC);
810 TC.Chara.AddCondition<ConParalyze>(30 + EClass.rnd(30));
811 TC.Chara.AddCondition<ConGravity>();
812 }
813 if (list.Count > 0 && !flag2)
814 {
815 foreach (Element item in list)
816 {
817 if (!TC.IsAliveInCurrentZone)
818 {
819 break;
820 }
821 if (!item.IsActive(weapon) || !(item.source.categorySub == "eleAttack"))
822 {
823 continue;
824 }
825 int num10 = 25;
826 long num11 = EClass.rnd(num * (100 + item.Value * 10) / 500 + 5);
827 num11 = num11 * (100 + GetTwoHandEncBonus(CC, weapon)) / 100;
828 if (num11 >= 0)
829 {
830 if (conWeapon == null && weapon != null && weapon.trait is TraitToolRangeCane)
831 {
832 num10 = 0;
833 }
834 if (num10 > EClass.rnd(100))
835 {
836 TC.DamageHP(num11, item.id, isThrow ? (100 + item.Value * 5) : (30 + item.Value), AttackSource.WeaponEnchant, CC);
837 }
838 }
839 }
840 ProcAbility(list, CC, TC, weaponSkill.Value * (100 + GetTwoHandEncBonus(CC, weapon)) / 100, subAttack);
841 }
842 if (!CC.IsAliveInCurrentZone || !TC.IsAliveInCurrentZone)
843 {
844 return true;
845 }
846 if (!IsRanged && !flag2 && attackStyle == AttackStyle.Shield)
847 {
848 int num12 = CC.Evalue(123);
849 int num13 = CC.Evalue(381);
850 if (CC.elements.ValueWithoutLink(123) >= 10 && Mathf.Clamp(Mathf.Sqrt(num12) - 2f, 8f, 15f) + Mathf.Min(Mathf.Sqrt(num13), 25f) > (float)EClass.rnd(100))
851 {
852 num = num7 * (Mathf.Min(50 + num12 + num13, 200) + (int)Mathf.Min(Mathf.Sqrt(num13), 100f)) / 100;
853 penetration = (int)Mathf.Sqrt(num13) + ((num13 != 0) ? 20 : 0);
854 if (penetration > 100)
855 {
856 penetration = 100;
857 }
858 num9 = num * penetration / 100;
859 num -= num9;
860 num = TC.ApplyProtection(num) + num9;
861 Debug.Log("Bash:" + num + "/" + num7);
862 CC.PlaySound("shield_bash");
863 CC.Say("shield_bash", CC, TC);
864 TC.DamageHP(num, AttackSource.None, CC);
865 if (TC.IsAliveInCurrentZone && TC.isChara)
866 {
867 if (EClass.rnd(2) == 0)
868 {
869 TC.Chara.AddCondition<ConDim>(50 + (int)Mathf.Sqrt(num12) * 10);
870 }
871 TC.Chara.AddCondition<ConParalyze>(EClass.rnd(2), force: true);
872 }
873 if (!TC.isRestrained)
874 {
875 ProcShieldEncs(CC, TC, 500 + num13);
876 }
878 {
879 CC.ModExp(123, 50);
880 }
881 }
882 }
883 if (!CC.IsAliveInCurrentZone || !TC.IsAliveInCurrentZone)
884 {
885 return true;
886 }
887 if (TC.isChara && !TC.HasCondition<ConGravity>() && num3 > 0 && num3 * 2 + 15 > EClass.rnd(100) && !TC.isRestrained && TC.Chara.TryMoveFrom(CC.pos) == Card.MoveResult.Success)
888 {
889 TC.pos.PlayEffect("vanish");
890 TC.PlaySound("push", 1.5f);
891 }
892 return true;
893 void AddBane(bool valid, int idEle, int mod)
894 {
895 if (valid)
896 {
897 bane += (CC.Evalue(idEle) + ((weapon != null) ? weapon.Evalue(idEle, ignoreGlobalElement: true) : 0)) * mod / 100;
898 }
899 }
900 bool IgnoreExp()
901 {
902 if (!CC.HasEditorTag(EditorTag.Invulnerable) && !CC.HasEditorTag(EditorTag.InvulnerableToMobs) && !TC.HasEditorTag(EditorTag.Invulnerable))
903 {
904 return TC.HasEditorTag(EditorTag.InvulnerableToMobs);
905 }
906 return true;
907 }
908 void ModExpAtk(int ele, int mod)
909 {
910 if (!IgnoreExp() && (!TC.isCopy || EClass.rnd(10) == 0))
911 {
912 int a = (Mathf.Clamp((TC.LV + 10 - CC.elements.ValueWithoutLink(ele)) / 2, 1, 10) + Mathf.Min(TC.LV / 10, 10)) * mod / 100;
913 a = Mathf.Min(a, 200);
914 if (TC == CC)
915 {
916 a /= 2;
917 }
918 if (a > 0)
919 {
920 CC.ModExp(ele, a + EClass.rnd(a / 2 + 1));
921 }
922 }
923 }
924 void ModExpDef(int ele, int mod)
925 {
926 if (!IgnoreExp() && (!CC.isCopy || EClass.rnd(10) == 0))
927 {
928 int a2 = (Mathf.Clamp((CC.LV + 10 - TC.elements.ValueWithoutLink(ele)) / 2, 1, 10) + Mathf.Min(CC.LV / 10, 10)) * mod / 100;
929 a2 = Mathf.Min(a2, TC.isRestrained ? 10 : 200);
930 if (TC == CC)
931 {
932 a2 /= 2;
933 }
934 if (!TC.IsPC && !TC.isRestrained && !TC.HasHost)
935 {
936 a2 *= 3;
937 }
938 if (a2 > 0)
939 {
940 TC.ModExp(ele, a2 + EClass.rnd(a2 / 2 + 1));
941 }
942 }
943 }
944 void PlayHitEffect()
945 {
946 string id2 = "hit_default";
947 string id3 = "hit_default";
948 switch (attackType)
949 {
950 case AttackType.Slash:
951 id3 = "hit_slash";
952 id2 = "hit_slash";
953 break;
954 case AttackType.Spore:
955 id3 = "hit_spore";
956 id2 = "hit_spore";
957 break;
958 case AttackType.Claw:
959 case AttackType.Bite:
960 id3 = "hit_claw";
961 id2 = "hit_claw";
962 break;
963 case AttackType.Blunt:
964 case AttackType.Punch:
965 case AttackType.Kick:
966 case AttackType.Bow:
967 case AttackType.Gun:
968 case AttackType.Cane:
969 id3 = "hit_blunt";
970 id2 = "hit_blunt";
971 break;
972 }
973 if (TC != null)
974 {
975 TC.PlayEffect(id3).SetScale(crit ? 1.25f : 0.75f);
976 }
977 CC.PlaySound(id2);
978 }
979 }
AttackSource
Definition: AttackSource.cs:2
AttackType
Definition: AttackType.cs:2
EditorTag
Definition: EditorTag.cs:2
TraitToolRange toolRange
AttackType attackType
string GetAttackText(AttackType type, int id)
static void ProcAbility(List< Element > list, Chara CC, Card TC, int bonus, bool subAttack=false, int mtpChance=100)
long GetRawDamage(float dmgMulti, bool crit, bool maxRoll)
int numFireWithoutDamageLoss
void PlayRangedAnime(int numFire, float delay=0f)
static int GetWeaponEnc(Chara CC, Thing w, int ele, bool addSelfEnc=false)
AttackStyle attackStyle
static void ProcShieldEncs(Chara CC, Card TC, int mtpChance=100)
void Mod(int a, bool force=false)
SourceElement.Row sourceElement
Definition: Card.cs:11
ElementContainerCard elements
Definition: Card.cs:42
string id
Definition: Card.cs:36
bool isRestrained
Definition: Card.cs:569
virtual int Power
Definition: Card.cs:2337
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6443
bool isCopy
Definition: Card.cs:881
Point pos
Definition: Card.cs:60
Trait trait
Definition: Card.cs:54
MoveResult
Definition: Card.cs:13
bool HasEditorTag(EditorTag tag)
Definition: Card.cs:2642
void ModExp(string alias, int a)
Definition: Card.cs:2690
int LV
Definition: Card.cs:389
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:7121
int GetAttackStyleElement(AttackStyle style)
Definition: CharaBody.cs:512
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:563
Element MainElement
Definition: Chara.cs:731
override bool IsPC
Definition: Chara.cs:626
override bool IsPCParty
Definition: Chara.cs:629
override bool isSynced
Definition: Chara.cs:705
override bool IsPCFaction
Definition: Chara.cs:685
bool IsHostile()
Definition: Chara.cs:6677
static SourceManager sources
Definition: EClass.cs:43
Dictionary< int, Element > dict
int ValueWithoutLink(int ele)
int id
Definition: ELEMENT.cs:255
SourceElement.Row source
Definition: ELEMENT.cs:278
static Element Create(int id, int v=0)
Definition: ELEMENT.cs:1115
static Element Void
Definition: ELEMENT.cs:243
Definition: Msg.cs:5
static void SetColor()
Definition: Msg.cs:22
SourceElement elements

References ammo, attackStyle, attackType, Chara.body, CalcHit(), CC, Faction.charaElements, Element.Create(), crit, critFury, Debug, ElementContainer.dict, Card.elements, SourceManager.elements, evadePlus, Card.Evalue(), Chara.faction, CharaBody.GetAttackStyleElement(), GetAttackText(), GetRawDamage(), GetTwoHandEncBonus(), GetWeaponEnc(), Chara.HasCondition(), Card.HasEditorTag(), Card.HasElement(), hit, Card.id, Element.id, ignoreAnime, Chara.IsAliveInCurrentZone, IsCane, Card.isCopy, Chara.IsHostile(), IsMartialWeapon, Chara.IsPC, Chara.IsPCFaction, Card.IsPCFactionOrMinion, Chara.IsPCParty, IsRanged, Card.isRestrained, Chara.isSynced, isThrow, item, Card.LV, Chara.MainElement, BaseCondition.Mod(), Card.ModExp(), numFire, numFireWithoutDamageLoss, EClass.pc, penetration, PlayRangedAnime(), Card.PlaySound(), Card.pos, BaseCondition.power, Card.Power, ProcAbility(), ProcShieldEncs(), EClass.rnd(), Card.Say(), Msg.SetColor(), Element.source, BaseCondition.sourceElement, EClass.sources, toolRange, Card.trait, Element.Value, ElementContainer.ValueWithoutLink(), Element.Void, weapon, and weaponSkill.

Referenced by ActMelee.Attack(), ActRanged.Perform(), and ActThrow.Throw().

◆ PlayRangedAnime()

void AttackProcess.PlayRangedAnime ( int  numFire,
float  delay = 0f 
)
inline

Definition at line 382 of file AttackProcess.cs.

383 {
384 if (weapon == null)
385 {
386 return;
387 }
388 bool isGun = toolRange is TraitToolRangeGun;
389 bool isCane = toolRange is TraitToolRangeCane;
390 GameSetting.EffectData data = EClass.setting.effect.guns.TryGetValue(weapon.id) ?? EClass.setting.effect.guns[isCane ? "cane" : (isGun ? "gun" : "bow")];
391 bool isPCC = CC.IsPCC && CC.renderer.hasActor;
392 Vector2 firePos = (isPCC ? new Vector2(data.firePos.x * (float)((CC.renderer.actor.currentDir != 0 && CC.renderer.actor.currentDir != 1) ? 1 : (-1)), data.firePos.y) : Vector2.zero);
393 Chara _CC = CC;
394 Point _TP = posRangedAnime.Copy();
395 Thing _weapon = weapon;
396 bool ignoreSound = ignoreAttackSound;
398 Color effColor = Color.white;
399 if (isCane)
400 {
401 IEnumerable<Element> enumerable = toolRange.owner.elements.dict.Values.Where((Element e) => e.source.categorySub == "eleAttack");
402 if (enumerable.Count() > 0)
403 {
404 Element element = enumerable.RandomItem();
405 effColor = EClass.Colors.elementColors[element.source.alias];
406 }
407 }
408 for (int i = 0; i < numFire; i++)
409 {
410 TweenUtil.Delay((float)i * data.delay + delay, delegate
411 {
412 if (EClass.core.IsGameStarted && _CC.IsAliveInCurrentZone && _zone == _CC.currentZone)
413 {
414 switch (_weapon.id)
415 {
416 case "gun_rail":
417 _CC.PlayEffect("laser_rail").GetComponent<SpriteBasedLaser>().Play(_TP.PositionCenter());
418 break;
419 case "gun_laser":
420 _CC.PlayEffect("laser").GetComponent<SpriteBasedLaser>().Play(_TP.PositionCenter());
421 break;
422 case "gun_laser_assault":
423 Effect.Get("ranged_laser")._Play(_CC.pos, _CC.isSynced ? _CC.renderer.position : _CC.pos.Position(), 0f, _TP, data.sprite);
424 break;
425 default:
426 {
427 Effect effect = Effect.Get("ranged_arrow")._Play(_CC.pos, _CC.isSynced ? _CC.renderer.position : _CC.pos.Position(), 0f, _TP, data.sprite);
428 if (isCane)
429 {
430 effect.sr.color = effColor;
431 }
432 break;
433 }
434 }
435 if (data.eject)
436 {
437 if (!ignoreSound)
438 {
439 _CC.PlaySound("bullet_drop");
440 }
441 _CC.PlayEffect("bullet").Emit(1);
442 }
443 if (isGun)
444 {
445 if (isPCC)
446 {
447 _weapon.PlayEffect(data.idEffect.IsEmpty("gunfire"), useRenderPos: true, 0f, firePos);
448 }
449 else
450 {
451 _CC.PlayEffect(data.idEffect.IsEmpty("gunfire"));
452 }
453 }
454 if (!ignoreSound)
455 {
456 _CC.PlaySound(data.idSound.IsEmpty("attack_gun"));
457 }
458 }
459 });
460 }
461 }
bool ignoreAttackSound
Point posRangedAnime
virtual int currentDir
Definition: CardActor.cs:41
CardActor actor
Definition: CardRenderer.cs:11
CardRenderer renderer
Definition: Card.cs:64
Zone currentZone
Definition: Chara.cs:257
UD_String_Color elementColors
static ColorProfile Colors
Definition: EClass.cs:39
static Zone _zone
Definition: EClass.cs:21
static GameSetting setting
Definition: EClass.cs:35
UD_String_EffectData guns
Definition: GameSetting.cs:276
EffectSetting effect
Definition: GameSetting.cs:299
Definition: Point.cs:9
Point Copy()
Definition: Point.cs:491
Definition: Thing.cs:8
Card owner
Definition: Trait.cs:28
bool TryGetValue(TKey key, out TValue value)
Definition: UDictionary.cs:178
Definition: Zone.cs:12

References Effect._Play(), EClass._zone, CardRenderer.actor, CC, Color, EClass.Colors, Point.Copy(), EClass.core, CardActor.currentDir, Chara.currentZone, ElementContainer.dict, GameSetting.effect, GameSetting.EffectData.eject, ColorProfile.elementColors, Card.elements, Effect.Emit(), GameSetting.EffectData.firePos, Effect.Get(), GameSetting.EffectSetting.guns, CardRenderer.hasActor, Card.id, GameSetting.EffectData.idEffect, GameSetting.EffectData.idSound, ignoreAttackSound, Chara.IsAliveInCurrentZone, Core.IsGameStarted, Chara.isSynced, numFire, Trait.owner, Card.PlayEffect(), Card.PlaySound(), Card.pos, CardRenderer.position, Point.Position(), Point.PositionCenter(), posRangedAnime, Card.renderer, EClass.setting, Element.source, GameSetting.EffectData.sprite, toolRange, UDictionary< TKey, TValue >.TryGetValue(), and weapon.

Referenced by ActRanged.Perform(), and Perform().

◆ Prepare()

void AttackProcess.Prepare ( Chara  _CC,
Thing  _weapon,
Card  _TC = null,
Point  _TP = null,
int  _attackIndex = 0,
bool  _isThrow = false 
)
inline

Definition at line 146 of file AttackProcess.cs.

147 {
148 CC = _CC;
149 TC = _TC;
150 TP = _TP;
151 isThrow = _isThrow;
152 weapon = _weapon;
153 ammo = _weapon?.ammoData;
154 hit = (crit = (critFury = (evadePlus = false)));
156 attackType = AttackType.Slash;
157 attackStyle = AttackStyle.Default;
158 evasion = 0L;
159 penetration = 0;
160 distMod = 100;
161 attackIndex = _attackIndex;
163 ignoreAnime = (ignoreAttackSound = false);
164 if (!isThrow)
165 {
166 if (!IsRanged)
167 {
169 }
170 else if (TP != null)
171 {
172 int num = CC.pos.Distance(TP);
173 distMod = Mathf.Max(115 - 10 * Mathf.Abs(num - toolRange.BestDist) * 100 / (100 + weapon.Evalue(605) * 10), 80);
174 }
175 }
176 if (isThrow)
177 {
178 bool flag = weapon.HasTag(CTAG.throwWeapon) || weapon.HasTag(CTAG.throwWeaponEnemy);
179 int num2 = (int)Mathf.Clamp(Mathf.Sqrt(weapon.SelfWeight + weapon.ChildrenWeight) * 3f + 25f + (float)(flag ? 75 : 0), 10f, 400f + Mathf.Sqrt(CC.STR) * 50f);
180 int num3 = Mathf.Clamp(weapon.material.hardness, flag ? 40 : 20, 200);
182 attackType = AttackType.Blunt;
183 dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7) + Math.Min(weapon.encLV, 99);
184 dNum = 2;
185 dDim = (((!CC.IsPCParty) ? CC.LV : 0) + CC.STR + CC.Evalue(108)) * num2 / 100 * num3 / 100 / 2;
186 dMulti = 1f;
187 toHitBase = EClass.curve(CC.DEX / 4 + CC.STR / 2 + weaponSkill.Value, 50, 25) + (CC.IsPCFaction ? 75 : 250);
188 toHitFix = CC.HIT + weapon.HIT;
189 penetration = 25;
190 }
191 else if (IsMartial || IsMartialWeapon)
192 {
194 bool flag2 = weapon != null && weapon.Evalue(482) > 0;
195 if (flag2)
196 {
198 }
199 attackType = ((!CC.race.meleeStyle.IsEmpty()) ? CC.race.meleeStyle.ToEnum<AttackType>() : ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch));
200 dBonus = CC.DMG + CC.encLV + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.GetParent(CC).Value / 5 + weaponSkill.Value / 4));
201 dNum = 2 + Mathf.Min(weaponSkill.Value / 10, 4);
202 dDim = 5 + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.Value / 3));
203 dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value / 2 + weaponSkill.Value / 2 + CC.Evalue(flag2 ? 304 : 132) / 2) / 50f;
204 dMulti += 0.05f * (float)CC.Evalue(1400);
206 toHitFix = CC.HIT;
207 if (attackStyle == AttackStyle.Shield)
208 {
209 toHitBase = toHitBase * 75 / 100;
210 }
211 penetration = Mathf.Clamp(weaponSkill.Value / 10 + 5, 5, 20) + CC.Evalue(92);
212 if (CC.HasElement(1246))
213 {
214 penetration += 25;
215 }
216 if (IsMartialWeapon)
217 {
218 dBonus += weapon.DMG;
219 dNum += weapon.source.offense[0];
220 dDim = Mathf.Max(dDim / 2 + weapon.c_diceDim, 1);
223 if (!weapon.source.attackType.IsEmpty())
224 {
225 attackType = weapon.source.attackType.ToEnum<AttackType>();
226 }
227 }
228 }
229 else
230 {
231 if (IsRanged)
232 {
234 }
235 else
236 {
238 }
239 if (!weapon.source.attackType.IsEmpty())
240 {
241 attackType = weapon.source.attackType.ToEnum<AttackType>();
242 }
243 bool flag3 = IsCane || weapon.Evalue(482) > 0;
244 if (flag3)
245 {
247 }
248 dBonus = CC.DMG + CC.encLV + weapon.DMG;
249 dNum = weapon.source.offense[0];
251 dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value + weaponSkill.Value / 2 + CC.Evalue(flag3 ? 304 : (IsRanged ? 133 : 132))) / 50f;
252 dMulti += 0.05f * (float)CC.Evalue(IsRanged ? 1404 : 1400);
253 toHitBase = EClass.curve((IsCane ? CC.WIL : CC.DEX) / 4 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
254 if (CC.HasElement(1208) && weaponSkill.id == 101)
255 {
256 toHitBase = toHitBase * 115 / 100;
257 }
258 toHitFix = CC.HIT + weapon.HIT;
259 penetration = weapon.Penetration + CC.Evalue(92);
260 if (IsRanged)
261 {
262 if (CC.HasElement(1244))
263 {
264 penetration += 25;
265 }
266 }
267 else if (CC.HasElement(1247))
268 {
269 penetration += 25;
270 }
271 if (IsCane)
272 {
273 toHitBase += 50L;
274 }
275 }
276 if (ammo != null && !(ammo.trait is TraitAmmoTalisman))
277 {
278 dNumAmmo = ((ammo.source.offense.Length != 0) ? ammo.source.offense[0] : 0);
280 dBonusAmmo = ammo.DMG + ammo.encLV;
281 if (dNumAmmo < 1)
282 {
283 dNumAmmo = 1;
284 }
285 if (dDimAmmo < 1)
286 {
287 dDimAmmo = 1;
288 }
289 toHitFix += ammo.HIT;
290 }
291 else
292 {
293 dNumAmmo = 0;
294 dDimAmmo = 0;
295 dBonusAmmo = 0;
296 }
297 if (dNum < 1)
298 {
299 dNum = 1;
300 }
301 if (dDim < 1)
302 {
303 dDim = 1;
304 }
305 if (penetration > 100)
306 {
307 penetration = 100;
308 }
309 if (attackStyle == AttackStyle.TwoHand)
310 {
311 dMulti = dMulti * 1.5f + 0.1f * Mathf.Sqrt(Mathf.Max(0, CC.Evalue(130)));
312 }
313 dMulti = dMulti * (float)distMod / 100f;
314 toHit = (toHitBase + toHitFix) * (100 + CC.Evalue(414)) / 100;
315 toHit = toHit * distMod / 100;
316 if (CC.HasCondition<ConBane>())
317 {
318 toHit = toHit * 75 / 100;
319 }
320 if (TC != null && CC.HasHigherGround(TC))
321 {
322 toHit = toHit * 120 / 100;
323 }
324 if (CC.ride != null)
325 {
326 toHit = toHit * 100 / (100 + 500 / Mathf.Max(5, 10 + CC.EvalueRiding()));
327 }
328 if (CC.parasite != null)
329 {
330 toHit = toHit * 100 / (100 + 1000 / Mathf.Max(5, 10 + CC.Evalue(227)));
331 }
332 if (CC.host != null)
333 {
334 if (CC.host.ride == CC)
335 {
336 toHit = toHit * 100 / (100 + 1000 / Mathf.Max(5, 10 + CC.STR));
337 }
338 if (CC.host.parasite == CC)
339 {
340 toHit = toHit * 100 / (100 + 2000 / Mathf.Max(5, 10 + CC.DEX));
341 }
342 }
343 if (attackStyle == AttackStyle.TwoHand)
344 {
345 toHit += 25 + (int)Mathf.Sqrt(Mathf.Max(0, CC.Evalue(130)) * 2);
346 }
347 else if (attackStyle == AttackStyle.TwoWield)
348 {
349 int num4 = CC.EvalueMax(131, -10);
350 int num5 = ((num4 >= 50) ? 10 : ((num4 >= 25) ? 12 : 15));
351 if (toHit > 0)
352 {
353 toHit = toHit * 100 / (100 + (attackIndex + 1) * num5 + attackIndex * Mathf.Clamp(2000 / (20 + num4), 0, 100));
354 }
355 }
356 if (CC.isBlind)
357 {
358 toHit /= ((IsRanged || isThrow) ? 10 : 3);
359 }
361 {
362 toHit /= 2L;
363 }
364 if (TC != null)
365 {
366 evasion = EClass.curve(TC.PER / 3 + TC.Evalue(150), 50, 10) + TC.DV + 25;
367 if (TC.isChara && TC.Chara.isBlind)
368 {
369 evasion /= 2L;
370 }
371 if (TC.HasCondition<ConDim>())
372 {
373 evasion /= 2L;
374 }
375 if (TC.isChara && TC.Chara.HasHigherGround(CC))
376 {
377 evasion = evasion * 120 / 100;
378 }
379 }
380 }
CTAG
Definition: CTAG.cs:2
if(item3.idFile==idFirstFile &&item3.id==idFirstTopic)
Definition: UIBook.cs:627
int DMG
Definition: Card.cs:2373
int EvalueMax(int ele, int min=0)
Definition: Card.cs:2627
int ChildrenWeight
Definition: Card.cs:2053
SourceMaterial.Row material
Definition: Card.cs:2091
int HIT
Definition: Card.cs:2371
Thing ammoData
Definition: Card.cs:1813
int WIL
Definition: Card.cs:2385
int STR
Definition: Card.cs:2375
bool HasTag(CTAG tag)
Definition: Card.cs:2637
int DEX
Definition: Card.cs:2377
int encLV
Definition: Card.cs:329
int c_diceDim
Definition: Card.cs:1417
SourceCategory.Row category
Definition: Card.cs:2089
Chara host
Definition: Chara.cs:33
int EvalueRiding()
Definition: Chara.cs:6263
bool HasHigherGround(Card c)
Definition: Chara.cs:1216
Chara parasite
Definition: Chara.cs:30
Chara ride
Definition: Chara.cs:27
bool isBlind
Definition: Chara.cs:132
bool isConfused
Definition: Chara.cs:128
SourceRace.Row race
Definition: Chara.cs:466
static int curve(long _a, int start, int step, int rate=75)
Definition: EClass.cs:69
Element GetOrCreateElement(Element ele)
Element GetParent(Card c)
Definition: ELEMENT.cs:527
int Distance(Point p)
Definition: Point.cs:989
SourceThing.Row source
Definition: Thing.cs:11
override int SelfWeight
Definition: Thing.cs:64
int Penetration
Definition: Thing.cs:34
virtual Element WeaponSkill

References ammo, Card.ammoData, attackIndex, attackStyle, attackType, TraitToolRange.BestDist, Chara.body, Card.c_diceDim, Card.category, CC, Card.ChildrenWeight, crit, critFury, EClass.curve(), dBonus, dBonusAmmo, dDim, dDimAmmo, Card.DEX, Point.Distance(), distMod, Card.DMG, dMulti, dNum, dNumAmmo, Card.elements, Card.encLV, evadePlus, Card.Evalue(), Card.EvalueMax(), Chara.EvalueRiding(), evasion, CharaBody.GetAttackStyle(), ElementContainer.GetOrCreateElement(), Element.GetParent(), Chara.HasCondition(), Card.HasElement(), Chara.HasHigherGround(), Card.HasTag(), hit, Card.HIT, Chara.host, if(), ignoreAnime, ignoreAttackSound, Chara.isBlind, IsCane, Chara.isConfused, IsMartial, IsMartialWeapon, Chara.IsPCParty, IsRanged, isThrow, Card.LV, Card.material, Chara.parasite, penetration, Thing.Penetration, Card.pos, posRangedAnime, Chara.race, Chara.ride, EClass.rnd(), Thing.SelfWeight, Thing.source, Card.STR, toHit, toHitBase, toHitFix, toolRange, TP, Card.trait, Element.Value, weapon, weaponSkill, TraitToolRange.WeaponSkill, and Card.WIL.

Referenced by Thing.AddAttackEvaluation(), ActMelee.Attack(), ActRanged.Perform(), and ActThrow.Throw().

◆ ProcAbility() [1/2]

static void AttackProcess.ProcAbility ( Element  e,
Chara  CC,
Card  TC,
int  bonus,
bool  subAttack = false,
int  mtpChance = 100 
)
inlinestatic

Definition at line 526 of file AttackProcess.cs.

527 {
528 if (!(e is Ability))
529 {
530 return;
531 }
532 int num = (10 + e.Value / 5) * mtpChance / 100;
533 int power = EClass.curve((100 + e.Value * 10) * (100 + bonus) / 100, 400, 100);
534 if (e.id == 6602)
535 {
536 num = 100;
537 }
538 if (num <= EClass.rnd(100))
539 {
540 return;
541 }
542 Act obj = e as Act;
543 Card card = (obj.TargetType.CanSelectSelf ? CC : TC);
544 string text = ((e.source.proc.Length >= 2) ? e.source.proc[1] : "");
545 string text2 = obj.source.abilityType.TryGet(0);
546 switch (text2)
547 {
548 case "buff":
549 if (CC.HasCondition(text))
550 {
551 return;
552 }
553 card = CC;
554 break;
555 case "debuff":
556 case "attack":
557 case "dot":
558 card = TC;
559 break;
560 }
561 if (subAttack)
562 {
563 if (card == CC)
564 {
565 return;
566 }
567 switch (text2)
568 {
569 case "summon":
570 return;
571 case "teleport":
572 return;
573 case "suicide":
574 return;
575 }
576 }
577 if (card.IsAliveInCurrentZone)
578 {
579 Card tC = Act.TC;
580 ActEffect.ProcAt(e.source.proc[0].ToEnum<EffectId>(), power, BlessedState.Normal, CC, card, card.pos, isNeg: false, new ActRef
581 {
582 n1 = text,
583 aliasEle = e.source.aliasRef,
584 noFriendlyFire = true
585 });
586 Act.TC = tC;
587 }
588 }
BlessedState
Definition: BlessedState.cs:2
EffectId
Definition: EffectId.cs:2
static void ProcAt(EffectId id, int power, BlessedState state, Card cc, Card tc, Point tp, bool isNeg, ActRef actRef=default(ActRef))
Definition: ActEffect.cs:493
Definition: ACT.cs:62
static Card TC
Definition: ACT.cs:79
Definition: ActRef.cs:2

References card, CC, EClass.curve(), Chara.HasCondition(), Element.id, ActEffect.ProcAt(), EClass.rnd(), Element.source, Act.TC, TC, and Element.Value.

◆ ProcAbility() [2/2]

static void AttackProcess.ProcAbility ( List< Element list,
Chara  CC,
Card  TC,
int  bonus,
bool  subAttack = false,
int  mtpChance = 100 
)
inlinestatic

Definition at line 514 of file AttackProcess.cs.

515 {
516 if (list == null)
517 {
518 return;
519 }
520 foreach (Element item in list)
521 {
522 ProcAbility(item, CC, TC, bonus, subAttack, mtpChance);
523 }
524 }

References CC, item, and ProcAbility().

Referenced by Perform(), ProcAbility(), and ProcShieldEncs().

◆ ProcShieldEncs()

static void AttackProcess.ProcShieldEncs ( Chara  CC,
Card  TC,
int  mtpChance = 100 
)
inlinestatic

Definition at line 503 of file AttackProcess.cs.

504 {
505 foreach (BodySlot slot in CC.body.slots)
506 {
507 if (slot.elementId == 35 && slot.thing != null && (slot.thing.category.IsChildOf("shield") || slot.thing.category.IsChildOf("martial")))
508 {
509 ProcAbility(slot.thing.elements.dict.Values.ToList(), CC, TC, CC.Evalue((slot.thing.category.skill == 0) ? 123 : slot.thing.category.skill), subAttack: false, mtpChance);
510 }
511 }
512 }
int elementId
Definition: BodySlot.cs:6
Thing thing
Definition: BodySlot.cs:8
List< BodySlot > slots
Definition: CharaBody.cs:8

References Chara.body, Card.category, CC, ElementContainer.dict, BodySlot.elementId, Card.elements, Card.Evalue(), ProcAbility(), CharaBody.slots, and BodySlot.thing.

Referenced by Perform().

Member Data Documentation

◆ ammo

Thing AttackProcess.ammo

Definition at line 68 of file AttackProcess.cs.

Referenced by GetRawDamage(), Perform(), and Prepare().

◆ attackIndex

int AttackProcess.attackIndex

Definition at line 28 of file AttackProcess.cs.

Referenced by GetText(), and Prepare().

◆ attackStyle

AttackStyle AttackProcess.attackStyle

Definition at line 74 of file AttackProcess.cs.

Referenced by Perform(), and Prepare().

◆ attackType

AttackType AttackProcess.attackType

Definition at line 72 of file AttackProcess.cs.

Referenced by Perform(), and Prepare().

◆ CC

◆ crit

bool AttackProcess.crit

Definition at line 42 of file AttackProcess.cs.

Referenced by Crit(), GetRawDamage(), Perform(), and Prepare().

◆ critFury

bool AttackProcess.critFury

Definition at line 44 of file AttackProcess.cs.

Referenced by CalcHit(), Perform(), and Prepare().

◆ Current

AttackProcess AttackProcess.Current = new AttackProcess()
static

◆ dBonus

int AttackProcess.dBonus

Definition at line 20 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetRocketPower(), GetText(), and Prepare().

◆ dBonusAmmo

int AttackProcess.dBonusAmmo

Definition at line 34 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetRocketPower(), and Prepare().

◆ dDim

int AttackProcess.dDim

Definition at line 18 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetRocketPower(), GetText(), and Prepare().

◆ dDimAmmo

int AttackProcess.dDimAmmo

Definition at line 32 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetRocketPower(), and Prepare().

◆ distMod

int AttackProcess.distMod

Definition at line 26 of file AttackProcess.cs.

Referenced by Prepare().

◆ dMulti

float AttackProcess.dMulti

Definition at line 40 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetText(), and Prepare().

◆ dNum

int AttackProcess.dNum

Definition at line 16 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetRocketPower(), GetText(), and Prepare().

◆ dNumAmmo

int AttackProcess.dNumAmmo

Definition at line 30 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetRocketPower(), and Prepare().

◆ evadePlus

bool AttackProcess.evadePlus

Definition at line 48 of file AttackProcess.cs.

Referenced by EvadePlus(), Perform(), and Prepare().

◆ evasion

long AttackProcess.evasion

Definition at line 14 of file AttackProcess.cs.

Referenced by CalcHit(), and Prepare().

◆ hit

bool AttackProcess.hit

Definition at line 46 of file AttackProcess.cs.

Referenced by Perform(), and Prepare().

◆ ignoreAnime

bool AttackProcess.ignoreAnime

Definition at line 52 of file AttackProcess.cs.

Referenced by Perform(), and Prepare().

◆ ignoreAttackSound

bool AttackProcess.ignoreAttackSound

Definition at line 54 of file AttackProcess.cs.

Referenced by PlayRangedAnime(), and Prepare().

◆ isThrow

bool AttackProcess.isThrow

Definition at line 50 of file AttackProcess.cs.

Referenced by Perform(), and Prepare().

◆ numFire

int AttackProcess.numFire

Definition at line 36 of file AttackProcess.cs.

Referenced by Perform(), and PlayRangedAnime().

◆ numFireWithoutDamageLoss

int AttackProcess.numFireWithoutDamageLoss

Definition at line 38 of file AttackProcess.cs.

Referenced by Perform().

◆ penetration

int AttackProcess.penetration

Definition at line 24 of file AttackProcess.cs.

Referenced by GetText(), Perform(), and Prepare().

◆ posRangedAnime

Point AttackProcess.posRangedAnime

Definition at line 62 of file AttackProcess.cs.

Referenced by PlayRangedAnime(), and Prepare().

◆ TC

Card AttackProcess.TC

Definition at line 58 of file AttackProcess.cs.

Referenced by ProcAbility().

◆ toHit

long AttackProcess.toHit

Definition at line 10 of file AttackProcess.cs.

Referenced by CalcHit(), GetText(), and Prepare().

◆ toHitBase

long AttackProcess.toHitBase

Definition at line 12 of file AttackProcess.cs.

Referenced by Prepare().

◆ toHitFix

int AttackProcess.toHitFix

Definition at line 22 of file AttackProcess.cs.

Referenced by Prepare().

◆ toolRange

TraitToolRange AttackProcess.toolRange

Definition at line 70 of file AttackProcess.cs.

Referenced by Perform(), PlayRangedAnime(), and Prepare().

◆ TP

Point AttackProcess.TP

Definition at line 60 of file AttackProcess.cs.

Referenced by ActRanged.Perform(), and Prepare().

◆ weapon

Thing AttackProcess.weapon

Definition at line 66 of file AttackProcess.cs.

Referenced by CalcHit(), Perform(), PlayRangedAnime(), and Prepare().

◆ weaponSkill

Element AttackProcess.weaponSkill

Definition at line 64 of file AttackProcess.cs.

Referenced by GetRocketPower(), Perform(), and Prepare().

Property Documentation

◆ IsCane

bool AttackProcess.IsCane
get

Definition at line 102 of file AttackProcess.cs.

103 {
104 get
105 {
106 if (IsRanged)
107 {
109 }
110 return false;
111 }
112 }

Referenced by Perform(), and Prepare().

◆ IsMartial

bool AttackProcess.IsMartial
get

Definition at line 76 of file AttackProcess.cs.

Referenced by GetRawDamage(), GetText(), and Prepare().

◆ IsMartialWeapon

bool AttackProcess.IsMartialWeapon
get

Definition at line 78 of file AttackProcess.cs.

79 {
80 get
81 {
82 if (weapon != null)
83 {
84 return weapon.category.skill == 100;
85 }
86 return false;
87 }
88 }

Referenced by GetRawDamage(), Perform(), and Prepare().

◆ IsRanged

bool AttackProcess.IsRanged
get

Definition at line 90 of file AttackProcess.cs.

91 {
92 get
93 {
94 if (toolRange != null && !isThrow)
95 {
97 }
98 return false;
99 }
100 }
virtual Thing Thing
Definition: Card.cs:2098
bool isEquipped
Definition: Thing.cs:17

Referenced by CalcHit(), Perform(), and Prepare().


The documentation for this class was generated from the following file: