サンプル:れじすたんす

概要:

機能:

・ボタンを押すことで役職のON OFF

・マーリンの人のチャット欄に通知

 

 

--[[ Colors ]]

colorBlue = {0, 0.5, 1}
colorRed = {1, 0, 0}
colorGreen = {0, 1, 0.2}

//文字を表示する際の色を設定。

startButtonGuid = '125037'
characterSelectionButtons = {}

badTokensGuid = 'e3888b'
goodTokensGuid = 'a1fcd1'

boardGuids = {
    {5, '02ed0f'},
    {6, '54ab9e'},
    {7, 'a7edc5'},
    {8, 'b69786'},
    {9, '38766d'},
    {10, '28c88e'}
}

specialCards = {'ab59a9','1c9320','9d1061','489935','c463d7','9eed4f'}

characterDeckGuid = '2d286e'

percivalButtonGuid = '244cbc'
addPercival = false;
percivalPlayer = nil;

morganaButtonGuid = '4aa48a'
addMorgana = false;
morganaPlayer = nil;

mordredButtonGuid = '3686e6'
addMordred = false;
mordredPlayer = nil;

oberonButtonGuid = 'c11b79'
addOberon = false;
oberonPlayer = nil;

merlinPlayer = nil;
assassinPlayer = nil;

momPlayers = {};
lsaPlayers = {}

--[[ Player count and good power map ]]
powerMap = {}
powerMap[5] = 3
powerMap[6] = 4
powerMap[7] = 4
powerMap[8] = 5
powerMap[9] = 6
powerMap[10] = 6

momCards = {'b42a59','89eb2f','7f5506'}
lsaCards = {'caaace','fac62f','f3dee0','1d7b72','bac549'}

leaderTokenGuid = 'c0842a'
voteTrackerGuid = '4d63d2'

characterCardZoneGuid = 'f99479'
failCardZoneGuid = '2f65de'
successCardZoneGuid = 'fd1f52'
approveCardZoneGuid = '3501e2'
rejectCardZoneGuid = '6682dd'

teamApproveMatGuid = approveCardZoneGuid
teamRejectMatGuid = rejectCardZoneGuid

resetTeamVotesZoneGuid = '64d7a6'
dealTeamVotesZoneGuid = '2cbb54'
resetMissionVotesZoneGuid = '4d71b8'

missionFailMatGuid = failCardZoneGuid
missionSuccessMatGuid = successCardZoneGuid

wholeTableZoneGuid = 'a278b9'

function onload()
    setNotes('Developed by [b]H1tm4n[/b]')
    math.randomseed( os.time() )
    wholeTableZone = getObjectFromGUID(wholeTableZoneGuid)
    characterCardZone = getObjectFromGUID(characterCardZoneGuid)
    teamRejectMat = getObjectFromGUID(teamRejectMatGuid)
    teamApproveMat = getObjectFromGUID(teamApproveMatGuid)
    missionFailMat = getObjectFromGUID(missionFailMatGuid)
    missionSuccessMat = getObjectFromGUID(missionSuccessMatGuid)
    startButton()
    specialCharacterButtons()
end

function startButton()
    startButton = getObjectFromGUID(startButtonGuid)
    local button = {}
    button.click_function = 'startGame'
    button.label = 'Start game'
    button.function_owner = nil
    button.position = {0, 0.2, 0}
    button.rotation = {0, 180, 0}
    button.width = 1400
    button.height = 500
    button.font_size = 250
    startButton.createButton(button)
    startButton.lock()
end

