vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        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