// ROTATE -> POWER -> WAITING -> SHOOT -> COOLDOWN
 public void ChangeCannonState(CannonGroups cannonGroups)
 {
     if (cannonGroups.cannonState == CannonState.ROTATE)
         cannonGroups.cannonState = CannonState.POWER;
     else if (cannonGroups.cannonState == CannonState.POWER)
         cannonGroups.cannonState = CannonState.WAITING;
     else if (cannonGroups.cannonState == CannonState.WAITING)
         cannonGroups.cannonState = CannonState.SHOOT;
     else if (cannonGroups.cannonState == CannonState.SHOOT)
         cannonGroups.cannonState = CannonState.COOLDOWN;
     else if (cannonGroups.cannonState == CannonState.COOLDOWN)
         cannonGroups.cannonState = CannonState.ROTATE;
 }
        public GameObjectFactory ManipulateCannons(GameObjectFactory factory, CannonGroups cannonGroups)
        {
            if (cannonGroups.cannonState == CannonState.ROTATE)
                {
                            //decide whether to rotate one way or back
                    if (factory.Objects[cannonGroups.cannonKey].sprite.Rotation >= factory.Objects[cannonGroups.cannonKey].sprite.LowerRotationBounds)
                        factory.Objects[cannonGroups.cannonKey].sprite.rotationDirection = -1;
                    if (factory.Objects[cannonGroups.cannonKey].sprite.Rotation <= factory.Objects[cannonGroups.cannonKey].sprite.UpperRotationBounds)
                        factory.Objects[cannonGroups.cannonKey].sprite.rotationDirection = 1;

                 

                    factory.Objects[cannonGroups.cannonKey].sprite.Rotation += ((MathHelper.PiOver4 / 16) * factory.Objects[cannonGroups.cannonKey].sprite.rotationDirection);
                        

                }
            if (cannonGroups.cannonState == CannonState.POWER)
                {

                    if (factory.Objects[cannonGroups.barKey].sprite.Location.X > factory.Objects[cannonGroups.tabKey].sprite.Location.X)
                    {
                        Direction = 1;
                    }
                    else if (factory.Objects[cannonGroups.barKey].sprite.Location.X + factory.Objects[cannonGroups.barKey].sprite.BoundingBoxRect.Width - factory.Objects[cannonGroups.tabKey].sprite.BoundingBoxRect.Width < factory.Objects[cannonGroups.tabKey].sprite.Location.X)
                    {
                        Direction = -1;
                    }
                    factory.Objects[cannonGroups.tabKey].sprite.Location += new Vector2(10 * Direction, 0);
                        
                }
            if (cannonGroups.cannonState == CannonState.SHOOT)
                {
                    ShootDoggy(factory, cannonGroups);
                    ChangeCannonState(cannonGroups);
                }

            if (cannonGroups.cannonState == CannonState.COOLDOWN)
            {
                if (factory.Objects[cannonGroups.boomKey].sprite.Dead)
                {
                    ChangeCannonState(cannonGroups); 
                }
            }

            return factory;
        }
        public GameObjectFactory ShootDoggy(GameObjectFactory factory, CannonGroups cannonGroup)
        {
            List<int> temp = new List<int>();
            //figure out which cannon to shoot from
            //replace once just pass which cannon
            //endreplace

            

                //dog
                int dog = factory.Create(
                    (int)RaginRovers.GameObjectTypes.DOG,
                    factory.Objects[cannonGroup.cannonKey].sprite.Location + new Vector2(30, 0),
                    "spritesheet",
                    Vector2.Zero,
                    cannonGroup.Rotation,
                    0,
                    0);

                factory.Objects[dog].sprite.OnCollision += new OnCollisionEventHandler(CollisionEvents.dog_OnCollision);

                if (factory.Objects[cannonGroup.cannonKey].sprite.Location.X > 6000)
                    factory.Objects[dog].sprite.PlayerNumber = 2; 
                if (factory.Objects[cannonGroup.cannonKey].sprite.Location.X < 6000)
                    factory.Objects[dog].sprite.PlayerNumber = 1;

                if (cannonGroup.isFlipped)
                {
                    factory.Objects[dog].sprite.flipType  = Sprite.FlipType.VERTICAL;
                }

                factory.Objects[dog].sprite.PhysicsBody.LinearVelocity = new Vector2(
                        cannonPower * (float)Math.Cos((double)cannonGroup.Rotation),
                        cannonPower * (float)Math.Sin((double)cannonGroup.Rotation));

                //chaning magnitude depending on power bar
                factory.Objects[dog].sprite.PhysicsBody.LinearVelocity *= cannonGroup.Power; // ((factory.Objects[cannonGroup.tabKey].sprite.Location.X - factory.Objects[cannonGroup.barKey].sprite.Location.X) / factory.Objects[cannonGroup.barKey].sprite.BoundingBoxRect.Width) + 1;

                factory.Objects[cannonGroup.boomKey].sprite.Dead = false;
                cannonGroup.boomTime = 0f;

                factory.Objects[dog].sprite.PhysicsBody.Mass = 30;
                factory.Objects[dog].sprite.PhysicsBody.Restitution = 0.4f;

                //factory.Objects[cannonGroup.boomKey].sprite.Rotation = factory.Objects[cannonGroup.cannonKey].sprite.Rotation;
                factory.Objects[cannonGroup.boomKey].sprite.Location = factory.Objects[cannonGroup.cannonKey].sprite.Location - factory.Objects[cannonGroup.boomKey].sprite.Origin + new Vector2(0, -150) + factory.Objects[dog].sprite.PhysicsBody.LinearVelocity / factory.Objects[dog].sprite.PhysicsBody.LinearVelocity.Length() * 200;
                

            return factory;
        }