mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 12:24:16 +00:00
240 lines
11 KiB
C#
240 lines
11 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using ProjectZ.InGame.GameObjects.Base;
|
|
using ProjectZ.InGame.SaveLoad;
|
|
using ProjectZ.InGame.Things;
|
|
|
|
namespace ProjectZ.InGame.Overlay
|
|
{
|
|
public class DungeonOverlay
|
|
{
|
|
private RenderTarget2D _renderTarget;
|
|
|
|
private Animator _animationPlayer = new Animator();
|
|
|
|
private Rectangle _backgroundTop;
|
|
private Rectangle _backgroundBottom;
|
|
|
|
private static readonly Point DungeonPoint = new Point(6, 0);
|
|
|
|
private Rectangle _mapRectangle = new Rectangle(DungeonPoint.X, DungeonPoint.Y, 12, 20);
|
|
private Rectangle _compasRectangle = new Rectangle(DungeonPoint.X + 12, DungeonPoint.Y, 12, 20);
|
|
private Rectangle _stonebreakRectangle = new Rectangle(DungeonPoint.X + 24, DungeonPoint.Y, 12, 20);
|
|
private Rectangle _nightmareKeyPosition = new Rectangle(DungeonPoint.X + 36, DungeonPoint.Y, 12, 20);
|
|
private Rectangle _smallKeyPosition = new Rectangle(DungeonPoint.X + 48, DungeonPoint.Y, 24, 20);
|
|
|
|
private Point _recMap = new Point(2, 160);
|
|
private Point _hintMap = new Point(2, 170);
|
|
private Point _mapPosition = new Point(6, 24);
|
|
|
|
private int _tileWidth = 8;
|
|
private int _tileHeight = 8;
|
|
|
|
private int _mapTile = 3;
|
|
private int _undiscoveredTile = 4;
|
|
|
|
private int _width;
|
|
private int _height;
|
|
|
|
public DungeonOverlay(int width, int height)
|
|
{
|
|
_width = width;
|
|
_height = height;
|
|
|
|
_backgroundTop = new Rectangle(0, 0, width, 20);
|
|
_backgroundBottom = new Rectangle(0, 20 + 2, width, height - 20 - 2);
|
|
}
|
|
|
|
public void UpdateRenderTarget()
|
|
{
|
|
if (_renderTarget == null || _renderTarget.Width != _width * Game1.UiScale || _renderTarget.Height != _height * Game1.UiScale)
|
|
_renderTarget = new RenderTarget2D(Game1.Graphics.GraphicsDevice, _width * Game1.UiScale, _height * Game1.UiScale);
|
|
}
|
|
|
|
public void Load()
|
|
{
|
|
_animationPlayer = AnimatorSaveLoad.LoadAnimator("dungeonPlayer");
|
|
_animationPlayer.Play("idle");
|
|
}
|
|
|
|
public void OnFocus()
|
|
{
|
|
var level = 0;
|
|
while (true)
|
|
{
|
|
var name = Game1.GameManager.MapManager.CurrentMap.LocationName + "_" + level;
|
|
if (!Game1.GameManager.DungeonMaps.TryGetValue(name, out var normalMap) || normalMap == null)
|
|
break;
|
|
|
|
level++;
|
|
|
|
if (normalMap.Overrides == null)
|
|
continue;
|
|
|
|
var dungeonMap = GetAlternativeMap(name) ?? normalMap;
|
|
|
|
// check the override map and override unlocked tiles
|
|
foreach (var map in normalMap.Overrides)
|
|
{
|
|
if (Game1.GameManager.SaveManager.GetString(map.SaveKey, "0") == "1")
|
|
dungeonMap.Tiles[map.PosX, map.PosY].TileIndex = map.TileIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (!Game1.GameManager.MapManager.CurrentMap.DungeonMode)
|
|
return;
|
|
|
|
_animationPlayer.Update();
|
|
}
|
|
|
|
public void Draw(SpriteBatch spriteBatch, Rectangle drawPosition, Color color)
|
|
{
|
|
if (!Game1.GameManager.MapManager.CurrentMap.DungeonMode)
|
|
return;
|
|
|
|
spriteBatch.Draw(_renderTarget, drawPosition, color);
|
|
}
|
|
|
|
public void DrawOnRenderTarget(SpriteBatch spriteBatch)
|
|
{
|
|
if (!Game1.GameManager.MapManager.CurrentMap.DungeonMode)
|
|
return;
|
|
|
|
Game1.Graphics.GraphicsDevice.SetRenderTarget(_renderTarget);
|
|
Game1.Graphics.GraphicsDevice.Clear(Color.Transparent);
|
|
|
|
// draw the background
|
|
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, Resources.RoundedCornerEffect, Matrix.CreateScale(Game1.UiRtScale));
|
|
|
|
Resources.RoundedCornerEffect.Parameters["scale"].SetValue(Game1.UiRtScale);
|
|
Resources.RoundedCornerEffect.Parameters["radius"].SetValue(3f);
|
|
Resources.RoundedCornerEffect.Parameters["width"].SetValue(_width);
|
|
|
|
Resources.RoundedCornerEffect.Parameters["height"].SetValue(_backgroundTop.Height);
|
|
spriteBatch.Draw(Resources.SprWhite, _backgroundTop, Values.InventoryBackgroundColor);
|
|
|
|
Resources.RoundedCornerEffect.Parameters["height"].SetValue(_backgroundBottom.Height);
|
|
spriteBatch.Draw(Resources.SprWhite, _backgroundBottom, Values.InventoryBackgroundColor);
|
|
|
|
if (Game1.GameManager.GetItem("dmap") == null)
|
|
DrawBackground(spriteBatch, Point.Zero, new Rectangle(_mapRectangle.X + _mapRectangle.Width / 2, _mapRectangle.Bottom - 5, 4, 2), 1);
|
|
if (Game1.GameManager.GetItem("compass") == null)
|
|
DrawBackground(spriteBatch, Point.Zero, new Rectangle(_compasRectangle.X + _compasRectangle.Width / 2, _compasRectangle.Bottom - 5, 4, 2), 1);
|
|
if (Game1.GameManager.GetItem("stonebeak") == null)
|
|
DrawBackground(spriteBatch, Point.Zero, new Rectangle(_stonebreakRectangle.X + _stonebreakRectangle.Width / 2, _stonebreakRectangle.Bottom - 5, 4, 2), 1);
|
|
if (Game1.GameManager.GetItem("nightmarekey") == null)
|
|
DrawBackground(spriteBatch, Point.Zero, new Rectangle(_nightmareKeyPosition.X + _nightmareKeyPosition.Width / 2, _nightmareKeyPosition.Bottom - 5, 4, 2), 1);
|
|
if (Game1.GameManager.GetItem("smallkey") == null)
|
|
DrawBackground(spriteBatch, Point.Zero, new Rectangle(_smallKeyPosition.X + _smallKeyPosition.Width / 2, _smallKeyPosition.Bottom - 5, 4, 2), 1);
|
|
|
|
spriteBatch.End();
|
|
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, Matrix.CreateScale(Game1.UiRtScale));
|
|
|
|
var offset = new Point(0, 0);
|
|
|
|
ItemDrawHelper.DrawItemWithInfo(spriteBatch, Game1.GameManager.GetItem("dmap"), offset, _mapRectangle, 1, Color.White);
|
|
|
|
ItemDrawHelper.DrawItemWithInfo(spriteBatch, Game1.GameManager.GetItem("compass"), offset, _compasRectangle, 1, Color.White);
|
|
|
|
ItemDrawHelper.DrawItemWithInfo(spriteBatch, Game1.GameManager.GetItem("stonebeak"), offset, _stonebreakRectangle, 1, Color.White);
|
|
|
|
ItemDrawHelper.DrawItemWithInfo(spriteBatch, Game1.GameManager.GetItem("nightmarekey"), offset, _nightmareKeyPosition, 1, Color.White);
|
|
|
|
ItemDrawHelper.DrawItemWithInfo(spriteBatch, Game1.GameManager.GetItem("smallkey"), offset, _smallKeyPosition, 1, Color.White);
|
|
|
|
// draw the dungeon maps
|
|
var level = 0;
|
|
var hasMap = Game1.GameManager.GetItem("dmap") != null;
|
|
var hasCompass = Game1.GameManager.GetItem("compass") != null;
|
|
|
|
while (true)
|
|
{
|
|
// does the map exist?
|
|
var name = Game1.GameManager.MapManager.CurrentMap.LocationName + "_" + level;
|
|
if (!Game1.GameManager.DungeonMaps.TryGetValue(name, out var normalMap))
|
|
break;
|
|
|
|
var dungeonMap = GetAlternativeMap(name) ?? normalMap;
|
|
|
|
var posX = _mapPosition.X + dungeonMap.OffsetX;
|
|
var posY = _mapPosition.Y + dungeonMap.OffsetY;
|
|
|
|
// draw the map
|
|
for (var y = 0; y < dungeonMap.Tiles.GetLength(1); y++)
|
|
for (var x = 0; x < dungeonMap.Tiles.GetLength(0); x++)
|
|
{
|
|
int tileIndex;
|
|
// use the discovery state from the normal map
|
|
if (!normalMap.Tiles[x, y].DiscoveryState && dungeonMap.Tiles[x, y].TileIndex > 4)
|
|
tileIndex = hasMap ? _mapTile : _undiscoveredTile;
|
|
else
|
|
tileIndex = dungeonMap.Tiles[x, y].TileIndex;
|
|
|
|
spriteBatch.Draw(Resources.SprMiniMap,
|
|
new Rectangle(
|
|
posX + x * _tileWidth, posY + y * _tileHeight,
|
|
_tileWidth, _tileHeight),
|
|
new Rectangle(
|
|
_recMap.X + (tileIndex - 1) * (_tileWidth + 2),
|
|
_recMap.Y, _tileWidth, _tileHeight), Color.White);
|
|
|
|
// draw the hints on the map if the player has a compass
|
|
if (hasCompass)
|
|
{
|
|
tileIndex = dungeonMap.Tiles[x, y].HintTileIndex;
|
|
|
|
if (tileIndex > 0)
|
|
{
|
|
// chest opened or boss defeated?
|
|
if (Game1.GameManager.SaveManager.GetString(dungeonMap.Tiles[x, y].HintKey) == "1")
|
|
continue;
|
|
//tileIndex += 1;
|
|
|
|
spriteBatch.Draw(Resources.SprMiniMap,
|
|
new Rectangle(
|
|
posX + x * _tileWidth, posY + y * _tileHeight,
|
|
_tileWidth, _tileHeight),
|
|
new Rectangle(
|
|
_hintMap.X + (tileIndex - 1) * (_tileWidth + 2),
|
|
_hintMap.Y, _tileWidth, _tileHeight), Color.White);
|
|
}
|
|
}
|
|
}
|
|
|
|
// draw the position indicator
|
|
if (Game1.GameManager.MapManager.CurrentMap.LocationFullName == name)
|
|
{
|
|
var position = new Vector2(
|
|
posX + Game1.GameManager.PlayerDungeonPosition.X * 8 + 1,
|
|
posY + Game1.GameManager.PlayerDungeonPosition.Y * 8 + 1);
|
|
_animationPlayer.Draw(spriteBatch, position, Color.White);
|
|
}
|
|
|
|
level++;
|
|
}
|
|
|
|
spriteBatch.End();
|
|
}
|
|
|
|
private GameManager.MiniMap GetAlternativeMap(string name)
|
|
{
|
|
// this allows for map file switching by adding a postfix to the dungeon name
|
|
var mapName = name + Game1.GameManager.SaveManager.GetString(name + "_map", "");
|
|
Game1.GameManager.DungeonMaps.TryGetValue(mapName, out var altMap);
|
|
|
|
return altMap;
|
|
}
|
|
|
|
private void DrawBackground(SpriteBatch spriteBatch, Point offset, Rectangle rectangle, float radius)
|
|
{
|
|
Resources.RoundedCornerEffect.Parameters["radius"].SetValue(radius);
|
|
Resources.RoundedCornerEffect.Parameters["width"].SetValue(rectangle.Width);
|
|
Resources.RoundedCornerEffect.Parameters["height"].SetValue(rectangle.Height);
|
|
|
|
spriteBatch.Draw(Resources.SprWhite, new Rectangle(offset.X + rectangle.X, offset.Y + rectangle.Y, rectangle.Width, rectangle.Height), Color.Black * 0.25f);
|
|
}
|
|
}
|
|
} |