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; } } }
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); } }
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; } } }
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 }*/ }); }