Merge pull request #298 from argonui/featured-content

Replacing featured content with placeholder boxes
This commit is contained in:
Chr1Z 2023-06-21 09:27:09 +02:00 committed by GitHub
commit c78ddec973
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3172 changed files with 155 additions and 149478 deletions

View File

@ -196,11 +196,10 @@
"OptionPanelSource.830bd0",
"SoundCube.3c988f",
"GameKeyHandler.fce69c",
"ArkhamSCE310-4202023-Page1.e1b8df",
"3DText.d628cc",
"NavigationOverlayHandler.797ede",
"TheColourOutofOz.be7d21",
"Bloodborne-CityoftheUnseen0175.81651b"
"Bloodborne-CityoftheUnseen.1e7a0b",
"TheColorOutofOz.806d9a"
],
"PlayArea": 1,
"PlayerCounts": [

View File

@ -75,6 +75,10 @@
{
"displayed": "SoundCube",
"normalized": "soundcube"
},
{
"displayed": "CameraZoom_ignore",
"normalized": "camerazoom_ignore"
}
]
}

View File

@ -39,9 +39,9 @@
},
"Tooltip": true,
"Transform": {
"posX": -19.567,
"posX": -19.5,
"posY": 1.697,
"posZ": -83.387,
"posZ": -84,
"rotX": 90,
"rotY": 90,
"rotZ": 0,

View File

@ -1,272 +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.1.0! This update didn't coincide with any particular official release, but contains a variety of quality of life additions and feature updates.\n\n- Additionally, many fan-created scenarios have been added or updated since the previous release, though they are also available in version 3.0 via the download menu.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "e1b8df",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.1.0 - 4/20/2023 - Page 1",
"Snap": true,
"States": {
"2": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Added \"The Color Out of Oz\" campaign by The Beard!\n- Added \"Bloodborne - City of the Unseen\" campaign by aughhh!\n- Updated the following fan campaigns: Jumanji, Cyclopean Foundations, Alice in Wonderland, War of the Worlds, The Ghosts of Onigawa",
"DragSelectable": true,
"GMNotes": "",
"GUID": "8c87c5",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.1.0 - 4/20/2023 - Page 2",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.999,
"posY": 1.55149889,
"posZ": -71,
"rotX": 1.00740074e-8,
"rotY": 90.00001,
"rotZ": 2.83212813e-8,
"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": "- Updated the following fan scenarios: The Fall of the House of Usher, Arkham Incidents, The Legend of Sleepy Hollow, The Symphony of Erich Zann, The Strange Case of Dr. Jekyll and Mr. Hyde\n- The token remover has been cloned and repositioned for easier convenience.\n- The Threat Area discard buttons should now be easier to click.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "179ecc",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.1.0 - 4/20/2023 - Page 3",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.999,
"posY": 1.55149889,
"posZ": -71,
"rotX": 1.5388661e-8,
"rotY": 90.00001,
"rotZ": 3.046174e-8,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
},
"4": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Updated Victory Display (now with automatic counting!)\n- Added metadata to Chaos Tokens.\n- Added right-click menu options to Family Inheritance.\n-Action Tokens are now colorblind-friendly!\n- Right-clicking the Token Arranger now shows new options related to percentages, odds, and the like.\n",
"DragSelectable": true,
"GMNotes": "",
"GUID": "5f2454",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.1.0 - 4/20/2023 - Page 4",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.999,
"posY": 1.55149889,
"posZ": -71,
"rotX": 2.18157421e-8,
"rotY": 90.00001,
"rotZ": 3.849087e-8,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
},
"5": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Added support for player color customization. Right-click the upkeep button to change a mat's color.\n- Scenario splash screen and cleanup helper now play a short sound when activated!\n- Discarding a card with tokens on it now automatically moves those tokens to the trash can.\n- Misc. bug/load time fixes.\n",
"DragSelectable": true,
"GMNotes": "",
"GUID": "e34bd9",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.1.0 - 4/20/2023 - Page 5",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.999,
"posY": 1.55149889,
"posZ": -71,
"rotX": 1.48446917e-8,
"rotY": 90.00001,
"rotZ": 2.35103439e-8,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
},
"6": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Added FFG's buyers guide to campaign area to make choosing a campaign easier for new players.\n- Added more Hotkeys! Click Options \u003e Game Keys to find them.\n- Thank you to everyone for not only using the mod but continuing to provide both custom content and your own personal touches for everyone to enjoy!",
"DragSelectable": true,
"GMNotes": "",
"GUID": "2fc1cd",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.1.0 - 4/20/2023 - Page 6",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.999,
"posY": 1.55149889,
"posZ": -71,
"rotX": 2.34638939e-8,
"rotY": 90.00001,
"rotZ": 3.195196e-8,
"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": ""
}

View File

