예제 #1
0
        public override void on_message(string msg, dynamic data)
        {
            if (msg.Equals("fireInput"))
            {
                if (((Playing_State)state).game_conf.soccer_mode)
                {
                    return;
                }

                Entity    origin = data.Origin;
                Weapon    weapon = data.Weapon;
                Ship_Info ship   = data.Ship;
                Bullet_Factory.fire_weapon(origin, weapon);
                if (!ship.has_powerup(typeof(Free_Fire_Powerup)))
                {
                    ship.energy_value -= weapon.energy_cost;
                }



                var input = origin.get_component <Input>();
                if (input != null)
                {
                    input.left_vib  += weapon.vib_left;
                    input.right_vib += weapon.vib_right;
                }
                Fab5_Game.inst().message("weapon_fired", new { name = weapon.sound, entity1 = origin, varying_pitch = true });
                weapon.timeSinceLastShot = 0f;
                if (weapon.GetType() == typeof(Secondary_Weapon) && ship.has_powerup(typeof(Fast_Bombs_Powerup)))
                {
                    weapon.timeSinceLastShot = weapon.fire_rate * 0.8f;
                }
            }
        }
예제 #2
0
 private static void fire(Entity entity, Ship_Info ship, Weapon weapon)
 {
     if (weapon.timeSinceLastShot >= weapon.fire_rate && ship.energy_value >= weapon.energy_cost)
     {
         var message = new { Origin = entity, Weapon = weapon, Ship = ship };
         Fab5_Game.inst().message("fireInput", message);
     }
 }
        private void printScore(List <Entity> playerList, int currentOffset)
        {
            for (int i = 0; i < playerList.Count; i++)
            {
                Entity    player       = playerList[i];
                Score     player_score = player.get_component <Score>();
                Ship_Info player_info  = player.get_component <Ship_Info>();

                int rowY  = currentOffset + rowHeight * i + textOffset + vertSpacing * i;
                int iconY = (int)(rowY + rowHeight * .5f - iconSizeY * .5f - 3);
                if (player.get_component <Input>() == null)
                {
                    GFX_Util.draw_def_text_small(sprite_batch, player_string(player), nameX, rowY);
                }
                else
                {
                    var player_input = player.get_component <Input>();
                    if (player_input != null && player_input.device == Input.InputType.Controller)
                    {
                        Texture2D ph_icon = Starburst.inst().get_content <Texture2D>("menu/controller" + (int)(player_input.gp_index + 1));
                        sprite_batch.Draw(ph_icon, destinationRectangle: new Rectangle(iconX, iconY, iconSizeX, iconSizeY));
                        GFX_Util.draw_def_text(sprite_batch, player_string(player), nameX, rowY - (!lowRes ? 3 : 0));
                    }
                    else
                    {
                        int key_index;
                        if (player_input.up == Keys.W)
                        {
                            key_index = 1;
                        }
                        else
                        {
                            key_index = 2;
                        }
                        Texture2D ph_icon = Starburst.inst().get_content <Texture2D>("menu/keys" + key_index);
                        sprite_batch.Draw(ph_icon, destinationRectangle: new Rectangle(iconX, iconY, iconSizeX, iconSizeY));
                        GFX_Util.draw_def_text(sprite_batch, player_string(player), nameX, rowY - (!lowRes ? 3 : 0));
                    }
                }

                GFX_Util.draw_def_text_small(sprite_batch, player_score.num_kills.ToString(), killsX, rowY);
                GFX_Util.draw_def_text_small(sprite_batch, player_score.num_deaths.ToString(), deathsX, rowY);
                GFX_Util.draw_def_text_small(sprite_batch, player_score.score.ToString(), scoreX, rowY);
            }
        }
