using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using UIInfoSuite.Extensions;
using StardewModdingAPI.Events;
using StardewValley;
using StardewValley.Menus;
using System;
namespace UIInfoSuite.UIElements
{
class ShowBirthdayIcon : IDisposable
{
private NPC _birthdayNPC;
private ClickableTextureComponent _birthdayIcon;
private readonly IModEvents _events;
public ShowBirthdayIcon(IModEvents events)
{
_events = events;
}
public void ToggleOption(bool showBirthdayIcon)
{
_events.GameLoop.DayStarted -= OnDayStarted;
_events.Display.RenderingHud -= OnRenderingHud;
_events.Display.RenderedHud -= OnRenderedHud;
_events.GameLoop.UpdateTicked -= OnUpdateTicked;
if (showBirthdayIcon)
{
CheckForBirthday();
_events.GameLoop.DayStarted += OnDayStarted;
_events.Display.RenderingHud += OnRenderingHud;
_events.Display.RenderedHud += OnRenderedHud;
_events.GameLoop.UpdateTicked += OnUpdateTicked;
}
}
/// Raised after the game state is updated (≈60 times per second).
/// The event sender.
/// The event arguments.
private void OnUpdateTicked(object sender, UpdateTickedEventArgs e)
{
// check if gift has been given
if (e.IsOneSecond && _birthdayNPC != null && Game1.player?.friendshipData != null)
{
Game1.player.friendshipData.FieldDict.TryGetValue(_birthdayNPC.Name, out var netRef);
//var birthdayNPCDetails = Game1.player.friendshipData.SafeGet(_birthdayNPC.name);
Friendship birthdayNPCDetails = netRef;
if (birthdayNPCDetails != null)
{
if (birthdayNPCDetails.GiftsToday == 1)
_birthdayNPC = null;
}
}
}
public void Dispose()
{
ToggleOption(false);
}
/// Raised after the game begins a new day (including when the player loads a save).
/// The event sender.
/// The event arguments.
private void OnDayStarted(object sender, DayStartedEventArgs e)
{
CheckForBirthday();
}
private void CheckForBirthday()
{
_birthdayNPC = null;
foreach (var location in Game1.locations)
{
foreach (var character in location.characters)
{
if (character.isBirthday(Game1.currentSeason, Game1.dayOfMonth))
{
_birthdayNPC = character;
break;
}
}
if (_birthdayNPC != null)
break;
}
}
/// Raised before drawing the HUD (item toolbar, clock, etc) to the screen.
/// The event sender.
/// The event arguments.
private void OnRenderingHud(object sender, EventArgs e)
{
// draw birthday icon
if (!Game1.eventUp)
{
if (_birthdayNPC != null)
{
Rectangle headShot = _birthdayNPC.GetHeadShot();
Point iconPosition = IconHandler.Handler.GetNewIconPosition();
float scale = 2.9f;
Game1.spriteBatch.Draw(
Game1.mouseCursors,
new Vector2(iconPosition.X, iconPosition.Y),
new Rectangle(228, 409, 16, 16),
Color.White,
0.0f,
Vector2.Zero,
scale,
SpriteEffects.None,
1f);
_birthdayIcon =
new ClickableTextureComponent(
_birthdayNPC.Name,
new Rectangle(
iconPosition.X - 7,
iconPosition.Y - 2,
(int)(16.0 * scale),
(int)(16.0 * scale)),
null,
_birthdayNPC.Name,
_birthdayNPC.Sprite.Texture,
headShot,
2f);
_birthdayIcon.draw(Game1.spriteBatch);
}
}
}
/// Raised after drawing the HUD (item toolbar, clock, etc) to the sprite batch, but before it's rendered to the screen.
/// The event sender.
/// The event arguments.
private void OnRenderedHud(object sender, RenderedHudEventArgs e)
{
// draw hover text
if (_birthdayNPC != null && _birthdayIcon.containsPoint(Game1.getMouseX(), Game1.getMouseY()))
{
String hoverText = String.Format("{0}'s Birthday", _birthdayNPC.Name);
IClickableMenu.drawHoverText(
Game1.spriteBatch,
hoverText,
Game1.dialogueFont);
}
}
}
}