/// <summary> /// Get a new random map. /// </summary> private void GenerateNewMap() { //If in demo mode, score is reset to 0 (this will either be when the game is loaded or when the player //quits to the main menu if (Stage.GameState.DemoMode) Score = 0; else { //Update score Score += Level * ScorePerLevel; if (TimeOnLevel < 200) Score += Level * (200 - TimeOnLevel); } int dimention = 12; int wallstobreak = 24; //clear breadcrumbs LastVisitedSquare = Point.Zero; VisitedGridSquares = new List<Point>(); //Randomise Stage Manager's map. Stage.GenerateNewRandomSquareMap(dimention, wallstobreak); // NEW COLLISION/LOS MODEL DATA Stage.Map.CalculateWallCollision(); // Get collision grid data and load into camera class. bool[] bg = new bool[Stage.Map.Width * Stage.Map.Height]; for (int y = 0; y < Stage.Map.Height; y++) { for (int x = 0; x < Stage.Map.Width; x++) { if (Stage.Map.GetSquareAt(x, y).type == MapSquareType.Closed) bg[x + (y * Stage.Map.Width)] = true; else bg[x + (y * Stage.Map.Width)] = false; } } //Get starting location. List<Vector2> exclusion = new List<Vector2>(); int playerquater = Helpers.RandomInt(1, 4); Vector2 StartingLocation = Stage.Map.GetRandomSquareCoordsByType(MapSquareType.Open, null, exclusion, playerquater); //Get Monster Starting Location. int monsterquater = playerquater; while (monsterquater == playerquater) monsterquater = Helpers.RandomInt(1, 4); exclusion.Add(StartingLocation); Vector2 MonsterStartingLocation = Stage.Map.GetRandomSquareCoordsByType(MapSquareType.Open, null, exclusion, monsterquater); //Get teleporter starting location. int teleporterquater = playerquater; while (teleporterquater == playerquater || teleporterquater == monsterquater) teleporterquater = Helpers.RandomInt(1, 4); //exclusion.Add(MonsterStartingLocation); // Makes it too easy Vector2 TeleporterStartingLocation = Stage.Map.GetRandomSquareCoordsByType(MapSquareType.Open, null, exclusion, teleporterquater); //Init camera/Player fpsCam = new QuakeCamera(GraphicsDevice.Viewport, new Vector3(StartingLocation.X*16 +4,10.0f,StartingLocation.Y*16+4), 0, 0); fpsCam.SetFacingDegrees(0); //Init Teleporter TeleporterGridLocation = TeleporterStartingLocation; TeleporterLocation = new Vector3(TeleporterStartingLocation.X * 16, 10.0f, TeleporterStartingLocation.Y * 16); TeleporterRenderLocation = new Vector3(TeleporterStartingLocation.X * 16, -10.0f, TeleporterStartingLocation.Y * 16); fpsCam.CollisionGrid = bg; fpsCam.GridHeight = Stage.Map.Height; fpsCam.GridWidth = Stage.Map.Width; fpsCam.SquareWidth = 8; fpsCam.SquareHeight = 8; //Init Monster Stage.ClearEntities(true, true); monster = new Actor(); monster.CollisionGrid = bg; monster.GridWidth = Stage.Map.Width; monster.GridHeight = Stage.Map.Height; monster.SetFacingDegrees(-90); monster.SetLocation(MonsterStartingLocation.X*16+4, 10, MonsterStartingLocation.Y*16 +4); monster.FacingOffset = MathHelper.ToRadians(270); monster.FOV = 355.0f; monster.UpdateWorldMatrix(); monster.Behaviours = FLAG_Behaviours.AGGRESSIVE | FLAG_Behaviours.MONSTER | FLAG_Behaviours.EVIL_GENIUS; monster.ScalingFactor = 1.0f; monster.FightRange = 2.0f; monster.HearingRadius = 640.0f; monster.SightRadius = 640.0f; monster.InstanceName = "Rex"; monster.movespeed = 0.28f + MonsterSpeedupFactor*Level; //Set model monster.DefaultModel = monsterModel; //Set material Material monsterMaterial = new Material(Content, GraphicsDevice, baseEffect); monsterMaterial.SetTexturedMaterial(Color.White, Stage.ConfigurationSettings.WallSpecularPower, Stage.ConfigurationSettings.WallSpecularIntensity, "eyestex", "eyestex", 20f, 20f); monsterMaterial.Scaled = true; monster.DefaultMaterials.Add("default", monsterMaterial); //Load the monster into the Stage manager and bring him onstage. Stage.LoadActor(monster); Stage.BringActorOnStage("Rex"); //Init Demo Zombie -- In demo mode the demo zombie patrolls a list of random waypoints and the player follows it. //The demo zombie is invisible. if (Stage.GameState.DemoMode) { demoZombie = new Actor(); demoZombie.CollisionGrid = bg; demoZombie.GridWidth = Stage.Map.Width; demoZombie.GridHeight = Stage.Map.Height; demoZombie.SetFacingDegrees(-90); demoZombie.SetLocation(StartingLocation.X * 16 + 4, 10, StartingLocation.Y * 16 + 4); demoZombie.FacingOffset = MathHelper.ToRadians(270); demoZombie.FOV = 355.0f; demoZombie.UpdateWorldMatrix(); demoZombie.Behaviours = FLAG_Behaviours.PATROLLER | FLAG_Behaviours.MONSTER; demoZombie.ScalingFactor = 0.0f; demoZombie.FightRange = 0.0f; demoZombie.HearingRadius = 0.0f; demoZombie.SightRadius = 0.0f; demoZombie.InstanceName = "Zombie"; demoZombie.movespeed = 0.56f; //Set up the zombie's waypoints. //Set up patrol list. Vector2 lastLocation = Stage.Map.GetRandomSquareCoordsByType(MapSquareType.Open, null, null, 0); Vector2 nextLocation = lastLocation; Stage.Graph.SearchAStarPath(StartingLocation, nextLocation); demoZombie.SimplePatrolList = Stage.Graph.GetPathList(); //The last node of this list will always be the same as the first node of the next list. This affects the direction in which the actor[0] looks //so. for (int zombiepaths = 0; zombiepaths < 10; zombiepaths++) { demoZombie.SimplePatrolList.RemoveAt(demoZombie.SimplePatrolList.Count - 1); nextLocation = Stage.Map.GetRandomSquareCoordsByType(MapSquareType.Open, null, null, 0); Stage.Graph.SearchAStarPath(lastLocation, nextLocation); demoZombie.SimplePatrolList.AddRange(Stage.Graph.GetPathList()); lastLocation = nextLocation; } demoZombie.SimplePatrolList.RemoveAt(demoZombie.SimplePatrolList.Count - 1); nextLocation = StartingLocation; Stage.Graph.SearchAStarPath(lastLocation, nextLocation); demoZombie.SimplePatrolList.AddRange(Stage.Graph.GetPathList()); //Set model demoZombie.DefaultModel = monsterModel; //Set material Material zombieMaterial = new Material(Content, GraphicsDevice, baseEffect); zombieMaterial.SetTexturedMaterial(Color.White, Stage.ConfigurationSettings.WallSpecularPower, Stage.ConfigurationSettings.WallSpecularIntensity, "banner", "banner", 1f, 1f); zombieMaterial.Scaled = true; demoZombie.DefaultMaterials.Add("default", monsterMaterial); //Load the monster into the Stage manager and bring him onstage. Stage.LoadActor(demoZombie); Stage.BringActorOnStage("Zombie"); } //Update level Level++; TimeInGame += TimeOnLevel; TimeOnLevel = -1; if (Stage.GameState.DemoMode) Level = 0; }