Word GetWordFromScore(string score)
        {
            Word word;

            word = (Word) wordCache[score];
            if (word != null)
                return word;

            word = new Word(score, Constants.LetterSize);
            wordCache.Add(score, word);
            return word;
        }
        public void DrawHostName(Surface surface, Point location, int color)
        {
            if (hostName == null)
                return;

            if (hostNameWord == null) {
                hostNameWord = new Word(hostName, Constants.LetterSize);
            }

            hostNameWord.Draw(surface, color, Constants.LetterSpacing, location);
        }
        public void MainLoop()
        {
            float minFrameTime = gameSettings.GameSpeed * 0.005f;

            if (lastFrameTime < minFrameTime) {
                lastFrameTime += DXUtil.Timer(DirectXTimer.GetElapsedTime);
                return;
            }
            lastFrameTime = 0.0f;
            try {
                if (gameState == GameStates.Paused) {
                    Word paused = new Word("PAUSED", Constants.LetterSize * 1.5f);
                    paused.Draw(surfaceSecondary, Color.White.ToArgb(),
                        Constants.LetterSpacing * 2,
                        new Point(windowBounds.Left + 50, windowBounds.Top + 50));
                    surfacePrimary.Draw(surfaceSecondary, DrawFlags.DoNotWait);
                }
                // Clear the ship's sound flags
                ship.Sounds = (Sounds) 0;

                // process input
                HandleKeys();

                if (gameState != GameStates.Running) return;

                surfaceSecondary.ColorFill(Color.Black);
                surfaceSecondary.DrawWidth = 1;

                // update my position, and tell others about it...
                ship.UpdatePosition();

                // update my state, and draw myself...
                ship.UpdateState();

                //If there are other players, send them our ship info
                if (netPeer.InSession  && otherPlayers.Count > 0)
                    SendMyPlayerUpdate();

                WriteScores();
                stars.Draw(surfaceSecondary);

                int shipColor = Color.White.ToArgb();
                int shotColor = Color.White.ToArgb();
                ship.Draw(surfaceSecondary, shipColor, shotColor);

                // Handle other ships
                // walk through all other players. For each player
                // 1) draw the ship
                // 2) check to see whether the other ship has killed us
                // 3) figure the score
                // 4) see if we need to time-out this ship
                int shipIndex = 0;
                Sounds otherShipSounds = (Sounds) 0;
                DateTime now = DateTime.Now;
                lock (otherPlayers) {
                    foreach (RemotePlayer player in otherPlayers.Values) {
                        if (!player.Active)
                            continue;

                        player.Ship.Draw(surfaceSecondary, shipColors[shipIndex].ToArgb(), shotColor);
                        shipIndex = (shipIndex + 1) % shipColors.Length;
                        ship.TestShip(player);
                        otherShipSounds |= player.Ship.Sounds;

                        // if we haven't gotten an update in a while,
                        // mark the player as inactive...
                        TimeSpan delta = now - player.UpdateTime;
                        if (delta.Seconds > Constants.RemoteTickTimeout) {
                            player.Active = false;
                        }
                    }
                }

                // Draw the sun only if the "Black Hole" option isn't enabled
                if (!blackHole)
                    sun.Draw(surfaceSecondary);

                surfacePrimary.Draw(surfaceSecondary, DrawFlags.DoNotWait);
                PlaySounds(otherShipSounds);
            }

            catch(SurfaceLostException) {
                // The surface can be lost if power saving
                // mode kicks in, or any other number of reasons.
                CreateSurfaces();
            }
        }