Advertisement
KHD

!dmg

KHD
Jul 25th, 2013
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 28.51 KB | None | 0 0
  1. ;!dmg attacking(pokemon) IVs EVs(+/-) Level Ability: @Item | defending(pokemon) IVs EVs± Level Ability: @Item | Move | Extra
  2. /*
  3. */
  4. on $*:TEXT:/^!dmg( (help))?$/:*: {
  5.   var %window = $iif($chan, $chan, $nick)
  6.   msg %window !dmg Attacker IVs EVs± <Level> <Ability> <@Item> <Boosts> $(|) Target IVs EVs± <Level> <Ability> <@Item> <Boosts> $(|) Move $(|) Extras
  7.   msg %window Conditions: (Prefix with -) View all with !dmg Extras. i.e -Stealth Rock, -Flower Gift
  8.   msg %window suffix +/- at the end of EVs to specify Nature.; Ways to minimize input can be found in !dmg tips
  9. }
  10. on $*:TEXT:/^!dmg (tips|extras)$/:*: {
  11.   var %window = $iif($chan == $null, $nick, $chan)
  12.   if ($2 == tips) {
  13.     msg %window IVs of 31 and 0 can be substituted with + or -, Both Pokemon are assumed to be Level 100
  14.     msg %window -weather(x) can be substituted with -x, -Stealth Rock can be abbreviated -SR and -Spikes(#) can be abbreviated -S#
  15.     msg %window You can abbreviate a pokemon's ability with Abi0, Abi1, or AbiDW.
  16.     msg %window You can use the highest base power for a varying base power move by adding the -MaxBP condition.
  17.     msg %window Typing VGC after !dmg will assume both pokemon are level 50 unless otherwise specified.
  18.     return
  19.   }
  20.   else if ($2 == Extras) {
  21.     msg %window List of extras: Seperate multiple parameters with "-"
  22.     msg %window Crit, Charge, Weather(), Spread [if more than 1 target], Screen [Reflect/Light Screen], Flower Gift
  23.     msg %window Friend Guard, Retaliate, Flash Fire, Fusion [for fusion moves], Slow Start, Moved Last, Wonder Room
  24.     msg %window TargetStatus(), UserStatus(), Mud Sport, Water Sport, Stealth Rock, Spikes(#), Helping Hand, MaxBP
  25.     ;TargetHP(Fraction), UserHP(Fraction),
  26.     return
  27.   }
  28. }
  29. ; !dmg [setting] Atacker IVs EVs [Level] Boost Ability @Item
  30.  
  31. on *:TEXT:!dmg *|*|*:*: {
  32.   var %window = $iif($chan,$chan,$nick)
  33.   if ($findTok(TS VGC LC RAND, $2, 32)) { var %dmg.setting = $2, %input = $3-, %autoLevel = $getTok(100 50 5 R, $v1, 32) }
  34.   else { var %dmg.setting = $false, %input = $2-, %autoLevel = 100 }
  35.   ; Some Move Stuff
  36.   var %move = $toID($gettok(%input, 3, 124)), %cat = $move(%move).category, %extra = $gettok(%input, 4, 124)
  37.   if (!$move(%move).basePower) { msg %window %move is not a valid damaging move. | return }
  38.   /* TODO: Randbat Damage Calc
  39.   if (%dmg.setting == RAND) {
  40.     ;----------| Attacking Pokemon Stat
  41.     tokenize 32 $gettok(%input,1,124)
  42.     var %attacker = $toID($1).pkm
  43.     if (!$isPokemon(%attacker)) { msg %window $1 is not a Pokemon | return }
  44.     var %attackerName = $pokemon(%attacker).species, %atk = $iif(%cat == Physical, atk, spa), %$2_Is_Level = $iif(($2 isnum 1-100) && (+* !iswm $2) && (-* !iswm $2),$true,$false), %attackerLevel = $iif(%$2_Is_Level,$2,$randlevel(%attacker))
  45.     var %atkEVs = 84, %atkivs = 31, %attackStat = $stat($($!pokemon(%attacker). $+ %atk, 2),%atkIVs,%atkEVs,%attackerLevel)
  46.     var %attackerInfo = $iif(%$2_Is_Level, $3-, $2-)
  47.     if (!%attackBoost) {
  48.       if ($wildTok(%attackerInfo, +*, 1, 32)) { var %attackBoost = $v1, %attackerInfo = $remtok(%attackerInfo,%attackBoost,1,32) }
  49.       elseif ($wildTok(%attackerInfo, -*, 1, 32)) { var %attackBoost = $v1, %attackerInfo = $remtok(%attackerInfo,%attackBoost,1,32) }
  50.       else { var %attackBoost = 0 }
  51.     }
  52.     else { %attackerInfo = $remtok(%attackerInfo,%attackBoost,1,32) }
  53.     if ($wildtok(%attackerInfo,@*,1,32)) { var %attackerItem = $right($gettok(%attackerInfo,$+($findtok(%attackerInfo, $v1, 1, 32),-),32), -1), %attackerAbility = $remove(%attackerInfo,%attackerItem,@) }
  54.     ;if ($nick == V4) { msg %window %attackerInfo | halt }
  55.     if ($regex(userabi,%attackerAbility,/Abi(lity)?([01]|DW)/)) { var %attackerAbility = $($!pokemon(%attacker).ability $+ $regml(userabi,1), 2) }
  56.     if (%attackerItem == No Item) { var %attackerItem = $false }
  57.     if (%attackerAbility == $null) { %attackerAbility = $sorttok() }
  58.  
  59.     ;----------| Defending Pokemon Stats
  60.     tokenize 32 $gettok(%input,2,124)
  61.     var %defender = $toID($1).pkm
  62.     if (!$isPokemon(%defender)) { msg %window $1 is not a pokemon | return }
  63.     var %defenderName = $pokemon(%defender).species, %def = $iif(%cat == Physical || $move(%move).shortdesc == $move(psystrike).shortdesc, def, spd)
  64.     var %hpIVs = $typo($gettok($2,1,47)).iv, %defIVs = $typo($iif(/ isin $2,$gettok($2,2,47),$2)).iv, %$4_Is_Level = $iif(($4 isnum 1-100) && (+* !iswm $4) && (-* !iswm $4),$true,$false), %defenderLevel = $iif(%$4_Is_Level,$4,$iif(%autolevel !isnum, $randlevel(%user), $v1))
  65.     var %EVs = $3, %hpEVs = $gettok(%EVs,1,47), %defEVs = $gettok(%EVs,$numtok(%EVs,47),47), %maxHP = $stat($pokemon(%defender).HP,%hpIVs,%hpEVs,%defenderLevel).hp, %defenseStat = $stat($($!pokemon(%defender). $+ %def, 3),%defIVs,%defEVs,%defenderLevel)
  66.     var %defenderInfo = $iif(%$4_Is_Level, $5-, $4-)
  67.     if (!%defenseBoost) {
  68.       if ($wildTok(%defenderInfo, +*, 1, 32)) { var %defenseBoost = $v1, %defenderInfo = $remtok(%defenderInfo,%defenseBoost,1,32) }
  69.       elseif ($wildTok(%defenderInfo, -*, 1, 32)) { var %defenseBoost = $v1, %defenderInfo = $remtok(%defenderInfo,%defenseBoost,1,32) }
  70.       else { var %defenseBoost = 0 }
  71.     }
  72.     else { %defenderInfo = $remtok(%defenderInfo,%defenseBoost,1,32) }
  73.     if ($wildtok(%defenderInfo,@*,1,32)) { var %defenderItem = $right($gettok(%defenderInfo,$+($findtok(%defenderInfo, $v1, 1, 32),-),32), -1), %defenderAbility = $remove(%defenderInfo,%defenderItem,@) }
  74.     if ($regex(targetabi,%defenderAbility,/Abi(lity)?([01]|DW)/)) { var %defenderAbility = $($!pokemon(%defender).ability $+ $regml(targetabi,1)) }
  75.     if (%defenderItem == No Item) { var %defenderItem = $false }
  76.   }
  77.   */
  78.   ;----------| Attacking Pokemon Stat
  79.   tokenize 32 $gettok(%input,1,124)
  80.   var %attacker = $toID($1).pkm
  81.   if (!$isPokemon(%attacker)) { msg %window $1 is not a Pokemon | return }
  82.   var %attackerName = $pokemon(%attacker).species, %atk = $iif(%cat == Physical, atk, spa), %$4_Is_Level = $iif(($4 isnum) && (+* !iswm $4) && (-* !iswm $4),$true,$false), %attackerLevel = $iif(%$4_Is_Level,$4,$iif(%autolevel !isnum, $randlevel(%attacker), $v1))
  83.   var %atkEVs = $iif($remove($3,+,-) isnum, $3, $2), %atkivs = $iif($remove($3,+,-) isnum, 31, $2)
  84.   var %tierShift = $iif(%dmg.setting != TS, 0, $gettok(5 5 10 10 15 15 15, $findtok(BL UU BL2 RU BL3 NU NFE, $pokemon(%pokemon).tier, 1, 32), 32)), %attackStat = $stat($calc($($!pokemon(%attacker). $+ %atk, 2) + %tierShift),%atkIVs,%atkEVs,%attackerLevel)
  85.   var %attackerInfo = $iif(%$4_Is_Level, $5-, $4-)
  86.   if (!%attackBoost) {
  87.     if ($wildTok(%attackerInfo, +*, 1, 32)) { var %attackBoost = $v1, %attackerInfo = $remtok(%attackerInfo,%attackBoost,1,32) }
  88.     elseif ($wildTok(%attackerInfo, -*, 1, 32)) { var %attackBoost = $v1, %attackerInfo = $remtok(%attackerInfo,%attackBoost,1,32) }
  89.     else { var %attackBoost = 0 }
  90.   }
  91.   else { %attackerInfo = $remtok(%attackerInfo,%attackBoost,1,32) }
  92.   if ($wildtok(%attackerInfo,@*,1,32)) { var %attackerItem = $right($gettok(%attackerInfo,$+($findtok(%attackerInfo, $v1, 1, 32),-),32), -1), %attackerAbility = $remove(%attackerInfo,%attackerItem,@) }
  93.   else { var %attackerItem = $false, %attackerAbility = %attackerInfo }
  94.   ;if ($nick == V4) { msg %window %attackerInfo | halt }
  95.   if ($regex(userabi,%attackerAbility,/Abi(lity)?([01]|DW)/)) { var %attackerAbility = $($!pokemon(%attacker).ability $+ $regml(userabi,1)) }
  96.   if (%attackerItem == No Item) { var %attackerItem = $false }
  97.  
  98.   ;----------| Defending Pokemon Stats
  99.   tokenize 32 $gettok(%input,2,124)
  100.   var %defender = $toID($1).pkm
  101.   if (!$isPokemon(%defender)) { msg %window $1 is not a pokemon | return }
  102.   var %defenderName = $pokemon(%defender).species, %def = $iif(%cat == Physical || $move(%move).shortdesc == $move(psystrike).shortdesc, def, spd)
  103.   var %hpIVs = $typo($gettok($2,1,47)).iv, %defIVs = $typo($iif(/ isin $2,$gettok($2,2,47),$2)).iv, %$4_Is_Level = $iif(($4 isnum) && (+* !iswm $4) && (-* !iswm $4),$true,$false), %defenderLevel = $iif(%$4_Is_Level,$4,$iif(%autolevel !isnum, $randlevel(%user), $v1))
  104.   var %EVs = $3, %hpEVs = $gettok(%EVs,1,47), %defEVs = $gettok(%EVs,$numtok(%EVs,47),47), %maxHP = $stat($pokemon(%defender).HP,%hpIVs,%hpEVs,%defenderLevel).hp, %defenseStat = $stat($($!pokemon(%defender). $+ %def, 3),%defIVs,%defEVs,%defenderLevel)
  105.   var %defenderInfo = $iif(%$4_Is_Level, $5-, $4-)
  106.   if (!%defenseBoost) {
  107.     if ($wildTok(%defenderInfo, +*, 1, 32)) { var %defenseBoost = $v1, %defenderInfo = $remtok(%defenderInfo,%defenseBoost,1,32) }
  108.     elseif ($wildTok(%defenderInfo, -*, 1, 32)) { var %defenseBoost = $v1, %defenderInfo = $remtok(%defenderInfo,%defenseBoost,1,32) }
  109.     else { var %defenseBoost = 0 }
  110.   }
  111.   else { %defenderInfo = $remtok(%defenderInfo,%defenseBoost,1,32) }
  112.   if ($wildtok(%defenderInfo,@*,1,32)) { var %defenderItem = $right($gettok(%defenderInfo,$+($findtok(%defenderInfo, $v1, 1, 32),-),32), -1), %defenderAbility = $remove(%defenderInfo,%defenderItem,@) }
  113.   else { var %defenderItem = $false, %defenderAbility = %defenderInfo }
  114.   if ($regex(targetabi,%defenderAbility,/Abi(lity)?([01]|DW)/)) { var %defenderAbility = $($!pokemon(%defender).ability $+ $regml(targetabi,1)) }
  115.   if (%defenderItem == No Item) { var %defenderItem = $false }
  116.  
  117.   :damage
  118.   ; Get Damage
  119.   var %damageNumbers = $dmg(%attacker, %attackStat, %attackBoost, %attackerLevel, %attackerAbility, %attackerItem, %defender, %defenseStat, %defenseBoost, %defenderAbility, %defenderItem, $gettok(%input, 3, 124), %extra)
  120.  
  121.   :display
  122.   if (-Debug isin %extra) {
  123.     var %output = msg %window
  124.     %output %damageNumbers
  125.     %output $~($dmg(%attacker, %attackStat, %attackBoost, %attackerLevel, %attackerAbility, %attackerItem, %defender, %defenseStat, %defenseBoost, %defenderAbility, %defenderItem, $gettok(%input, 3, 124), %extra), 0)
  126.     %output %attacker , %attackStat , %attackBoost , %attackerLevel , %attackerAbility , %attackerItem , %defender , %defenseStat , %defenseBoost , %defenderAbility , %defenderItem , $gettok(%input,3,124) , %extra
  127.     %output HP IVs: %hpIVs HP EVs: %hpEVs HP Stat: %maxHP
  128.   }
  129.  
  130.   ; Display Damage
  131.   tokenize 32 %damageNumbers
  132.   var %minDamage = $1, %maxDamage = $16
  133.   var %maxPercent = $round($calc(%maxDamage / %maxHP * 100),2), %minPercent = $round($calc(%minDamage / %maxHP * 100),2)
  134.   msg %window $pokemon(%attacker).species $+ 's $move(%move).name vs $pokemon(%defender).species ( $+ %minDamage $chr(45) %maxdamage HP) Damage: %minPercent $+ % - %maxPercent $+ %
  135.   ;$+(%moveName,$iif(%gklk, $+($chr(32),$chr(40),%originalPower,$chr(32),BP,$chr(41))))
  136.   $iif(-Dmg# isin %extra, msg %window Damage Numbers: $1- )
  137.   :error
  138.   if ($error) { msg %window $error }
  139. }
  140. /*
  141. ; Get Attacker Input
  142. tokenize 32 $gettok(%input, 1, 124)
  143. var %attacker = $toID($1), %attackerLevel = $iif($isTok(- +, $left($4,1), 32),%autolevel,$4), %attackStat = $stat($($!pokemon(%attacker). $+ $iif($move($toID($gettok(%input, 3, 124))).category == Special, SpA, Atk)),$2,$3,%attackerLevel)
  144. ; Get Defender Input
  145. */
  146. alias dmg {
  147.   if (!$isID) { return }
  148.   if ($prop == syntax) { return $ $+ dmg(Attacker, Attack Stat, Attack Boosts, Attack Level, Attack Ability, Attack Item, Defender, Defense Stat, Defense Boosts, Defend Ability, Defend Item, Move, Extras) }
  149.   if ($prop == reload) { .timer -m 1 200 reload -rs $script | return }
  150.   if (return(*) iswm $prop) { var %return = $replace($isolate($prop),$chr(44),$chr(32)) }
  151.  
  152.   ;----------| Attacking Pokemon Stat
  153.   var %user = $toID($1), %userName = $pokemon(%pokemon).species, %userLevel = $4, %atkStat = $2, %userAbility = $toID($5), %userItemID = $toID($6), %userItem = %userItemID, %atkboost = $3, %userType1 = $pokemon(%user).type1, %userType2 = $pokemon(%user).type2, %userTypes = %userType1 %userType2
  154.   if ($regex(userabi,%userAbility,/^[Aa]bi(lity)? ?([01]|[Dd][Ww])$/)) { var %userAbility = $pokemon(%user).ability [ $+ [ $regml(userabi,1) ] ] }
  155.   if (%userItem == $null) { var %userItem = $false }
  156.  
  157.   ;----------| Defending Pokemon Stats
  158.   var %target = $toID($7), %targetName = $pokemon(%target).species, %defStat = $8, %defBoost = $9, %targetItemID = $toID($11), %targetItem = %targetItemID, %targetAbility = $toID($10), %targetType1 = $pokemon(%target).type1, %targetType2 = $pokemon(%target).type2, %targetTypes = %targetType1 %targetType2
  159.   if ($regex(targetabi,%targetAbility,/Abi(lity)?([01]|DW)/)) { var %targetAbility = $~($!pokemon(%target).ability $+ $regml(targetabi,1), 2) }
  160.   if (!%targetItem) { var %targetItem = $false }
  161.  
  162.   ;----------| Get Move Info
  163.   var %move = $toID($12), %moveName = $move(%move).name
  164.   if (!$move(%move).basePower && $move(%move).status) { return $str(0,16) }
  165.  
  166.   ; (Temporary) Assume max power for variable BP moves
  167.   if ($istok(Return Frustration, %move, 32)) { var %power = 102 }
  168.   elseif ($istok(WaterSpout Eruption GyroBall ElectroBall,%move, 32)) { var %power = 150 }
  169.   var %cat = $move(%move).category, %movetype = $move(%move).type
  170.  
  171.   ;-----| Store Extra Parameters
  172.   var %extra = $remove($13, $chr(32))
  173.   var %leftovers = $iif(%targetItem == Leftovers,$true,$false)
  174.   var %blackSludge = $iif((%targetItem == BlackSludge) && (%userTypes, Poison, 32), $true, $false)
  175.   var %rolledDamage = $iif($wildTok(%extra,Dmg(*),1,45), $isolate($v1))
  176.  
  177.   var %crit = $iif($isTok(%extra,Crit,45) || $move(%move).shortdesc == Always results in a critical hit., $true, $false)
  178.   var %maxBP = $iif($isTok(%extra,MaxBP,45), $true, $false)
  179.   var %screen = $iif($isTok(%extra,Screen,45), $true, $false)
  180.   var %spread = $iif($isTok(%extra,Spread,45), $true, $false)
  181.   var %charge = $iif($isTok(%extra,Charge,45), $true, $false)
  182.   var %waterSport = $iif($isTok(%extra,WaterSport,45), $true, $false)
  183.   var %mudSport = $iif($isTok(%extra,MudSport,45), $true, $false)
  184.   var %friendGuard = $iif($isTok(%extra,FriendGuard,45), $true, $false)
  185.   var %movedLast = $iif($isTok(%extra,MovedLast,45), $true, $false)
  186.   var %helpingHand = $iif($isTok(%extra,HelpingHand,45) || $isTok(%extra,HH,45), $true, $false)
  187.   var %flashFire = $iif($isTok(%extra,FlashFire,45) || $isTok(%extra,FF,45), $true, $false)
  188.   var %wonderRoom = $iif($isTok(%extra,WonderRoom,45) || $isTok(%extra,WR, 45), $true, $false)
  189.   var %slowStart = $iif($isTok(%extra,SlowStart,45) || $isTok(%extra,SS,45), $true, $false)
  190.   var %crisis = $iif($isTok(%extra,Crisis,45), $true, $false)
  191.   var %stealthRock = $iif((($isTok(%extra, StealthRock, 45)) || (-SR isin %extra)) && (%targetAbility != Magic Guard), $true, $false)
  192.   var %metronome = $iif($wildtok(%extra,Metronome(*),1,45), $isolate($v1), $v1)
  193.  
  194.   if (($wildtok(%extra,-Spikes(*),0,45)) && (%targetAbility != Magic Guard) && (%targetItem != Air Balloon)) {
  195.     var %spikesEff = $iif($gettok(%userTypes, 2, 32),  $type(Ground,$gettok(%userTypes, 1, 32)) * $type(Ground,$v1), $type(Ground,$gettok(%userTypes, 1, 32)))
  196.     if (%spikesEff > 0) {
  197.       var %layers = $isolate($wildtok(%extra,-Spikes(*),1,32))
  198.       if (%layers isnum 1-3) { var %spikes = %layers }
  199.       else { var %spikes = 3 }
  200.     }
  201.     else { var %spikes = $false }
  202.   }
  203.  
  204.   if ($wildtok(%extra,-weather(*),1,45)) {
  205.     var %weather = $remove($isolate($v1).parantheses, $chr(32))
  206.     if ($findtok(Rain Sun Sand Hail Drizzle RainDance Drought SunnyDay Sandstorm SandStream SnowWarning, %weather, 32)) {  
  207.       %weather = $gettok(Rain Sun Sand Hail Rain Rain Sun Sun Sand Sand Hail, $v1, 32)
  208.     }
  209.     else { var %weather = $false }
  210.   }
  211.   else { var %weather = $false }
  212.  
  213.   if ($wildtok(%extra,UserStatus(*),1,45)) { var %userStatus = $replace($isolate($v1).parantheses,Burned,BRN,Burn,BRN,Poisoned,PSN,Poison,PSN,Paralyzed,PAR,Paralysis,PAR,Para,PAR) }
  214.   else { var %userStatus = $false }
  215.  
  216.   if ($wildtok(%extra,TargetStatus(*),1,45)) { var %targetStatus = $replace($isolate($v1).parantheses,Burned,BRN,Burn,BRN,Poisoned,PSN,Poison,PSN,Paralyzed,PAR,Paralysis,PAR,Para,PAR) }
  217.   else { var %targetStatus = $false }
  218.  
  219.   var %hazards = $iif((%stealthRock) || (%spikes), $true, $false)
  220.  
  221.   if (!%weather) { var %weather = $iif($isTok(%extra,Sun,45), Sun, $iif($isTok(%extra,Rain,45), Rain, $iif($isTok(%extra,Sand,45), Sand, $iif($isTok(%extra,Hail,45), Hail, $false)))) }
  222.  
  223.   ;-----| Modify Stats
  224.   ;----------| Base Attacking Stat
  225.   if (%targetAbility = Unaware) { var %atkboosts = 0 }
  226.   ;----------| Apply Boosts
  227.   if (%atkboost isnum 1-6) { var %atkStat = $int($calc(%atkStat * (2 + %atkboost) / 2)) }
  228.   else if (%atkboost isnum -6--1) && (!%crit) { var %atkStat = $int($calc(%atkStat * 2 / (2 - %atkboost))) }
  229.  
  230.   ;throwDebug %atkStat
  231.   ;----------| Apply Modifiers
  232.   if (%targetAbility == ThickFat) && ($isTok(Fire Ice, %moveType, 32)) { var %mod1 = 800, %atkMods = %atkMods %mod1 }
  233.  
  234.   if (%userAbility) {
  235.     if (%userAbility == Guts) && (%userStatus) { var %mod2 = 1800, %atkMods = %atkMods %mod2 }
  236.     else if ($ability(%userAbility).shortdesc == When this Pokemon has 1/3 or less of its max HP, its %moveType attacks do 1.5x damage.) { var %mod2 = 1800, %atkMods = %atkMods %mod2 }
  237.     ;$calc(%lowerHP / %maxHP) <= 1/2
  238.     else if (%userAbility == Defeatist) && ($false) { var %mod2 = %800, %atkMods = %atkMods %mod2 }
  239.     else if ($isTok(PurePower HugePower, %userAbility, 32)) { var %mod2 = 2000, %atkMods = %atkMods %mod2 }
  240.     else if (%userAbility == SolarPower) { var %mod2 = 1800, %atkMods = %atkMods %mod2 }
  241.     else if (%userAbility == Hustle) { var %atkStat = $mod(%atkStat,1800) }
  242.     else if (%userAbility == FlashFire || !%userAbility) && (%flashFire) && (%moveType == Fire) { var %mod2 = 1800, %atkMods = %atkMods %mod2 }
  243.     else if (%userAbility == SlowStart || !%userAbility) && (%slowStart) { var %mod2 = 800, %atkMods = %atkMods %mod2 }
  244.     else if ((%userAbility == FlowerGift) && (%cat == Physical) && (%weather == Sun)) { var %mod2 = 1800, %atkMods = %atkMods %mod3 }
  245.   }
  246.   if (%userItem) {
  247.     if ((%userItem == ThickClub) && (%cat == Physical) && ((%user == Cubone) || (%attacker == Marowak))) { var %mod4 = 2000, %atkMods = %atkMods %mod4 }
  248.     elseif ((%userItem == DeepSeaTooth) && (%cat == Special) && (%user == Clamperl)) { var %mod4 = 2000, %atkMods = %atkMods %mod4 }
  249.     elseif ((%userItem == LightBall) && (%user == Pikachu)) { var %mod4 = 2000, %atkMods = %atkMods %mod4 }
  250.     elseif ((%userItem == SoulDew) && (%cat == Special) && ($isTok(Latios Latias, %user, 32))) { var %mod4 = 1800, %atkMods = %atkMods %mod4 }
  251.     elseif ((%userItem == ChoiceBand) && (%cat == Physical)) { var %mod4 = 1800, %atkMods = %atkMods %mod4 }
  252.     elseif ((%userItem == ChoiceSpecs) && (%cat == Special)) { var %mod4 = 1800, %atkMods = %atkMods %mod4 }
  253.   }
  254.   if (%atkMods != $null) { var %atkStat = $mod(%atkStat, $chain(%atkMods)) }
  255.  
  256.   ;-----| Modify Defensive Stat
  257.   ;----------| Base Defense Stat
  258.  
  259.   /* Gunna have to handle it in the main script -_-
  260.  
  261.   if ($move(%move).ShortDesc === Damages target based on Defense, not Sp. Def.) && (!%wonderRoom) {
  262.     var %defStat = $stat(%target,def,%defIVs,%defEVs). [ $+ [ %targetLevel ] ]
  263.   }
  264.  
  265.   if (%wonderRoom) {
  266.     var %defStat = $stat(%target,$iif(%cat == Physical, spd, def),%defIVs,%defEVs). [ $+ [ %targetLevel ] ]
  267.   }
  268.   */
  269.   ;----------| Apply Boosts
  270.   if (%userAbility == Unaware) || ($move(%move).shortdesc == Ignores the target's stat modifiers.) {
  271.     if (%defboost isnum 1-6) && (!%crit) { var %defStat = $int($calc(%defStat * (2 + %defboost) / 2)) }
  272.     else if (%defboost isnum -6--1) { var %defStat = $int($calc(%defStat * 2 / (2 - %defboost))) }
  273.   }
  274.   ;----------| Apply Modifiers
  275.   if ((%weather == Sand) && (%cat == Special) && ($isTok(%targetTypes, Rock, 32))) { var %defStat = $mod(%defStat,1800) }
  276.  
  277.   if (%targetAbility == MarvelScale) && (%targetStatus) && (%cat == Physical) { var %mod1 = 1800, %defMods = %defMods %mod1 }  
  278.   elseif ((%targetAbility == FlowerGift) && (%cat == Special) && (%weather == Sun)) { var %mod2 = 1800, %defMods = %defMods %mod2 }
  279.  
  280.   if (%targetItem) {
  281.     if ((%targetItem == DeepSeaScale) && (%cat == Special) && (%target == Clamperl)) { var %mod3 = 1800, %defMods = %defMods %mod3 }  
  282.     elseif ((%targetItem == MetalPowder) && (%cat == Physical) && (%target == Ditto)) { var %mod3 = 2000, %defMods = %defMods %mod3 }  
  283.     elseif (%targetItem == Eviolite) { var %mod3 = 1800, %defMods = %defMods %mod3 }
  284.     elseif ((%targetItem == SoulDew) && (%cat == Special) && $isTok(Latios Latias, %target, 32)) { var %mod4 = 1800, %defMods = %defMods %mod4 }
  285.   }
  286.  
  287.   if (%defMods != $null) { var %defStat = $mod(%defStat, $chain(%defMods)) }
  288.  
  289.   ;-----| Get Base Power
  290.   if (!%power) { var %power = $move(%move).basePower }
  291.  
  292.   if ($isTok(GrassKnot LowKick, %move, 32)) { var %power = $gklk(%target), %gklk = $true }
  293.   elseif (%moveName == Acrobatics) && ((!%userItem || (%userItem == FlyingGem)) || %maxBP) { %power = 110 }
  294.   elseif ((%moveName == Payback) && (%movedLast || %maxBP)) { var %power = 100 }
  295.   elseif ((%moveName == Payback) && (%maxBP)) { var %power = 80 }
  296.   elseif ((%moveName == Assurance) && (%maxBP)) { var %power = %power * 2 }
  297.  
  298.   var %originalPower = %power
  299.  
  300.   ;-----| Apply Modifiers
  301.  
  302.   if (%userAbility) {
  303.     if (%userAbility == Technician) && (%power <= 60) { var %mod1 = 1800, %moveMods = %moveMods %mod1 }
  304.     elseif (%userAbility == FlareBoost) && (%userStatus) && (%cat == Special) { var %mod1 = 1800, %moveMods = %moveMods %mod1 }
  305.     elseif (%userAbility == Analytic) && (%movedLast) { var %mod1 = 14CD, %moveMods = %moveMods %mod1 }
  306.     elseif (%userAbility == Reckless) && ((recoil isin $move(%move).ShortDesc) || (Jump Kick isin %move)) { var %mod1 = 1333, %moveMods = %moveMods %mod1 }
  307.     elseif (%userAbility == IronFist) && ($move(%move).isPunchAttack) { var %mod1 = 1333, %moveMods = %moveMods %mod1 }
  308.     elseif (%userAbility == ToxicBoost) && (%userStatus == PSN) && (%cat == Physical) { var %mod1 = 1800, %moveMods = %moveMods %mod1 }
  309.     elseif (%userAbility == Rivalry) && (%rivalry) { var %mod1 = $iif(%rivalry == +, 1800, C00), %moveMods = %moveMods %mod1 }
  310.     elseif (%userAbility == SandForce) && (%weather == Sand) && ($isTok(Rock Ground Steel, %moveType, 32)) { var %mod1 = 14CD, %moveMods = %moveMods %mod1 }
  311.   }
  312.   if (%targetAbility) {
  313.     if (%targetAbility == Heatproof) && (%moveType == Fire) { var %mod2 = 800, %moveMods = %moveMods %mod2 }
  314.     elseif (%targetAbility == DrySkin) && (%moveType == Fire) { var %mod2 = 1400, %moveMods = %moveMods %mod2 }
  315.   }
  316.   if (%userAbility == SheerForce) && ($move(%move).secondary) { var %mod1 = 14CD, %moveMods = %moveMods %mod1 }
  317.  
  318.   if (%userItem) {
  319.     if ($item(%userItem).desc === Holder's %moveType $+ -type attacks have 1.2x power.) { var %mod3 = 1333, %moveMods = %moveMods %mod3 }
  320.     elseif (%userItem == MuscleBand) && (%cat == Physical) { var %mod3 = 1199, %moveMods = %moveMods %mod3 }
  321.     elseif (%userItem == WiseGlasses) && (%cat == Special) { var %mod3 = 1199, %moveMods = %moveMods %mod3 }
  322.     elseif (%userItem == LustrousOrb) && (%user == Palkia) && ((%moveType == Dragon) || (%moveType == Water)) { var %mod3 = 1333, %moveMods = %moveMods %mod3 }
  323.     elseif (%userItem == GriseousOrb) && (%user == GiratinaOrigin) && ((%moveType == Dragon) || (%moveType == Ghost)) { var %mod3 = 1333, %moveMods = %moveMods %mod3 }
  324.     elseif (%userItem == AdamantOrb) && (%user == Dialga) && ((%moveType == Dragon) || (%moveType == Steel)) { var %mod3 = 1333, %moveMods = %moveMods %mod3 }
  325.     elseif (%userItem == %moveType $+ Gem) { var %mod3 = 1800, %moveMods = %moveMods %mod3, %gem = $true }
  326.   }
  327.  
  328.   if (%moveName == Facade) && (%userStatus) { var %mod4 = 2000, %moveMods = %moveMods %mod4 }
  329.   ;elseif (%moveName == Brine) && ($calc(%userHP / %maxHP) !> 1/2) { var %mod4 = 2000, %moveMods = %moveMods %mod4 }
  330.   elseif (%moveName == Venoshock) && (%targetStatus == PSN) { var %mod4 = 2000, %moveMods = %moveMods %mod4 }
  331.   elseif (%moveName == Retaliate) && (%retaliate) { var %mod4 = 2000, %moveMods = %moveMods %mod4 }
  332.   elseif ((%moveName == Fusion Flare) || (%moveName == Fusion Bolt)) && (%combo) { var %mod4 = 2000, %moveMods = %moveMods %mod4 }
  333.  
  334.   if (%meFirst) { var %mod5 = 1800, %moveMods = %moveMods %mod5 }
  335.   if (%moveName == SolarBeam) && (%weather) && (%weather != Sun) { var %mod4 = 800, %moveMods = %moveMods %mod4 }
  336.   if (%charge) && (%moveType == Electric) { var %mod6 = 2000, %moveMods = %moveMods %mod6 }
  337.   if (%helpingHand) { var %mod7 = 1800, %moveMods = %moveMods %mod7 }
  338.   if (%waterSport) && (%moveType == Fire) { var %mod8 = 548, %moveMods = %moveMods %mod8 }
  339.   if (%mudSport) && (%moveType == Electric) { var %mod8 = 548, %moveMods = %moveMods %mod8 }
  340.  
  341.   if (%moveMods != $null) { var %power = $mod(%power, $chain(%moveMods)) }
  342.  
  343.   ;-----| Calculate Base Damage
  344.   var %baseDamage = $int($calc(((((2 * %userLevel) / 5 + 2) * %power * %atkStat) / %defStat) / 50 + 2))
  345.  
  346.   ;----------| Apply Modifiers
  347.   ;Apply the multi-target modifier
  348.   var %baseDamage = $mod(%baseDamage,$iif(%spread,C00,1000))
  349.  
  350.   ;Apply the weather modifier
  351.   if (%weather) {
  352.     if ((%weather == Rain) && (%moveType == Water)) || ((%weather == Sun) && (%moveType == Fire)) { var %baseDamage = $mod(%baseDamage,1800) }
  353.     elseif ((%weather == Rain) && (%moveType == Fire)) || ((%weather == Sun) && (%moveType == Water)) { var %baseDamage = $mod(%baseDamage,800) }
  354.   }
  355.   else { var %baseDamage = $mod(%baseDamage,1000) }
  356.  
  357.   ;In case of a critical hit, double the value
  358.   if (%crit) { var %baseDamage = 2 * %baseDamage }
  359.   ;goto return
  360.   var %dmgRoll = 16
  361.   while (%dmgRoll) {
  362.     dec %dmgRoll
  363.     if (%rolledDamage isnum 0-15) { %dmgRoll = %rolledDamage }
  364.  
  365.     ;Alter with a random factor
  366.     var %damage = $int($calc(%baseDamage * (100 - %dmgRoll) / 100))
  367.  
  368.     ;Apply STAB modifier
  369.     var %STAB = $isTok(%userType1 %userType2, %moveType, 32)
  370.     if (%STAB) { var %damage = $mod(%damage,$iif(%userAbility == Adaptability,2000,1800)) }
  371.     else { var %damage = $mod(%damage,1000) }
  372.  
  373.     ;Apply type effectiveness
  374.     var %typeEff = $type(%movetype,%targetType1)
  375.     if (%targetType2) { %typeEff = %typeEff * $type(%moveType,$v1) }
  376.  
  377.     if ((%targetItem == AirBalloon || %targetAbility == Levitate) && (%moveType == Ground)) { var %typeEff = 0 }
  378.     elseif (($isTok(StormDrain WaterAbsorb DrySkin,%targetAbilityID,32)) && (%moveType == Water)) { var %typeEff = 0 }
  379.     elseif (($isTok(LightningRod MotorDrive, %targetAbility, 32)) && (%moveType == Electric)) { var %typeEff = 0 }
  380.     elseif  ((%targetAbility == FlashFire) && (%moveType == Fire)) { var %typeEff = 0 }
  381.     elseif  ((%targetAbility == SapSipper) && (%moveType == Grass)) { var %typeEff = 0 }
  382.  
  383.     var %damage = %damage * %typeEff, %damage = $int(%damage)
  384.  
  385.     ;Apply user's burn
  386.     if (%userStatus == BRN) && (%cat == Physical) && (%userAbility != Guts) { var %damage = %damage / 2, %damage = $int(%damage) }
  387.  
  388.     ;Minimum amount of Damage
  389.     if (%damage < 1) { %damage = 1 }
  390.  
  391.     ;Apply the final modifiers
  392.     ;--| Check for Screen
  393.     if (%screen) && (!%crit) && (%userAbility != Infiltrator) { var %mod1 = $iif(%spread,A8F,800), %finalMods = %finalMods %mod1 }
  394.  
  395.     ;Check Abilities
  396.     ;--| Check for Multiscale
  397.     if (%targetAbility == Multiscale) && (!(%stealthRock) || (!$isImmuneToGround(%target) && %spikes)) { var %mod2 = 800, %finalMods = %finalMods %mod2 }
  398.     ;--| Check for Tinted Lens
  399.     if (%userAbility == TintedLens) && (%typeEff < 1) { var %mod3 = 2000, %finalMods = %finalMods %mod3 }
  400.     ;--| Check for Friend Guard
  401.     if (%friendGuard) { var %mod4 = C00, %finalMods = %finalMods %mod4 }
  402.     ;--| Check for Sniper
  403.     if (%userAbility == Sniper) && (%crit) { var %mod3 = 1800, %finalMods = %finalMods %mod3 }
  404.     ;--| Check for Solid Rock / Filter
  405.     if ($isTok(SolidRock Filter, %targetAbility, 32)) && (%typeEff > 1) { var %mod2 = C00, %finalMods = %finalMods %mod2 }
  406.  
  407.     ;Check Item
  408.     /* Figure something out
  409.     ;--| Check for Metronome
  410.     if (%Metronome) {
  411.       var %mod5 = $iif(%metronome < 5, $base($calc($hex(1000) + %metronome * $hex(333)),10,16), 2000), %finalMods = $instok(%finalMods,% $+ mod5, 10, 44)
  412.     }
  413.     */
  414.  
  415.     ;--| Check for Expert Belt
  416.     if (%userItem == ExpertBelt) && (%typeEff > 1) { var %mod5 = 1333, %finalMods = %finalMods %mod5 }
  417.     ;--| Check for Life Orb
  418.     elseif (%userItem == LifeOrb) { var %mod5 = 14CC, %finalMods = %finalMods %mod5 }
  419.  
  420.     ;--| Check for Berry
  421.     if ($item(%targetItem).desc == Halves damage taken from a super effective %moveType $+ -type attack. Single use.) { var %mod6 = 800, %finalMods = %finalMods %mod6 }
  422.     elseif ($item(%targetItem).desc == Halves damage taken from a %moveType $+ -type attack. Single use.) { var %mod6 = 800, %finalMods = %finalMods %mod6 }
  423.  
  424.     ;Chain Modifiers
  425.     if (%finalMods != $null) { var %damage = $mod(%damage, $chain(%finalMods)) }
  426.     unset %finalMods
  427.     var %damageNumbers = %damageNumbers %damage
  428.     if (%rolledDamage isnum 0-15) { var %dmgRoll = $false }
  429.   }
  430.   :return
  431.   if (%return) { returnex $~(%return, 2) }
  432.   return %damageNumbers
  433.   :error
  434.   return $error
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement