LADXHD/InGame/GameObjects/Things/ObjStoreItem.cs
2023-12-14 17:21:22 -05:00

152 lines
5.6 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Things
{
internal class ObjStoreItem : GameObject
{
private readonly GameItem _item;
private readonly Rectangle _sourceRectangle;
private readonly Vector2 _itemPosition;
private readonly string _itemName;
private readonly int _itemPrice;
private readonly int _itemCount;
private bool _holding;
public ObjStoreItem() : base("item") { }
public ObjStoreItem(Map.Map map, int posX, int posY, string itemName, int itemPrice, int count) : base(map)
{
EntityPosition = new CPosition(posX, posY, 0);
EntitySize = new Rectangle(0, 0, 32, 40);
_itemPrice = itemPrice;
_itemCount = count;
_itemName = itemName;
_item = Game1.GameManager.ItemManager[itemName];
if (_item == null)
{
IsDead = true;
return;
}
if (_item.SourceRectangle.HasValue)
_sourceRectangle = _item.SourceRectangle.Value;
else
{
var baseItem = Game1.GameManager.ItemManager[_item.Name];
_sourceRectangle = baseItem.SourceRectangle.Value;
}
var countLength = _itemCount.ToString().Length;
var textWidth = _itemCount > 1 ? ItemDrawHelper.LetterWidth * countLength + countLength + 6 : 0;
_itemPosition = new Vector2(
EntityPosition.X + 16 - (int)(_sourceRectangle.Width + textWidth) / 2,
EntityPosition.Y + 22 - _sourceRectangle.Height / 2);
var interactRectangle = new CBox(posX, posY, 0, 32, 40, 16);
AddComponent(InteractComponent.Index, new InteractComponent(interactRectangle, Interact));
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(KeyChanged));
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerPlayer, EntityPosition));
AddComponent(DrawShadowComponent.Index, new DrawShadowComponent(DrawShadow));
}
private bool Interact()
{
if (!_holding)
{
if (MapManager.ObjLink.StoreItem != null)
return false;
Game1.GameManager.SaveManager.SetString("itemShopItem", _itemName);
Game1.GameManager.SaveManager.SetString("itemShopPrice", _itemPrice.ToString());
Game1.GameManager.SaveManager.SetString("itemShopCount", _itemCount.ToString());
MapManager.ObjLink.StartHoldingItem(_item);
}
else
{
MapManager.ObjLink.StopHoldingItem();
}
Game1.GameManager.PlaySoundEffect("D360-19-13");
_holding = !_holding;
return true;
}
private void KeyChanged()
{
if (!_holding)
return;
var value = Game1.GameManager.SaveManager.GetString("holdItem");
var result = Game1.GameManager.SaveManager.GetString("result");
if (value == "0")
{
_holding = false;
MapManager.ObjLink.StopHoldingItem();
// the item was bought?
if (result != null && result == "0")
Map.Objects.DeleteObjects.Add(this);
}
}
private void Draw(SpriteBatch spriteBatch)
{
if (_holding)
return;
// draw the price of the item
var priceLength = _itemPrice.ToString().Length;
var textWidth = ItemDrawHelper.LetterWidth * priceLength + priceLength - 1;
ItemDrawHelper.DrawNumber(spriteBatch,
(int)(EntityPosition.X + 16 - textWidth / 2f),
(int)(EntityPosition.Y + 12 - ItemDrawHelper.LetterHeight), _itemPrice, priceLength, 1, Color.Black);
if (_itemCount > 1)
{
spriteBatch.DrawString(Resources.GameFont, "x",
new Vector2(
(int)(_itemPosition.X + _sourceRectangle.Width),
(int)(EntityPosition.Y + 24 - ItemDrawHelper.LetterHeight)), Color.Black);
var countLength = _itemCount.ToString().Length;
ItemDrawHelper.DrawNumber(spriteBatch,
(int)(_itemPosition.X + _sourceRectangle.Width + 7),
(int)(EntityPosition.Y + 25 - ItemDrawHelper.LetterHeight), _itemCount, countLength, 1, Color.Black);
}
// draw the item
ItemDrawHelper.DrawItem(spriteBatch, _item, _itemPosition, Color.White, 1, true);
}
private void DrawShadow(SpriteBatch spriteBatch)
{
if (_holding)
return;
var baseItem = _item.SourceRectangle.HasValue ? _item : Game1.GameManager.ItemManager[_item.Name];
var sourceRectangle = baseItem.SourceRectangle.Value;
DrawHelper.DrawShadow(Resources.SprItem, _itemPosition,
sourceRectangle, sourceRectangle.Width, sourceRectangle.Height,
false, Map.ShadowHeight, Map.ShadowRotation, Color.White);
}
}
}