예제 #4
0
        public void drawHUD(Entity player, float dt, Camera camera)
        {
            //sprite_batch.Begin(SpriteSortMode.Deferred);
            if (!player.get_component <Input>().enabled)
            {
                return;
            }

            Position playerPos = player.get_component <Position>();

            this.ship_info = player.get_component <Ship_Info>();
            //drawHP();
            drawEnergy(playerPos, camera, dt);
            drawScore(player, dt);
            draw_minimap(player);
            draw_powerup_inv(camera, player);

            //sprite_batch.End();
        }
        public override void draw(float t, float dt)
        {
            base.draw(t, dt);

            var ships = Starburst.inst().get_entities_fast(typeof(Ship_Info));

            for (int i = 0; i < ships.Count; i++)
            {
                Ship_Info ship = ships[i].get_component <Ship_Info>();
                if (ship.energy_value < ship.top_energy)
                {
                    ship.energy_value += ship.recharge_rate * dt;
                }
                else if (ship.energy_value > ship.top_energy)
                {
                    ship.energy_value = ship.top_energy;
                }
            }

            powerup_spawn_timer -= dt;
            if (powerup_spawn_timer <= 0.0f)
            {
                powerup_spawn_timer = game_conf.powerup_spawn_time;

                int num_powerups_now = Starburst.inst().get_entities_fast(typeof(Powerup)).Count;
                if (num_powerups_now < game_conf.num_powerups)
                {
                    var powerup     = new_random_powerup();
                    var powerup_pos = spawner.get_powerup_spawn_pos(tile_map);
                    powerup.get_component <Position>().x = powerup_pos.x;
                    powerup.get_component <Position>().y = powerup_pos.y;
                }
            }

            if (!can_pause)
            {
                can_pause = true;
            }
        }
        public override void init()
        {
            Gamepad_Util.vibrate(0, 0.0f, 0.0f);

            Gamepad_Util.vibrate(1, 0.0f, 0.0f);

            Gamepad_Util.vibrate(2, 0.0f, 0.0f);

            Gamepad_Util.vibrate(3, 0.0f, 0.0f);


            sprite_batch = new SpriteBatch(Starburst.inst().GraphicsDevice);

            add_subsystems(
                new Menu_Input_Handler(),
                new Sound(),
                new Particle_System(),
                new Background_Renderer(sprite_batch)
                );

            outDelay      = delay + inDuration + displayTime;
            animationTime = outDelay + outDuration;

            soundMgr = create_entity(SoundManager.create_backmusic_component());
            soundMgr.get_component <SoundLibrary>().song_index = 1;

            vp     = sprite_batch.GraphicsDevice.Viewport;
            lowRes = (vp.Height < 800 && vp.Width < 1600);

            // load textures
            background = Starburst.inst().get_content <Texture2D>("backdrops/backdrop4");
            rectBg     = new Texture2D(Fab5_Game.inst().GraphicsDevice, 1, 1);
            rectBg.SetData(new Color[] { Color.Black }, 1, 1);//Starburst.inst().get_content<Texture2D>("controller_rectangle");
            font                = Starburst.inst().get_content <SpriteFont>(!lowRes ? "sector034" : "small");
            largeFont           = Starburst.inst().get_content <SpriteFont>("large");
            controller_a_button = Starburst.inst().get_content <Texture2D>("menu/Xbox_A_white");
            keyboard_key        = Starburst.inst().get_content <Texture2D>("menu/Key");
            controller_l_stick  = Starburst.inst().get_content <Texture2D>("menu/Xbox_L_white");

            okSize = font.MeasureString(" ");

            controllerBtnSize = !lowRes ? 50 : 38; // ikon för knapp
            heightDiff        = (int)(controllerBtnSize - okSize.Y);
            yPos = (int)(vp.Height - controllerBtnSize - 15);

            for (int i = 0; i < players.Count; i++)
            {
                if (players[i].get_component <Input>() != null)
                {
                    create_entity(Player.create_components(players[i].get_component <Input>()));
                }
            }
            graphicsDevice    = sprite_batch.GraphicsDevice;
            resultsViewHeight = (int)(vp.Height * .83f);
            resultsRT         = new RenderTarget2D(graphicsDevice, vp.Width, resultsViewHeight);

            Comparer <Entity> sort_on_score = Comparer <Entity> .Create((e1, e2) => - e1.get_component <Score>().score.CompareTo(e2.get_component <Score>().score));

            if (gameConfig.mode == Game_Config.GM_TEAM_DEATHMATCH)
            {
                redTeam   = new List <Entity>();
                blueTeam  = new List <Entity>();
                redScore  = 0;
                blueScore = 0;
                redGoals  = 0;
                blueGoals = 0;

                // lägg spelare i rätt lag
                for (int p = 0; p < players.Count; p++)
                {
                    Ship_Info player_info  = players[p].get_component <Ship_Info>();
                    Score     player_score = players[p].get_component <Score>();
                    if (players[p].get_component <Velocity>() == null) // turret, lägg till poäng men inte entiteten i laget
                    {
                        if (player_info.team == 1)
                        {
                            redScore += (int)player_score.score;
                        }
                        else
                        {
                            blueScore += (int)player_score.score;
                        }
                        continue;
                    }
                    if (player_info == null)
                    {
                        continue;
                    }
                    if (player_info.team == 1)
                    {
                        redTeam.Add(players[p]);
                        redGoals  = player_score.num_goals;
                        redScore += (int)player_score.score;
                    }
                    else
                    {
                        blueTeam.Add(players[p]);
                        blueGoals  = player_score.num_goals;
                        blueScore += (int)player_score.score;
                    }
                }
                // sortera lag efter bäst score
                redTeam.Sort(sort_on_score);
                blueTeam.Sort(sort_on_score);

                redTeamHeight  = rowHeight * (redTeam.Count + 0) + vertSpacing * (redTeam.Count - 1);
                blueTeamHeight = rowHeight * (blueTeam.Count + 0) + vertSpacing * (blueTeam.Count - 1);

                totalPlayerHeight = redTeamHeight + 50 + blueTeamHeight + 50;

                totalResultsHeight = totalPlayerHeight - resultsViewHeight + 100;
                if (resultsViewHeight < redTeamHeight + 50 + blueTeamHeight + 50 + 100)
                {
                    scrollable = true;
                }
            }
            else
            {
                bestScore   = 0;
                bestPlayers = new List <Entity>();
                List <Entity> checkedPlayers = new List <Entity>();
                // ta bort turrets (ska inte finnas några här, men tas bort utifall att)
                for (int i = 0; i < players.Count; i++)
                {
                    if (players[i].get_component <Velocity>() != null)
                    {
                        checkedPlayers.Add(players[i]);
                    }
                }
                players = checkedPlayers;
                for (int i = 0; i < players.Count; i++)
                {
                    Score     player_score = players[i].get_component <Score>();
                    Ship_Info player_info  = players[i].get_component <Ship_Info>();

                    if (player_score == null)
                    {
                        continue;
                    }

                    if (player_score.score > bestScore)
                    {
                        bestPlayers.Clear();
                        bestScore = (int)player_score.score;
                        bestPlayers.Add(players[i]);
                    }
                    else if (player_score.score == bestScore)
                    {
                        bestPlayers.Add(players[i]);
                    }
                }
                players.Sort(sort_on_score);

                totalPlayerHeight  = rowHeight * (players.Count + 0) + vertSpacing * (players.Count - 1);
                totalResultsHeight = totalPlayerHeight + 50 - resultsViewHeight;
                if (resultsViewHeight < totalPlayerHeight + 50)
                {
                    scrollable = true;
                }
            }


            vertPadding = 10;
            horPadding  = 20;
            horSpacing  = 20;
            nameWidth   = 300;

            killsHeader  = "Kills";
            deathsHeader = "Deaths";
            scoreHeader  = "Score";
            handlerSize  = new Vector2(80, 64);
            killsSize    = font.MeasureString(killsHeader);
            deathsSize   = font.MeasureString(deathsHeader);
            scoreSize    = font.MeasureString("999999");

            iconSizeX       = 42;
            iconSizeY       = 30;
            iconSizeX       = 63;
            iconSizeY       = 45;
            totalScoreWidth = (int)(iconSizeX + horSpacing + nameWidth + horSpacing + killsSize.X + horSpacing + deathsSize.X + horSpacing + scoreSize.X);
            iconX           = (int)(vp.Width * .5f - totalScoreWidth * .5f);
            nameX           = iconX + iconSizeX + horSpacing;
            killsX          = nameX + nameWidth + horSpacing;
            deathsX         = (int)(killsX + killsSize.X + horSpacing);
            scoreX          = (int)(deathsX + deathsSize.X + horSpacing);

            textOffset = (int)((rowHeight - killsSize.Y) * .5f);
        }
        private void inflictBulletDamage(Entity bullet, Entity player, dynamic data)
        {
            Ship_Info   playerShip   = player.get_component <Ship_Info>();
            Bullet_Info bulletInfo   = bullet.get_component <Bullet_Info>();
            Score       shooterScore = bulletInfo.sender.get_component <Score>();
            var         vx           = bullet.get_component <Velocity>().x;
            var         vy           = bullet.get_component <Velocity>().y;
            var         velo         = player.get_component <Velocity>();
            var         velo2        = bullet.get_component <Velocity>();
            var         cspeed       = Math.Sqrt(Math.Pow(velo.x, 2) + Math.Pow(velo.y, 2));
            var         cspeed2      = Math.Sqrt(Math.Pow(velo2.x, 2) + Math.Pow(velo2.y, 2));
            var         colspeed     = (float)Math.Abs(cspeed - cspeed2 * ((velo.x * velo2.x + velo.y * velo2.y) / (cspeed * cspeed2)));

            float bulletSpeed  = (float)Math.Sqrt(vx * vx + vy * vy);
            var   fac          = (float)Math.Max(0.7f, Math.Min(1.2f, colspeed / bulletInfo.max_speed));
            float bulletDamage = bulletInfo.damage * fac;

            /*if (playerShip.team == bulletInfo.sender.get_component<Ship_Info>().team) {
             *  return;
             * }*/

            if (player == bulletInfo.sender)
            {
                return;
            }

            if (Fab5_Game.inst().get_time() - player.get_component <Ship_Info>().spawn_time < 3.0f)
            {
                return;
            }

            Fab5_Game.inst().message("camera_shake", new { playerShip.pindex });
            var shooter_score_mult = shooterScore.score_mult;

            if (player != bulletInfo.sender)
            {
                shooterScore.give_points(10);
            }
            // kolla sköld, om sköld nere, ta skada
            if (playerShip.energy_value > bulletDamage)
            {
                playerShip.energy_value -= bulletDamage;
            }
            else
            {
                bulletDamage           -= playerShip.energy_value;
                playerShip.energy_value = 0;

                // börja dra av hp av resterande skada från kula

                playerShip.hp_value -= bulletDamage;
                if (playerShip.hp_value <= 0)
                {
                    // offret blir dödsmördat
                    if (player != bulletInfo.sender)
                    {
                        shooterScore.give_points(250);
                        shooterScore.num_kills++;
                        shooterScore.num_kills_since_death++;
                        if (shooterScore.num_kills_since_death > 2 && ((shooterScore.num_kills_since_death) % 3) == 0)
                        {
                            shooterScore.score_mult++;
                            if (shooterScore.score_mult > 3)
                            {
                                shooterScore.score_mult = 3;
                            }
                        }
                    }

                    foreach (var powerup in playerShip.powerups.Values)
                    {
                        if (powerup != null)
                        {
                            powerup.end();
                        }
                    }

                    playerShip.powerups.Clear();

                    for (int i = 0; i < playerShip.max_powerups_inv; i++)
                    {
                        playerShip.powerup_inv[i] = null;
                    }

                    state.create_entity(new Component[] {
                        new TTL {
                            max_time = 0.1f
                        },
                        new Particle_Emitter {
                            emit_fn = () => {
                                var theta1 = 2.0f * 3.1415f * (float)rand.NextDouble();
                                var theta2 = (-3.141592f + 2.0f * 3.1415f * (float)rand.NextDouble()) * 0.1f;
                                var radius = 35.0f * (float)rand.NextDouble();
                                var speed  = (300.0f + 180.0f * (float)rand.NextDouble());

                                return(new Component[] {
                                    new Position {
                                        x = data.c_x + (float)Math.Cos(theta1) * radius,
                                        y = data.c_y + (float)Math.Sin(theta1) * radius
                                    },
                                    new Velocity {
                                        x = (float)Math.Cos(theta1 + theta2) * -speed,
                                        y = (float)Math.Sin(theta1 + theta2) * -speed
                                    },
                                    new Sprite {
                                        blend_mode = Sprite.BM_ADD,
                                        color = new Color(0.8f, 0.4f, 0.1f),
                                        layer_depth = 0.3f,
                                        scale = 0.6f + (float)Math.Pow(rand.NextDouble() * 1.2f, 2.0f),
                                        texture = Starburst.inst().get_content <Texture2D>("particle")
                                    },
                                    new TTL {
                                        alpha_fn = (x, max) => 1.0f - x / max,
                                        max_time = 0.3f + (float)(rand.NextDouble() * 0.7f)
                                    }
                                });
                            },
                            interval = 0.05f,
                            num_particles_per_emit = 35 + rand.Next(0, 60)
                        }
                    });

                    playerShip.hp_value     = playerShip.top_hp;
                    playerShip.energy_value = playerShip.top_energy;

                    if (player.has_component <Input>())
                    {
                        player.get_component <Input>().enabled = false;
                    }

                    player.get_component <Ship_Info>().is_dead           = true;
                    player.get_component <Score>().num_kills_since_death = 0;

                    var old_particle_emitter = player.remove_component <Particle_Emitter>();
                    var old_bounding_circle  = player.remove_component <Bounding_Circle>();
                    var old_sprite           = player.remove_component <Sprite>();
                    var old_shadow           = player.remove_component <Shadow>();
                    var old_light            = player.remove_component <Light_Source>();

                    Starburst.inst().message("explosion", new { name = "explosion", entity1 = player, varying_pitch = true });

                    Score player_score = player.get_component <Score>();
                    player_score.num_deaths++;
                    player_score.score_mult = 1;

                    int player_kills  = player_score.num_kills;
                    int player_deaths = player_score.num_deaths;



                    var time_of_death = Fab5_Game.inst().get_time();
                    Fab5_Game.inst().create_entity(new Component[] {
                        new Post_Render_Hook  {
                            render_fn = (camera, sprite_batch) => {
                                if (camera.index != playerShip.pindex)
                                {
                                    return;
                                }
                                var t = 5.0f;

                                t -= Fab5_Game.inst().get_time() - time_of_death;

                                var text1 = string.Format("Respawning in {0:0.00}", t);

                                // @To-do: not gonna fly with NPCs
                                var text2 = string.Format("Killed by {0}!", player_string(bulletInfo.sender));
                                var ts1   = GFX_Util.measure_string("Respawning in 0.00");
                                var ts2   = GFX_Util.measure_string(text2);

                                var text3 = string.Format("Kills: {0}", player_kills);
                                var text4 = string.Format("Deaths: {0}", player_deaths);

                                var a  = 0.5f * (float)Math.Min(Math.Max(0.0f, (10.0f - t * 2.0f)), 1.0f);
                                var a2 = (float)Math.Min(Math.Max(0.0f, (3.0f * t * (1.0f / 5.0f) - 1.0f)), 1.0f);
                                GFX_Util.fill_rect(sprite_batch, new Rectangle(0, 0, camera.viewport.Width, camera.viewport.Height), Color.Black * a);
                                GFX_Util.draw_def_text(sprite_batch, text2, (camera.viewport.Width - ts2.X) * 0.5f, (camera.viewport.Height - ts2.Y) * 0.5f - 170.0f);
                                GFX_Util.draw_def_text(sprite_batch, text3, (camera.viewport.Width - ts2.X) * 0.5f, (camera.viewport.Height - ts2.Y) * 0.5f - 90.0f);
                                GFX_Util.draw_def_text(sprite_batch, text4, (camera.viewport.Width - ts2.X) * 0.5f, (camera.viewport.Height - ts2.Y) * 0.5f - 130.0f);
                                GFX_Util.draw_def_text(sprite_batch, text1, (camera.viewport.Width - ts1.X) * 0.5f, (camera.viewport.Height - ts1.Y) * 0.5f);
                            }
                        },

                        new TTL {
                            max_time = 5.0f,
                        }
                    });

                    var killer = bulletInfo.sender.get_component <Ship_Info>();



                    Fab5_Game.inst().create_entity(new Component[] {
                        new Post_Render_Hook  {
                            render_fn = (camera, sprite_batch) => {
                                if (camera.index != killer.pindex)
                                {
                                    return;
                                }

                                var t         = 5.0f - (Fab5_Game.inst().get_time() - time_of_death);
                                var a         = (float)Math.Min(Math.Max(0.0f, (3.0f * t * (1.0f / 5.0f) - 1.0f)), 1.0f);
                                var text      = string.Format("Killed {0}!", player_string(player));
                                var ts        = GFX_Util.measure_string(text);
                                String points = "+" + (250 * shooter_score_mult).ToString();
                                var ps        = GFX_Util.measure_string(points);
                                GFX_Util.draw_def_text(sprite_batch, text, (camera.viewport.Width - ts.X) * 0.5f, 145.0f, a);
                                GFX_Util.draw_def_text(sprite_batch, points, (camera.viewport.Width - ps.X) * 0.5f, 145.0f + ts.Y + 10, a);
                            }
                        },

                        new TTL {
                            max_time = 5.0f,
                        }
                    });


                    Fab5_Game.inst().create_entity(new Component[] {
                        new TTL {
                            destroy_cb = () => {
                                Fab5_Game.inst().message("spawn", new { entity1 = player, name = "spawn", varying_pitch = false });

                                player.add_components(old_particle_emitter, old_bounding_circle, old_sprite, old_shadow, old_light);
                                if (player.has_component <Input>())
                                {
                                    player.get_component <Input>().enabled = true;
                                }

                                var spawn_pos = spawner.get_player_spawn_pos(player, tile_map);

                                player.get_component <Position>().x           = spawn_pos.x;
                                player.get_component <Position>().y           = spawn_pos.y;
                                player.get_component <Ship_Info>().spawn_time = Fab5_Game.inst().get_time();
                                player.get_component <Ship_Info>().is_dead    = false;
                                player.get_component <Angle>().angle          = 3.141592f * 2.0f * (float)rand.NextDouble();
                                var player_pos = player.get_component <Position>();
                                var player_vel = player.get_component <Velocity>();

                                for (int i = 0; i < 20; i++)
                                {
                                    Fab5_Game.inst().create_entity(new Component[] {
                                        new TTL {
                                            max_time   = i * 0.05f,
                                            destroy_cb = () => {
                                                var theta1 = 2.0f * 3.1415f * (float)rand.NextDouble();
                                                var theta2 = 2.0f * 3.1415f * (float)rand.NextDouble();
                                                var radius = 13.0f * (float)rand.NextDouble();
                                                var speed  = (30.0f + 110.0f * (float)Math.Pow(rand.NextDouble(), 2.0f));

                                                Fab5_Game.inst().create_entity(new Component[] {
                                                    new Sprite   {
                                                        blend_mode = Sprite.BM_ADD,
                                                        scale      = 0.8f + (float)rand.NextDouble(),
                                                        texture    = Fab5_Game.inst().get_content <Texture2D>("particle")
                                                    },

                                                    new Position {
                                                        x = player_pos.x + (float)Math.Cos(theta1) * radius,
                                                        y = player_pos.y + (float)Math.Sin(theta1) * radius
                                                    },

                                                    new Velocity {
                                                        x = 0.5f * player_vel.x + (float)Math.Cos(theta2) * speed,
                                                        y = 0.5f * player_vel.y + (float)Math.Sin(theta2) * speed
                                                    },

                                                    new Mass     {
                                                        drag_coeff = 2.0f
                                                    },

                                                    new TTL      {
                                                        alpha_fn = (x, max) => 1.0f - (x * x) / (max * max),
                                                        max_time = 1.5f + (float)rand.NextDouble()
                                                    }
                                                });
                                            }
                                        }
                                    });
                                }
                            },

                            max_time = 5.0f,
                        }
                    });

                    /*var spawn_pos = spawner.get_player_spawn_pos(player, tile_map);
                     * player.get_component<Position>().x = spawn_pos.x;
                     * player.get_component<Position>().y = spawn_pos.y;*/

                    player.get_component <Velocity>().x = 0.0f;
                    player.get_component <Velocity>().y = 0.0f;
                }
            }
        }
