vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Author: Jacob Bowers (Thronk on Mal'Ganis server)
]]
MinesweeperOptions = {};
local CS_BLANK = 0;
local CS_QUESTION = 1;
local CS_FLAGGED = 2;
local CS_CLEARED = 3;
local CS_MINE = 4;
local NUM_SQUARES = 81;
local NUM_MINES = 10;
local GameLost = 0;
local NumUncovered = 0;
local CellState = {state = 0, bMined = 0, num = 0};
function Minesweeper_OnLoad()
this:RegisterEvent("VARIABLES_LOADED");
SlashCmdList["MINESWEEPER"] = Minesweeper_SlashHandler;
SLASH_MINESWEEPER1 = "/minesweeper";
MS_CreateMatrix();
end
function Minesweeper_OnEvent(event)
if( event == "VARIABLES_LOADED") then
end
end
function MS_Test1()
PlaySoundFile("Sound\\Doodad\\G_Mortar.wav");
end
function MS_CreateMatrix()
local sent = 0;
local cnt = 0;
local val = 0;
GameLost = 0;
NumUncovered = 0;
for i=1,NUM_SQUARES do
CellState[i] = {state = 0, bMined = 0, num = 0};
getglobal("MSButton"..i.."TextureOverlay"):SetTexture("");
if(random() > 0.5) then
getglobal("MSButton"..i.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonPlainv3");
else
getglobal("MSButton"..i.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonPlainv3_2");
end
getglobal("MSButton"..i):SetText("");
end
while (sent == 0) do
val = floor(random()*NUM_SQUARES);
if ( val == 0 ) then
val = 1;
end
if ( CellState[val].bMined == 0 ) then
CellState[val].bMined = 1;
MS_UpdateCellNumbers(val);
cnt = cnt + 1;
end
if ( cnt >= NUM_MINES ) then
sent = 1;
end
end
end
function MS_UpdateCellNumbers(cellnum)
if ( MS_CheckIsInLeftmostColumn(cellnum) == nil) then
if ( cellnum - 10 > 0 ) then
CellState[cellnum-10].num = CellState[cellnum-10].num + 1;
end
end
if ( cellnum - 9 > 0 ) then
CellState[cellnum-9].num = CellState[cellnum-9].num + 1;
end
if ( MS_CheckIsInRightmostColumn(cellnum) == nil) then
if ( cellnum - 8 > 0 ) then
CellState[cellnum-8].num = CellState[cellnum-8].num + 1;
end
end
if ( MS_CheckIsInLeftmostColumn(cellnum) == nil) then
if ( cellnum - 1 > 0 ) then
CellState[cellnum-1].num = CellState[cellnum-1].num + 1;
end
end
if ( MS_CheckIsInRightmostColumn(cellnum) == nil) then
if ( cellnum + 1 <= NUM_SQUARES ) then
CellState[cellnum+1].num = CellState[cellnum+1].num + 1;
end
end
if ( MS_CheckIsInRightmostColumn(cellnum) == nil ) then
if ( cellnum + 10 <= NUM_SQUARES ) then
CellState[cellnum+10].num = CellState[cellnum+10].num + 1;
end
end
if ( cellnum + 9 <= NUM_SQUARES ) then
CellState[cellnum+9].num = CellState[cellnum+9].num + 1;
end
if ( MS_CheckIsInLeftmostColumn(cellnum) == nil) then
if ( cellnum + 8 <= NUM_SQUARES ) then
CellState[cellnum+8].num = CellState[cellnum+8].num + 1;
end
end
end
function MS_CheckIsInLeftmostColumn(cellnum)
if( cellnum == 1 or cellnum == 10 or cellnum == 19 or cellnum == 28 or cellnum == 37 or cellnum == 46 or cellnum == 55 or cellnum == 64 or cellnum == 73 ) then
return 1;
else
return nil;
end
end
function MS_CheckIsInRightmostColumn(cellnum)
if( cellnum == 9 or cellnum == 18 or cellnum == 27 or cellnum == 36 or cellnum == 45 or cellnum == 54 or cellnum == 63 or cellnum == 72 or cellnum == 81 ) then
return 1;
else
return nil;
end
end
function MS_CheckIsInBottommostRow(cellnum)
if( cellnum >= 72 ) then
return 1;
else
return nil;
end
end
function MS_CheckIsInTopmostRow(cellnum)
if( cellnum <= 9 ) then
return 1;
else
return nil;
end
end
function MS_UncoverMatrix()
local i;
GameLost = 1;
for i=1,NUM_SQUARES do
if ( CellState[i].bMined == 0 ) then
getglobal("MSButton"..i.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
else
if ( CellState[i].state ~= CS_MINE ) then
getglobal("MSButton"..i.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearMinev2");
else
getglobal("MSButton"..i.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonMineHitv2");
end
end
end
for i=1,NUM_SQUARES do
if ( CellState[i].num > 0 and CellState[i].bMined == 0) then
--getglobal("MSButton"..i):SetText(CellState[i].num);
MS_SetNumColor(i);
else
getglobal("MSButton"..i):SetText("");
end
end
end
function MS_RecursiveClear(cellnum)
if (cellnum < 1 or cellnum > 81 ) then
return;
end
if ( CellState[cellnum].num == 0 and CellState[cellnum].state ~= CS_CLEARED and CellState[cellnum].bMined ~= 1) then
getglobal("MSButton"..cellnum.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum].state = CS_CLEARED;
NumUncovered = NumUncovered + 1;
getglobal("MSButton"..cellnum.."TextureOverlay"):SetTexture("");
else
return;
end
if ( MS_CheckIsInLeftmostColumn(cellnum) == nil) then
if ( cellnum - 10 > 0 ) then
if ( CellState[cellnum-10].num == 0 ) then
MS_RecursiveClear(cellnum-10);
elseif ( CellState[cellnum-10].num ~= 0 ) then
getglobal("MSButton"..(cellnum-10).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum-10].state = CS_CLEARED;
MS_SetNumColor(cellnum-10);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum-10).."TextureOverlay"):SetTexture("");
end
end
end
if ( cellnum - 9 > 0 ) then
if ( CellState[cellnum-9].num == 0 ) then
MS_RecursiveClear(cellnum-9);
elseif ( CellState[cellnum-9].num ~= 0 ) then
getglobal("MSButton"..(cellnum-9).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum-9].state = CS_CLEARED;
MS_SetNumColor(cellnum-9);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum-9).."TextureOverlay"):SetTexture("");
end
end
if ( MS_CheckIsInRightmostColumn(cellnum) == nil) then
if ( cellnum - 8 > 0 ) then
if ( CellState[cellnum-8].num == 0 ) then
MS_RecursiveClear(cellnum-8);
elseif ( CellState[cellnum-8].num ~= 0 ) then
getglobal("MSButton"..(cellnum-8).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum-8].state = CS_CLEARED;
MS_SetNumColor(cellnum-8);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum-8).."TextureOverlay"):SetTexture("");
end
end
end
if ( MS_CheckIsInLeftmostColumn(cellnum) == nil) then
if ( cellnum - 1 > 0 ) then
if ( CellState[cellnum-1].num == 0 ) then
MS_RecursiveClear(cellnum-1);
elseif ( CellState[cellnum-1].num ~= 0 ) then
getglobal("MSButton"..(cellnum-1).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum-1].state = CS_CLEARED;
MS_SetNumColor(cellnum-1);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum-1).."TextureOverlay"):SetTexture("");
end
end
end
if ( MS_CheckIsInRightmostColumn(cellnum) == nil) then
if ( cellnum + 1 <= NUM_SQUARES ) then
if ( CellState[cellnum+1].num == 0 ) then
MS_RecursiveClear(cellnum+1);
elseif ( CellState[cellnum+1].num ~= 0 ) then
getglobal("MSButton"..(cellnum+1).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum+1].state = CS_CLEARED;
MS_SetNumColor(cellnum+1);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum+1).."TextureOverlay"):SetTexture("");
end
end
end
if ( MS_CheckIsInRightmostColumn(cellnum) == nil ) then
if ( cellnum + 10 <= NUM_SQUARES ) then
if ( CellState[cellnum+10].num == 0 ) then
MS_RecursiveClear(cellnum+10);
elseif ( CellState[cellnum+10].num ~= 0 ) then
getglobal("MSButton"..(cellnum+10).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum+10].state = CS_CLEARED;
MS_SetNumColor(cellnum+10);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum+10).."TextureOverlay"):SetTexture("");
end
end
end
if ( cellnum + 9 <= NUM_SQUARES ) then
if ( CellState[cellnum+9].num == 0 ) then
MS_RecursiveClear(cellnum+9);
elseif ( CellState[cellnum+9].num ~= 0 ) then
getglobal("MSButton"..(cellnum+9).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum+9].state = CS_CLEARED;
MS_SetNumColor(cellnum+9);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum+9).."TextureOverlay"):SetTexture("");
end
end
if ( MS_CheckIsInLeftmostColumn(cellnum) == nil) then
if ( cellnum + 8 <= NUM_SQUARES ) then
if ( CellState[cellnum+8].num == 0 ) then
MS_RecursiveClear(cellnum+8);
elseif ( CellState[cellnum+8].num ~= 0 ) then
getglobal("MSButton"..(cellnum+8).."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
CellState[cellnum+8].state = CS_CLEARED;
MS_SetNumColor(cellnum+8);
--NumUncovered = NumUncovered + 1;
getglobal("MSButton"..(cellnum+8).."TextureOverlay"):SetTexture("");
end
end
end
end
function MS_SetNumColor(id)
getglobal("MSButton"..id):SetText(CellState[id].num);
if ( CellState[id].num == 1 ) then
getglobal("MSButton"..id):SetTextColor(0, 0, 1);
elseif ( CellState[id].num == 2 ) then
getglobal("MSButton"..id):SetTextColor(0, 1, 0);
else
getglobal("MSButton"..id):SetTextColor(1, 0, 0);
end
end
function MS_OnClick(id)
if ( GameLost == 1) then
return;
end
if ( IsAltKeyDown() ) then
DEFAULT_CHAT_FRAME:AddMessage(id);
return;
end
if ( IsControlKeyDown() and CellState[id].state ~= CS_CLEARED and CellState[id].state ~= CS_MINE ) then
if ( CellState[id].state ~= CS_FLAGGED ) then
getglobal("MSButton"..id.."TextureOverlay"):SetTexture("Interface\\AddOns\\Minesweeper\\Flag");
CellState[id].state = CS_FLAGGED;
else
getglobal("MSButton"..id.."TextureOverlay"):SetTexture("");
CellState[id].state = MS_BLANK;
end
return;
end
if ( IsShiftKeyDown() and CellState[id].state ~= CS_CLEARED and CellState[id].state ~= CS_MINE ) then
if( CellState[id].state ~= CS_QUESTION ) then
getglobal("MSButton"..id.."TextureOverlay"):SetTexture("Interface\\AddOns\\Minesweeper\\Question");
CellState[id].state = CS_QUESTION;
else
getglobal("MSButton"..id.."TextureOverlay"):SetTexture("");
CellState[id].state = MS_BLANK;
end
return;
end
if (CellState[id].state ~= CS_CLEARED and CellState[id].state ~= CS_QUESTION and CellState[id].state ~= CS_FLAGGED) then
if( CellState[id].bMined ~= 1 ) then
getglobal("MSButton"..id.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearv2");
--CellState[id].state = CS_CLEARED;
if ( CellState[id].num > 0) then
MS_SetNumColor(id);
CellState[id].state = CS_CLEARED;
NumUncovered = NumUncovered + 1;
tmpval = random();
if(tmpval < 0.25) then
PlaySoundFile("Sound\\Spells\\TradeSkills\\MiningHitA.wav");
elseif(tmpval >= 0.25 and tmpval < 0.5) then
PlaySoundFile("Sound\\Spells\\TradeSkills\\MiningHitA.wav");
elseif(tmpval >= 0.5 and tmpval < 0.75) then
PlaySoundFile("Sound\\Spells\\TradeSkills\\MiningHitA.wav");
elseif(tmpval >= 0.75) then
PlaySoundFile("Sound\\Spells\\TradeSkills\\MiningHitA.wav");
end
else
getglobal("MSButton"..id):SetText("");
MS_RecursiveClear(id);
PlaySoundFile("Sound\\interface\\OrcExploration.wav");
end
getglobal("MSButton"..id.."TextureOverlay"):SetTexture("");
else
getglobal("MSButton"..id.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearMinev2");
CellState[id].state = CS_MINE;
MS_UncoverMatrix();
--PlaySoundFile("Sound\\Spells\\DynamiteExplode.wav");
if(random() < 0.5) then
PlaySoundFile("Sound\\Creature\\GoblinMaleZanyNPC\\GoblinMaleZanyNPCPissed03.wav");
else
PlaySoundFile("Sound\\Creature\\GoblinMaleZanyNPC\\GoblinMaleZanyNPCPissed04.wav");
end
DEFAULT_CHAT_FRAME:AddMessage("YOU LOSE AT GOBLIN MINESWEEPER! TRY AGAIN!");
end
end
Minesweeper_CheckWin();
end
function Minesweeper_ShowMines()
for i=1,NUM_SQUARES do
if ( CellState[i].bMined == 1 ) then
getglobal("MSButton"..i.."Texture"):SetTexture("Interface\\AddOns\\Minesweeper\\ButtonClearMinev2");
end
end
end
function Minesweeper_CheckWin()
local NumCleared = 0;
for i=1,NUM_SQUARES do
if ( CellState[i].state == CS_CLEARED ) then
NumCleared = NumCleared + 1;
end
end
if(NumCleared == NUM_SQUARES - NUM_MINES) then
GameLost = 1;
--PlaySoundFile("Sound\\interface\\LevelUp.wav");
DEFAULT_CHAT_FRAME:AddMessage("YOU WIN GOBLIN MINESWEEPER!");
if(random() < 0.5) then
PlaySoundFile("Sound\\Creature\\GoblinMaleZanyNPC\\GoblinMaleZanyNPCFarewell02.wav");
else
PlaySoundFile("Sound\\Creature\\GoblinMaleZanyNPC\\GoblinMaleZanyNPCFarewell04.wav");
end
else
--DEFAULT_CHAT_FRAME:AddMessage("DEBUG: "..NumCleared);
end
end
function Minesweeper_SlashHandler(cmd)
local args = {};
local counter = 0;
local i, w;
local status;
local TmpStr = {};
TmpStr = "";
cmd = string.lower(cmd);
for w in string.gfind(cmd, "%w+") do
counter = counter + 1;
args[counter] = w;
end
if (args[1] == nil) then
MinesweeperFrame:Show();
end
end