@ -5,28 +5,12 @@
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"a": 0.27451,
"b": 1,
"g": 1,
"r": 1
},
"ContainedObjects_order": [
"2FeartheOldBlood.022ddf",
"BloodborneCustomDataHelper.3e1dd7",
"4TheFrailtyofMen.4117f5",
"3NightUnending.5c4cb0",
"5TheAltarofDespair.9b4b47",
"6ACallBeyond.c09838",
"1TheHuntBegins.dc507f",
"7Communion.ddd5dd",
"8ArkhamSunrise.e5283d",
"GenericCampaignLog.eda22b",
"Custom_PDF.ee98ef"
],
"ContainedObjects_path": "Bloodborne-CityoftheUnseen0175.81651b",
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_COL.obj",
@ -45,12 +29,12 @@
"MaterialIndex": 3,
"MeshURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj",
"NormalURL": "",
"TypeIndex": 6
"TypeIndex": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "81651b",
"GMNotes": "fancreations/campaign_bloodborne.json",
"GUID": "1e7a0b",
"Grid": true,
"GridProjection": false,
"Hands": false,
@ -58,26 +42,27 @@
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState_path": "Bloodborne-CityoftheUnseen0175.81651b.luascriptstate",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b.ttslua",
"MaterialIndex": -1,
"LuaScript": "require(\"core/DownloadBox\")",
"LuaScriptState": "",
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Custom_Model_Bag",
"Nickname": "Bloodborne - City of the Unseen 0.175",
"Name": "Custom_Model",
"Nickname": "Bloodborne - City of the Unseen",
"Snap": true,
"Sticky": true,
"Tags": [
"LargeBox"
],
"Tooltip": true,
"Transform": {
"posX": -27,
"posY": 1.485,
"posZ": -87.876,
"posX": -26.696,
"posY": 1.486,
"posZ": -90,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.89,
"scaleY": 0.12,
"scaleZ": 0.89
"scaleX": 1,
"scaleY": 0.14,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""

View File

@ -1 +0,0 @@
{"ml":{"022ddf":{"lock":false,"pos":{"x":15.7169742584229,"y":1.48149907588959,"z":21.2904376983643},"rot":{"x":-5.2979416409471E-08,"y":270,"z":-3.22966599242136E-07}},"3e1dd7":{"lock":false,"pos":{"x":-2.91630053520203,"y":1.63292264938354,"z":-15.1114053726196},"rot":{"x":-2.96886923933926E-07,"y":269.995788574219,"z":1.26109523534979E-06}},"4117f5":{"lock":false,"pos":{"x":15.7379760742188,"y":1.48149907588959,"z":4.49971151351929},"rot":{"x":1.48999617977097E-07,"y":269.998046875,"z":-2.72232512088522E-07}},"5c4cb0":{"lock":false,"pos":{"x":15.6802940368652,"y":1.48149919509888,"z":12.7662420272827},"rot":{"x":-8.87630093870939E-08,"y":269.998413085938,"z":-1.19237753892776E-07}},"8f6217":{"lock":false,"pos":{"x":-3.33288478851318,"y":1.63292276859283,"z":-14.3457317352295},"rot":{"x":-6.63845048620715E-06,"y":269.995880126953,"z":-4.41622978542E-06}},"9b4b47":{"lock":false,"pos":{"x":15.6301212310791,"y":1.48149907588959,"z":-3.92243099212646},"rot":{"x":-8.54166088970487E-08,"y":270.00390625,"z":-1.37598135552253E-07}},"b25aaf":{"lock":false,"pos":{"x":5.4363,"y":1.2647,"z":53.8483},"rot":{"x":0.0315,"y":270.0007,"z":0.0168}},"c09838":{"lock":false,"pos":{"x":15.5783252716064,"y":1.4814989566803,"z":-11.751425743103},"rot":{"x":3.31483448690051E-07,"y":270.015075683594,"z":2.14096615991366E-08}},"dc507f":{"lock":false,"pos":{"x":15.6832981109619,"y":1.48149919509888,"z":29.4188995361328},"rot":{"x":-4.61894416048381E-08,"y":270.000030517578,"z":-5.33786419509852E-07}},"ddd5dd":{"lock":false,"pos":{"x":15.6398334503174,"y":1.48149907588959,"z":-19.8568859100342},"rot":{"x":1.44437620974713E-07,"y":270.00830078125,"z":9.74452404989279E-07}},"e5283d":{"lock":false,"pos":{"x":15.70823097229,"y":1.48149919509888,"z":-28.1495018005371},"rot":{"x":1.33962146264821E-07,"y":270.018798828125,"z":-8.9481960685589E-07}},"eda22b":{"lock":false,"pos":{"x":35.2372741699219,"y":1.58149898052216,"z":-14.4016141891479},"rot":{"x":3.23336344365543E-08,"y":269.984985351563,"z":2.46333769382545E-07}},"ee98ef":{"lock":false,"pos":{"x":36.8274078369141,"y":1.48149931430817,"z":13.9191246032715},"rot":{"x":-9.27476762058177E-09,"y":269.972564697266,"z":2.38507293914836E-08}}}}

View File

@ -1,503 +0,0 @@
-- Utility memory bag by Directsun
-- Version 2.5.2
-- Fork of Memory Bag 2.0 by MrStump
function updateSave()
local data_to_save = {["ml"]=memoryList}
saved_data = JSON.encode(data_to_save)
self.script_state = saved_data
end
function combineMemoryFromBagsWithin()
local bagObjList = self.getObjects()
for _, bagObj in ipairs(bagObjList) do
local data = bagObj.lua_script_state
if data ~= nil then
local j = JSON.decode(data)
if j ~= nil and j.ml ~= nil then
for guid, entry in pairs(j.ml) do
memoryList[guid] = entry
end
end
end
end
end
function updateMemoryWithMoves()
memoryList = memoryListBackup
--get the first transposed object's coordinates
local obj = getObjectFromGUID(moveGuid)
-- p1 is where needs to go, p2 is where it was
local refObjPos = memoryList[moveGuid].pos
local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil)
local movedRotation = obj.getRotation()
for guid, entry in pairs(memoryList) do
memoryList[guid].pos.x = entry.pos.x - deltaPos.x
memoryList[guid].pos.y = entry.pos.y - deltaPos.y
memoryList[guid].pos.z = entry.pos.z - deltaPos.z
-- memoryList[guid].rot.x = movedRotation.x
-- memoryList[guid].rot.y = movedRotation.y
-- memoryList[guid].rot.z = movedRotation.z
end
--theList[obj.getGUID()] = {
-- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
-- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
-- lock=obj.getLock()
--}
moveList = {}
end
function onload(saved_data)
fresh = true
if saved_data ~= "" then
local loaded_data = JSON.decode(saved_data)
--Set up information off of loaded_data
memoryList = loaded_data.ml
else
--Set up information for if there is no saved saved data
memoryList = {}
end
moveList = {}
moveGuid = nil
if next(memoryList) == nil then
createSetupButton()
else
fresh = false
createMemoryActionButtons()
end
end
--Beginning Setup
--Make setup button
function createSetupButton()
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
end
--Triggered by Transpose button
function buttonClick_transpose()
moveGuid = nil
broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1})
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
moveList = {}
self.clearButtons()
createButtonsOnAllObjects(true)
createSetupActionButtons(true)
end
--Triggered by setup button,
function buttonClick_setup()
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
self.clearButtons()
createButtonsOnAllObjects(false)
createSetupActionButtons(false)
end
function getAllObjectsInMemory()
local objTable = {}
local curObj = {}
for guid in pairs(memoryListBackup) do
curObj = getObjectFromGUID(guid)
table.insert(objTable, curObj)
end
return objTable
-- return getAllObjects()
end
--Creates selection buttons on objects
function createButtonsOnAllObjects(move)
local howManyButtons = 0
local objsToHaveButtons = {}
if move == true then
objsToHaveButtons = getAllObjectsInMemory()
else
objsToHaveButtons = getAllObjects()
end
for _, obj in ipairs(objsToHaveButtons) do
if obj ~= self then
local dummyIndex = howManyButtons
--On a normal bag, the button positions aren't the same size as the bag.
globalScaleFactor = 1 * 1/self.getScale().x
--Super sweet math to set button positions
local selfPos = self.getPosition()
local objPos = obj.getPosition()
local deltaPos = findOffsetDistance(selfPos, objPos, obj)
local objPos = rotateLocalCoordinates(deltaPos, self)
objPos.x = -objPos.x * globalScaleFactor
objPos.y = objPos.y * globalScaleFactor + 4
objPos.z = objPos.z * globalScaleFactor
--Offset rotation of bag
local rot = self.getRotation()
rot.y = -rot.y + 180
--Create function
local funcName = "selectButton_" .. howManyButtons
local func = function() buttonClick_selection(dummyIndex, obj, move) end
local color = {0.75,0.25,0.25,0.6}
local colorMove = {0,0,1,0.6}
if move == true then
color = colorMove
end
self.setVar(funcName, func)
self.createButton({
click_function=funcName, function_owner=self,
position=objPos, rotation=rot, height=1000, width=1000,
color=color,
})
howManyButtons = howManyButtons + 1
end
end
end
--Creates submit and cancel buttons
function createSetupActionButtons(move)
self.createButton({
label="Cancel", click_function="buttonClick_cancel", function_owner=self,
position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Submit", click_function="buttonClick_submit", function_owner=self,
position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
if move == false then
self.createButton({
label="Add", click_function="buttonClick_add", function_owner=self,
position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={0.25,1,0.25}
})
if fresh == false then
self.createButton({
label="Set New", click_function="buttonClick_setNew", function_owner=self,
position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={0.75,0.75,1}
})
self.createButton({
label="Remove", click_function="buttonClick_remove", function_owner=self,
position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,0.25,0.25}
})
end
end
self.createButton({
label="Reset", click_function="buttonClick_reset", function_owner=self,
position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
end
--During Setup
--Checks or unchecks buttons
function buttonClick_selection(index, obj, move)
local colorMove = {0,0,1,0.6}
local color = {0,1,0,0.6}
previousGuid = selectedGuid
selectedGuid = obj.getGUID()
theList = memoryList
if move == true then
theList = moveList
if previousGuid ~= nil and previousGuid ~= selectedGuid then
local prevObj = getObjectFromGUID(previousGuid)
prevObj.highlightOff()
self.editButton({index=previousIndex, color=colorMove})
theList[previousGuid] = nil
end
previousIndex = index
end
if theList[selectedGuid] == nil then
self.editButton({index=index, color=color})
--Adding pos/rot to memory table
local pos, rot = obj.getPosition(), obj.getRotation()
--I need to add it like this or it won't save due to indexing issue
theList[obj.getGUID()] = {
pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
lock=obj.getLock()
}
obj.highlightOn({0,1,0})
else
color = {0.75,0.25,0.25,0.6}
if move == true then
color = colorMove
end
self.editButton({index=index, color=color})
theList[obj.getGUID()] = nil
obj.highlightOff()
end
end
--Cancels selection process
function buttonClick_cancel()
memoryList = memoryListBackup
moveList = {}
self.clearButtons()
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
removeAllHighlights()
broadcastToAll("Selection Canceled", {1,1,1})
moveGuid = nil
end
--Saves selections
function buttonClick_submit()
fresh = false
if next(moveList) ~= nil then
for guid in pairs(moveList) do
moveGuid = guid
end
if memoryListBackup[moveGuid] == nil then
broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25})
else
broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1})
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(moveList) do
moveGuid = guid
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
updateMemoryWithMoves()
updateSave()
buttonClick_place()
end
elseif next(memoryList) == nil and moveGuid == nil then
memoryList = memoryListBackup
broadcastToAll("No selections made.", {0.75, 0.25, 0.25})
end
combineMemoryFromBagsWithin()
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
moveGuid = nil
end
function combineTables(first_table, second_table)
for k,v in pairs(second_table) do first_table[k] = v end
end
function buttonClick_add()
fresh = false
combineTables(memoryList, memoryListBackup)
broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25})
combineMemoryFromBagsWithin()
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
end
function buttonClick_remove()
broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25})
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
memoryListBackup[guid] = nil
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Removed", {1,1,1})
memoryList = memoryListBackup
updateSave()
end
function buttonClick_setNew()
broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1})
self.clearButtons()
createMemoryActionButtons()
local count = 0
for _, obj in ipairs(getAllObjects()) do
guid = obj.guid
if memoryListBackup[guid] ~= nil then
count = count + 1
memoryListBackup[guid].pos = obj.getPosition()
memoryListBackup[guid].rot = obj.getRotation()
memoryListBackup[guid].lock = obj.getLock()
end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
memoryList = memoryListBackup
updateSave()
end
--Resets bag to starting status
function buttonClick_reset()
fresh = true
memoryList = {}
self.clearButtons()
createSetupButton()
removeAllHighlights()
broadcastToAll("Tool Reset", {1,1,1})
updateSave()
end
--After Setup
--Creates recall and place buttons
function createMemoryActionButtons()
self.createButton({
label="Place", click_function="buttonClick_place", function_owner=self,
position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Recall", click_function="buttonClick_recall", function_owner=self,
position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200,
font_size=350, color={0,0,0}, font_color={1,1,1}
})
--- self.createButton({
--- label="Move", click_function="buttonClick_transpose", function_owner=self,
--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800,
--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1}
--- })
end
--Sends objects from bag/table to their saved position/rotation
function buttonClick_place()
local bagObjList = self.getObjects()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
--If obj is out on the table, move it to the saved pos/rot
if obj ~= nil then
obj.setPositionSmooth(entry.pos)
obj.setRotationSmooth(entry.rot)
obj.setLock(entry.lock)
else
--If obj is inside of the bag
for _, bagObj in ipairs(bagObjList) do
if bagObj.guid == guid then
local item = self.takeObject({
guid=guid, position=entry.pos, rotation=entry.rot, smooth=false
})
item.setLock(entry.lock)
break
end
end
end
end
broadcastToAll("Objects Placed", {1,1,1})
end
--Recalls objects to bag from table
function buttonClick_recall()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
if obj ~= nil then self.putObject(obj) end
end
broadcastToAll("Objects Recalled", {1,1,1})
end
--Utility functions
--Find delta (difference) between 2 x/y/z coordinates
function findOffsetDistance(p1, p2, obj)
local yOffset = 0
if obj ~= nil then
local bounds = obj.getBounds()
yOffset = (bounds.size.y - bounds.offset.y)
end
local deltaPos = {}
deltaPos.x = (p2.x-p1.x)
deltaPos.y = (p2.y-p1.y) + yOffset
deltaPos.z = (p2.z-p1.z)
return deltaPos
end
--Used to rotate a set of coordinates by an angle
function rotateLocalCoordinates(desiredPos, obj)
local objPos, objRot = obj.getPosition(), obj.getRotation()
local angle = math.rad(objRot.y)
local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
--return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z}
return {x=x, y=desiredPos.y, z=z}
end
function rotateMyCoordinates(desiredPos, obj)
local angle = math.rad(obj.getRotation().y)
local x = desiredPos.x * math.sin(angle)
local z = desiredPos.z * math.cos(angle)
return {x=x, y=desiredPos.y, z=z}
end
--Coroutine delay, in seconds
function wait(time)
local start = os.time()
repeat coroutine.yield(0) until os.time() > start + time
end
--Duplicates a table (needed to prevent it making reference to the same objects)
function duplicateTable(oldTable)
local newTable = {}
for k, v in pairs(oldTable) do
newTable[k] = v
end
return newTable
end
--Moves scripted highlight from all objects
function removeAllHighlights()
for _, obj in ipairs(getAllObjects()) do
obj.highlightOff()
end
end
--Round number (num) to the Nth decimal (dec)
function round(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end

View File

@ -1,115 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"AttachedDecals": [
{
"CustomDecal": {
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/",
"Name": "dunwich_back",
"Size": 7.4
},
"Transform": {
"posX": -0.0021877822,
"posY": -0.08963572,
"posZ": -0.00288731651,
"rotX": 270,
"rotY": 359.869568,
"rotZ": 0,
"scaleX": 2.00000215,
"scaleY": 2.00000238,
"scaleZ": 2.00000262
}
}
],
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"ContainedObjects_order": [
"Custom_Token.00d19a",
"Act4Locations.0f2322",
"Act2Locations.1536ba",
"EncounterDeck.34612f",
"1stFloorExaminationRoom.46e21c",
"StandardChaosBag.692b4c",
"HardChaosBag.753dc1",
"ActInstructions.756370",
"TheHuntBegins.75776f",
"Deck.87cb2b",
"BloodborneCustomDataHelper.8f6217",
"Act3Locations.948eb7",
"Custom_Token.9743de",
"Set-aside.d53ea1",
"2RandomizedActDecks.dde0e5",
"ScourgeBeast.e00002",
"1stFloorSickroom.e00003",
"GuidanceTheHuntersWorkshop.e00007",
"HospitalCourtyard.e00008",
"1stFloorExaminationRoom.e1ae2e",
"EasyChaosBag.f4ca98",
"ExpertChaosBag.fb475c"
],
"ContainedObjects_path": "1TheHuntBegins.dc507f",
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "https://i.imgur.com/k8xq6L9.jpghttps://i.imgur.com/k8xq6L9.jpg",
"MaterialIndex": 3,
"MeshURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj",
"NormalURL": "",
"TypeIndex": 6
},
"Description": "Bloodborne: City of the Unseen",
"DragSelectable": true,
"GMNotes": "",
"GUID": "dc507f",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f.luascriptstate",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Custom_Model_Bag",
"Nickname": "1: The Hunt Begins",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 15.683,
"posY": 1.481,
"posZ": 29.419,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 2.21,
"scaleY": 0.46,
"scaleZ": 2.42
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"ml":{"00d19a":{"lock":false,"pos":{"x":-39.7672,"y":1.67,"z":7.9618},"rot":{"x":0.0002,"y":269.9788,"z":0}},"0f2322":{"lock":false,"pos":{"x":8.7321,"y":1.2965,"z":0.1816},"rot":{"x":0,"y":89.9991,"z":0}},"1536ba":{"lock":false,"pos":{"x":8.6312,"y":1.2965,"z":8.8675},"rot":{"x":0,"y":89.9994,"z":0}},"34612f":{"lock":false,"pos":{"x":-3.9279,"y":1.6858,"z":5.7575},"rot":{"x":0,"y":270.0131,"z":180}},"46e21c":{"lock":false,"pos":{"x":-43.4051,"y":1.5542,"z":9.0918},"rot":{"x":0,"y":270.001,"z":178.9224}},"692b4c":{"lock":false,"pos":{"x":1.9417,"y":1.4851,"z":-30.657},"rot":{"x":0,"y":270.0031,"z":0}},"753dc1":{"lock":false,"pos":{"x":-6.6711,"y":1.4851,"z":-23.4221},"rot":{"x":0,"y":269.9731,"z":0}},"756370":{"lock":false,"pos":{"x":-11.5784,"y":1.59,"z":-10.099},"rot":{"x":0,"y":90,"z":0}},"75776f":{"lock":false,"pos":{"x":-3.9561,"y":1.5966,"z":-10.4416},"rot":{"x":0,"y":270.0182,"z":0}},"87cb2b":{"lock":false,"pos":{"x":-2.725,"y":1.6184,"z":0.373},"rot":{"x":0,"y":270,"z":0}},"8f6217":{"lock":false,"pos":{"x":-3.3329,"y":1.6329,"z":-14.3457},"rot":{"x":0,"y":269.9959,"z":0}},"948eb7":{"lock":false,"pos":{"x":8.6252,"y":1.2965,"z":4.2394},"rot":{"x":0,"y":89.999,"z":0}},"9743de":{"lock":false,"pos":{"x":-40.0127,"y":1.67,"z":4.1909},"rot":{"x":0,"y":315.0388,"z":0}},"d53ea1":{"lock":false,"pos":{"x":1.6962,"y":1.558,"z":14.279},"rot":{"x":0,"y":225.0085,"z":0}},"dde0e5":{"lock":false,"pos":{"x":0.9642,"y":1.398,"z":-5.0598},"rot":{"x":0,"y":89.9987,"z":0}},"e00002":{"lock":false,"pos":{"x":-43.3706,"y":1.5336,"z":3.8602},"rot":{"x":0,"y":269.9991,"z":0}},"e00003":{"lock":false,"pos":{"x":-36.84,"y":1.5336,"z":7.6495},"rot":{"x":0,"y":269.9999,"z":180}},"e00007":{"lock":false,"pos":{"x":-11.6925,"y":1.5698,"z":8.9233},"rot":{"x":0,"y":269.9993,"z":0}},"e00008":{"lock":false,"pos":{"x":-36.84,"y":1.5336,"z":0},"rot":{"x":0,"y":270.0002,"z":180}},"e1ae2e":{"lock":false,"pos":{"x":-43.4401,"y":1.5336,"z":7.6501},"rot":{"x":0.0002,"y":270.0018,"z":180.0013}},"f4ca98":{"lock":false,"pos":{"x":2.0196,"y":1.4851,"z":-23.9265},"rot":{"x":0,"y":270,"z":0}},"fb475c":{"lock":false,"pos":{"x":-6.5732,"y":1.4851,"z":-30.3557},"rot":{"x":0,"y":270,"z":0}}}}

