BattleSim/client/app/js/helpers/team_parsing.coffee

263 lines
8.4 KiB
CoffeeScript

HiddenPower = (if module? then require('../../../../shared/hidden_power') else window.HiddenPower ?= {})
@PokeBattle ?= {}
@PokeBattle.parseTeam = (teamString) ->
text = teamString.split('\n')
team = []
pokemonRegex = /^(.*?)\s*(\(M\)|\(F\)|)?(?:\s*@\s*(.*))?$/
pokemon = null
for line in text
line = line.trim()
if line.length == 0
pokemon = null
else if !pokemon
[ all, pokemonLine, gender, item ] = line.match(pokemonRegex)
pokemon = {}
team.push(pokemon)
if pokemonLine.match(/(.*?)\s*\((.*)\)/)
pokemon.name = RegExp.$1
pokemonLine = RegExp.$2
convertNameToSpeciesAndForme(pokemon, pokemonLine.trim())
pokemon.gender = gender[1] if gender # (M) and (F)
pokemon.item = item if item
for olditem, newitem of Aliases.items
if olditem is pokemon.item
pokemon.item = newitem
else if line.match(/^(?:Trait|Ability):\s+(.*)$/i)
pokemon.ability = RegExp.$1
for oldability, newability of Aliases.abilities
if pokemon.ability is oldability
pokemon.ability = newability
else if line.match(/^Level:\s+(.*)$/i)
pokemon.level = Number(RegExp.$1) || 100
else if line.match(/^Happiness:\s+(.*)$/i)
pokemon.happiness = Number(RegExp.$1) || 0
else if line.match(/^Shiny: Yes$/i)
pokemon.shiny = true
else if line.match(/^EVs: (.*)$/i)
evs = RegExp.$1.split(/\//g)
pokemon.evs = {}
for ev in evs
ev = ev.trim()
[ numberString, rawStat ] = ev.split(/\s+/)
pokemon.evs[statsHash[rawStat]] = Number(numberString) || 0
else if line.match(/^IVs: (.*)$/i)
ivs = RegExp.$1.split(/\//g)
pokemon.ivs = {}
for iv in ivs
iv = iv.trim()
[ numberString, rawStat ] = iv.split(/\s+/)
pokemon.ivs[statsHash[rawStat]] = Number(numberString) || 0
else if line.match(/^([A-Za-z]+) nature/i)
pokemon.nature = RegExp.$1
else if line.match(/^[\-\~]\s*(.*)/)
moveName = RegExp.$1
for oldmove, newmove of Aliases.moves
if moveName is oldmove
moveName = newmove
if /Hidden Power /.test(moveName)
if !pokemon.ivs
moveName.match(/Hidden Power (.*)/i)
hiddenPowerType = RegExp.$1.trim().toLowerCase().replace(/\W+/g, '')
pokemon.ivs = HiddenPower.BW.ivs[hiddenPowerType] || {}
moveName = 'Hidden Power'
pokemon.moves ?= []
pokemon.moves.push(moveName)
return team
@PokeBattle.exportTeam = (json) ->
s = []
for pokemon in json
s.push("")
species = pokemon.species
if pokemon.forme && pokemon.forme != "default"
species += "-#{pokemon.forme[0].toUpperCase()}"
mainLine = []
if pokemon.name
mainLine.push(pokemon.name)
mainLine.push("(#{species})")
else
mainLine.push(species)
mainLine.push("(#{pokemon.gender})") if pokemon.gender
mainLine.push("@ #{pokemon.item}") if pokemon.item
s.push(mainLine.join(' '))
# Ability
s.push("Ability: #{pokemon.ability}") if pokemon.ability
# EVs
if pokemon.evs
evArray = for stat, amount of pokemon.evs when amount > 0
"#{amount} #{reverseStatsHash[stat]}"
s.push("EVs: #{evArray.join(" / ")}") if evArray.length > 0
# IVs
if pokemon.ivs
ivArray = for stat, amount of pokemon.ivs when amount < 31
"#{amount} #{reverseStatsHash[stat]}"
s.push("IVs: #{ivArray.join(" / ")}") if ivArray.length > 0
# Nature
s.push("#{pokemon.nature} nature") if pokemon.nature
# Level
s.push("Level: #{pokemon.level}") if pokemon.level && pokemon.level != 100
# Shiny
s.push("Shiny: Yes") if pokemon.shiny
# Happiness
if pokemon.happiness && pokemon.happiness != 100
s.push("Happiness: #{pokemon.happiness}")
# Moves
if pokemon.moves
s.push("- #{moveName}") for moveName in pokemon.moves
s.push("\n") # Trailing newlines, just in case.
s.join("\n")
Aliases =
moves:
"Ancient Power" : "AncientPower"
"Bubble Beam" : "BubbleBeam"
"Double Slap" : "DoubleSlap"
"Dragon Breath" : "DragonBreath"
"Dynamic Punch" : "DynamicPunch"
"Extreme Speed" : "ExtremeSpeed"
"Feint Attack" : "Faint Attack"
"Feather Dance" : "FeatherDance"
"Grass Whistle" : "GrassWhistle"
"High Jump Kick" : "Hi Jump Kick"
"Poison Powder" : "PoisonPowder"
"Sand Attack" : "Sand-Attack"
"Self-Destruct" : "Selfdestruct"
"Smelling Salts" : "SmellingSalt"
"Smokescreen" : "SmokeScreen"
"Soft-Boiled" : "Softboiled"
"Solar Beam" : "SolarBeam"
"Sonic Boom" : "SonicBoom"
"Thunder Punch" : "ThunderPunch"
"Thunder Shock" : "ThunderShock"
"Vice Grip" : "ViceGrip"
abilities:
"Compound Eyes" : "Compoundeyes"
"Lightning Rod" : "Lightningrod"
items:
"Balm Mushroom" : "BalmMushroom"
"Black Glasses" : "BlackGlasses"
"Bright Powder" : "BrightPowder"
"Deep Sea Scale" : "DeepSeaScale"
"Deep Sea Tooth" : "DeepSeaTooth"
"Energy Powder" : "EnergyPowder"
"Never-Melt Ice" : "NeverMeltIce"
"Paralyze Heal" : "Parlyz Heal"
"Rage Candy Bar" : "RageCandyBar"
"Silver Powder" : "SilverPowder"
"Thunder Stone" : "Thunderstone"
"Tiny Mushroom" : "TinyMushroom"
"Twisted Spoon" : "TwistedSpoon"
"X Defense" : "X Defend"
"X Sp. Atk" : "X Special"
statsHash =
'hp' : 'hp'
'Hp' : 'hp'
'HP' : 'hp'
'Atk' : 'attack'
'Def' : 'defense'
'SAtk' : 'specialAttack'
'SpA' : 'specialAttack'
'SDef' : 'specialDefense'
'SpD' : 'specialDefense'
'Spe' : 'speed'
'Spd' : 'speed'
reverseStatsHash =
'hp' : 'HP'
'attack' : 'Atk'
'defense' : 'Def'
'specialAttack' : 'SAtk'
'specialDefense' : 'SDef'
'speed' : 'Spe'
convertNameToSpeciesAndForme = (pokemon, species) ->
if species.match(/(Thundurus|Landorus|Tornadus)\-T(herian)?/i)
pokemon.species = RegExp.$1
pokemon.forme = 'therian'
else if species.match(/Shaymin-S(ky)?/i)
pokemon.species = "Shaymin"
pokemon.forme = 'sky'
else if species.match(/Giratina-O(rigin)?/i)
pokemon.species = "Giratina"
pokemon.forme = 'origin'
else if species.match(/Arceus(\-.*)?/)
pokemon.species = "Arceus"
else if species.match(/Kyurem-B(lack)?/)
pokemon.species = "Kyurem"
pokemon.forme = "black"
else if species.match(/Kyurem-W(hite)?/)
pokemon.species = "Kyurem"
pokemon.forme = "white"
else if species.match(/Rotom-W|Rotom-Wash/)
pokemon.species = "Rotom"
pokemon.forme = "wash"
else if species.match(/Rotom-S|Rotom-Fan/)
pokemon.species = "Rotom"
pokemon.forme = "fan"
else if species.match(/Rotom-H|Rotom-Heat/)
pokemon.species = "Rotom"
pokemon.forme = "heat"
else if species.match(/Rotom-F|Rotom-Frost/)
pokemon.species = "Rotom"
pokemon.forme = "frost"
else if species.match(/Rotom-C|Rotom-Mow/)
pokemon.species = "Rotom"
pokemon.forme = "mow"
else if species.match(/Deoxys-A|Deoxys-Attack/)
pokemon.species = "Deoxys"
pokemon.forme = "attack"
else if species.match(/Deoxys-D|Deoxys-Defense/)
pokemon.species = "Deoxys"
pokemon.forme = "defense"
else if species.match(/Deoxys-S|Deoxys-Speed/)
pokemon.species = "Deoxys"
pokemon.forme = "speed"
else if species.match(/Basculin-Blue-Striped|Basculin-A/)
pokemon.species = "Basculin"
pokemon.forme = "blue-striped"
else if species.match(/Keldeo-Resolute|Keldeo-R/)
pokemon.species = "Keldeo"
pokemon.forme = "resolute"
else if species.match(/Shellos-East/)
pokemon.species = "Shellos"
# TODO: Read east forme
pokemon.forme = "default"
else if species.match(/Gastrodon-East/)
pokemon.species = "Gastrodon"
# TODO: Read east forme
pokemon.forme = "default"
else if species.match(/Wormadam-Sandy|Wormadam-G/)
pokemon.species = "Wormadam"
pokemon.forme = "sandy"
else if species.match(/Wormadam-Trash|Wormadam-S/)
pokemon.species = "Wormadam"
pokemon.forme = "trash"
else if species.match(/Deerling-.*/)
pokemon.species = "Deerling"
# TODO: Read other formes
pokemon.forme = null
else if species.match(/Sawsbuck-.*/)
pokemon.species = "Sawsbuck"
# TODO: Read other formes
pokemon.forme = null
else if species.match(/Unown-.*/)
pokemon.species = "Unown"
# TODO: Read other formes
pokemon.forme = null
else
pokemon.species = species