BattleSim/test/learnsets_spec.coffee

274 lines
9.9 KiB
CoffeeScript

require './helpers'
{_} = require('underscore')
learnsets = require('../shared/learnsets')
{GenerationJSON} = require '../server/generations'
describe "Learnsets:", ->
testLearnset = (pokemon, func) ->
describe pokemon, ->
beforeEach ->
@pokemon = {species: pokemon}
@checkMoveset = learnsets.checkMoveset.bind(
learnsets, GenerationJSON, @pokemon)
func.call(this)
testLearnset "Tyranitar", ->
it "can learn level-up moves once that level, in its own generation", ->
@pokemon.level = 29
@checkMoveset(3, [ "Thrash" ]).should.be.true
it "cannot learn level-up moves if the level has not been reached", ->
@pokemon.level = 28
@checkMoveset(3, [ "Thrash" ]).should.be.false
it "can learn machine moves in its own generation", ->
@pokemon.level = 1
@checkMoveset(2, [ "Attract" ]).should.be.true
it "can learn tutor moves in its own generation", ->
@pokemon.level = 1
@checkMoveset(4, [ "Spite" ]).should.be.true
it "can learn tutor moves below its generation", ->
@pokemon.level = 1
@checkMoveset(4, [ "Seismic Toss" ]).should.be.true
testLearnset "Mewtwo", ->
it "can learn machine moves below its generation", ->
@checkMoveset(2, [ "Bide" ]).should.be.true
it "cannot learn machine moves below a cutoff point", ->
@checkMoveset(3, [ "Bide" ]).should.be.false
testLearnset "Vaporeon", ->
it "can learn Take Down indirectly from Eevee", ->
@checkMoveset(3, [ "Take Down" ]).should.be.true
it "can learn Wish through cross-breeding", ->
@checkMoveset(3, [ "Wish" ]).should.be.true
testLearnset "Smeargle", ->
it "can learn almost any move", ->
@checkMoveset(3, [ "Spore" ]).should.be.true
it "cannot learn Chatter", ->
@checkMoveset(3, [ "Chatter" ]).should.be.false
it "cannot learn Struggle", ->
@checkMoveset(3, [ "Struggle" ]).should.be.false
for pokemon in [ "Pichu", "Raichu" ]
testLearnset pokemon, ->
it "can learn Volt Tackle", ->
@checkMoveset(3, [ "Volt Tackle" ]).should.be.true
it "can learn Encore", ->
@checkMoveset(3, [ "Encore" ]).should.be.true
it "cannot learn Volt Tackle and Encore", ->
@checkMoveset(3, [ "Volt Tackle", "Encore" ]).should.be.false
testLearnset "Rotom", ->
it "Gen 4: learns Overheat in its heat forme", ->
@pokemon.forme = "heat"
@checkMoveset(4, [ "Overheat" ]).should.be.true
it "Gen 5: learns Overheat in its heat forme", ->
@pokemon.forme = "heat"
@checkMoveset(5, [ "Overheat" ]).should.be.true
it "Gen 4: learns Overheat and a standard move in its heat forme", ->
@pokemon.forme = "heat"
@checkMoveset(4, [ "Overheat", "Thunderbolt" ]).should.be.true
it "Gen 5: learns Overheat and a standard move in its heat forme", ->
@pokemon.forme = "heat"
@checkMoveset(5, [ "Overheat", "Thunderbolt" ]).should.be.true
it "Gen 4: learns Air Slash in its fan forme", ->
@pokemon.forme = "fan"
@checkMoveset(4, [ "Air Slash" ]).should.be.true
it "Gen 5: learns Air Slash in its fan forme", ->
@pokemon.forme = "fan"
@checkMoveset(5, [ "Air Slash" ]).should.be.true
it "Gen 4: learns Blizzard in its frost forme", ->
@pokemon.forme = "frost"
@checkMoveset(4, [ "Blizzard" ]).should.be.true
it "Gen 5: learns Blizzard in its frost forme", ->
@pokemon.forme = "frost"
@checkMoveset(5, [ "Blizzard" ]).should.be.true
it "Gen 4: learns Leaf Storm in its mow forme", ->
@pokemon.forme = "mow"
@checkMoveset(4, [ "Leaf Storm" ]).should.be.true
it "Gen 5: learns Leaf Storm in its mow forme", ->
@pokemon.forme = "mow"
@checkMoveset(5, [ "Leaf Storm" ]).should.be.true
it "Gen 4: learns Hydro Pump in its wash forme", ->
@pokemon.forme = "wash"
@checkMoveset(4, [ "Hydro Pump" ]).should.be.true
it "Gen 5: learns Hydro Pump in its wash forme", ->
@pokemon.forme = "wash"
@checkMoveset(5, [ "Hydro Pump" ]).should.be.true
it "Gen 4: cannot learn Blizzard in its default forme", ->
@checkMoveset(4, [ "Blizzard" ]).should.be.false
it "Gen 5: cannot learn Blizzard in its default forme", ->
@checkMoveset(5, [ "Blizzard" ]).should.be.false
it "Gen 4: cannot learn Blizzard in its heat forme", ->
@pokemon.forme = "heat"
@checkMoveset(4, [ "Blizzard", "Overheat" ]).should.be.false
it "Gen 5: cannot learn Blizzard in its heat forme", ->
@pokemon.forme = "heat"
@checkMoveset(5, [ "Blizzard", "Overheat" ]).should.be.false
it "Gen 4: must know Blizzard in its frost forme", ->
@pokemon.forme = "frost"
@checkMoveset(4, [ "Thunderbolt" ]).should.be.false
it "Gen 5: doesn't need to know Blizzard in its frost forme", ->
@pokemon.forme = "frost"
@checkMoveset(5, [ "Thunderbolt" ]).should.be.true
testLearnset "Deoxys", ->
it "learns alternate forme moves due to freely switching formes", ->
@pokemon.forme = "attack"
@checkMoveset(4, [ "Spikes" ]).should.be.true
testLearnset "Shaymin", ->
it "learns alternate forme moves due to freely switching formes", ->
@checkMoveset(4, [ "Air Slash" ]).should.be.true
testLearnset "Mamoswine", ->
it "cannot know 4 egg moves", ->
moveset = [ "Bite", "Fissure", "Curse", "Icicle Spear" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Yanmega", ->
it "cannot know 4 egg moves", ->
moveset = [ "Faint Attack", "Leech Life", "Whirlwind", "Reversal" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Tangrowth", ->
it "cannot know 4 egg moves", ->
moveset = [ "Amnesia", "Endeavor", "Leaf Storm", "Power Swap" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Mr. Mime", ->
it "cannot know 4 egg moves", ->
moveset = [ "Charm", "Healing Wish", "Fake Out", "Teeter Dance" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Ambipom", ->
it "cannot know 4 egg moves", ->
moveset = [ "Slam", "Covet", "Beat Up", "Pursuit" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Lickilicky", ->
it "cannot know 4 egg moves", ->
moveset = [ "Amnesia", "Curse", "Belly Drum", "Magnitude" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Roserade", ->
xit "cannot learn Spikes and Sleep Powder", ->
@checkMoveset(4, [ "Spikes", "Sleep Powder" ]).should.be.false
testLearnset "Celebi", ->
it "can learn Nasty Plot", ->
moveset = [ "Nasty Plot" ]
@checkMoveset(4, moveset).should.be.true
testLearnset "Banette", ->
it "can learn an event move but not an egg move", ->
moveset = [ "Cotton Guard", "Pursuit" ]
@checkMoveset(4, moveset).should.be.false
testLearnset "Gothitelle", ->
it "can inherit event moves from its pre-evos", ->
moveset = [ "Imprison" ]
@checkMoveset(5, moveset).should.be.true
testLearnset "Gengar", ->
it "learns Sludge Wave from dream world", ->
moveset = [ "Sludge Wave" ]
@checkMoveset(6, moveset).should.be.true
testLearnset "Clefable", ->
it "cannot learn Softboiled if it has Unaware", ->
@pokemon.ability = "Unaware"
moveset = [ "Softboiled" ]
@checkMoveset(6, moveset).should.be.false
it "can learn Softboiled normally", ->
moveset = [ "Softboiled" ]
@checkMoveset(6, moveset).should.be.true
testLearnset "Gliscor", ->
it "cannot learn Defog if it has Poison Heal", ->
@pokemon.ability = "Poison Heal"
moveset = [ "Defog" ]
@checkMoveset(6, moveset).should.be.false
describe "learnableMoves", ->
it "returns all possible learnable moves for a pokemon", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Deoxys"}, 6)
moves.should.containEql("Superpower")
it "returns event moves", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Genesect"}, 6)
moves.should.containEql("Shift Gear")
it "returns dream world moves", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Gengar"}, 6)
moves.should.containEql("Sludge Wave")
it "returns valid moves for battle-only formes", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Darmanitan", forme: "zen"}, 6)
# Only Darmanitan can learn this move; Darumaka can't.
moves.should.containEql("Bulk Up")
# Egg move.
moves.should.containEql("Encore")
it "does not take into account nonstandard learnsets", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Rotom"}, 6)
moves.should.not.containEql("Overheat")
moves.should.not.containEql("Leaf Storm")
moves.should.not.containEql("Hydro Pump")
moves.should.not.containEql("Blizzard")
moves.should.not.containEql("Air Slash")
it "lets pokemon learn nonstandard learnsets if they are of that forme", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Rotom", forme: "wash"}, 6)
moves.should.not.containEql("Overheat")
moves.should.not.containEql("Leaf Storm")
moves.should.containEql("Hydro Pump")
moves.should.not.containEql("Blizzard")
moves.should.not.containEql("Air Slash")
it "returns all moves except Struggle and Chatter if can learn Sketch", ->
learnableMoves = learnsets.learnableMoves.bind(learnsets, GenerationJSON)
moves = learnableMoves({species: "Smeargle"}, 6)
moves.should.not.containEql("Struggle")
moves.should.not.containEql("Chatter")
moves.should.containEql("Sacred Fire")
moves.should.containEql("Aeroblast")