foreach (Sprite sprite in mSprites) { if (sprite.CollisionAxisAlignedRectangle == null || ball.CollisionCircle == null) continue; if (!sprite.Name.Equals("dead") && ball.CollisionCircle.CollideAgainstBounce(sprite.CollisionAxisAlignedRectangle, 0, 1, 1) && sprite.Z == 0) { float yvel = ball.YVelocity; GemsData.soundBank.PlayCue("pop"); bool dead = false; bool squelch = false; if (sprite.Name.StartsWith("brush")) { string[] color = sprite.Name.Split('-'); BallStates state = ball_state; switch (color[1]) { case "green": ChangeState(BallStates.GREEN); break; case "red": ChangeState(BallStates.RED); break; case "brown": ChangeState(BallStates.BROWN); break; case "lblue": ChangeState(BallStates.LBLUE); break; case "blue": ChangeState(BallStates.BLUE); break; case "purple": ChangeState(BallStates.PURPLE); break; case "yellow": ChangeState(BallStates.YELLOW); break; } if (state != ball_state) GemsData.soundBank.PlayCue("color-change"); } else { if (!sprite.Name.StartsWith("wall")) { string[] name = sprite.Name.Split('-'); switch (name[0]) { case "red": if (ball_state == BallStates.RED) { dead = true; GemsData.score += brick_score; } break; case "green": if (ball_state == BallStates.GREEN) { dead = true; GemsData.score += brick_score; } break; case "lblue": if (ball_state == BallStates.LBLUE) { dead = true; GemsData.score += brick_score; } break; case "brown": if (ball_state == BallStates.BROWN) { dead = true; GemsData.score += brick_score; } break; case "blue": if (ball_state == BallStates.BLUE) { dead = true; GemsData.score += brick_score; } break; case "purple": if (ball_state == BallStates.PURPLE) { dead = true; GemsData.score += brick_score; } break; case "arrow": flip = !flip; dead = true; color_count++; break; case "lock": if (ball_state == BallStates.YELLOW) { if (has_key) { GemsData.soundBank.PlayCue("unlock"); has_key = false; dead = true; color_count++; squelch = true; inv_key.Visible = false; GemsData.score += lock_score; } } break; case "key": if (ball_state == BallStates.YELLOW) { if (!has_key) { GemsData.soundBank.PlayCue("keys"); has_key = true; dead = true; color_count++; squelch = true; inv_key.Visible = true; GemsData.score += key_score; } } break; case "diamond": if (color_count <= 0) { dead = true; squelch = true; GemsData.soundBank.PlayCue("diamond"); diamond_count--; GemsData.score += diamond_score; if (diamond_count == 0) GemsData.soundBank.PlayCue("win"); } break; case "skull": if (GemsData.lives == 0) { // Gameover stuff here } else GemsData.lives--; start = false; GemsData.soundBank.PlayCue("death"); SpriteManager.RemoveSprite(ball); ball = SpriteManager.AddSprite("Assets/Gfx/ball.png"); mSprites.Add(ball); PlaceBall(); GemsData.score = (GemsData.score - 500 < 0) ? 0 : GemsData.score - 500; get_ready.Visible = true; goto main_loop_start; } if (GemsData.score >= GemsData.life_goal) { GemsData.life_goal += 10000; GemsData.lives++; GemsData.soundBank.PlayCue("1up"); } } if (dead) { color_count--; sprite.RotationYVelocity = 5; sprite.Name = "dead"; if (FlatRedBallServices.Random.Next() % 2 == 0) sprite.CustomBehavior += new SpriteCustomBehavior(DestroyBlockOut); else sprite.CustomBehavior += new SpriteCustomBehavior(DestroyBlockIn); if (!squelch) GemsData.soundBank.PlayCue("brick-death"); } } } }