View File

@ -1,504 +0,0 @@
-- Utility memory bag by Directsun
-- Version 2.5.2
-- Fork of Memory Bag 2.0 by MrStump
function updateSave()
local data_to_save = {["ml"]=memoryList}
saved_data = JSON.encode(data_to_save)
self.script_state = saved_data
end
function combineMemoryFromBagsWithin()
local bagObjList = self.getObjects()
for _, bagObj in ipairs(bagObjList) do
local data = bagObj.lua_script_state
if data ~= nil then
local j = JSON.decode(data)
if j ~= nil and j.ml ~= nil then
for guid, entry in pairs(j.ml) do
memoryList[guid] = entry
end
end
end
end
end
function updateMemoryWithMoves()
memoryList = memoryListBackup
--get the first transposed object's coordinates
local obj = getObjectFromGUID(moveGuid)
-- p1 is where needs to go, p2 is where it was
local refObjPos = memoryList[moveGuid].pos
local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil)
local movedRotation = obj.getRotation()
for guid, entry in pairs(memoryList) do
memoryList[guid].pos.x = entry.pos.x - deltaPos.x
memoryList[guid].pos.y = entry.pos.y - deltaPos.y
memoryList[guid].pos.z = entry.pos.z - deltaPos.z
-- memoryList[guid].rot.x = movedRotation.x
-- memoryList[guid].rot.y = movedRotation.y
-- memoryList[guid].rot.z = movedRotation.z
end
--theList[obj.getGUID()] = {
-- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
-- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
-- lock=obj.getLock()
--}
moveList = {}
end
function onload(saved_data)
fresh = true
if saved_data ~= "" then
local loaded_data = JSON.decode(saved_data)
--Set up information off of loaded_data
memoryList = loaded_data.ml
else
--Set up information for if there is no saved saved data
memoryList = {}
end
moveList = {}
moveGuid = nil
if next(memoryList) == nil then
createSetupButton()
else
fresh = false
createMemoryActionButtons()
end
end
--Beginning Setup
--Make setup button
function createSetupButton()
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
end
--Triggered by Transpose button
function buttonClick_transpose()
moveGuid = nil
broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1})
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
moveList = {}
self.clearButtons()
createButtonsOnAllObjects(true)
createSetupActionButtons(true)
end
--Triggered by setup button,
function buttonClick_setup()
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
self.clearButtons()
createButtonsOnAllObjects(false)
createSetupActionButtons(false)
end
function getAllObjectsInMemory()
local objTable = {}
local curObj = {}
for guid in pairs(memoryListBackup) do
curObj = getObjectFromGUID(guid)
table.insert(objTable, curObj)
end
return objTable
-- return getAllObjects()
end
--Creates selection buttons on objects
function createButtonsOnAllObjects(move)
local howManyButtons = 0
local objsToHaveButtons = {}
if move == true then
objsToHaveButtons = getAllObjectsInMemory()
else
objsToHaveButtons = getAllObjects()
end
for _, obj in ipairs(objsToHaveButtons) do
if obj ~= self then
local dummyIndex = howManyButtons
--On a normal bag, the button positions aren't the same size as the bag.
globalScaleFactor = 1 * 1/self.getScale().x
--Super sweet math to set button positions
local selfPos = self.getPosition()
local objPos = obj.getPosition()
local deltaPos = findOffsetDistance(selfPos, objPos, obj)
local objPos = rotateLocalCoordinates(deltaPos, self)
objPos.x = -objPos.x * globalScaleFactor
objPos.y = objPos.y * globalScaleFactor + 2
objPos.z = objPos.z * globalScaleFactor * 0.9
--Offset rotation of bag
local rot = self.getRotation()
rot.y = -rot.y + 180
--Create function
local funcName = "selectButton_" .. howManyButtons
local func = function() buttonClick_selection(dummyIndex, obj, move) end
local color = {0.75,0.25,0.25,0.6}
local colorMove = {0,0,1,0.6}
if move == true then
color = colorMove
end
self.setVar(funcName, func)
self.createButton({
click_function=funcName, function_owner=self,
position=objPos, rotation=rot, height=500, width=500,
color=color,
})
howManyButtons = howManyButtons + 1
end
end
end
--Creates submit and cancel buttons
function createSetupActionButtons(move)
self.createButton({
label="Cancel", click_function="buttonClick_cancel", function_owner=self,
position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Submit", click_function="buttonClick_submit", function_owner=self,
position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
if move == false then
self.createButton({
label="Add", click_function="buttonClick_add", function_owner=self,
position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550,
font_size=130, color={0,0,0}, font_color={0.25,1,0.25}
})
if fresh == false then
self.createButton({
label="Set New", click_function="buttonClick_setNew", function_owner=self,
position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550,
font_size=130, color={0,0,0}, font_color={0.75,0.75,1}
})
self.createButton({
label="Remove", click_function="buttonClick_remove", function_owner=self,
position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550,
font_size=130, color={0,0,0}, font_color={1,0.25,0.25}
})
end
end
self.createButton({
label="Reset", click_function="buttonClick_reset", function_owner=self,
position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
end
--During Setup
--Checks or unchecks buttons
function buttonClick_selection(index, obj, move)
local colorMove = {0,0,1,0.6}
local color = {0,1,0,0.6}
previousGuid = selectedGuid
selectedGuid = obj.getGUID()
theList = memoryList
if move == true then
theList = moveList
if previousGuid ~= nil and previousGuid ~= selectedGuid then
local prevObj = getObjectFromGUID(previousGuid)
prevObj.highlightOff()
self.editButton({index=previousIndex, color=colorMove})
theList[previousGuid] = nil
end
previousIndex = index
end
if theList[selectedGuid] == nil then
self.editButton({index=index, color=color})
--Adding pos/rot to memory table
local pos, rot = obj.getPosition(), obj.getRotation()
--I need to add it like this or it won't save due to indexing issue
theList[obj.getGUID()] = {
pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
lock=obj.getLock()
}
obj.highlightOn({0,1,0})
else
color = {0.75,0.25,0.25,0.6}
if move == true then
color = colorMove
end
self.editButton({index=index, color=color})
theList[obj.getGUID()] = nil
obj.highlightOff()
end
end
--Cancels selection process
function buttonClick_cancel()
memoryList = memoryListBackup
moveList = {}
self.clearButtons()
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
removeAllHighlights()
broadcastToAll("Selection Canceled", {1,1,1})
moveGuid = nil
end
--Saves selections
function buttonClick_submit()
fresh = false
if next(moveList) ~= nil then
for guid in pairs(moveList) do
moveGuid = guid
end
if memoryListBackup[moveGuid] == nil then
broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25})
else
broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1})
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(moveList) do
moveGuid = guid
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
updateMemoryWithMoves()
updateSave()
buttonClick_place()
end
elseif next(memoryList) == nil and moveGuid == nil then
memoryList = memoryListBackup
broadcastToAll("No selections made.", {0.75, 0.25, 0.25})
end
combineMemoryFromBagsWithin()
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
moveGuid = nil
end
function combineTables(first_table, second_table)
for k,v in pairs(second_table) do first_table[k] = v end
end
function buttonClick_add()
fresh = false
combineTables(memoryList, memoryListBackup)
broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25})
combineMemoryFromBagsWithin()
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
end
function buttonClick_remove()
broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25})
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
memoryListBackup[guid] = nil
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Removed", {1,1,1})
memoryList = memoryListBackup
updateSave()
end
function buttonClick_setNew()
broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1})
self.clearButtons()
createMemoryActionButtons()
local count = 0
for _, obj in ipairs(getAllObjects()) do
guid = obj.guid
if memoryListBackup[guid] ~= nil then
count = count + 1
memoryListBackup[guid].pos = obj.getPosition()
memoryListBackup[guid].rot = obj.getRotation()
memoryListBackup[guid].lock = obj.getLock()
end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
memoryList = memoryListBackup
updateSave()
end
--Resets bag to starting status
function buttonClick_reset()
fresh = true
memoryList = {}
self.clearButtons()
createSetupButton()
removeAllHighlights()
broadcastToAll("Tool Reset", {1,1,1})
updateSave()
end
--After Setup
--Creates recall and place buttons
function createMemoryActionButtons()
self.createButton({
label="Place", click_function="buttonClick_place", function_owner=self,
position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Recall", click_function="buttonClick_recall", function_owner=self,
position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500,
font_size=130, color={0,0,0}, font_color={1,1,1}
})
--- self.createButton({
--- label="Move", click_function="buttonClick_transpose", function_owner=self,
--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800,
--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1}
--- })
end
--Sends objects from bag/table to their saved position/rotation
function buttonClick_place()
local bagObjList = self.getObjects()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
--If obj is out on the table, move it to the saved pos/rot
if obj ~= nil then
obj.setPositionSmooth(entry.pos)
obj.setRotationSmooth(entry.rot)
obj.setLock(entry.lock)
else
--If obj is inside of the bag
for _, bagObj in ipairs(bagObjList) do
if bagObj.guid == guid then
local item = self.takeObject({
guid=guid, position=entry.pos, rotation=entry.rot, smooth=false
})
item.setLock(entry.lock)
break
end
end
end
end
broadcastToAll("Objects Placed", {1,1,1})
end
--Recalls objects to bag from table
function buttonClick_recall()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
if obj ~= nil then self.putObject(obj) end
end
broadcastToAll("Objects Recalled", {1,1,1})
end
--Utility functions
--Find delta (difference) between 2 x/y/z coordinates
function findOffsetDistance(p1, p2, obj)
local yOffset = 0
if obj ~= nil then
local bounds = obj.getBounds()
yOffset = (bounds.size.y - bounds.offset.y)
end
local deltaPos = {}
deltaPos.x = (p2.x-p1.x)
deltaPos.y = (p2.y-p1.y) + yOffset
deltaPos.z = (p2.z-p1.z)
return deltaPos
end
--Used to rotate a set of coordinates by an angle
function rotateLocalCoordinates(desiredPos, obj)
local objPos, objRot = obj.getPosition(), obj.getRotation()
local angle = math.rad(objRot.y)
local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
--return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z}
return {x=x, y=desiredPos.y, z=z}
end
function rotateMyCoordinates(desiredPos, obj)
local angle = math.rad(obj.getRotation().y)
local x = desiredPos.x * math.sin(angle)
local z = desiredPos.z * math.cos(angle)
return {x=x, y=desiredPos.y, z=z}
end
--Coroutine delay, in seconds
function wait(time)
local start = os.time()
repeat coroutine.yield(0) until os.time() > start + time
end
--Duplicates a table (needed to prevent it making reference to the same objects)
function duplicateTable(oldTable)
local newTable = {}
for k, v in pairs(oldTable) do
newTable[k] = v
end
return newTable
end
--Moves scripted highlight from all objects
function removeAllHighlights()
for _, obj in ipairs(getAllObjects()) do
obj.highlightOff()
end
end
--Round number (num) to the Nth decimal (dec)
function round(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"ad7f6e89-57fb-4b87-a642-1e8d97190292","type":"Location","class":"Mythos","traits":"Clinic","locationFront":{"icons":"Triangle","connections":"Circle|Square","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"Triangle","connections":"Circle|Square"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1001": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/6exonLu.jpg",
"FaceURL": "https://i.imgur.com/luQ5i4S.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Diagnosis: Terminal",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/1stFloorExaminationRoom.46e21c.gmnotes",
"GUID": "46e21c",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "1st Floor Examination Room",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -43.405,
"posY": 1.554,
"posZ": 9.092,
"rotX": 0,
"rotY": 270,
"rotZ": 179,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"3a052131-e718-47fd-a43c-6fb7d982f200","type":"Location","class":"Mythos","traits":"Clinic","locationFront":{"icons":"Triangle","connections":"Circle|Square","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"Triangle","connections":"Circle|Square"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100000,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1000": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/aJqcDAR.jpg",
"FaceURL": "https://i.imgur.com/i8JMwkS.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Diagnosis: Disastrous",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/1stFloorExaminationRoom.e1ae2e.gmnotes",
"GUID": "e1ae2e",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "1st Floor Examination Room",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -43.44,
"posY": 1.534,
"posZ": 7.65,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"e008f9a1-c63e-4b8a-8ba1-5e8b2bf90eb9","type":"Location","class":"Mythos","traits":"Clinic","locationFront":{"icons":"Circle","connections":"Triangle|Square","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}]},"locationBack":{"icons":"Circle","connections":"Triangle|Square"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1002": {
"BackIsHidden": true,
"BackURL": "https://i.ibb.co/KDQTGtw/5f537d852c6a.jpg",
"FaceURL": "https://i.ibb.co/dsYv1G8/91c68c31f40c.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/1stFloorSickroom.e00003.gmnotes",
"GUID": "e00003",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "1st Floor Sickroom",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -36.84,
"posY": 1.534,
"posZ": 7.65,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,55 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 0,
"g": 0.36652,
"r": 0.70588
},
"ContainedObjects_order": [
"Deck.6d2f9f",
"Deck.ff5b4f"
],
"ContainedObjects_path": "2RandomizedActDecks.dde0e5",
"Description": "Shuffle and choose 1",
"DragSelectable": true,
"GMNotes": "",
"GUID": "dde0e5",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState": "{\"ml\":[]}",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Bag",
"Nickname": "2 Randomized Act Decks",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 0.964,
"posY": 1.398,
"posZ": -5.06,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,274 +0,0 @@
function updateSave()
local data_to_save = {["ml"]=memoryList}
saved_data = JSON.encode(data_to_save)
self.script_state = saved_data
end
function onload(saved_data)
if saved_data ~= "" then
local loaded_data = JSON.decode(saved_data)
--Set up information off of loaded_data
memoryList = loaded_data.ml
else
--Set up information for if there is no saved saved data
memoryList = {}
end
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
end
--Beginning Setup
--Make setup button
function createSetupButton()
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Triggered by setup button,
function buttonClick_setup()
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
self.clearButtons()
createButtonsOnAllObjects()
createSetupActionButtons()
end
--Creates selection buttons on objects
function createButtonsOnAllObjects()
local howManyButtons = 0
for _, obj in ipairs(getAllObjects()) do
if obj ~= self then
local dummyIndex = howManyButtons
--On a normal bag, the button positions aren't the same size as the bag.
globalScaleFactor = 1.25 * 1/self.getScale().x
--Super sweet math to set button positions
local selfPos = self.getPosition()
local objPos = obj.getPosition()
local deltaPos = findOffsetDistance(selfPos, objPos, obj)
local objPos = rotateLocalCoordinates(deltaPos, self)
objPos.x = -objPos.x * globalScaleFactor
objPos.y = objPos.y * globalScaleFactor
objPos.z = objPos.z * globalScaleFactor
--Offset rotation of bag
local rot = self.getRotation()
rot.y = -rot.y + 180
--Create function
local funcName = "selectButton_" .. howManyButtons
local func = function() buttonClick_selection(dummyIndex, obj) end
self.setVar(funcName, func)
self.createButton({
click_function=funcName, function_owner=self,
position=objPos, rotation=rot, height=1000, width=1000,
color={0.75,0.25,0.25,0.6},
})
howManyButtons = howManyButtons + 1
end
end
end
--Creates submit and cancel buttons
function createSetupActionButtons()
self.createButton({
label="Cancel", click_function="buttonClick_cancel", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Submit", click_function="buttonClick_submit", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Reset", click_function="buttonClick_reset", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--During Setup
--Checks or unchecks buttons
function buttonClick_selection(index, obj)
local color = {0,1,0,0.6}
if memoryList[obj.getGUID()] == nil then
self.editButton({index=index, color=color})
--Adding pos/rot to memory table
local pos, rot = obj.getPosition(), obj.getRotation()
--I need to add it like this or it won't save due to indexing issue
memoryList[obj.getGUID()] = {
pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
lock=obj.getLock()
}
obj.highlightOn({0,1,0})
else
color = {0.75,0.25,0.25,0.6}
self.editButton({index=index, color=color})
memoryList[obj.getGUID()] = nil
obj.highlightOff()
end
end
--Cancels selection process
function buttonClick_cancel()
memoryList = memoryListBackup
self.clearButtons()
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
removeAllHighlights()
broadcastToAll("Selection Canceled", {1,1,1})
end
--Saves selections
function buttonClick_submit()
if next(memoryList) == nil then
broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25})
else
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
end
end
--Resets bag to starting status
function buttonClick_reset()
memoryList = {}
self.clearButtons()
createSetupButton()
removeAllHighlights()
broadcastToAll("Tool Reset", {1,1,1})
updateSave()
end
--After Setup
--Creates recall and place buttons
function createMemoryActionButtons()
self.createButton({
label="Place", click_function="buttonClick_place", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Recall", click_function="buttonClick_recall", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Sends objects from bag/table to their saved position/rotation
function buttonClick_place()
local bagObjList = self.getObjects()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
--If obj is out on the table, move it to the saved pos/rot
if obj ~= nil then
obj.setPositionSmooth(entry.pos)
obj.setRotationSmooth(entry.rot)
obj.setLock(entry.lock)
else
--If obj is inside of the bag
for _, bagObj in ipairs(bagObjList) do
if bagObj.guid == guid then
local item = self.takeObject({
guid=guid, position=entry.pos, rotation=entry.rot,
})
item.setLock(entry.lock)
break
end
end
end
end
broadcastToAll("Objects Placed", {1,1,1})
end
--Recalls objects to bag from table
function buttonClick_recall()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
if obj ~= nil then self.putObject(obj) end
end
broadcastToAll("Objects Recalled", {1,1,1})
end
--Utility functions
--Find delta (difference) between 2 x/y/z coordinates
function findOffsetDistance(p1, p2, obj)
local deltaPos = {}
local bounds = obj.getBounds()
deltaPos.x = (p2.x-p1.x)
deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y)
deltaPos.z = (p2.z-p1.z)
return deltaPos
end
--Used to rotate a set of coordinates by an angle
function rotateLocalCoordinates(desiredPos, obj)
local objPos, objRot = obj.getPosition(), obj.getRotation()
local angle = math.rad(objRot.y)
local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
--return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z}
return {x=x, y=desiredPos.y, z=z}
end
--Coroutine delay, in seconds
function wait(time)
local start = os.time()
repeat coroutine.yield(0) until os.time() > start + time
end
--Duplicates a table (needed to prevent it making reference to the same objects)
function duplicateTable(oldTable)
local newTable = {}
for k, v in pairs(oldTable) do
newTable[k] = v
end
return newTable
end
--Moves scripted highlight from all objects
function removeAllHighlights()
for _, obj in ipairs(getAllObjects()) do
obj.highlightOff()
end
end
--Round number (num) to the Nth decimal (dec)
function round(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end

View File

@ -1,100 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"ContainedObjects_order": [
"TheBeastandtheCrow.9565f5",
"ViolasWish.e00001",
"TheCityoftheUnseen.e00006",
"MoonlitRevival.f8d218"
],
"ContainedObjects_path": "Deck.6d2f9f",
"CustomDeck": {
"1002": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/3vXhKtC.jpg",
"FaceURL": "https://i.imgur.com/6RYzw7k.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"1005": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/LYEA9t5.jpg",
"FaceURL": "https://i.imgur.com/8rVX43C.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"2947": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/G82PtRN.jpg",
"FaceURL": "https://i.imgur.com/HjjMria.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"2948": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/RG4A0Vx.jpg",
"FaceURL": "https://i.imgur.com/fd8eJPo.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"DeckIDs": [
100200,
294800,
100500,
294700
],
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "6d2f9f",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Deck",
"Nickname": "",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -7.867,
"posY": 2.633,
"posZ": -2.993,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"37ef9de9-cfd7-4497-a497-95bba42b229c","type":"Act","class":"Mythos","clueThresholdPerInvestigator":2}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 294700,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"2947": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/G82PtRN.jpg",
"FaceURL": "https://i.imgur.com/HjjMria.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.6d2f9f/MoonlitRevival.f8d218.gmnotes",
"GUID": "f8d218",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Moonlit Revival",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -9.608,
"posY": 1.565,
"posZ": 21.68,
"rotX": 0,
"rotY": 270,
"rotZ": 1,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"2eba5389-3bec-4731-ae86-a3cccf5befc4","type":"Act","class":"Mythos"}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1002": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/3vXhKtC.jpg",
"FaceURL": "https://i.imgur.com/6RYzw7k.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.6d2f9f/TheBeastandtheCrow.9565f5.gmnotes",
"GUID": "9565f5",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "The Beast and the Crow",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -9.264,
"posY": 1.515,
"posZ": 20.588,
"rotX": 0,
"rotY": 270,
"rotZ": 359,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"92df66ca-42f8-4a56-a76e-fa1f533b6412","type":"Act","class":"Mythos","clueThresholdPerInvestigator":3}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1005": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/LYEA9t5.jpg",
"FaceURL": "https://i.imgur.com/8rVX43C.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.6d2f9f/TheCityoftheUnseen.e00006.gmnotes",
"GUID": "e00006",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "The City of the Unseen",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -9.792,
"posY": 1.495,
"posZ": 21.428,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"44ab088b-b5cf-4bf2-8978-f77d46621fe2","type":"Act","class":"Mythos"}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 294800,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"2948": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/RG4A0Vx.jpg",
"FaceURL": "https://i.imgur.com/fd8eJPo.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.6d2f9f/ViolasWish.e00001.gmnotes",
"GUID": "e00001",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Viola's Wish",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -9.728,
"posY": 1.537,
"posZ": 25.832,
"rotX": 2,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,100 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"ContainedObjects_order": [
"TheBeastandtheCrow.e00003",
"AFellowOutsider.d6d915",
"TheCityoftheUnseen.e00005",
"MoonlitRevival.db5045"
],
"ContainedObjects_path": "Deck.ff5b4f",
"CustomDeck": {
"1001": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/hP9ZFAL.jpg",
"FaceURL": "https://i.imgur.com/0ExgYIE.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"1002": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/3vXhKtC.jpg",
"FaceURL": "https://i.imgur.com/6RYzw7k.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"2946": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/tgSoJU9.jpg",
"FaceURL": "https://i.imgur.com/m0uoYSB.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"2947": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/G82PtRN.jpg",
"FaceURL": "https://i.imgur.com/HjjMria.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"DeckIDs": [
100200,
100100,
294600,
294700
],
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "ff5b4f",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Deck",
"Nickname": "",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -6.805,
"posY": 2.739,
"posZ": -0.183,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"8cd501dd-28d3-4777-b074-c4b7ea67c2ac","type":"Act","class":"Mythos"}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1001": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/hP9ZFAL.jpg",
"FaceURL": "https://i.imgur.com/0ExgYIE.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.ff5b4f/AFellowOutsider.d6d915.gmnotes",
"GUID": "d6d915",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "A Fellow Outsider",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -7.26,
"posY": 1.522,
"posZ": 26.276,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"37ef9de9-cfd7-4497-a497-95bba42b229c","type":"Act","class":"Mythos","clueThresholdPerInvestigator":2}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 294700,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"2947": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/G82PtRN.jpg",
"FaceURL": "https://i.imgur.com/HjjMria.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.ff5b4f/MoonlitRevival.db5045.gmnotes",
"GUID": "db5045",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Moonlit Revival",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -7.894,
"posY": 1.586,
"posZ": 26.424,
"rotX": 1,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"2eba5389-3bec-4731-ae86-a3cccf5befc4","type":"Act","class":"Mythos"}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1002": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/3vXhKtC.jpg",
"FaceURL": "https://i.imgur.com/6RYzw7k.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.ff5b4f/TheBeastandtheCrow.e00003.gmnotes",
"GUID": "e00003",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "The Beast and the Crow",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -9.552,
"posY": 1.581,
"posZ": 30.585,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"6e87aec9-d1dc-4f7e-a02d-d57763187fb2","type":"Act","class":"Mythos","clueThresholdPerInvestigator":3}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 294600,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"2946": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/tgSoJU9.jpg",
"FaceURL": "https://i.imgur.com/m0uoYSB.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/2RandomizedActDecks.dde0e5/Deck.ff5b4f/TheCityoftheUnseen.e00005.gmnotes",
"GUID": "e00005",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "The City of the Unseen",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -10.007,
"posY": 1.509,
"posZ": 25.39,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,64 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 0,
"g": 0.36652,
"r": 0.70588
},
"ContainedObjects_order": [
"CityCenterPlaza.e00005",
"MoonlitBackstreet.e0000a",
"MoonlitBackstreet.e0000b",
"CentralYharnamPromenade.e00009",
"Custom_Token.623f5d",
"Custom_Token.7607f6",
"Custom_Token.c586ae",
"OminousPyre.e0000d",
"OminousPyre.e0000e",
"Custom_Token.edc175",
"UndertheGreatBridge.e00010"
],
"ContainedObjects_path": "Act2Locations.1536ba",
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "1536ba",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba.luascriptstate",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Bag",
"Nickname": "Act 2 Locations",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 8.631,
"posY": 1.296,
"posZ": 8.868,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"ml":{"623f5d":{"lock":false,"pos":{"x":-29.0608,"y":1.67,"z":-3.6068},"rot":{"x":0,"y":270.0327,"z":0}},"7607f6":{"lock":false,"pos":{"x":-31.4295,"y":1.67,"z":-3.5486},"rot":{"x":0.0001,"y":265.377,"z":0}},"c586ae":{"lock":false,"pos":{"x":-26.8369,"y":1.67,"z":-7.4542},"rot":{"x":0,"y":269.9879,"z":0}},"e00005":{"lock":false,"pos":{"x":-30.24,"y":1.5336,"z":0},"rot":{"x":0,"y":270.0001,"z":180}},"e00009":{"lock":false,"pos":{"x":-30.2243,"y":1.5336,"z":-7.7},"rot":{"x":0,"y":270.0002,"z":180}},"e0000a":{"lock":false,"pos":{"x":-36.7733,"y":1.5336,"z":-7.7},"rot":{"x":0,"y":269.9998,"z":180}},"e0000b":{"lock":false,"pos":{"x":-36.8727,"y":1.5336,"z":-9.9431},"rot":{"x":0,"y":270.0001,"z":180}},"e0000d":{"lock":false,"pos":{"x":-23.9161,"y":1.5512,"z":-6.2658},"rot":{"x":359.9058,"y":269.9944,"z":179.2075}},"e0000e":{"lock":false,"pos":{"x":-23.677,"y":1.5324,"z":-7.7002},"rot":{"x":0.0121,"y":269.9983,"z":180.0795}},"e00010":{"lock":false,"pos":{"x":-23.677,"y":1.5336,"z":-0.0301},"rot":{"x":0,"y":270.0001,"z":180}},"edc175":{"lock":false,"pos":{"x":-22.6636,"y":1.67,"z":-3.4805},"rot":{"x":0,"y":265.3784,"z":-0.0001}}}}

