/// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // Create title and gameover screens
            introScreen = new GameScreen(this, Content.Load<Texture2D>("textures/titleScreen"), 10.0f);
            gameoverScreen = new GameOverGameScreen(this, Content.Load<Texture2D>("textures/gameoverScreen"), 3.0f);

            // Create main game related stuff
            world = new World();
            world.Load();
            // load textures
            playerTexture = Content.Load<Texture2D>("textures/playerTexture");
            backgroundTexture = Content.Load<Texture2D>("Background/Background_1");
            backgroundTexture2 = Content.Load<Texture2D>("Background/Background_2");
            backgroundTexture3 = Content.Load<Texture2D>("Background/Background_3");
            this.black = Content.Load<Texture2D>("black");
            this.noise = Content.Load<Texture2D>("noise");

            this.parallaxCollection = new ParallaxCollection(this);

            // create map panel
            mapPanel = new MapPanel(this, Content.Load<Texture2D>("textures/centerBar"),
                                    Content.Load<Texture2D>("textures/darkBar"),
                                    Content.Load<Texture2D>("textures/mapIcons"));

            // create players
            players = new List<PlayerSprite>();
            players.Add(new PlayerSprite(this, 0, new Vector3(3, world.getHeigth(3), 1.0f), playerTexture)
            {
                color = new Color(0x48, 0xe6, 0xfe, 255)
            });
            players.Add(new PlayerSprite(this, 1, new Vector3(-3, world.getHeigth(-3), 1.0f), playerTexture)
            {
                color = new Color(0xf8, 0xfe, 0x4d, 255)
            });

            // create game screens
            splitScreens = new RenderTarget2D[2];
            splitScreens[0] = new RenderTarget2D(GraphicsDevice, SPLIT_SCREEN_WIDTH, SPLIT_SCREEN_HEIGHT);
            splitScreens[1] = new RenderTarget2D(GraphicsDevice, SPLIT_SCREEN_WIDTH, SPLIT_SCREEN_HEIGHT);
            joinedScreen = new RenderTarget2D(GraphicsDevice, SCREEN_WIDTH, SCREEN_HEIGHT);

            // create cameras
            cameras = new GameCamera[2];
            cameras[0] = new GameCamera(this, splitScreens[0].ToVector(), 0, players[0].worldPosition);
            cameras[0].FollowPlayer(players[0]);
            cameras[1] = new GameCamera(this, splitScreens[1].ToVector(), 1, players[1].worldPosition);
            cameras[1].FollowPlayer(players[1]);

            joinedCamera = new GameCamera(this, GraphicsDevice.Viewport.ToVector(), 2, new Vector3(0.0f, 0.0f, 1.0f));


            // load GUI related stuff
            spriteFont = Content.Load<SpriteFont>("fonts/Geo");
            headlineFont = Content.Load<SpriteFont>("fonts/headline");
            scriptFont = Content.Load<SpriteFont>("fonts/script");
            menuButtons = Content.Load<Texture2D>("textures/menuButtons");

            // create tree collection
            treeCollection = new TreeCollection(this);
            treeCollection.Load();
            treeCollection.Reset();

            // create seed collection
            seedCollection = new SeedCollection(this);
            seedCollection.Load();
            seedCollection.Reset();
            CreateRandomSeeds(NUM_INITIAL_SEEDS, treeCollection.trees[0]);

            // create fairy collection
            fairyCollection = new FairyCollection(this);
            fairyCollection.Load(playerTexture);
            fairyCollection.Reset();
            
            /*
             spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied, null, null, null, null,
                               GameCamera.CurrentCamera.screenTransform);
                
             foreground.Draw(this, gameTime, i);
            */            

            // reset "The Void"
            ResetVoids(1.0f);

            this.State = GameState.INTRO;
        }
        public Tree(TreeCollection coll, Vector3 pos, TreeType type, bool isBlueprint, String preferredName)
        {
            position = pos;
            treeType = type;
            parentCollection = coll;
            fruitSize = new Vector2(parentCollection.fruitTexture.Width, parentCollection.fruitTexture.Height);
            texture = parentCollection.textures[(int)treeType];
            if (treeType != TreeType.BASE)
            {
                deadTexture = parentCollection.textures[(int)treeType + 4];
                xrayTexture = parentCollection.textures[(int)treeType + 8];
            }
            else
            {
                deadTexture = xrayTexture = texture;
            }

            screenSize = new Vector2(texture.Width, texture.Height);
            if (preferredName == "")
                name = names[random.Next(names.Length - 1)];
            else
                name = preferredName;

            if (treeType == TreeType.BASE)
            {
                offset = new Vector2(-0.5f * screenSize.X - 20, -screenSize.Y + 210.0f);
            }
            else
            {
                offset = new Vector2(-0.5f * screenSize.X, -screenSize.Y + 64.0f);
            }
            growth = 0.1f;
            status = TreeStatus.SEED;
            groundHeight = parentCollection.game.world.getHeigth(position.X);

            if (isBlueprint)
            {
                status = TreeStatus.BLUEPRINT;
                position.Y = groundHeight;
            }

            switch (treeType)
            {
                case TreeType.BASE:
                    position.Y = groundHeight;
                    status = TreeStatus.MATURE;
                    growth = 1.0f;
                    fruitTime = 15.0f;
                    resistance = 1.0f;
                    lifeSpan = 0.0f;
                    price = 0;
                    descriptionLines[0] = "The Tree of Light";
                    descriptionLines[1] = "Protect it at any cost.";
                    break;
                case TreeType.FIGHTER:
                    growthTime = 8.0f;
                    fruitTime = 20.0f;
                    resistance = 0.4f;
                    lifeSpan = 60.0f;
                    price = 3;
                    descriptionLines[0] = "Soldier Tree";
                    descriptionLines[1] = "Light but defensive tree.";
                    break;
                case TreeType.MOTHER:
                    growthTime = 15.0f;
                    fruitTime = 5.0f;
                    resistance = 0.6f;
                    lifeSpan = 80.0f;
                    price = 8;
                    descriptionLines[0] = "Producer Tree";
                    descriptionLines[1] = "Spawns many Souls.";
                    break;
                case TreeType.PAWN:
                    growthTime = 5.0f;
                    fruitTime = 7.0f;
                    resistance = 0.6f;
                    lifeSpan = 25.0f;
                    price = 2;
                    descriptionLines[0] = "Common Tree";
                    descriptionLines[1] = "Cheap jack of all trades.";
                    break;
                case TreeType.TANK:
                    growthTime = 25.0f;
                    fruitTime = 25.0f;
                    resistance = 0.3f;
                    lifeSpan = 130.0f;
                    price = 10;
                    descriptionLines[0] = "Defender Tree";
                    descriptionLines[1] = "Slow-growing heavy defender.";
                    break;
            }

            descriptionLines[2] = "Price: " + price.ToString() + " souls";

            // create first seed position
            if (!isBlueprint && status == TreeStatus.MATURE)
            {
                nextSeedPosition = GetNextSeedPosition();
            }
        }