protected virtual List<Block> CheckBlocks(BCBlockGameState ParentGameState, ref List<cBall> ballsadded, BCBlockGameState wholeref) { List<Block> affectedblocks = new List<Block>(); //if (HitBottom) ParentGameState.BallHitBottom(this); List<Block> destroyed = new List<Block>(); foreach (Block loopblock in wholeref.Blocks) { bool was_hit = false; bool returnimpact = false; //if (isTempBall) if ((returnimpact = loopblock.CheckImpact(wholeref, this, out was_hit, ref ballsadded))) { Velocity = new PointF(Velocity.X + 0.01f, Velocity.Y + 0.01f); InvokeHitBlock(wholeref, this, loopblock); } if (was_hit || returnimpact) { affectedblocks.Add(loopblock); if (isTempBall) ParentGameState.RemoveBalls.Add(this); } if (was_hit) { Debug.Print("destroying block"); destroyed.Add(loopblock); } } lock (wholeref.Blocks) { foreach (Block removeblock in destroyed) { bool nodef = false; //removeblock.RaiseBlockDestroy(ParentGameState, this, ref ballsadded, ref nodef); wholeref.Blocks.Remove(removeblock); affectedblocks.Add(removeblock); } } // foreach (cBall removeball in ParentGameState.removeballs) // { // ParentGameState.Balls.Remove(removeball); //} //ParentGameState.removeballs.Clear(); //check of we destroyed the last destructible block... if (destroyed.Count > 0) { //if (wholeref.Blocks.Count((q)=>q.MustDestroy()) == 0) if (wholeref.Blocks.Count((x) => x.MustDestroy()) == 0) { wholeref.invokeLevelComplete(); } } return affectedblocks; }