BattleSim/server/bw/team.coffee

142 lines
3.8 KiB
CoffeeScript

{_} = require 'underscore'
{Pokemon} = require './pokemon'
{Attachments} = require './attachment'
{Protocol} = require '../../shared/protocol'
Query = require('./queries')
class @Team
constructor: (@battle, @playerId, @playerName, pokemon, @numActive) ->
@pokemon = pokemon.map (attributes) =>
# TODO: Is there a nicer way of doing these injections?
attributes.battle = @battle
attributes.team = this
attributes.playerId = @playerId
new Pokemon(attributes)
@attachments = new Attachments()
# Has a Pokemon from this team fainted?
@faintedLastTurn = false
@faintedThisTurn = false
hasMegaEvolved = false
hasPrimalEvolved = false
arrange: (arrangement) ->
@pokemon = (@pokemon[index] for index in arrangement)
at: (index) ->
@pokemon[index]
all: ->
@pokemon.slice(0)
slice: (args...) ->
@pokemon.slice(args...)
indexOf: (pokemon) ->
@pokemon.indexOf(pokemon)
contains: (pokemon) ->
@indexOf(pokemon) != -1
first: ->
@at(0)
has: (attachment) ->
@attachments.contains(attachment)
get: (attachmentName) ->
@attachments.get(attachmentName)
megaEvolve: ->
@hasMegaEvolved = true
primalEvolve: ->
@hasPrimalEvolved = true
attach: (attachment, options={}) ->
options = _.clone(options)
attachment = @attachments.push(attachment, options, battle: @battle, team: this)
if attachment then @tell(Protocol.TEAM_ATTACH, attachment.name)
attachment
unattach: (klass) ->
attachment = @attachments.unattach(klass)
if attachment then @tell(Protocol.TEAM_UNATTACH, attachment.name)
attachment
tell: (protocol, args...) ->
playerIndex = @battle.getPlayerIndex(@playerId)
@battle?.tell(protocol, playerIndex, args...)
switch: (pokemon, toPosition) ->
newPokemon = @at(toPosition)
index = @indexOf(pokemon)
playerIndex = @battle.getPlayerIndex(@playerId)
@battle.removeRequest(@playerId, index)
@battle.cancelAction(pokemon)
@battle.tell(Protocol.SWITCH_OUT, playerIndex, index)
p.informSwitch(pokemon) for p in @battle.getOpponents(pokemon)
@switchOut(pokemon)
@replace(pokemon, toPosition)
@switchIn(newPokemon)
replace: (pokemon, toPosition) ->
[ a, b ] = [ @indexOf(pokemon), toPosition ]
[@pokemon[a], @pokemon[b]] = [@pokemon[b], @pokemon[a]]
theSwitch = @at(a)
theSwitch.tell(Protocol.SWITCH_IN, b)
theSwitch
shouldBlockFieldExecution: (move, user) ->
Query.untilTrue('shouldBlockFieldExecution', @attachments.all(), move, user)
switchOut: (pokemon) ->
Query('switchOut', @attachments.all(), pokemon)
pokemon.switchOut()
switchIn: (pokemon) ->
pokemon.activate()
Query('switchIn', @attachments.all(), pokemon)
pokemon.switchIn()
getAdjacent: (pokemon) ->
index = @pokemon.indexOf(pokemon)
adjacent = []
return adjacent if index < 0 || index >= @numActive
adjacent.push(@at(index - 1)) if index > 1
adjacent.push(@at(index + 1)) if index < @numActive - 1
adjacent.filter((p) -> p.isAlive())
getActivePokemon: ->
@pokemon.slice(0, @numActive)
getActiveAlivePokemon: ->
@getActivePokemon().filter((pokemon) -> pokemon.isAlive())
getAlivePokemon: ->
@pokemon.filter((pokemon) -> !pokemon.isFainted())
getActiveFaintedPokemon: ->
@getActivePokemon().filter((pokemon) -> pokemon.isFainted())
getFaintedPokemon: ->
@pokemon.filter((pokemon) -> pokemon.isFainted())
getBenchedPokemon: ->
@pokemon.slice(@numActive)
getAliveBenchedPokemon: ->
@getBenchedPokemon().filter((pokemon) -> !pokemon.isFainted())
size: ->
@pokemon.length
filter: ->
@pokemon.filter.apply(@pokemon, arguments)
toJSON: (options = {}) -> {
"pokemon": @pokemon.map (p) -> p.toJSON(options)
"owner": @playerName
}