/// <summary> /// Seareches for the available respawn quarter for the given playerDefaultGuns. /// </summary> /// <param name="quarterOwner">The given player that has to be respawned</param> /// <param name="gameTime">Game time</param> /// <returns>Quarter where the given player can be respawned</returns> TownQuarter FindAndRespawnQuartersFor(ITownQuarterOwner quarterOwner, GameTime gameTime) { TownQuarter newPosQuarter = null; IOrderedEnumerable <TownQuarter> randomizedQuarters = from q in town.Quarters where q.Owner == quarterOwner || q.Owner == EmptyTownQuarterOwner.Instance orderby random.Next() select q; foreach (TownQuarter quarter in town.Quarters) { if (quarter.Owner == quarterOwner) { if (newPosQuarter == null) { newPosQuarter = quarter; } else { quarter.SetOwner(EmptyTownQuarterOwner.Instance, gameTime); } } } if (newPosQuarter == null) { newPosQuarter = randomizedQuarters.First(); } return(newPosQuarter); }
/// <summary> /// Sets the new owner of the quarter. /// </summary> /// <param name="newOwner">The new owner</param> /// <param name="gameTime">Game time</param> public void SetOwner(ITownQuarterOwner newOwner, GameTime gameTime) { lastTimeGuardAdded = gameTime.TotalGameTime; owner = newOwner; roadSignTexture.Dispose(); GenerateRoadSignPicture(); foreach (Plate roadSign in roadSignsPointingToMe) { roadSign.SetFront(roadSignTexture, true); } flag.SetModel(owner.Content.FlagModel, game.Drawer.WorldTransformMatrix); ownershipBeginTime = gameTime.TotalGameTime; if (boxes.Count == 0) { AddBoxesDuringTheGame(); } }
/// <summary> /// Creates new town quarter as map fragment. Generates roads, buildings, etc. /// </summary> /// <param name="size">Size of quarter without joining interface</param> /// <param name="degree">Number of quarter's interfaces (joining streets)</param> public TownQuarter(ActionGame game, Vector2 size, int degree) { owner = EmptyTownQuarterOwner.Instance; this.game = game; interfaces = new List <TownQuarterInterface>(degree); if (nameRepository.Count > 0) { Random rand = new Random(); int nameIndex = rand.Next(0, nameRepository.Count - 1); Name = nameRepository[nameIndex]; nameRepository.RemoveAt(nameIndex); } else { Name = emptyName; } int xSize = (int)Math.Floor(size.X / SquareWidth); int ySize = (int)Math.Floor(size.Y / SquareWidth); bitmapSize = new System.Drawing.Size(xSize, ySize); mapBitmap = new MapFillType[bitmapSize.Width * bitmapSize.Height]; for (int i = 0; i < mapBitmap.Length; i++) { mapBitmap[i] = MapFillType.Empty; } spaceGrid = new Grid(bitmapSize.Width, bitmapSize.Height, GridFiledWidth, GridFiledWidth); try { Generate(degree); } catch (Exception ex) { if (Name != emptyName) { nameRepository.Add(Name); } throw ex; } spaceGrid.Fill(GetAllSolidObjects()); }
/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { if (running) { base.Update(gameTime); Debug.Write("UPS", 1d / gameTime.ElapsedGameTime.TotalSeconds); // Allows the game to exit if (Keyboard.GetState().IsKeyDown(Keys.Escape)) { this.Restart(); return; } bool opponentInTheSameQuarter = opponent.Position.Quarter == town.CurrentQuarter; if (!opponentInTheSameQuarter) { opponent.Position.Quarter.Update(gameTime, true); } if (town.SecondaryDrawnQuarter != null && town.SecondaryDrawnQuarter != opponent.Position.Quarter && town.SecondaryDrawnQuarter != player.Position.Quarter && !gameTime.IsRunningSlowly) { town.SecondaryDrawnQuarter.Update(gameTime, false); } opponent.Update(gameTime, !opponentInTheSameQuarter); player.Update(gameTime); ITownQuarterOwner owner = town.Quarters[0].Owner; if ((owner == player || owner == opponent) && town.Quarters.All(q => q.Owner == owner)) { System.Drawing.Bitmap townMap = town.CreateTownMapImage(); PrepareEnd(); bool playAgain; using (GameOver gameOver = new GameOver(owner == player, townMap)) { System.Windows.Forms.DialogResult result = gameOver.ShowDialog(); playAgain = result != System.Windows.Forms.DialogResult.Cancel; } townMap.Dispose(); if (playAgain) { ShowMainMenuDialog(false); PrepareStart(); } else { Exit(); } return; } if (player.Health <= 0) { TownQuarter newQuarter = FindAndRespawnQuartersFor(player, gameTime); player.RespawnInto(newQuarter); drawer.ShowMessage(gameTime, String.Format("You were killed! You are now in {0}.", newQuarter.Name)); town.CurrentQuarter = newQuarter; drawer.ShowFullscreenEffect(gameTime, contentRepository.RespawnFullscreenEffect, Player.RespawnFullscreenEffectDuration); } if (opponent.Health <= 0) { TownQuarter newQuarter = FindAndRespawnQuartersFor(opponent, gameTime); opponent.RespawnInto(newQuarter); opponent.ClearTasks(); drawer.ShowMessage(gameTime, String.Format("Congratulations, your opponent was killed. He respawned in {0}.", newQuarter.Name)); } } }
/// <summary> /// Creates new town quarter as map fragment. Generates roads, buildings, etc. /// </summary> /// <param name="size">Size of quarter without joining interface</param> /// <param name="degree">Number of quarter's interfaces (joining streets)</param> public TownQuarter(ActionGame game, Vector2 size, int degree) { owner = EmptyTownQuarterOwner.Instance; this.game = game; interfaces = new List<TownQuarterInterface>(degree); if (nameRepository.Count > 0) { Random rand = new Random(); int nameIndex = rand.Next(0, nameRepository.Count - 1); Name = nameRepository[nameIndex]; nameRepository.RemoveAt(nameIndex); } else { Name = emptyName; } int xSize = (int)Math.Floor(size.X / SquareWidth); int ySize = (int)Math.Floor(size.Y / SquareWidth); bitmapSize = new System.Drawing.Size(xSize, ySize); mapBitmap = new MapFillType[bitmapSize.Width * bitmapSize.Height]; for (int i = 0; i < mapBitmap.Length; i++) mapBitmap[i] = MapFillType.Empty; spaceGrid = new Grid(bitmapSize.Width, bitmapSize.Height, GridFiledWidth, GridFiledWidth); try { Generate(degree); } catch (Exception ex) { if (Name != emptyName) { nameRepository.Add(Name); } throw ex; } spaceGrid.Fill(GetAllSolidObjects()); }
/// <summary> /// Seareches for the available respawn quarter for the given playerDefaultGuns. /// </summary> /// <param name="quarterOwner">The given player that has to be respawned</param> /// <param name="gameTime">Game time</param> /// <returns>Quarter where the given player can be respawned</returns> TownQuarter FindAndRespawnQuartersFor(ITownQuarterOwner quarterOwner, GameTime gameTime) { TownQuarter newPosQuarter = null; IOrderedEnumerable<TownQuarter> randomizedQuarters = from q in town.Quarters where q.Owner == quarterOwner || q.Owner == EmptyTownQuarterOwner.Instance orderby random.Next() select q; foreach (TownQuarter quarter in town.Quarters) { if (quarter.Owner == quarterOwner) { if (newPosQuarter == null) { newPosQuarter = quarter; } else { quarter.SetOwner(EmptyTownQuarterOwner.Instance, gameTime); } } } if (newPosQuarter == null) { newPosQuarter = randomizedQuarters.First(); } return newPosQuarter; }