function specialCharacterButtons()
    percivalButton = getObjectFromGUID(percivalButtonGuid)
    local button = {}
    button.click_function = 'togglePercival'
    button.label = 'Percival'
    button.function_owner = nil
    button.position = {0, 0.2, 0}
    button.rotation = {0, 180, 0}
    button.width = 1400
    button.height = 500
    button.font_size = 250
    percivalButton.createButton(button)
    percivalButton.lock()

    morganaButton = getObjectFromGUID(morganaButtonGuid)
    button.click_function = 'toggleMorgana'
    button.label = 'Morgana'
    morganaButton.createButton(button)
    morganaButton.lock()

    mordredButton = getObjectFromGUID(mordredButtonGuid)
    button.click_function = 'toggleMordred'
    button.label = 'Mordred'
    mordredButton.createButton(button)
    mordredButton.lock()

    oberonButton = getObjectFromGUID(oberonButtonGuid)
    button.click_function = 'toggleOberon'
    button.label = 'Oberon'
    oberonButton.createButton(button)
    oberonButton.lock()
end

function togglePercival()
    if addPercival then
        addPercival = false
        broadcastToAll('Percival will not be played in this game.', colorBlue)
    else
        if getSelectedCharacterCount() >= getPlayerCount() then
            broadcastToAll('Need more players.', colorRed)
        else
            if getSelectedGoodCharacterCount() >= powerMap[getPlayerCount()] then
                broadcastToAll('Good character limit reached.', colorRed)
            else
                addPercival = true
                broadcastToAll('Percival will be played in this game. Make sure to add either Morgana or Mordred, when Percival is selected.', colorBlue)
            end
        end
    end

end

function toggleMorgana()
    if addMorgana then
        addMorgana = false
        broadcastToAll('Morgana will not be played in this game.', colorRed)
    else
        if getSelectedCharacterCount() >= getPlayerCount() then
            broadcastToAll('Need more players.', colorRed)
        else
            if getSelectedBadCharacterCount() >= getPlayerCount() - powerMap[getPlayerCount()] then
                broadcastToAll('Bad character limit reached.', colorRed)
            else
                addMorgana = true
                broadcastToAll('Morgana will be played in this game.', colorRed)
            end
        end
    end
end

function toggleMordred()
    if addMordred then
        addMordred = false
        broadcastToAll('Mordred will not be played in this game.', colorRed)
    else
        if getSelectedCharacterCount() >= getPlayerCount() then
            broadcastToAll('Need more players.', colorRed)
        else
            if getSelectedBadCharacterCount() >= getPlayerCount() - powerMap[getPlayerCount()] then
                broadcastToAll('Bad character limit reached.', colorRed)
            else
                addMordred = true
                broadcastToAll('Mordred will be played in this game.', colorRed)
            end
        end
    end
end

function toggleOberon()
    if addOberon then
        addOberon = false
        broadcastToAll('Oberon will not be played in this game.', colorRed)
    else
        if getSelectedCharacterCount() >= getPlayerCount() then
            broadcastToAll('Need more players.', colorRed)
        else
            if getSelectedBadCharacterCount() >= getPlayerCount() - powerMap[getPlayerCount()] then
                broadcastToAll('Bad character limit reached.', colorRed)
            else
                addOberon = true
                broadcastToAll('Oberon will be played in this game.', colorRed)
            end
        end
    end
end

function getPlayerCount()
    players = getSeatedPlayers()
    num_players = 0
    for i, j in ipairs(players) do
        num_players = num_players + 1
    end

    --num_players = 5

    return num_players
end

function getSelectedGoodCharacterCount()
    local selectedGoodCharacters = 1;

    if addPercival then
        selectedGoodCharacters = selectedGoodCharacters + 1
    end

    return selectedGoodCharacters
end

function getSelectedBadCharacterCount()
    local selectedBadCharacters = 1;

    if addMorgana then
        selectedBadCharacters = selectedBadCharacters + 1
    end

    if addMordred then
        selectedBadCharacters = selectedBadCharacters + 1
    end

    if addOberon then
        selectedBadCharacters = selectedBadCharacters + 1
    end

    return selectedBadCharacters
end

function getSelectedCharacterCount()
    return getSelectedGoodCharacterCount() + getSelectedBadCharacterCount()
end

