coffee = require 'coffee-script'
path = require('path').resolve(__dirname, '../bw/attachment.coffee')
eval(coffee.compile(require('fs').readFileSync(path, 'utf8'), bare: true))

delete @Status.Sleep::switchOut

# In XY, electric pokemon are immune to paralysis
@Status.Paralyze.worksOn = (battle, pokemon) ->
  !pokemon.hasType("Electric")

# In XY, Scald and Steam Eruption thaw the target
@Status.Freeze::afterBeingHit = (move, user, target) ->
  if !move.isNonDamaging() && move.type == 'Fire' ||
      move.name in ["Scald", "Steam Eruption"]
    @pokemon.cureStatus()

# In XY, Protect-like moves have a chance of success corresponding to the
# power of 3, instead of the power of 2 in previous generations.
@Attachment.ProtectCounter::successMultiplier = 3

# In XY, partial-trapping moves deal more damage at the end of each turn
@Attachment.Trap::getDamagePerTurn = ->
  if @user.hasItem("Binding Band")
    6
  else
    8

class @Attachment.KingsShield extends @VolatileAttachment
  name: "KingsShieldAttachment"

  initialize: ->
    @pokemon.tell(Protocol.POKEMON_ATTACH, @name)

  shouldBlockExecution: (move, user) ->
    if move.hasFlag("protect") && !move.isNonDamaging()
      if move.hasFlag("contact") then user.boost(attack: -2, @pokemon)
      return true

  endTurn: ->
    @pokemon.unattach(@constructor)

  unattach: ->
    @pokemon.tell(Protocol.POKEMON_UNATTACH, @name)

class @Attachment.SpikyShield extends @VolatileAttachment
  name: "SpikyShieldAttachment"

  initialize: ->
    @pokemon.tell(Protocol.POKEMON_ATTACH, @name)

  shouldBlockExecution: (move, user) ->
    if move.hasFlag("protect")
      if move.hasFlag("contact") then user.damage(user.stat('hp') >> 3)
      return true

  endTurn: ->
    @pokemon.unattach(@constructor)

  unattach: ->
    @pokemon.tell(Protocol.POKEMON_UNATTACH, @name)

class @Attachment.StickyWeb extends @TeamAttachment
  name: "StickyWebAttachment"

  initialize: ->
    id = @team.playerId
    @battle.cannedText('STICKY_WEB_START', @battle.getPlayerIndex(id))

  switchIn: (pokemon) ->
    if !pokemon.isImmune("Ground")
      @battle.cannedText('STICKY_WEB_CONTINUE', pokemon)
      # The source is not actually an opposing Pokemon, but in order for Defiant
      # to work properly, the source should not be the pokemon itself.
      pokemon.boost(speed: -1, @battle.getAllOpponents(pokemon)[0])

  unattach: ->
    id = @team.playerId
    @battle.cannedText('STICKY_WEB_END', @battle.getPlayerIndex(id))

class @Attachment.Livewire extends @TeamAttachment
  name: "LiveWireAttachment"

  maxLayers: 1

  initialize: ->
    id = @team.playerId
    @battle.cannedText('LIVEWIRE_START', @battle.getPlayerIndex(id))

  #On switch in
  switchIn: (pokemon) ->
    if pokemon.isFainted()
      return
    #if pokemon is part electric and not immune to ground, remove livewire. Also if has ground and is not immune to ground
    if (pokemon.hasType("Electric") && !pokemon.isImmune("Ground")) || (pokemon.hasType("Ground") && !pokemon.isImmune("Ground"))
      @team.unattach(@constructor)

    #if pokemon is immune to electric, nothing happens
    if pokemon.isImmune("Electric")
      return
    #if pokemon is immune to ground, show miss message and nothing further happens
    if pokemon.isImmune("Ground")
      @battle.cannedText('LIVEWIRE_MISS', pokemon)
      return

    rng = @battle?.rng.randInt(1, 100, "will livewire paralyze?")
    livewirechance = 70
    if rng < livewirechance
      pokemon.cureStatus()
      pokemon.attach(Status.Paralyze)
      @battle.cannedText('LIVEWIRE_HURT', pokemon)
    else 
       @battle.cannedText('LIVEWIRE_MISS', pokemon)

  unattach: ->
    id = @team.playerId
    @battle.cannedText('LIVEWIRE_END', @battle.getPlayerIndex(id))

class @Attachment.FireRock extends @TeamAttachment
  name: "FireRockAttachment"

  initialize: ->
    id = @team.playerId
    @battle.cannedText('FIRE_ROCK_START', @battle.getPlayerIndex(id))

  switchIn: (pokemon) ->
    multiplier = util.typeEffectiveness("Fire", pokemon.types)
    hp = pokemon.stat('hp')
    damage = ((hp * multiplier) >> 3)
    if pokemon.damage(damage)
      @battle.cannedText('FIRE_ROCK_HURT', pokemon)

  unattach: ->
    id = @team.playerId
    @battle.cannedText('FIRE_ROCK_END', @battle.getPlayerIndex(id))

class @Attachment.Pendulum extends @VolatileAttachment
  name: "PendulumAttachment"

  maxLayers: 5

  initialize: (attributes) ->
    {@move} = attributes

  beforeMove: (move) ->
    @pokemon.unattach(@constructor)  if move != @move