예제 #8
0
        public static Component[] create_components(Input input, Game_Config conf, int team)
        {
            int   pindex   = lol;
            float mass_fac = 1.0f;
            float acc_fac  = 1.0f;
            float vel_fac  = 1.0f;

            if (conf.soccer_mode)
            {
                mass_fac = 2.0f;
                acc_fac  = 1.4f;
                vel_fac  = 1.1f;
            }

            /*
             * var inputhandler = new Input() {
             * };
             * if (lol == 2) {
             *  // this ass code sucks
             *  inputhandler = new Input() {
             *      left = Keys.A,
             *      right = Keys.D,
             *      up = Keys.W,
             *      down = Keys.S,
             *      gp_index = PlayerIndex.Two,
             *      primary_fire = Keys.F,
             *      secondary_fire = Keys.G
             *  };
             * }
             */
            string ship = "ships/ship1" + (((lol - 1) % 4) + 1);

//            if (lol >= 3)
//                ship = "ships/qship11";

            lol++;
            //int team = (lol % 2)+1;
            if (conf.mode != Game_Config.GM_TEAM_DEATHMATCH)
            {
                team = pindex; // all vs all
            }

            int   ig_value   = 0;
            Color teamColor  = new Color(1.0f, 0.7f, 0.3f);
            Color teamColor2 = new Color(1.0f, 0.7f, 0.2f);
            Color teamColor3 = new Color(0.4f, 0.6f, 1.0f);
            Color teamColor4 = new Color(1.0f, 1.0f, 1.0f);

            if (conf.mode == Game_Config.GM_DEATHMATCH)
            {
                ig_value = pindex;
            }
            else if (conf.mode == Game_Config.GM_TEAM_DEATHMATCH)
            {
                ig_value  = team;
                intensity = 0.5f;

                if (team == 1)
                {
                    teamColor  = new Color(1.0f, 0.3f, 0.3f);
                    teamColor2 = new Color(1.0f, 0.6f, 0.6f);
                    teamColor3 = new Color(1.0f, 0.6f, 0.6f);
                    teamColor4 = new Color(1.0f, 0.2f, 0.2f);
                }
                else
                {
                    teamColor  = new Color(0.3f, 0.4f, 1.0f);
                    teamColor2 = new Color(0.6f, 0.7f, 1.0f);
                    teamColor3 = new Color(0.6f, 0.6f, 1.0f);
                    teamColor4 = new Color(0.2f, 0.3f, 1.0f);
                }
            }
            else
            {
                System.Console.WriteLine("unknown game mode!");
            }

            //System.Console.WriteLine("ignore value: " + ig_value + ", " + team + ", " + pindex);

            var playerrot = new  Angle()
            {
                angle = 0
            };
            var playerpos = new Position()
            {
                x = 300, y = 200
            };
            var playervel = new Velocity()
            {
                x = 0.0f, y = 0.0f
            };
            var particle_tex = Starburst.inst().get_content <Texture2D>("particle");
            var ship_info    = new Ship_Info(1, 130, 100.0f * vel_fac, 100.0f * acc_fac)
            {
                team = team, pindex = pindex
            };

            return(new Component[] {
                input,
                new Particle_Emitter()
                {
                    emit_fn = () => {
                        if (rand.Next(0, 60) > 0)
                        {
                            var col = teamColor;
                            var max_time = 0.05f + (float)(rand.NextDouble() * 0.05f);

                            if (ship_info.has_powerup(typeof(Turbo_Powerup)))
                            {
                                max_time *= 1.7f;
                                col = teamColor3;
                            }

                            return new Component[] {
                                new Position()
                                {
                                    x = playerpos.x - (float)Math.Cos(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 0.5) * 20.0f,
                                    y = playerpos.y - (float)Math.Sin(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 0.5) * 20.0f
                                },
                                new Velocity()
                                {
                                    x = playervel.x - (float)Math.Cos(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 0.5) * 250.0f * (float)(rand.NextDouble() + 0.5) * (input.throttle + 0.3f),
                                    y = playervel.y - (float)Math.Sin(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 0.5) * 250.0f * (float)(rand.NextDouble() + 0.5) * (input.throttle + 0.3f)
                                },
                                new Sprite()
                                {
                                    texture = particle_tex,
                                    color = col,
                                    scale = 0.9f + (float)rand.NextDouble() * 1.3f,
                                    blend_mode = Sprite.BM_ADD,
                                    layer_depth = 0.1f
                                },
                                new TTL()
                                {
                                    alpha_fn = (x, max) => 1.0f - (x / max), max_time = max_time
                                }
                                //                        new Bounding_Circle() { radius = 1.0f },
                                //                        new Mass() { mass = 0.0f }
                            };
                        }
                        else
                        {
                            var col = teamColor2 * 0.95f;
                            var max_time = 0.35f + (float)(rand.NextDouble() * 0.35f);

                            /*if (ship_info.has_powerup("turbo")) {
                             *  max_time *= 1.2f;
                             *  col = new Color(1.0f, 1.0f, 1.0f);
                             * }*/

                            return new Component[] {
                                new Position()
                                {
                                    x = playerpos.x - (float)Math.Cos(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 0.5) * 20.0f,
                                    y = playerpos.y - (float)Math.Sin(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 0.5) * 20.0f
                                },
                                new Velocity()
                                {
                                    x = playervel.x * 0.5f - (float)Math.Cos(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 1.5) * 90.0f * (float)(rand.NextDouble() + 0.5) * (input.throttle + 0.3f),
                                    y = playervel.y * 0.5f - (float)Math.Sin(playerrot.angle + (float)(rand.NextDouble() - 0.5) * 1.5) * 90.0f * (float)(rand.NextDouble() + 0.5) * (input.throttle + 0.3f)
                                },
                                new Sprite()
                                {
                                    texture = particle_tex,
                                    color = col,
                                    scale = 0.4f + (float)rand.NextDouble() * 0.3f,
                                    blend_mode = Sprite.BM_ADD,
                                    layer_depth = 0.1f
                                },
                                new TTL()
                                {
                                    alpha_fn = (x, max) => 1.0f - (x / max), max_time = max_time
                                }
                                //                        new Bounding_Circle() { radius = 1.0f },
                                //                        new Mass() { mass = 0.0f }
                            };
                        }
                    },
                    interval = 0.02f,
                    num_particles_per_emit = 10
                },
                playerrot,
                playerpos,
                playervel,
                new Sprite()
                {
                    texture = Starburst.inst().get_content <Texture2D>(ship),
                    layer_depth = 0.6f
                                  //color = new Color(0.6f, 0.9f, 1.0f),
                },
                ship_info,
                new Bounding_Circle()
                {
                    radius = 20.0f, ignore_collisions2 = ig_value
                },
                new Mass()
                {
                    mass = 15.0f * mass_fac, restitution_coeff = 0.6f, friction = 0.1f
                },
                new Primary_Weapon(),
                new Secondary_Weapon(),
                new Score(),
                new Shadow(),
                new Light_Source {
                    color = teamColor4, lightcone = true, intensity = intensity
                }
                /*new Light_Source { color = new Color(1.0f, 0.9f, 0.8f), intensity = 0.6f }*/
            });
        }