using EventSystem.Framework.FunctionEvents;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using StardewValley;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventSystem.Framework
{
///
/// Base class used to handle map tile events.
///
public class MapEvent
{
///
/// //MAKE NAME FOR EVENTS
///
public string name;
public Vector2 tilePosition;
public GameLocation location;
public PlayerEvents playerEvents;
public bool playerOnTile;
public MouseButtonEvents mouseButtonEvents;
public MouseEntryLeaveEvent mouseEntryLeaveEvents;
public bool mouseOnTile;
public bool doesInteractionNeedToRun;
public bool loopInteraction;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Constructors
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#region
///
/// Empty Constructor
///
public MapEvent()
{
}
///
/// A simple map event that doesn't do anything.
///
///
///
public MapEvent(string name,GameLocation Location,Vector2 Position)
{
this.name = name;
this.location = Location;
this.tilePosition = Position;
}
///
/// A simple map function that runs when the player enters and leaves a tile. Set values to null for nothing to happen.
///
/// The game location where the event is. I.E Farm, Town, Mine etc.
/// The x,y position on the map the event is.
/// Handles various events that runs when the player enters/leaves a tile, etc.
public MapEvent(string name,GameLocation Location,Vector2 position, PlayerEvents PlayerEvents)
{
this.name = name;
this.location = Location;
this.tilePosition = position;
this.playerEvents = PlayerEvents;
}
///
/// A constructor that handles when the mouse leaves and enters a tile.
///
/// The game location where the event is.
/// The x,y position of the tile at the game location.
/// A class used to handle mouse entry/leave events.
public MapEvent(string name,GameLocation Location, Vector2 Position, MouseEntryLeaveEvent mouseEvents)
{
this.name = name;
this.location = Location;
this.tilePosition = Position;
this.mouseEntryLeaveEvents = mouseEvents;
}
///
/// A constructor that handles when the mouse leaves and enters a tile.
///
/// The game location where the event is.
/// The x,y position of the tile at the game location.
/// A class used to handle mouse click/scroll events.
public MapEvent(string name,GameLocation Location, Vector2 Position, MouseButtonEvents mouseEvents)
{
this.name = name;
this.location = Location;
this.tilePosition = Position;
this.mouseButtonEvents = mouseEvents;
}
///
/// A constructor encapsulating player, mouse button, and mouse entry events.
///
/// The game location for which the event is located. I.E Town, Farm, etc.
/// The x,y cordinates for this event to be located at.
/// The events that occur associated with the player. I.E player entry, etc.
/// The events associated with clicking a mouse button while on this tile.
/// The events that occur when the mouse enters or leaves the same tile position as this event.
public MapEvent(string name,GameLocation Location, Vector2 Position, PlayerEvents playerEvents, MouseButtonEvents mouseButtonEvents, MouseEntryLeaveEvent mouseEntryLeaveEvents)
{
this.name = name;
this.location = Location;
this.tilePosition = Position;
this.playerEvents = playerEvents;
this.mouseButtonEvents = mouseButtonEvents;
this.mouseEntryLeaveEvents = mouseEntryLeaveEvents;
}
#endregion
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Player related functions
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#region
///
/// Occurs when the player enters the same tile as this event. The function associated with this event is then ran.
///
public virtual bool OnPlayerEnter()
{
if (this.playerEvents == null) return false;
if (isPlayerOnTile() == true && this.doesInteractionNeedToRun==true)
{
this.playerOnTile = true;
this.doesInteractionNeedToRun = false;
if (this.playerEvents.onPlayerEnter != null) this.playerEvents.onPlayerEnter.run();
return true;
}
return false;
}
///
/// Occurs when the player leaves the same tile that this event is on. The function associated with thie event is then ran.
///
public virtual bool OnPlayerLeave()
{
if (this.playerEvents == null) return false;
if (isPlayerOnTile() == false && this.playerOnTile==true){
this.playerOnTile = false;
this.doesInteractionNeedToRun = true;
if (this.playerEvents.onPlayerLeave != null) this.playerEvents.onPlayerLeave.run();
return true;
}
return false;
}
///
/// Checks if the player is on the same tile as this event.
///
///
public virtual bool isPlayerOnTile()
{
if (Game1.player.getTileX() == this.tilePosition.X && Game1.player.getTileY() == this.tilePosition.Y) return true;
else return false;
}
#endregion
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mouse related functions
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#region
///
/// Occurs when the player left clicks the same tile that this event is on.
///
public virtual bool OnLeftClick()
{
if (this.mouseOnTile==false) return false;
if (this.mouseButtonEvents == null) return false;
if (this.mouseButtonEvents.onLeftClick != null) this.mouseButtonEvents.onLeftClick.run();
return true;
}
///
/// Occurs when the player right clicks the same tile that this event is on.
///
public virtual bool OnRightClick()
{
if (this.mouseOnTile == false) return false;
if (this.mouseButtonEvents == null) return false;
if (this.mouseButtonEvents.onRightClick != null) this.mouseButtonEvents.onRightClick.run();
return true;
}
///
/// Occurs when the mouse tile position is the same as this event's x,y position.
///
public virtual bool OnMouseEnter()
{
if (this.mouseEntryLeaveEvents == null) return false;
if (isMouseOnTile())
{
this.mouseOnTile = true;
if (this.mouseEntryLeaveEvents.onMouseEnter != null) this.mouseEntryLeaveEvents.onMouseEnter.run();
return true;
}
return false;
}
///
/// Occurs when the mouse tile position leaves the the same x,y position as this event.
///
public virtual bool OnMouseLeave()
{
if (this.mouseEntryLeaveEvents == null) return false;
if (isMouseOnTile() == false && this.mouseOnTile == true)
{
this.mouseOnTile = false;
if (this.mouseEntryLeaveEvents.onMouseLeave != null) this.mouseEntryLeaveEvents.onMouseLeave.run();
return true;
}
return false;
}
///
/// UNUSED!!!!
/// Occurs when the mouse is on the same position as the tile AND the user scrolls the mouse wheel.
///
public virtual bool OnMouseScroll()
{
if (isMouseOnTile() == false) return false;
if (this.mouseButtonEvents.onMouseScroll != null) this.mouseButtonEvents.onMouseScroll.run();
return true;
}
///
/// Checks if the mouse is on the tile.
///
///
public virtual bool isMouseOnTile()
{
Vector2 mousePosition = Game1.currentCursorTile;
if (mousePosition.X == this.tilePosition.X && mousePosition.Y == this.tilePosition.Y) return true;
return false;
}
///
/// Occurs when the tile is clicked. Runs the appropriate event.
///
public virtual void clickEvent()
{
if (this.mouseOnTile == false) return;
var mouseState=Mouse.GetState();
if (mouseState.LeftButton == ButtonState.Pressed) OnLeftClick();
if (mouseState.RightButton == ButtonState.Pressed) OnRightClick();
}
#endregion
///
/// Used to check if any sort of events need to run on this tile right now.
///
public virtual void update()
{
if (Game1.activeClickableMenu != null) return;
clickEvent(); //click events
OnPlayerEnter(); //player enter events
OnPlayerLeave(); //player leave events
OnMouseEnter(); //on mouse enter events
OnMouseLeave(); //on mouse leave events.
}
}
}