View File

@ -1,274 +0,0 @@
function updateSave()
local data_to_save = {["ml"]=memoryList}
saved_data = JSON.encode(data_to_save)
self.script_state = saved_data
end
function onload(saved_data)
if saved_data ~= "" then
local loaded_data = JSON.decode(saved_data)
--Set up information off of loaded_data
memoryList = loaded_data.ml
else
--Set up information for if there is no saved saved data
memoryList = {}
end
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
end
--Beginning Setup
--Make setup button
function createSetupButton()
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Triggered by setup button,
function buttonClick_setup()
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
self.clearButtons()
createButtonsOnAllObjects()
createSetupActionButtons()
end
--Creates selection buttons on objects
function createButtonsOnAllObjects()
local howManyButtons = 0
for _, obj in ipairs(getAllObjects()) do
if obj ~= self then
local dummyIndex = howManyButtons
--On a normal bag, the button positions aren't the same size as the bag.
globalScaleFactor = 1.25 * 1/self.getScale().x
--Super sweet math to set button positions
local selfPos = self.getPosition()
local objPos = obj.getPosition()
local deltaPos = findOffsetDistance(selfPos, objPos, obj)
local objPos = rotateLocalCoordinates(deltaPos, self)
objPos.x = -objPos.x * globalScaleFactor
objPos.y = objPos.y * globalScaleFactor
objPos.z = objPos.z * globalScaleFactor
--Offset rotation of bag
local rot = self.getRotation()
rot.y = -rot.y + 180
--Create function
local funcName = "selectButton_" .. howManyButtons
local func = function() buttonClick_selection(dummyIndex, obj) end
self.setVar(funcName, func)
self.createButton({
click_function=funcName, function_owner=self,
position=objPos, rotation=rot, height=1000, width=1000,
color={0.75,0.25,0.25,0.6},
})
howManyButtons = howManyButtons + 1
end
end
end
--Creates submit and cancel buttons
function createSetupActionButtons()
self.createButton({
label="Cancel", click_function="buttonClick_cancel", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Submit", click_function="buttonClick_submit", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Reset", click_function="buttonClick_reset", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--During Setup
--Checks or unchecks buttons
function buttonClick_selection(index, obj)
local color = {0,1,0,0.6}
if memoryList[obj.getGUID()] == nil then
self.editButton({index=index, color=color})
--Adding pos/rot to memory table
local pos, rot = obj.getPosition(), obj.getRotation()
--I need to add it like this or it won't save due to indexing issue
memoryList[obj.getGUID()] = {
pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
lock=obj.getLock()
}
obj.highlightOn({0,1,0})
else
color = {0.75,0.25,0.25,0.6}
self.editButton({index=index, color=color})
memoryList[obj.getGUID()] = nil
obj.highlightOff()
end
end
--Cancels selection process
function buttonClick_cancel()
memoryList = memoryListBackup
self.clearButtons()
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
removeAllHighlights()
broadcastToAll("Selection Canceled", {1,1,1})
end
--Saves selections
function buttonClick_submit()
if next(memoryList) == nil then
broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25})
else
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
end
end
--Resets bag to starting status
function buttonClick_reset()
memoryList = {}
self.clearButtons()
createSetupButton()
removeAllHighlights()
broadcastToAll("Tool Reset", {1,1,1})
updateSave()
end
--After Setup
--Creates recall and place buttons
function createMemoryActionButtons()
self.createButton({
label="Place", click_function="buttonClick_place", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Recall", click_function="buttonClick_recall", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Sends objects from bag/table to their saved position/rotation
function buttonClick_place()
local bagObjList = self.getObjects()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
--If obj is out on the table, move it to the saved pos/rot
if obj ~= nil then
obj.setPositionSmooth(entry.pos)
obj.setRotationSmooth(entry.rot)
obj.setLock(entry.lock)
else
--If obj is inside of the bag
for _, bagObj in ipairs(bagObjList) do
if bagObj.guid == guid then
local item = self.takeObject({
guid=guid, position=entry.pos, rotation=entry.rot,
})
item.setLock(entry.lock)
break
end
end
end
end
broadcastToAll("Objects Placed", {1,1,1})
end
--Recalls objects to bag from table
function buttonClick_recall()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
if obj ~= nil then self.putObject(obj) end
end
broadcastToAll("Objects Recalled", {1,1,1})
end
--Utility functions
--Find delta (difference) between 2 x/y/z coordinates
function findOffsetDistance(p1, p2, obj)
local deltaPos = {}
local bounds = obj.getBounds()
deltaPos.x = (p2.x-p1.x)
deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y)
deltaPos.z = (p2.z-p1.z)
return deltaPos
end
--Used to rotate a set of coordinates by an angle
function rotateLocalCoordinates(desiredPos, obj)
local objPos, objRot = obj.getPosition(), obj.getRotation()
local angle = math.rad(objRot.y)
local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
--return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z}
return {x=x, y=desiredPos.y, z=z}
end
--Coroutine delay, in seconds
function wait(time)
local start = os.time()
repeat coroutine.yield(0) until os.time() > start + time
end
--Duplicates a table (needed to prevent it making reference to the same objects)
function duplicateTable(oldTable)
local newTable = {}
for k, v in pairs(oldTable) do
newTable[k] = v
end
return newTable
end
--Moves scripted highlight from all objects
function removeAllHighlights()
for _, obj in ipairs(getAllObjects()) do
obj.highlightOff()
end
end
--Round number (num) to the Nth decimal (dec)
function round(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"98568c7c-8247-4fdb-b5c4-fec9befd55bb","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"Slash","connections":"Cross|Diamond|Hourglass","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"Slash","connections":"Cross|Diamond|Hourglass"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100800,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1008": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/QHSZ7Xy.jpg",
"FaceURL": "https://i.imgur.com/Ojfrv7q.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/CentralYharnamPromenade.e00009.gmnotes",
"GUID": "e00009",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Central Yharnam Promenade",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -30.224,
"posY": 1.534,
"posZ": -7.7,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"0bd6be78-4c1c-40ff-bf3d-71474253cfdf","type":"Location","class":"Mythos","traits":"Yharnam. Central","locationFront":{"icons":"Cross","connections":"Square|Slash|T","uses":[{"token":"clue","type":"Clue","countPerInvestigator":1}]},"locationBack":{"icons":"Cross","connections":"Slash|T|Empty"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1004": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/tXlV227.jpg",
"FaceURL": "https://i.imgur.com/RFaL2Pr.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/CityCenterPlaza.e00005.gmnotes",
"GUID": "e00005",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "City Center Plaza",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -30.24,
"posY": 1.534,
"posZ": 0,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "623f5d",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -29.061,
"posY": 1.67,
"posZ": -3.607,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "7607f6",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -31.43,
"posY": 1.67,
"posZ": -3.549,
"rotX": 0,
"rotY": 265,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "c586ae",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.837,
"posY": 1.67,
"posZ": -7.454,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "edc175",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -22.664,
"posY": 1.67,
"posZ": -3.481,
"rotX": 0,
"rotY": 265,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"3471a5be-0839-4c62-ac85-cc21ea66e4d5","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"Diamond","connections":"Square|Slash","uses":[{"token":"clue","type":"Clue","countPerInvestigator":1}],"victory":1},"locationBack":{"icons":"Diamond","connections":"Square|Slash"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100900,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1009": {
"BackIsHidden": true,
"BackURL": "https://i.ibb.co/0MR8BWW/31cb680c157a.jpg",
"FaceURL": "https://i.ibb.co/Q8wJXKx/80b9d4583b87.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/MoonlitBackstreet.e0000a.gmnotes",
"GUID": "e0000a",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Moonlit Backstreet",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -36.773,
"posY": 1.534,
"posZ": -7.7,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"7e35b0cd-55a1-4bb2-b777-a2400b23f1f0","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"Diamond","connections":"Square|Slash","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"Diamond","connections":"Square|Slash"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 101000,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1010": {
"BackIsHidden": true,
"BackURL": "https://i.ibb.co/z4fZJrb/9454b954fff7.jpg",
"FaceURL": "https://i.ibb.co/rHP7C3k/3d14fee7c37a.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/MoonlitBackstreet.e0000b.gmnotes",
"GUID": "e0000b",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Moonlit Backstreet",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -36.873,
"posY": 1.534,
"posZ": -9.943,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"fb592cbf-2ff5-4552-834b-f902d19e929f","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"Hourglass","connections":"Slash|T","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"Hourglass","connections":"Slash|T"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 101200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1012": {
"BackIsHidden": true,
"BackURL": "https://i.ibb.co/HdJ3gv7/ec3f2de44b1d.jpg",
"FaceURL": "https://i.ibb.co/Y7J9Cky/8df16f462681.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Frenzied Flames",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/OminousPyre.e0000d.gmnotes",
"GUID": "e0000d",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Ominous Pyre",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -23.916,
"posY": 1.551,
"posZ": -6.266,
"rotX": 0,
"rotY": 270,
"rotZ": 179,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"ff6a92f6-5dc0-4683-b0d9-82e76b2c0315","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"Hourglass","connections":"Slash|T","uses":[{"token":"clue","type":"Clue","countPerInvestigator":1}],"victory":1},"locationBack":{"icons":"Hourglass","connections":"Slash|T"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 101300,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1013": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/utwdmG9.jpg",
"FaceURL": "https://i.imgur.com/ly4fYM3.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Burning Embers",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/OminousPyre.e0000e.gmnotes",
"GUID": "e0000e",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Ominous Pyre",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -23.677,
"posY": 1.532,
"posZ": -7.7,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"d703ce98-666b-4618-adb8-09a3e20de708","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"T","connections":"Cross|Moon|DoubleSlash|Hourglass|Heart","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}]},"locationBack":{"icons":"T","connections":"Cross|Moon|DoubleSlash|Hourglass|Heart"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 101500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1015": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/Zsd3X2A.jpg",
"FaceURL": "https://i.imgur.com/VBjPMXl.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act2Locations.1536ba/UndertheGreatBridge.e00010.gmnotes",
"GUID": "e00010",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Under the Great Bridge",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -23.677,
"posY": 1.534,
"posZ": -0.03,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,55 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 0,
"g": 0.36652,
"r": 0.70588
},
"ContainedObjects_order": [
"DesertedManor.e27a6f",
"DesertedManor.e00006"
],
"ContainedObjects_path": "Act3Locations.948eb7",
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "948eb7",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act3Locations.948eb7.luascriptstate",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act3Locations.948eb7.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Bag",
"Nickname": "Act 3 Locations",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 8.625,
"posY": 1.296,
"posZ": 4.239,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"ml":{"e00006":{"lock":false,"pos":{"x":-17.04,"y":1.5336,"z":-7.65},"rot":{"x":0.0007,"y":269.9999,"z":180.0035}},"e27a6f":{"lock":false,"pos":{"x":-17.04,"y":1.5332,"z":0},"rot":{"x":0.0046,"y":269.9999,"z":180.0283}}}}

