summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/SMAPI.Tests/Utilities/SDateTests.cs53
-rw-r--r--src/SMAPI/Framework/Models/ManifestDependency.cs1
-rw-r--r--src/SMAPI/Utilities/SDate.cs58
3 files changed, 91 insertions, 21 deletions
diff --git a/src/SMAPI.Tests/Utilities/SDateTests.cs b/src/SMAPI.Tests/Utilities/SDateTests.cs
index 86a0d3d0..b89d8857 100644
--- a/src/SMAPI.Tests/Utilities/SDateTests.cs
+++ b/src/SMAPI.Tests/Utilities/SDateTests.cs
@@ -82,6 +82,59 @@ namespace StardewModdingAPI.Tests.Utilities
}
/****
+ ** DayOfWeek
+ ****/
+ [Test(Description = "Assert the day of week.")]
+ [TestCase("01 spring Y1", ExpectedResult = System.DayOfWeek.Monday)]
+ [TestCase("02 spring Y2", ExpectedResult = System.DayOfWeek.Tuesday)]
+ [TestCase("03 spring Y3", ExpectedResult = System.DayOfWeek.Wednesday)]
+ [TestCase("04 spring Y4", ExpectedResult = System.DayOfWeek.Thursday)]
+ [TestCase("05 spring Y5", ExpectedResult = System.DayOfWeek.Friday)]
+ [TestCase("06 spring Y6", ExpectedResult = System.DayOfWeek.Saturday)]
+ [TestCase("07 spring Y7", ExpectedResult = System.DayOfWeek.Sunday)]
+ [TestCase("08 summer Y8", ExpectedResult = System.DayOfWeek.Monday)]
+ [TestCase("09 summer Y9", ExpectedResult = System.DayOfWeek.Tuesday)]
+ [TestCase("10 summer Y10", ExpectedResult = System.DayOfWeek.Wednesday)]
+ [TestCase("11 summer Y11", ExpectedResult = System.DayOfWeek.Thursday)]
+ [TestCase("12 summer Y12", ExpectedResult = System.DayOfWeek.Friday)]
+ [TestCase("13 summer Y13", ExpectedResult = System.DayOfWeek.Saturday)]
+ [TestCase("14 summer Y14", ExpectedResult = System.DayOfWeek.Sunday)]
+ [TestCase("15 fall Y15", ExpectedResult = System.DayOfWeek.Monday)]
+ [TestCase("16 fall Y16", ExpectedResult = System.DayOfWeek.Tuesday)]
+ [TestCase("17 fall Y17", ExpectedResult = System.DayOfWeek.Wednesday)]
+ [TestCase("18 fall Y18", ExpectedResult = System.DayOfWeek.Thursday)]
+ [TestCase("19 fall Y19", ExpectedResult = System.DayOfWeek.Friday)]
+ [TestCase("20 fall Y20", ExpectedResult = System.DayOfWeek.Saturday)]
+ [TestCase("21 fall Y21", ExpectedResult = System.DayOfWeek.Sunday)]
+ [TestCase("22 winter Y22", ExpectedResult = System.DayOfWeek.Monday)]
+ [TestCase("23 winter Y23", ExpectedResult = System.DayOfWeek.Tuesday)]
+ [TestCase("24 winter Y24", ExpectedResult = System.DayOfWeek.Wednesday)]
+ [TestCase("25 winter Y25", ExpectedResult = System.DayOfWeek.Thursday)]
+ [TestCase("26 winter Y26", ExpectedResult = System.DayOfWeek.Friday)]
+ [TestCase("27 winter Y27", ExpectedResult = System.DayOfWeek.Saturday)]
+ [TestCase("28 winter Y28" + "", ExpectedResult = System.DayOfWeek.Sunday)]
+ public DayOfWeek DayOfWeek(string dateStr)
+ {
+ // act
+ return this.GetDate(dateStr).DayOfWeek;
+ }
+
+ /****
+ ** DaysSinceStart
+ ****/
+ [Test(Description = "Assert the number of days since 01 spring Y1 (inclusive).")]
+ [TestCase("01 spring Y1", ExpectedResult = 1)]
+ [TestCase("02 spring Y1", ExpectedResult = 2)]
+ [TestCase("28 spring Y1", ExpectedResult = 28)]
+ [TestCase("01 summer Y1", ExpectedResult = 29)]
+ [TestCase("01 summer Y2", ExpectedResult = 141)]
+ public int DaysSinceStart(string dateStr)
+ {
+ // act
+ return this.GetDate(dateStr).DaysSinceStart;
+ }
+
+ /****
** ToString
****/
[Test(Description = "Assert that ToString returns the expected string.")]
diff --git a/src/SMAPI/Framework/Models/ManifestDependency.cs b/src/SMAPI/Framework/Models/ManifestDependency.cs
index 5646b335..97f0775a 100644
--- a/src/SMAPI/Framework/Models/ManifestDependency.cs
+++ b/src/SMAPI/Framework/Models/ManifestDependency.cs
@@ -15,6 +15,7 @@ namespace StardewModdingAPI.Framework.Models
/// <summary>Whether the dependency must be installed to use the mod.</summary>
public bool IsRequired { get; set; }
+
/*********
** Public methods
*********/
diff --git a/src/SMAPI/Utilities/SDate.cs b/src/SMAPI/Utilities/SDate.cs
index 2630731a..e589e9a4 100644
--- a/src/SMAPI/Utilities/SDate.cs
+++ b/src/SMAPI/Utilities/SDate.cs
@@ -35,6 +35,9 @@ namespace StardewModdingAPI.Utilities
/// <summary>The day of week.</summary>
public DayOfWeek DayOfWeek { get; }
+ /// <summary>The number of days since the game began (starting at 1 for the first day of spring in Y1).</summary>
+ public int DaysSinceStart { get; }
+
/*********
** Public methods
@@ -67,7 +70,7 @@ namespace StardewModdingAPI.Utilities
public SDate AddDays(int offset)
{
// get new hash code
- int hashCode = this.GetHashCode() + offset;
+ int hashCode = this.DaysSinceStart + offset;
if (hashCode < 1)
throw new ArithmeticException($"Adding {offset} days to {this} would result in a date before 01 spring Y1.");
@@ -115,12 +118,7 @@ namespace StardewModdingAPI.Utilities
/// <summary>Get a hash code which uniquely identifies a date.</summary>
public override int GetHashCode()
{
- // return the number of days since 01 spring Y1 (inclusively)
- int yearIndex = this.Year - 1;
- return
- yearIndex * this.DaysInSeason * this.SeasonsInYear
- + this.GetSeasonIndex() * this.DaysInSeason
- + this.Day;
+ return this.DaysSinceStart;
}
/****
@@ -132,7 +130,7 @@ namespace StardewModdingAPI.Utilities
/// <returns>The equality of the dates</returns>
public static bool operator ==(SDate date, SDate other)
{
- return date?.GetHashCode() == other?.GetHashCode();
+ return date?.DaysSinceStart == other?.DaysSinceStart;
}
/// <summary>Get whether one date is not equal to another.</summary>
@@ -140,7 +138,7 @@ namespace StardewModdingAPI.Utilities
/// <param name="other">The other date to compare.</param>
public static bool operator !=(SDate date, SDate other)
{
- return date?.GetHashCode() != other?.GetHashCode();
+ return date?.DaysSinceStart != other?.DaysSinceStart;
}
/// <summary>Get whether one date is more than another.</summary>
@@ -148,7 +146,7 @@ namespace StardewModdingAPI.Utilities
/// <param name="other">The other date to compare.</param>
public static bool operator >(SDate date, SDate other)
{
- return date?.GetHashCode() > other?.GetHashCode();
+ return date?.DaysSinceStart > other?.DaysSinceStart;
}
/// <summary>Get whether one date is more than or equal to another.</summary>
@@ -156,7 +154,7 @@ namespace StardewModdingAPI.Utilities
/// <param name="other">The other date to compare.</param>
public static bool operator >=(SDate date, SDate other)
{
- return date?.GetHashCode() >= other?.GetHashCode();
+ return date?.DaysSinceStart >= other?.DaysSinceStart;
}
/// <summary>Get whether one date is less than or equal to another.</summary>
@@ -164,7 +162,7 @@ namespace StardewModdingAPI.Utilities
/// <param name="other">The other date to compare.</param>
public static bool operator <=(SDate date, SDate other)
{
- return date?.GetHashCode() <= other?.GetHashCode();
+ return date?.DaysSinceStart <= other?.DaysSinceStart;
}
/// <summary>Get whether one date is less than another.</summary>
@@ -172,7 +170,7 @@ namespace StardewModdingAPI.Utilities
/// <param name="other">The other date to compare.</param>
public static bool operator <(SDate date, SDate other)
{
- return date?.GetHashCode() < other?.GetHashCode();
+ return date?.DaysSinceStart < other?.DaysSinceStart;
}
@@ -203,7 +201,9 @@ namespace StardewModdingAPI.Utilities
this.Day = day;
this.Season = season;
this.Year = year;
- this.DayOfWeek = this.GetDayOfWeek();
+ this.DayOfWeek = this.GetDayOfWeek(day);
+ this.DaysSinceStart = this.GetDaysSinceStart(day, season, year);
+
}
/// <summary>Get whether a date represents 0 spring Y1, which is the date during the in-game intro.</summary>
@@ -215,10 +215,11 @@ namespace StardewModdingAPI.Utilities
return day == 0 && season == "spring" && year == 1;
}
- /// <summary>Get the day of week for the current date.</summary>
- private DayOfWeek GetDayOfWeek()
+ /// <summary>Get the day of week for a given date.</summary>
+ /// <param name="day">The day of month.</param>
+ private DayOfWeek GetDayOfWeek(int day)
{
- switch (this.Day % 7)
+ switch (day % 7)
{
case 0:
return DayOfWeek.Sunday;
@@ -239,13 +240,28 @@ namespace StardewModdingAPI.Utilities
}
}
- /// <summary>Get the current season index.</summary>
+ /// <summary>Get the number of days since the game began (starting at 1 for the first day of spring in Y1).</summary>
+ /// <param name="day">The day of month.</param>
+ /// <param name="season">The season name.</param>
+ /// <param name="year">The year.</param>
+ private int GetDaysSinceStart(int day, string season, int year)
+ {
+ // return the number of days since 01 spring Y1 (inclusively)
+ int yearIndex = year - 1;
+ return
+ yearIndex * this.DaysInSeason * this.SeasonsInYear
+ + this.GetSeasonIndex(season) * this.DaysInSeason
+ + day;
+ }
+
+ /// <summary>Get a season index.</summary>
+ /// <param name="season">The season name.</param>
/// <exception cref="InvalidOperationException">The current season wasn't recognised.</exception>
- private int GetSeasonIndex()
+ private int GetSeasonIndex(string season)
{
- int index = Array.IndexOf(this.Seasons, this.Season);
+ int index = Array.IndexOf(this.Seasons, season);
if (index == -1)
- throw new InvalidOperationException($"The current season '{this.Season}' wasn't recognised.");
+ throw new InvalidOperationException($"The season '{season}' wasn't recognised.");
return index;
}
}