2016-09-07 18:50:38 +02:00
Namespace BattleSystem
Public Class BattleCalculation
2016-10-18 11:19:29 +02:00
Public Shared Function FieldEffectTurns ( ByVal BattleScreen As BattleScreen , ByVal own As Boolean , Optional ByVal moveName As String = " " ) As Integer
Dim turns As Integer = 5
Dim p As Pokemon
If own Then
p = BattleScreen . OwnPokemon
Else
p = BattleScreen . OppPokemon
End If
Dim ability As String = p . Ability . Name . ToLower ( )
2016-10-19 06:11:42 +02:00
If p . Item IsNot Nothing AndAlso BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
2016-10-18 11:19:29 +02:00
Select Case p . Item . Name . ToLower ( )
Case " damp rock "
If ability = " drizzle " Or moveName = " rain dance " Then
turns = 8
End If
Case " heat rock "
If ability = " drought " Or moveName = " sunny day " Then
turns = 8
End If
Case " smooth rock "
If ability = " sand stream " Or moveName = " sandstorm " Then
turns = 8
End If
Case " icy rock "
If ability = " snow warning " Or moveName = " hail " Then
turns = 8
End If
Case " light clay "
If moveName = " light screen " Or moveName = " reflect " Then
turns = 8
End If
2019-09-27 20:46:23 +02:00
Case " terrain extender "
If moveName = " electric terrain " Or moveName = " grassy terrain " Or moveName = " misty terrain " Or moveName = " psychic terrain " Then
turns = 8
ElseIf ability = " electric surge " Or ability = " grassy surge " Or ability = " misty surge " Or ability = " psychic surge " Then
turns = 8
End If
2016-10-18 11:19:29 +02:00
End Select
End If
Return turns
End Function
2016-09-25 05:18:07 +02:00
Public Shared Function MovesFirst ( ByVal BattleScreen As BattleScreen ) As Boolean
'Determine strike first with speed:
Dim ownSpeed As Integer = DetermineBattleSpeed ( True , BattleScreen )
Dim oppSpeed As Integer = DetermineBattleSpeed ( False , BattleScreen )
If ownSpeed > oppSpeed Then 'Faster than opponent
Return True
ElseIf ownSpeed < oppSpeed Then 'Slower than opponent
Return False
Else 'Speed is equal, decide randomly
If Core . Random . Next ( 0 , 2 ) = 0 Then
Return True
Else
Return False
End If
End If
End Function
2016-09-07 18:50:38 +02:00
Public Shared Function AttackFirst ( ByVal ownAttack As Attack , ByVal oppAttack As Attack , ByVal BattleScreen As BattleScreen ) As Boolean
Dim ownPokemon As Pokemon = BattleScreen . OwnPokemon
Dim oppPokemon As Pokemon = BattleScreen . OppPokemon
Dim ownPriority As Integer = ownAttack . Priority
Dim oppPriority As Integer = oppAttack . Priority
If ownPokemon . Ability . Name . ToLower ( ) = " prankster " Then
2016-09-14 10:24:44 +02:00
If ownAttack . Category = Attack . Categories . Status Then
ownPriority += 1
End If
2016-09-07 18:50:38 +02:00
End If
If oppPokemon . Ability . Name . ToLower ( ) = " prankster " Then
2016-09-14 10:24:44 +02:00
If oppAttack . Category = Attack . Categories . Status Then
oppPriority += 1
End If
2016-09-07 18:50:38 +02:00
End If
2018-08-05 03:40:06 +02:00
'Added condition to check for full HP
2018-08-16 23:57:27 +02:00
If ownPokemon . Ability . Name . ToLower ( ) = " gale wings " And ownAttack . Type . Type = Element . Types . Flying And ownPokemon . HP = ownPokemon . MaxHP Then
2016-09-07 18:50:38 +02:00
ownPriority += 1
End If
2018-08-16 23:57:27 +02:00
If oppPokemon . Ability . Name . ToLower ( ) = " gale wings " And oppAttack . Type . Type = Element . Types . Flying And oppPokemon . HP = oppPokemon . MaxHP Then
2016-09-07 18:50:38 +02:00
oppPriority += 1
End If
If BattleScreen . FieldEffects . OwnCustapBerry > 0 Then
ownPriority += 1
BattleScreen . FieldEffects . OwnCustapBerry = 0
End If
If BattleScreen . FieldEffects . OppCustapBerry > 0 Then
oppPriority += 1
BattleScreen . FieldEffects . OppCustapBerry = 0
End If
'If the priority of your attack is higher, then attack first:
If ownPriority > oppPriority Then
Return True
ElseIf oppPriority > ownPriority Then 'Same thing for opp's attack
Return False
Else 'Same priority
'Quickclaw's 20% chance of hitting first:
Dim Claw As Integer = 0
If Not ownPokemon . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( True ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( True , BattleScreen ) = True Then
If ownPokemon . Item . ID = 73 Then
If Core . Random . Next ( 0 , 100 ) < 20 Then
Claw += 1 'Own claw succeeded
End If
End If
End If
If Not oppPokemon . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( False ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( False , BattleScreen ) = True Then
If oppPokemon . Item . ID = 73 Then
If Core . Random . Next ( 0 , 100 ) < 20 Then
Claw += 10 'Opp's claw succeeded
End If
End If
End If
Select Case Claw
Case 1 'You succeed claw
Return True
Case 10 'Opp succeed claw
Return False
Case 11 'Both succeed claw, decide randomly
If Core . Random . Next ( 0 , 2 ) = 0 Then
Return True
Else
Return False
End If
End Select
Dim Tail As Integer = 0 'Uses effect of Lagging Tail
If Not ownPokemon . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( True ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( True , BattleScreen ) = True Then
If ownPokemon . Item . Name = " Lagging Tail " Then
Tail += 1
End If
End If
If Not oppPokemon . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( False ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( False , BattleScreen ) = True Then
If oppPokemon . Item . Name = " Lagging Tail " Then
Tail += 10
End If
End If
Select Case Tail
Case 1
Return False 'Your laggin tail effect works > You go last
Case 10
Return True 'Opponents lagging tail effect works > He goes last
Case 11
If Core . Random . Next ( 0 , 2 ) = 0 Then 'Both laggin Tail works. > Random determination.
Return True
Else
Return False
End If
End Select
2016-09-23 16:24:59 +02:00
Dim Full As Integer = 0 'Uses effect of Full Incense
If Not ownPokemon . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( True ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( True , BattleScreen ) = True Then
If ownPokemon . Item . Name = " Full Incense " Then
Full += 1
End If
End If
If Not oppPokemon . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( False ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( False , BattleScreen ) = True Then
If oppPokemon . Item . Name = " Full Incense " Then
Full += 10
End If
End If
2016-09-23 17:55:10 +02:00
Select Case Full
2016-09-23 16:24:59 +02:00
Case 1
Return False 'Your Full incense effect works > You go last
Case 10
Return True 'Opponents full incense effect works > He goes last
Case 11
If Core . Random . Next ( 0 , 2 ) = 0 Then 'Both full incense works. > Random determination.
Return True
Else
Return False
End If
End Select
2016-09-07 18:50:38 +02:00
If ownPokemon . Ability . Name . ToLower ( ) = " stall " And oppPokemon . Ability . Name . ToLower ( ) <> " stall " Then
Return False
End If
If oppPokemon . Ability . Name . ToLower ( ) = " stall " And ownPokemon . Ability . Name . ToLower ( ) <> " stall " Then
Return True
End If
2016-10-05 09:00:18 +02:00
Dim _first As Boolean = False
2016-09-07 18:50:38 +02:00
'Determine strike first with speed:
Dim ownSpeed As Integer = DetermineBattleSpeed ( True , BattleScreen )
Dim oppSpeed As Integer = DetermineBattleSpeed ( False , BattleScreen )
If ownSpeed > oppSpeed Then 'Faster than opponent
2016-10-05 09:00:18 +02:00
_first = True
2016-09-07 18:50:38 +02:00
ElseIf ownSpeed < oppSpeed Then 'Slower than opponent
2016-10-05 09:00:18 +02:00
_first = False
2016-09-07 18:50:38 +02:00
Else 'Speed is equal, decide randomly
If Core . Random . Next ( 0 , 2 ) = 0 Then
2016-10-05 09:00:18 +02:00
_first = True
2016-09-07 18:50:38 +02:00
Else
2016-10-05 09:00:18 +02:00
_first = False
2016-09-07 18:50:38 +02:00
End If
End If
2016-10-05 09:00:18 +02:00
If BattleScreen . FieldEffects . TrickRoom > 0 Then
_first = Not _first
End If
Return _first
2016-09-07 18:50:38 +02:00
End If
End Function
Public Shared Function DetermineBattleSpeed ( ByVal own As Boolean , ByVal BattleScreen As BattleScreen ) As Integer
Dim p As Pokemon = BattleScreen . OwnPokemon
If own = False Then
p = BattleScreen . OppPokemon
End If
Dim speed As Integer = CInt ( p . Speed * GetMultiplierFromStat ( p . StatSpeed ) ) 'Calculate the speed's basic value from the speed and the speed stat
If own = True Then
2016-10-18 09:16:14 +02:00
If BattleScreen . IsPVPBattle = False Then
If Core . Player . Badges . Contains ( 3 ) = True Then
2016-09-10 09:26:22 +02:00
speed = CInt ( speed + ( speed * ( 1 / 8 ) ) ) 'Add 1/8 of the speed if the player has the 3rd badge and it's not a PvP battle
End If
2016-10-18 09:16:14 +02:00
End If
2016-09-07 18:50:38 +02:00
End If
2018-02-21 16:34:06 +01:00
If p . Status = P3D . Pokemon . StatusProblems . Paralyzed And p . Ability . Name . ToLower ( ) <> " quick feet " Then
2018-08-05 03:40:06 +02:00
speed = CInt ( speed / 2 ) 'Divide the speed by 2 (gen 7 standards) if the Pokemon is paralyzed.
2016-09-07 18:50:38 +02:00
End If
If Not p . Item Is Nothing Then
If p . Item . Name = " Choice Scarf " Then
speed = CInt ( speed * 1 . 5F )
End If
Dim SlowDownItems As List ( Of String ) = { " iron ball " , " macho brace " , " power bracer " , " power belt " , " power lens " , " power band " , " power anklet " , " power weight " } . ToList ( )
If SlowDownItems . Contains ( p . Item . Name . ToLower ( ) ) = True And BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
speed = CInt ( speed / 2 )
End If
If own = True Then
If BattleScreen . FieldEffects . OwnTailWind > 0 Then
speed *= 2
End If
Else
If BattleScreen . FieldEffects . OppTailWind > 0 Then
speed *= 2
End If
End If
If p . Number = 132 Then
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
If p . Item . Name = " Quick Powder " Then
speed *= 2
End If
End If
End If
End If
Select Case p . Ability . Name . ToLower ( )
Case " swift swim "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Rain Then
speed *= 2
End If
Case " chlorophyll "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
speed *= 2
End If
Case " sand rush "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sandstorm Then
speed *= 2
End If
2019-09-27 20:46:23 +02:00
Case " slush rush "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Hailstorm Then
speed *= 2
End If
Case " surge surfer "
If BattleScreen . FieldEffects . ElectricTerrain > 0 Then
speed *= 2
End If
2016-09-07 18:50:38 +02:00
End Select
Dim grassPledge As Integer = BattleScreen . FieldEffects . OppGrassPledge
If own = False Then
grassPledge = BattleScreen . FieldEffects . OwnGrassPledge
End If
If grassPledge > 0 Then
speed = CInt ( speed / 2 )
End If
If p . Ability . Name . ToLower ( ) = " quick feet " Then
If p . Status = Pokemon . StatusProblems . Paralyzed Or p . Status = Pokemon . StatusProblems . Burn Or p . Status = Pokemon . StatusProblems . Poison Or p . Status = Pokemon . StatusProblems . Sleep Or p . Status = Pokemon . StatusProblems . Freeze Then
speed = CInt ( speed * 1 . 5F )
End If
End If
If p . Ability . Name . ToLower ( ) = " slow start " Then
If own = True Then
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . OwnPokemonTurns < 5 Then
2016-09-07 18:50:38 +02:00
speed = CInt ( speed / 2 )
End If
Else
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . OppPokemonTurns < 5 Then
2016-09-07 18:50:38 +02:00
speed = CInt ( speed / 2 )
End If
End If
End If
speed = speed . Clamp ( 1 , 999 )
Return speed
End Function
2018-12-22 21:25:36 +01:00
Public Shared Function DetermineBattleAttack ( ByVal own As Boolean , ByVal BattleScreen As BattleScreen ) As Integer
Dim p As Pokemon = BattleScreen . OwnPokemon
If own = False Then
p = BattleScreen . OppPokemon
End If
Dim attack As Integer = CInt ( p . Attack * GetMultiplierFromStat ( p . StatAttack ) ) 'Calculate the attack's basic value
If own = True Then
If BattleScreen . IsPVPBattle = False Then
If Core . Player . Badges . Contains ( 1 ) = True Then
attack = CInt ( attack + ( attack * ( 1 / 8 ) ) ) 'Add 1/8 of the attack if the player has the 1st badge and it's not a PvP battle
End If
End If
End If
If p . Status = P3D . Pokemon . StatusProblems . Burn And p . Ability . Name . ToLower ( ) <> " guts " Then
attack = CInt ( attack / 2 )
End If
If Not p . Item Is Nothing Then
If p . Item . Name = " Choice Band " Then
attack = CInt ( attack * 1 . 5F )
End If
If p . Number = 25 Then
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
If p . Item . Name = " Light Ball " Then
attack *= 2
End If
End If
End If
If p . Number = 104 OrElse p . Number = 105 Then
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
If p . Item . Name = " Thick Club " Then
attack *= 2
End If
End If
End If
End If
Select Case p . Ability . Name . ToLower ( )
Case " huge power "
attack *= 2
Case " pure power "
attack *= 2
Case " defeatist "
If p . HP / p . MaxHP <= 0 . 5 Then
attack = CInt ( attack / 2 )
End If
Case " hustle "
attack = CInt ( attack * 1 . 5F )
Case " flower gift "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
attack = CInt ( attack * 1 . 5F )
End If
End Select
If p . Ability . Name . ToLower ( ) = " guts " Then
If p . Status = Pokemon . StatusProblems . Paralyzed Or p . Status = Pokemon . StatusProblems . Burn Or p . Status = Pokemon . StatusProblems . Poison Or p . Status = Pokemon . StatusProblems . Sleep Or p . Status = Pokemon . StatusProblems . Freeze Then
attack = CInt ( attack * 1 . 5F )
End If
End If
If p . Ability . Name . ToLower ( ) = " slow start " Then
If own = True Then
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . OwnPokemonTurns < 5 Then
2018-12-22 21:25:36 +01:00
attack = CInt ( attack / 2 )
End If
Else
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . OppPokemonTurns < 5 Then
2018-12-22 21:25:36 +01:00
attack = CInt ( attack / 2 )
End If
End If
End If
attack = attack . Clamp ( 1 , 999 )
Return attack
End Function
2016-09-07 18:50:38 +02:00
''' <summary>
''' Outcome: 0=true/>1=false:1=sleeptalk/snore 2=other move 3=start sleep 4=X wont obey 5=X wont obey 6=X turned away 7=X is loafing around 8=X pretended to not notice
''' </summary>
Public Shared Function ObedienceCheck ( ByVal UsedAttack As Attack , BattleScreen As BattleScreen ) As Integer
Dim p As Pokemon = BattleScreen . OwnPokemon
If p . OT = Core . Player . OT Then
Return 0
End If
If BattleScreen . IsPVPBattle = True Then
Return 0
End If
Dim badgeLevel As Integer = Badge . GetLevelCap ( )
If badgeLevel > - 1 And p . Level > badgeLevel And p . OT <> Core . Player . OT Then
Dim r As Integer = Core . Random . Next ( 0 , 256 )
Dim A As Integer = CInt ( ( p . Level + badgeLevel * r ) / 256 )
If A < badgeLevel Then
Return 0
Else
BattleScreen . FieldEffects . OwnRageCounter = 0
Dim outcome As Integer = 0
If UsedAttack . Name . ToLower ( ) = " snore " Or UsedAttack . Name . ToLower ( ) = " sleep talk " Then
Return 1
Else
r = Core . Random . Next ( 0 , 256 )
Dim B As Integer = CInt ( ( p . Level + badgeLevel ) * r / 256 )
If B < badgeLevel Then
Return 2
Else
Dim C As Integer = p . Level - badgeLevel
r = Core . Random . Next ( 0 , 256 )
Dim uproar As Integer = BattleScreen . FieldEffects . OwnUproar
If p . Ability . Name . ToLower ( ) <> " insomnia " And p . Ability . Name . ToLower ( ) <> " vital spirit " And uproar = 0 Then
If r < C Then
Return 3
End If
Else
If r - C < C Then
Return 4
Else
Return 4 + Core . Random . Next ( 1 , 5 )
End If
End If
End If
End If
End If
Else
Return 0
End If
Return 0
End Function
Public Shared Function AccuracyCheck ( ByVal UsedAttack As Attack , ByVal own As Boolean , ByVal BattleScreen As BattleScreen ) As Boolean
Dim p As Pokemon = BattleScreen . OwnPokemon
Dim op As Pokemon = BattleScreen . OppPokemon
If own = False Then
p = BattleScreen . OppPokemon
op = BattleScreen . OwnPokemon
End If
If UsedAttack . Accuracy <= 0 Then
Return True
End If
If p . Ability . Name . ToLower ( ) = " no guard " Or op . Ability . Name . ToLower ( ) = " no guard " Then
Return True
End If
2018-12-22 21:02:02 +01:00
If UsedAttack . GetUseAccEvasion ( own , BattleScreen ) = False Then
Return True
End If
2016-09-07 18:50:38 +02:00
Dim result As Single = 1 . 0F
Dim INIT As Integer = UsedAttack . GetAccuracy ( own , BattleScreen )
If op . Ability . Name . ToLower ( ) = " wonder skin " And UsedAttack . Category = Attack . Categories . Status And UsedAttack . GetAccuracy ( own , BattleScreen ) > 0 And BattleScreen . FieldEffects . CanUseAbility ( Not own , BattleScreen ) = True Then
INIT = 50
End If
If INIT < 0 Then
INIT = 1
End If
Dim evasion As Integer = op . Evasion
Dim accuracy As Integer = p . Accuracy
If UsedAttack . UseOppEvasion = False Then
evasion = 0
End If
Dim ACC As Integer = accuracy - evasion
ACC = ACC . Clamp ( - 6 , 6 )
2016-09-18 00:30:33 +02:00
Dim ACCM As Single = GetMultiplierFromAccEvasion ( ACC )
2016-09-07 18:50:38 +02:00
result = INIT * ACCM
If Not op . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Not own ) = True Then
2019-09-27 20:46:23 +02:00
If op . Item . Name . ToLower ( ) = " bright powder " Or op . Item . Name . ToLower ( ) = " lax incense " Then
2016-09-07 18:50:38 +02:00
result *= 0 . 9F
End If
End If
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
Select Case p . Item . Name . ToLower ( )
Case " wide lens "
result *= 1 . 1F
Case " zoom lens "
Dim ownTurns As Integer = BattleScreen . FieldEffects . OwnTurnCounts
Dim oppTurns As Integer = BattleScreen . FieldEffects . OppTurnCounts
If own = False Then
ownTurns = BattleScreen . FieldEffects . OppTurnCounts
oppTurns = BattleScreen . FieldEffects . OwnTurnCounts
End If
If ownTurns < oppTurns Then
result *= 1 . 2F
End If
End Select
End If
Select Case p . Ability . Name . ToLower ( )
Case " compoundeyes "
result *= 1 . 3F
Case " victory star "
result *= 1 . 1F
Case " hustle "
If UsedAttack . Category = Attack . Categories . Physical Then
result *= 0 . 8F
End If
End Select
Select Case op . Ability . Name . ToLower ( )
Case " sand veil "
If BattleScreen . FieldEffects . CanUseAbility ( Not own , BattleScreen ) = True Then
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sandstorm Then
result *= 0 . 8F
End If
End If
Case " snow cloak "
If BattleScreen . FieldEffects . CanUseAbility ( Not own , BattleScreen ) = True Then
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Hailstorm Then
result *= 0 . 8F
End If
End If
Case " tangled feet "
If BattleScreen . FieldEffects . CanUseAbility ( Not own , BattleScreen ) = True Then
If op . HasVolatileStatus ( Pokemon . VolatileStatus . Confusion ) = True Then
result *= 0 . 5F
End If
End If
End Select
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Foggy Then
result *= 0 . 6F
End If
If BattleScreen . FieldEffects . Gravity > 0 Then
result *= CSng ( 10 / 6 )
End If
Dim F As Integer = CInt ( result ) . Clamp ( 0 , 100 )
Dim R As Integer = Core . Random . Next ( 0 , 100 )
If R < F Then
Return True
Else
Return False
End If
End Function
Public Shared Function IsCriticalHit ( ByVal UsedAttack As Attack , ByVal own As Boolean , ByVal BattleScreen As BattleScreen ) As Boolean
Dim C As Integer = 0
Dim p As Pokemon = BattleScreen . OwnPokemon
Dim op As Pokemon = BattleScreen . OppPokemon
If own = False Then
p = BattleScreen . OppPokemon
op = BattleScreen . OwnPokemon
End If
If UsedAttack . CriticalChance < 1 Then
Return False
End If
If op . Ability . Name . ToLower ( ) = " battle armor " Or op . Ability . Name . ToLower ( ) = " shell armor " Then
If BattleScreen . FieldEffects . CanUseAbility ( Not own , BattleScreen ) = True Then
Return False
End If
End If
Dim luckyChant As Integer = BattleScreen . FieldEffects . OppLuckyChant
If own = False Then
luckyChant = BattleScreen . FieldEffects . OwnLuckyChant
End If
If luckyChant > 0 Then
Return False
End If
If p . Ability . Name . ToLower ( ) = " super luck " Then
C += 1
End If
Dim focusEnergy As Integer = BattleScreen . FieldEffects . OwnFocusEnergy
If own = False Then
focusEnergy = BattleScreen . FieldEffects . OppFocusEnergy
End If
If focusEnergy > 0 Then
C += 2
End If
If UsedAttack . CriticalChance > 1 Then
C += 1
End If
Dim lansat As Integer = BattleScreen . FieldEffects . OwnLansatBerry
If own = False Then
lansat = BattleScreen . FieldEffects . OppLansatBerry
End If
If lansat > 0 Then
C += 2
End If
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( own ) = True Then
Select Case p . Item . Name . ToLower ( )
Case " lucky punch "
If p . Number = 113 Then
C += 2
End If
Case " stick "
If p . Number = 83 Then
C += 2
End If
Case " scope lens "
C += 1
Case " razor claw "
C += 1
End Select
End If
Dim chance As Integer = 16
Select Case C
Case 0
chance = 16
Case 1
chance = 8
Case 2
chance = 4
Case 3
chance = 3
Case Else
chance = 2
End Select
If Core . Random . Next ( 0 , chance ) = 0 Then
Return True
End If
2018-12-22 21:02:02 +01:00
If UsedAttack . ID = 524 Then 'frost breath
2016-09-17 21:50:46 +02:00
Return True
End If
2018-12-22 21:02:02 +01:00
If UsedAttack . ID = 480 Then 'storm throw
2018-10-22 04:10:27 +02:00
Return True
End If
2016-10-18 09:16:14 +02:00
2016-09-07 18:50:38 +02:00
Return False
End Function
Public Shared Function CanRun ( ByVal own As Boolean , ByVal BattleScreen As BattleScreen ) As Boolean
If BattleScreen . BattleMode = BattleScreen . BattleModes . Safari Then
Return True
End If
Dim p As Pokemon = BattleScreen . OwnPokemon
Dim op As Pokemon = BattleScreen . OppPokemon
If own = False Then
p = BattleScreen . OppPokemon
op = BattleScreen . OwnPokemon
End If
2019-09-27 20:46:23 +02:00
If p . Type1 . Type = Element . Types . Ghost Or p . Type2 . Type = Element . Types . Ghost Then
2016-09-07 18:50:38 +02:00
Return True
End If
2019-09-27 20:46:23 +02:00
If p . Ability . Name . ToLower ( ) = " run away " Then
Return True
2016-09-07 18:50:38 +02:00
End If
2019-09-27 20:46:23 +02:00
If Not p . Item Is Nothing Then
If p . Item . Name . ToLower ( ) = " smoke ball " And BattleScreen . FieldEffects . CanUseItem ( own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( own , BattleScreen ) = True Then
Return True
2016-09-07 18:50:38 +02:00
End If
2019-09-27 20:46:23 +02:00
End If
2016-09-07 18:50:38 +02:00
2019-09-27 20:46:23 +02:00
If op . Ability . Name . ToLower ( ) = " shadow tag " And p . Ability . Name . ToLower ( ) <> " shadow tag " And op . HP > 0 Then
Return False
End If
If op . Ability . Name . ToLower ( ) = " arena trap " And op . HP > 0 And BattleScreen . FieldEffects . IsGrounded ( own , BattleScreen ) = True Then
Return False
2016-09-07 18:50:38 +02:00
End If
2019-09-27 20:46:23 +02:00
If op . Ability . Name . ToLower ( ) = " magnet pull " And op . HP > 0 Then
2016-09-07 18:50:38 +02:00
If p . Type1 . Type = Element . Types . Steel Or p . Type2 . Type = Element . Types . Steel Then
Return False
End If
End If
2019-09-27 20:46:23 +02:00
With BattleScreen . FieldEffects
If own = True Then
If . OwnWrap > 0 Or . OwnBind > 0 Or . OwnClamp > 0 Or . OwnFireSpin > 0 Or . OwnMagmaStorm > 0 Or . OwnSandTomb > 0 Or . OwnWhirlpool > 0 Or . OwnInfestation > 0 Then
Return False
End If
Else
If . OppWrap > 0 Or . OppBind > 0 Or . OppClamp > 0 Or . OppFireSpin > 0 Or . OppMagmaStorm > 0 Or . OppSandTomb > 0 Or . OppWhirlpool > 0 Or . OppInfestation > 0 Then
Return False
End If
End If
End With
2016-09-07 18:50:38 +02:00
Dim ingrain As Integer = BattleScreen . FieldEffects . OwnIngrain
If own = False Then
ingrain = BattleScreen . FieldEffects . OppIngrain
End If
If ingrain > 0 Then
Return False
End If
If p . Speed > op . Speed Then
Return True
Else
Dim A As Integer = p . Speed
Dim B As Integer = op . Speed
If B = 0 Then
B = 1
End If
Dim C As Integer = BattleScreen . FieldEffects . RunTries
Dim X As Integer = ( CInt ( A * 128 / B ) + ( 30 * C ) ) Mod 256
Dim R As Integer = Core . Random . Next ( 0 , 256 )
If R < X Then
Return True
Else
BattleScreen . FieldEffects . RunTries += 1
Return False
End If
End If
End Function
Public Shared Function CalculateEffectiveness ( ByVal move As Attack , ByVal BattleScreen As BattleScreen , ByVal p As Pokemon , ByVal op As Pokemon , ByVal own As Boolean ) As Single
Dim Type1 As Single = ReverseTypeEffectiveness ( Element . GetElementMultiplier ( move . GetAttackType ( own , BattleScreen ) , op . Type1 ) )
Dim Type2 As Single = ReverseTypeEffectiveness ( Element . GetElementMultiplier ( move . GetAttackType ( own , BattleScreen ) , op . Type2 ) )
Dim effectiveness As Single = Type1 * Type2
2016-09-14 10:59:41 +02:00
'Freeze Dry
2016-10-18 09:16:14 +02:00
If move . ID = 573 Then
2016-09-14 11:50:08 +02:00
If op . Type1 . Type = Element . Types . Water Or op . Type2 . Type = Element . Types . Water Then
2016-09-14 10:59:41 +02:00
effectiveness *= 4
End If
End If
2016-10-05 09:00:18 +02:00
2018-10-26 10:03:33 +02:00
'Flying Press
If move . ID = 9999 Then
If op . Type1 . Type = Element . Types . Fighting Or op . Type2 . Type = Element . Types . Fighting Then
effectiveness *= 2
End If
If op . Type1 . Type = Element . Types . Grass Or op . Type2 . Type = Element . Types . Grass Then
effectiveness *= 2
End If
If op . Type1 . Type = Element . Types . Bug Or op . Type2 . Type = Element . Types . Bug Then
effectiveness *= 2
End If
If op . Type1 . Type = Element . Types . Rock Or op . Type2 . Type = Element . Types . Rock Then
effectiveness /= 2
End If
If op . Type1 . Type = Element . Types . Steel Or op . Type2 . Type = Element . Types . Steel Then
effectiveness /= 2
End If
If op . Type1 . Type = Element . Types . Electric Or op . Type2 . Type = Element . Types . Electric Then
effectiveness /= 2
End If
End If
2018-08-20 22:25:47 +02:00
'Sheer Cold
If move . ID = 329 Then
If op . IsType ( Element . Types . Ice ) Then
2016-09-07 18:50:38 +02:00
effectiveness = 0 . 0F
End If
End If
2019-09-27 20:46:23 +02:00
Dim digHit As Boolean = False
Dim airHit As Boolean = False
Dim regHit As Boolean = False
2016-10-05 09:00:18 +02:00
2019-09-27 20:46:23 +02:00
'Grounded condition
If move . GetAttackType ( own , BattleScreen ) . Type = Element . Types . Ground And BattleScreen . FieldEffects . IsGrounded ( Not own , BattleScreen ) = False Then
Dim targetDig As Boolean = False
Dim targetAir As Boolean = False
With BattleScreen . FieldEffects
If own = True Then
If . OppDigCounter > 0 Then
targetDig = True
End If
If . OppFlyCounter > 0 Or . OppBounceCounter > 0 Or . OppSkyDropCounter > 0 Then
targetAir = True
End If
Else
If . OwnDigCounter > 0 Then
targetDig = True
End If
If . OwnFlyCounter > 0 Or . OwnBounceCounter > 0 Or . OwnSkyDropCounter > 0 Then
targetAir = True
End If
2016-10-05 09:00:18 +02:00
End If
2019-09-27 20:46:23 +02:00
End With
Select Case move . ID
Case 89 , 90 , 222 'Earthquake, Fissure, Magnitude
2016-10-05 09:00:18 +02:00
effectiveness = 0 . 0F
2019-09-27 20:46:23 +02:00
If targetDig = True Then
digHit = True
End If
Case 614 'Thousand Arrows
airHit = True
If targetAir = True Then
If own = True Then
BattleScreen . FieldEffects . OppFlyCounter = 0
BattleScreen . FieldEffects . OppBounceCounter = 0
Else
BattleScreen . FieldEffects . OwnFlyCounter = 0
BattleScreen . FieldEffects . OwnBounceCounter = 0
End If
End If
Case Else
effectiveness = 0 . 0F
End Select
ElseIf move . GetAttackType ( own , BattleScreen ) . Type = Element . Types . Ground And BattleScreen . FieldEffects . IsGrounded ( Not own , BattleScreen ) = True Then
regHit = True
End If
'Grounded hit effectiveness
If digHit = True Or airHit = True Or regHit = True Then
effectiveness = 1 . 0F
If op . IsType ( Element . Types . Electric ) Then
effectiveness *= 2
End If
If op . IsType ( Element . Types . Fire ) Then
effectiveness *= 2
End If
If op . IsType ( Element . Types . Poison ) Then
effectiveness *= 2
End If
If op . IsType ( Element . Types . Rock ) Then
effectiveness *= 2
End If
If op . IsType ( Element . Types . Steel ) Then
effectiveness *= 2
End If
If op . IsType ( Element . Types . Bug ) Then
effectiveness /= 2
End If
If op . IsType ( Element . Types . Grass ) Then
effectiveness /= 2
2016-09-07 18:50:38 +02:00
End If
End If
If Not op . Item Is Nothing Then
If op . Item . Name . ToLower ( ) = " ring target " And BattleScreen . FieldEffects . CanUseItem ( Not own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Not own , BattleScreen ) = True Then
If Type1 = 0 Then
effectiveness = Type2
End If
If Type2 = 0 Then
effectiveness = Type1
End If
If effectiveness = 0 Then
effectiveness = 1 . 0F
End If
End If
End If
If move . ImmunityAffected = False And effectiveness = 0 Then
If Type1 = 0 . 0F Then
effectiveness = Type2
End If
If Type2 = 0 . 0F Then
effectiveness = Type1
End If
If effectiveness = 0 . 0F Then
effectiveness = 1 . 0F
End If
End If
If op . IsType ( Element . Types . Ghost ) = True Then
2016-12-17 21:43:34 +01:00
Dim CanHitGhost = False
Dim Foresight As Integer = 0
Dim OdorSleuth As Integer = 0
If own Then
Foresight = BattleScreen . FieldEffects . OppForesight
OdorSleuth = BattleScreen . FieldEffects . OppOdorSleuth
Else
Foresight = BattleScreen . FieldEffects . OwnForesight
OdorSleuth = BattleScreen . FieldEffects . OwnOdorSleuth
End If
If Foresight > 0 Or OdorSleuth > 0 Then
CanHitGhost = True
End If
If BattleScreen . FieldEffects . CanUseAbility ( own , BattleScreen ) AndAlso p . Ability . Name . ToLower ( ) = " scrappy " Then
CanHitGhost = True
2016-09-07 18:50:38 +02:00
End If
2016-12-17 21:43:34 +01:00
If CanHitGhost Then
2016-09-07 18:50:38 +02:00
If move . Type . Type = Element . Types . Normal Or move . Type . Type = Element . Types . Fighting Then
If Type1 = 0 . 0F Then
effectiveness = Type2
End If
If Type2 = 0 . 0F Then
effectiveness = Type1
End If
If effectiveness = 0 . 0F Then
effectiveness = 1 . 0F
End If
End If
End If
End If
If op . IsType ( Element . Types . Dark ) = True Then
Dim miracleEye As Integer = BattleScreen . FieldEffects . OppMiracleEye
If own = False Then
miracleEye = BattleScreen . FieldEffects . OwnMiracleEye
End If
If miracleEye > 0 Then
If move . Type . Type = Element . Types . Psychic Then
If Type1 = 0 . 0F Then
effectiveness = Type2
End If
If Type2 = 0 . 0F Then
effectiveness = Type1
End If
If effectiveness = 0 . 0F Then
effectiveness = 1 . 0F
End If
End If
End If
End If
If move . UseEffectiveness = False And effectiveness <> 0 . 0F Then
Return 1 . 0F
End If
Return effectiveness
End Function
Public Shared Function CalculateEffectiveness ( ByVal own As Boolean , ByVal move As Attack , ByVal BattleScreen As BattleScreen ) As Single
Dim p As Pokemon = BattleScreen . OwnPokemon
Dim op As Pokemon = BattleScreen . OppPokemon
If own = False Then
p = BattleScreen . OppPokemon
op = BattleScreen . OwnPokemon
End If
Return CalculateEffectiveness ( move , BattleScreen , p , op , own )
End Function
Public Shared Function GainExp ( ByVal p As Pokemon , ByVal BattleScreen As BattleScreen , ByVal PokemonList As List ( Of Integer ) ) As Integer
Dim op As Pokemon = BattleScreen . OppPokemon
Dim a As Double = 1D
If BattleScreen . IsTrainerBattle = True Then
a = 1 . 5D
End If
Dim b As Double = op . BaseExperience
Dim t As Double = 1D
If p . OT <> Core . Player . OT Then
t = 1 . 5D
End If
Dim e As Double = 1D
If Not p . Item Is Nothing Then
If p . Item . Name . ToLower ( ) = " lucky egg " Then
e = 1 . 5D
End If
End If
Dim L As Double = op . Level
Dim Lp As Double = p . Level
Dim s As Double = PokemonList . Count
Dim expShares As Integer = 0
For Each po As Pokemon In Core . Player . Pokemons
If Not po . Item Is Nothing Then
If po . Item . Name . ToLower ( ) = " exp share " Then
expShares += 1
End If
End If
Next
If expShares > 0 Then
If Not p . Item Is Nothing Then
If p . Item . Name . ToLower ( ) = " exp share " Then
s = 2D
Else
s = ( PokemonList . Count * 2D ) * expShares
End If
End If
End If
Dim EXP As Integer = CInt ( ( ( ( a * b * L ) / ( 5 * s ) ) * ( ( ( 2 * L + 10 ) ^ 2 . 5D ) / ( ( L + Lp + 10 ) ^ 2 . 5D ) ) + 1 ) * t * e * 1 )
If EXP < 2 Then
EXP = 2
End If
For Each mysteryEvent As MysteryEventScreen . MysteryEvent In MysteryEventScreen . ActivatedMysteryEvents
If mysteryEvent . EventType = MysteryEventScreen . EventTypes . EXPMultiplier Then
EXP = CInt ( EXP * CSng ( mysteryEvent . Value . Replace ( " . " , GameController . DecSeparator ) ) )
End If
Next
Return EXP
End Function
Public Shared Function SafariRound ( ByVal BattleScreen As BattleScreen ) As Battle . RoundConst
If BattleScreen . PokemonSafariStatus > 0 Then
BattleScreen . PokemonSafariStatus -= 1
ElseIf BattleScreen . PokemonSafariStatus < 0 Then
BattleScreen . PokemonSafariStatus += 1
End If
Dim flee As Boolean = False
Dim X As Single = BattleScreen . OppPokemon . Speed Mod 256
X *= 2
If X > 255 Then
flee = True
End If
If flee = False Then
If BattleScreen . PokemonSafariStatus < 0 Then
X *= 2
ElseIf BattleScreen . PokemonSafariStatus > 0 Then
X /= 4
End If
End If
Dim R As Integer = Core . Random . Next ( 0 , 256 )
If R < X Then
flee = True
End If
If flee = True And CanSwitch ( BattleScreen , False ) = True Then
Return New Battle . RoundConst ( ) With { . StepType = Battle . RoundConst . StepTypes . Flee , . Argument = BattleScreen . OppPokemon . GetDisplayName ( ) & " fled! " }
Else
If BattleScreen . PokemonSafariStatus < 0 Then
Return New Battle . RoundConst ( ) With { . StepType = Battle . RoundConst . StepTypes . Text , . Argument = BattleScreen . OppPokemon . GetDisplayName ( ) & " is angry! " }
ElseIf BattleScreen . PokemonSafariStatus > 0 Then
Return New Battle . RoundConst ( ) With { . StepType = Battle . RoundConst . StepTypes . Text , . Argument = BattleScreen . OppPokemon . GetDisplayName ( ) & " is eating! " }
Else
Return New Battle . RoundConst ( ) With { . StepType = Battle . RoundConst . StepTypes . Text , . Argument = BattleScreen . OppPokemon . GetDisplayName ( ) & " is watching carefully! " }
End If
End If
End Function
Public Shared Function CanSwitch ( ByVal BattleScreen As BattleScreen , ByVal own As Boolean ) As Boolean
'Abilities: Shadow Tag, Arena Trap, Magnet Pull
'Items
'Used Moves + Trapping Moves: Block, Mean Look, Spider Web, Ingrain
'Trapping: Bind, Clamp, Fire Spin, Infestation, Magma Storm, Sand Tomb, Whirlpool, Wrap
If own = True Then
2016-12-12 07:14:21 +01:00
If BattleScreen . OwnPokemon . Status = Pokemon . StatusProblems . Fainted Or BattleScreen . OwnPokemon . HP <= 0 Then
Return True
End If
2017-02-13 19:07:15 +01:00
2019-09-27 20:46:23 +02:00
If BattleScreen . OwnPokemon . Type1 . Type = Element . Types . Ghost Or BattleScreen . OwnPokemon . Type2 . Type = Element . Types . Ghost Then
Return True
End If
With BattleScreen
If Not . OwnPokemon . Item Is Nothing Then
If . OwnPokemon . Item . Name . ToLower ( ) = " shed shell " And . FieldEffects . CanUseItem ( True ) = True And . FieldEffects . CanUseOwnItem ( True , BattleScreen ) = True Then
Return True
End If
End If
End With
2017-02-13 19:07:15 +01:00
If BattleScreen . IsRemoteBattle AndAlso BattleScreen . IsPVPBattle AndAlso Not BattleScreen . IsHost Then
If BattleScreen . FieldEffects . ClientCanSwitch = False Then
Return False
End If
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . OppPokemon . Ability . Name . ToLower ( ) = " shadow tag " And BattleScreen . OwnPokemon . Ability . Name . ToLower ( ) <> " shadow tag " And BattleScreen . OppPokemon . HP > 0 Then
2016-09-07 18:50:38 +02:00
Return False
End If
2019-09-27 20:46:23 +02:00
2016-09-07 18:50:38 +02:00
If BattleScreen . FieldEffects . OwnTrappedCounter > 0 Then
Return False
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . OppPokemon . Ability . Name . ToLower ( ) = " arena trap " And BattleScreen . OppPokemon . HP > 0 And BattleScreen . FieldEffects . IsGrounded ( True , BattleScreen ) = True Then
Return False
2016-09-07 18:50:38 +02:00
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . OppPokemon . Ability . Name . ToLower ( ) = " magnet pull " And BattleScreen . OwnPokemon . IsType ( Element . Types . Steel ) = True And BattleScreen . OppPokemon . HP > 0 Then
2016-09-07 18:50:38 +02:00
Return False
End If
With BattleScreen . FieldEffects
2016-09-21 02:39:55 +02:00
If . OwnWrap > 0 Or . OwnBind > 0 Or . OwnClamp > 0 Or . OwnFireSpin > 0 Or . OwnMagmaStorm > 0 Or . OwnSandTomb > 0 Or . OwnWhirlpool > 0 Or . OwnInfestation > 0 Then
2016-09-07 18:50:38 +02:00
Return False
End If
End With
If BattleScreen . FieldEffects . OwnIngrain > 0 Then
Return False
End If
Else
2016-12-12 07:14:21 +01:00
If BattleScreen . OppPokemon . Status = Pokemon . StatusProblems . Fainted Or BattleScreen . OppPokemon . HP <= 0 Then
Return True
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . OppPokemon . Type1 . Type = Element . Types . Ghost Or BattleScreen . OppPokemon . Type2 . Type = Element . Types . Ghost Then
Return True
End If
With BattleScreen
If Not . OppPokemon . Item Is Nothing Then
If . OppPokemon . Item . Name . ToLower ( ) = " shed shell " And . FieldEffects . CanUseItem ( False ) = True And . FieldEffects . CanUseOwnItem ( False , BattleScreen ) = True Then
Return True
End If
End If
End With
If BattleScreen . OwnPokemon . Ability . Name . ToLower ( ) = " shadow tag " And BattleScreen . OppPokemon . Ability . Name . ToLower ( ) <> " shadow tag " And BattleScreen . OwnPokemon . HP > 0 Then
2016-09-07 18:50:38 +02:00
Return False
End If
2019-09-27 20:46:23 +02:00
2016-09-07 18:50:38 +02:00
If BattleScreen . FieldEffects . OppTrappedCounter > 0 Then
Return False
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . OwnPokemon . Ability . Name . ToLower ( ) = " arena trap " And BattleScreen . OwnPokemon . HP > 0 And BattleScreen . FieldEffects . IsGrounded ( False , BattleScreen ) = True Then
Return False
2016-09-07 18:50:38 +02:00
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . OwnPokemon . Ability . Name . ToLower ( ) = " magnet pull " And BattleScreen . OppPokemon . IsType ( Element . Types . Steel ) = True And BattleScreen . OwnPokemon . HP > 0 Then
2016-09-07 18:50:38 +02:00
Return False
End If
With BattleScreen . FieldEffects
2016-09-21 02:39:55 +02:00
If . OppWrap > 0 Or . OppBind > 0 Or . OppClamp > 0 Or . OppFireSpin > 0 Or . OppMagmaStorm > 0 Or . OppSandTomb > 0 Or . OppWhirlpool > 0 Or . OppInfestation > 0 Then
2016-09-07 18:50:38 +02:00
Return False
End If
End With
If BattleScreen . FieldEffects . OppIngrain > 0 Then
Return False
End If
End If
Return True
End Function
2018-03-12 07:58:10 +01:00
Public Shared Function CalculateDamage ( ByVal Attack As Attack , ByVal Critical As Boolean , ByVal Own As Boolean , ByVal targetPokemon As Boolean , ByVal BattleScreen As BattleScreen , Optional ByVal ExtraParameter As String = " " ) As Integer
2016-09-07 18:50:38 +02:00
Dim p As Pokemon = Nothing
Dim Op As Pokemon = Nothing
If Own = True Then
p = BattleScreen . OwnPokemon
Else
p = BattleScreen . OppPokemon
End If
If targetPokemon = True Then
Op = BattleScreen . OwnPokemon
Else
Op = BattleScreen . OppPokemon
End If
Dim damage As Integer = 0
Dim Level As Integer = p . Level
'BASE POWER:
Dim BasePower As Integer = 1
Dim HH As Single = 1 . 0F 'Helping hand = 1.5
Dim BP As Single = Attack . GetBasePower ( Own , BattleScreen )
Dim IT As Single = 1 . 0F
Dim CHG As Single = 1 . 0F
Dim MS As Single = 1 . 0F
Dim WS As Single = 1 . 0F
Dim UA As Single = 1 . 0F
Dim FA As Single = 1 . 0F
2016-09-20 18:48:17 +02:00
'IT (Item attack power modifier)
2016-09-07 18:50:38 +02:00
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Own , BattleScreen ) = True Then
Select Case p . Item . Name . ToLower ( )
Case " muscle band "
If Attack . Category = Attack . Categories . Physical Then
IT = 1 . 1F
End If
Case " wise glasses "
If Attack . Category = Attack . Categories . Special Then
IT = 1 . 1F
End If
Case " adamant orb "
If p . Number = 483 Then
If Attack . Type . Type = Element . Types . Dragon Or Attack . Type . Type = Element . Types . Steel Then
IT = 1 . 2F
End If
End If
Case " lustrous orb "
If p . Number = 484 Then
If Attack . Type . Type = Element . Types . Dragon Or Attack . Type . Type = Element . Types . Water Then
IT = 1 . 2F
End If
End If
Case " griseous orb "
If p . Number = 487 Then
If Attack . Type . Type = Element . Types . Dragon Or Attack . Type . Type = Element . Types . Ghost Then
IT = 1 . 2F
End If
End If
2018-08-17 03:01:08 +02:00
Case " soul dew "
If p . Number = 380 OrElse p . Number = 381 Then
If Attack . Type . Type = Element . Types . Dragon Or Attack . Type . Type = Element . Types . Psychic Then
IT = 1 . 2F
End If
End If
2016-09-07 18:50:38 +02:00
Case Else
IT = 1 . 0F
End Select
Select Case p . Item . ID
Case 98 , 270 'Black Belt, Fist Plate
If Attack . Type . Type = Element . Types . Fighting Then
IT = 1 . 2F
End If
Case 102 , 268 'Black Glasses, Dread Plate
If Attack . Type . Type = Element . Types . Dark Then
IT = 1 . 2F
End If
Case 138 , 271 'Charcoal, Flame Plate
If Attack . Type . Type = Element . Types . Fire Then
IT = 1 . 2F
End If
Case 144 , 267 'Dragon Fang, Draco Plate
If Attack . Type . Type = Element . Types . Dragon Then
IT = 1 . 2F
End If
2016-09-23 16:24:59 +02:00
Case 125 , 281 , 286 'Hard Stone, Stone Plate, Rock Incense
2016-09-07 18:50:38 +02:00
If Attack . Type . Type = Element . Types . Rock Then
IT = 1 . 2F
End If
Case 108 , 283 'Magnet, Zap Plate
If Attack . Type . Type = Element . Types . Electric Then
IT = 1 . 2F
End If
Case 143 , 274 'Metal Coat, Iron Plate
If Attack . Type . Type = Element . Types . Steel Then
IT = 1 . 2F
End If
2016-09-23 16:24:59 +02:00
Case 117 , 275 , 287 'Miracle Seed, Meadow Plate, Rose Incense
2016-09-07 18:50:38 +02:00
If Attack . Type . Type = Element . Types . Grass Then
IT = 1 . 2F
End If
Case 95 , 145 , 264 , 279 'Mystic Water, Wave Incense, Sea Incense, Splash Plate
If Attack . Type . Type = Element . Types . Water Then
IT = 1 . 2F
End If
Case 107 , 272 'NeverMeltIce, Icicle Plate
If Attack . Type . Type = Element . Types . Ice Then
IT = 1 . 2F
End If
Case 104 , 277 'Pink Bow, Pixie Plate
If Attack . Type . Type = Element . Types . Fairy Then
IT = 1 . 2F
End If
Case 81 , 282 'Poison Barb, Toxic Plate
If Attack . Type . Type = Element . Types . Poison Then
IT = 1 . 2F
End If
Case 77 , 278 'Sharp Beak, Sky Plate
If Attack . Type . Type = Element . Types . Flying Then
IT = 1 . 2F
End If
Case 88 , 273 'Silver powder, Insect Plate
If Attack . Type . Type = Element . Types . Bug Then
IT = 1 . 2F
End If
Case 76 , 269 'Soft Sand, Earth Plate
If Attack . Type . Type = Element . Types . Ground Then
IT = 1 . 2F
End If
Case 113 , 280 'Spell Tag, Spooky Plate
If Attack . Type . Type = Element . Types . Ghost Then
IT = 1 . 2F
End If
Case 96 , 263 , 276 'Twisted Spoon, Odd Incense, Mind Plate
If Attack . Type . Type = Element . Types . Psychic Then
IT = 1 . 2F
End If
End Select
End If
2016-09-20 18:48:17 +02:00
'CHG (If used Charge)
2016-09-07 18:50:38 +02:00
Dim lastMove As Attack = BattleScreen . FieldEffects . OwnLastMove
If Own = False Then
lastMove = BattleScreen . FieldEffects . OppLastMove
End If
If Not lastMove Is Nothing Then
If lastMove . Name . ToLower ( ) = " charge " And Attack . Type . Type = Element . Types . Electric Then
CHG = 2 . 0F
End If
End If
'MS
If BattleScreen . FieldEffects . MudSport > 0 And Attack . Type . Type = Element . Types . Electric Then
MS = 0 . 5F
End If
'WA
If BattleScreen . FieldEffects . WaterSport > 0 And Attack . Type . Type = Element . Types . Fire Then
WS = 0 . 5F
End If
2016-09-20 18:48:17 +02:00
'UA (User Ability)
2016-09-07 18:50:38 +02:00
Select Case p . Ability . Name . ToLower ( )
Case " rivalry "
If p . Gender <> Pokemon . Genders . Genderless And Op . Gender <> Pokemon . Genders . Genderless Then
If p . Gender = Op . Gender Then
UA = 1 . 25F
Else
UA = 0 . 75F
End If
End If
Case " reckless "
If Attack . IsRecoilMove = True Then
UA = 1 . 2F
End If
Case " iron fist "
If Attack . IsPunchingMove = True Then
UA = 1 . 2F
End If
Case " blaze "
If p . HP < CInt ( Math . Floor ( p . MaxHP / 3 ) ) And Attack . Type . Type = Element . Types . Fire Then
UA = 1 . 5F
End If
Case " overgrow "
If p . HP < CInt ( Math . Floor ( p . MaxHP / 3 ) ) And Attack . Type . Type = Element . Types . Grass Then
UA = 1 . 5F
End If
Case " torrent "
If p . HP < CInt ( Math . Floor ( p . MaxHP / 3 ) ) And Attack . Type . Type = Element . Types . Water Then
UA = 1 . 5F
End If
Case " swarm "
If p . HP < CInt ( Math . Floor ( p . MaxHP / 3 ) ) And Attack . Type . Type = Element . Types . Bug Then
UA = 1 . 5F
End If
Case " technician "
If Attack . GetBasePower ( Own , BattleScreen ) <= 60 Then
UA = 1 . 5F
End If
Case " sheer force "
If Attack . HasSecondaryEffect = True Then
UA = 1 . 3F
End If
Case " analytic "
If Own = True Then
If BattleScreen . FieldEffects . OwnTurnCounts < BattleScreen . FieldEffects . OppTurnCounts Then
UA = 1 . 3F
End If
Else
If BattleScreen . FieldEffects . OwnTurnCounts > BattleScreen . FieldEffects . OppTurnCounts Then
UA = 1 . 3F
End If
End If
Case " sand force "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sandstorm Then
If Attack . Type . Type = Element . Types . Rock Or Attack . Type . Type = Element . Types . Ground Or Attack . Type . Type = Element . Types . Steel Then
UA = 1 . 3F
End If
End If
Case " strong jaw "
If Attack . IsJawMove = True Then
UA = 1 . 5F
End If
Case " refrigerate "
If Attack . Type . Type = Element . Types . Normal Then
2018-08-05 03:40:06 +02:00
UA = 1 . 2F
2016-09-07 18:50:38 +02:00
End If
Case " pixilate "
If Attack . Type . Type = Element . Types . Normal Then
2018-08-05 03:40:06 +02:00
UA = 1 . 2F
End If
Case " normalize "
If Attack . Type . Type = Element . Types . Normal Then
UA = 1 . 2F
End If
Case " galvanize "
If Attack . Type . Type = Element . Types . Normal Then
UA = 1 . 2F
2016-09-07 18:50:38 +02:00
End If
Case " aerilate "
If Attack . Type . Type = Element . Types . Normal Then
2018-08-05 03:40:06 +02:00
UA = 1 . 2F
2016-09-07 18:50:38 +02:00
End If
Case " mega launcher "
If Attack . IsPulseMove = True Then
UA = 1 . 5F
End If
Case " tough claws "
If Attack . MakesContact = True Then
UA = 1 . 3F
End If
Case " dark aura "
If Attack . Type . Type = Element . Types . Dark Then
UA = 1 . 3F
End If
Case " fairy aura "
If Attack . Type . Type = Element . Types . Fairy Then
UA = 1 . 3F
End If
2018-03-12 07:58:10 +01:00
Case " parental bond "
If ExtraParameter = " parental bond " Then
UA = 0 . 25
End If
2016-09-07 18:50:38 +02:00
Case Else
UA = 1 . 0F
End Select
2016-10-18 09:16:14 +02:00
2016-09-20 18:48:17 +02:00
'FA (Foe ability)
2016-09-07 18:50:38 +02:00
Select Case Op . Ability . Name . ToLower ( )
Case " thick fat "
If BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
If Attack . Type . Type = Element . Types . Fire Or Attack . Type . Type = Element . Types . Ice Then
FA = 0 . 5F
End If
End If
Case " heatproof "
If BattleScreen . FieldEffects . CanUseAbility ( Own , BattleScreen ) = True Then
If Attack . Type . Type = Element . Types . Fire Then
FA = 0 . 5F
End If
End If
Case " dry skin "
If BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
If Attack . Type . Type = Element . Types . Fire Then
FA = 1 . 25F
End If
End If
Case " multiscale "
If Op . HP = Op . MaxHP Then
FA = 0 . 5F
End If
Case " dark aura "
If Attack . Type . Type = Element . Types . Dark Then
FA = 1 . 3F
End If
Case " fairy aura "
If Attack . Type . Type = Element . Types . Fairy Then
FA = 1 . 3F
End If
Case Else
FA = 1 . 0F
End Select
BasePower = CInt ( Math . Floor ( HH * BP * IT * CHG * MS * WS * UA * FA ) )
'ATK:
Dim Atk As Integer = 1
Dim AStat As Single = 1 . 0F
Dim ASM As Single = 1 . 0F
Dim AM As Single = 1 . 0F
Dim IM As Single = 1 . 0F
If Attack . Category = Attack . Categories . Physical Then
2016-09-13 08:59:43 +02:00
If Attack . ID = 492 Then
AStat = Attack . GetUseAttackStat ( Op ) 'When the move is Foul Play
ASM = GetMultiplierFromStat ( Op . StatAttack )
Else
AStat = Attack . GetUseAttackStat ( p )
ASM = GetMultiplierFromStat ( p . StatAttack )
End If
2016-09-07 18:50:38 +02:00
If BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
If Op . Ability . Name . ToLower ( ) = " unaware " Then
ASM = 1 . 0F
End If
End If
Select Case p . Ability . Name . ToLower ( )
Case " pure power "
AM = 2 . 0F
Case " huge power "
AM = 2 . 0F
Case " flower gift "
If BattleScreen . FieldEffects . CanUseAbility ( Own , BattleScreen ) = True Then
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
AM = 1 . 5F
End If
End If
Case " guts "
2016-09-14 10:45:34 +02:00
If p . Status = Pokemon . StatusProblems . Paralyzed Or p . Status = Pokemon . StatusProblems . Poison Or p . Status = Pokemon . StatusProblems . Burn Or p . Status = Pokemon . StatusProblems . Sleep Or p . Status = Pokemon . StatusProblems . BadPoison Then
2016-09-07 18:50:38 +02:00
AM = 1 . 5F
End If
Case " hustle "
AM = 1 . 5F
Case " slow start "
If Own = True Then
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . OwnPokemonTurns < 5 Then
2016-09-07 18:50:38 +02:00
AM = 0 . 5F
End If
Else
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . OppPokemonTurns < 5 Then
2016-09-07 18:50:38 +02:00
AM = 0 . 5F
End If
End If
Case " toxic boost "
2016-09-14 10:45:34 +02:00
If p . Status = Pokemon . StatusProblems . Poison Or p . Status = Pokemon . StatusProblems . BadPoison Then
2016-09-07 18:50:38 +02:00
AM = 1 . 5F
End If
Case " defeatist "
If p . HP <= CInt ( p . MaxHP / 2 ) Then
AM = 0 . 5F
End If
Case Else
AM = 1 . 0F
End Select
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Own , BattleScreen ) = True Then
Select Case p . Item . Name . ToLower ( )
Case " choice band "
IM = 1 . 5F
Case " light ball "
If p . Number = 25 Then
IM = 2 . 0F
End If
Case " thick club "
If p . Number = 104 Or p . Number = 105 Then
IM = 2 . 0F
End If
Case Else
IM = 1 . 0F
End Select
End If
ElseIf Attack . Category = Attack . Categories . Special Then
AStat = Attack . GetUseAttackStat ( p )
ASM = GetMultiplierFromStat ( p . StatSpAttack )
If Op . Ability . Name . ToLower ( ) = " unaware " Then
ASM = 1 . 0F
End If
Select Case p . Ability . Name . ToLower ( )
Case " plus "
AM = 1 . 0F
Case " minus "
AM = 1 . 0F
Case " solar power "
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
AM = 1 . 5F
End If
Case " flare boost "
If Op . Status = Pokemon . StatusProblems . Burn Then
AM = 1 . 5F
End If
Case " defeatist "
If p . HP <= CInt ( p . MaxHP / 2 ) Then
AM = 0 . 5F
End If
Case Else
AM = 1 . 0F
End Select
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Own , BattleScreen ) = True Then
Select Case p . Item . Name . ToLower ( )
Case " choice specs "
IM = 1 . 5F
Case " light ball "
If p . Number = 25 Then
IM = 2 . 0F
End If
Case " deepseatooth "
If p . Number = 366 Then
IM = 2 . 0F
End If
Case " metronome "
Dim lastAttack As Attack = Nothing
If Own = False Then
If Not BattleScreen . FieldEffects . OppLastMove Is Nothing Then
lastAttack = BattleScreen . FieldEffects . OppLastMove
End If
Else
If Not BattleScreen . FieldEffects . OwnLastMove Is Nothing Then
lastAttack = BattleScreen . FieldEffects . OwnLastMove
End If
End If
If Not lastAttack Is Nothing Then
If lastAttack . ID = Attack . ID Then
Dim multi As Integer = 1
If Own = True Then
BattleScreen . FieldEffects . OwnMetronomeItemCount += 1
multi = BattleScreen . FieldEffects . OwnMetronomeItemCount
Else
BattleScreen . FieldEffects . OppMetronomeItemCount += 1
multi = BattleScreen . FieldEffects . OppMetronomeItemCount
End If
multi = multi . Clamp ( 1 , 10 )
IM = 1 . 0F + CSng ( multi / 10 )
Else
If Own = True Then
BattleScreen . FieldEffects . OwnMetronomeItemCount = 0
Else
BattleScreen . FieldEffects . OppMetronomeItemCount = 0
End If
IM = 1 . 0F
End If
Else
If Own = True Then
BattleScreen . FieldEffects . OwnMetronomeItemCount = 0
Else
BattleScreen . FieldEffects . OppMetronomeItemCount = 0
End If
IM = 1 . 0F
End If
Case Else
IM = 1 . 0F
End Select
End If
End If
2016-10-18 09:16:14 +02:00
2016-09-17 23:53:48 +02:00
'Critical hit interaction with attack stat change
If ASM < 1 . 0F AndAlso Critical = True Then
ASM = 1 . 0F
End If
2016-09-07 18:50:38 +02:00
Atk = CInt ( Math . Floor ( AStat * ASM * AM * IM ) )
'DEF
Dim Def As Integer = 1
Dim DStat As Single = 1 . 0F
Dim DSM As Single = 1 . 0F
Dim SX As Single = 1 . 0F
Dim DMod As Single = 1 . 0F
2018-10-26 10:03:33 +02:00
If Attack . Category = Attack . Categories . Physical OrElse Attack . ID = 473 OrElse Attack . ID = 540 OrElse Attack . ID = 548 Then 'Psyshock, Psystrike and Secret Sword.
2016-09-07 18:50:38 +02:00
DStat = Attack . GetUseDefenseStat ( Op )
DSM = GetMultiplierFromStat ( Op . StatDefense )
If p . Ability . Name . ToLower ( ) = " unaware " Then
DSM = 1 . 0F
End If
2019-09-27 20:46:23 +02:00
If Attack . Name . ToLower ( ) = " self-destruct " Or Attack . Name . ToLower ( ) = " explosion " Then
2016-12-27 09:30:10 +01:00
SX = 1 . 0F
2016-09-07 18:50:38 +02:00
End If
If Not Op . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Not Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Not Own , BattleScreen ) = True Then
Select Case Op . Item . Name . ToLower ( )
Case " metal powder "
If Op . Number = 132 Then
DMod = 1 . 5F
End If
2019-09-27 20:46:23 +02:00
Case " eviolite "
If Op . IsFullyEvolved = False Then
DMod = 1 . 5F
End If
2016-09-07 18:50:38 +02:00
End Select
End If
If Op . Ability . Name . ToLower ( ) = " marvel scale " Then
If BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
If Op . Status = Pokemon . StatusProblems . Paralyzed Or Op . Status = Pokemon . StatusProblems . Poison Or Op . Status = Pokemon . StatusProblems . Burn Or Op . Status = Pokemon . StatusProblems . Sleep Or Op . Status = Pokemon . StatusProblems . Freeze Then
DMod = 1 . 5F
End If
End If
End If
2019-09-27 20:46:23 +02:00
If Op . Ability . Name . ToLower ( ) = " fur coat " And BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
DMod = 2 . 0F
End If
If BattleScreen . FieldEffects . GrassyTerrain > 0 And Op . Ability . Name . ToLower ( ) = " grass pelt " And BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
DMod = 1 . 5F
End If
2016-09-07 18:50:38 +02:00
ElseIf Attack . Category = Attack . Categories . Special Then
DStat = Attack . GetUseDefenseStat ( Op )
DSM = GetMultiplierFromStat ( Op . StatSpDefense )
If p . Ability . Name . ToLower ( ) = " unaware " Or Attack . UseOppDefense = False Then
DSM = 1 . 0F
End If
If Op . Ability . Name . ToLower ( ) = " flower gift " Then
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
DMod = 1 . 5F
End If
End If
If Not Op . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Not Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Not Own , BattleScreen ) = True Then
Select Case Op . Item . Name . ToLower ( )
Case " metal powder "
If Op . Number = 132 Then
DMod = 1 . 5F
End If
Case " deepseascale "
2016-12-30 01:11:14 +01:00
If Op . Number = 366 Then
2016-09-07 18:50:38 +02:00
DMod = 2 . 0F
End If
2016-10-31 02:50:07 +01:00
Case " assault vest "
DMod = 1 . 5F
Case " eviolite "
2016-12-30 01:11:14 +01:00
If Op . IsFullyEvolved = False Then
2016-10-31 02:50:07 +01:00
DMod = 1 . 5F
End If
2016-09-07 18:50:38 +02:00
End Select
End If
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sandstorm Then
If Op . Type1 . Type = Element . Types . Rock Or Op . Type2 . Type = Element . Types . Rock Then
DMod = 1 . 5F
End If
End If
End If
2016-10-18 09:16:14 +02:00
2016-09-17 23:53:48 +02:00
If DSM > 1 . 0F AndAlso Critical = True Then
DSM = 1 . 0F
End If
2016-10-18 09:16:14 +02:00
2016-09-17 23:53:48 +02:00
'Sacred Sword ignores defense stat changes
If Attack . ID = 533 Then
DSM = 1 . 0F
End If
2016-10-18 09:16:14 +02:00
2016-09-07 18:50:38 +02:00
Def = CInt ( Math . Floor ( DStat * DSM * DMod * SX ) )
If Def <= 0 Then
Def = 1
End If
'Mod1
Dim Mod1 As Single = 1 . 0F
Dim BRN As Single = 1 . 0F
Dim RL As Single = 1 . 0F
Dim TVT As Single = 1 . 0F
Dim SR As Single = 1 . 0F
Dim FF As Single = 1 . 0F
If Attack . Category = Attack . Categories . Physical Then
If p . Ability . Name . ToLower ( ) <> " guts " And p . Status = Pokemon . StatusProblems . Burn Then
BRN = 0 . 5F
End If
End If
Dim CritSwap As Boolean = False
If Core . Random . Next ( 0 , 3 ) = 0 And Critical = True Then
CritSwap = True
End If
If CritSwap = False Then
If Attack . Category = Attack . Categories . Physical Then
If p . Ability . Name . ToLower ( ) <> " infiltrator " Then
If Own = True Then
If BattleScreen . FieldEffects . OppReflect > 0 Then
RL = 0 . 5F
End If
Else
If BattleScreen . FieldEffects . OwnReflect > 0 Then
RL = 0 . 5F
End If
End If
End If
ElseIf Attack . Category = Attack . Categories . Special Then
If p . Ability . Name . ToLower ( ) <> " infiltrator " Then
If Own = True Then
If BattleScreen . FieldEffects . OppLightScreen > 0 Then
RL = 0 . 5F
End If
Else
If BattleScreen . FieldEffects . OwnLightScreen > 0 Then
RL = 0 . 5F
End If
End If
End If
End If
End If
Select Case Attack . Type . Type
Case Element . Types . Fire
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
SR = 1 . 5F
ElseIf BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Rain Then
SR = 0 . 5F
End If
Case Element . Types . Water
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Sunny Then
SR = 0 . 5F
ElseIf BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Rain Then
SR = 1 . 5F
End If
Case Element . Types . Ice
If BattleScreen . FieldEffects . Weather = BattleWeather . WeatherTypes . Snow Then
SR = 1 . 5F
End If
2019-09-27 20:46:23 +02:00
Case Element . Types . Electric
If BattleScreen . FieldEffects . ElectricTerrain > 0 And BattleScreen . FieldEffects . IsGrounded ( Own , BattleScreen ) = True Then
SR = 1 . 5F
End If
Case Element . Types . Grass
If BattleScreen . FieldEffects . GrassyTerrain > 0 And BattleScreen . FieldEffects . IsGrounded ( Own , BattleScreen ) = True Then
SR = 1 . 5F
End If
Case Element . Types . Psychic
If BattleScreen . FieldEffects . PsychicTerrain > 0 And BattleScreen . FieldEffects . IsGrounded ( Own , BattleScreen ) = True Then
SR = 1 . 5F
End If
2016-09-07 18:50:38 +02:00
End Select
If p . Ability . Name . ToLower ( ) = " flash fire " Then
If BattleScreen . FieldEffects . CanUseAbility ( Own , BattleScreen ) = True Then
If Own = True Then
If Not BattleScreen . FieldEffects . OppLastMove Is Nothing Then
If BattleScreen . FieldEffects . OppLastMove . Type . Type = Element . Types . Fire And Attack . Type . Type = Element . Types . Fire Then
FF = 1 . 5F
End If
End If
Else
If Not BattleScreen . FieldEffects . OwnLastMove Is Nothing Then
If BattleScreen . FieldEffects . OwnLastMove . Type . Type = Element . Types . Fire And Attack . Type . Type = Element . Types . Fire Then
FF = 1 . 5F
End If
End If
End If
End If
End If
Mod1 = BRN * RL * TVT * SR * FF
'CH
2016-09-14 07:23:06 +02:00
Dim CH As Single = 1 . 0F
2016-09-07 18:50:38 +02:00
If Critical = True Then
If p . Ability . Name . ToLower ( ) = " sniper " Then
2016-09-14 07:23:06 +02:00
CH = 2 . 25
2016-09-07 18:50:38 +02:00
Else
2016-09-14 07:23:06 +02:00
CH = 1 . 5
2016-09-07 18:50:38 +02:00
End If
End If
'Mod2
Dim Mod2 As Single = 1 . 0F
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Own , BattleScreen ) = True Then
If p . Item . Name . ToLower ( ) = " life orb " Then
Mod2 = 1 . 3F
End If
End If
If Attack . Name . ToLower ( ) = " me first " Then
Mod2 = 1 . 5F
End If
'R
Dim R As Integer = Core . Random . Next ( 85 , 101 )
If R = 0 Then
R = 1
End If
'STAB
Dim STAB As Single = 1 . 0F
If Attack . CanGainSTAB = True Then
If Attack . Type . Type = p . Type1 . Type Or Attack . Type . Type = p . Type2 . Type Then
If p . Ability . Name . ToLower ( ) = " adaptability " Then
STAB = 2 . 0F
Else
STAB = 1 . 5F
End If
End If
End If
'Mod3
Dim Mod3 As Single = 1 . 0F
Dim SRF As Single = 1 . 0F
Dim EB As Single = 1 . 0F
Dim TL As Single = 1 . 0F
Dim TRB As Single = 1 . 0F
2016-12-23 19:48:32 +01:00
Dim effectiveness As Single = CalculateEffectiveness ( Attack , BattleScreen , p , Op , Own )
2016-09-07 18:50:38 +02:00
2016-12-23 19:48:32 +01:00
If effectiveness > 1 . 0F Then
2016-09-07 18:50:38 +02:00
If Op . Ability . Name . ToLower ( ) = " solid rock " Or Op . Ability . Name . ToLower ( ) = " filter " Then
If BattleScreen . FieldEffects . CanUseAbility ( Not Own , BattleScreen ) = True Then
SRF = 0 . 75F
End If
End If
If Not p . Item Is Nothing And BattleScreen . FieldEffects . CanUseItem ( Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Own , BattleScreen ) = True Then
If p . Item . Name . ToLower ( ) = " expert belt " Then
EB = 1 . 2F
End If
End If
If Not Op . Item Is Nothing Then
If BattleScreen . FieldEffects . CanUseItem ( Not Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Not Own , BattleScreen ) = True Then
Select Case Op . Item . Name . ToLower ( )
Case " occa "
If Attack . Type . Type = Element . Types . Fire Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Occa Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:occa " ) = True Then
TRB = 0 . 5F
End If
End If
Case " passho "
If Attack . Type . Type = Element . Types . Water Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Passho Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:passho " ) = True Then
TRB = 0 . 5F
End If
End If
Case " wacan "
If Attack . Type . Type = Element . Types . Electric Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Wacan Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:wacan " ) = True Then
TRB = 0 . 5F
End If
End If
Case " rindo "
If Attack . Type . Type = Element . Types . Grass Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Rindo Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:rindo " ) = True Then
TRB = 0 . 5F
End If
End If
Case " yache "
If Attack . Type . Type = Element . Types . Ice Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Yache Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:yache " ) = True Then
TRB = 0 . 5F
End If
End If
Case " chople "
If Attack . Type . Type = Element . Types . Fighting Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Chople Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:chople " ) = True Then
TRB = 0 . 5F
End If
End If
Case " kebia "
If Attack . Type . Type = Element . Types . Poison Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Kebia Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:kebia " ) = True Then
TRB = 0 . 5F
End If
End If
Case " shuca "
If Attack . Type . Type = Element . Types . Ground Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Shuca Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:shuca " ) = True Then
TRB = 0 . 5F
End If
End If
Case " coba "
If Attack . Type . Type = Element . Types . Flying Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Coba Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:coba " ) = True Then
TRB = 0 . 5F
End If
End If
Case " payapa "
If Attack . Type . Type = Element . Types . Psychic Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Payapa Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:payapa " ) = True Then
TRB = 0 . 5F
End If
End If
Case " tanga "
If Attack . Type . Type = Element . Types . Bug Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Tanga Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:tanga " ) = True Then
TRB = 0 . 5F
End If
End If
Case " charti "
If Attack . Type . Type = Element . Types . Rock Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Charti Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:charti " ) = True Then
TRB = 0 . 5F
End If
End If
Case " kasib "
If Attack . Type . Type = Element . Types . Ghost Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Kasib Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:kasib " ) = True Then
TRB = 0 . 5F
End If
End If
Case " haban "
If Attack . Type . Type = Element . Types . Dragon Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Haban Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:haban " ) = True Then
TRB = 0 . 5F
End If
End If
Case " colbur "
If Attack . Type . Type = Element . Types . Dark Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Colbur Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:corlbur " ) = True Then
TRB = 0 . 5F
End If
End If
Case " babiri "
If Attack . Type . Type = Element . Types . Steel Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Babiri Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:babiri " ) = True Then
TRB = 0 . 5F
End If
End If
2019-09-27 20:46:23 +02:00
Case " roseli "
If Attack . Type . Type = Element . Types . Fairy Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Roseli Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:roseli " ) = True Then
TRB = 0 . 5F
End If
End If
2016-09-07 18:50:38 +02:00
End Select
End If
End If
End If
If Not Op . Item Is Nothing Then
If BattleScreen . FieldEffects . CanUseItem ( Not Own ) = True And BattleScreen . FieldEffects . CanUseOwnItem ( Not Own , BattleScreen ) = True Then
If Op . Item . Name . ToLower ( ) = " chilan " Then
If Attack . Type . Type = Element . Types . Normal Then
If BattleScreen . Battle . RemoveHeldItem ( Not Own , Not Own , BattleScreen , " The Chilan Berry weakened the effect of " & Attack . Name & " on " & Op . GetDisplayName ( ) & " ! " , " berry:chilan " ) = True Then
TRB = 0 . 5F
End If
End If
End If
End If
End If
2016-12-23 19:48:32 +01:00
If effectiveness < 1 . 0F Then
2016-12-17 21:43:34 +01:00
If p . Ability . Name . ToLower ( ) = " tinted lens " Then
2016-09-07 18:50:38 +02:00
TL = 2 . 0F
End If
End If
Mod3 = SRF * EB * TL * TRB
2016-12-23 19:48:32 +01:00
damage = CInt ( Math . Floor ( ( ( ( ( ( ( ( Level * 2 / 5 ) + 2 ) * BasePower * Atk / 50 ) / Def ) * Mod1 ) + 2 ) * CH * Mod2 * R / 100 ) * STAB * effectiveness * Mod3 ) )
2016-09-07 18:50:38 +02:00
If p . Ability . Name . ToLower ( ) = " multiscale " And p . HP = p . MaxHP And BattleScreen . FieldEffects . CanUseAbility ( Own , BattleScreen ) = True Then
damage = CInt ( damage / 2 )
End If
2019-09-27 20:46:23 +02:00
If BattleScreen . FieldEffects . MistyTerrain > 0 And BattleScreen . FieldEffects . IsGrounded ( Own , BattleScreen ) = True Then
If Attack . Type . Type = Element . Types . Dragon Then
damage = CInt ( damage / 2 )
End If
End If
If BattleScreen . FieldEffects . GrassyTerrain > 0 And BattleScreen . FieldEffects . IsGrounded ( Own , BattleScreen ) = True Then
'Earthquake, Bulldoze, Magnitude
If Attack . ID = 89 Or Attack . ID = 523 Or Attack . ID = 222 Then
damage = CInt ( damage / 2 )
End If
End If
2016-09-07 18:50:38 +02:00
If Attack . IsOneHitKOMove = True Then
damage = Op . HP
End If
If damage <= 0 Then
damage = 1
End If
Return damage
End Function
Public Shared Function ReverseTypeEffectiveness ( ByVal effectiveness As Single ) As Single
If BattleScreen . IsInverseBattle = True Then
Select Case effectiveness
Case 0 . 5F , 0 . 0F
Return 2 . 0F
Case 1 . 0F
Return 1 . 0F
Case 2 . 0F
Return 0 . 5F
End Select
Return 1 . 0F
Else
Return effectiveness
End If
End Function
''' <summary>
''' Calculates the usable multiplier from a stat reduction/raise.
''' </summary>
''' <param name="StatValue">The relative stat reduction/raise of the stat.</param>
Public Shared Function GetMultiplierFromStat ( ByVal StatValue As Integer ) As Single
Select Case StatValue
Case - 6
Return CSng ( 2 / 8 )
Case - 5
Return CSng ( 2 / 7 )
Case - 4
Return CSng ( 2 / 6 )
Case - 3
Return CSng ( 2 / 5 )
Case - 2
Return CSng ( 2 / 4 )
Case - 1
Return CSng ( 2 / 3 )
Case 0
Return CSng ( 2 / 2 )
Case 1
Return CSng ( 3 / 2 )
Case 2
Return CSng ( 4 / 2 )
Case 3
Return CSng ( 5 / 2 )
Case 4
Return CSng ( 6 / 2 )
Case 5
Return CSng ( 7 / 2 )
Case 6
Return CSng ( 8 / 2 )
Case Else
Return 1 . 0F
End Select
End Function
2016-10-18 09:16:14 +02:00
2016-09-18 00:30:33 +02:00
Public Shared Function GetMultiplierFromAccEvasion ( ByVal StatValue As Integer ) As Single
Select Case StatValue
Case - 6
Return CSng ( 3 / 9 )
Case - 5
Return CSng ( 3 / 8 )
Case - 4
Return CSng ( 3 / 7 )
Case - 3
Return CSng ( 3 / 6 )
Case - 2
Return CSng ( 3 / 5 )
Case - 1
Return CSng ( 3 / 4 )
Case 0
Return CSng ( 3 / 3 )
Case 1
Return CSng ( 4 / 3 )
Case 2
Return CSng ( 5 / 3 )
Case 3
Return CSng ( 6 / 3 )
Case 4
Return CSng ( 7 / 3 )
Case 5
Return CSng ( 8 / 3 )
Case 6
Return CSng ( 9 / 3 )
Case Else
Return 1 . 0F
End Select
End Function
2016-09-07 18:50:38 +02:00
End Class
2016-09-10 09:26:22 +02:00
End Namespace