概要:
機能:
・ボタンを押すことで役職の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