Guest User

Minesweeper

a guest
Feb 14th, 2012
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.99 KB | None | 0 0
  1.  
  2. $g0 = $printNameTable["Letters/0"];
  3. $g1 = $printNameTable["Letters/1"];
  4. $g2 = $printNameTable["Letters/2"];
  5. $g3 = $printNameTable["Letters/3"];
  6. $g4 = $printNameTable["Letters/4"];
  7. $g5 = $printNameTable["Letters/5"];
  8. $g6 = $printNameTable["Letters/6"];
  9. $g7 = $printNameTable["Letters/7"];
  10. $g8 = $printNameTable["Letters/8"];
  11. $g9 = $printNameTable["Letters/9"];
  12. $gflag = $printNameTable["Letters/-pound"];
  13. $gmark = $printNameTable["Letters/-qmark"];
  14. $gmine = $printNameTable["Letters/-asterisk"];
  15. $empty = $printNameTable["Letters/-space"];
  16. $piece[$g0] = "0";
  17. $piece[$g1] = "1";
  18. $piece[$g2] = "2";
  19. $piece[$g3] = "3";
  20. $piece[$g4] = "4";
  21. $piece[$g5] = "5";
  22. $piece[$g6] = "6";
  23. $piece[$g7] = "7";
  24. $piece[$g8] = "8";
  25. $piece[$g9] = "9";
  26. $piece[$gflag] = "flag";
  27. $piece[$gmark] = "mark";
  28. $piece[$gmine] = "mine";
  29. $piece[$empty] = "empty";
  30.  
  31. function startMineSweeperGame(%table,%c,%mines,%tx,%ty)
  32. {
  33. ////
  34. //Check for problems
  35. //
  36. if(!isObject("_mns_" @ %table))
  37. {
  38. error("Table " @ %table @ " does not exist.");
  39. return;
  40. }
  41. if(%c.chesstable !$= "")
  42. {
  43. error("Client " @ %c @ " already in a game. NAME: " @ %c.getPlayerName());
  44. return;
  45. }
  46. if($mns[%table] !$= "")
  47. {
  48. error("Table " @ %table @ " already has a player.");
  49. return;
  50. }
  51. $mns[%table] = %c;
  52. %c.chesstable = %table;
  53. %mines = mfloor(%mines);
  54. if(%mines < 10)
  55. %mines = 10;
  56. if(%mines > 30)
  57. %mines = 30;
  58. $mnsmines[%table] = %mines;
  59. $mnsmine[%table] = %mines;
  60. %mine = %mines;
  61. if(strLen(%mine) == 1)
  62. %mine = "0" @ %mine;
  63. %m0 = getSubStr(%mine,1,1);
  64. echo(%m0 @ %m1);
  65. %m1 = getSubStr(%mine,0,1);
  66. %b = "_mns_" @ %table @ "_m0";
  67. %b.setPrint($g[%m0]);
  68. %b = "_mns_" @ %table @ "_m1";
  69. %b.setPrint($g[%m1]);
  70. $mnstime[%table] = 0;
  71. $mnstick[%table] = schedule(1000,0,mnstick,%table);
  72. ////
  73. //Clear the table
  74. //
  75. for(%x=0;%x<10;%x++)
  76. for(%y=0;%y<10;%y++)
  77. {
  78. %b = "_mns_" @ %table @ "_" @ %x @ %y;
  79. %b.setPrint($empty);
  80. %b.setColor(39);
  81. %b.isMine = 0;
  82. }
  83. for(%x=0;%x<3;%x++)
  84. {
  85.  
  86. %b = "_mns_" @ %table @ "_t" @ %x;
  87. %b.setColor(36);
  88. %b.setPrint($g0);
  89. if(%x!=2)
  90. {
  91. %b = "_mns_" @ %table @ "_m" @ %x;
  92. %b.setColor(36);
  93. %b.setPrint($g0);
  94. }
  95. }
  96. ////
  97. //Set random mines
  98. //
  99. for(%x=0;%x<%mines;%x++)
  100. {
  101. %rx = getRandom(0,9);
  102. %ry = getRandom(0,9);
  103. %b = "_mns_" @ %table @ "_" @ %rx @ %ry;
  104. if(%b.isMine || (%rx == %tx && %ry == %ty))
  105. {
  106. %x--;
  107. continue;
  108. }
  109. else
  110. %b.isMine = 1;
  111. }
  112. }
  113.  
  114. function mnstick(%t)
  115. {
  116. cancel($mnstick[%t]);
  117. $mnstime[%t]++;
  118. if($mnstime[%t] >= 120)
  119. {
  120. $mns[%t].centerprint("You lose. (Time expired)",5);
  121. $mns[%t].chesstable = "";
  122. $mns[%t] = "";
  123. resetmnsBoard(%t);
  124. return;
  125. }
  126. %l = strLen($mnsTime[%t]);
  127. if(%l == 1)
  128. %time = "00" @ $mnstime[%t];
  129. else if(%l == 2)
  130. %time = "0" @ $mnstime[%t];
  131. else if(%l == 3)
  132. %time = $mnsTime[%t];
  133. else
  134. {
  135. $mns[%t].centerprint("You lose. (Time expired)",5);
  136. $mns[%t].chesstable = "";
  137. $mns[%t] = "";
  138. resetmnsBoard(%t);
  139. return;
  140. }
  141. %t0 = getSubStr(%time,2,1);
  142. %t1 = getSubStr(%time,1,1);
  143. %t2 = getSubStr(%time,0,1);
  144. %b = "_mns_" @ %t @ "_t0";
  145. %b.setPrint($g[%t0]);
  146. %b = "_mns_" @ %t @ "_t1";
  147. %b.setPrint($g[%t1]);
  148. %b = "_mns_" @ %t @ "_t2";
  149. %b.setPrint($g[%t2]);
  150. $mnstick[%t] = schedule(1000,0,mnstick,%t);
  151. }
  152.  
  153. package mnsgame
  154. {
  155. function fxDtsBrick::onActivate(%t,%p,%c,%pos,%vec)
  156. {
  157. if(strLen(%t.getName()) > 9)
  158. {
  159. %btable = getSubStr(%t.getName(),5,stripos(%t.getName(),"_",5)-5);
  160. if(%btable $= %c.chesstable)
  161. {
  162. %piece = $piece[%t.getPrintID()];
  163. ////
  164. //Players can only click empty spaces
  165. //
  166. if(%piece $= "empty" && %t.getColorID() == 39)
  167. {
  168. ////
  169. //If it's a mine, they lose.
  170. //
  171. if(%t.isMine)
  172. {
  173. //%t.setPrint($gmine);
  174. //%t.setColor(0);
  175. for(%x=0;%x<10;%x++)
  176. for(%y=0;%y<10;%y++)
  177. {
  178. %b = "_mns_" @ %btable @ "_" @ %x @ %y;
  179. if(%b.isMine)
  180. {
  181. %b.setColor(0);
  182. if(%b.getPrintID() == $empty || %b.getPrintID() == $gmark)
  183. %b.setPrint($gmine);
  184. else
  185. %b.setColor(58);
  186. }
  187. }
  188. cancel($mnstick[%btable]);
  189. $mns[%btable] = "";
  190. %c.chesstable = "";
  191. %c.centerPrint("Game Over!",5);
  192. }
  193. ////
  194. //It's not a mine, check surrounding spaces.
  195. //
  196. else
  197. {
  198. %tx = getSubStr(%t.getName(),strLen(%t.getName())-2,1);
  199. %ty = getSubStr(%t.getName(),strLen(%t.getName())-1,1);
  200. %minecount = 0;
  201. for(%x=%tx-1;%x<=%tx+1;%x++)
  202. {
  203. for(%y=%ty-1;%y<=%ty+1;%y++)
  204. {
  205. %b = "_mns_" @ %btable @ "_" @ %x @ %y;
  206. if(%b.isMine)
  207. %minecount++;
  208. }
  209. }
  210. ////
  211. //There's mines nearby. Put a number on the brick.
  212. //
  213. %t.setColor(38);
  214. if(%minecount > 0)
  215. %t.setPrint($g[%minecount]);
  216. ////
  217. //No mines nearby. Click all the spaces around the brick.
  218. //
  219. else
  220. {
  221. for(%x=%tx-1;%x<=%tx+1;%x++)
  222. {
  223. for(%y=%ty-1;%y<=%ty+1;%y++)
  224. {
  225. %b = "_mns_" @ %btable @ "_" @ %x @ %y;
  226. if(isObject(%b))
  227. %b.onActivate(%p,%c,%pos,%vec);
  228. }
  229. }
  230. }
  231. ////
  232. //Check if it's a victory
  233. //
  234. %count = 0;
  235. for(%x=0;%x<10;%x++)
  236. {
  237. for(%y=0;%y<10;%y++)
  238. {
  239. %b = "_mns_" @ %btable @ "_" @ %x @ %y;
  240. if(%b.getColorID() == 38)
  241. %count++;
  242. }
  243. }
  244. if(%count == 100-$mnsmines[%btable])
  245. {
  246. for(%x=0;%x<10;%x++)
  247. for(%y=0;%y<10;%y++)
  248. {
  249. %b = "_mns_" @ %btable @ "_" @ %x @ %y;
  250. if(%b.isMine)
  251. %b.setColor(58);
  252. }
  253. cancel($mnstick[%btable]);
  254. if($mnstime[%btable] >= 12)
  255. {
  256. %c.centerPrint("You win! (+1 Token)",5);
  257. %am = 1;
  258. }
  259. else
  260. {
  261. %c.centerPrint("Fast victory! (+3 Tokens)",5);
  262. %am = 3;
  263. }
  264. %to = "Tokens_" @ %c.bl_id;
  265. %to.tokens+=%am;
  266. $mns[%btable] = "";
  267. %c.chesstable = "";
  268. %c.saveTokens();
  269. }
  270. }
  271. }
  272. }
  273. ////
  274. //If it's their first move, start the game and make it impossible for it to be a mine.
  275. //
  276. else if($mns[%btable] $= "" && %c.chesstable $= "" && %btable !$= "")
  277. {
  278. %tx = getSubStr(%t.getName(),strLen(%t.getName())-2,1);
  279. %ty = getSubStr(%t.getName(),strLen(%t.getName())-1,1);
  280. startMineSweeperGame(%btable,%c,10,%tx,%ty);
  281. %t.onActivate(%p,%c,%pos,%vec);
  282. }
  283. }
  284. Parent::onActivate(%t,%p,%c,%pos,%vec);
  285. }
  286. function armor::onTrigger(%data,%this,%s,%v)
  287. {
  288. if(%s == 4 && %v)
  289. {
  290. %start = %this.getEyePoint();
  291. %evec = %this.getEyeVector();
  292. %end = vectorAdd(%start,vectorScale(%eVec,5));
  293. %targets = $TypeMasks::FxBrickAlwaysObjectType;
  294. %ray = ContainerRayCast(%start, %end, %targets, %this);
  295. %col = getWord(%ray,0);
  296. if(!isObject(%col))
  297. return Parent::onTrigger(%data,%this,%s,%v);
  298. if(strLen(%col.getName()) > 5)
  299. {
  300. if(getSubStr(%col.getName(),0,strLen(%col.getName())-3) $= ("_mns_" @ %this.client.chesstable))
  301. {
  302. %piece = $piece[%col.getPrintID()];
  303. if(%col.getColorID() == 39)
  304. {
  305. if(%piece $= "empty" && $mnsmine[%this.client.chesstable] > 0)
  306. {
  307. %col.setPrint($gflag);
  308. %mine = $mnsmine[%this.client.chesstable]--;
  309. if(strLen(%mine) == 1)
  310. %mine = "0" @ %mine;
  311. %m0 = getSubStr(%mine,1,1);
  312. %m1 = getSubStr(%mine,0,1);
  313. %b = "_mns_" @ %this.client.chesstable @ "_m0";
  314. %b.setPrint($g[%m0]);
  315. %b = "_mns_" @ %this.client.chesstable @ "_m1";
  316. %b.setPrint($g[%m1]);
  317. }
  318. else if(%piece $= "flag")
  319. {
  320. %col.setPrint($gmark);
  321. %mine = $mnsmine[%this.client.chesstable]++;
  322. if(strLen(%mine) == 1)
  323. %mine = "0" @ %mine;
  324. %m0 = getSubStr(%mine,1,1);
  325. %m1 = getSubStr(%mine,0,1);
  326. %b = "_mns_" @ %this.client.chesstable @ "_m0";
  327. %b.setPrint($g[%m0]);
  328. %b = "_mns_" @ %this.client.chesstable @ "_m1";
  329. %b.setPrint($g[%m1]);
  330. }
  331. else if(%piece $= "mark")
  332. %col.setPrint($empty);
  333. }
  334. }
  335. }
  336. }
  337. Parent::onTrigger(%data,%this,%s,%v);
  338. }
  339. function serverCmdLight(%c)
  340. {
  341. %this = %c.player;
  342. if(!isObject(%this))
  343. return Parent::serverCmdLight(%c);
  344. %start = %this.getEyePoint();
  345. %evec = %this.getEyeVector();
  346. %end = vectorAdd(%start,vectorScale(%eVec,5));
  347. %targets = $TypeMasks::FxBrickAlwaysObjectType;
  348. %ray = ContainerRayCast(%start, %end, %targets, %this);
  349. %col = getWord(%ray,0);
  350. if(strLen(%col.getName()) > 5)
  351. {
  352. if(getSubStr(%col.getName(),0,strLen(%col.getName())-3) $= ("_mns_" @ %c.chesstable))
  353. {
  354. %piece = $piece[%col.getPrintID()];
  355. if(%piece !$= "empty" && $piece !$= "mark" && $piece !$= "flag" && $piece != 8)
  356. {
  357. %tx = getSubStr(%col.getName(),strLen(%col.getName())-2,1);
  358. %ty = getSubStr(%col.getName(),strLen(%col.getName())-1,1);
  359. for(%x=%tx-1;%x<=%tx+1;%x++)
  360. for(%y=%ty-1;%y<=%ty+1;%y++)
  361. {
  362. %b = "_mns_" @ %c.chessTable @ "_" @ %x @ %y;
  363. if(isObject(%b) && %b.getPrintID() == $gflag)
  364. %count++;
  365. }
  366. if(%count == %piece)
  367. for(%x=%tx-1;%x<=%tx+1;%x++)
  368. for(%y=%ty-1;%y<=%ty+1;%y++)
  369. {
  370. %b = "_mns_" @ %c.chessTable @ "_" @ %x @ %y;
  371. if(isObject(%b))
  372. %b.onActivate(%this,%c,%b.position,%vec);
  373. }
  374. }
  375. }
  376. else
  377. return Parent::serverCmdLight(%c);
  378. }
  379. else
  380. Parent::serverCmdLight(%c);
  381. }
  382. function GameConnection::onClientLeaveGame(%c)
  383. {
  384. cancel($mnstick[%c.chesstable]);
  385. $mns[%c.chesstable] = "";
  386. resetmnsBoard(%c.chesstable);
  387. return Parent::onClientLeaveGame(%c);
  388. }
  389. };
  390.  
  391. activatePackage(mnsgame);
  392.  
  393. function fixmnsBoard(%board)
  394. {
  395. for(%x=0;%x<10;%x++)
  396. for(%y=0;%y<10;%y++)
  397. {
  398. %b = "_mns_" @ %board @ "_" @ %x @ %y;
  399. %b.addEvent(1,0,"OnActivate","Self","SetColorFX",3);
  400. %b.addEvent(1,100,"OnActivate","Self","SetColorFX",0);
  401. }
  402. }
  403.  
  404. function resetmnsBoard(%table)
  405. {
  406. for(%x=0;%x<10;%x++)
  407. for(%y=0;%y<10;%y++)
  408. {
  409. %b = "_mns_" @ %table @ "_" @ %x @ %y;
  410. %b.setPrint($empty);
  411. %b.setColor(39);
  412. %b.isMine = 0;
  413. }
  414. for(%x=0;%x<3;%x++)
  415. {
  416.  
  417. %b = "_mns_" @ %table @ "_t" @ %x;
  418. %b.setColor(36);
  419. %b.setPrint($g0);
  420. if(%x!=2)
  421. {
  422. %b = "_mns_" @ %table @ "_m" @ %x;
  423. %b.setColor(36);
  424. %b.setPrint($g0);
  425. }
  426. }
  427. }
  428.  
  429. function renamemnsBoard(%bo,%n)
  430. {
  431. %b = "_mns_" @ %bo;
  432. %b.setName("_mns_" @ %n);
  433. %b = "_mns_" @ %bo @ "_t0";
  434. %b.setName("_mns_" @ %n @ "_t0");
  435. %b = "_mns_" @ %bo @ "_t1";
  436. %b.setName("_mns_" @ %n @ "_t1");
  437. %b = "_mns_" @ %bo @ "_t2";
  438. %b.setName("_mns_" @ %n @ "_t2");
  439. %b = "_mns_" @ %bo @ "_m0";
  440. %b.setName("_mns_" @ %n @ "_m0");
  441. %b = "_mns_" @ %bo @ "_m1";
  442. %b.setName("_mns_" @ %n @ "_m1");
  443. for(%x=0;%x<10;%x++)
  444. for(%y=0;%y<10;%y++)
  445. {
  446. %b = "_mns_" @ %bo @ "_" @ %x @ %y;
  447. %b.setName("_mns_" @ %n @ "_" @ %x @ %y);
  448. }
  449. }
Advertisement
Add Comment
Please, Sign In to add comment