updating to latest huffware set.
[feisty_meow.git] / huffware / huffotronic_tools_n_testers_v6.5 / Hour_Hand_v0.5.txt
diff --git a/huffware/huffotronic_tools_n_testers_v6.5/Hour_Hand_v0.5.txt b/huffware/huffotronic_tools_n_testers_v6.5/Hour_Hand_v0.5.txt
new file mode 100755 (executable)
index 0000000..7027c39
--- /dev/null
@@ -0,0 +1,109 @@
+
+// huffware script: hour hand, modified by fred huffhines.
+// 
+// expanded to support time zones by fred huffhines, december 2009.
+//
+// noticed this in arcadia asylum's great hobo cuckoo clock.
+// this script is licensed by Beezle Warburton:
+//    "I released those 'into the wild' years ago,do what you like,
+//     I just ask that people don't resell the scripts by themselves."
+//
+// fred's changes licensed by:
+//   this script is licensed by the GPL v3 which is documented at: http://www.gnu.org/licenses/gpl.html
+//   do not use it in objects without fully realizing you are implicitly accepting that license.
+
+// Optional second hand will be a much simpler script that will be
+// unrelated to real-time.
+//
+// note - to reduce load, this script only calculates once a minute, so
+// this provides a jump style minute hand, rather than a smoothy rotating one.
+// This (and rounding) makes the clock's accuracy +/- 1 minute.
+// It's a prim clock anyways, so digital accuracy is just excessive.
+//
+// It would probably be more elegant to use link messages rather than each
+// hand having it's own script, however, this method allows for less caution
+// when linking/unlinking parts of the clock.
+
+// To not mess up timekeeping, please keep chime sounds under 4 seconds long.
+
+integer time;
+integer hours;
+integer minutes;
+
+float anglehours;
+float angleminutes;
+
+integer chime;
+integer numrings;
+
+string chimesound = "CuckooClock";
+float chimevolume = 1.0;
+
+// this is what might be adjusted.
+integer LOCAL_TIME_ZONE_OFFSET = -5;  //-5 is EST, -8 is PST.
+
+// the code used in linked messages for us.
+integer SECRET_TIME_ZONE_ADJUSTER_ID = -2091823;
+string TIME_ZONE_ADJUST_COMMAND = "tzadjust";
+
+default
+{
+    state_entry() { if (llSubStringIndex(llGetObjectName(),  "huffotronic") < 0) state real_default; }
+    on_rez(integer parm) { state rerun; }
+}
+state rerun { state_entry() { state default; } }
+
+state real_default
+{
+    state_entry()
+    {
+        // we want to calculate once a minute.
+        llSetTimerEvent(60.0);
+    }
+    timer() {
+        llSetTimerEvent(0);
+        time = (integer)llGetGMTclock(); // seconds since midnight
+        // adjust the hours for the time zone.  this will work for most time zones that
+        // go through daylight saving time, like the pacific zone where SL is rooted.
+        hours = (time / 3600) + LOCAL_TIME_ZONE_OFFSET;
+        // convert from 24 to 12 hour time
+        if (hours > 11) {
+            hours = hours - 12;
+        } else if (hours < 0) {
+            hours = hours + 12;
+        }
+        minutes = (time % 3600) / 60;
+        
+        numrings = (integer)hours;
+        if (numrings == 0) {
+            numrings = 12;
+        }
+        
+        // the extra addition here makes a smooth hour hand
+        // for example, at 6:30, the hour hand should actually
+        // be halfway between 6 and 7 on the clock dial
+        
+        anglehours = - (((float)hours / 12) + (((float)minutes / 720))) * TWO_PI;
+//incompatible with opensim:        llSetSoundQueueing(TRUE);
+        llRotateTexture(anglehours, ALL_SIDES);
+        if (minutes == 0) {
+            llMessageLinked(-1,numrings,"chime",NULL_KEY);
+            //for (chime = 0; chime < numrings; chime++) {
+            //      llPlaySound(chimesound, chimevolume);
+            //      llSleep(3.0);    
+            //}            
+        }
+        llSetTimerEvent(60.0);
+    }
+    
+    link_message(integer sender, integer num, string msg, key id) {
+        if ( (num != SECRET_TIME_ZONE_ADJUSTER_ID) || (msg != TIME_ZONE_ADJUST_COMMAND) )
+            return;  // not for us.
+        // this should be a time zone for us to use.
+        LOCAL_TIME_ZONE_OFFSET = (integer)((string)id);
+//llSay(0, "got a new time zone of " + (string)LOCAL_TIME_ZONE_OFFSET );
+        // handle this update as soon as possible.
+        llSetTimerEvent(0.1);
+    }
+}
+