1. // TIC TAC TOE
  2. // A server script for ArtyOnline server application
  3. // by Arty-fishL
  4. // 4 Aug 2012
  5. /* ----------
  6. * SETUP API
  7. */
  8. importPackage(Packages.tk.artyfl.artyonline.script);
  9. var print = Terminal.outln;
  10. /* ----------
  11. * VARIABLES
  12. */
  13. var
  14. started = false,
  15. xPlayer = null,
  16. yPlayer = null,
  17. mrStage = 0,
  18. readyX = false,
  19. readyY = false,
  20. whosGo = null;
  21. // board
  22. var
  23. line1 = [0, 0, 0],
  24. line2 = [0, 0, 0],
  25. line3 = [0, 0, 0];
  26. /* ----------
  27. * FUNCTIONS
  28. */
  29. function setupGame() {
  30. // randomly choose x and o player
  31. if (Math.round( Math.random() ) === 0) {
  32. // first player is x
  33. xPlayer = Users.getUsers()[0];
  34. yPlayer = Users.getUsers()[1];
  35. } else {
  36. // second player is x
  37. xPlayer = Users.getUsers()[1];
  38. yPlayer = Users.getUsers()[0];
  39. }
  40. // randomly choose who plays first
  41. if (Math.round( Math.random() ) === 0) {
  42. // x goes first
  43. whosGo = xPlayer;
  44. } else {
  45. // y goes first
  46. whosGo = yPlayer;
  47. }
  48. // inform who is playing what
  49. var message = Messages.SimpleMessage(xPlayer, Messages.MessageBank.get("play as"), ["x", (whosGo === xPlayer)]);
  50. Messages.sendMessage(message);
  51. message = Messages.SimpleMessage(yPlayer, Messages.MessageBank.get("play as"), ["y", (whosGo === yPlayer)]);
  52. Messages.sendMessage(message);
  53. // replies will be received in onMessageReceived event
  54. mrStage = 1;
  55. }
  56. function replyWhoXY(message) {
  57. // - reply to who is x and y
  58. if (message.getMessage() === Messages.MessageBank.get("understood")) {
  59. // confirmed player is ready
  60. if (message.getUser() === xPlayer) {
  61. readyX = true;
  62. } else if (message.getUser() === yPlayer) {
  63. readyY = true;
  64. }
  65. // if both players are ready start play
  66. if (readyX && readyY) {
  67. // let play commence
  68. mrStage = 2;
  69. }
  70. } else {
  71. // somebody didnt understand, try sending again
  72. var message2 = null;
  73. if (message.getUser() === xPlayer) {
  74. message2 = Messages.SimpleMessage(message.getUser(), Messages.MessageBank.get("play as"), ["x"]);
  75. } else if (message.getUser() === yPlayer) {
  76. message2 = Messages.SimpleMessage(message.getUser(), Messages.MessageBank.get("play as"), ["y"]);
  77. }
  78. Messages.sendMessage(message2);
  79. }
  80. }
  81. function changePlayer() {
  82. // next persons go
  83. if (whosGo === xPlayer) {
  84. whosGo = yPlayer;
  85. } else {
  86. whosGo = xPlayer;
  87. }
  88. }
  89. function checkForWin() {
  90. // check to see if a plyer has won
  91. var
  92. sequence = line1.concat(line2, line3),
  93. winningSequences = [
  94. ["tl", "tm", "tr"] ,
  95. ["ml", "mm", "mr"] ,
  96. ["bl", "bm", "br"] ,
  97. ["tl", "ml", "bl"] ,
  98. ["tm", "mm", "bm"] ,
  99. ["tr", "mr", "br"] ,
  100. ["tl", "mm", "br"] ,
  101. ["tr", "mm", "bl"]
  102. ],
  103. playingPiece = 0;
  104. if (whosGo === xPlayer) {
  105. playingPiece = 1;
  106. } else {
  107. playingPiece = 2;
  108. }
  109. var placeMap = {
  110. 0: "tl", 1: "tm", 2: "tr",
  111. 3: "ml", 4: "mm", 5: "mr",
  112. 6: "bl", 7: "bm", 8: "br"
  113. },
  114. playedPlaces = [];
  115. for (i=0; i<9; i++) {
  116. if (sequence[i] === playingPiece) {
  117. playedPlaces.push(placeMap[i]);
  118. }
  119. }
  120. for (i=0; i < winningSequences.length; i++) {
  121. if (playedPlaces.contains(winningSequences[i][0]) && playedPlaces.contains(winningSequences[i][1]) && playedPlaces.contains(winningSequences[i][2])) {
  122. // matched a winning sequence
  123. return true;
  124. }
  125. }
  126. // no winning matches
  127. return false;
  128. }
  129. function informCurrentMove(line, box) {
  130. var mp = null;
  131. if (whosGo === xPlayer) {
  132. mp = yPlayer;
  133. } else {
  134. mp = xPlayer;
  135. }
  136. var message = Messages.SimpleMessage(mp, Messages.MessageBank.get("other player moved"), [line, box]);
  137. Messages.sendMessage(message);
  138. }
  139. function informNextMove() {
  140. var message = Messages.SimpleMessage(whosGo, Messages.MessageBank.get("your go"), []);
  141. Messages.sendMessage(message);
  142. }
  143. function informWinner() {
  144. var winner = "";
  145. if (whosGo === xPlayer) {
  146. winner = "x";
  147. } else {
  148. winner = "y";
  149. }
  150. var message = Messages.SimpleMessage(xPlayer, Messages.MessageBank.get("winner"), [winner]);
  151. Messages.sendMessage(message);
  152. message = Messages.SimpleMessage(yPlayer, Messages.MessageBank.get("winner"), [winner]);
  153. Messages.sendMessage(message);
  154. }
  155. function makeMove(message) {
  156. // current player chose position
  157. var
  158. line = message.getVars[0],
  159. box = message.getVars[1],
  160. xo = 0;
  161. if (whosGo === xPlayer) {
  162. xo = 1;
  163. } else {
  164. xo = 2;
  165. }
  166. if(line === 1) {
  167. // play in line 1
  168. line1[box] = xo;
  169. } else if(line === 2) {
  170. // play in line 2
  171. line2[box] = xo;
  172. } else if(line === 3) {
  173. // play in line 3
  174. line3[box] = xo;
  175. }
  176. // use move data
  177. informCurrentMove(line, box);
  178. if (checkForWin() === false) {
  179. // next move
  180. changePlayer();
  181. informNextMove();
  182. } else {
  183. // somebody won
  184. informWinner();
  185. }
  186. }
  187. /* ---------
  188. * EVENTS
  189. */
  190. Events.onLoad = function(vars) {
  191. // SETUP
  192. // limit players to 2
  193. Users.setMaxUsers(2);
  194. // add messages to message bank
  195. Messages.MessageBank.add( ["wait other player", "make move", "other player moved", "winner", "play as", "understood", "your go"] );
  196. };
  197. Events.onJoin = function(vars){
  198. // wait for 2 players to join
  199. if (Users.getUsers().length === 2) {
  200. // start game
  201. started = true;
  202. setupGame();
  203. } else {
  204. // still waiting for players to join
  205. print("Waiting for other player to join");
  206. // inform user who just joined
  207. var message = Messages.SimpleMessage(vars[0], Messages.MessageBank.get("wait other player"), []);
  208. Messages.sendMessage(message);
  209. }
  210. };
  211. Events.onMessageReceive = function(vars) {
  212. // get message
  213. var message = vars[0];
  214. // check for various functions
  215. if (mrStage === 1) {
  216. // reply to who is x and y
  217. replyWhoXY(message);
  218. } else if (mrStage === 2 && message.getMessage() === Messages.MessageBank.get("make move") && message.getUser() === whosGo) {
  219. // telling where player will move
  220. makeMove(message);
  221. }
  222. };
  223. Events.onCommand = function(vars) {
  224. // print understood
  225. var command = vars[0];
  226. print(command.getCommand());
  227. };