Here are my Send Out and Return which I would guess switch would be a similar process... So you can use these to help with your example if you plan to give me one.
SendOut(var/mob/M as mob in contents2)
set name="Send Out"
set category="Pokemon Commands"
if(usr.pokemonout==0)
if(M.Faint)
usr<< output("This Pokemon is fainted","default.BattleInfo")
else
M.loc = locate(usr.x,usr.y,usr.z)
view() << output("[src.key] says: Go, [M.name]","default.BattleInfo")
usr.icon = M.icon
usr.icon_state=M.icon_state
M.icon = src.Picon
contents2 -= M
usr.pokemonout=1
usr.HP = M.HP
usr.MHP = M.MHP
usr.Level = M.Level
usr.EXP = M.EXP
usr.NEXP = M.NEXP
usr.Attack = M.Attack
usr.Defense = M.Defense
usr.SAttack = M.SAttack
usr.SDefense = M.SDefense
usr.AttackName = M.AttackName
usr.AttackD = M.AttackD
usr.GoodS = M.GoodS
usr.BadS = M.BadS
usr.First=1
usr.Species = M.Species
usr.EvolutionLevel = M.EvolutionLevel
usr.EvolutionName = M.EvolutionName
usr.EvolutionSpecies = M.EvolutionSpecies
usr.EvolutionIcon = M.EvolutionIcon
usr.EvolutionEvolutionLevel = M.EvolutionEvolutionLevel
usr.EvolutionEvolutionName = M.EvolutionEvolutionName
usr.EvolutionEvolutionSpecies = M.EvolutionEvolutionSpecies
usr.EvolutionEvolutionIcon = M.EvolutionEvolutionIcon
usr.EvolutionAttackName = M.EvolutionAttackName
usr.EvolutionEvolutionAttackName = M.EvolutionEvolutionAttackName
usr.EvolutionAttackD = M.EvolutionAttackD
usr.EvolutionEvolutionAttackD = M.EvolutionEvolutionAttackD
usr.EvolutionEvolutionEvolutionLevel = M.EvolutionEvolutionEvolutionLevel
usr.EvolutionEvolutionAttackD2 = M.EvolutionEvolutionAttackD2
M.Rank2 = usr.Rank2
usr.TempName=M.name
usr.SentOut += M
usr.IsAPokemon="Yes"
src.verbs += typesof(/mob/Pokemon/verb)
if(usr.AttackName=="Thundershock")
src.verbs += typesof(/mob/Pikachu/Thundershock/verb)
if(usr.AttackName=="Absorb")
src.verbs += typesof(/mob/Oddish/Absorb/verb)
if(usr.AttackName=="Mega Drain")
src.verbs += typesof(/mob/Gloom/MegaDrain/verb)
if(usr.AttackName=="Giga Drain")
src.verbs += typesof(/mob/Vileplume/GigaDrain/verb)
if(usr.AttackName=="Leaf Storm")
src.verbs += typesof(/mob/Bellossom/LeafStorm/verb)
usr.AttackD = M.EvolutionEvolutionAttackD2
if(usr.AttackName=="Ember")
src.verbs += typesof(/mob/Charmander/Ember/verb)
if(usr.AttackName=="Flamethrower")
src.verbs += typesof(/mob/Charmeleon/Flamethrower/verb)
if(usr.AttackName=="Fire Blast")
src.verbs += typesof(/mob/Charizard/FireBlast/verb)
if(usr.AttackName=="Bubble")
src.verbs += typesof(/mob/Squirtle/Bubble/verb)
if(usr.AttackName=="Vine Whip")
src.verbs += typesof(/mob/Bulbasaur/VineWhip/verb)
if(usr.AttackName=="Water Gun")
src.verbs += typesof(/mob/Wartortle/WaterGun/verb)
if(usr.AttackName=="Razor Leaf")
src.verbs += typesof(/mob/Ivysaur/RazorLeaf/verb)
if(usr.AttackName=="Hydro Pump")
src.verbs += typesof(/mob/Blastoise/HydroPump/verb)
if(usr.AttackName=="Magical Leaf")
src.verbs += typesof(/mob/Venusaur/MagicalLeaf/verb)
if(usr.AttackName=="Rock Blast")
src.verbs += typesof(/mob/Rhyhorn/RockBlast/verb)
if(usr.AttackName=="Stone Edge")
if(usr.Species=="Rhydon")
src.verbs += typesof(/mob/Rhydon/StoneEdge/verb)
else
if(usr.Species=="Rampardos")
src.verbs += typesof(/mob/Rampardos/StoneEdge/verb)
if(usr.AttackName=="Ancientpower")
src.verbs += typesof(/mob/Aerodactyl/Ancientpower/verb)
if(usr.AttackName=="Rock Slide")
src.verbs += typesof(/mob/Cranidos/RockSlide/verb)
if(usr.AttackName=="Dark Pulse")
src.verbs += typesof(/mob/Lucario/DarkPulse/verb)
if(usr.AttackName=="Focus Blast")
if(usr.Species=="Riolu")
src.verbs += typesof(/mob/Riolu/FocusBlast/verb)
else
if(usr.Species=="Mankey")
src.verbs += typesof(/mob/Mankey/FocusBlast1/verb)
if(usr.AttackName=="Secret Power")
if(usr.Species=="Primeape")
src.verbs += typesof(/mob/Primeape/SecretPower/verb)
else
if(usr.Species=="Persian")
src.verbs += typesof(/mob/Persian/SecretPower/verb)
if(usr.AttackName=="RazorWind")
src.verbs += typesof(/mob/Absol/RazorWind/verb)
if(usr.AttackName=="Swift")
src.verbs += typesof(/mob/Meowth/Swift/verb)
if(usr.AttackName=="Discharge")
src.verbs += typesof(/mob/Magnemite/Discharge/verb)
if(usr.AttackName=="Zap Cannon")
src.verbs += typesof(/mob/Magneton/ZapCannon/verb)
if(usr.AttackName=="Magnet Bomb")
src.verbs += typesof(/mob/Magnezone/MagnetBomb/verb)
else
usr<< output("You can not have more than one Pokemon out at a time","default.BattleInfo")
return
Return(var/mob/M as mob in world)
set name="Return Pokemon"
set category="Pokemon Commands"
if(M.owner != "[usr.name]")
usr<<"That is not your Pokemon"
else
usr.loc = locate(M.x,M.y,M.z)
M.icon = usr.icon
M.icon_state=usr.icon_state
usr.icon = src.Picon
usr.icon_state = ""
M.loc = null
contents2 += M
usr.pokemonout=0
usr<< output("[M.name] returned","default.BattleInfo")
M.HP = usr.HP
M.MHP = usr.MHP
M.Level = usr.Level
M.EXP = usr.EXP
M.NEXP = usr.NEXP
M.Attack = usr.Attack
M.Defense = usr.Defense
M.SAttack = usr.SAttack
M.Species = usr.Species
M.EvolutionLevel = usr.EvolutionLevel
M.EvolutionName = usr.EvolutionName
M.EvolutionSpecies = usr.EvolutionSpecies
M.EvolutionIcon = usr.EvolutionIcon
usr.EvolutionLevel=0
usr.EvolutionName=""
usr.EvolutionSpecies=""
usr.EvolutionIcon=""
M.EvolutionEvolutionLevel = usr.EvolutionEvolutionLevel
M.EvolutionEvolutionName = usr.EvolutionEvolutionName
M.EvolutionEvolutionSpecies = usr.EvolutionEvolutionSpecies
M.EvolutionEvolutionIcon = usr.EvolutionEvolutionIcon
M.EvolutionEvolutionAttackD2 = usr.EvolutionEvolutionAttackD2
usr.EvolutionEvolutionLevel=0
usr.EvolutionEvolutionName=""
usr.EvolutionEvolutionSpecies=""
usr.EvolutionEvolutionIcon=""
usr.EvolutionEvolutionAttackD2 = 0
M.EvolutionAttackName = usr.EvolutionAttackName
M.EvolutionEvolutionAttackName = usr.EvolutionEvolutionAttackName
M.EvolutionAttackD = usr.EvolutionAttackD
M.EvolutionEvolutionAttackD = usr.EvolutionEvolutionAttackD
M.EvolutionEvolutionEvolutionLevel=0
usr.EvolutionAttackName = ""
usr.EvolutionEvolutionAttackName = ""
usr.EvolutionAttackD = 0
usr.EvolutionEvolutionAttackD = 0
usr.EvolutionEvolutionEvolutionLevel=0
M.SDefense = usr.SDefense
M.AttackName = "[usr.AttackName]"
M.AttackD = usr.AttackD
usr.HP=0
usr.Level=0
usr.EXP=0
usr.NEXP=0
usr.Attack=0
usr.Defense=0
usr.SAttack=0
usr.SDefense=0
usr.AttackName=""
usr.AttackD=0
usr.GoodS=""
usr.BadS=""
usr.First=0
M.name = usr.TempName
M.Rank2="Pokemon"
usr.TempName=""
usr.SentOut -= M
usr.IsAPokemon="No"
src.verbs -= typesof(/mob/Pokemon/verb)
src.verbs -= typesof(/mob/Pikachu/Thundershock/verb)
src.verbs -= typesof(/mob/Oddish/Absorb/verb)
src.verbs -= typesof(/mob/Gloom/MegaDrain/verb)
src.verbs -= typesof(/mob/Vileplume/GigaDrain/verb)
src.verbs -= typesof(/mob/Bellossom/LeafStorm/verb)
src.verbs -= typesof(/mob/Charmander/Ember/verb)
src.verbs -= typesof(/mob/Charmeleon/Flamethrower/verb)
src.verbs -= typesof(/mob/Charizard/FireBlast/verb)
src.verbs -= typesof(/mob/Squirtle/Bubble/verb)
src.verbs -= typesof(/mob/Bulbasaur/VineWhip/verb)
src.verbs -= typesof(/mob/Wartortle/WaterGun/verb)
src.verbs -= typesof(/mob/Ivysaur/RazorLeaf/verb)
src.verbs -= typesof(/mob/Blastoise/HydroPump/verb)
src.verbs -= typesof(/mob/Venusaur/MagicalLeaf/verb)
src.verbs -= typesof(/mob/Rhyhorn/RockBlast/verb)
src.verbs -= typesof(/mob/Rhydon/StoneEdge/verb)
src.verbs -= typesof(/mob/Aerodactyl/Ancientpower/verb)
src.verbs -= typesof(/mob/Rampardos/StoneEdge/verb)
src.verbs -= typesof(/mob/Cranidos/RockSlide/verb)
src.verbs -= typesof(/mob/Lucario/DarkPulse/verb)
src.verbs -= typesof(/mob/Riolu/FocusBlast/verb)
src.verbs -= typesof(/mob/Mankey/FocusBlast1/verb)
src.verbs -= typesof(/mob/Primeape/SecretPower/verb)
src.verbs -= typesof(/mob/Absol/RazorWind/verb)
src.verbs -= typesof(/mob/Persian/SecretPower/verb)
src.verbs -= typesof(/mob/Meowth/Swift/verb)
src.verbs -= typesof(/mob/Magnemite/Discharge/verb)
src.verbs -= typesof(/mob/Magneton/ZapCannon/verb)
src.verbs -= typesof(/mob/Magnezone/MagnetBomb/verb)
src.SaveFile()
But I'm curious, your attacks are done like:
src.verbs += typesof(/mob/Pikachu/Thundershock/verb)
What about something like Voltorb, which also has the thundershock attack? If that's the case, you're doing a lot of repeat code there.
Have you considered separating attacks into separate datums that reflect what they are? There are no doubt other methods to do this as well. But just as food for thought:
Or if you you want to combine the datums even further, you could perhaps get away with something like this:
No doubt there are even better methods out there to contain the element specific attacks. Just some food for thought.