public static move_DmgReport specialAttacks(string name, float baseDamage)
        {
            damage = baseDamage;
            string tempname = name.ToLower();
            int rnd;
            bool isHit = false;
            switch (tempname)
            {
                default:
                    Debug.Log("No special attack with name " + name + " found");
                    break;

                case "absorb":
                    heal = damage / 2f;
                    break;

                case "acid":
                    isHit = FBG_Atk_Methods.Chance_100(10);
                    if (isHit)
                    {
                        FBG_Atk_Methods.changeStats(FBG_consts.spDefense, -1, target);
                        stageName = FBG_consts.spDefense;
                        stageDiff = -1;
                    }
                    break;

                case "aurora beam":
                    isHit = FBG_Atk_Methods.Chance_100(10);
                    if (isHit)
                    {
                        FBG_Atk_Methods.changeStats(FBG_consts.attack, -1, target);
                        stageName = FBG_consts.attack;
                        stageDiff = -1;
                    }
                    break;

                case "blizzard":
                    FBG_Atk_Methods.isFrozen(target, 10);
                    break;

                case "bubble":
                    isHit = FBG_Atk_Methods.Chance_100(10);
                    if (isHit)
                    {
                        FBG_Atk_Methods.changeStats(FBG_consts.speed, -1, target);
                        stageName = FBG_consts.speed;
                        stageDiff = -1;
                    }
                    break;

                case "bubble beam":
                    isHit = FBG_Atk_Methods.Chance_100(10);
                    if (isHit)
                    {
                        FBG_Atk_Methods.changeStats(FBG_consts.speed, -1, target);
                        stageName = FBG_consts.speed;
                        stageDiff = -1;
                    }
                    break;

                case "confusion":
                    rnd = UnityEngine.Random.Range(1, 4);
                    FBG_Atk_Methods.isConfused(target, 10, rnd);
                    break;

                case "dragon rage":
                    ignoreLightScreen = true;
                    damage = 40;
                    break;

                case "dream eater":
                    damage = FBG_Atk_Methods.dreamEater(target, damage, moveRes);
                    break;

                case "ember":
                    FBG_Atk_Methods.isBurned(target, 10);
                    break;

                case "fire blast":
                    FBG_Atk_Methods.isBurned(target, 10);
                    break;

                case "fire spin":           //Damages the target for 4-5 turns
                    rnd = Random.Range(4, 5);
                    float fSpingDmg = target.maxHP / 16f;
                    target.team.addBind(rnd, fSpingDmg);
                    break;

                case "flamethrower":
                    FBG_Atk_Methods.isBurned(target, 10);
                    break;

                case "gust":
                    if(target.position == pokemonPosition.flying)
                    {
                        damage *= 2f;
                    }
                    break;

                case "hydro pump":          //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "hyper beam":          //cannot move next turn
                    damage = FBG_Atk_Methods.ReChargeMove(self, name, baseDamage);
                    break;

                case "ice beam":
                    FBG_Atk_Methods.isFrozen(target, 10);
                    break;

                case "mega drain":
                    heal = Mathf.Round(damage / 2f);
                    break;

                case "night shade":
                    damage = FBG_Atk_Methods.levelBasedDamage(target);
                    break;

                case "petal dance":         //attacks for 2-3 turns, cannot be switched out, then becomes confused
                    int dur = Random.Range(2, 3);
                    repeatAttack_Confused petalDance = new repeatAttack_Confused(tempname, dur, self);
                    if (!FBG_Atk_Methods.hasEffector(self, tempname))
                    {
                        self.effectors.Add(petalDance);
                    }
                    break;

                case "psybeam":
                    rnd = UnityEngine.Random.Range(1, 4);
                    FBG_Atk_Methods.isConfused(target, 10, rnd);
                    break;

                case "psychic":
                    isHit = FBG_Atk_Methods.Chance_100(10);
                    if (isHit)
                    {
                        FBG_Atk_Methods.changeStats(FBG_consts.spDefense, -1, target);
                        stageName = FBG_consts.spDefense;
                        stageDiff = -1;
                    }
                    break;

                case "psywave":
                    float mod = UnityEngine.Random.Range(.5f, 1.5f);
                    damage = FBG_Atk_Methods.levelBasedDamage(target) * mod;
                    break;

                case "razor wind":          //charges the first turn then attacks the second
                    damage = FBG_Atk_Methods.ChargingMove(self, name, baseDamage);
                    break;

                case "sludge":              //30% chance to poison the target
                    FBG_Atk_Methods.isPosioned(target, 30);
                    break;

                case "smog":                //40% chance to poison the target
                    FBG_Atk_Methods.isPosioned(target, 40);
                    break;

                case "solar beam":          //charges on the fist turn, hits on the second
                    damage = FBG_Atk_Methods.ChargingMove(self, name, baseDamage);
                    break;

                case "sonic boom":
                    damage = FBG_Atk_Methods.sonicBoom(target);
                    break;

                case "surf":                //does double damage if the pokemon used dive(introduced in gen3)
                    break;

                case "swift":               //ignores evasiveness and accuracy
                    break;

                case "thunder":
                    FBG_Atk_Methods.isParalized(target, 30);
                    break;

                case "thunder shock":
                    FBG_Atk_Methods.isParalized(target, 10);
                    break;

                case "thunderbolt":
                    FBG_Atk_Methods.isParalized(target, 10);
                    break;

                case "tri attack":          //6.67% chance for each
                    rnd = UnityEngine.Random.Range(4, 5);
                    FBG_Atk_Methods.isParalized(target, 6.67f);
                    FBG_Atk_Methods.isBurned(target, 6.67f);
                    FBG_Atk_Methods.isFrozen(target, 6.67f);
                    break;

                case "water gun":           //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

            }
            //Check for lightscreen to halve special attack damage

            Debug.Log(string.Format(" dmg {0} heal {1} recoil {2} stageName {3} stageDiff {4}", damage, heal, recoil, stageName, stageDiff));

            if(target.team.hasLightScreen && !ignoreLightScreen)
            {
                Debug.Log("halving damage because of light screen");
                damage /= 2f;
            }

            move_DmgReport report = new move_DmgReport(damage, heal, recoil, stageName, stageDiff);
            return report;
        }
        public static move_DmgReport physicalAttacks(string name, float baseDamage)
        {
            damage = baseDamage;
            string tempname = name.ToLower();
            bool isHit = false;
            int rnd;
            switch (tempname)
            {
                default:
                    Debug.LogError("No physical attack with name " + name.ToLower() + " found");
                    break;

                case "barrage":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "bide":                //waits 2 turns then deals back double.... :(
                    if(self.atkStatus == attackStatus.normal)
                    {

                        self.cachedDamage += (baseDamage * 2f);
                        self.atkStatus = attackStatus.charging_2;
                        self.nextAttack = "bide";
                    }
                    else if(self.atkStatus == attackStatus.charging_2)
                    {

                        self.atkStatus = attackStatus.charging;
                        self.cachedDamage += (baseDamage * 2f);
                        self.nextAttack = "bide";

                    }
                    else if(self.atkStatus == attackStatus.charging)
                    {
                        ignoreReflect = true;
                        self.atkStatus = attackStatus.normal;
                        damage = self.cachedDamage;
                        self.cachedDamage = 0;
                    }

                    break;

                case "bind":                //need to create a damage over time effect here for rndBind turns
                    rnd = Random.Range(4, 5);
                    float bindDmg = target.maxHP / 16f;
                    target.team.addBind(rnd, bindDmg);
                    break;

                case "bite":
                    FBG_Atk_Methods.isFlinched(target, 30);
                    break;

                case "body slam":
                    FBG_Atk_Methods.isParalized(target, 30);
                    break;

                case "bone club":
                    FBG_Atk_Methods.isFlinched(target, 10);
                    break;

                case "bonemerang":
                    rnd = 2;
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "clamp":               //traps for 4-5 turns dealing 1/16th damage
                    rnd = Random.Range(4, 5);
                    float clampDmg = target.maxHP / 16f;
                    target.team.addBind(rnd, clampDmg);
                    break;

                case "comet punch":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "constrict":
                    isHit = FBG_Atk_Methods.Chance_100(10);
                    if (isHit)
                    {
                        FBG_Atk_Methods.changeStats(FBG_consts.speed, -1, target);
                        stageName = FBG_consts.speed;
                        stageDiff = -1;
                    }
                    break;

                case "counter":             //hits back with 2x power iff is hit with physical attack
                    ignoreReflect = true;
                    //check that it attacks second
                    if (self.Speed < target.Speed)
                    {
                        int index = FBG_BattleSimulator.moveHistory.Count;
                        if (FBG_BattleSimulator.moveHistory[index].atkCategory == FBG_consts.Physical)
                         {
                            damage *= 2;
                        }
                    }
                    break;

                case "crabhammer":          //has a 1/8 crit ratio not a 1/16.... have to recalculate for this
                    break;

                case "cut":                 //no additional effects
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "dig":                 //redo based off of turn controller

                    if(self.atkStatus == attackStatus.normal)
                    {
                        self.position = pokemonPosition.underground;
                        self.atkStatus = attackStatus.charging;
                        self.cachedDamage = baseDamage;
                        self.nextAttack = "dig";

                    }else if(self.atkStatus == attackStatus.charging)
                    {
                        damage = self.cachedDamage;
                        self.position = pokemonPosition.normal;
                        self.atkStatus = attackStatus.normal;
                        self.cachedDamage = 0;
                    }
                    break;

                case "dizzy punch":
                    rnd = UnityEngine.Random.Range(1, 4);
                    FBG_Atk_Methods.isConfused(target, 20, rnd);
                    break;

                case "double kick":
                    rnd = 2;
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "double slap":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "double edge":
                    recoil = Mathf.Round(damage / 3f);
                    break;

                case "drill peck":          //no additional effects
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "earthquake":
                    damage = FBG_Atk_Methods.earthQuake(target, damage);
                    break;

                case "egg bomb":            //no additional effects
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "explosion":           //causes user to faint
                    recoil = self.maxHP;
                    break;

                case "fire punch":
                    FBG_Atk_Methods.isBurned(target, 10);
                    break;

                case "fissure":
                    FBG_Atk_Methods.oneHitKO(target, self, moveRes);
                    break;

                //*****************************************//
                case "fly":
                    if (self.atkStatus == attackStatus.normal)
                    {
                        self.position = pokemonPosition.flying;
                        self.atkStatus = attackStatus.charging;
                        self.cachedDamage = baseDamage;
                        self.nextAttack = "fly";

                    }else if(self.atkStatus == attackStatus.charging)
                    {
                        damage = self.cachedDamage;
                        self.position = pokemonPosition.normal;
                        self.atkStatus = attackStatus.normal;
                        self.cachedDamage = 0;
                    }
                    break;

                case "fury attack":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "fury swipes":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "guillotine":
                    FBG_Atk_Methods.oneHitKO(target, self, moveRes);
                    break;

                case "headbutt":
                    FBG_Atk_Methods.isFlinched(target, 30);
                    break;

                case "high jump kick":      //if this misses it casues 1/2 of the damage it would have inflicted on the user
                    if (!moveRes.hit)
                    {
                        recoil = damage / 2f;
                    }
                    break;

                case "horn attack":         //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "horn drill":
                    FBG_Atk_Methods.oneHitKO(target, self, moveRes);
                    break;

                case "hyper fang":
                    FBG_Atk_Methods.isFlinched(target, 10);
                    break;

                case "ice punch":
                    FBG_Atk_Methods.isFrozen(target, 10);
                    break;

                case "jump kick":           //lose 1/2 hp is the user misses just like high jump kick
                    if (!moveRes.hit)
                    {
                        recoil = damage / 8f;
                    }
                    break;

                case "karate chop":         //high crit ratio 1/8 versus 1/16
                    break;

                case "leech life":
                    heal = Mathf.Round(damage / 2f);
                    break;

                case "low kick":
                    FBG_Atk_Methods.isFlinched(self, 30);
                    break;

                case "mega kick":           //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "mega punch":          //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "pay day":             //small amount of money at the end of the battle??
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "peck":                //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "pin missile":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "poison sting":        //chance to poison the target
                    FBG_Atk_Methods.isPosioned(target, 30);
                    break;

                case "pound":               //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "quick attack":        //has +1 priority
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "rage":
                    repeatAttack_Confused rage = new repeatAttack_Confused(tempname, 1, self);
                    for (int i = 0; i < self.effectors.Count; i++)
                    {
                        if (self.effectors[i].name == tempname)
                        {
                            self.effectors[i].duration = 1;
                        }
                    }
                    self.effectors.Add(rage);
                    break;

                case "razor leaf":          //high crit ratio
                    break;

                case "rock slide":
                    FBG_Atk_Methods.isFlinched(target, 30);
                    break;

                case "rock throw":          //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "rolling kick":
                    FBG_Atk_Methods.isFlinched(target, 30);
                    break;

                case "scratch":             //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "seismic toss":
                    damage = FBG_Atk_Methods.levelBasedDamage(target);
                    break;

                case "self destruct":       //user faints
                    recoil = self.maxHP;
                    break;

                case "skull bash":          //charges first turn, raising defense, hits on the second turn
                    if (self.atkStatus == attackStatus.normal)
                    {
                        self.atkStatus = attackStatus.charging;
                        self.cachedDamage = baseDamage;
                        self.nextAttack = "skull bash";
                        FBG_Atk_Methods.changeStats(FBG_consts.defense, 1, self);
                        stageName = FBG_consts.defense;
                        stageDiff = 1;

                    }else if(self.atkStatus == attackStatus.charging)
                    {
                        self.atkStatus = attackStatus.normal;
                        damage = self.cachedDamage;
                        self.cachedDamage = 0;
                    }
                    break;

                case "sky attack":          //charges on first turn, hits on second, 30% flinch chance
                    if(self.atkStatus == attackStatus.normal)
                    {
                        self.atkStatus = attackStatus.charging;
                        self.cachedDamage = baseDamage;
                        self.nextAttack = "sky attack";
                    }
                    if (self.atkStatus == attackStatus.charging)
                    {
                        self.atkStatus = attackStatus.normal;
                        damage = self.cachedDamage;
                        FBG_Atk_Methods.isFlinched(target, 30);
                        self.cachedDamage = 0;
                    }
                    break;

                case "slam":                //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "slash":               //high crit ratio 1/8 not 1/16
                    break;

                case "spike cannon":
                    rnd = UnityEngine.Random.Range(2, 5);
                    damage = FBG_Atk_Methods.multiAttack(rnd, name);
                    break;

                case "stomp":               //if minimized *2 damage
                    if(target.position == pokemonPosition.minimized)
                    {
                        damage *= 2f;
                    }
                    FBG_Atk_Methods.isFlinched(target, 30);
                    break;

                case "strength":            //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "struggle":            //hurts the user if all the pp are gone
                    recoil = self.maxHP / 4f;
                    break;

                case "submission":
                    recoil = Mathf.Round(damage / 4f);
                    break;

                case "super fang":
                    ignoreReflect = true;
                    damage = target.curHp / 2f;
                    break;

                case "tackle":              //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "take down":
                    recoil = Mathf.Round(damage / 4f);
                    break;

                case "thrash":              //attacks for 2-3 turns, but cannot switch out or use a different attack
                    int dur = Random.Range(2, 3);
                    repeatAttack_Confused thrash = new repeatAttack_Confused(tempname, dur, self);
                    if(!FBG_Atk_Methods.hasEffector(self, tempname))
                    {
                        self.effectors.Add(thrash);
                    }
                    break;

                case "thunder punch":
                    FBG_Atk_Methods.isParalized(target, 10);
                    break;

                case "twineedle":           //20% chance to poison the target
                    FBG_Atk_Methods.multiAttack(2, name);
                    FBG_Atk_Methods.isPosioned(target, 20);
                    break;

                case "vice grip":           //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "vine whip":           //no additional effect
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;

                case "waterfall":
                    FBG_Atk_Methods.isFlinched(target, 20);
                    break;

                case "wing attack":         //no additional effect, can hit non-adjacent pokemon in triple battles
                    FBG_Atk_Methods.noAdditionalEffect();
                    break;
                //**************************************//
                case "wrap":                //causes 1/16th damage for 4-5 turns
                    rnd = UnityEngine.Random.Range(4, 5);
                    break;
            }

            if(target.team.hasReflect && !ignoreReflect)
            {
                damage /= 2f;
            }

            Debug.Log(string.Format(" dmg {0} heal {1} recoil {2} stageName {3} stageDiff {4}", damage, heal, recoil, stageName, stageDiff));

            move_DmgReport report = new move_DmgReport(damage, heal, recoil, stageName, stageDiff);
            return report;
        }