Timer.lsl 11 KB

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