function startGame (GO)
    if getPlayerCount() < 5 then
        broadcastToAll('Need more players.', colorRed)
    else
        broadcastToAll('Starting ' .. getPlayerCount() .. ' player game.', colorGreen)

        resetTeamVotesButton = getObjectFromGUID(resetTeamVotesZoneGuid)
        local button = {}
        button.click_function = 'resetTeamVotes'
        button.label = 'Reset Team Vote Cards'
        button.function_owner = nil
        button.position = {0, -1.5, 0}
        button.rotation = {0, 180, 0}
        button.width = 3000
        button.height = 500
        button.font_size = 250
        resetTeamVotesButton.createButton(button)

        dealTeamVotesButton = getObjectFromGUID(dealTeamVotesZoneGuid)
        button.click_function = 'dealTeamVotes'
        button.label = 'Deal Team Vote Cards'
        dealTeamVotesButton.createButton(button)

        resetTeamVotesButton = getObjectFromGUID(resetMissionVotesZoneGuid)
        button.click_function = 'resetMissionVotes'
        button.label = 'Reset Mission Vote Cards'
        resetTeamVotesButton.createButton(button)

        setup(getPlayerCount())
    end
end

function resetTeamVotes()
    wholeTableObjects = wholeTableZone.getObjects()
    teamApprovePosition = teamApproveMat.getPosition()
    teamRejectPosition = teamRejectMat.getPosition()

    for i, j in ipairs(wholeTableObjects) do
        if j.getDescription() == 'approve' then
            local tempCard = getObjectFromGUID(j.guid)
            tempCard.setRotation({0,180,0})
            tempCard.setPosition({teamApprovePosition['x'],2,teamApprovePosition['z']})
        elseif j.getDescription() == 'reject' then
            local tempCard = getObjectFromGUID(j.guid)
            tempCard.setRotation({0,180,0})
            tempCard.setPosition({teamRejectPosition['x'],2,teamRejectPosition['z']})
        end
    end
end

function dealTeamVotes()
    approveCardZone = getObjectFromGUID(approveCardZoneGuid)
    local approveCardZoneItems = approveCardZone.getObjects()
    rejectCardZone = getObjectFromGUID(rejectCardZoneGuid)
    local rejectCardZoneItems = rejectCardZone.getObjects()

    for i, j in ipairs(players) do
        local tempCard = approveCardZoneItems[1].dealToColorWithOffset({0, 0, 0}, false, j)
        tempCard = rejectCardZoneItems[1].dealToColorWithOffset({0, 0, 0}, false, j)
    end
end

function resetMissionVotes()
    wholeTableObjects = wholeTableZone.getObjects()
    missionFailPosition = missionFailMat.getPosition()
    missionSuccessPosition = missionSuccessMat.getPosition()

    for i, j in ipairs(wholeTableObjects) do
        if j.getDescription() == 'success' then
            local tempCard = getObjectFromGUID(j.guid)
            tempCard.setRotation({0,0,0})
            tempCard.setPosition({missionSuccessPosition['x'],2,missionSuccessPosition['z']})
        elseif j.getDescription() == 'fail' then
            local tempCard = getObjectFromGUID(j.guid)
            tempCard.setRotation({0,0,0})
            tempCard.setPosition({missionFailPosition['x'],2,missionFailPosition['z']})
        end
    end
end

function shuffleTable( t )
    local rand = math.random
    assert( t, "shuffleTable() expected a table, got nil" )
    local iterations = #t
    local j

    for i = iterations, 2, -1 do
        j = rand(i)
        t[i], t[j] = t[j], t[i]
    end

    return t
end


