Merge branch 'argonui:main' into token-stack
This commit is contained in:
commit
07fdfface2
@ -3,7 +3,6 @@
|
||||
"ComponentTags_path": "ComponentTags.json",
|
||||
"CustomUIAssets_path": "CustomUIAssets.json",
|
||||
"DecalPallet_path": "DecalPallet.json",
|
||||
"Decals": [],
|
||||
"GameComplexity": "",
|
||||
"GameMode": "Arkham Horror LCG - Super Complete Edition",
|
||||
"GameType": "",
|
||||
@ -84,6 +83,7 @@
|
||||
"Trash.5f896a",
|
||||
"Trash.147e80",
|
||||
"Trash.f7b6c8",
|
||||
"PatchNotes.f47225",
|
||||
"RulesReference.d99993",
|
||||
"LatestFAQ.faqfaq",
|
||||
"Doomtokens.16724b",
|
||||
@ -207,7 +207,6 @@
|
||||
"Tokencache_Curse.16a9a7",
|
||||
"Tokencache_Frost.b2b7be",
|
||||
"PhysicsDetector.b300d8",
|
||||
"ArkhamSCE390-06302024-Page1.bd6b3e",
|
||||
"Neutral.834ad5",
|
||||
"Neutral.a84ae4",
|
||||
"Neutral.762df8",
|
||||
|
@ -1,137 +0,0 @@
|
||||
{
|
||||
"AltLookAngle": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Autoraise": true,
|
||||
"ColorDiffuse": {
|
||||
"b": 1,
|
||||
"g": 1,
|
||||
"r": 1
|
||||
},
|
||||
"Description": "Thanks for downloading Arkham SCE 3.9.0!\n\n- Added confirmation dialog for discard hotkey (e.g. for locations)\r\n- Added new action / ability tokens\r\n- Added automated discarding for Patrice\r\n- Added new option to enable all card helpers\r\n- Added new option to load class-specific playermats\r",
|
||||
"DragSelectable": true,
|
||||
"GMNotes": "",
|
||||
"GUID": "bd6b3e",
|
||||
"Grid": true,
|
||||
"GridProjection": false,
|
||||
"Hands": false,
|
||||
"HideWhenFaceDown": false,
|
||||
"IgnoreFoW": false,
|
||||
"LayoutGroupSortIndex": 0,
|
||||
"Locked": false,
|
||||
"LuaScript": "",
|
||||
"LuaScriptState": "",
|
||||
"MeasureMovement": false,
|
||||
"Name": "Notecard",
|
||||
"Nickname": "Arkham SCE 3.9.0 - 06/30/2024 - Page 1",
|
||||
"Snap": true,
|
||||
"States": {
|
||||
"2": {
|
||||
"AltLookAngle": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Autoraise": true,
|
||||
"ColorDiffuse": {
|
||||
"b": 1,
|
||||
"g": 1,
|
||||
"r": 1
|
||||
},
|
||||
"Description": "\n- Performed a small clean up of the bottom corners of the table\r\n- Updated 'Additional Cards Bag' / 'Player Card Panel' with better handling for fan-made cards\r\n- Updated Clean Up Helper, Drawing Tool, Hand Helper and Search Assistant\r\n- Updated Token Arranger",
|
||||
"DragSelectable": true,
|
||||
"GMNotes": "",
|
||||
"GUID": "522604",
|
||||
"Grid": true,
|
||||
"GridProjection": false,
|
||||
"Hands": false,
|
||||
"HideWhenFaceDown": false,
|
||||
"IgnoreFoW": false,
|
||||
"LayoutGroupSortIndex": 0,
|
||||
"Locked": false,
|
||||
"LuaScript": "",
|
||||
"LuaScriptState": "",
|
||||
"MeasureMovement": false,
|
||||
"Name": "Notecard",
|
||||
"Nickname": "Arkham SCE 3.9.0 - 06/30/2024 - Page 2",
|
||||
"Snap": true,
|
||||
"Sticky": true,
|
||||
"Tooltip": true,
|
||||
"Transform": {
|
||||
"posX": -27,
|
||||
"posY": 1.551,
|
||||
"posZ": -56.165,
|
||||
"rotX": 0,
|
||||
"rotY": 90,
|
||||
"rotZ": 0,
|
||||
"scaleX": 3,
|
||||
"scaleY": 1,
|
||||
"scaleZ": 3
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
},
|
||||
"3": {
|
||||
"AltLookAngle": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Autoraise": true,
|
||||
"ColorDiffuse": {
|
||||
"b": 1,
|
||||
"g": 1,
|
||||
"r": 1
|
||||
},
|
||||
"Description": "\n- Implemented menu to redraw tokens for specific cards like Heavy Furs and Wendy Adams\r\n- Bugfix for attempting to draw an encounter card while there is no deck\r\n- Bugfix for Navigation Overlay: now checks if playmat is occupied\r\n- Bugfix for Phase Tracker broadcasting\r\n- Performance improvements",
|
||||
"DragSelectable": true,
|
||||
"GMNotes": "",
|
||||
"GUID": "522877",
|
||||
"Grid": true,
|
||||
"GridProjection": false,
|
||||
"Hands": false,
|
||||
"HideWhenFaceDown": false,
|
||||
"IgnoreFoW": false,
|
||||
"LayoutGroupSortIndex": 0,
|
||||
"Locked": false,
|
||||
"LuaScript": "",
|
||||
"LuaScriptState": "",
|
||||
"MeasureMovement": false,
|
||||
"Name": "Notecard",
|
||||
"Nickname": "Arkham SCE 3.9.0 - 06/30/2024 - Page 3",
|
||||
"Snap": true,
|
||||
"Sticky": true,
|
||||
"Tooltip": true,
|
||||
"Transform": {
|
||||
"posX": -27,
|
||||
"posY": 1.551,
|
||||
"posZ": -56.165,
|
||||
"rotX": 0,
|
||||
"rotY": 90,
|
||||
"rotZ": 0,
|
||||
"scaleX": 3,
|
||||
"scaleY": 1,
|
||||
"scaleZ": 3
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
||||
},
|
||||
"Sticky": true,
|
||||
"Tooltip": true,
|
||||
"Transform": {
|
||||
"posX": -27,
|
||||
"posY": 1.551,
|
||||
"posZ": -56.165,
|
||||
"rotX": 0,
|
||||
"rotY": 90,
|
||||
"rotZ": 0,
|
||||
"scaleX": 3,
|
||||
"scaleY": 1,
|
||||
"scaleZ": 3
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
113
objects/PatchNotes.f47225.json
Normal file
113
objects/PatchNotes.f47225.json
Normal file
@ -0,0 +1,113 @@
|
||||
{
|
||||
"AltLookAngle": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"AttachedDecals": [
|
||||
{
|
||||
"CustomDecal": {
|
||||
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/2501268517218943111/803E57A7B3E9765DF342050EE6C71D69473A7388/",
|
||||
"Name": "Image #1",
|
||||
"Size": 1
|
||||
},
|
||||
"Transform": {
|
||||
"posX": -0.93,
|
||||
"posY": 0.105,
|
||||
"posZ": 0.66,
|
||||
"rotX": 90,
|
||||
"rotY": 180,
|
||||
"rotZ": 0,
|
||||
"scaleX": 0.6,
|
||||
"scaleY": 0.6,
|
||||
"scaleZ": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"CustomDecal": {
|
||||
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/2037357792052848566/5DA900C430E97D3DFF2C9B8A3DB1CB2271791FC7/",
|
||||
"Name": "Image #2",
|
||||
"Size": 1
|
||||
},
|
||||
"Transform": {
|
||||
"posX": -1.05,
|
||||
"posY": 0.105,
|
||||
"posZ": -0.567,
|
||||
"rotX": 90,
|
||||
"rotY": 205,
|
||||
"rotZ": 0,
|
||||
"scaleX": 0.3,
|
||||
"scaleY": 0.3,
|
||||
"scaleZ": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"CustomDecal": {
|
||||
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/2501268517219098388/0936FEE03B410319658B5E05DB5D486CEDDE98F5/",
|
||||
"Name": "Image #3",
|
||||
"Size": 1
|
||||
},
|
||||
"Transform": {
|
||||
"posX": 0,
|
||||
"posY": 0.105,
|
||||
"posZ": -0.81,
|
||||
"rotX": 90,
|
||||
"rotY": 180,
|
||||
"rotZ": 0,
|
||||
"scaleX": 2.4,
|
||||
"scaleY": 0.009,
|
||||
"scaleZ": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"Autoraise": true,
|
||||
"ColorDiffuse": {
|
||||
"b": 1,
|
||||
"g": 1,
|
||||
"r": 1
|
||||
},
|
||||
"CustomImage": {
|
||||
"CustomTile": {
|
||||
"Stackable": false,
|
||||
"Stretch": true,
|
||||
"Thickness": 0.1,
|
||||
"Type": 0
|
||||
},
|
||||
"ImageScalar": 1,
|
||||
"ImageSecondaryURL": "http://sfwallpaper.com/images/parchment-paper-wallpaper-10.jpg",
|
||||
"ImageURL": "http://sfwallpaper.com/images/parchment-paper-wallpaper-10.jpg",
|
||||
"WidthScale": 0
|
||||
},
|
||||
"Description": "Thanks for downloading! We're happy to present you a rather big update this time :-)\n\nNew things\n- automated discarding for Patrice\n- confirmation dialog for discard hotkey (e.g. for locations)\n- helpers for cards that redraw tokens and Kohaku\n- displaying of token count for cards that seal tokens\r\n- new action / ability tokens (replacing the old ones)\r\n- option to enable all card helpers (e.g. Heavy Furs)\r\n- option to load class-colored playermat backgrounds\n- coloring for player names in broadcasts\n- right-click option for RBW button on Player Card Panel to specify trait(s)\n\nUpdates\r\n- performed a small clean up of the bottom corners of the table\n- \"Numpad 9\" to rearranges present tokens (on top of adding a resource)\n- Scroll of Secrets context menu helper now displays player names instead of colors\r\n- Player Card Panel can display fan-made cards with a new \"custom\" cycle button)\n- \"Discard object\" gamekey works for selected objects\r\n- updated a bunch of tools like Clean Up Helper, Drawing Tool,\nHand Helper, Token Arranger and Search Assistant\n\nFixes\r\r\n- Bugfix for attempting to draw an encounter card while there is no deck\r\n- Bugfix for Navigation Overlay: now checks if playmat is occupied\r\n- Bugfix for Phase Tracker broadcasting\r\n- Performance and file size improvements (e.g. by adding download\nfunctions for CYOA campaign guides and Arkham Fantasy standees)",
|
||||
"DragSelectable": true,
|
||||
"GMNotes": "",
|
||||
"GUID": "f47225",
|
||||
"Grid": true,
|
||||
"GridProjection": false,
|
||||
"Hands": false,
|
||||
"HideWhenFaceDown": false,
|
||||
"IgnoreFoW": false,
|
||||
"LayoutGroupSortIndex": 0,
|
||||
"Locked": false,
|
||||
"LuaScriptState_path": "PatchNotes.f47225.luascriptstate",
|
||||
"LuaScript_path": "PatchNotes.f47225.ttslua",
|
||||
"MeasureMovement": false,
|
||||
"Name": "Custom_Tile",
|
||||
"Nickname": "Patch Notes",
|
||||
"Snap": true,
|
||||
"Sticky": true,
|
||||
"Tooltip": true,
|
||||
"Transform": {
|
||||
"posX": -27,
|
||||
"posY": 1.481,
|
||||
"posZ": -56.165,
|
||||
"rotX": 0,
|
||||
"rotY": 270,
|
||||
"rotZ": 0,
|
||||
"scaleX": 7.5,
|
||||
"scaleY": 1,
|
||||
"scaleZ": 7.5
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
1
objects/PatchNotes.f47225.luascriptstate
Normal file
1
objects/PatchNotes.f47225.luascriptstate
Normal file
@ -0,0 +1 @@
|
||||
{"checks":[],"decals":[{"locked":false,"name":"Arkham SCE logo","pos":{"x":3.1,"y":2.2},"rotation":0,"scale":{"x":"2","y":"2"},"tooltip":"None","url":"http://cloud-3.steamusercontent.com/ugc/2501268517218943111/803E57A7B3E9765DF342050EE6C71D69473A7388/"},{"locked":false,"name":"Bootlegger Finn","pos":{"x":3.5,"y":-1.89},"rotation":"25","scale":{"x":"1","y":"1"},"tooltip":"None","url":"http://cloud-3.steamusercontent.com/ugc/2037357792052848566/5DA900C430E97D3DFF2C9B8A3DB1CB2271791FC7/"},{"locked":false,"name":"black bar","pos":{"x":0,"y":-2.7},"rotation":0,"scale":{"x":"8","y":"0.03"},"tooltip":"None","url":"http://cloud-3.steamusercontent.com/ugc/2501268517219098388/0936FEE03B410319658B5E05DB5D486CEDDE98F5/"}],"fields":[{"align":3,"array":{"x":"1","y":"1"},"counter":"False","distance":{"x":"1","y":"1"},"fieldColor":{"a":0,"b":1,"g":1,"r":1},"font":"200","locked":false,"name":"Patch Notes","pos":{"x":"0","y":-2.9},"role":"Normal Field","size":{"x":"3750","y":"250"},"textColor":{"a":1,"b":0,"g":0,"r":0},"tooltip":"None","value":["Arkham Horror LCG SCE 3.9.0 - 07/05/2024"]},{"align":2,"array":{"x":"1","y":1},"distance":{"x":"1","y":"1"},"fieldColor":{"a":0,"b":1,"g":1,"r":1},"font":"90","locked":false,"name":"Details","pos":{"x":"0","y":0.4},"role":"Set object's description","size":{"x":"3750","y":"2750"},"textColor":{"a":1,"b":0,"g":0,"r":0},"tooltip":"None","value":["Thanks for downloading! We're happy to present you a rather big update this time :-)\n\nNew things\n- automated discarding for Patrice\n- confirmation dialog for discard hotkey (e.g. for locations)\n- helpers for cards that redraw tokens and Kohaku\n- displaying of token count for cards that seal tokens\r\n- new action / ability tokens (replacing the old ones)\r\n- option to enable all card helpers (e.g. Heavy Furs)\r\n- option to load class-colored playermat backgrounds\n- coloring for player names in broadcasts\n- right-click option for RBW button on Player Card Panel to specify trait(s)\n\nUpdates\r\n- performed a small clean up of the bottom corners of the table\n- \"Numpad 9\" to rearranges present tokens (on top of adding a resource)\n- Scroll of Secrets context menu helper now displays player names instead of colors\r\n- Player Card Panel can display fan-made cards with a new \"custom\" cycle button)\n- \"Discard object\" gamekey works for selected objects\r\n- updated a bunch of tools like Clean Up Helper, Drawing Tool,\nHand Helper, Token Arranger and Search Assistant\n\nFixes\r\r\n- Bugfix for attempting to draw an encounter card while there is no deck\r\n- Bugfix for Navigation Overlay: now checks if playmat is occupied\r\n- Bugfix for Phase Tracker broadcasting\r\n- Performance and file size improvements (e.g. by adding download\nfunctions for CYOA campaign guides and Arkham Fantasy standees)"]}],"flip":"False","height":"0.1","locks":{"checks":false,"decals":false,"fields":false},"nudgeDistance":0.01,"scale":{"x":"0.3","y":"0.3"},"sheetLocked":true}
|
3513
objects/PatchNotes.f47225.ttslua
Normal file
3513
objects/PatchNotes.f47225.ttslua
Normal file
File diff suppressed because it is too large
Load Diff
@ -284,7 +284,6 @@ end
|
||||
-- maybe ignore cards / decks on the tekelili helper
|
||||
function maybeIgnoreTekeliliCards()
|
||||
local tekeliliHelper = getTekeliliHelper()
|
||||
|
||||
if tekeliliHelper then
|
||||
removeIgnoreLater = searchLib.onObject(tekeliliHelper, "isCardOrDeck")
|
||||
for _, obj in ipairs(removeIgnoreLater) do
|
||||
@ -295,10 +294,7 @@ end
|
||||
|
||||
-- clean up for play area
|
||||
function tidyPlayareaCoroutine()
|
||||
-- small wait to allow other operations to finish
|
||||
for k = 1, 10 do
|
||||
coroutine.yield(0)
|
||||
end
|
||||
coWaitFrames(10)
|
||||
|
||||
local trash = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash")
|
||||
local playAreaZone = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaZone")
|
||||
@ -333,43 +329,46 @@ function tidyPlayerMatCoroutine()
|
||||
|
||||
if getOptionValue() then
|
||||
for _, color in ipairs(COLORS) do
|
||||
-- delay for animation purpose
|
||||
for k = 1, 20 do
|
||||
coroutine.yield(0)
|
||||
end
|
||||
|
||||
-- get respective trash
|
||||
local trash = guidReferenceApi.getObjectByOwnerAndType(color, "Trash")
|
||||
if trash == nil then
|
||||
printToAll("Trashcan for " .. color .. " playermat could not be found! Skipping this playermat.", "Yellow")
|
||||
goto continue
|
||||
end
|
||||
else
|
||||
coWaitFrames(20)
|
||||
|
||||
-- maybe store tekelili cards
|
||||
if tekeliliHelper then
|
||||
tekeliliHelper.call("storeTekelili", color)
|
||||
end
|
||||
-- maybe store tekelili cards
|
||||
if tekeliliHelper then
|
||||
tekeliliHelper.call("storeTekelili", color)
|
||||
end
|
||||
|
||||
-- remove objects (with exceptions)
|
||||
for _, obj in ipairs(playermatApi.searchAroundPlayermat(color)) do
|
||||
maybeTrashObject(obj, trash)
|
||||
end
|
||||
-- parse playermat objects
|
||||
for _, obj in ipairs(playermatApi.searchAroundPlayermat(color)) do
|
||||
-- reset action tokens
|
||||
if obj.hasTag("UniversalToken") and obj.is_face_down then
|
||||
obj.flip()
|
||||
end
|
||||
|
||||
-- reset "activeInvestigatorId" and "...class"
|
||||
local mat = guidReferenceApi.getObjectByOwnerAndType(color, "Playermat")
|
||||
mat.setVar("activeInvestigatorId", "00000")
|
||||
mat.setVar("activeInvestigatorClass", "Neutral")
|
||||
mat.call("updateTexture")
|
||||
-- get rid of temporary tokens
|
||||
if obj.hasTag("Temporary") then
|
||||
trash.putObject(obj)
|
||||
end
|
||||
|
||||
for k = 1, 5 do
|
||||
coroutine.yield(0)
|
||||
end
|
||||
-- remove objects (with exceptions)
|
||||
maybeTrashObject(obj, trash)
|
||||
end
|
||||
|
||||
-- maybe respawn tekelili cards
|
||||
if tekeliliHelper then
|
||||
tekeliliHelper.call("spawnStoredTekelili", color)
|
||||
-- reset "activeInvestigatorId" and "...class"
|
||||
local mat = guidReferenceApi.getObjectByOwnerAndType(color, "Playermat")
|
||||
mat.setVar("activeInvestigatorId", "00000")
|
||||
mat.setVar("activeInvestigatorClass", "Neutral")
|
||||
mat.call("updateTexture")
|
||||
|
||||
coWaitFrames(5)
|
||||
|
||||
-- maybe respawn tekelili cards
|
||||
if tekeliliHelper then
|
||||
tekeliliHelper.call("spawnStoredTekelili", color)
|
||||
end
|
||||
end
|
||||
::continue::
|
||||
end
|
||||
end
|
||||
|
||||
@ -431,3 +430,10 @@ function getOptionValue()
|
||||
return options["tidyPlayermats"]
|
||||
end
|
||||
end
|
||||
|
||||
-- pauses the current coroutine for 'frameCount' frames
|
||||
function coWaitFrames(frameCount)
|
||||
for k = 1, frameCount do
|
||||
coroutine.yield(0)
|
||||
end
|
||||
end
|
||||
|
@ -176,6 +176,17 @@ function getOwnerOfObject(object)
|
||||
end
|
||||
end
|
||||
|
||||
-- check if the object is in a handzone
|
||||
for owner, subtable in pairs(GuidReferences) do
|
||||
for type, guid in pairs(subtable) do
|
||||
for _, zone in ipairs(object.getZones()) do
|
||||
if guid == zone.getGUID() then
|
||||
return owner
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- check if it is on an owned object
|
||||
local result = searchLib.belowPosition(object.getPosition())
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
|
||||
local guidReferenceApi = require("core/GUIDReferenceApi")
|
||||
local mythosAreaApi = require("core/MythosAreaApi")
|
||||
local guidReferenceApi = require("core/GUIDReferenceApi")
|
||||
local mythosAreaApi = require("core/MythosAreaApi")
|
||||
local navigationOverlayApi = require("core/NavigationOverlayApi")
|
||||
local optionPanelApi = require("core/OptionPanelApi")
|
||||
local playermatApi = require("playermat/PlayermatApi")
|
||||
local searchLib = require("util/SearchLib")
|
||||
local victoryDisplayApi = require("core/VictoryDisplayApi")
|
||||
local optionPanelApi = require("core/OptionPanelApi")
|
||||
local playermatApi = require("playermat/PlayermatApi")
|
||||
local searchLib = require("util/SearchLib")
|
||||
local victoryDisplayApi = require("core/VictoryDisplayApi")
|
||||
|
||||
function onLoad()
|
||||
addHotkey("Add doom to agenda", addDoomToAgenda)
|
||||
@ -75,15 +75,19 @@ function takeCardIntoThreatArea(playerColor, hoveredObject)
|
||||
local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat")
|
||||
|
||||
-- do not continue if the threat area is already full
|
||||
if playermatApi.getEncounterCardDrawPosition(matColor, false) == playermatApi.getEncounterCardDrawPosition(matColor, true) then
|
||||
local threatAreaPos = playermatApi.getEncounterCardDrawPosition(matColor, false)
|
||||
if threatAreaPos == playermatApi.getEncounterCardDrawPosition(matColor, true) then
|
||||
broadcastToColor("Threat area is full.", playerColor, "Yellow")
|
||||
return
|
||||
end
|
||||
|
||||
-- initialize list of objects to move
|
||||
local moveTheseObjects = {}
|
||||
-- initialize list of objects to move (and store local positions)
|
||||
local additionalObjects = {}
|
||||
for _, obj in ipairs(searchLib.onObject(hoveredObject, "isTileOrToken")) do
|
||||
table.insert(moveTheseObjects, obj)
|
||||
local data = {}
|
||||
data.object = obj
|
||||
data.localPos = hoveredObject.positionToLocal(obj.getPosition())
|
||||
table.insert(additionalObjects, data)
|
||||
end
|
||||
|
||||
-- find out if the original card is on the green or red playermats
|
||||
@ -97,29 +101,25 @@ function takeCardIntoThreatArea(playerColor, hoveredObject)
|
||||
modifierY = -90
|
||||
end
|
||||
|
||||
-- store local positions of objects
|
||||
local localPositions = {}
|
||||
for i, obj in ipairs(moveTheseObjects) do
|
||||
local localPos = hoveredObject.positionToLocal(obj.getPosition())
|
||||
localPositions[i] = localPos
|
||||
end
|
||||
|
||||
-- move the main card
|
||||
local pos = playermatApi.getEncounterCardDrawPosition(matColor, false)
|
||||
hoveredObject.setPosition(pos)
|
||||
hoveredObject.setRotation(hoveredObject.getRotation() - Vector(0, 270 - mat.getRotation().y - modifierY, 0))
|
||||
|
||||
local cardName = hoveredObject.getName()
|
||||
if cardName == nil or cardName == "" then
|
||||
cardName = "card(s)"
|
||||
end
|
||||
broadcastToAll("Placed " .. cardName .. " into threat area.", "White")
|
||||
if cardName == "" then cardName = "card" end
|
||||
broadcastToAll("Moved " .. cardName .. " to " .. getColoredName(playerColor) .. "'s threat area.", "White")
|
||||
|
||||
for i, obj in ipairs(moveTheseObjects) do
|
||||
if not obj.locked then
|
||||
local globalPos = hoveredObject.positionToWorld(localPositions[i])
|
||||
obj.setPosition(globalPos)
|
||||
obj.setRotation(obj.getRotation() - Vector(0, 270 - mat.getRotation().y - modifierY, 0))
|
||||
-- get new rotation (rounded)
|
||||
local cardRot = hoveredObject.getRotation()
|
||||
local roundedRotY = roundToMultiple(cardRot.y, 45)
|
||||
local deltaRotY = 270 - mat.getRotation().y - modifierY
|
||||
local newCardRot = cardRot:setAt("y", roundedRotY - deltaRotY)
|
||||
|
||||
-- move the main card to threat area
|
||||
hoveredObject.setRotation(newCardRot)
|
||||
hoveredObject.setPosition(threatAreaPos)
|
||||
|
||||
-- move tokens/tiles (to new global position)
|
||||
for _, data in ipairs(additionalObjects) do
|
||||
if not data.object.locked then
|
||||
data.object.setPosition(hoveredObject.positionToWorld(data.localPos))
|
||||
data.object.setRotation(data.object.getRotation() - Vector(0, deltaRotY, 0))
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -131,7 +131,7 @@ function discardObject(playerColor, hoveredObject)
|
||||
if #selectedObjects > 0 then
|
||||
discardGroup(playerColor, selectedObjects)
|
||||
return
|
||||
-- only continue if an unlocked card, deck or tile was hovered
|
||||
-- only continue if an unlocked card, deck or tile was hovered
|
||||
elseif hoveredObject == nil
|
||||
or (hoveredObject.type ~= "Card" and hoveredObject.type ~= "Deck" and hoveredObject.type ~= "Tile")
|
||||
or hoveredObject.locked then
|
||||
@ -178,7 +178,7 @@ function discardGroup(playerColor, selectedObjects)
|
||||
if (selectedObjects[i].type == "Card" or selectedObjects[i].type ~= "Deck" or selectedObjects[i].type == "Tile") then
|
||||
performDiscard(playerColor, selectedObjects[i])
|
||||
end
|
||||
end, (count - i + 1) * 0.1)
|
||||
end, (count - i + 1) * 0.1)
|
||||
end
|
||||
end
|
||||
|
||||
@ -503,3 +503,7 @@ function getColoredName(playerColor)
|
||||
-- add bb-code
|
||||
return "[" .. Color.fromString(playerColor):toHex() .. "]" .. displayName .. "[-]"
|
||||
end
|
||||
|
||||
function roundToMultiple(num, mult)
|
||||
return math.floor((num + mult / 2) / mult) * mult
|
||||
end
|
||||
|
@ -212,10 +212,14 @@ end
|
||||
|
||||
-- TTS event for objects that leave zones
|
||||
function onObjectLeaveZone(zone, object)
|
||||
if zone.isDestroyed() or object.isDestroyed() then return end
|
||||
if zone.type == "Hand" and object.hasTag("CardWithHelper") then
|
||||
object.call("updateDisplay")
|
||||
end
|
||||
-- 1 frame delay to avoid error messages when exiting the game
|
||||
Wait.frames(
|
||||
function()
|
||||
if zone.isDestroyed() or object.isDestroyed() then return end
|
||||
if zone.type == "Hand" and object.hasTag("CardWithHelper") then
|
||||
object.call("updateDisplay")
|
||||
end
|
||||
end, 1)
|
||||
end
|
||||
|
||||
-- handle card drawing via number typing for multihanded gameplay
|
||||
@ -224,15 +228,6 @@ function onObjectNumberTyped(hoveredObject, playerColor, number)
|
||||
-- only continue for decks or cards
|
||||
if hoveredObject.type ~= "Deck" and hoveredObject.type ~= "Card" then return end
|
||||
|
||||
-- check whether the hovered object is part of a players draw objects
|
||||
for _, color in ipairs(playermatApi.getUsedMatColors()) do
|
||||
local deckAreaObjects = playermatApi.getDeckAreaObjects(color)
|
||||
if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then
|
||||
playermatApi.drawCardsWithReshuffle(color, number)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
-- check if this is a card with states (and then change state instead of drawing it)
|
||||
local states = hoveredObject.getStates()
|
||||
if states ~= nil and #states > 0 then
|
||||
@ -242,6 +237,15 @@ function onObjectNumberTyped(hoveredObject, playerColor, number)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
-- check whether the hovered object is part of a players draw objects
|
||||
for _, color in ipairs(playermatApi.getUsedMatColors()) do
|
||||
local deckAreaObjects = playermatApi.getDeckAreaObjects(color)
|
||||
if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then
|
||||
playermatApi.drawCardsWithReshuffle(color, number)
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- TTS event, used to redraw the playermat slot symbols after a small delay to account for the custom font loading
|
||||
@ -249,8 +253,9 @@ function onPlayerConnect()
|
||||
Wait.time(function() playermatApi.redrawSlotSymbols("All") end, 0.2)
|
||||
end
|
||||
|
||||
-- disable delete action (only applies to promoted players) and discard objects instead
|
||||
function onPlayerAction(player, action, targets)
|
||||
if action == Player.Action.Delete and player.admin == false then
|
||||
if action == Player.Action.Delete and not player.admin then
|
||||
for _, target in ipairs(targets) do
|
||||
local matColor = playermatApi.getMatColorByPosition(target.getPosition())
|
||||
local trash = guidReferenceApi.getObjectByOwnerAndType(matColor, "Trash")
|
||||
@ -1364,7 +1369,8 @@ function contentDownloadCallback(request, params)
|
||||
if pos then
|
||||
spawnTable.position = pos
|
||||
else
|
||||
broadcastToAll("Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red")
|
||||
broadcastToAll(
|
||||
"Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red")
|
||||
return
|
||||
end
|
||||
end
|
||||
@ -1515,10 +1521,11 @@ function playermatRemovalSelected(player, selectedIndex, id)
|
||||
if mat then
|
||||
-- confirmation dialog about deletion
|
||||
player.pingTable(mat.getPosition())
|
||||
player.showConfirmDialog("Do you really want to remove " .. matColor .. "'s playermat and related objects? This can't be reversed.",
|
||||
function()
|
||||
removePlayermat(matColor)
|
||||
end)
|
||||
player.showConfirmDialog(
|
||||
"Do you really want to remove " .. matColor .. "'s playermat and related objects? This can't be reversed.",
|
||||
function()
|
||||
removePlayermat(matColor)
|
||||
end)
|
||||
else
|
||||
-- info dialog that it is already deleted
|
||||
player.showInfoDialog(matColor .. "'s playermat has already been removed.")
|
||||
@ -1593,6 +1600,7 @@ function applyOptionPanelChange(id, state)
|
||||
local counter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "MasterClueCounter")
|
||||
counter.setVar("useClickableCounters", state)
|
||||
|
||||
-- option: Enable card helpers
|
||||
elseif id == "enableCardHelpers" then
|
||||
toggleCardHelpers(state)
|
||||
|
||||
|
@ -8,12 +8,12 @@ local tokenChecker = require("core/token/TokenChecker")
|
||||
local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi")
|
||||
|
||||
local ENCOUNTER_DECK_AREA = {
|
||||
upperLeft = { x = 0.9, z = 0.42 },
|
||||
lowerRight = { x = 0.86, z = 0.38 }
|
||||
upperLeft = { x = 1.05, z = 0.15 },
|
||||
lowerRight = { x = 0.70, z = 0.59 }
|
||||
}
|
||||
local ENCOUNTER_DISCARD_AREA = {
|
||||
upperLeft = { x = 1.62, z = 0.42 },
|
||||
lowerRight = { x = 1.58, z = 0.38 }
|
||||
upperLeft = { x = 1.77, z = 0.15 },
|
||||
lowerRight = { x = 1.42, z = 0.59 }
|
||||
}
|
||||
|
||||
-- global position of encounter deck and discard pile
|
||||
@ -45,7 +45,7 @@ end
|
||||
-- collison and container event handling
|
||||
---------------------------------------------------------
|
||||
|
||||
-- TTS event handler. Handles scenario name event triggering and encounter card token resets.
|
||||
-- TTS event handler. Handles scenario name event triggering and encounter card token resets.
|
||||
function onCollisionEnter(collisionInfo)
|
||||
if not collisionEnabled then return end
|
||||
|
||||
@ -240,18 +240,16 @@ end
|
||||
function inArea(point, bounds)
|
||||
return (point.x < bounds.upperLeft.x
|
||||
and point.x > bounds.lowerRight.x
|
||||
and point.z < bounds.upperLeft.z
|
||||
and point.z > bounds.lowerRight.z)
|
||||
and point.z > bounds.upperLeft.z
|
||||
and point.z < bounds.lowerRight.z)
|
||||
end
|
||||
|
||||
-- removes tokens from the provided card/deck
|
||||
function removeTokensFromObject(object)
|
||||
local TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash")
|
||||
for _, obj in ipairs(searchLib.onObject(object)) do
|
||||
for _, obj in ipairs(searchLib.onObject(object, "isTileOrToken")) do
|
||||
if obj.getGUID() ~= "4ee1f2" and -- table
|
||||
obj ~= self and
|
||||
obj.type ~= "Deck" and
|
||||
obj.type ~= "Card" and
|
||||
obj.memo ~= nil and
|
||||
obj.getLock() == false and
|
||||
not tokenChecker.isChaosToken(obj) then
|
||||
|
@ -128,6 +128,8 @@ function onLoad(savedData)
|
||||
slotData = loadedData.slotData
|
||||
end
|
||||
|
||||
updateMessageColor(playerColor)
|
||||
|
||||
self.interactable = false
|
||||
|
||||
-- get object references to owned objects
|
||||
|
@ -30,7 +30,7 @@ do
|
||||
max_distance = maxDistance or 0
|
||||
})
|
||||
|
||||
-- filtering the result
|
||||
-- filter the result for matching objects
|
||||
local objList = {}
|
||||
for _, v in ipairs(searchResult) do
|
||||
if not filter or filterFunc(v.hit_object) then
|
||||
@ -47,22 +47,22 @@ do
|
||||
|
||||
-- searches the area on an object
|
||||
SearchLib.onObject = function(obj, filter)
|
||||
pos = obj.getPosition()
|
||||
size = obj.getBounds().size:setAt("y", 1)
|
||||
local pos = obj.getPosition()
|
||||
local size = obj.getBounds().size:setAt("y", 1)
|
||||
return returnSearchResult(pos, _, size, filter)
|
||||
end
|
||||
|
||||
-- searches the specified position (a single point)
|
||||
SearchLib.atPosition = function(pos, filter)
|
||||
size = { 0.1, 2, 0.1 }
|
||||
local size = { 0.1, 2, 0.1 }
|
||||
return returnSearchResult(pos, _, size, filter)
|
||||
end
|
||||
|
||||
-- searches below the specified position (downwards until y = 0)
|
||||
SearchLib.belowPosition = function(pos, filter)
|
||||
size = { 0.1, 2, 0.1 }
|
||||
direction = { 0, -1, 0 }
|
||||
maxDistance = pos.y
|
||||
local size = { 0.1, 2, 0.1 }
|
||||
local direction = { 0, -1, 0 }
|
||||
local maxDistance = pos.y
|
||||
return returnSearchResult(pos, _, size, filter, direction, maxDistance)
|
||||
end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user