Timer.lsl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. //:Name: HYPERGRID STORY NINE
  2. //:Author: Shin Ingen
  3. //:REV:1.0
  4. //:DESCRIPTION:
  5. // Timer controller
  6. //:CODE:
  7. // lots of mods by Ferd
  8. //
  9. integer debug = 2;
  10. // Link Numbers of the NPC controller
  11. integer namaka =2;
  12. integer dylan =3;
  13. integer npc1 =4;
  14. integer npc2 =5;
  15. integer npc3 =6;
  16. integer npc4 =7;
  17. integer npc5 =8;
  18. integer npc6 =9;
  19. // List of NPC Listener channels
  20. integer gFireworksChannel =20;
  21. integer gTeleportChannel = 21;
  22. integer CommandChannel = 23;
  23. integer gSimpleMenuChannel = 999; // The channel used for the menu
  24. integer MaxTicks = 60; // Show length
  25. // The repeat the show timer
  26. list kDance1 = ["Dance1",1]; // Dance
  27. list kDance2 = ["Dance2",10]; // Dance
  28. list kDance3 = ["Dance3",20]; // Dance
  29. list kDance4 = ["Dance4",30]; // Dance
  30. list kDance5 = ["Dance5",40]; // Dance
  31. list kDance6 = ["Dance6",50]; // Dance
  32. list kFireworksRepRate = ["Shoot", 2]; // rep rate for finale
  33. // the following are calculated based on the current timer tick
  34. list kFireworksStartsAt = ["StartFireworks", 99999]; // rep rate for finale
  35. list kRaiseTeleport = ["BeamMeUp",99999]; // raise the teleports
  36. list kStopAutoFire = ["EndFireworks",99999]; // and stops here
  37. SendMessageLinked(integer npc, string cmd)
  38. {
  39. llRegionSay(CommandChannel,(string) npc + "|" + cmd);
  40. }
  41. DoCmd(string message, integer channel)
  42. {
  43. if (channel == CommandChannel) {
  44. Process(message);
  45. }
  46. if (message == "ShowTime") {
  47. DEBUG("Running");
  48. ShowTime();
  49. }
  50. else if (message == "Finale!")
  51. {
  52. kFireworksStartsAt = ["StartFireworks", gTimeElapsed+1]; // rep rate for finale
  53. kRaiseTeleport = ["BeamMeUp",gTimeElapsed+25]; // raise the teleports
  54. kStopAutoFire = ["EndFireworks",gTimeElapsed+30]; // and stops here
  55. settimeout(kFireworksStartsAt);
  56. settimeout(kStopAutoFire);
  57. settimeout(kRaiseTeleport);
  58. }
  59. else if (message == "Stop")
  60. {
  61. llSay(0,"You selected option Stop");
  62. gTimeoutList = [];
  63. }
  64. }
  65. // this is a list of all the cycling show bits
  66. ShowTime()
  67. {
  68. DEBUG("Starting Countdown");
  69. gTimeElapsed=0;
  70. settimeout(kDance1);
  71. settimeout(kDance2);
  72. settimeout(kDance3);
  73. settimeout(kDance4);
  74. settimeout(kDance5);
  75. settimeout(kDance6);
  76. DEBUG(llDumpList2String(gTimeoutList,":"));
  77. }
  78. Process(string timereventid) {
  79. if (llList2String(kDance1,0) == timereventid)
  80. {
  81. DEBUG("Dance1");
  82. ;
  83. SendMessageLinked(dylan,"@appearance=Dylan");
  84. SendMessageLinked(namaka,"@appearance=Namaka");
  85. SendMessageLinked(npc1,"@appearance=Crispen Enpeacee");
  86. SendMessageLinked(npc2,"@appearance=Alessandra Enpeacee");
  87. SendMessageLinked(npc3,"@appearance=Sammy Enpeacee");
  88. SendMessageLinked(npc4,"@appearance=Jolinda Enpeacee");
  89. SendMessageLinked(npc5,"@appearance=Claire Enpeacee");
  90. SendMessageLinked(npc6,"@appearance=Marianne Enpeacee");
  91. SendMessageLinked(LINK_SET,"@notecard=Dance1");
  92. }
  93. else if (llList2String(kDance2,0) == timereventid)
  94. {
  95. DEBUG("Dance2");
  96. SendMessageLinked(LINK_SET,"@appearance=Alessandra Enpeacee");
  97. SendMessageLinked(LINK_SET,"@notecard=Dance2");
  98. }
  99. else if (llList2String(kDance3,0) == timereventid)
  100. {
  101. DEBUG("Dance3");
  102. SendMessageLinked(LINK_SET,"@appearance=Sammy Enpeacee");
  103. SendMessageLinked(LINK_SET,"@notecard=Dance3");
  104. }
  105. else if (llList2String(kDance4,0)== timereventid)
  106. {
  107. DEBUG("Dance4");
  108. SendMessageLinked(LINK_SET,"@appearance=Jolinda Enpeacee");
  109. SendMessageLinked(LINK_SET,"@notecard=Dance4");
  110. }
  111. else if (llList2String(kDance5,0)== timereventid)
  112. {
  113. DEBUG("Dance5");
  114. SendMessageLinked(LINK_SET,"@appearance=Claire Enpeacee");
  115. SendMessageLinked(LINK_SET,"@notecard=Dance5");
  116. }
  117. else if (llList2String(kDance6,0)== timereventid)
  118. {
  119. DEBUG("Dance6");
  120. SendMessageLinked(LINK_SET,"@appearance=MarianneEnpeacee");
  121. SendMessageLinked(LINK_SET,"@notecard=Dance6");
  122. }
  123. else if (llList2String(kFireworksStartsAt,0) == timereventid)
  124. {
  125. DEBUG("Shoot!");
  126. SendMessageLinked(LINK_SET,"@appearance=Dragon");
  127. SendMessageLinked(LINK_SET,"@notecard=Fireworks");
  128. llRegionSay(gFireworksChannel,"Go");
  129. settimeout(kFireworksRepRate);
  130. }
  131. else if (llList2String(kFireworksRepRate,0) == timereventid)
  132. {
  133. DEBUG("Fireworks Start");
  134. llRegionSay(gFireworksChannel,"Go");
  135. SendMessageLinked(npc1,"@appearance=Crispen Enpeacee");
  136. SendMessageLinked(npc2,"@appearance=Alessandra Enpeacee");
  137. SendMessageLinked(npc3,"@appearance=Sammy Enpeacee");
  138. SendMessageLinked(npc4,"@appearance=Jolinda Enpeacee");
  139. SendMessageLinked(npc5,"@appearance=Claire Enpeacee");
  140. SendMessageLinked(npc6,"@appearance=Marianne Enpeacee");
  141. SendMessageLinked(dylan,"@appearance=Dylan");
  142. SendMessageLinked(namaka,"@appearance=Namaka");
  143. SendMessageLinked(LINK_SET,"@notecard=Final");
  144. settimeout(kFireworksRepRate);
  145. }
  146. else if (llList2String(kStopAutoFire,0) == timereventid)
  147. {
  148. DEBUG("Fireworks End");
  149. deletetimeout(kFireworksRepRate);
  150. settimeout(kRaiseTeleport);
  151. }
  152. else if (llList2String(kRaiseTeleport,0) == timereventid)
  153. {
  154. SendMessageLinked(LINK_SET,"@notecard=Teleport");
  155. DEBUG("Teleports Up");
  156. llRegionSay(gTeleportChannel,"Up");
  157. }
  158. }
  159. integer busy;
  160. integer gListener; // Listener for handling different channels
  161. list gTimeoutList;
  162. float gTimeElapsed=0;
  163. //============================================================================
  164. vector gFacecolor=<1.0,0.0,0.0>; //RED
  165. DEBUG(string msg)
  166. {
  167. if (debug ==1)
  168. llSay(0,llGetScriptName() + ":" + msg);
  169. if (debug ==2)
  170. llSetText(msg, <1,0,0>,1.0);
  171. }
  172. menu(key id, integer channel, string title, list buttons) {
  173. llListenRemove(gListener);
  174. gListener = llListen(channel,"",id,"");
  175. llDialog(id,title,buttons,channel);
  176. }
  177. simplemenu(key id) {
  178. menu(id,gSimpleMenuChannel,"Select an option",["ShowTime","Finale","Stop"]);
  179. }
  180. deletetimeout(list events) {
  181. string timereventid = llList2String(events,0);
  182. DEBUG("Deleteing timer event " + timereventid);
  183. integer identifyerIndex = llListFindList(gTimeoutList, [timereventid]);
  184. if (identifyerIndex != -1)
  185. gTimeoutList = llDeleteSubList(gTimeoutList, identifyerIndex - 1, identifyerIndex);
  186. }
  187. settimeout(list events)
  188. {
  189. // unpack the list
  190. string timereventid = llList2String(events,0);
  191. integer time = llList2Integer(events,1);
  192. DEBUG("Adding " + timereventid);
  193. integer identifyerIndex = llListFindList(gTimeoutList, [timereventid]);
  194. if (identifyerIndex != -1)
  195. gTimeoutList = llDeleteSubList(gTimeoutList, identifyerIndex - 1, identifyerIndex);
  196. if (time != 0) {
  197. gTimeoutList += time;
  198. gTimeoutList += timereventid;
  199. }
  200. llSetTimerEvent(1.0);
  201. }
  202. timertick() {
  203. gTimeElapsed ++;
  204. //DEBUG((string) gTimeElapsed );
  205. integer i;
  206. integer numTimers = llGetListLength(gTimeoutList);
  207. //DEBUG((string) (numTimers/2) + " timers");
  208. // scan over all queued timers
  209. for (i = 0; i < numTimers; i += 2)
  210. {
  211. integer triggerTime = llList2Integer(gTimeoutList, i);
  212. //DEBUG("TriggerTime = " + (string)triggerTime);
  213. if (triggerTime == gTimeElapsed) {
  214. string timereventid = llList2String(gTimeoutList, i + 1);
  215. //DEBUG("matched " + timereventid);
  216. gTimeoutList = llDeleteSubList(gTimeoutList, i, i + 1); // they are one-shots, so delete the event that just happened.
  217. Process(timereventid); // process the callback
  218. if (gTimeoutList == []) {
  219. DEBUG("Show over! Starting back up");
  220. ShowTime();
  221. }
  222. }
  223. }
  224. }
  225. displaydigit(integer n, string d){
  226. list Facelist; //list depends on your mesh digital readout face number.
  227. integer i;
  228. if(n==0) Facelist=[ 1,1,1,1,0,1,1 ]; //index @0 | 7 faces per digit
  229. if(n==1) Facelist=[ 0,0,1,0,0,1,0 ];
  230. if(n==2) Facelist=[ 1,1,0,1,1,1,0 ];
  231. if(n==3) Facelist=[ 1,1,1,0,1,1,0 ];
  232. if(n==4) Facelist=[ 0,0,1,0,1,1,1 ];
  233. if(n==5) Facelist=[ 1,1,1,0,1,0,1 ];
  234. if(n==6) Facelist=[ 0,1,1,1,1,0,1 ];
  235. if(n==7) Facelist=[ 1,0,1,0,0,1,0 ];
  236. if(n==8) Facelist=[ 1,1,1,1,1,1,1 ];
  237. if(n==9) Facelist=[ 1,0,1,0,1,1,1 ];
  238. integer l = llGetLinkNumber() != 0;
  239. integer x = llGetNumberOfPrims() + l;
  240. for (; l < x; ++l){
  241. if (llGetLinkName(l) == d){
  242. for (i=0;i<7;i++){
  243. llSetLinkPrimitiveParamsFast(l,[PRIM_COLOR,i,gFacecolor,llList2Float(Facelist,i)]);
  244. }
  245. }
  246. }
  247. }
  248. getdigit(integer time){
  249. string dOne;
  250. string dTen;
  251. string dHundred;
  252. string dThousand;
  253. if (time<10){
  254. dOne=(string)time;
  255. dTen="0";
  256. dHundred="0";
  257. dThousand="0"; // add your digits here
  258. }else if(time<100){
  259. dOne=llGetSubString((string)time,-1,-1);
  260. dTen=llGetSubString((string)time,0,0);
  261. dHundred="0";
  262. dThousand="0";
  263. }else if(time<1000){
  264. dOne=llGetSubString((string)time,-1,-1);
  265. dTen=llGetSubString((string)time,1,1);
  266. dHundred=llGetSubString((string)time,0,0);
  267. dThousand="0";
  268. }else if(time<10000){
  269. dOne=llGetSubString((string)time,-1,-1);
  270. dTen=llGetSubString((string)time,2,2);
  271. dHundred=llGetSubString((string)time,1,1);
  272. dThousand=llGetSubString((string)time,0,0);
  273. }
  274. displaydigit((integer)dOne, "one");
  275. displaydigit((integer)dTen, "ten");
  276. displaydigit((integer)dHundred, "hundred");
  277. displaydigit((integer)dThousand, "thousand");
  278. //DEBUG(dThousand + dHundred + ":" + dTen + dOne);
  279. }
  280. StopAll()
  281. {
  282. DEBUG("Stopped");
  283. llSetTimerEvent(0);
  284. }
  285. default
  286. {
  287. state_entry()
  288. {
  289. llListen(CommandChannel,"","","");
  290. getdigit(0);
  291. }
  292. touch_start(integer num)
  293. {
  294. if ( llGetOwner() == llDetectedKey(0)) {
  295. if (! busy) {
  296. simplemenu(llDetectedKey(0));
  297. busy++;
  298. } else {
  299. busy = FALSE;
  300. StopAll();
  301. }
  302. }
  303. }
  304. link_message(integer sender_number, integer number, string message, key id)
  305. {
  306. DEBUG("LINK MESSAGE\n" + message);
  307. DoCmd(message, number);
  308. }
  309. listen (integer channel, string name, key id, string message)
  310. {
  311. // !!! add parser for killing the NPC
  312. DEBUG("LISTEN\n" + message);
  313. DoCmd(message, channel);
  314. }
  315. timer()
  316. {
  317. timertick();
  318. //limit the ticker to maximum ticks
  319. if(gTimeElapsed >= MaxTicks){
  320. gTimeElapsed=0;
  321. }
  322. integer CountDown = MaxTicks - (integer)gTimeElapsed;
  323. integer mm = (CountDown / 60) * 100;
  324. integer ss = (CountDown % 60);
  325. integer cc = mm + ss;
  326. getdigit((integer)cc);
  327. }
  328. }