initial build
This commit is contained in:
parent
7ca3f91b95
commit
b40c6e6d9e
@ -3,7 +3,6 @@
|
||||
"ComponentTags_path": "ComponentTags.json",
|
||||
"CustomUIAssets_path": "CustomUIAssets.json",
|
||||
"DecalPallet_path": "DecalPallet.json",
|
||||
"Decals_path": "Decals.json",
|
||||
"GameComplexity": "",
|
||||
"GameMode": "Arkham Horror LCG - Super Complete Edition",
|
||||
"GameType": "",
|
||||
@ -190,7 +189,8 @@
|
||||
"Decoration-Ammo.0a3b03",
|
||||
"Decoration-Ammo.b43845",
|
||||
"Decoration-Ammo.d35ee9",
|
||||
"ArkhamSCE300-1272023-Page1.f873a8"
|
||||
"ArkhamSCE300-1272023-Page1.f873a8",
|
||||
"VictoryDisplay.6ccd6d"
|
||||
],
|
||||
"PlayArea": 1,
|
||||
"PlayerCounts": [
|
||||
|
@ -1,20 +0,0 @@
|
||||
[
|
||||
{
|
||||
"CustomDecal": {
|
||||
"ImageURL": "https://i.imgur.com/saWedQ0.png",
|
||||
"Name": "Victory Display",
|
||||
"Size": 15
|
||||
},
|
||||
"Transform": {
|
||||
"posX": -1.76003075,
|
||||
"posY": 1.491499,
|
||||
"posZ": 28.6174583,
|
||||
"rotX": 90,
|
||||
"rotY": 89.6667938,
|
||||
"rotZ": 0,
|
||||
"scaleX": 15,
|
||||
"scaleY": 15,
|
||||
"scaleZ": 15
|
||||
}
|
||||
}
|
||||
]
|
57
objects/VictoryDisplay.6ccd6d.json
Normal file
57
objects/VictoryDisplay.6ccd6d.json
Normal file
@ -0,0 +1,57 @@
|
||||
{
|
||||
"AltLookAngle": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Autoraise": true,
|
||||
"ColorDiffuse": {
|
||||
"b": 1,
|
||||
"g": 1,
|
||||
"r": 1
|
||||
},
|
||||
"CustomImage": {
|
||||
"CustomToken": {
|
||||
"MergeDistancePixels": 15,
|
||||
"Stackable": false,
|
||||
"StandUp": false,
|
||||
"Thickness": 0.1
|
||||
},
|
||||
"ImageScalar": 1,
|
||||
"ImageSecondaryURL": "",
|
||||
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/5118935530961118802/2A3E0C502886C4C4B98F5A0B03817ABC9DFE3D96/",
|
||||
"WidthScale": 0
|
||||
},
|
||||
"Description": "Automatically counts the earned VP from cards in the victory display and locations in the play area without clues on them.",
|
||||
"DragSelectable": true,
|
||||
"GMNotes": "",
|
||||
"GUID": "6ccd6d",
|
||||
"Grid": true,
|
||||
"GridProjection": false,
|
||||
"Hands": false,
|
||||
"HideWhenFaceDown": false,
|
||||
"IgnoreFoW": false,
|
||||
"LayoutGroupSortIndex": 0,
|
||||
"Locked": true,
|
||||
"LuaScript": "require(\"core/VictoryDisplay\")",
|
||||
"LuaScriptState": "",
|
||||
"MeasureMovement": false,
|
||||
"Name": "Custom_Token",
|
||||
"Nickname": "Victory Display",
|
||||
"Snap": false,
|
||||
"Sticky": true,
|
||||
"Tooltip": true,
|
||||
"Transform": {
|
||||
"posX": -1.5,
|
||||
"posY": 1.531,
|
||||
"posZ": 30,
|
||||
"rotX": 0,
|
||||
"rotY": 270,
|
||||
"rotZ": 0,
|
||||
"scaleX": 4.5,
|
||||
"scaleY": 1,
|
||||
"scaleZ": 4.5
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
131
src/core/VictoryDisplay.ttslua
Normal file
131
src/core/VictoryDisplay.ttslua
Normal file
@ -0,0 +1,131 @@
|
||||
function onLoad()
|
||||
local buttonParameters = {}
|
||||
buttonParameters.label = "0 (Display) + 0 (Play Area) = 0 VP"
|
||||
buttonParameters.click_function = "none"
|
||||
buttonParameters.function_owner = self
|
||||
buttonParameters.position = { x = -0.5, y = 0.11, z = -0.8 }
|
||||
buttonParameters.scale = { 0.15, 0.15, 0.15 }
|
||||
buttonParameters.width = 0
|
||||
buttonParameters.height = 0
|
||||
buttonParameters.font_size = 600
|
||||
buttonParameters.font_color = { 1, 1, 1 }
|
||||
|
||||
-- index 0: VP calculation
|
||||
self.createButton(buttonParameters)
|
||||
|
||||
-- index 1: title
|
||||
buttonParameters.position = { x = 0, y = 0.11, z = -1.15 }
|
||||
buttonParameters.label = "Victory Display"
|
||||
buttonParameters.font_size = 1000
|
||||
self.createButton(buttonParameters)
|
||||
|
||||
-- index 2: refresh button
|
||||
buttonParameters.position = { x = 1.65, y = 0.11, z = -0.8 }
|
||||
buttonParameters.label = "Refresh!"
|
||||
buttonParameters.click_function = "updateCount"
|
||||
buttonParameters.width = 2400
|
||||
buttonParameters.height = 800
|
||||
buttonParameters.font_color = { 0, 0, 0 }
|
||||
buttonParameters.font_size = 600
|
||||
self.createButton(buttonParameters)
|
||||
|
||||
-- update the display label once
|
||||
Wait.time(updateCount, 1)
|
||||
end
|
||||
|
||||
-- automatically update when cards are dropped or removed
|
||||
function onCollisionEnter() updateCount() end
|
||||
function onCollisionExit() Wait.time(updateCount, 0.1) end
|
||||
|
||||
function updateCount()
|
||||
local victoryPoints = {
|
||||
display = 0,
|
||||
playArea = 0
|
||||
}
|
||||
|
||||
-- count cards in victory display
|
||||
for _, v in ipairs(searchOnObj(self)) do
|
||||
local obj = v.hit_object
|
||||
local cardVP = 0
|
||||
|
||||
-- check metadata for VP
|
||||
if obj.tag == "Card" then
|
||||
cardVP = getCardVP(obj.is_face_down, JSON.decode(obj.getGMNotes()))
|
||||
victoryPoints.display = victoryPoints.display + cardVP
|
||||
|
||||
-- handling for stacked cards
|
||||
elseif obj.tag == "Deck" then
|
||||
for _, deepObj in ipairs(obj.getObjects()) do
|
||||
cardVP = getCardVP(true, JSON.decode(deepObj.gm_notes))
|
||||
victoryPoints.display = victoryPoints.display + cardVP
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- count locations in playArea
|
||||
local playArea = getObjectFromGUID("721ba2")
|
||||
for _, v in ipairs(searchOnObj(playArea)) do
|
||||
local obj = v.hit_object
|
||||
local cardVP = 0
|
||||
|
||||
if obj.hasTag("Location") then
|
||||
cardVP = getCardVP(obj.is_face_down, JSON.decode(obj.getGMNotes()))
|
||||
if cardVP and not cardHasClues(obj) then
|
||||
victoryPoints.playArea = victoryPoints.playArea + cardVP
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.editButton({
|
||||
index = 0,
|
||||
label = victoryPoints.display .. " (Display) + "
|
||||
.. victoryPoints.playArea .. " (Play Area) = "
|
||||
.. victoryPoints.display + victoryPoints.playArea .. " VP"
|
||||
})
|
||||
end
|
||||
|
||||
-- checks if a card has clues on it
|
||||
function cardHasClues(card)
|
||||
for _, v in ipairs(searchOnObj(card)) do
|
||||
local obj = v.hit_object
|
||||
if obj.tag == "Tile" then
|
||||
local props = obj.getCustomObject()
|
||||
if obj.is_face_down == false and
|
||||
props.image == "http://cloud-3.steamusercontent.com/ugc/1758068501357164917/1D06F1DC4D6888B6F57124BD2AFE20D0B0DA15A8/" and
|
||||
props.image_bottom == "https://i.imgur.com/EoL7yaZ.png" then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- gets the VP count from the notes
|
||||
function getCardVP(faceDown, notes)
|
||||
local cardVP
|
||||
if notes ~= nil then
|
||||
-- enemy, treachery etc.
|
||||
cardVP = tonumber(notes.victory)
|
||||
|
||||
-- location
|
||||
if not cardVP then
|
||||
if not faceDown then
|
||||
cardVP = tonumber(notes.locationFront.victory)
|
||||
else
|
||||
cardVP = tonumber(notes.locationBack.victory)
|
||||
end
|
||||
end
|
||||
end
|
||||
return cardVP or 0
|
||||
end
|
||||
|
||||
function searchOnObj(obj)
|
||||
return Physics.cast({
|
||||
direction = { 0, 1, 0 },
|
||||
max_distance = 0.5,
|
||||
type = 3,
|
||||
size = obj.getBounds().size,
|
||||
origin = obj.getPosition()
|
||||
})
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user