142 lines
3.8 KiB
CoffeeScript
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
|
|
}
|
|
|