// _ _ //|_| | //|_|_| private void levelRightVertTwoCorner(LevelFragment topLeftFragment, LevelFragment bottomLeftFragment, LevelFragment rightFragment, int x, int y) { if (rightFragment.type != LevelContent.Type.HalfVertical) { throw new ArgumentException("Right fragment must be a vertical half", "rightFragment"); } if (topLeftFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("Both left fragments must be corners", "topLeftFragment"); } if (bottomLeftFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("Both left fragments must be corners", "bottomLeftFragment"); } initializeLevel(x, y); setFragmentIntoLevel(topLeftFragment, FragmentPosition.TopLeftCorner); setFragmentIntoLevel(bottomLeftFragment, FragmentPosition.BottomLeftCorner); setFragmentIntoLevel(rightFragment, FragmentPosition.RightHalf); setWallIntoLevel(BorderWall.Vert, 1, 0); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
// Create level from full fragment // _ _ //| | //|_ _| private void levelFull(LevelFragment fullFragment, int x, int y) { //initialize separately from fragmented levels because making a full level is simpler pathfinding = new AStarPathfinding(GRID_SIZE, GRID_SIZE); xPos = x; yPos = y; alive = true; levelOverlayTexture = new Texture2D(RetroGame.graphicsDevice, TEX_SIZE, TEX_SIZE); Color[] data = new Color[TEX_SIZE * TEX_SIZE]; fragmentGrid[0, 0] = fullFragment; fragmentGrid[0, 1] = fullFragment; fragmentGrid[1, 0] = fullFragment; fragmentGrid[1, 1] = fullFragment; grid = (LevelContent.LevelTile[, ])fullFragment.grid.Clone(); grid = new LevelContent.LevelTile[GRID_SIZE, GRID_SIZE]; for (int i = 0; i < GRID_SIZE; i++) { for (int j = 0; j < GRID_SIZE; j++) { grid[i, j] = fullFragment.grid[i, j]; // cut off last row and column of fragment } } collectableLocations = fullFragment.collectableLocations; enemyLocations = fullFragment.enemyLocations; prisonerLocations = fullFragment.prisonerLocations; powerupLocations = fullFragment.powerupLocations; finalizeLevel(); }
// _ _ //|___| //|_|_| private void levelTopHorizTwoCorner(LevelFragment topFragment, LevelFragment bottomLeftFragment, LevelFragment bottomRightFragment, int x, int y) { if (topFragment.type != LevelContent.Type.HalfHorizontal) { throw new ArgumentException("Top fragment must be a horizontal half", "topFragment"); } if (bottomLeftFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("Both bottom fragments must be corners", "bottomLeftFragment"); } if (bottomRightFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("Both bottom fragments must be corners", "bottomRightFragment"); } initializeLevel(x, y); setFragmentIntoLevel(topFragment, FragmentPosition.TopHalf); setFragmentIntoLevel(bottomLeftFragment, FragmentPosition.BottomLeftCorner); setFragmentIntoLevel(bottomRightFragment, FragmentPosition.BottomRightCorner); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Horiz, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
// _ _ //|_|_| //|_|_| private void levelFourCorner(LevelFragment topLeftFragment, LevelFragment topRightFragment, LevelFragment bottomLeftFragment, LevelFragment bottomRightFragment, int x, int y) { if (topLeftFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("All fragments must be corners", "topLeftFragment"); } if (topRightFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("All fragments must be corners", "topRightFragment"); } if (bottomLeftFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("All fragments must be corners", "bottomLeftFragment"); } if (bottomRightFragment.type != LevelContent.Type.Corner) { throw new ArgumentException("All fragments must be corners", "bottomRightFragment"); } initializeLevel(x, y); setFragmentIntoLevel(topLeftFragment, FragmentPosition.TopLeftCorner); setFragmentIntoLevel(topRightFragment, FragmentPosition.TopRightCorner); setFragmentIntoLevel(bottomLeftFragment, FragmentPosition.BottomLeftCorner); setFragmentIntoLevel(bottomRightFragment, FragmentPosition.BottomRightCorner); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Vert, 1, 0); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Horiz, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
public void createSpecificLevelAt(LevelFragment fullLevelFragment, int xPos, int yPos) { if (fullLevelFragment.type != LevelContent.Type.Full) { throw new ArgumentException("Creating a specific level requires a full level fragment", "fullLevelFragment"); } levels[xPos, yPos] = new Level(this, fullLevelFragment, xPos, yPos); currentLevels = null; // make the CurrentLevels list be recalculated }
public void Initialize(int numPlayers, bool createNewHeroes, LevelFragment fullIntroLevelFragment, Point startingLevel) { if (numPlayers <= 0 || numPlayers > RetroGame.MAX_PLAYERS) { throw new ArgumentOutOfRangeException("numPlayers", "Number of players must be between 1 and " + RetroGame.MAX_PLAYERS); } if (fullIntroLevelFragment.type != LevelContent.Type.Full) { throw new ArgumentException("LevelManager must be initialized with a Full LevelFragment", "fullIntroLevelFragment"); } if (createNewHeroes) { heroes = new Hero[numPlayers]; for (int i = 0; i < heroes.Length; i++) { heroes[i] = new Hero((PlayerIndex)Enum.Parse(typeof(PlayerIndex), i.ToString())); heroes[i].Initialize(); } } createSpecificLevelAt(fullIntroLevelFragment, startingLevel.X, startingLevel.Y); if (fullIntroLevelFragment.type == LevelContent.Type.Full) { for (int i = 0; i < numPlayers; i++) { for (int j = 0; j < fullIntroLevelFragment.specialTiles[i].Length; j++) { if (fullIntroLevelFragment.specialTiles[i][j] != null) { levels[startingLevel.X, startingLevel.Y].powerups.Add(newPowerup(Powerups.SPECIAL_INTRO_POWERUPS[j], fullIntroLevelFragment.specialTiles[i][j][0], fullIntroLevelFragment.specialTiles[i][j][1], levels[startingLevel.X, startingLevel.Y])); } } if (fullIntroLevelFragment.heroTiles[0] != null && heroes.Length >= 1) { heroes[i].position = new Vector2(Level.TEX_SIZE * startingLevel.X + (Level.TILE_SIZE * (fullIntroLevelFragment.heroTiles[i][0] + 0.5f)), Level.TEX_SIZE * startingLevel.Y + (Level.TILE_SIZE * (fullIntroLevelFragment.heroTiles[i][1] + 0.5f))); } } } foreach (Hero hero in heroes) { hero.updateCurrentLevelAndTile(); } SetCameraMode(CameraMode.Arena); }
public StoreLevel(LevelManager levelManager, LevelFragment storeLevelFragment, IList<Type> powerupTypesToUse, int xPos, int yPos) : base(levelManager, storeLevelFragment, xPos, yPos) { alreadyUsedTypes.Initialize(); PowerupIcon icon; for (int i = 0; i < NUM_RANDOM_POWERUPS; i++) { int tileX = RANDOM_POWERUPS_TILEX[i]; int tileY = RANDOM_POWERUPS_TILEY; Type powerupType = null; if (powerupTypesToUse == null) powerupType = Powerups.RandomPowerupType(except: alreadyUsedTypes.Union(Inventory.AllCurrentlyOwnedPowerupsTypes).ToList()); else powerupType = powerupTypesToUse[i]; icon = levelManager.newPowerup(powerupType, tileX, tileY, this); icon.DrawDetails = true; icon.DetailsAboveIcon = true; icon.subtractCostOnCollected = true; powerups.Add(icon); icons.Add(icon); alreadyUsedTypes[i] = icon.powerupType; } icon = levelManager.newRegeneratingPowerup(typeof(HealthPickup), HEALTH_POSITION.X, HEALTH_POSITION.Y, this); icon.DrawDetails = true; icon.DetailsAboveIcon = false; icon.subtractCostOnCollected = true; powerups.Add(icon); icons.Add(icon); icon = levelManager.newRegeneratingPowerup(typeof(SandPickup), SAND_POSITION.X, SAND_POSITION.Y, this); icon.DrawDetails = true; icon.DetailsAboveIcon = false; icon.subtractCostOnCollected = true; powerups.Add(icon); icons.Add(icon); icon = levelManager.newRegeneratingPowerup(typeof(BombPickup), BOMB_POSITION.X, BOMB_POSITION.Y, this); icon.DrawDetails = true; icon.DetailsAboveIcon = false; icon.subtractCostOnCollected = true; powerups.Add(icon); icons.Add(icon); icon = levelManager.newPowerup(typeof(RevivePickup), REVIVE_POSITION.X, REVIVE_POSITION.Y, this); icon.DrawDetails = true; icon.DetailsAboveIcon = false; icon.subtractCostOnCollected = true; powerups.Add(icon); icons.Add(icon); }
// _ _ //|___| //|_ _| private void levelTwoHoriz(LevelFragment topFragment, LevelFragment bottomFragment, int x, int y) { if (topFragment.type != LevelContent.Type.HalfHorizontal) { throw new ArgumentException("Both fragments must be horizontal halves", "topFragment"); } if (bottomFragment.type != LevelContent.Type.HalfHorizontal) { throw new ArgumentException("Both fragments must be horizontal halves", "bottomFragment"); } initializeLevel(x, y); setFragmentIntoLevel(topFragment, FragmentPosition.TopHalf); setFragmentIntoLevel(bottomFragment, FragmentPosition.BottomHalf); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Horiz, 1, 1); finalizeLevel(); }
// _ _ //| | | //|_|_| private void levelTwoVert(LevelFragment leftFragment, LevelFragment rightFragment, int x, int y) { if (leftFragment.type != LevelContent.Type.HalfVertical) { throw new ArgumentException("Both fragments must be vertical halves", "leftFragment"); } if (rightFragment.type != LevelContent.Type.HalfVertical) { throw new ArgumentException("Both fragments must be vertical halves", "rightFragment"); } initializeLevel(x, y); setFragmentIntoLevel(leftFragment, FragmentPosition.LeftHalf); setFragmentIntoLevel(rightFragment, FragmentPosition.RightHalf); setWallIntoLevel(BorderWall.Vert, 1, 0); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
public void DrawDebug(SpriteBatch spriteBatch) { Vector2 baseOffset = new Vector2(xPos * TEX_SIZE, yPos * TEX_SIZE); bool[,] fragmentAlreadyDrawn = new bool[2, 2]; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { Vector2 fragmentOffset = new Vector2(i * TILE_SIZE * (LevelContent.LEVEL_SIZE_HALF - 1), j * TILE_SIZE * (LevelContent.LEVEL_SIZE_HALF - 1)); LevelFragment fragment = fragmentGrid[i, j]; if (!fragmentAlreadyDrawn[i, j]) { spriteBatch.Draw(fragment.levelTextureDebug, baseOffset + fragmentOffset, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1); switch (fragment.type) { case LevelContent.Type.Full: fragmentAlreadyDrawn[0, 0] = fragmentAlreadyDrawn[0, 1] = fragmentAlreadyDrawn[1, 0] = fragmentAlreadyDrawn[1, 1] = true; break; case LevelContent.Type.HalfHorizontal: fragmentAlreadyDrawn[0, j] = fragmentAlreadyDrawn[1, j] = true; break; case LevelContent.Type.HalfVertical: fragmentAlreadyDrawn[i, 0] = fragmentAlreadyDrawn[i, 1] = true; break; case LevelContent.Type.Corner: fragmentAlreadyDrawn[i, j] = true; break; } } } } }
// Helper function to set parts of the level private void setFragmentIntoLevel(LevelFragment fragment, FragmentPosition position) { int texWidth = fragment.levelTexture.Width; int texHeight = fragment.levelTexture.Height; int gridWidth = fragment.grid.GetLength(0); int gridHeight = fragment.grid.GetLength(1); int texStartWidth = 0; int texStartHeight = 0; int gridStartWidth = 0; int gridStartHeight = 0; switch (position) { case FragmentPosition.LeftHalf: case FragmentPosition.TopHalf: texStartWidth = 0; texStartHeight = 0; gridStartWidth = 0; gridStartHeight = 0; break; case FragmentPosition.TopLeftCorner: texStartWidth = 0; texStartHeight = 0; gridStartWidth = 0; gridStartHeight = 0; break; case FragmentPosition.RightHalf: case FragmentPosition.TopRightCorner: texStartWidth = texWidth + TILE_SIZE; texStartHeight = 0; gridStartWidth = gridWidth - 1; gridStartHeight = 0; break; case FragmentPosition.BottomHalf: case FragmentPosition.BottomLeftCorner: texStartWidth = 0; texStartHeight = texHeight + TILE_SIZE; gridStartWidth = 0; gridStartHeight = gridHeight - 1; break; case FragmentPosition.BottomRightCorner: texStartWidth = texWidth + TILE_SIZE; texStartHeight = texHeight + TILE_SIZE; gridStartWidth = gridWidth - 1; gridStartHeight = gridHeight - 1; break; } //cut off last row/column if necessary switch (position) { case FragmentPosition.LeftHalf: case FragmentPosition.BottomLeftCorner: gridHeight--; break; case FragmentPosition.TopHalf: case FragmentPosition.TopRightCorner: gridWidth--; break; case FragmentPosition.RightHalf: case FragmentPosition.BottomHalf: case FragmentPosition.BottomRightCorner: gridWidth--; gridHeight--; break; } //color grid switch (position) { case FragmentPosition.LeftHalf: fragmentGrid[0, 0] = fragment; fragmentGrid[0, 1] = fragment; break; case FragmentPosition.RightHalf: fragmentGrid[1, 0] = fragment; fragmentGrid[1, 1] = fragment; break; case FragmentPosition.TopHalf: fragmentGrid[0, 0] = fragment; fragmentGrid[1, 0] = fragment; break; case FragmentPosition.BottomHalf: fragmentGrid[0, 1] = fragment; fragmentGrid[1, 1] = fragment; break; case FragmentPosition.TopLeftCorner: fragmentGrid[0, 0] = fragment; break; case FragmentPosition.TopRightCorner: fragmentGrid[1, 0] = fragment; break; case FragmentPosition.BottomLeftCorner: fragmentGrid[0, 1] = fragment; break; case FragmentPosition.BottomRightCorner: fragmentGrid[1, 1] = fragment; break; } //level grid grid.setDataRectangle<LevelContent.LevelTile>(new Rectangle(gridStartWidth, gridStartHeight, gridWidth, gridHeight), fragment.grid); //locations collectableLocations.AddRange(fragment.getCollectableLocations(position)); enemyLocations.AddRange(fragment.getEnemyLocations(position)); prisonerLocations.AddRange(fragment.getPrisonerLocations(position)); powerupLocations.AddRange(fragment.getPowerupLocations(position)); }
// _ _ //| | | //|_|_| private void levelTwoVert(LevelFragment leftFragment, LevelFragment rightFragment, int x, int y) { if (leftFragment.type != LevelContent.Type.HalfVertical) throw new ArgumentException("Both fragments must be vertical halves", "leftFragment"); if (rightFragment.type != LevelContent.Type.HalfVertical) throw new ArgumentException("Both fragments must be vertical halves", "rightFragment"); initializeLevel(x, y); setFragmentIntoLevel(leftFragment, FragmentPosition.LeftHalf); setFragmentIntoLevel(rightFragment, FragmentPosition.RightHalf); setWallIntoLevel(BorderWall.Vert, 1, 0); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
// _ _ //|___| //|_ _| private void levelTwoHoriz(LevelFragment topFragment, LevelFragment bottomFragment, int x, int y) { if (topFragment.type != LevelContent.Type.HalfHorizontal) throw new ArgumentException("Both fragments must be horizontal halves", "topFragment"); if (bottomFragment.type != LevelContent.Type.HalfHorizontal) throw new ArgumentException("Both fragments must be horizontal halves", "bottomFragment"); initializeLevel(x, y); setFragmentIntoLevel(topFragment, FragmentPosition.TopHalf); setFragmentIntoLevel(bottomFragment, FragmentPosition.BottomHalf); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Horiz, 1, 1); finalizeLevel(); }
// _ _ //|___| //|_|_| private void levelTopHorizTwoCorner(LevelFragment topFragment, LevelFragment bottomLeftFragment, LevelFragment bottomRightFragment, int x, int y) { if (topFragment.type != LevelContent.Type.HalfHorizontal) throw new ArgumentException("Top fragment must be a horizontal half", "topFragment"); if (bottomLeftFragment.type != LevelContent.Type.Corner) throw new ArgumentException("Both bottom fragments must be corners", "bottomLeftFragment"); if (bottomRightFragment.type != LevelContent.Type.Corner) throw new ArgumentException("Both bottom fragments must be corners", "bottomRightFragment"); initializeLevel(x, y); setFragmentIntoLevel(topFragment, FragmentPosition.TopHalf); setFragmentIntoLevel(bottomLeftFragment, FragmentPosition.BottomLeftCorner); setFragmentIntoLevel(bottomRightFragment, FragmentPosition.BottomRightCorner); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Horiz, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
// _ _ //|_| | //|_|_| private void levelRightVertTwoCorner(LevelFragment topLeftFragment, LevelFragment bottomLeftFragment, LevelFragment rightFragment, int x, int y) { if (rightFragment.type != LevelContent.Type.HalfVertical) throw new ArgumentException("Right fragment must be a vertical half", "rightFragment"); if (topLeftFragment.type != LevelContent.Type.Corner) throw new ArgumentException("Both left fragments must be corners", "topLeftFragment"); if (bottomLeftFragment.type != LevelContent.Type.Corner) throw new ArgumentException("Both left fragments must be corners", "bottomLeftFragment"); initializeLevel(x, y); setFragmentIntoLevel(topLeftFragment, FragmentPosition.TopLeftCorner); setFragmentIntoLevel(bottomLeftFragment, FragmentPosition.BottomLeftCorner); setFragmentIntoLevel(rightFragment, FragmentPosition.RightHalf); setWallIntoLevel(BorderWall.Vert, 1, 0); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
// Create level from full fragment // _ _ //| | //|_ _| private void levelFull(LevelFragment fullFragment, int x, int y) { //initialize separately from fragmented levels because making a full level is simpler pathfinding = new AStarPathfinding(GRID_SIZE, GRID_SIZE); xPos = x; yPos = y; alive = true; levelOverlayTexture = new Texture2D(RetroGame.graphicsDevice, TEX_SIZE, TEX_SIZE); Color[] data = new Color[TEX_SIZE * TEX_SIZE]; fragmentGrid[0, 0] = fullFragment; fragmentGrid[0, 1] = fullFragment; fragmentGrid[1, 0] = fullFragment; fragmentGrid[1, 1] = fullFragment; grid = (LevelContent.LevelTile[,])fullFragment.grid.Clone(); grid = new LevelContent.LevelTile[GRID_SIZE, GRID_SIZE]; for (int i = 0; i < GRID_SIZE; i++) for (int j = 0; j < GRID_SIZE; j++) { grid[i, j] = fullFragment.grid[i, j]; // cut off last row and column of fragment } collectableLocations = fullFragment.collectableLocations; enemyLocations = fullFragment.enemyLocations; prisonerLocations = fullFragment.prisonerLocations; powerupLocations = fullFragment.powerupLocations; finalizeLevel(); }
public virtual void Draw(SpriteBatch spriteBatch) { Vector2 baseOffset = new Vector2(xPos * Level.TEX_SIZE, yPos * Level.TEX_SIZE); bool[,] fragmentAlreadyDrawn = new bool[2, 2]; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { Vector2 fragmentOffset = new Vector2(i * Level.TILE_SIZE * (LevelContent.LEVEL_SIZE_HALF - 1), j * Level.TILE_SIZE * (LevelContent.LEVEL_SIZE_HALF - 1)); LevelFragment fragment = fragmentGrid[i, j]; if (!fragmentAlreadyDrawn[i, j]) { fragment.Draw(spriteBatch, baseOffset + fragmentOffset); switch (fragment.type) { case LevelContent.Type.Full: fragmentAlreadyDrawn[0, 0] = fragmentAlreadyDrawn[0, 1] = fragmentAlreadyDrawn[1, 0] = fragmentAlreadyDrawn[1, 1] = true; break; case LevelContent.Type.HalfHorizontal: fragmentAlreadyDrawn[0, j] = fragmentAlreadyDrawn[1, j] = true; break; case LevelContent.Type.HalfVertical: fragmentAlreadyDrawn[i, 0] = fragmentAlreadyDrawn[i, 1] = true; break; case LevelContent.Type.Corner: fragmentAlreadyDrawn[i, j] = true; break; } } } } //Draw border walls for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { int tileX = 0, tileY = 0; if (borderCornerColors[i, j] != null) { tileX = i * (BORDER_WALL_LENGTH + 1); tileY = j * (BORDER_WALL_LENGTH + 1); spriteBatch.Draw(texWall, baseOffset + new Vector2(tileX * TILE_SIZE, tileY * TILE_SIZE), null, borderCornerColors[i, j].Value, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1); } if (borderHorizColors[i, j] != null) { tileX = i * (BORDER_WALL_LENGTH + 1) + 1; tileY = j * (BORDER_WALL_LENGTH + 1); spriteBatch.Draw(texWallHoriz, baseOffset + new Vector2(tileX * TILE_SIZE, tileY * TILE_SIZE), null, borderHorizColors[i, j].Value, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1); } if (borderVertColors[i, j] != null) { tileX = i * (BORDER_WALL_LENGTH + 1); tileY = j * (BORDER_WALL_LENGTH + 1) + 1; spriteBatch.Draw(texWallVert, baseOffset + new Vector2(tileX * TILE_SIZE, tileY * TILE_SIZE), null, borderVertColors[i, j].Value, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1); } } } //Draw overlay last for drilled walls and such spriteBatch.Draw(levelOverlayTexture, baseOffset, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1); foreach (Collectable c in collectables) { if (c != null) { c.Draw(spriteBatch); } } foreach (Enemy enemy in enemies) { enemy.Draw(spriteBatch); } foreach (Prisoner p in prisoners) { p.Draw(spriteBatch); } foreach (PowerupIcon p in powerups) { p.Draw(spriteBatch); } }
public void createSpecificLevelAt(LevelFragment fullLevelFragment, int xPos, int yPos) { if (fullLevelFragment.type != LevelContent.Type.Full) throw new ArgumentException("Creating a specific level requires a full level fragment", "fullLevelFragment"); levels[xPos, yPos] = new Level(this, fullLevelFragment, xPos, yPos); currentLevels = null; // make the CurrentLevels list be recalculated }
public Level(LevelManager levelManager, LevelFragment fullLevelFragment, int x, int y) { this.levelManager = levelManager; levelFull(fullLevelFragment, x, y); }
// Helper function to set parts of the level private void setFragmentIntoLevel(LevelFragment fragment, FragmentPosition position) { int texWidth = fragment.levelTexture.Width; int texHeight = fragment.levelTexture.Height; int gridWidth = fragment.grid.GetLength(0); int gridHeight = fragment.grid.GetLength(1); int texStartWidth = 0; int texStartHeight = 0; int gridStartWidth = 0; int gridStartHeight = 0; switch (position) { case FragmentPosition.LeftHalf: case FragmentPosition.TopHalf: texStartWidth = 0; texStartHeight = 0; gridStartWidth = 0; gridStartHeight = 0; break; case FragmentPosition.TopLeftCorner: texStartWidth = 0; texStartHeight = 0; gridStartWidth = 0; gridStartHeight = 0; break; case FragmentPosition.RightHalf: case FragmentPosition.TopRightCorner: texStartWidth = texWidth + TILE_SIZE; texStartHeight = 0; gridStartWidth = gridWidth - 1; gridStartHeight = 0; break; case FragmentPosition.BottomHalf: case FragmentPosition.BottomLeftCorner: texStartWidth = 0; texStartHeight = texHeight + TILE_SIZE; gridStartWidth = 0; gridStartHeight = gridHeight - 1; break; case FragmentPosition.BottomRightCorner: texStartWidth = texWidth + TILE_SIZE; texStartHeight = texHeight + TILE_SIZE; gridStartWidth = gridWidth - 1; gridStartHeight = gridHeight - 1; break; } //cut off last row/column if necessary switch (position) { case FragmentPosition.LeftHalf: case FragmentPosition.BottomLeftCorner: gridHeight--; break; case FragmentPosition.TopHalf: case FragmentPosition.TopRightCorner: gridWidth--; break; case FragmentPosition.RightHalf: case FragmentPosition.BottomHalf: case FragmentPosition.BottomRightCorner: gridWidth--; gridHeight--; break; } //color grid switch (position) { case FragmentPosition.LeftHalf: fragmentGrid[0, 0] = fragment; fragmentGrid[0, 1] = fragment; break; case FragmentPosition.RightHalf: fragmentGrid[1, 0] = fragment; fragmentGrid[1, 1] = fragment; break; case FragmentPosition.TopHalf: fragmentGrid[0, 0] = fragment; fragmentGrid[1, 0] = fragment; break; case FragmentPosition.BottomHalf: fragmentGrid[0, 1] = fragment; fragmentGrid[1, 1] = fragment; break; case FragmentPosition.TopLeftCorner: fragmentGrid[0, 0] = fragment; break; case FragmentPosition.TopRightCorner: fragmentGrid[1, 0] = fragment; break; case FragmentPosition.BottomLeftCorner: fragmentGrid[0, 1] = fragment; break; case FragmentPosition.BottomRightCorner: fragmentGrid[1, 1] = fragment; break; } //level grid grid.setDataRectangle <LevelContent.LevelTile>(new Rectangle(gridStartWidth, gridStartHeight, gridWidth, gridHeight), fragment.grid); //locations collectableLocations.AddRange(fragment.getCollectableLocations(position)); enemyLocations.AddRange(fragment.getEnemyLocations(position)); prisonerLocations.AddRange(fragment.getPrisonerLocations(position)); powerupLocations.AddRange(fragment.getPowerupLocations(position)); }
// _ _ //|_|_| //|_|_| private void levelFourCorner(LevelFragment topLeftFragment, LevelFragment topRightFragment, LevelFragment bottomLeftFragment, LevelFragment bottomRightFragment, int x, int y) { if (topLeftFragment.type != LevelContent.Type.Corner) throw new ArgumentException("All fragments must be corners", "topLeftFragment"); if (topRightFragment.type != LevelContent.Type.Corner) throw new ArgumentException("All fragments must be corners", "topRightFragment"); if (bottomLeftFragment.type != LevelContent.Type.Corner) throw new ArgumentException("All fragments must be corners", "bottomLeftFragment"); if (bottomRightFragment.type != LevelContent.Type.Corner) throw new ArgumentException("All fragments must be corners", "bottomRightFragment"); initializeLevel(x, y); setFragmentIntoLevel(topLeftFragment, FragmentPosition.TopLeftCorner); setFragmentIntoLevel(topRightFragment, FragmentPosition.TopRightCorner); setFragmentIntoLevel(bottomLeftFragment, FragmentPosition.BottomLeftCorner); setFragmentIntoLevel(bottomRightFragment, FragmentPosition.BottomRightCorner); setWallIntoLevel(BorderWall.Horiz, 0, 1); setWallIntoLevel(BorderWall.Vert, 1, 0); setWallIntoLevel(BorderWall.Single, 1, 1); setWallIntoLevel(BorderWall.Horiz, 1, 1); setWallIntoLevel(BorderWall.Vert, 1, 1); finalizeLevel(); }
public void Initialize(int numPlayers, bool createNewHeroes, LevelFragment fullIntroLevelFragment, Point startingLevel) { if (numPlayers <= 0 || numPlayers > RetroGame.MAX_PLAYERS) throw new ArgumentOutOfRangeException("numPlayers", "Number of players must be between 1 and " + RetroGame.MAX_PLAYERS); if (fullIntroLevelFragment.type != LevelContent.Type.Full) throw new ArgumentException("LevelManager must be initialized with a Full LevelFragment", "fullIntroLevelFragment"); if (createNewHeroes){ heroes = new Hero[numPlayers]; for (int i = 0; i < heroes.Length; i++) { heroes[i] = new Hero((PlayerIndex)Enum.Parse(typeof(PlayerIndex), i.ToString())); heroes[i].Initialize(); } } createSpecificLevelAt(fullIntroLevelFragment, startingLevel.X, startingLevel.Y); if (fullIntroLevelFragment.type == LevelContent.Type.Full) { for(int i = 0; i < numPlayers; i++) { for (int j = 0; j < fullIntroLevelFragment.specialTiles[i].Length; j++) { if (fullIntroLevelFragment.specialTiles[i][j] != null) levels[startingLevel.X, startingLevel.Y].powerups.Add(newPowerup(Powerups.SPECIAL_INTRO_POWERUPS[j], fullIntroLevelFragment.specialTiles[i][j][0], fullIntroLevelFragment.specialTiles[i][j][1], levels[startingLevel.X, startingLevel.Y])); } if (fullIntroLevelFragment.heroTiles[0] != null && heroes.Length >= 1) heroes[i].position = new Vector2(Level.TEX_SIZE * startingLevel.X + (Level.TILE_SIZE * (fullIntroLevelFragment.heroTiles[i][0] + 0.5f)), Level.TEX_SIZE * startingLevel.Y + (Level.TILE_SIZE * (fullIntroLevelFragment.heroTiles[i][1] + 0.5f))); } } foreach(Hero hero in heroes) { hero.updateCurrentLevelAndTile(); } SetCameraMode(CameraMode.Arena); }
/// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { EXECUTABLE_ROOT_DIRECTORY = Path.GetDirectoryName(Application.ExecutablePath); //create graphics ojects graphicsDevice = GraphicsDevice; spriteBatchHUD = new SpriteBatch(GraphicsDevice); //load sprites automatically so you don't need to put in a new line every time you add a new sprite TextureManager.LoadSprites(Content); //load screens EscapeScreen = new EscapeScreen(); AddScreen(EscapeScreen, true); EscapeScreen.textureRandom = Content.Load<Texture2D>("Textures\\random"); Powerups.LoadContent(Content); AddScreen(new StartScreen(getHeroes()[0].bindings), true); HUD.LoadContent(Content); FONT_DEBUG = Content.Load<SpriteFont>("Fonts\\debug"); FONT_PIXEL_SMALL = Content.Load<SpriteFont>("Fonts\\pixel23"); //http://www.dafont.com/victors-pixel-font.font FONT_PIXEL_LARGE = Content.Load<SpriteFont>("Fonts\\pixel48"); FONT_PIXEL_HUGE = Content.Load<SpriteFont>("Fonts\\pixel98"); FONT_HUD_KEYS = Content.Load<SpriteFont>("Fonts\\keys36"); /* http://www.fontspace.com/flop-design/keymode-alphabet */ FONT_HUD_XBOX = Content.Load<SpriteFont>("Fonts\\xbox32"); /* http://sinnix.net/downloads/?did=2 XNA Button Pack 3 - Jeff Jenkins (@Sinnix) */ //load audio SoundManager.LoadContent(Content); SoundManager.SetMusicVolume(0); //misc loads/inits Highscores.Initialize(); RiotGuardWall.Initialize(); LevelManager.Load(GraphicsDevice); //load effects Effects.LoadContent(Content); //load levels Level.Load(Content); FileInfo[] filePaths = new DirectoryInfo(Content.RootDirectory + "\\Levels").GetFiles("*.*"); foreach (FileInfo file in filePaths) { /*IF YOU ARE GETTING A CONTENTLOADEXCEPTION HERE, MAKE SURE TO SET THE CONTENT PROCESS OF YOUR LEVEL TO "Level Processor"*/ LevelContent content = Content.Load<LevelContent>("Levels\\" + file.Name.Split('.')[0]); Dictionary<string, LevelFragment> levelFragmentsForCurrentTypeOfLevel = null; List<LevelFragment> testFragments = new List<LevelFragment>(); switch (content.type) { case LevelContent.Type.Full: levelFragmentsForCurrentTypeOfLevel = levelFragmentsFull; testFragments = testFragmentsFull; break; case LevelContent.Type.HalfHorizontal: levelFragmentsForCurrentTypeOfLevel = levelFragmentsHalfHorizontal; testFragments = testFragmentsHalfHorizontal; break; case LevelContent.Type.HalfVertical: levelFragmentsForCurrentTypeOfLevel = levelFragmentsHalfVertical; testFragments = testFragmentsHalfVertical; break; case LevelContent.Type.Corner: levelFragmentsForCurrentTypeOfLevel = levelFragmentsCorner; testFragments = testFragmentsCorner; break; } LEVEL_COLORS[content.name] = content.color; if (content.color == Color.White) Console.Out.WriteLine(content.name + " = white"); if (!(content.name.Contains("intro") || content.name.Contains("store"))) { levelFragmentsForCurrentTypeOfLevel[content.name] = new LevelFragment(content, GraphicsDevice); } else if (content.name.Contains("introSingle")) introSingleLevelFragment = new LevelFragment(content, GraphicsDevice); else if (content.name.Contains("introCoop")) introCoopLevelFragment = new LevelFragment(content, GraphicsDevice); else if (content.name.Contains("store")) StoreLevelFragment = new LevelFragment(content, GraphicsDevice); if (LEVELS_TO_TEST.Contains(content.name)) testFragments.Add(levelFragmentsForCurrentTypeOfLevel[content.name]); } //configuration file LoadConfig(); if (IsFirstTimePlaying) ((StartScreen)TopScreen).enableDrawWASDInstructions = true; SaveConfig(); Reset(); }