Added Featured Content

Added featured content section containing featured fan campaigns.  also updated date on release notes.
Note that this commit has many files added as part of the two fan campaigns, as they have been "pre-downloaded"
This commit is contained in:
bootleggerFinn 2023-04-19 19:28:46 -05:00
parent ecfd765806
commit 9614ebcb37
3167 changed files with 149549 additions and 14 deletions

View File

@ -192,7 +192,10 @@
"OptionPanelSource.830bd0",
"SoundCube.3c988f",
"GameKeyHandler.fce69c",
"ArkhamSCE310-4172023-Page1.e1b8df"
"ArkhamSCE310-4202023-Page1.e1b8df",
"3DText.d628cc",
"TheColourOutofOz.be7d21",
"Bloodborne-CityoftheUnseen0175.81651b"
],
"PlayArea": 1,
"PlayerCounts": [

View File

@ -331,13 +331,6 @@
"z": 0
}
},
{
"Position": {
"x": -27,
"y": 1.481,
"z": -71
}
},
{
"Position": {
"x": -56.245,
@ -356,5 +349,12 @@
"y": 1.481,
"z": -87
}
},
{
"Position": {
"x": -27,
"y": 1.481,
"z": -56.165
}
}
]

View File

@ -0,0 +1,54 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "d628cc",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": true,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "3DText",
"Nickname": "",
"Snap": true,
"Sticky": true,
"Text": {
"Text": "Featured Fan Content",
"colorstate": {
"b": 1,
"g": 1,
"r": 1
},
"fontSize": 84
},
"Tooltip": true,
"Transform": {
"posX": -19.567,
"posY": 1.697,
"posZ": -83.387,
"rotX": 90,
"rotY": 90,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,272 @@
{
"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

@ -0,0 +1,84 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"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",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "https://i.imgur.com/WtioCq1.jpg",
"MaterialIndex": 3,
"MeshURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj",
"NormalURL": "",
"TypeIndex": 6
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "81651b",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScriptState_path": "Bloodborne-CityoftheUnseen0175.81651b.luascriptstate",
"LuaScript_path": "Bloodborne-CityoftheUnseen0175.81651b.ttslua",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Custom_Model_Bag",
"Nickname": "Bloodborne - City of the Unseen 0.175",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -27,
"posY": 1.485,
"posZ": -87.876,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.89,
"scaleY": 0.12,
"scaleZ": 0.89
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1 @@
{"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

@ -0,0 +1,503 @@
-- 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

@ -0,0 +1,115 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,504 @@
-- 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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1,55 @@
{
"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

@ -0,0 +1,274 @@
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

@ -0,0 +1,100 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

@ -0,0 +1,100 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

@ -0,0 +1,64 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,274 @@
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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1,55 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,274 @@
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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1,58 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,274 @@
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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1 @@
{"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

@ -0,0 +1,62 @@
{
"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

@ -0,0 +1,45 @@
{
"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

@ -0,0 +1,65 @@
{
"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

@ -0,0 +1,402 @@
-- 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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,89 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

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

View File

@ -0,0 +1,61 @@
{
"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

@ -0,0 +1,94 @@
{
"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

@ -0,0 +1,13 @@
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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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

@ -0,0 +1,57 @@
{
"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