diff --git a/StardewModdingAPI/Events/Game.cs b/StardewModdingAPI/Events/Game.cs index 6290d2c7..60531dd8 100644 --- a/StardewModdingAPI/Events/Game.cs +++ b/StardewModdingAPI/Events/Game.cs @@ -11,7 +11,34 @@ namespace StardewModdingAPI.Events public static event EventHandler GameLoaded = delegate { }; public static event EventHandler Initialize = delegate { }; public static event EventHandler LoadContent = delegate { }; + /// + /// Fires every update (1/60 of a second) + /// public static event EventHandler UpdateTick = delegate { }; + /// + /// Fires every other update (1/30 of a second) + /// + public static event EventHandler SecondUpdateTick = delegate { }; + /// + /// Fires every fourth update (1/15 of a second) + /// + public static event EventHandler FourthUpdateTick = delegate { }; + /// + /// Fires every eighth update (roughly 1/8 of a second) + /// + public static event EventHandler EighthUpdateTick = delegate { }; + /// + /// Fires every fifthteenth update (1/4 of a second) + /// + public static event EventHandler QuarterSecondTick = delegate { }; + /// + /// Fires every thirtieth update (1/2 of a second) + /// + public static event EventHandler HalfSecondTick = delegate { }; + /// + /// Fires every sixtieth update (a second) + /// + public static event EventHandler OneSecondTick = delegate { }; public static void InvokeGameLoaded() { @@ -53,5 +80,35 @@ namespace StardewModdingAPI.Events Log.Error("An exception occured in XNA UpdateTick: " + ex.ToString()); } } + + public static void InvokeSecondUpdateTick() + { + SecondUpdateTick.Invoke(null, EventArgs.Empty); + } + + public static void InvokeFourthUpdateTick() + { + FourthUpdateTick.Invoke(null, EventArgs.Empty); + } + + public static void InvokeEighthUpdateTick() + { + EighthUpdateTick.Invoke(null, EventArgs.Empty); + } + + public static void InvokeQuarterSecondTick() + { + QuarterSecondTick.Invoke(null, EventArgs.Empty); + } + + public static void InvokeHalfSecondTick() + { + HalfSecondTick.Invoke(null, EventArgs.Empty); + } + + public static void InvokeOneSecondTick() + { + OneSecondTick.Invoke(null, EventArgs.Empty); + } } } diff --git a/StardewModdingAPI/Extensions.cs b/StardewModdingAPI/Extensions.cs index c504f470..28eb2d7d 100644 --- a/StardewModdingAPI/Extensions.cs +++ b/StardewModdingAPI/Extensions.cs @@ -60,5 +60,10 @@ namespace StardewModdingAPI } return hash; } + + public static T Cast(this object o) where T : StardewValley.Object + { + return o as T; + } } } \ No newline at end of file diff --git a/StardewModdingAPI/Inheritance/SGame.cs b/StardewModdingAPI/Inheritance/SGame.cs index 735cd58a..9082d695 100644 --- a/StardewModdingAPI/Inheritance/SGame.cs +++ b/StardewModdingAPI/Inheritance/SGame.cs @@ -173,6 +173,8 @@ namespace StardewModdingAPI.Inheritance public Farmer PreviousFarmer { get; private set; } + public Int32 CurrentUpdateTick { get; private set; } + private static SGame instance; public static SGame Instance { get { return instance; } } @@ -182,6 +184,7 @@ namespace StardewModdingAPI.Inheritance { instance = this; + /* #if DEBUG SaveGame.serializer = new XmlSerializer(typeof (SaveGame), new Type[28] { @@ -215,6 +218,7 @@ namespace StardewModdingAPI.Inheritance typeof (SObject) }); #endif + */ } protected override void Initialize() @@ -252,6 +256,29 @@ namespace StardewModdingAPI.Inheritance Events.GameEvents.InvokeUpdateTick(); + if (CurrentUpdateTick % 2 == 0) + Events.GameEvents.InvokeSecondUpdateTick(); + + if (CurrentUpdateTick % 4 == 0) + Events.GameEvents.InvokeFourthUpdateTick(); + + if (CurrentUpdateTick % 8 == 0) + Events.GameEvents.InvokeEighthUpdateTick(); + + if (CurrentUpdateTick % 15 == 0) + Events.GameEvents.InvokeQuarterSecondTick(); + + if (CurrentUpdateTick % 30 == 0) + Events.GameEvents.InvokeHalfSecondTick(); + + if (CurrentUpdateTick % 60 == 0) + Events.GameEvents.InvokeOneSecondTick(); + + CurrentUpdateTick += 1; + if (CurrentUpdateTick >= 60) + CurrentUpdateTick = 0; + + PreviouslyPressedKeys = CurrentlyPressedKeys; for(PlayerIndex i = PlayerIndex.One; i <= PlayerIndex.Four; i++) {