View File

@ -1,274 +0,0 @@
function updateSave()
local data_to_save = {["ml"]=memoryList}
saved_data = JSON.encode(data_to_save)
self.script_state = saved_data
end
function onload(saved_data)
if saved_data ~= "" then
local loaded_data = JSON.decode(saved_data)
--Set up information off of loaded_data
memoryList = loaded_data.ml
else
--Set up information for if there is no saved saved data
memoryList = {}
end
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
end
--Beginning Setup
--Make setup button
function createSetupButton()
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Triggered by setup button,
function buttonClick_setup()
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
self.clearButtons()
createButtonsOnAllObjects()
createSetupActionButtons()
end
--Creates selection buttons on objects
function createButtonsOnAllObjects()
local howManyButtons = 0
for _, obj in ipairs(getAllObjects()) do
if obj ~= self then
local dummyIndex = howManyButtons
--On a normal bag, the button positions aren't the same size as the bag.
globalScaleFactor = 1.25 * 1/self.getScale().x
--Super sweet math to set button positions
local selfPos = self.getPosition()
local objPos = obj.getPosition()
local deltaPos = findOffsetDistance(selfPos, objPos, obj)
local objPos = rotateLocalCoordinates(deltaPos, self)
objPos.x = -objPos.x * globalScaleFactor
objPos.y = objPos.y * globalScaleFactor
objPos.z = objPos.z * globalScaleFactor
--Offset rotation of bag
local rot = self.getRotation()
rot.y = -rot.y + 180
--Create function
local funcName = "selectButton_" .. howManyButtons
local func = function() buttonClick_selection(dummyIndex, obj) end
self.setVar(funcName, func)
self.createButton({
click_function=funcName, function_owner=self,
position=objPos, rotation=rot, height=1000, width=1000,
color={0.75,0.25,0.25,0.6},
})
howManyButtons = howManyButtons + 1
end
end
end
--Creates submit and cancel buttons
function createSetupActionButtons()
self.createButton({
label="Cancel", click_function="buttonClick_cancel", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Submit", click_function="buttonClick_submit", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Reset", click_function="buttonClick_reset", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--During Setup
--Checks or unchecks buttons
function buttonClick_selection(index, obj)
local color = {0,1,0,0.6}
if memoryList[obj.getGUID()] == nil then
self.editButton({index=index, color=color})
--Adding pos/rot to memory table
local pos, rot = obj.getPosition(), obj.getRotation()
--I need to add it like this or it won't save due to indexing issue
memoryList[obj.getGUID()] = {
pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
lock=obj.getLock()
}
obj.highlightOn({0,1,0})
else
color = {0.75,0.25,0.25,0.6}
self.editButton({index=index, color=color})
memoryList[obj.getGUID()] = nil
obj.highlightOff()
end
end
--Cancels selection process
function buttonClick_cancel()
memoryList = memoryListBackup
self.clearButtons()
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
removeAllHighlights()
broadcastToAll("Selection Canceled", {1,1,1})
end
--Saves selections
function buttonClick_submit()
if next(memoryList) == nil then
broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25})
else
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
end
end
--Resets bag to starting status
function buttonClick_reset()
memoryList = {}
self.clearButtons()
createSetupButton()
removeAllHighlights()
broadcastToAll("Tool Reset", {1,1,1})
updateSave()
end
--After Setup
--Creates recall and place buttons
function createMemoryActionButtons()
self.createButton({
label="Place", click_function="buttonClick_place", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Recall", click_function="buttonClick_recall", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Sends objects from bag/table to their saved position/rotation
function buttonClick_place()
local bagObjList = self.getObjects()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
--If obj is out on the table, move it to the saved pos/rot
if obj ~= nil then
obj.setPositionSmooth(entry.pos)
obj.setRotationSmooth(entry.rot)
obj.setLock(entry.lock)
else
--If obj is inside of the bag
for _, bagObj in ipairs(bagObjList) do
if bagObj.guid == guid then
local item = self.takeObject({
guid=guid, position=entry.pos, rotation=entry.rot,
})
item.setLock(entry.lock)
break
end
end
end
end
broadcastToAll("Objects Placed", {1,1,1})
end
--Recalls objects to bag from table
function buttonClick_recall()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
if obj ~= nil then self.putObject(obj) end
end
broadcastToAll("Objects Recalled", {1,1,1})
end
--Utility functions
--Find delta (difference) between 2 x/y/z coordinates
function findOffsetDistance(p1, p2, obj)
local deltaPos = {}
local bounds = obj.getBounds()
deltaPos.x = (p2.x-p1.x)
deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y)
deltaPos.z = (p2.z-p1.z)
return deltaPos
end
--Used to rotate a set of coordinates by an angle
function rotateLocalCoordinates(desiredPos, obj)
local objPos, objRot = obj.getPosition(), obj.getRotation()
local angle = math.rad(objRot.y)
local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
--return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z}
return {x=x, y=desiredPos.y, z=z}
end
--Coroutine delay, in seconds
function wait(time)
local start = os.time()
repeat coroutine.yield(0) until os.time() > start + time
end
--Duplicates a table (needed to prevent it making reference to the same objects)
function duplicateTable(oldTable)
local newTable = {}
for k, v in pairs(oldTable) do
newTable[k] = v
end
return newTable
end
--Moves scripted highlight from all objects
function removeAllHighlights()
for _, obj in ipairs(getAllObjects()) do
obj.highlightOff()
end
end
--Round number (num) to the Nth decimal (dec)
function round(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"2cd52429-1553-4ae9-b66a-d157e381b619","type":"Location","class":"Mythos","traits":"Yharnam. Estate. ","locationFront":{"icons":"Heart","connections":"T","uses":[{"token":"clue","type":"Clue","countPerInvestigator":1}],"victory":1},"locationBack":{"icons":"Heart","connections":"T"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1005": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/3xqFKJm.jpg",
"FaceURL": "https://i.imgur.com/88kyQhV.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Bloodsoaked Boudoir",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act3Locations.948eb7/DesertedManor.e00006.gmnotes",
"GUID": "e00006",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Deserted Manor",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -17.04,
"posY": 1.534,
"posZ": -7.65,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"e85af8a8-2561-4105-8138-5c1e639f5d3f","type":"Location","class":"Mythos","traits":"Yharnam. Estate. ","locationFront":{"icons":"Heart","connections":"T","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"Heart","connections":"T"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 100600,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1006": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/YF3S6nJ.jpg",
"FaceURL": "https://i.imgur.com/YkWBSRW.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Barren Bedchambers",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act3Locations.948eb7/DesertedManor.e27a6f.gmnotes",
"GUID": "e27a6f",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Deserted Manor",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -17.04,
"posY": 1.533,
"posZ": 0,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,58 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 0,
"g": 0.36652,
"r": 0.70588
},
"ContainedObjects_order": [
"Custom_Token.54b03c",
"Custom_Token.73d971",
"Custom_Token.de99ab",
"NarrowAlleyway.e0000c",
"SomberMemorial.e0000f"
],
"ContainedObjects_path": "Act4Locations.0f2322",
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "0f2322",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act4Locations.0f2322.luascriptstate",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act4Locations.0f2322.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Bag",
"Nickname": "Act 4 Locations",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 8.732,
"posY": 1.296,
"posZ": 0.182,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"ml":{"54b03c":{"lock":false,"pos":{"x":-15.7501,"y":1.67,"z":11.8159},"rot":{"x":0,"y":265.3762,"z":0}},"73d971":{"lock":false,"pos":{"x":-19.6243,"y":1.67,"z":5.0555},"rot":{"x":0,"y":265.3765,"z":0}},"de99ab":{"lock":false,"pos":{"x":-18.9515,"y":1.67,"z":11.7701},"rot":{"x":-0.0001,"y":270.0188,"z":0}},"e0000c":{"lock":false,"pos":{"x":-17.1199,"y":1.5336,"z":7.57},"rot":{"x":0,"y":270.0004,"z":180}},"e0000f":{"lock":false,"pos":{"x":-17.1201,"y":1.5336,"z":15.19},"rot":{"x":0,"y":269.9722,"z":180}}}}

View File

@ -1,274 +0,0 @@
function updateSave()
local data_to_save = {["ml"]=memoryList}
saved_data = JSON.encode(data_to_save)
self.script_state = saved_data
end
function onload(saved_data)
if saved_data ~= "" then
local loaded_data = JSON.decode(saved_data)
--Set up information off of loaded_data
memoryList = loaded_data.ml
else
--Set up information for if there is no saved saved data
memoryList = {}
end
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
end
--Beginning Setup
--Make setup button
function createSetupButton()
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Triggered by setup button,
function buttonClick_setup()
memoryListBackup = duplicateTable(memoryList)
memoryList = {}
self.clearButtons()
createButtonsOnAllObjects()
createSetupActionButtons()
end
--Creates selection buttons on objects
function createButtonsOnAllObjects()
local howManyButtons = 0
for _, obj in ipairs(getAllObjects()) do
if obj ~= self then
local dummyIndex = howManyButtons
--On a normal bag, the button positions aren't the same size as the bag.
globalScaleFactor = 1.25 * 1/self.getScale().x
--Super sweet math to set button positions
local selfPos = self.getPosition()
local objPos = obj.getPosition()
local deltaPos = findOffsetDistance(selfPos, objPos, obj)
local objPos = rotateLocalCoordinates(deltaPos, self)
objPos.x = -objPos.x * globalScaleFactor
objPos.y = objPos.y * globalScaleFactor
objPos.z = objPos.z * globalScaleFactor
--Offset rotation of bag
local rot = self.getRotation()
rot.y = -rot.y + 180
--Create function
local funcName = "selectButton_" .. howManyButtons
local func = function() buttonClick_selection(dummyIndex, obj) end
self.setVar(funcName, func)
self.createButton({
click_function=funcName, function_owner=self,
position=objPos, rotation=rot, height=1000, width=1000,
color={0.75,0.25,0.25,0.6},
})
howManyButtons = howManyButtons + 1
end
end
end
--Creates submit and cancel buttons
function createSetupActionButtons()
self.createButton({
label="Cancel", click_function="buttonClick_cancel", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Submit", click_function="buttonClick_submit", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Reset", click_function="buttonClick_reset", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--During Setup
--Checks or unchecks buttons
function buttonClick_selection(index, obj)
local color = {0,1,0,0.6}
if memoryList[obj.getGUID()] == nil then
self.editButton({index=index, color=color})
--Adding pos/rot to memory table
local pos, rot = obj.getPosition(), obj.getRotation()
--I need to add it like this or it won't save due to indexing issue
memoryList[obj.getGUID()] = {
pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)},
rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)},
lock=obj.getLock()
}
obj.highlightOn({0,1,0})
else
color = {0.75,0.25,0.25,0.6}
self.editButton({index=index, color=color})
memoryList[obj.getGUID()] = nil
obj.highlightOff()
end
end
--Cancels selection process
function buttonClick_cancel()
memoryList = memoryListBackup
self.clearButtons()
if next(memoryList) == nil then
createSetupButton()
else
createMemoryActionButtons()
end
removeAllHighlights()
broadcastToAll("Selection Canceled", {1,1,1})
end
--Saves selections
function buttonClick_submit()
if next(memoryList) == nil then
broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25})
else
self.clearButtons()
createMemoryActionButtons()
local count = 0
for guid in pairs(memoryList) do
count = count + 1
local obj = getObjectFromGUID(guid)
if obj ~= nil then obj.highlightOff() end
end
broadcastToAll(count.." Objects Saved", {1,1,1})
updateSave()
end
end
--Resets bag to starting status
function buttonClick_reset()
memoryList = {}
self.clearButtons()
createSetupButton()
removeAllHighlights()
broadcastToAll("Tool Reset", {1,1,1})
updateSave()
end
--After Setup
--Creates recall and place buttons
function createMemoryActionButtons()
self.createButton({
label="Place", click_function="buttonClick_place", function_owner=self,
position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Recall", click_function="buttonClick_recall", function_owner=self,
position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
self.createButton({
label="Setup", click_function="buttonClick_setup", function_owner=self,
position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800,
font_size=250, color={0,0,0}, font_color={1,1,1}
})
end
--Sends objects from bag/table to their saved position/rotation
function buttonClick_place()
local bagObjList = self.getObjects()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
--If obj is out on the table, move it to the saved pos/rot
if obj ~= nil then
obj.setPositionSmooth(entry.pos)
obj.setRotationSmooth(entry.rot)
obj.setLock(entry.lock)
else
--If obj is inside of the bag
for _, bagObj in ipairs(bagObjList) do
if bagObj.guid == guid then
local item = self.takeObject({
guid=guid, position=entry.pos, rotation=entry.rot,
})
item.setLock(entry.lock)
break
end
end
end
end
broadcastToAll("Objects Placed", {1,1,1})
end
--Recalls objects to bag from table
function buttonClick_recall()
for guid, entry in pairs(memoryList) do
local obj = getObjectFromGUID(guid)
if obj ~= nil then self.putObject(obj) end
end
broadcastToAll("Objects Recalled", {1,1,1})
end
--Utility functions
--Find delta (difference) between 2 x/y/z coordinates
function findOffsetDistance(p1, p2, obj)
local deltaPos = {}
local bounds = obj.getBounds()
deltaPos.x = (p2.x-p1.x)
deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y)
deltaPos.z = (p2.z-p1.z)
return deltaPos
end
--Used to rotate a set of coordinates by an angle
function rotateLocalCoordinates(desiredPos, obj)
local objPos, objRot = obj.getPosition(), obj.getRotation()
local angle = math.rad(objRot.y)
local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
--return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z}
return {x=x, y=desiredPos.y, z=z}
end
--Coroutine delay, in seconds
function wait(time)
local start = os.time()
repeat coroutine.yield(0) until os.time() > start + time
end
--Duplicates a table (needed to prevent it making reference to the same objects)
function duplicateTable(oldTable)
local newTable = {}
for k, v in pairs(oldTable) do
newTable[k] = v
end
return newTable
end
--Moves scripted highlight from all objects
function removeAllHighlights()
for _, obj in ipairs(getAllObjects()) do
obj.highlightOff()
end
end
--Round number (num) to the Nth decimal (dec)
function round(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "54b03c",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -15.75,
"posY": 1.67,
"posZ": 11.816,
"rotX": 0,
"rotY": 265,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "73d971",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -19.624,
"posY": 1.67,
"posZ": 5.056,
"rotX": 0,
"rotY": 265,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "de99ab",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -18.951,
"posY": 1.67,
"posZ": 11.77,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"0a8b9e24-1f35-4141-a852-c8a7dc445d6e","type":"Location","class":"Mythos","traits":"Yharnam","locationFront":{"icons":"DoubleSlash","connections":"T|Star","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":1},"locationBack":{"icons":"DoubleSlash","connections":"T|Star"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 101100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1011": {
"BackIsHidden": true,
"BackURL": "https://i.ibb.co/V24XMqz/9dcf3f346cec.jpg",
"FaceURL": "https://i.ibb.co/3SV6tRw/663e0cef0466.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act4Locations.0f2322/NarrowAlleyway.e0000c.gmnotes",
"GUID": "e0000c",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Narrow Alleyway",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -17.12,
"posY": 1.534,
"posZ": 7.57,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"ae881d0d-bf2e-4379-98db-ff040aa2018e","type":"Location","class":"Mythos","traits":"Yharnam. Graveyard","locationFront":{"icons":"Star","connections":"DoubleSlash","uses":[{"token":"clue","type":"Clue","countPerInvestigator":2}],"victory":2},"locationBack":{"icons":"Star","connections":"DoubleSlash"}}

View File

@ -1,62 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 101400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1014": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/v9gzPxK.jpg",
"FaceURL": "https://i.imgur.com/tshU524.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "Tomb of Oedon",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Act4Locations.0f2322/SomberMemorial.e0000f.gmnotes",
"GUID": "e0000f",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Somber Memorial",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Location",
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -17.12,
"posY": 1.534,
"posZ": 15.19,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,45 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "Choose 1 random act deck",
"DragSelectable": true,
"GMNotes": "",
"GUID": "756370",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Act Instructions",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -11.578,
"posY": 1.59,
"posZ": -10.099,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,65 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 0.339915335,
"g": 0.507659256,
"r": 0.7222887
},
"SpecularIntensity": 0.4,
"SpecularSharpness": 7
},
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/254843371583187306/6844B833AD55B9A34095067B201B311E1348325F/",
"MaterialIndex": 2,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/",
"NormalURL": "",
"TypeIndex": 0
},
"Description": "Include this in custom content for clue spawning!",
"DragSelectable": true,
"GMNotes": "",
"GUID": "8f6217",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState": "",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/BloodborneCustomDataHelper.8f6217.ttslua",
"MeasureMovement": false,
"Name": "Custom_Model",
"Nickname": "Bloodborne Custom Data Helper",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -3.333,
"posY": 1.633,
"posZ": -14.346,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.5,
"scaleY": 0.5,
"scaleZ": 0.5
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,402 +0,0 @@
-- set true to enable debug logging
DEBUG = false
function log(message)
if DEBUG then
print(message)
end
end
--[[
Known locations and clues. We check this to determine if we should
atttempt to spawn clues, first we look for <LOCATION_NAME>_<GUID> and if
we find nothing we look for <LOCATION_NAME>
format is [location_guid -> clueCount]
]]
LOCATIONS_DATA_JSON = [[
{
"San Francisco": {"type": "fixed", "value": 1, "clueSide": "back"},
" Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"Buenos Aires": {"type": "fixed", "value": 2, "clueSide": "back"},
" London": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rome": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Istanbul": {"type": "perPlayer", "value": 4, "clueSide": "front"},
"Tokyo_123abc": {"type": "perPlayer", "value": 0, "clueSide": "back"},
"Tokyo_456efg": {"type": "perPlayer", "value": 4, "clueSide": "back"},
"Tokyo": {"type": "fixed", "value": 2, "clueSide": "back"},
"Shanghai_123": {"type": "fixed", "value": 12, "clueSide": "front"},
"Sydney": {"type": "fixed", "value": 0, "clueSide": "front"},
"Under the Great Bridge": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Somber Memorial": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Ominous Pyre": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Ominous Pyre ": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Narrow Alleyway": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moonlit Backstreet": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Moonlit Backstreet ": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Central Yharnam Promenade": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Hospital Courtyard": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Deserted Manor_adcfac": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"City Center Plaza": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Atop the Great Bridge": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Deserted Manor_e00007": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"1st Floor Sickroom": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"1st Floor Examination Room": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Chapel Transept": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chapel Sanctuary": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chapel Rectory": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chapel Nave": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Chapel Attic_0e64f5": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Untended Graves": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Tomb of the Queen": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Shadowed Woods": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rotting Thicket": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Oedon Chapel Subterrane": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moonlit Clearing": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Misty Weald": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Hemwick Charnel Lane": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Gibbeting Path": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Gates of Byrgenwerth": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Deserted Trapping Village": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Derelict Coachhouse": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Burial Grove": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Abandoned Mill": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Private Library": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Research Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Faculty Offices": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rooftops_e00008": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Annex": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Astronomy Hall": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Lecture Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"University Foyer": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"*The Portrait of the First Vicar": {"type": "perPlayer", "value": 2, "clueSide": "back"},
"*The Portrait of the Holy Blade": {"type": "perPlayer", "value": 2, "clueSide": "back"},
"*The Portrait of the Holy Blade": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"*The Portrait of the Headmaster": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"*The Portrait of the Governess": {"type": "perPlayer", "value": 2, "clueSide": "back"},
"Audience Chamber": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Cathedral Steps": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Cathedral Ward Cemetery": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Grand Cathedral of Yharnam": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Surgery Altar": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"The Bridge of Saints": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Grand Cathedral Sanctuary": {"type": "perPlayer", "value": 0, "clueSide": "front"},
"The Lumenflower Garden": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Steps of Penance": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mirror Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber ": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber ": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber ": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Branching Corridors": {"type": "fixed", "value": 1, "clueSide": "front"},
"Yale University": {"type": "fixed", "value": 1, "clueSide": "front"},
"The Cimmerian Descent": {"type": "fixed", "value": 1, "clueSide": "front"},
"The College of Mensis": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Ritual Cloister": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mensis Refectory": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Lair of the Brain": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"The Hypogean Gaol": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Spires of the Loft": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Featured Exhibit": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Depths of the Loft": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Dangling Cells": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Byrgenwerth": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Apostle's Gallery": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Wet Nurse's Lunarium": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Spire of Mensis": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"Aeonian Sickbeds": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Decaying Fishing Hamlet": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Lumenwood Garden": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Forgotten Coast": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Advent Plaza": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Sacrificial Pits": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Yahar'gul Chapel": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Yahar'gul Commons": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Defiled Pthumerian Shrine": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Pthumeru Ihyll Labyrinth": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Tomb of Oedon": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Moonside Lake": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Ailing Loran Frontier": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Bloodstained Gate": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"The Eastern Cathedral": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mergo's Loft": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Sanguine River": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Underground Corpse Pile": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Western Cathedral": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chalice Headstones": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Gates of the Dream": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chalice Headstones": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Grave-Marked Trail": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Misty Garden Path": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moon-Kissed Meadow": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Burning Workshop": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"The Dream Aflame": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Messengers' Bath": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Deserted Manor_1566a5": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moonlit Clearing_e00008": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Research Hall_e00007": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rooftops_e0008": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Lecture Hall_e00004": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Surgery Altar_e00007": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"The Lumenflower Gardens_1a433f": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Blood Healing Laboratory_998d8c": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Contact Chamber_10edc3": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Contact Chamber_31e857": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Audience Chamber_e00001": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mirror Chamber _e00003": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber _e00001": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber_e00004": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber _e00002": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Dangling Cells_49d503": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Depths of the Loft_e00007": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Lair of the Brain_e0000b": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Ritual Cloister_e00013": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mensis Refectory_e0000e": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Spires of the Loft_e00009": {"type": "perPlayer", "value": 2, "clueSide": "front"}
}
]]
PLAYER_CARD_DATA_JSON = [[
{
"Tool Belt (0)": {
"tokenType": "resource",
"tokenCount": 2
},
"Tool Belt (3)": {
"tokenType": "resource",
"tokenCount": 4
},
"Yithian Rifle": {
"tokenType": "resource",
"tokenCount": 3
},
"xxx": {
"tokenType": "resource",
"tokenCount": 3
}
}
]]
HIDDEN_CARD_DATA = {
"Unpleasant Card (Doom)",
"Unpleasant Card (Gloom)",
"The Case of the Scarlet DOOOOOM!"
}
LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON)
PLAYER_CARD_DATA = JSON.decode(PLAYER_CARD_DATA_JSON)
function onload(save_state)
local playArea = getObjectFromGUID('721ba2')
playArea.call("updateLocations", {self.getGUID()})
local playerMatWhite = getObjectFromGUID('8b081b')
playerMatWhite.call("updatePlayerCards", {self.getGUID()})
local playerMatOrange = getObjectFromGUID('bd0ff4')
playerMatOrange.call("updatePlayerCards", {self.getGUID()})
local playerMatGreen = getObjectFromGUID('383d8b')
playerMatGreen.call("updatePlayerCards", {self.getGUID()})
local playerMatRed = getObjectFromGUID('0840d5')
playerMatRed.call("updatePlayerCards", {self.getGUID()})
local dataHelper = getObjectFromGUID('708279')
dataHelper.call("updateHiddenCards", {self.getGUID()})
end-- set true to enable debug logging
DEBUG = false
function log(message)
if DEBUG then
print(message)
end
end
--[[
Known locations and clues. We check this to determine if we should
atttempt to spawn clues, first we look for <LOCATION_NAME>_<GUID> and if
we find nothing we look for <LOCATION_NAME>
format is [location_guid -> clueCount]
]]
LOCATIONS_DATA_JSON = [[
{
"San Francisco": {"type": "fixed", "value": 1, "clueSide": "back"},
" Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"Buenos Aires": {"type": "fixed", "value": 2, "clueSide": "back"},
" London": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rome": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Istanbul": {"type": "perPlayer", "value": 4, "clueSide": "front"},
"Tokyo_123abc": {"type": "perPlayer", "value": 0, "clueSide": "back"},
"Tokyo_456efg": {"type": "perPlayer", "value": 4, "clueSide": "back"},
"Tokyo": {"type": "fixed", "value": 2, "clueSide": "back"},
"Shanghai_123": {"type": "fixed", "value": 12, "clueSide": "front"},
"Sydney": {"type": "fixed", "value": 0, "clueSide": "front"},
"Under the Great Bridge": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Somber Memorial": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Ominous Pyre": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Ominous Pyre ": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Narrow Alleyway": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moonlit Backstreet": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Moonlit Backstreet ": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Central Yharnam Promenade": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Hospital Courtyard": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Deserted Manor_adcfac": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"City Center Plaza": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Atop the Great Bridge": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Deserted Manor_e00007": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"1st Floor Sickroom": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"1st Floor Examination Room": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Chapel Transept": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chapel Sanctuary": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chapel Rectory": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chapel Nave": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Chapel Attic_0e64f5": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Untended Graves": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Tomb of the Queen": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Shadowed Woods": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rotting Thicket": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Oedon Chapel Subterrane": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moonlit Clearing": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Misty Weald": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Hemwick Charnel Lane": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Gibbeting Path": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Gates of Byrgenwerth": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Deserted Trapping Village": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Derelict Coachhouse": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Burial Grove": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Abandoned Mill": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Private Library": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Research Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Faculty Offices": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rooftops_e00008": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Annex": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Astronomy Hall": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Lecture Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"University Foyer": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"*The Portrait of the First Vicar": {"type": "perPlayer", "value": 2, "clueSide": "back"},
"*The Portrait of the Holy Blade": {"type": "perPlayer", "value": 2, "clueSide": "back"},
"*The Portrait of the Holy Blade": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"*The Portrait of the Headmaster": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"*The Portrait of the Governess": {"type": "perPlayer", "value": 2, "clueSide": "back"},
"Audience Chamber": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Cathedral Steps": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Cathedral Ward Cemetery": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Grand Cathedral of Yharnam": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Surgery Altar": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"The Bridge of Saints": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Grand Cathedral Sanctuary": {"type": "perPlayer", "value": 0, "clueSide": "front"},
"The Lumenflower Garden": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Steps of Penance": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mirror Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber ": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber ": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber ": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Branching Corridors": {"type": "fixed", "value": 1, "clueSide": "front"},
"Yale University": {"type": "fixed", "value": 1, "clueSide": "front"},
"The Cimmerian Descent": {"type": "fixed", "value": 1, "clueSide": "front"},
"The College of Mensis": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Ritual Cloister": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mensis Refectory": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Lair of the Brain": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"The Hypogean Gaol": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Spires of the Loft": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Featured Exhibit": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Depths of the Loft": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Dangling Cells": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Byrgenwerth": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Apostle's Gallery": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Wet Nurse's Lunarium": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Spire of Mensis": {"type": "perPlayer", "value": 1, "clueSide": "back"},
"Aeonian Sickbeds": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Decaying Fishing Hamlet": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Lumenwood Garden": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Forgotten Coast": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Advent Plaza": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Sacrificial Pits": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Yahar'gul Chapel": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Yahar'gul Commons": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Defiled Pthumerian Shrine": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Pthumeru Ihyll Labyrinth": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Tomb of Oedon": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Moonside Lake": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Ailing Loran Frontier": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Bloodstained Gate": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"The Eastern Cathedral": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mergo's Loft": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Sanguine River": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Underground Corpse Pile": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Western Cathedral": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chalice Headstones": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Gates of the Dream": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Chalice Headstones": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Grave-Marked Trail": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Misty Garden Path": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moon-Kissed Meadow": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Burning Workshop": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"The Dream Aflame": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Messengers' Bath": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Deserted Manor_1566a5": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Moonlit Clearing_e00008": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Research Hall_e00007": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Rooftops_e0008": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Lecture Hall_e00004": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"The Surgery Altar_e00007": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"The Lumenflower Gardens_1a433f": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Blood Healing Laboratory_998d8c": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Contact Chamber_10edc3": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Contact Chamber_31e857": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Audience Chamber_e00001": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mirror Chamber _e00003": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber _e00001": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber_e00004": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Mirror Chamber _e00002": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Dangling Cells_49d503": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Depths of the Loft_e00007": {"type": "perPlayer", "value": 1, "clueSide": "front"},
"Lair of the Brain_e0000b": {"type": "perPlayer", "value": 3, "clueSide": "front"},
"Ritual Cloister_e00013": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Mensis Refectory_e0000e": {"type": "perPlayer", "value": 2, "clueSide": "front"},
"Spires of the Loft_e00009": {"type": "perPlayer", "value": 2, "clueSide": "front"}
}
]]
PLAYER_CARD_DATA_JSON = [[
{
"Tool Belt (0)": {
"tokenType": "resource",
"tokenCount": 2
},
"Tool Belt (3)": {
"tokenType": "resource",
"tokenCount": 4
},
"Yithian Rifle": {
"tokenType": "resource",
"tokenCount": 3
},
"xxx": {
"tokenType": "resource",
"tokenCount": 3
}
}
]]
HIDDEN_CARD_DATA = {
"Unpleasant Card (Doom)",
"Unpleasant Card (Gloom)",
"The Case of the Scarlet DOOOOOM!"
}
LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON)
PLAYER_CARD_DATA = JSON.decode(PLAYER_CARD_DATA_JSON)
function onload(save_state)
local playArea = getObjectFromGUID('721ba2')
playArea.call("updateLocations", {self.getGUID()})
local playerMatWhite = getObjectFromGUID('8b081b')
playerMatWhite.call("updatePlayerCards", {self.getGUID()})
local playerMatOrange = getObjectFromGUID('bd0ff4')
playerMatOrange.call("updatePlayerCards", {self.getGUID()})
local playerMatGreen = getObjectFromGUID('383d8b')
playerMatGreen.call("updatePlayerCards", {self.getGUID()})
local playerMatRed = getObjectFromGUID('0840d5')
playerMatRed.call("updatePlayerCards", {self.getGUID()})
local dataHelper = getObjectFromGUID('708279')
dataHelper.call("updateHiddenCards", {self.getGUID()})
end

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "00d19a",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -39.767,
"posY": 1.67,
"posZ": 7.962,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomToken": {
"MergeDistancePixels": 5,
"Stackable": true,
"StandUp": false,
"Thickness": 0.3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "9743de",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "",
"Snap": false,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -40.013,
"posY": 1.67,
"posZ": 4.191,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 1,
"scaleZ": 0.33
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,89 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"ContainedObjects_order": [
"AMereBadDream.e169b6",
"ANightofCurses.7b63a6",
"TheHuntBegins.c7c1af"
],
"ContainedObjects_path": "Deck.87cb2b",
"CustomDeck": {
"2942": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/OYNKAAA.jpg",
"FaceURL": "https://i.imgur.com/QfbNrah.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"2943": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/w6jIO0U.jpg",
"FaceURL": "https://i.imgur.com/mZzW74R.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
},
"3192": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/0vDZSaH.jpg",
"FaceURL": "https://i.imgur.com/HeXPn0b.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"DeckIDs": [
294200,
294300,
319200
],
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "87cb2b",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Deck",
"Nickname": "",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -2.725,
"posY": 1.618,
"posZ": 0.373,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"d9e7c422-98c9-4120-aa45-ed70141e94ed","type":"Agenda","class":"Mythos","doomThreshold":5}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 294200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"2942": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/OYNKAAA.jpg",
"FaceURL": "https://i.imgur.com/QfbNrah.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Deck.87cb2b/AMereBadDream.e169b6.gmnotes",
"GUID": "e169b6",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "A Mere Bad Dream",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -2.725,
"posY": 1.597,
"posZ": 0.373,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"052f3eac-989f-4e8d-aeb3-edd5e20aa5a5","type":"Agenda","class":"Mythos","doomThreshold":6}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 294300,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"2943": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/w6jIO0U.jpg",
"FaceURL": "https://i.imgur.com/mZzW74R.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Deck.87cb2b/ANightofCurses.7b63a6.gmnotes",
"GUID": "7b63a6",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "A Night of Curses",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -2.725,
"posY": 1.642,
"posZ": 0.373,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1 +0,0 @@
{"TtsZoopGuid":"78649ed4-67a4-4a8c-98e5-fa2932950b95","type":"Agenda","class":"Mythos","doomThreshold":8}