function setup(playerCount)

    startButton.destruct()
    percivalButton.destruct()
    morganaButton.destruct()
    mordredButton.destruct()
    oberonButton.destruct()


    for i, v in ipairs(boardGuids) do
      local tempBoard = {}
      if v[1] != playerCount then
          tempBoard = getObjectFromGUID(v[2])
          tempBoard.destruct()
      else
          tempBoard = getObjectFromGUID(v[2])
          tempBoard.setPosition({0,1,0})
          tempBoard.lock()
      end
    end

    characterDeck = getObjectFromGUID(characterDeckGuid)

    local totalMomsNeeded = playerCount - getSelectedBadCharacterCount() - powerMap[playerCount]
    local totalLsasNeeded = playerCount - getSelectedCharacterCount() - totalMomsNeeded

    totalLsaPlayerCount = powerMap[playerCount]
    totalMomPlayerCount = playerCount - totalLsaPlayerCount

    broadcastToAll('Total Loyal servants of Arthur: ' .. totalLsaPlayerCount, colorBlue)
    broadcastToAll('Total minions of Mordred: ' .. totalMomPlayerCount, colorRed)

    characterDeck = getObjectFromGUID('5962d7')
    characterDeckCards = characterDeck.getObjects()
    cardsToRemove = {}

    for i, j in ipairs(characterDeckCards) do
        if not addPercival then
            if j.guid == specialCards[3] then
                table.insert(cardsToRemove, j.guid)
            end
        end

        if not addMorgana then
            if j.guid == specialCards[4] then
                table.insert(cardsToRemove, j.guid)
            end
        end

        if not addMordred then
            if j.guid == specialCards[5] then
                table.insert(cardsToRemove, j.guid)
            end
        end

        if not addOberon then
            if j.guid == specialCards[6] then
                table.insert(cardsToRemove, j.guid)
            end
        end
    end

    for i = totalMomsNeeded + 1, 3 do
        table.insert(cardsToRemove, momCards[i])
    end

    for i = totalLsasNeeded + 1, 5 do
        table.insert(cardsToRemove, lsaCards[i])
    end

    for i, j in ipairs(cardsToRemove) do
        local params = {}
        params.guid = j
        local tempCard = {}
        tempCard = characterDeck.takeObject(params)
        tempCard.destruct()
    end

    voteTracker = getObjectFromGUID(voteTrackerGuid)
    voteTracker.setPosition({-5.1,5,-3.3})

    characterDeck.shuffle()

    --players = {'White','Brown','Red','Orange','Yellow','Green', 'Teal', 'Blue', 'Purple', 'Pink'}

    approveCardZone = getObjectFromGUID(approveCardZoneGuid)
    local approveCardZoneItems = approveCardZone.getObjects()
    rejectCardZone = getObjectFromGUID(rejectCardZoneGuid)
    local rejectCardZoneItems = rejectCardZone.getObjects()

    -- Assign roles to players and deal role cards
    for i, j in ipairs(players) do
        playerHand = getPlayerHandPositionAndRotation(j)
        tempCard = characterDeck.takeObject({index = 1})
        if tempCard.getDescription() == 'Loyal Servant of Arthur' then
            table.insert(lsaPlayers, j)
        elseif tempCard.getDescription() == 'Minion of Mordred' then
            table.insert(momPlayers, j)
        elseif tempCard.getDescription() == 'Merlin' then
            table.insert(lsaPlayers, j)
           merlinPlayer = j
        elseif tempCard.getDescription() == 'Percival' then
            table.insert(lsaPlayers, j)
            percivalPlayer = j
        elseif tempCard.getDescription() == 'Assassin' then
            table.insert(momPlayers, j)
            assassinPlayer = j
        elseif tempCard.getDescription() == 'Morgana' then
            table.insert(momPlayers, j)
            morganaPlayer = j
        elseif tempCard.getDescription() == 'Mordred' then
            table.insert(momPlayers, j)
            mordredPlayer = j
        elseif tempCard.getDescription() == 'Oberon' then
            table.insert(momPlayers, j)
            oberonPlayer = j
        end
        --broadcastToAll(j .. ' is ' .. tempCard.getDescription(), colorRed)
        tempCard.setPosition({playerHand['pos_x'], playerHand['pos_y'], playerHand['pos_z']})

        -- Deal voting cards
        --tempCard = approveCardDeck.takeObject({index = 1})
        --tempCard.setPosition({playerHand['pos_x'], playerHand['pos_y'], playerHand['pos_z']})
    end

    for i, j in ipairs(players) do
        local tempCard = approveCardZoneItems[1].dealToColorWithOffset({0, 0, 0}, false, j)
        tempCard = rejectCardZoneItems[1].dealToColorWithOffset({0, 0, 0}, false, j)
    end

    -- Announce player roles to appropriate players
    for i, j in ipairs(lsaPlayers) do
        if j ==merlinPlayer then
            --broadcastToColor(merlinPlayer .. ', you are Merlin!', 'White', colorBlue)
            broadcastToColor('You are Merlin!', merlinPlayer, colorBlue)
        elseif j == percivalPlayer then
            --broadcastToColor(percivalPlayer .. ', you are Percival!', 'White', colorBlue)
            broadcastToColor('You are Percival!', percivalPlayer, colorBlue)
            if not morganaPlayer then
                --broadcastToColor(percivalPlayer .. ', ' .. merlinPlayer .. ' is Merlin!', 'White', colorBlue)
                broadcastToColor(merlinPlayer .. ' is Merlin!', percivalPlayer, colorBlue)
            else
                local percivalMerlinPlayers = {merlinPlayer, morganaPlayer}
                local shuffledpercivalMerlinPlayers = shuffleTable(percivalMerlinPlayers)

                --broadcastToColor(percivalPlayer .. ', either ' .. shuffledpercivalMerlinPlayers[1] .. ' or ' .. shuffledpercivalMerlinPlayers[2] .. ' is Merlin!', 'White', colorBlue)
                broadcastToColor('Either ' .. shuffledpercivalMerlinPlayers[1] .. ' or ' .. shuffledpercivalMerlinPlayers[2] .. ' is Merlin!', percivalPlayer, colorBlue)
            end
        else
            broadcastToColor('You are a loyal servant of Arthur!', j, colorBlue)
        end
    end

    for i, j in ipairs(momPlayers) do
        if j == assassinPlayer then
            --broadcastToColor(j .. ', you are the assassin!', 'White', colorRed)
            broadcastToColor('You are the assassin!', j, colorRed)
        elseif j == oberonPlayer then
            --broadcastToColor(j .. ', you are Oberon!', 'White', colorRed)
            broadcastToColor('You are Oberon!', j, colorRed)
        elseif j == morganaPlayer then
            --broadcastToColor(j .. ', you are Morgana!', 'White', colorRed)
            broadcastToColor('You are Morgana!', j, colorRed)
        elseif j == mordredPlayer then
            --broadcastToColor(j .. ', you are Mordred!', 'White', colorRed)
            broadcastToColor('You are Mordred!', j, colorRed)
        else
            --broadcastToColor(j .. ', you are a minion of Mordred!', 'White', colorRed)
            broadcastToColor('You are a minion of Mordred!', j, colorRed)
        end

        if totalMomPlayerCount > 1 then
            for i2, j2 in ipairs(momPlayers) do
                if (j != j2 and j2 != oberonPlayer and j != oberonPlayer) then
                    --broadcastToColor(j2 .. ', ' .. j .. ' is also a minion of Mordred!', 'White', colorRed)
                    broadcastToColor(j .. ' is also a minion of Mordred!', j2, colorRed)
                end
            end
        end

        if j != mordredPlayer then
            --broadcastToColor(merlinPlayer .. ', ' .. j .. ' is a minion of Mordred!', 'White', colorBlue)
            broadcastToColor(j .. ' is a minion of Mordred!', merlinPlayer, colorRed)
        end
    end
end

function update ()

end

タグ:

+ タグ編集
  • タグ:
最終更新:2019年10月07日 22:36