<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE muclient> <muclient> <plugin name="TicTacToe" author="Soludra" id="03829336f30e9f2dcace86e9" language="Lua" purpose="Play a game of Tic Tac Toe!" date_written="2009-11-22 07:46:00" requires="4.43" version="1.0" /> <!-- Triggers --> <triggers> </triggers> <!-- Aliases --> <aliases> <alias match="^ttt=(.*)$" enabled="y" regexp="y" send_to="12" ignore_case="y" sequence="100" > <send>print(%1)</send> </alias> </aliases> <!-- Script --> <script> <![CDATA[ require('tprint') local CharacterGrid = require("MWidget.CharacterGrid") -- Defines the default grid font. local TICTACTOE_FONT = "Lucida Console" local players = { [1] = { piece = 'X', color = 0x00FF00, lastmove = nil, }, [2] = { piece = 'O', color = 0x0000FF, lastmove = nil, }, } local current_player = 1 -- cell we're hovering over now local hovered = nil local CheckRow = function(cell1, cell2, cell3) if cell1.char ~= ' ' and cell1.char == cell2.char and cell2.char == cell3.char then cell1.forecolor, cell2.forecolor, cell3.forecolor = 0xFF0000, 0xFF0000, 0xFF0000 return true else return false end end local CheckWin = function() local done = CheckRow(grid:Cell(1, 1), grid:Cell(1, 2), grid:Cell(1, 3)) or CheckRow(grid:Cell(2, 1), grid:Cell(2, 2), grid:Cell(2, 3)) or CheckRow(grid:Cell(3, 1), grid:Cell(3, 2), grid:Cell(3, 3)) or CheckRow(grid:Cell(1, 1), grid:Cell(2, 1), grid:Cell(3, 1)) or CheckRow(grid:Cell(1, 2), grid:Cell(2, 2), grid:Cell(3, 2)) or CheckRow(grid:Cell(1, 3), grid:Cell(2, 3), grid:Cell(3, 3)) or CheckRow(grid:Cell(1, 1), grid:Cell(2, 2), grid:Cell(3, 3)) or CheckRow(grid:Cell(3, 1), grid:Cell(2, 2), grid:Cell(1, 3)) if done then for y = 1,3 do for x = 1,3 do local cell = grid:Cell(x, y) cell.hotspot.mouseup = nil cell.hotspot.mouseover = nil cell.hotspot.cancelmouseover = nil end end end return done end local CellClick = function(win, flags, id) local cell = win:HotspotToCell(id) if cell.char ~= " " then return end local player = players[current_player] if player.lastmove then player.lastmove.backcolor = 0xFFFFFF end cell.char = player.piece cell.backcolor = player.color CheckWin() player.lastmove = cell current_player = (current_player%2) + 1 grid:Draw() end local CellFocus = function(win, flags, id) local cell = win:HotspotToCell(id) if cell.char ~= " " then return end cell.forecolor = players[current_player].color cell.char = players[current_player].piece hovered = id grid:Draw() end local CellBlur = function(win, flags, id) if id ~= hovered then return end local cell = win:HotspotToCell(hovered) cell.forecolor = 0x000000 cell.char = ' ' hovered = nil grid:Draw() end local Reset = function() current_player = 1 grid:ResetGrid() for y = 1, 3 do for x = 1, 3 do local cell = grid:Cell(x, y) cell.forecolor = 0x000000 cell.hotspot.mouseup = CellClick cell.hotspot.mouseover = CellFocus cell.hotspot.cancelmouseover = CellBlur end end grid:Draw() end OnPluginInstall = function() grid = CharacterGrid.new(3, 3) grid:Anchor(12) grid:Font(TICTACTOE_FONT, 15) grid.backcolor = 0xFFFFFF Reset() grid:Show() end OnPluginClose = function() grid:Destroy() end OnPluginEnable = OnPluginInstall OnPluginDisable = OnPluginClose DoReset = Reset ]]> </script> </muclient>