LADXHD/InGame/Overlay/MapOverlay.cs

380 lines
19 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.Controls;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.Overlay
{
public class MapOverlay
{
public bool IsSelected;
private RenderTarget2D _renderTarget;
private readonly Rectangle _recMap = new Rectangle(8, 0, 144, 144);
private readonly Rectangle _recHide = new Rectangle(167, 103, 9, 9);
private readonly Rectangle _recIcon = new Rectangle(161, 1, 30, 30);
private Point _selectionPosition;
private Point _iconPosition;
private Animator _animationPlayer = new Animator();
private Animator _animationSelection = new Animator();
private readonly int[,] _mapIcons = new int[16, 16];
private readonly string[,] _mapDialog = new string[,] {
{ "map_tal_tal", "map_tal_tal", "map_tal_tal", "map_tal_tal", "map_tal_tal", "map_tal_tal", "map_wind_fishs_egg", "map_mt_tamaranch", "map_owl_bridge", "map_tal_tal", "map_hen_house", "map_tal_tal", "map_tal_tal", "map_tal_tal", "map_level_7", "map_tal_tal" },
{ "map_level_8","map_telephone_booth","map_tal_tal","map_tal_tal","map_tal_tal","map_tal_tal","map_owl_fish","map_owl_mountain","map_tal_tal","map_tal_tal","map_tal_tal","map_tal_tal","map_tal_tal","map_tal_tal","map_tal_tal","map_tal_tal" },
{ "map_goponga_swamp","map_goponga_swamp","map_goponga_swamp","map_goponga_swamp","map_level_2","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_level_4","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights" },
{ "map_weird_mr_write","map_telephone_booth","map_goponga_swamp","map_goponga_swamp","map_goponga_swamp","map_tal_tal_heights","map_owl_tal_tal_heights","map_photo_both","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_tal_tal_heights","map_raft_shop" },
{ "map_mysterious_woods","map_owl_woods","map_mysterious_woods","map_mysterious_woods","map_koholint_prairie","map_crazy_tracy","map_tabahl_wasteland","map_tabahl_wasteland","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_telephone_booth","map_rapids_ride","map_rapids_ride","map_rapids_ride","map_rapids_ride" },
{ "map_mysterious_woods","map_mysterious_woods","map_mysterious_woods","map_mysterious_woods","map_koholint_prairie","map_koholint_prairie","map_tabahl_wasteland","map_tabahl_wasteland","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_rapids_ride","map_rapids_ride","map_rapids_ride","map_rapids_ride" },
{ "map_mysterious_woods","map_mysterious_woods","map_mysterious_woods","map_mysterious_woods","map_owl_prairie","map_witchs_hut","map_cementry","map_cementry","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_rapids_ride","map_rapids_ride","map_rapids_ride","map_rapids_ride" },
{ "map_mysterious_woods","map_mysterious_woods","map_mysterious_woods","map_mysterious_woods","map_koholint_prairie","map_koholint_prairie","map_cementry","map_cementry","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_kanalet_castle","map_rapids_ride","map_rapids_ride","map_rapids_ride","map_rapids_ride" },
{ "map_owl_woods_entry","map_fishing_pond","map_quadruplets_house","map_dream_shrine","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_telephone_booth","map_ukuku_prairie","map_seashell_mansion","map_ukuku_prairie","map_level_6","map_face_shrine","map_rapids_ride","map_rapids_ride" },
{ "map_mysterious_woods","map_mysterious_woods","map_mabe_village","map_town_tool_shop","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_owl_level_6_post","map_owl_level_6","map_rapids_ride","map_rapids_ride"},
{ "map_mabe_village","map_madam_meow","map_marin_tarin","map_mabe_village","map_telephone_booth","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_owl_shrine","map_face_shrine","map_face_shrine","map_face_shrine" },
{ "map_village_library","map_old_man_house","map_telephone_booth","map_trendy_game","map_ukuku_prairie","map_level_3","map_owl_level_3","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_ukuku_prairie","map_face_shrine","map_face_shrine","map_face_shrine","map_face_shrine"},
{ "map_south_village","map_south_village","map_south_village","map_south_village","map_signpost_maze","map_signpost_maze","map_pothole_field","map_pothole_field","map_maraths_bay","map_maraths_bay","map_maraths_bay","map_maraths_bay","map_animal_village","map_animal_village","map_yarna_desert","map_yarna_desert"},
{ "map_south_village","map_south_village","map_owl_level_1","map_level_1","map_signpost_maze","map_signpost_maze","map_richards_villa","map_pothole_field","map_maraths_bay","map_level_5","map_maraths_bay","map_telephone_booth","map_animal_village","map_animal_village","map_yarna_desert","map_yarna_desert"},
{ "map_toronbo_shores","map_toronbo_shores","map_toronbo_shores","map_banana_house","map_toronbo_shores","map_toronbo_shores","map_maraths_bay","map_maraths_bay","map_telephone_booth","map_maraths_bay","map_maraths_bay","map_maraths_bay","map_bay_east","map_bay_east","map_owl_desert","map_yarna_desert"},
{ "map_toronbo_shores","map_toronbo_shores","map_owl_shore","map_toronbo_shores","map_toronbo_shores","map_toronbo_shores","map_house_bay","map_maraths_bay","map_maraths_bay","map_maraths_bay","map_maraths_bay","map_maraths_bay","map_bay_east","map_bay_east","map_yarna_desert","map_yarna_desert"}};
private float _animationCount;
private float _animationState;
private int _width;
private int _height;
private int _margin;
private int _iconAnimationDirection;
private int _shownSelection;
private double _buttonDownCounter;
private bool _iconAnimationRunning;
private bool _fullMap;
public MapOverlay(int width, int height, int margin, bool fullMap)
{
_width = width;
_height = height;
_margin = margin;
_fullMap = fullMap;
// 1 shop
// 2 ?
// 3 cave
// 4 owl
_mapIcons[6, 0] = 2;
_mapIcons[8, 0] = 4;
_mapIcons[10, 0] = 2;
_mapIcons[14, 0] = 3;
_mapIcons[0, 1] = 3;
_mapIcons[1, 1] = 2;
_mapIcons[6, 1] = 4;
_mapIcons[7, 1] = 4;
_mapIcons[4, 2] = 3;
_mapIcons[11, 2] = 3;
_mapIcons[0, 3] = 2;
_mapIcons[1, 3] = 2;
_mapIcons[6, 3] = 4;
_mapIcons[7, 3] = 1;
_mapIcons[15, 3] = 3;
_mapIcons[1, 4] = 4;
_mapIcons[5, 4] = 1;
_mapIcons[11, 4] = 2;
_mapIcons[4, 6] = 4;
_mapIcons[5, 6] = 1;
_mapIcons[0, 8] = 4;
_mapIcons[1, 8] = 1;
_mapIcons[2, 8] = 2;
_mapIcons[3, 8] = 2;
_mapIcons[8, 8] = 2;
_mapIcons[10, 8] = 2;
_mapIcons[12, 8] = 3;
_mapIcons[3, 9] = 2;
_mapIcons[12, 9] = 4;
_mapIcons[13, 9] = 4;
_mapIcons[1, 10] = 2;
_mapIcons[2, 10] = 2;
_mapIcons[4, 10] = 2;
_mapIcons[12, 10] = 4;
_mapIcons[0, 11] = 2;
_mapIcons[1, 11] = 2;
_mapIcons[2, 11] = 2;
_mapIcons[3, 11] = 1;
_mapIcons[5, 11] = 3;
_mapIcons[6, 11] = 4;
_mapIcons[2, 13] = 4;
_mapIcons[3, 13] = 3;
_mapIcons[6, 13] = 2;
_mapIcons[9, 13] = 3;
_mapIcons[11, 13] = 2;
_mapIcons[3, 14] = 2;
_mapIcons[8, 14] = 2;
_mapIcons[14, 14] = 4;
_mapIcons[2, 15] = 4;
_mapIcons[6, 15] = 2;
}
public void Load()
{
_animationPlayer = AnimatorSaveLoad.LoadAnimator("mapPlayer");
_animationSelection = AnimatorSaveLoad.LoadAnimator("mapSelector");
_animationPlayer.Play("idle");
_animationSelection.Play("idle");
}
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 Update()
{
_animationPlayer.Update();
var mapIcon = _mapIcons[_selectionPosition.X, _selectionPosition.Y];
// for owl icons we only show the icon if the owl key was already set
if (mapIcon == 4 && Game1.GameManager.SaveManager.GetString(_mapDialog[_selectionPosition.Y, _selectionPosition.X], "0") != "1")
mapIcon = 0;
if ((mapIcon != _shownSelection || (mapIcon != 0 && !IsSelected)) && !_iconAnimationRunning)
{
if (mapIcon != 0 && _shownSelection == 0 && IsSelected)
PlayStartAnimation();
else
PlayStopAnimation();
}
// update the icon run animation
if (_iconAnimationRunning)
{
_animationCount += Game1.DeltaTime / 100f * _iconAnimationDirection;
if (_animationCount >= Math.PI / 2)
{
_iconAnimationRunning = false;
_animationCount = (float)(Math.PI / 2);
}
else if (_animationCount < 0)
{
_iconAnimationRunning = false;
_shownSelection = 0;
}
_animationState = (float)Math.Sin(_animationCount);
}
if (!IsSelected)
return;
_animationSelection.Update();
if (!Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
UpdateInput();
}
private void UpdateInput()
{
if (ControlHandler.ButtonDown(CButtons.Left) || ControlHandler.ButtonDown(CButtons.Right) ||
ControlHandler.ButtonDown(CButtons.Up) || ControlHandler.ButtonDown(CButtons.Down))
_buttonDownCounter -= Game1.DeltaTime;
else
_buttonDownCounter = 225;
if (ControlHandler.ButtonPressed(CButtons.Left) || (ControlHandler.ButtonDown(CButtons.Left) && _buttonDownCounter < 0))
{
_buttonDownCounter += 50;
MoveSelection(_selectionPosition + new Point(-1, 0));
}
if (ControlHandler.ButtonPressed(CButtons.Right) || (ControlHandler.ButtonDown(CButtons.Right) && _buttonDownCounter < 0))
{
_buttonDownCounter += 50;
MoveSelection(_selectionPosition + new Point(1, 0));
}
if (ControlHandler.ButtonPressed(CButtons.Up) || (ControlHandler.ButtonDown(CButtons.Up) && _buttonDownCounter < 0))
{
_buttonDownCounter += 50;
MoveSelection(_selectionPosition + new Point(0, -1));
}
if (ControlHandler.ButtonPressed(CButtons.Down) || (ControlHandler.ButtonDown(CButtons.Down) && _buttonDownCounter < 0))
{
_buttonDownCounter += 50;
MoveSelection(_selectionPosition + new Point(0, 1));
}
if (ControlHandler.ButtonPressed(CButtons.A))
{
if (0 <= _selectionPosition.X && _selectionPosition.X < _mapDialog.GetLength(1) &&
0 <= _selectionPosition.Y && _selectionPosition.Y < _mapDialog.GetLength(0))
Game1.GameManager.RunDialog(_mapDialog[_selectionPosition.Y, _selectionPosition.X]);
}
}
public void PlayStartAnimation()
{
_iconPosition = new Point(8, 8);
_iconPosition.X += _selectionPosition.X >= _mapIcons.GetLength(0) / 2 ? 8 : _mapIcons.GetLength(0) * 8 - _recIcon.Width - 8;
_iconPosition.Y += _selectionPosition.Y >= _mapIcons.GetLength(1) / 2 ? _mapIcons.GetLength(1) * 8 - _recIcon.Height - 8 : 8;
_animationCount = 0;
_iconAnimationDirection = 1;
_iconAnimationRunning = true;
_shownSelection = _mapIcons[_selectionPosition.X, _selectionPosition.Y];
}
public void PlayStopAnimation()
{
_animationCount = (float)(Math.PI / 2);
_iconAnimationDirection = -1;
_iconAnimationRunning = true;
}
public void OnFocus()
{
_shownSelection = 0;
_animationState = 0;
if (Game1.GameManager.PlayerMapPosition != null)
_selectionPosition = Game1.GameManager.PlayerMapPosition.Value;
}
public void MoveSelection(Point newPosition)
{
if (newPosition.X < 0)
newPosition.X += Game1.GameManager.MapVisibility.GetLength(0);
if (newPosition.X >= Game1.GameManager.MapVisibility.GetLength(0))
newPosition.X -= Game1.GameManager.MapVisibility.GetLength(0);
if (newPosition.Y < 0)
newPosition.Y += Game1.GameManager.MapVisibility.GetLength(1);
if (newPosition.Y >= Game1.GameManager.MapVisibility.GetLength(1))
newPosition.Y -= Game1.GameManager.MapVisibility.GetLength(1);
// only move the selection if the new position is visible
if (newPosition.X >= 0 && newPosition.Y >= 0 &&
newPosition.X < Game1.GameManager.MapVisibility.GetLength(0) &&
newPosition.Y < Game1.GameManager.MapVisibility.GetLength(1) &&
(_fullMap || Game1.GameManager.MapVisibility[newPosition.X, newPosition.Y]))
{
_selectionPosition = newPosition;
_animationSelection.Stop();
_animationSelection.Play("idle");
}
}
public void Draw(SpriteBatch spriteBatch, Rectangle drawPosition, Color color, Matrix? matrix = null)
{
Resources.RoundedCornerEffect.Parameters["scale"].SetValue(Game1.UiRtScale);
Resources.RoundedCornerEffect.Parameters["radius"].SetValue(2f);
Resources.RoundedCornerEffect.Parameters["width"].SetValue(_width);
Resources.RoundedCornerEffect.Parameters["height"].SetValue(_height);
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, Resources.RoundedCornerEffect, matrix);
spriteBatch.Draw(_renderTarget, drawPosition, color);
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, matrix);
if (Game1.GameManager.PlayerMapPosition != null)
{
var mapRectangle = new Point(drawPosition.X + _margin, drawPosition.Y + _margin);
// draw the player
var position = new Vector2(
mapRectangle.X + (8 + Game1.GameManager.PlayerMapPosition.Value.X * 8 + 2) * Game1.UiRtScale,
mapRectangle.Y + (8 + Game1.GameManager.PlayerMapPosition.Value.Y * 8 + 2) * Game1.UiRtScale);
_animationPlayer.DrawBasic(spriteBatch, position, color, Game1.UiRtScale);
// draw the selection
if (IsSelected)
{
position = new Vector2(
mapRectangle.X + (8 + _selectionPosition.X * 8 + 1) * Game1.UiRtScale,
mapRectangle.Y + (8 + _selectionPosition.Y * 8 + 1) * Game1.UiRtScale);
_animationSelection.DrawBasic(spriteBatch, position, color, Game1.UiRtScale);
}
}
spriteBatch.End();
}
public void DrawRenderTarget(SpriteBatch spriteBatch)
{
Game1.Graphics.GraphicsDevice.SetRenderTarget(_renderTarget);
Game1.Graphics.GraphicsDevice.Clear(Color.Transparent);
// draw the map
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, Matrix.CreateScale(Game1.UiRtScale));
DrawMap(spriteBatch);
spriteBatch.End();
}
public void DrawMap(SpriteBatch spriteBatch)
{
var mapRectangle = new Point(_margin, _margin);
// draw the map
spriteBatch.Draw(Resources.SprMiniMap,
new Rectangle(mapRectangle.X, mapRectangle.Y, _recMap.Width, _recMap.Height), _recMap, Color.White);
// overlay the not discovered parts of the map
if (!_fullMap)
for (var x = 0; x < 16; x++)
{
for (var y = 0; y < 16; y++)
{
if (!Game1.GameManager.MapVisibility[x, y])
spriteBatch.Draw(Resources.SprMiniMap, new Rectangle(
mapRectangle.X + 8 + x * 8,
mapRectangle.Y + 8 + y * 8,
_recHide.Width, _recHide.Height), _recHide, Color.White);
}
}
// draw icon of the selection
if (_shownSelection > 0)
{
DrawIcon(spriteBatch, new Point(
mapRectangle.X + _iconPosition.X,
mapRectangle.Y + _iconPosition.Y), _shownSelection, 1, _animationState);
}
}
public void DrawIcon(SpriteBatch spriteBatch, Point position, int icon, int scale, float animationPercentage)
{
var width = (int)(_recIcon.Width * animationPercentage) / 2;
var height = (int)(_recIcon.Height * animationPercentage) / 2;
var posX = position.X + (_recIcon.Width / 2 - width);
var posY = position.Y + (_recIcon.Height / 2 - height);
spriteBatch.Draw(Resources.SprMiniMap, new Rectangle(posX, posY, width * 2, height * 2),
new Rectangle(_recIcon.X + _recIcon.Width * (icon - 1),
_recIcon.Y, _recIcon.Width, _recIcon.Height), Color.White);
}
}
}