Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Code for handling time, date, flags, and alarms in Twine 2 / SugarCube 2:
- First, put this in your StoryInit:
- <<set $ShowTime = 0>> /* 0 = no, 1 = show colon, 2 = hide colon */
- <<set $GameDay = 1>>
- <<set $CurHr = 0>>
- <<set $CurMn = 0>>
- <<set $CurSc = 0>>
- <<set $Alarms = {}>>
- <<set $Flags = {}>>
- ---
- Change $GameDay above to the day of the year. So February 1st is $GameDay = 32.
- Next, put this in your StoryCaption:
- <span id="CurTime" style="padding-left: 50px;"></span>
- <<silently>><<timed 5ms>><<TimeDisplay>><</timed>><<repeat 1000ms>><<TimeDisplay>><</repeat>><</silently>>
- ---
- That will display the time and date.
- Then put this in your story JavaScript section:
- // Fresh is true if you didn't come to the passage from Inventory or Credits
- window.Fresh = function () {
- return ((lastVisited("Inventory") != 1) && (lastVisited("Credits") != 1));
- };
- // If flag exists then return value, else return false
- window.Flag = function (Fnam) {
- if (State.variables.Flags[Fnam.toLowerCase()] !== undefined) {
- return State.variables.Flags[Fnam.toLowerCase()];
- }
- return false;
- };
- /* ConvertTime : Converts hour and minute into a standard time string with optional blinking colon. */
- window.ConvertTime = function (Hour, Minute, Blink) {
- var TimeStr = "";
- if (Hour < 13) {
- if (Blink && (Hour < 10)) {
- TimeStr = "@@color:#222;1@@" + Hour;
- } else {
- TimeStr = Hour;
- }
- } else {
- TimeStr = (Hour - 12);
- }
- if (Blink) {
- if (State.variables.ShowTime == 1) {
- TimeStr += ":";
- State.variables.ShowTime = 2;
- } else if (State.variables.ShowTime == 2) {
- TimeStr += "@@color:#222;:@@";
- State.variables.ShowTime = 1;
- }
- } else {
- TimeStr += ":";
- }
- if (Minute < 10) {
- TimeStr += "0" + Minute;
- } else {
- TimeStr += Minute;
- }
- if (Hour < 12) {
- TimeStr += " AM";
- } else {
- TimeStr += " PM";
- }
- return TimeStr;
- };
- // AlarmList: Returns a list of all alarm names
- // EXAMPLE: <<set AlarmNames = AlarmList()>>
- window.AlarmList = function () {
- return Object.keys(State.variables.Alarms);
- };
- // AlarmExists: Returns whether AlarmName exists or not
- // EXAMPLE: <<if AlarmExists("AlarmName")>>
- window.AlarmExists = function (AlarmName) {
- return AlarmList().includes(AlarmName);
- };
- // NextAlarm: Returns oldest AlarmName or "" if no alarms are set
- // EXAMPLE: <<set AName = NextAlarm()>>
- window.NextAlarm = function () {
- if (Object.keys(State.variables.Alarms).length === 0) {
- return "";
- } else {
- return AlarmList()[0];
- }
- };
- // TimeTill: Returns minutes left til time given
- // EXAMPLE: <<set Min = TimeTill(17, 30)>>
- window.TimeTill = function (Hour, Minute, Day) {
- var MinLeft = 0;
- if (Day !== undefined) {
- MinLeft = (Day - State.variables.GameDay) * 1440;
- }
- MinLeft += (Hour - State.variables.CurHr) * 60;
- MinLeft += Minute - State.variables.CurMn;
- return MinLeft;
- };
- // TimeFromNow: Returns current day and time plus N minutes
- // EXAMPLE: <<set DayAndTime = TimeFromNow(15)>>
- window.TimeFromNow = function (Minutes) {
- var Day = State.variables.GameDay, Hour = State.variables.CurHr, Minute = State.variables.CurMn + Minutes;
- if (Minute > 60) {
- Minute -= 60;
- Hour += 1;
- if (Hour > 24) {
- Hour -= 24;
- Day += 1;
- }
- }
- var DayAndTime = { "Day" : Day, "Hour" : Hour, "Minute" : Minute };
- return DayAndTime;
- };
- // TimeTillAlarm: Returns minutes left til AlarmName or null if there are no alarms
- // EXAMPLE: <<set Min = TimeTillAlarm("AlarmName")>>
- window.TimeTillAlarm = function (AlarmName) {
- if (AlarmExists(AlarmName)) {
- return TimeTill(State.variables.Alarms[AlarmName].Hour, State.variables.Alarms[AlarmName].Minute, State.variables.Alarms[AlarmName].Day);
- } else {
- return null;
- }
- };
- // TimeTillNextAlarm: Returns minutes left til AlarmName or null if there are no alarms
- // EXAMPLE: <<set Min = TimeTillNextAlarm()>>
- window.TimeTillNextAlarm = function () {
- var Name = NextAlarm();
- if (Name === "") {
- return null;
- } else {
- return TimeTillAlarm(Name);
- }
- };
- // ClearAlarm: Deletes alarm AlarmName
- // EXAMPLE: <<run ClearAlarm("AlarmName")>>
- window.ClearAlarm = function (AlarmName) {
- if (AlarmExists(AlarmName)) {
- delete State.variables.Alarms[AlarmName];
- }
- };
- // AlarmRinging: Returns true if the current time >= AlarmName's time, otherwise it returns false
- // EXAMPLE: <<if AlarmRinging("AlarmName")>>
- window.AlarmRinging = function (AlarmName) {
- if (AlarmExists(AlarmName)) {
- if (TimeTillAlarm(AlarmName) <= 0) {
- return true;
- } else {
- return false;
- }
- }
- };
- // SortAlarms: Sorts alarms from oldest to furthest in the future
- // EXAMPLE: <<run SortAlarms()>>
- window.SortAlarms = function () {
- var SortFn = function(DayAndTime1, DayAndTime2) {
- if (DayAndTime1.Day < DayAndTime2.Day) {
- return -1;
- } else if (DayAndTime1.Day > DayAndTime2.Day) {
- return 1;
- } else {
- if (DayAndTime1.Hour < DayAndTime2.Hour) {
- return -1;
- } else if (DayAndTime1.Hour > DayAndTime2.Hour) {
- return 1;
- } else {
- if (DayAndTime1.Minute < DayAndTime2.Minute) {
- return -1;
- } else if (DayAndTime1.Minute > DayAndTime2.Minute) {
- return 1;
- } else {
- return 0;
- }
- }
- }
- };
- if (AlarmList.length > 1) {
- State.variables.Alarms.sort(SortFn);
- }
- };
- // SetAlarm: Sets alarm in X minutes, or at Min+Hr today, or for Min+Hr+Day
- // EXAMPLE: <<run SetAlarm("Dinner Time", 17, 0)>>
- window.SetAlarm = function (AlarmName, Hour, Minute, Day) {
- if (AlarmExists(AlarmName)) {
- // *** add code to throw error here due to duplicate AlarmName ***
- } else {
- var DayAndTime;
- if (Minute === undefined) {
- // Set alarm in "Hour" minutes
- DayAndTime = TimeFromNow(Hour);
- } else {
- // Set alarm for Hour + Minute [+ Day]
- if (Day === undefined) {
- DayAndTime = { "Day" : State.variables.GameDay, "Hour" : Hour, "Minute" : Minute };
- } else {
- DayAndTime = { "Day" : Day, "Hour" : Hour, "Minute" : Minute };
- }
- }
- State.variables.Alarms[AlarmName] = clone(DayAndTime);
- SortAlarms();
- }
- };
- ---
- And finally, create a passage for the following widgets, add the tags "widget" and "nobr", and put this in it:
- /* SetFlag : Set Flag X to value Y (Y defaults to True). Flags are not case sensitive. */
- /* EXAMPLE: <<SetFlag "Mentor" "Harmony">> */
- /* EXAMPLE: <<SetFlag "TrialMed">> = sets TrialMed flag to True */
- <<widget "SetFlag">>
- <<set _Fnam = $args[0].toLowerCase()>>
- <<if def $args[1]>>
- <<if $args[1] == false>>
- <<if def $Flags[_Fnam]>>
- <<script>>
- delete State.variables.Flags[State.temporary.Fnam];
- <</script>>
- <</if>>
- <<else>>
- <<set $Flags[_Fnam] = $args[1]>>
- <</if>>
- <<else>>
- <<set $Flags[_Fnam] = true>>
- <</if>>
- /* Event flags: */
- <</widget>>
- /* TimeDisplay : Display the current time and show schedule on hover. */
- /* EXAMPLE: <<TimeDisplay>> */
- <<widget "TimeDisplay">>
- <<if $ShowTime>>
- <<replace "#CurTime">>
- <<print ConvertTime($CurHr, $CurMn, true)>>
- <</replace>>
- <</if>>
- <</widget>>
- /* SetDay : Set variables related to that day */
- /* EXAMPLE: <<SetDay 1>> */
- <<widget "SetDay">>
- <<switch $args[0] % 7>>
- <<case 0>>
- <<set $DateDescription = "Sunday, ">>
- <<case 1>>
- <<set $DateDescription = "Monday, ">>
- <<case 2>>
- <<set $DateDescription = "Tuesday, ">>
- <<case 3>>
- <<set $DateDescription = "Wednesday, ">>
- <<case 4>>
- <<set $DateDescription = "Thursday, ">>
- <<case 5>>
- <<set $DateDescription = "Friday, ">>
- <<case 6>>
- <<set $DateDescription = "Saturday, ">>
- <</switch>>
- <<set $SunriseHour = 6>>
- <<set $SunriseMinute = 0>>
- <<set $SunsetHour = 18>>
- <<set $SunsetMinute = 0>>
- <<if $args[0] lt 32>>
- <<set $DateDescription = $DateDescription + "Jan. ">>
- <<set _curDay = $args[0]>>
- <<elseif $args[0] lt 60>>
- <<set $DateDescription = $DateDescription + "Feb. ">>
- <<set _curDay = $args[0] - 31>>
- <<elseif $args[0] lt 91>>
- <<set $DateDescription = $DateDescription + "Mar. ">>
- <<set _curDay = $args[0] - 59>>
- <<elseif $args[0] lt 121>>
- <<set $DateDescription = $DateDescription + "Apr. ">>
- <<set _curDay = $args[0] - 90>>
- <<elseif $args[0] lt 152>>
- <<set $DateDescription = $DateDescription + "May ">>
- <<set _curDay = $args[0] - 120>>
- <<elseif $args[0] lt 182>>
- <<set $DateDescription = $DateDescription + "June ">>
- <<set _curDay = $args[0] - 151>>
- <<elseif $args[0] lt 213>>
- <<set $DateDescription = $DateDescription + "July ">>
- <<set _curDay = $args[0] - 181>>
- <<elseif $args[0] lt 244>>
- <<set $DateDescription = $DateDescription + "Aug. ">>
- <<set _curDay = $args[0] - 212>>
- <<elseif $args[0] lt 274>>
- <<set $DateDescription = $DateDescription + "Sept. ">>
- <<set _curDay = $args[0] - 243>>
- <<elseif $args[0] lt 305>>
- <<set $DateDescription = $DateDescription + "Oct. ">>
- <<set _curDay = $args[0] - 273>>
- <<elseif $args[0] lt 335>>
- <<set $DateDescription = $DateDescription + "Nov. ">>
- <<set _curDay = $args[0] - 304>>
- <<elseif $args[0] lt 366>>
- <<set $DateDescription = $DateDescription + "Dec. ">>
- <<set _curDay = $args[0] - 334>>
- <</if>>
- <<switch _curDay>>
- <<case 1 21 31>>
- <<set $DateDescription = $DateDescription + _curDay + "st">>
- <<case 2 22>>
- <<set $DateDescription = $DateDescription + _curDay + "nd">>
- <<case 3 23>>
- <<set $DateDescription = $DateDescription + _curDay + "rd">>
- <<default>>
- <<set $DateDescription = $DateDescription + _curDay + "th">>
- <</switch>>
- <</widget>>
- /* IncGameDay : Modify the value of $GameDay safely. Defaults to +1 day. */
- /* EXAMPLE: <<IncGameDay>> */
- /* EXAMPLE: <<IncGameDay 2>> */
- <<widget "IncGameDay">>
- <<if Fresh()>>
- <<if def $args[0]>>
- <<set $GameDay += $args[0]>>
- <<else>>
- <<set $GameDay += 1>>
- <</if>>
- <<if $GameDay === 366>>
- <<set $GameDay = 1>>
- <</if>>
- <<SetDay $GameDay>>
- <</if>>
- <</widget>>
- /* IncTime : Modify the time by X minutes safely. */
- /* EXAMPLE: <<IncTime 15>> = +15 min */
- /* EXAMPLE: <<IncTime 0.5>> = +30 seconds */
- <<widget "IncTime">>
- <<if Fresh() and !Flag("LockTime")>>
- <<if $args[0] != Math.trunc($args[0])>>
- <<set $CurSc += ($args[0] - Math.trunc($args[0])) * 100>>
- <<if $CurSc >= 100>>
- <<set $CurSc -= 100>>
- <<set $CurMn += Math.trunc($args[0]) + 1>>
- <<else>>
- <<set $CurMn += Math.trunc($args[0])>>
- <</if>>
- <<else>>
- <<set $CurMn += $args[0]>>
- <</if>>
- <<if $CurMn > 60>>
- <<for ; $CurMn >= 60; $CurMn -= 60>>
- <<set $CurHr += 1>>
- <</for>>
- <</if>>
- <<if $CurHr > 23>>
- <<set $CurHr -= 24>>
- <<IncGameDay>>
- <</if>>
- <</if>>
- <</widget>>
- ---
- Yeah, it's a lot of stuff. And that's the simplified version.
- You'll have to advance time yourself by using "<<IncTime minutes>>" whenever you need to advance the time. You can also use "<<IncGameDay>>" to increase the day by one day. You can also set the time and date directly using the $CurHr, $CurMn, $CurSc, and $GameDay variables, but you should call "<<SetDay $GameDay>>" if you change the $GameDay variable.
- I also tossed in the Flag and Alarm functions which you can use to keep track of event flags or to set "alarms" so you can check to see if the alarm has gone off yet. Most of the functions have comments in front of them explaining them.
- Enjoy!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement