- // TIC TAC TOE
- // A server script for ArtyOnline server application
- // by Arty-fishL
- // 4 Aug 2012
-
- /* ----------
- * SETUP API
- */
-
- importPackage(Packages.tk.artyfl.artyonline.script);
- var print = Terminal.outln;
-
- /* ----------
- * VARIABLES
- */
-
- var
- started = false,
- xPlayer = null,
- yPlayer = null,
- mrStage = 0,
- readyX = false,
- readyY = false,
- whosGo = null;
-
- // board
- var
- line1 = [0, 0, 0],
- line2 = [0, 0, 0],
- line3 = [0, 0, 0];
-
- /* ----------
- * FUNCTIONS
- */
-
- function setupGame() {
- // randomly choose x and o player
- if (Math.round( Math.random() ) === 0) {
- // first player is x
- xPlayer = Users.getUsers()[0];
- yPlayer = Users.getUsers()[1];
- } else {
- // second player is x
- xPlayer = Users.getUsers()[1];
- yPlayer = Users.getUsers()[0];
- }
- // randomly choose who plays first
- if (Math.round( Math.random() ) === 0) {
- // x goes first
- whosGo = xPlayer;
- } else {
- // y goes first
- whosGo = yPlayer;
- }
- // inform who is playing what
- var message = Messages.SimpleMessage(xPlayer, Messages.MessageBank.get("play as"), ["x", (whosGo === xPlayer)]);
- Messages.sendMessage(message);
- message = Messages.SimpleMessage(yPlayer, Messages.MessageBank.get("play as"), ["y", (whosGo === yPlayer)]);
- Messages.sendMessage(message);
- // replies will be received in onMessageReceived event
- mrStage = 1;
- }
-
- function replyWhoXY(message) {
- // - reply to who is x and y
- if (message.getMessage() === Messages.MessageBank.get("understood")) {
- // confirmed player is ready
- if (message.getUser() === xPlayer) {
- readyX = true;
- } else if (message.getUser() === yPlayer) {
- readyY = true;
- }
- // if both players are ready start play
- if (readyX && readyY) {
- // let play commence
- mrStage = 2;
- }
- } else {
- // somebody didnt understand, try sending again
- var message2 = null;
- if (message.getUser() === xPlayer) {
- message2 = Messages.SimpleMessage(message.getUser(), Messages.MessageBank.get("play as"), ["x"]);
- } else if (message.getUser() === yPlayer) {
- message2 = Messages.SimpleMessage(message.getUser(), Messages.MessageBank.get("play as"), ["y"]);
- }
- Messages.sendMessage(message2);
- }
- }
-
- function changePlayer() {
- // next persons go
- if (whosGo === xPlayer) {
- whosGo = yPlayer;
- } else {
- whosGo = xPlayer;
- }
- }
-
- function checkForWin() {
- // check to see if a plyer has won
- var
- sequence = line1.concat(line2, line3),
- winningSequences = [
- ["tl", "tm", "tr"] ,
- ["ml", "mm", "mr"] ,
- ["bl", "bm", "br"] ,
- ["tl", "ml", "bl"] ,
- ["tm", "mm", "bm"] ,
- ["tr", "mr", "br"] ,
- ["tl", "mm", "br"] ,
- ["tr", "mm", "bl"]
- ],
-
- playingPiece = 0;
- if (whosGo === xPlayer) {
- playingPiece = 1;
- } else {
- playingPiece = 2;
- }
-
- var placeMap = {
- 0: "tl", 1: "tm", 2: "tr",
- 3: "ml", 4: "mm", 5: "mr",
- 6: "bl", 7: "bm", 8: "br"
- },
-
- playedPlaces = [];
- for (i=0; i<9; i++) {
- if (sequence[i] === playingPiece) {
- playedPlaces.push(placeMap[i]);
- }
- }
- for (i=0; i < winningSequences.length; i++) {
- if (playedPlaces.contains(winningSequences[i][0]) && playedPlaces.contains(winningSequences[i][1]) && playedPlaces.contains(winningSequences[i][2])) {
- // matched a winning sequence
- return true;
- }
- }
- // no winning matches
- return false;
- }
-
- function informCurrentMove(line, box) {
- var mp = null;
- if (whosGo === xPlayer) {
- mp = yPlayer;
- } else {
- mp = xPlayer;
- }
- var message = Messages.SimpleMessage(mp, Messages.MessageBank.get("other player moved"), [line, box]);
- Messages.sendMessage(message);
- }
-
- function informNextMove() {
- var message = Messages.SimpleMessage(whosGo, Messages.MessageBank.get("your go"), []);
- Messages.sendMessage(message);
- }
-
- function informWinner() {
- var winner = "";
- if (whosGo === xPlayer) {
- winner = "x";
- } else {
- winner = "y";
- }
- var message = Messages.SimpleMessage(xPlayer, Messages.MessageBank.get("winner"), [winner]);
- Messages.sendMessage(message);
- message = Messages.SimpleMessage(yPlayer, Messages.MessageBank.get("winner"), [winner]);
- Messages.sendMessage(message);
- }
-
- function makeMove(message) {
- // current player chose position
- var
- line = message.getVars[0],
- box = message.getVars[1],
- xo = 0;
- if (whosGo === xPlayer) {
- xo = 1;
- } else {
- xo = 2;
- }
- if(line === 1) {
- // play in line 1
- line1[box] = xo;
- } else if(line === 2) {
- // play in line 2
- line2[box] = xo;
- } else if(line === 3) {
- // play in line 3
- line3[box] = xo;
- }
- // use move data
- informCurrentMove(line, box);
- if (checkForWin() === false) {
- // next move
- changePlayer();
- informNextMove();
- } else {
- // somebody won
- informWinner();
- }
- }
-
- /* ---------
- * EVENTS
- */
-
- Events.onLoad = function(vars) {
- // SETUP
- // limit players to 2
- Users.setMaxUsers(2);
- // add messages to message bank
- Messages.MessageBank.add( ["wait other player", "make move", "other player moved", "winner", "play as", "understood", "your go"] );
- };
-
- Events.onJoin = function(vars){
- // wait for 2 players to join
- if (Users.getUsers().length === 2) {
- // start game
- started = true;
- setupGame();
- } else {
- // still waiting for players to join
- print("Waiting for other player to join");
- // inform user who just joined
- var message = Messages.SimpleMessage(vars[0], Messages.MessageBank.get("wait other player"), []);
- Messages.sendMessage(message);
- }
- };
-
- Events.onMessageReceive = function(vars) {
- // get message
- var message = vars[0];
- // check for various functions
- if (mrStage === 1) {
- // reply to who is x and y
- replyWhoXY(message);
- } else if (mrStage === 2 && message.getMessage() === Messages.MessageBank.get("make move") && message.getUser() === whosGo) {
- // telling where player will move
- makeMove(message);
- }
- };
-
- Events.onCommand = function(vars) {
- // print understood
- var command = vars[0];
- print(command.getCommand());
- };