View File

@ -1,61 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 319200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1000": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/0vDZSaH.jpg",
"FaceURL": "https://i.imgur.com/HeXPn0b.jpg",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": true
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/Deck.87cb2b/TheHuntBegins.c7c1af.gmnotes",
"GUID": "c7c1af",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "The Hunt Begins",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"ScenarioCard"
],
"Tooltip": true,
"Transform": {
"posX": -2.725,
"posY": 1.676,
"posZ": 0.373,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,94 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"ContainedObjects_order": [
"-1.611dee",
"0.9ce4ab",
"0.bf610b",
"-3.06b1ba",
"-1.fb1afd",
"Tablet.4c0d07",
"Custom_Tile.079c53",
"Custom_Tile.429a2f",
"Auto-fail.233aa2",
"Cultist.0d2196",
"1.20b7fc",
"Skull.c2b8a0",
"ElderSign.e04757",
"-2.6cda68",
"Skull.ddd462",
"Custom_Tile.afaab0",
"-2.8463a5",
"-1.9e41ec"
],
"ContainedObjects_path": "EasyChaosBag.f4ca98",
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/959719855127933035/B199A5F515A8F3ED7E06780D3723285C02ADE085/",
"MaterialIndex": 3,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/87098596225685535/6C95EB6308A0A9E89367DD67D5C65D09EB3C06A0/",
"NormalURL": "",
"TypeIndex": 6
},
"Description": "Chaos Bag",
"DragSelectable": true,
"GMNotes": "",
"GUID": "f4ca98",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState": "",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b/1TheHuntBegins.dc507f/EasyChaosBag.f4ca98.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Custom_Model_Bag",
"Nickname": "Easy Chaos Bag",
"Snap": true,
"Sticky": true,
"Tags": [
"chaos_bag"
],
"Tooltip": true,
"Transform": {
"posX": 2.02,
"posY": 1.485,
"posZ": -23.927,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 3,
"scaleY": 3,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,13 +0,0 @@
function filterObjectEnter(obj)
local props = obj.getCustomObject()
if props ~= nil and props.image ~= nil then
obj.setName(Global.call("getTokenName", { url=props.image }))
end
return true
end
function onCollisionEnter(collision_info)
self.shuffle()
self.shuffle()
self.shuffle()
end

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/w3XbrCC.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "611dee",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "-1",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 4.481,
"posY": 2.325,
"posZ": -47.023,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/w3XbrCC.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "9e41ec",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "-1",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 14.593,
"posY": 2.512,
"posZ": -42.215,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/w3XbrCC.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "fb1afd",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "-1",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 0,
"posY": 8.712,
"posZ": 0,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/bfTg2hb.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "6cda68",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "-2",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -0.536,
"posY": 2.319,
"posZ": -60.509,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/bfTg2hb.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "8463a5",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "-2",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 2.096,
"posY": 2.318,
"posZ": -68.845,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/yfs8gHq.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "06b1ba",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "-3",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -51.858,
"posY": 2.036,
"posZ": 5.742,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/btEtVfd.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "9ce4ab",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "0",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 0,
"posY": 8.712,
"posZ": 0,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/btEtVfd.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "bf610b",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "0",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 0,
"posY": 8.712,
"posZ": 0,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/uIx8jbY.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "20b7fc",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "+1",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 11.222,
"posY": 2.263,
"posZ": -12.59,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/lns4fhz.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "233aa2",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "Auto-fail",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 0,
"posY": 8.712,
"posZ": 0,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/VzhJJaH.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "0d2196",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "Cultist",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 0,
"posY": 8.712,
"posZ": 0,
"rotX": 0,
"rotY": 315,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0.04894,
"g": 0.32859,
"r": 0.37456
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "https://i.imgur.com/lKV3fGU.png",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "079c53",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": 10.869,
"posY": 2.361,
"posZ": 34.558,
"rotX": 0,
"rotY": 270,
"rotZ": 180,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

Some files were not shown because too many files have changed in this diff Show More