128 lines
3.7 KiB
CoffeeScript
128 lines
3.7 KiB
CoffeeScript
class PokemonCollection extends Backbone.Collection
|
|
model: (attrs, options) =>
|
|
# History lesson: We stored species under `name`. Now that we support
|
|
# nicknames, we need the `name` freed up. However, teams are saved to the
|
|
# server using the old scheme. Therefore we need to do a simple check for
|
|
# the existence of `species`; if it exists, do nothing. If not, use `name`.
|
|
if attrs.name || attrs.species
|
|
attrs.teambuilder = @parents[0].get('teambuilder')
|
|
return new Pokemon(attrs, options)
|
|
else
|
|
return new NullPokemon()
|
|
|
|
class @Team extends Backbone.AssociatedModel
|
|
relations: [
|
|
type: Backbone.Many
|
|
key: 'pokemon'
|
|
collectionType: PokemonCollection
|
|
]
|
|
|
|
initialize: (attrs={}, options={}) =>
|
|
@owner = attrs.owner
|
|
@set('generation', DEFAULT_GENERATION) unless attrs.generation
|
|
@set('teambuilder', true) if options.teambuilder
|
|
@set('pokemon', []) unless attrs.pokemon
|
|
|
|
getName: =>
|
|
@get('name') || "Untitled team"
|
|
|
|
toJSON: =>
|
|
json = {}
|
|
json['id'] = @id if @id
|
|
json['name'] = @get('name')
|
|
json['generation'] = @get('generation')
|
|
json['pokemon'] = @get('pokemon').toJSON()
|
|
json
|
|
|
|
# Returns the pokemon at a particular index. Delegates to the internal pokemon collection
|
|
at: (idx) => @get('pokemon').at(idx)
|
|
|
|
# Returns which index the pokemon is in
|
|
indexOf: (idx) => @get('pokemon').indexOf(idx)
|
|
|
|
# Replace a pokemon at a particular index for another
|
|
replace: (idx, newPokemon) =>
|
|
@get('pokemon').remove(@get('pokemon').at(idx))
|
|
@get('pokemon').add(newPokemon, at: idx)
|
|
|
|
# Equivalent to toJSON, but omits NullPokemon
|
|
toNonNullJSON: =>
|
|
id: @id
|
|
name: @get('name')
|
|
generation: @get('generation')
|
|
pokemon: @get('pokemon')
|
|
.reject((pokemon) -> pokemon.isNull)
|
|
.map((pokemon) -> pokemon.toJSON())
|
|
|
|
clone: =>
|
|
attrs = _(@attributes).clone()
|
|
attrs.pokemon = @get('pokemon').toJSON()
|
|
new Team(attrs)
|
|
|
|
rearrange: (arrangement) ->
|
|
pokemon = @get('pokemon')
|
|
pokemon.reset((pokemon.models[index] for index in arrangement))
|
|
return true
|
|
|
|
getFormat: =>
|
|
format = @get('generation') # TODO: Migrate to format
|
|
format = DEFAULT_FORMAT if format not of Formats
|
|
Formats[format]
|
|
|
|
getGeneration: (generation) ->
|
|
gen = generation || @getFormat().generation
|
|
gen = gen.toUpperCase()
|
|
window.Generations[gen]
|
|
|
|
getPBV: =>
|
|
gen = @getGeneration()
|
|
pokemon = @get('pokemon').toJSON()
|
|
PokeBattle.PBV.determinePBV(gen, pokemon)
|
|
|
|
getMaxPBV: =>
|
|
{conditions} = @getFormat()
|
|
if Conditions.PBV_1000 in conditions
|
|
1000
|
|
else if Conditions.PBV_500 in conditions
|
|
500
|
|
else
|
|
0
|
|
|
|
hasPBV: =>
|
|
@getMaxPBV() > 0
|
|
|
|
getNonNullPokemon: =>
|
|
@get('pokemon').where(isNull: false)
|
|
|
|
hasNonNullPokemon: =>
|
|
@get('pokemon').some((pokemon) -> not pokemon.isNull)
|
|
|
|
sync: (method) =>
|
|
switch method
|
|
when 'create', 'patch', 'update'
|
|
@set('saving', true, silent: true)
|
|
@trigger('remoteSync', this)
|
|
PokeBattle.primus.send 'saveTeam', @toJSON(), (id) =>
|
|
# Note: If this model is saved multiple times, then this won't
|
|
# tell you if some of the saves failed.
|
|
@set('id', id)
|
|
@set('saving', false, silent: true)
|
|
@trigger('remoteSync', this)
|
|
when 'delete'
|
|
PokeBattle.primus.send('destroyTeam', @id) if @id
|
|
|
|
getRandomOrder: =>
|
|
order = @get('randomorder')
|
|
if typeof order is 'undefined'
|
|
@setRandomOrder()
|
|
order = @get('randomorder')
|
|
order
|
|
else
|
|
order = @get('randomorder')
|
|
order
|
|
|
|
setRandomOrder: =>
|
|
#random order for the icons with team preview when in battle
|
|
team = @get('pokemon').toJSON()
|
|
teamshuffled = _.shuffle(team)
|
|
@set('randomorder', teamshuffled) |