Untitled
unknown
plain_text
a year ago
41 kB
9
Indexable
-- Initialization function on game load
function onLoad()
createCivilizationButtons()
createStartButton()
createRandomCivilizationButton()
-- checkObjectPosition("dda33b")
end
function checkObjectPosition(guid)
local obj = getObjectFromGUID(guid)
if obj then
local position = obj.getPosition()
broadcastToAll("Position de l'objet avec GUID " .. guid .. ": x=" .. position.x .. ", y=" .. position.y .. ", z=" .. position.z, {1, 1, 1})
log("Position de l'objet avec GUID " .. guid .. ": x=" .. position.x .. ", y=" .. position.y .. ", z=" .. position.z)
else
broadcastToAll("Objet avec GUID " .. guid .. " non trouvé.", {1, 0, 0})
log("Objet avec GUID " .. guid .. " non trouvé.")
end
end
-- Define the 12 Civilizations, their Face A and Face B rulers with updated deck GUIDs
local civilizations = {
["ROYAUME DE FRANCE"] = {faceA = "Roi François Ier", faceB = "Roi Henri IV", civGUID = "878f6c", ship = "0d7664", deck = "51a678"},
["ROYAUME D'ANGLETERRE"] = {faceA = "Reine Elisabeth Ire", faceB = "Roi Henri VIII", civGUID = "0ca55d", ship = "1bc684", deck = "48cee3"},
["ROYAUME D'ÉCOSSE"] = {faceA = "Reine Marie Stuart", faceB = "Roi Jacques VI", civGUID = "81bf69", ship = "312a93", deck = "617c85"},
["ROYAUME DE PORTUGAL"] = {faceA = "Roi Manuel Ier", faceB = "Roi Jean III Le Pieux", civGUID = "d4f7e8", ship = "4b53ee", deck = "2ea990"},
["MONARCHIE ESPAGNOLE"] = {faceA = "Roi Philippe II", faceB = "Roi Ferdinand V Le Catholique", civGUID = "af2bac", ship = "2fcdcb", deck = "680f3d"},
["GRAND-DUCHÉ DE TOSCANE"] = {faceA = "Grand-duc Côme Ier de Toscane", faceB = "Grand-duc François Ier de Médicis", civGUID = "d3c468", ship = "81f996", deck = "427e57"},
["SAINT-EMPIRE"] = {faceA = "Empereur Charles Quint", faceB = "Empereur Ferdinand Ier", civGUID = "2f7beb", ship = "54d918", deck = "03c3bb"},
["TSARAT DE RUSSIE"] = {faceA = "Tsar Ivan IV le Terrible", faceB = "Tsar Fiodor Ier", civGUID = "1e5cd9", ship = "f9960d", deck = "404c94"},
["EMPIRE OTTOMAN"] = {faceA = "Sultan Soliman Ier le Magnifique", faceB = "Sultan Sélim II", civGUID = "96e604", ship = "026646", deck = "b067d9"},
["EMPIRE MOGHOL"] = {faceA = "Empereur Akbar le Grand", faceB = "Empereur Humayun", civGUID = "8a7afa", ship = "ae98eb", deck = "331364"},
["DYNASTIE MING"] = {faceA = "Empereur Jiajing", faceB = "Empereur Wanli", civGUID = "fd0891", ship = "2650b7", deck = "3f84a0"},
["SHOGUNAT DU NIPPON"] = {faceA = "Daimyo Oda Nobunaga", faceB = "Shogun Ashikaga Yoshiteru", civGUID = "687240", ship = "e21296", deck = "610e8c"}
}
-- Create buttons for civilization selection (Face A and B)
function createCivilizationButtons()
local civZones = {'de439d', '7f9575', '0aedbd', 'f366a6', '7da3cb', 'ccc956', 'fdff38', 'd5327c', '65c7ca', 'acae12', 'b5cd2d', '3563c9'}
for i, civZoneGUID in ipairs(civZones) do
local obj = getObjectFromGUID(civZoneGUID)
if obj then
obj.createButton({
click_function = "chooseFaceA",
function_owner = self,
label = "A",
position = {0.25, -0.5, 0.6},
rotation = {0, 180, 0},
width = 70,
height = 70,
font_size = 50,
color = {0.2, 0.6, 1},
font_color = {1, 1, 1}
})
obj.createButton({
click_function = "chooseFaceB",
function_owner = self,
label = "B",
position = {-0.25, -0.5, 0.6},
rotation = {0, 180, 0},
width = 70,
height = 70,
font_size = 50,
color = {1, 0.5, 0.2},
font_color = {1, 1, 1}
})
end
end
end
-- Create "Démarrer" and "Choisir aléatoirement" buttons
function createStartButton()
local buttonGUID = "c0c649"
local obj = getObjectFromGUID(buttonGUID)
if obj then
obj.createButton({
click_function = "startGame",
function_owner = self,
label = "Démarrer",
position = {0, -0.5, 0},
rotation = {0, 180, 0},
width = 750,
height = 350,
font_size = 50,
color = {1, 0, 0},
font_color = {1, 1, 1},
tooltip = "Cliquez pour démarrer la partie"
})
end
end
function createRandomCivilizationButton()
local buttonGUID = "c0c649"
local obj = getObjectFromGUID(buttonGUID)
if obj then
obj.createButton({
click_function = "chooseRandomCivilization",
function_owner = self,
label = "Choisir aléatoirement",
position = {0, -0.5, 1},
rotation = {0, 180, 0},
width = 750,
height = 350,
font_size = 50,
color = {1, 1, 1},
font_color = {0, 0, 0},
tooltip = "Cliquez pour choisir une civilisation aléatoire"
})
end
end
-- Handle selection of Face A for a specific civilization
function chooseFaceA(obj, player_color)
print("chooseFaceA triggered")
print("Object GUID:", obj.getGUID()) -- Verify if the obj is valid
print("Player color:", player_color) -- Verify the player's color
-- Call the test function to get the scripting zone GUID
local zoneGUID = testCivilizationZone(obj, player_color)
log("Scripting Zone GUID for Face A: " .. tostring(zoneGUID))
-- Assign the civilization after testing
assignCivilization(obj, "A", player_color)
end
-- Handle selection of Face B for a specific civilization
function chooseFaceB(obj, player_color)
print("chooseFaceB triggered")
print("Object GUID:", obj.getGUID())
print("Player color:", player_color)
-- Call the test function to get the scripting zone GUID
local zoneGUID = testCivilizationZone(obj, player_color)
log("Scripting Zone GUID for Face B: " .. tostring(zoneGUID))
-- Assign the civilization after testing
assignCivilization(obj, "B", player_color)
end
-- Randomly assign a civilization and face (A or B) when the "Choisir aléatoirement" button is clicked
function chooseRandomCivilization(obj, player_color)
local availableCivs = {}
-- Gather available civilizations
for civName, data in pairs(civilizations) do
local civCard = getObjectFromGUID(data.civGUID)
if civCard and civCard.getPosition().y < 5 then -- Check if civilization is already assigned
table.insert(availableCivs, civName)
end
end
-- Check if there are any available civilizations
if #availableCivs > 0 then
local randomCiv = availableCivs[math.random(1, #availableCivs)]
local randomFace = math.random() > 0.5 and "A" or "B"
-- Assign the civilization and move cards for the selected civilization
assignCivilization(getObjectFromGUID(civilizations[randomCiv].civGUID), randomFace, player_color)
moveCivilizationToPlayer(randomCiv, player_color)
-- Broadcast the chosen civilization
broadcastToAll(player_color .. " a choisi " .. randomCiv .. " avec " ..
(randomFace == "A" and civilizations[randomCiv].faceA or civilizations[randomCiv].faceB) .. " (Face " .. randomFace .. ")", {1, 1, 1})
-- Flip the civilization card if Face B is chosen
if randomFace == "B" then
local civilizationCard = getObjectFromGUID(civilizations[randomCiv].civGUID)
if civilizationCard then
Wait.time(function()
if not civilizationCard.is_face_down then
civilizationCard.flip()
end
end, 1) -- Delay the flip to ensure the card is placed before flipping
end
end
-- Now, verify and move the sixth card after 3 seconds for smoothness
Wait.time(function()
local zoneGUID = getScriptingZoneGUID(randomCiv)
verifyScriptingZoneContents(zoneGUID, player_color) -- Use the same function as for buttons A and B
end, 3)
else
-- If no civilizations are available, broadcast an error message
broadcastToAll("Toutes les civilisations ont déjà été attribuées.", {1, 0, 0})
end
end
-- Helper function to map civilization name to its scripting zone GUID
function getScriptingZoneGUID(civName)
local scriptZoneToCiv = {
["ROYAUME DE FRANCE"] = "de439d",
["MONARCHIE ESPAGNOLE"] = "7f9575",
["ROYAUME DE PORTUGAL"] = "0aedbd",
["SAINT-EMPIRE"] = "f366a6",
["EMPIRE OTTOMAN"] = "7da3cb",
["DYNASTIE MING"] = "ccc956",
["ROYAUME D'ÉCOSSE"] = "fdff38",
["ROYAUME D'ANGLETERRE"] = "d5327c",
["GRAND-DUCHÉ DE TOSCANE"] = "65c7ca",
["TSARAT DE RUSSIE"] = "acae12",
["EMPIRE MOGHOL"] = "b5cd2d",
["SHOGUNAT DU NIPPON"] = "3563c9"
}
return scriptZoneToCiv[civName]
end
-- Function to assign civilization and move the decks
function assignCivilization(obj, face, player_color)
log("assignCivilization triggered for face: " .. face .. " and player_color: " .. player_color)
local scriptZoneToCiv = {
['de439d'] = "ROYAUME DE FRANCE",
['7f9575'] = "MONARCHIE ESPAGNOLE",
['0aedbd'] = "ROYAUME DE PORTUGAL",
['f366a6'] = "SAINT-EMPIRE",
['7da3cb'] = "EMPIRE OTTOMAN",
['ccc956'] = "DYNASTIE MING",
['fdff38'] = "ROYAUME D'ÉCOSSE",
['d5327c'] = "ROYAUME D'ANGLETERRE",
['65c7ca'] = "GRAND-DUCHÉ DE TOSCANE",
['acae12'] = "TSARAT DE RUSSIE",
['b5cd2d'] = "EMPIRE MOGHOL",
['3563c9'] = "SHOGUNAT DU NIPPON"
}
local zoneGUID = obj.getGUID()
local civName = scriptZoneToCiv[zoneGUID]
if civName then
log("Civilization assigned: " .. civName)
local ruler = face == "A" and civilizations[civName].faceA or civilizations[civName].faceB
broadcastToAll(player_color .. " a choisi " .. civName .. " avec " .. ruler .. " (Face " .. face .. ")", {1, 1, 1})
moveCivilizationToPlayer(civName, player_color)
local civilizationCard = getObjectFromGUID(civilizations[civName].civGUID)
if face == "B" and civilizationCard then
Wait.time(function()
if not civilizationCard.is_face_down then
civilizationCard.flip()
end
end, 1)
end
else
log("Error: Civilization not found for GUID: " .. zoneGUID)
end
end
-- Move the civilization's cards to the player's zones, now placing the deck cards in the corresponding slots
function moveCivilizationToPlayer(civName, player_color)
local playerZones = {
Red = {
civilizationZone = "ffebbf",
deckZone = "504b03",
mainDeck = "b17dca",
civilizationSlots = {"dddf31", "eea4f2", "a75979", "a30a04", "0eeae0", "98d254"}
},
Blue = {
civilizationZone = "4be444",
deckZone = "ef512f",
mainDeck = "99bc2d",
civilizationSlots = {"d259e1", "d86d08", "56108f", "158f5a", "052dba", "514f3d"}
}
}
local data = civilizations[civName]
local playerZone = playerZones[player_color]
-- Move the civilization card to the player's designated civilization zone
local civilizationCard = getObjectFromGUID(data.civGUID)
if civilizationCard then
civilizationCard.setPositionSmooth(getObjectFromGUID(playerZone.civilizationZone).getPosition())
else
log("Error: Civilization card not found for " .. civName)
end
-- Move the ship card to the player's main deck
local shipCard = getObjectFromGUID(data.ship)
if shipCard then
shipCard.flip()
local mainDeck = getObjectFromGUID(playerZone.mainDeck)
if mainDeck then
mainDeck.putObject(shipCard)
else
broadcastToAll("Error: Main deck not found for " .. player_color, {1, 0, 0})
end
else
log("Error: Ship card not found for " .. civName)
end
-- Move the civilization deck to the player's deck zone and spread it across the civilization slots
local civDeck = getObjectFromGUID(data.deck)
if civDeck then
-- Ensure the deck has at least 6 cards
local objectsInDeck = civDeck.getObjects()
if #objectsInDeck < 6 then
broadcastToAll("Error: Civilization deck for " .. civName .. " has fewer than 6 cards.", {1, 0, 0})
log("Error: Civilization deck for " .. civName .. " has fewer than 6 cards.")
return
end
-- Loop through the first 5 cards and place them in the player's civilization slots 1 to 5
for i = 1, 5 do
Wait.time(function()
local card = civDeck.takeObject({
index = 0, -- Always take the top card
smooth = false,
callback_function = function(obj)
obj.setPositionSmooth(getObjectFromGUID(playerZone.civilizationSlots[i]).getPosition())
log("Placed card " .. i .. " in civilization slot " .. i .. " for " .. player_color)
end
})
end, i * 0.5) -- Add a 0.5-second delay between each card placement for smoothness
end
else
broadcastToAll("Error: Civilization deck not found for " .. civName, {1, 0, 0})
log("Error: Civilization deck not found for " .. civName)
end
end
-- Function to test and get the GUID of the clicked civilization's scripting zone
function testCivilizationZone(obj, player_color)
-- Map the civilization names to their scripting zone GUIDs
local scriptZoneToCiv = {
['de439d'] = "ROYAUME DE FRANCE",
['7f9575'] = "MONARCHIE ESPAGNOLE",
['0aedbd'] = "ROYAUME DE PORTUGAL",
['f366a6'] = "SAINT-EMPIRE",
['7da3cb'] = "EMPIRE OTTOMAN",
['ccc956'] = "DYNASTIE MING",
['fdff38'] = "ROYAUME D'ÉCOSSE",
['d5327c'] = "ROYAUME D'ANGLETERRE",
['65c7ca'] = "GRAND-DUCHÉ DE TOSCANE",
['acae12'] = "TSARAT DE RUSSIE",
['b5cd2d'] = "EMPIRE MOGHOL",
['3563c9'] = "SHOGUNAT DU NIPPON"
}
-- Get the clicked object's GUID (civilization card or zone)
local zoneGUID = obj.getGUID()
-- Find the corresponding civilization for the clicked zone GUID
local civName = scriptZoneToCiv[zoneGUID]
-- Log and return the GUID of the scripting zone for this civilization
if civName then
log("Civilization clicked: " .. civName)
log("Scripting Zone GUID: " .. zoneGUID)
-- Wait for 5 seconds, then verify the contents of the zone
Wait.time(function()
log("3 seconds elapsed, now checking the contents of the zone for player " .. player_color)
verifyScriptingZoneContents(zoneGUID, player_color)
end, 3)
return zoneGUID
else
log("Error: Civilization not found for GUID: " .. zoneGUID)
return nil
end
end
-- Function to verify the contents of a scripting zone and move the identified card to the player's civilization slot 6
function verifyScriptingZoneContents(zoneGUID, player_color)
-- Civilization slots based on player color
local playerCivilizationSlots = {
Red = "98d254", -- Slot 6 for Red player
Blue = "514f3d" -- Slot 6 for Blue player
}
-- Get the object corresponding to the zone
local zone = getObjectFromGUID(zoneGUID)
-- Ensure the zone exists
if zone then
-- Retrieve all objects within the zone
local objectsInZone = zone.getObjects()
-- Log the number of objects found
log("Number of objects in the zone: " .. #objectsInZone)
-- Iterate through the objects and find the card
for _, obj in ipairs(objectsInZone) do
if obj and obj.tag == "Card" then
local objName = obj.getName() or "Unknown Name" -- Handle case where getName() is nil
local objGUID = obj.getGUID() or "Unknown GUID" -- Handle case where getGUID() is nil
log("Card found: " .. objName .. " | GUID: " .. objGUID)
-- Get the player's slot 6 based on player color
local slotGUID = playerCivilizationSlots[player_color]
-- Move the card to the player's civilization slot 6
local slot = getObjectFromGUID(slotGUID)
if slot then
obj.setPositionSmooth(slot.getPosition())
log("Moved card to civilization slot 6 for " .. player_color)
else
log("Error: Slot GUID not found for player: " .. player_color)
end
break -- Stop after finding and moving the card
else
log("Ignored object: " .. (obj.getName() or "Unknown") .. " | Type: " .. (obj.tag or "Unknown"))
end
end
else
log("Error: Could not find zone with GUID: " .. zoneGUID)
end
end
-- Start game setup when "Démarrer" is clicked
function startGame(obj, player_color)
broadcastToAll("Que la partie commence !", {1, 1, 1})
obj.clearButtons()
-- Hide all civilization selection buttons after game starts
for _, data in pairs(civilizations) do
local civObject = getObjectFromGUID(data.civGUID)
if civObject then
civObject.clearButtons()
end
end
-- Perform the game setup
setupGame()
end
-- Function to set up the game after civilizations are chosen
function setupGame()
shuffleGameDecks()
setupMarkets()
revealEventCard('dda33b', 'd74e3f')
setupColonies()
shuffleAndDealPlayerDecks()
addConstantDeckButtons()
addAssassinButtons()
enableTurns()
startPlayerTurn()
end
-- Shuffle decks and deal 5 cards to each player
function shuffleGameDecks()
local deck_batiment = getObjectFromGUID('a9a1a6')
local deck_personnage = getObjectFromGUID('5926ea')
local deck_evenement = getObjectFromGUID('dda33b')
local deck_colonieA = getObjectFromGUID('2156f1')
local deck_colonieB = getObjectFromGUID('b2af7a')
local deck_colonieC = getObjectFromGUID('29ca2a')
local deck_colonieD = getObjectFromGUID('ade02c')
if deck_batiment then deck_batiment.shuffle() end
if deck_personnage then deck_personnage.shuffle() end
if deck_evenement then deck_evenement.shuffle() end
if deck_colonieA then deck_colonieA.shuffle() end
if deck_colonieB then deck_colonieB.shuffle() end
if deck_colonieC then deck_colonieC.shuffle() end
if deck_colonieD then deck_colonieD.shuffle() end
end
-- Setup character and building markets
function setupMarkets()
-- Character market without flipped cards
setupMarket('5926ea', {'89def4', '2829a7', '591dfd'}, false)
-- Building market without flipped cards
setupMarket('a9a1a6', {'83f251', '93d9ea', '43bab5'}, false)
end
-- Function to set up the market by placing cards from the deck into the specified zones
function setupMarket(deckGUID, zoneGUIDs, shouldFlip)
local deck = getObjectFromGUID(deckGUID)
-- Check if the deck exists and has enough cards
if deck then
-- Loop through each zone and place the cards
for i, zoneGUID in ipairs(zoneGUIDs) do
local zone = getObjectFromGUID(zoneGUID)
-- Ensure the zone exists before placing the card
if zone then
local card = deck.takeObject({
position = zone.getPosition(),
rotation = {0, 180, 0}, -- Adjust rotation if needed
smooth = true, -- Set to true for smooth movement
})
else
log("Zone with GUID: " .. zoneGUID .. " not found!")
end
end
else
log("Deck with GUID: " .. deckGUID .. " not found!")
end
end
-- Reveal an event card
function revealEventCard(eventDeckGUID, eventZoneGUID)
local deck = getObjectFromGUID(eventDeckGUID)
local zone = getObjectFromGUID(eventZoneGUID)
local card = deck.takeObject({position = zone.getPosition(), smooth = false})
card.flip()
end
-- Setup colony cards
function setupColonies()
-- Adding a delay between the placement of each colony card for smoothness
Wait.time(function() placeColonyCard('2156f1', 'db6451') end, 0.5)
Wait.time(function() placeColonyCard('b2af7a', '321211') end, 1.0)
Wait.time(function() placeColonyCard('29ca2a', '9befbe') end, 1.5)
Wait.time(function() placeColonyCard('ade02c', '5f2959') end, 2.0)
end
function placeColonyCard(deckGUID, zoneGUID)
local deck = getObjectFromGUID(deckGUID)
local zone = getObjectFromGUID(zoneGUID)
-- Take the card from the deck and move it smoothly to the zone's position
local card = deck.takeObject({position = zone.getPosition(), smooth = true}) -- Smooth movement
-- Flip the card randomly
if math.random() > 0.5 then
Wait.time(function() card.flip() end, 1.0) -- Flip after a slight delay
end
end
-- Shuffle and deal player decks
function shuffleAndDealPlayerDecks()
local redDeck = getObjectFromGUID('b17dca')
local blueDeck = getObjectFromGUID('99bc2d')
if redDeck then redDeck.shuffle() end
if blueDeck then blueDeck.shuffle() end
if redDeck then redDeck.deal(5, 'Red') end
if blueDeck then blueDeck.deal(5, 'Blue') end
end
-- Enable turn-based system
function enableTurns()
Turns.enable = true
Turns.type = 1
Turns.order = {"Red", "Blue"}
Turns.skip_empty_hands = false
Turns.reverse_order = false
end
-- Start the player's turn
function startPlayerTurn()
local currentPlayer = Turns.turn_color
broadcastToAll(currentPlayer .. " commence son tour!", {0.2, 0.8, 0.2})
end
-- Adjusted function to handle adding buttons with a delay and recheck for the building market
function onObjectEnterScriptingZone(zone, object)
-- Handle for the Building Market slots
if zone.getGUID() == '83f251' or zone.getGUID() == '93d9ea' or zone.getGUID() == '43bab5' then
-- Add a delay before verifying and adding buttons to ensure the card is properly placed
Wait.time(function()
verifyAndAddButtons(zone, object, "Building")
end, 0.5)
end
-- Handle for the Character Market slots
if zone.getGUID() == '89def4' or zone.getGUID() == '2829a7' or zone.getGUID() == '591dfd' then
-- Add a delay before verifying and adding buttons to ensure the card is properly placed
Wait.time(function()
verifyAndAddButtons(zone, object, "Character")
end, 0.5)
end
end
-- Function to verify the card presence and add buttons
function verifyAndAddButtons(zone, object, marketType)
local objectsInZone = zone.getObjects()
-- Ensure that the object is a card and is still in the zone before adding buttons
for _, obj in ipairs(objectsInZone) do
if obj == object and object.tag == "Card" then
if marketType == "Building" then
addAcquireDiscardButtons(object, "Building")
elseif marketType == "Character" then
if object.getDescription() == "HORS-LA-LOI" then
addServicePrimeButtons(object)
else
addAcquireDiscardButtons(object, "Character")
end
end
end
end
end
-- Function to remove buttons when a card leaves the market slots
function onObjectLeaveScriptingZone(zone, object)
-- Clear buttons when leaving Building Market slots
if zone.getGUID() == '83f251' or zone.getGUID() == '93d9ea' or zone.getGUID() == '43bab5' then
object.clearButtons()
end
-- Clear buttons when leaving Character Market slots
if zone.getGUID() == '89def4' or zone.getGUID() == '2829a7' or zone.getGUID() == '591dfd' then
object.clearButtons()
end
end
-- Function for adding the "Acquérir" and "Défausser" buttons
function addAcquireDiscardButtons(object, marketType)
local acquireFunc = (marketType == "Building") and "acquireBuilding" or "acquireCharacter"
-- Create "Acquérir" button
object.createButton({
click_function = acquireFunc,
function_owner = self,
label = "Acquérir",
position = {0.2, 0.3, 0.2},
width = 420, -- Smaller width
height = 220, -- Smaller height
font_size = 90, -- Smaller font size
color = {0.2, 0.6, 1},
font_color = {1, 1, 1},
tooltip = "Acquérir cette carte"
})
-- Create "Défausser" button
object.createButton({
click_function = "discardMarketCard", -- Use unified discard function
function_owner = self,
label = "✖", -- Cross symbol for discard
position = {-0.4, 0.3, 0.2}, -- Adjusted side-by-side position
width = 175, -- Smaller width
height = 175, -- Smaller height
font_size = 100, -- Cross symbol font size
color = {1, 0, 0}, -- Red for discard
font_color = {1, 1, 1},
tooltip = "Défausser cette carte",
parameters = {marketType} -- Pass the market type to the discard function
})
end
-- Function to acquire a character card and send it to the player's discard pile
function acquireCharacter(obj, player_color)
local playerDiscardZones = {Red = "9a7b71", Blue = "a1554c"}
local discardZone = getObjectFromGUID(playerDiscardZones[player_color])
-- Move card to the discard pile
obj.setPositionSmooth(discardZone.getPosition())
obj.clearButtons()
-- Add a small delay before refilling the market
Wait.time(function()
refillMarket('5926ea', {'89def4', '2829a7', '591dfd'})
end, 0.5) -- Delay of 0.5 seconds to allow the acquisition to complete
end
-- Function to acquire a building card and send it to the construction zones
function acquireBuilding(obj, player_color)
local playerConstructionZones = {
Red = {"96b1a7", "971fb9", "26f9a5"},
Blue = {"7cd574", "c7ac14", "3f4bf6"}
}
local constructionZones = playerConstructionZones[player_color]
local placed = false
if obj.tag == "Card" then
for _, zoneGUID in ipairs(constructionZones) do
local zoneObject = getObjectFromGUID(zoneGUID)
if zoneObject then
local zoneObjects = zoneObject.getObjects()
local validObjects = {}
-- Check for only cards or decks in the zone
for _, zoneObj in ipairs(zoneObjects) do
if zoneObj.tag == "Card" or zoneObj.tag == "Deck" then
table.insert(validObjects, zoneObj)
end
end
-- Place the card if the zone is empty
if #validObjects == 0 then
obj.setPositionSmooth(zoneObject.getPosition())
placed = true
obj.clearButtons()
-- Delay the refill to ensure acquisition completes
Wait.time(function()
refillMarket('a9a1a6', {'83f251', '93d9ea', '43bab5'})
end, 0.5) -- Delay of 0.5 seconds
break
end
end
end
end
if not placed then
broadcastToColor("Your construction zones are full, please build before acquiring new buildings.", player_color, {1, 0, 0})
end
end
-- Function to discard a card (building or character) to the common discard pile
function discardMarketCard(obj, player_color, marketType)
local marketDiscardZone = getObjectFromGUID("46bb60") -- Common discard zone for all market cards
obj.setPositionSmooth(marketDiscardZone.getPosition())
obj.clearButtons()
-- Trigger the appropriate market refill based on the market type
if marketType == "Building" then
refillMarket('a9a1a6', {'83f251', '93d9ea', '43bab5'}) -- Building market refill
elseif marketType == "Character" then
refillMarket('5926ea', {'89def4', '2829a7', '591dfd'}) -- Character market refill
end
end
-- Adding the Acquérir button for constant decks
local constantDecks = {
Characters = {
["Archer"] = "886dae",
["Fermier"] = "b73b60",
["Orfèvre"] = "bd19b9",
["Ouvrier"] = "a49c94"
},
Buildings = {
["Murailles"] = "d99388"
}
}
-- Add buttons for character and building decks
function addConstantDeckButtons()
for _, guid in pairs(constantDecks.Characters) do
local obj = getObjectFromGUID(guid)
if obj then
addAcquireButtonConstantDeck(obj, "Character")
end
end
for _, guid in pairs(constantDecks.Buildings) do
local obj = getObjectFromGUID(guid)
if obj then
addAcquireButtonConstantDeck(obj, "Building")
end
end
end
-- Adding button specifically for constant decks (no need to remove it unless deck is empty)
function addAcquireButtonConstantDeck(object, deckType)
local acquireFunc = (deckType == "Building") and "acquireBuildingFromConstantDeck" or "acquireCharacterFromConstantDeck"
object.createButton({
click_function = acquireFunc,
function_owner = self,
label = "Acquérir",
position = {0, 0.3, 0.2},
width = 420, -- Smaller width
height = 220, -- Smaller height
font_size = 90, -- Smaller font size
color = {0.2, 0.6, 1},
font_color = {1, 1, 1},
tooltip = "Acquérir cette carte"
})
end
-- Function to acquire a card from a constant character deck
function acquireCharacterFromConstantDeck(obj, player_color)
local playerDiscardZones = {Red = "9a7b71", Blue = "a1554c"}
local discardZone = getObjectFromGUID(playerDiscardZones[player_color])
if obj.getQuantity() > 1 then
obj.takeObject({position = discardZone.getPosition(), smooth = true})
else
obj.setPositionSmooth(discardZone.getPosition())
obj.clearButtons() -- Clear buttons if no more cards remain in the deck
end
end
-- Function to acquire a card from a constant building deck and send it to the player's construction zone
function acquireBuildingFromConstantDeck(obj, player_color)
local playerConstructionZones = {Red = "96b1a7", Blue = "7cd574"}
local constructionZone = getObjectFromGUID(playerConstructionZones[player_color])
if obj.getQuantity() > 1 then
obj.takeObject({position = constructionZone.getPosition(), smooth = true})
else
obj.setPositionSmooth(constructionZone.getPosition())
obj.clearButtons() -- Clear buttons if no more cards remain in the deck
end
end
-- Function for adding Service and Prime buttons for HORS-LA-LOI cards
function addServicePrimeButtons(object)
-- Add the Défausser button on the far left
object.createButton({
click_function = "discardCharacter", -- Assuming discard function for HORS-LA-LOI remains the same
function_owner = self,
label = "✖", -- Cross symbol for discard
position = {-0.7, 0.3, 0.2}, -- Far left position
width = 175, -- Smaller width for discard button
height = 175, -- Smaller height
font_size = 100, -- Cross symbol font size
color = {1, 0, 0}, -- Red for discard
font_color = {1, 1, 1},
tooltip = "Défausser cette carte"
})
-- Add the Service button in the middle
object.createButton({
click_function = "serviceCard", -- Assuming there is a service function
function_owner = self,
label = "Service", -- Label for the service action
position = {-0.15, 0.3, 0.2}, -- Middle position
width = 350, -- Width for the service button
height = 220, -- Height for the service button
font_size = 80, -- Font size for the service button
color = {0.5, 0.5, 0.5}, -- Grey for service
font_color = {1, 1, 1},
tooltip = "Demander un service"
})
-- Add the Prime button on the far right
object.createButton({
click_function = "primeCard", -- Assuming there is a prime function
function_owner = self,
label = "Prime", -- Label for the prime action
position = {0.55, 0.3, 0.2}, -- Far right position
width = 350, -- Width for the prime button
height = 220, -- Height for the prime button
font_size = 80, -- Font size for the prime button
color = {1, 0.84, 0}, -- Gold color for prime
font_color = {1, 1, 1},
tooltip = "Recevoir la prime"
})
end
-- Function to add "Prime" and "Service" buttons to the "Assassin" card during setup
function addAssassinButtons()
local assassinCard = getObjectFromGUID("ec3efa") -- GUID for Assassin card
if assassinCard then
-- Add the Service button
assassinCard.createButton({
click_function = "noopFunction", -- No operation when clicked
function_owner = self,
label = "Service",
position = {-0.15, 0.3, 0.2}, -- Middle position
width = 350,
height = 220,
font_size = 80,
color = {0.5, 0.5, 0.5},
font_color = {1, 1, 1},
tooltip = "Demander un service"
})
-- Add the Prime button
assassinCard.createButton({
click_function = "noopFunction", -- No operation when clicked
function_owner = self,
label = "Prime",
position = {0.55, 0.3, 0.2}, -- Far right position
width = 350,
height = 220,
font_size = 80,
color = {1, 0.84, 0},
font_color = {1, 1, 1},
tooltip = "Recevoir la prime"
})
end
end
-- No-op function for buttons that should not trigger any action
function noopFunction()
-- Do nothing when clicked
end
function onPlayerTurn(player, previous_player)
-- Announce the turn change
if previous_player == nil then
print(player.color .. " is the first player. It's now their turn.")
else
print(previous_player.color .. "'s turn is over. It's now " .. player.color .. "'s turn.")
-- If there was a previous player, handle their end-of-turn actions
if previous_player then
if previous_player.color == "Red" then
-- Move Red player's cards from their game zone to their discard pile
moveObjectsToDiscard("8f5458", "9a7b71")
-- Refill Red player's hand with 5 cards, handling empty deck if necessary
drawCards("6c740a", "9a7b71", "Red", 5)
-- Refill character and building markets for Red's turn ending
refillMarket("Character")
refillMarket("Building")
elseif previous_player.color == "Blue" then
-- Move Blue player's cards from their game zone to their discard pile
moveObjectsToDiscard("d56a9d", "a1554c")
-- Refill Blue player's hand with 5 cards, handling empty deck if necessary
drawCards("9c8ab3", "a1554c", "Blue", 5)
-- Refill character and building markets for Blue's turn ending
refillMarket("Character")
refillMarket("Building")
end
end
end
end
-- Function to move cards from player's zone to discard
function moveObjectsToDiscard(zoneGUID, discardGUID)
local zone = getObjectFromGUID(zoneGUID)
local discardZone = getObjectFromGUID(discardGUID)
if zone and discardZone then
local objectsInZone = zone.getObjects()
for _, obj in ipairs(objectsInZone) do
if obj.tag == "Card" or obj.tag == "Deck" then
obj.setPositionSmooth(discardZone.getPosition())
obj.clearButtons() -- Clear any buttons on the cards
log("Cartes déplacées")
end
end
else
log("Error: Zone or discard pile not found.")
end
end
-- Function to draw cards from the deck, reshuffle discard pile if deck is empty
function drawCards(deckGUID, discardGUID, player_color, num_cards)
local deck = getObjectFromGUID(deckGUID)
local discardPile = getObjectFromGUID(discardGUID)
-- Helper function to move discard pile to deck and reshuffle
local function reshuffleFromDiscard()
local objectsInDiscard = discardPile.getObjects()
for _, obj in ipairs(objectsInDiscard) do
obj.setPositionSmooth(deck.getPosition()) -- Move cards to deck zone
if not obj.is_face_down then
obj.flip() -- Ensure cards are face down
end
end
Wait.time(function() deck.shuffle() end, 1) -- Shuffle after moving cards
end
-- Helper function to draw a card from the deck, handle remainder case
local function drawCard(deckObj)
local cardObj = deckObj.takeObject()
if deckObj.remainder then
deckObj = deckObj.remainder -- Update deckObj to the last remaining card
end
return {cardObj = cardObj, deckObj = deckObj}
end
if deck and discardPile then
local objectsInDeck = deck.getObjects()
local remaining_cards = num_cards -- Track how many more cards need to be drawn
-- If the deck has fewer than the required number of cards
if #objectsInDeck < remaining_cards then
-- Draw all available cards from the deck first
for i = 1, #objectsInDeck do
drawCard(deck).cardObj.deal(1, player_color)
remaining_cards = remaining_cards - 1
end
-- Reshuffle discard pile into deck
reshuffleFromDiscard()
-- Wait until reshuffling is complete before drawing the remaining cards
Wait.time(function()
-- Draw the remaining cards from the reshuffled deck
for i = 1, remaining_cards do
drawCard(deck).cardObj.deal(1, player_color)
end
end, 1.5) -- Adding a delay to ensure reshuffling is complete
else
-- If the deck has enough cards, simply draw the required number
for i = 1, num_cards do
drawCard(deck).cardObj.deal(1, player_color)
end
end
else
log("Error: Deck or discard pile not found for " .. player_color)
end
end
-- Function to shift market cards to the right and refill from the deck
function refillMarket(deckGUID, slotGUIDs)
local deck = getObjectFromGUID(deckGUID)
-- Shift cards from right to left
for i = #slotGUIDs, 2, -1 do
local previousSlot = getObjectFromGUID(slotGUIDs[i-1])
local currentSlot = getObjectFromGUID(slotGUIDs[i])
local objectsInPrevSlot = previousSlot.getObjects()
-- Ensure only cards are moved
for _, obj in ipairs(objectsInPrevSlot) do
if obj.tag == "Card" then
obj.setPositionSmooth(currentSlot.getPosition())
break -- Move only one card per slot
end
end
end
-- Finally, draw a new card into the first slot from the deck
local firstSlot = getObjectFromGUID(slotGUIDs[1])
if deck then
local card = deck.takeObject({
position = firstSlot.getPosition(),
smooth = true
})
-- Flip the card after placing it
if card and card.tag == "Card" then
Wait.time(function()
card.flip()
end, 1.0)
end
end
end
Editor is loading...
Leave a Comment