/*<summary> * Listens for attacks to be completed. *</summary> *<param name="sender">the game</param> *<param name="result">the result of the attack</param> *<remarks> * Displays a message, plays sound and redraws the screen *</remarks> */ private static void AttackCompleted(object sender, AttackResult result) { bool isHuman = (_theGame.Player == HumanPlayer); if (isHuman) { UtilityFunctions.Message = ("You " + result.ToString()); } else { UtilityFunctions.Message = ("The AI " + result.ToString()); } switch (result.Value) { case ResultOfAttack.Destroyed: GameController.PlayHitSequence(result.Row, result.Column, isHuman); if (!_mute) { Audio.PlaySoundEffect(GameResources.GameSound("Sink")); } break; case ResultOfAttack.GameOver: //potentially remove this as it gets played twice if the player wins GameController.PlayHitSequence(result.Row, result.Column, isHuman); //Audio.PlaySoundEffect(GameResources.GameSound("Sink")); while (Audio.SoundEffectPlaying(GameResources.GameSound("Sink"))) { SwinGame.Delay(10); SwinGame.RefreshScreen(); } if (HumanPlayer.IsDestroyed && !_mute) { Audio.PlaySoundEffect(GameResources.GameSound("Lose")); } else { if (!_mute) { Audio.PlaySoundEffect(GameResources.GameSound("Winner")); } } //come back here to add the letter/number coordinates break; case ResultOfAttack.Hit: GameController.PlayHitSequence(result.Row, result.Column, isHuman); break; case ResultOfAttack.Miss: GameController.PlayMissSequence(result.Row, result.Column, isHuman); break; case ResultOfAttack.ShotAlready: if (!_mute) { Audio.PlaySoundEffect(GameResources.GameSound("Error")); } break; } }
/// <summary> /// Draws the high scores to the screen. /// </summary> public static void DrawHighScores() { const int SCORES_HEADING = 40; const int SCORES_TOP = 80; const int SCORE_GAP = 30; if (_Scores.Count == 0) { LoadScores(); } SwinGame.DrawText(" High Scores ", Color.White, GameResources.GameFont("Courier"), SCORES_LEFT, SCORES_HEADING); //For all of the scores int i = 0; for (i = 0; i <= _Scores.Count - 1; i++) { Score s = default(Score); s = _Scores[i]; //for scores 1 - 9 use 01 - 09 if (i < 9) { SwinGame.DrawText(" " + (i + 1) + ": " + s.Name + " " + s.Value, Color.White, GameResources.GameFont("Courier"), SCORES_LEFT, SCORES_TOP + i * SCORE_GAP); } else { SwinGame.DrawText(i + 1 + ": " + s.Name + " " + s.Value, Color.White, GameResources.GameFont("Courier"), SCORES_LEFT, SCORES_TOP + i * SCORE_GAP); } } }
/// <summary> /// Draw the end of the game screen, shows the win/lose state /// </summary> public static void DrawEndOfGame() { UtilityFunctions.DrawField(GameController.ComputerPlayer.PlayerGrid, GameController.ComputerPlayer, true); UtilityFunctions.DrawSmallField(GameController.HumanPlayer.PlayerGrid, GameController.HumanPlayer); if (GameController.HumanPlayer.IsDestroyed) { SwinGame.DrawTextLines("YOU LOSE!", Color.White, Color.Transparent, GameResources.GameFont("ArialLarge"), FontAlignment.AlignCenter, 0, 250, SwinGame.ScreenWidth(), SwinGame.ScreenHeight()); } else { SwinGame.DrawTextLines("-- WINNER --", Color.White, Color.Transparent, GameResources.GameFont("ArialLarge"), FontAlignment.AlignCenter, 0, 250, SwinGame.ScreenWidth(), SwinGame.ScreenHeight()); } }
/// <summary> /// Draws the game during the attack phase. /// </summary>s public static void DrawDiscovery() { const int SCORES_LEFT = 172; const int SHOTS_TOP = 157; const int HITS_TOP = 206; const int SPLASH_TOP = 256; if ((SwinGame.KeyDown(KeyCode.vk_LSHIFT) | SwinGame.KeyDown(KeyCode.vk_RSHIFT)) & SwinGame.KeyDown(KeyCode.vk_c)) { UtilityFunctions.DrawField(GameController.HumanPlayer.EnemyGrid, GameController.ComputerPlayer, true); } else { UtilityFunctions.DrawField(GameController.HumanPlayer.EnemyGrid, GameController.ComputerPlayer, false); } UtilityFunctions.DrawSmallField(GameController.HumanPlayer.PlayerGrid, GameController.HumanPlayer); UtilityFunctions.DrawMessage(); SwinGame.DrawText(GameController.HumanPlayer.Shots.ToString(), Color.White, GameResources.GameFont("Menu"), SCORES_LEFT, SHOTS_TOP); SwinGame.DrawText(GameController.HumanPlayer.Hits.ToString(), Color.White, GameResources.GameFont("Menu"), SCORES_LEFT, HITS_TOP); SwinGame.DrawText(GameController.HumanPlayer.Missed.ToString(), Color.White, GameResources.GameFont("Menu"), SCORES_LEFT, SPLASH_TOP); }
//Music private static void LoadMusic() { GameResources.NewMusic("Background", "horrordrone.mp3"); }
/* <summary> * Adding new imagies to the _Image object * </summary */ private static void NewTransparentColourImage(string imageName, string fileName, Color transColor) { GameResources.NewTransparentColorImage(imageName, fileName, transColor); }
/// <summary> /// Draws the menu at the indicated level. /// </summary> /// <param name="menu">the menu to draw</param> /// <param name="level">the level (height) of the menu</param> /// <param name="xOffset">the offset of the menu</param> /// <remarks> /// The menu text comes from the _menuStructure field. The level indicates the height /// of the menu, to enable sub menus. The xOffset repositions the menu horizontally /// to allow the submenus to be positioned correctly. /// </remarks> private static void DrawButtons(int menu, int level, int xOffset) { int btnTop = 0; btnTop = MENU_TOP - (MENU_GAP + BUTTON_HEIGHT) * level; int i = 0; for (i = 0; i <= _menuStructure[menu].Length - 1; i++) { int btnLeft = 0; btnLeft = MENU_LEFT + BUTTON_SEP * (i + xOffset); //SwinGame.FillRectangle(Color.White, btnLeft, btnTop, BUTTON_WIDTH, BUTTON_HEIGHT) SwinGame.DrawTextLines(_menuStructure[menu][i], MENU_COLOR, Color.Black, GameResources.GameFont("Menu"), FontAlignment.AlignCenter, btnLeft + TEXT_OFFSET, btnTop + TEXT_OFFSET, BUTTON_WIDTH, BUTTON_HEIGHT); if (SwinGame.MouseDown(MouseButton.LeftButton) & IsMouseOverMenu(i, level, xOffset)) { SwinGame.DrawRectangle(HIGHLIGHT_COLOR, btnLeft, btnTop, BUTTON_WIDTH, BUTTON_HEIGHT); } } }
/*<summary> * Draws the message to the screen *</screens> */ public static void DrawMessage() { SwinGame.DrawText(Message, MESSAGE_COLOR, GameResources.GameFont("Courier"), MESSAGE_LEFT, MESSAGE_TOP); }
/*<summary> * Draws the player's grid and ships. *</summary> *<param name="grid">the grid to show</param> *<param name="thePlayer">the player to show the ships of</param> *<param name="small">true if the small grid is shown</param> *<param name="showShips">true if ships are to be shown</param> *<param name="left">the left side of the grid</param> *<param name="top">the top of the grid</param> *<param name="width">the width of the grid</param> *<param name="height">the height of the grid</param> *<param name="cellWidth">the width of each cell</param> *<param name="cellHeight">the height of each cell</param> *<param name="cellGap">the gap between the cells</param> */ private static void DrawCustomField(ISeaGrid grid, Player thePlayer, bool small, bool showShips, int left, int top, int width, int height, int cellWidth, int cellHeight, int cellGap) { //SwinGame.FillRectangle (Color.Blue, left, top, width, height); int rowTop; int colLeft; // Draw the grid for (int row = 0; (row <= 9); row++) { rowTop = (top + ((cellGap + cellHeight) * row)); for (int col = 0; (col <= 9); col++) { colLeft = (left + ((cellGap + cellWidth) * col)); Color fillColor = default(Color); bool draw; draw = true; switch (grid[row, col]) { //case TileView.Ship: //draw = false; //if (small) { // fillColor = SMALL_SHIP; //} else { //fillColor = LARGE_SHIP; //} //break; case TileView.Miss: if (small) { fillColor = SMALL_MISS; } else { SwinGame.DrawBitmap(GameResources.GameImage("MissMarker"), colLeft, rowTop); fillColor = LARGE_MISS; } break; case TileView.Hit: if (small) { fillColor = SMALL_HIT; } else { SwinGame.DrawBitmap(GameResources.GameImage("HitMarker"), colLeft, rowTop); fillColor = LARGE_HIT; } break; case TileView.Sea: case TileView.Ship: if (small) { fillColor = SMALL_SEA; } else { draw = false; } break; } if (draw) { if (small) { SwinGame.FillRectangle(fillColor, colLeft, rowTop, cellWidth, cellHeight); } if (!small) { SwinGame.DrawRectangle(OUTLINE_COLOR, colLeft, rowTop, cellWidth, cellHeight); } } } } if (!showShips) { return; } int shipHeight = 0; int shipWidth = 0; string shipName = null; // Draw the ships foreach (Ship s in thePlayer) { if (s == null || !s.IsDeployed) { continue; } rowTop = top + (cellGap + cellHeight) * s.Row + SHIP_GAP; colLeft = left + (cellGap + cellWidth) * s.Column + SHIP_GAP; //fixed here if ((s.Direction == Direction.LeftRight)) { //left right shipName = ("ShipLR" + s.Size); shipHeight = (cellHeight - (SHIP_GAP * 2)); //changed this - to a + shipWidth = (((cellWidth + cellGap) * s.Size) - ((SHIP_GAP * 2) + cellGap)); } else { // Up down shipName = ("ShipUD" + s.Size); //changed this - to a + shipHeight = (((cellHeight + cellGap) * s.Size) - ((SHIP_GAP * 2) + cellGap)); shipWidth = (cellWidth - (SHIP_GAP * 2)); } if (!small) { SwinGame.DrawBitmap(GameResources.GameImage(shipName), colLeft, rowTop); } else { SwinGame.FillRectangle(SHIP_FILL_COLOR, colLeft, rowTop, shipWidth, shipHeight); SwinGame.DrawRectangle(SHIP_OUTLINE_COLOR, colLeft, rowTop, shipWidth, shipHeight); } } }