Merge branch 'master' into patches

This commit is contained in:
Adam Goldsmith 2024-07-27 22:53:03 -04:00
commit 85cb7bc7e2
781 changed files with 66859 additions and 89457 deletions

File diff suppressed because it is too large Load Diff

View File

@ -567,16 +567,13 @@
<!-- Default formatting --> <!-- Default formatting -->
<Defaults> <Defaults>
<Text color="#FFFFFF" <Text color="#FFFFFF"
alignment="MiddleLeft" /> alignment="MiddleLeft"/>
<Toggle isOn="False" <Dropdown rectAlignment="MiddleCenter"/>
rectAlignment="MiddleRight" />
<Dropdown rectAlignment="MiddleCenter" />
<Cell dontUseTableCellBackground="true" <Cell dontUseTableCellBackground="true"
outlineSize="0 1" outlineSize="0 1"
outline="grey" /> outline="grey"/>
<!-- main window --> <!-- main window -->
<TableLayout class="window" <TableLayout class="window"
@ -588,20 +585,20 @@
outline="grey" outline="grey"
showAnimation="SlideIn_Right" showAnimation="SlideIn_Right"
hideAnimation="SlideOut_Right" hideAnimation="SlideOut_Right"
animationDuration="0.2" /> animationDuration="0.2"/>
<!-- group headers --> <!-- group headers -->
<Row class="group-header" <Row class="group-header"
preferredHeight="44" /> preferredHeight="44"/>
<Cell class="group-header" <Cell class="group-header"
padding="10 10 0 0" padding="10 10 0 0"
columnSpan="3" columnSpan="3"
color="#222222" /> color="#222222"/>
<Panel class="group-header" <Panel class="group-header"
padding="5 0 0 0" /> padding="5 0 0 0"/>
<Text class="group-header" <Text class="group-header"
fontSize="28" fontSize="28"
font="font_teutonic-arkham" /> font="font_teutonic-arkham"/>
<!-- options --> <!-- options -->
<Row class="option-text" <Row class="option-text"
@ -630,6 +627,14 @@
font="font_teutonic-arkham"/> font="font_teutonic-arkham"/>
<Panel class="doubleColumn-wrapper" <Panel class="doubleColumn-wrapper"
padding="0 17 3 3"/> padding="0 17 3 3"/>
<Button class="optionToggle"
image="option_off"
rectAlignment="MiddleRight"
offsetXY="-30 0"
colors="#FFFFFF|#dfdfdf"
height="36"
width="65"
ignoreLayout="True"/>
<!-- buttons at the bottom --> <!-- buttons at the bottom -->
<Button class="bottomButtons" <Button class="bottomButtons"
@ -716,8 +721,24 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showTitleSplash" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showTitleSplash)"/> id="showTitleSplash"
onClick="onClick_toggleOption"/>
</Cell>
</Row>
<!-- Option: Enable all card helpers -->
<Row class="option-text"
tooltip="Enable all card helpers (usually enabled via context menu entries).&#xA;Examples: False Covenant and Book of Living Myths">
<Cell class="option-text">
<Panel class="singleColumn-wrapper">
<Text class="option-header">Enable all card helpers</Text>
</Panel>
</Cell>
<Cell class="option-button">
<Button class="optionToggle"
id="enableCardHelpers"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -740,8 +761,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="playAreaSnapTags" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(playAreaSnapTags)"/> id="playAreaSnapTags"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -754,8 +776,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="playAreaConnections" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(playAreaConnections)"/> id="playAreaConnections"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -785,8 +808,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="changePlayAreaImage" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(changePlayAreaImage)"/> id="changePlayAreaImage"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -809,8 +833,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="useSnapTags" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(useSnapTags)"/> id="useSnapTags"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -823,8 +848,24 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showDrawButton" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showDrawButton)"/> id="showDrawButton"
onClick="onClick_toggleOption"/>
</Cell>
</Row>
<!-- Option: use class-specific texture -->
<Row class="option-text"
tooltip="Controls whether a class-specific playermat texture should be automatically loaded.">
<Cell class="option-text">
<Panel class="singleColumn-wrapper">
<Text class="option-header">Use class-specific texture</Text>
</Panel>
</Cell>
<Cell class="option-button">
<Button class="optionToggle"
id="useClassTexture"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -837,8 +878,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="useClueClickers" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(useClueClickers)"/> id="useClueClickers"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -862,7 +904,7 @@
</Cell> </Cell>
</Row> </Row>
<!-- Option: remove a player mat --> <!-- Option: remove a playermat -->
<Row class="option-text" <Row class="option-text"
tooltip="Remove an unused playermat for more table space.&#xA;Displayed are the default colors."> tooltip="Remove an unused playermat for more table space.&#xA;Displayed are the default colors.">
<Cell class="option-singleColumn"> <Cell class="option-singleColumn">
@ -903,8 +945,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showAttachmentHelper" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showAttachmentHelper)"/> id="showAttachmentHelper"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -917,8 +960,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showCleanUpHelper" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showCleanUpHelper)"/> id="showCleanUpHelper"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -931,8 +975,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showCYOA" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showCYOA)"/> id="showCYOA"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -945,8 +990,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showDisplacementTool" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showDisplacementTool)"/> id="showDisplacementTool"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -959,8 +1005,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showHandHelper" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showHandHelper)"/> id="showHandHelper"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
@ -973,8 +1020,9 @@
</Panel> </Panel>
</Cell> </Cell>
<Cell class="option-button"> <Cell class="option-button">
<Toggle id="showSearchAssistant" <Button class="optionToggle"
onValueChanged="onClick_toggleOption(showSearchAssistant)"/> id="showSearchAssistant"
onClick="onClick_toggleOption"/>
</Cell> </Cell>
</Row> </Row>
</TableLayout> </TableLayout>

View File

@ -71,33 +71,18 @@ ComponentTags:
normalized: investigator normalized: investigator
- displayed: chaosBag - displayed: chaosBag
normalized: chaosbag normalized: chaosbag
- displayed: ActionToken
normalized: actiontoken
- displayed: LargeBox - displayed: LargeBox
normalized: largebox normalized: largebox
- displayed: CampaignBox - displayed: CampaignBox
normalized: campaignbox normalized: campaignbox
- displayed: CameraZoom_ignore - displayed: CameraZoom_ignore
normalized: camerazoom_ignore normalized: camerazoom_ignore
- displayed: UniversalToken
normalized: universaltoken
CustomUIAssets: CustomUIAssets:
- Name: refresh
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1695031152736214852/EC3BBEF1A1788381A8F4C5ACB7FB27770CAF03C5/
- Name: close - Name: close
Type: 0 Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1695031152736214756/2EEB07E453A7ECF4BE5A1030A253185B37A7CDAB/ URL: http://cloud-3.steamusercontent.com/ugc/1695031152736214756/2EEB07E453A7ECF4BE5A1030A253185B37A7CDAB/
- Name: cthulhu
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1782854877010107768/BC6A97F193385D01C1A9149B68923F55A284CB2D/
- Name: dark-cult
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1782854877010108105/08594607341D6537C28A08A34CE82159025AB8DB/
- Name: yog-sothoth
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1782854877010107124/D8042D1A1B08CFB7E76488B09216B4611D85A2B9/
- Name: elder-sign
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1782854877010107442/43BC029410751208A90AE7FDEBCB587A0E9403D7/
- Name: devourer - Name: devourer
Type: 0 Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/1782854877010106784/6E00433E3425D0A7C6121E0DDB6A79167BA78569/ URL: http://cloud-3.steamusercontent.com/ugc/1782854877010106784/6E00433E3425D0A7C6121E0DDB6A79167BA78569/
@ -113,24 +98,18 @@ CustomUIAssets:
- Name: option-gear - Name: option-gear
Type: 0 Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2026086584372569912/5CB461AEAE2E59D3064D90A776EB86C46081EC78/ URL: http://cloud-3.steamusercontent.com/ugc/2026086584372569912/5CB461AEAE2E59D3064D90A776EB86C46081EC78/
- Name: font_birmingham - Name: option_on
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2462982115668997008/2178787B67B3C96F3419EDBAB8420E39893756BC/
- Name: option_off
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2462982115668996901/D6438ECBB11DECC6DB9987589FF526FBAD4D2368/
- Name: font_arkhamicons
Type: 1 Type: 1
URL: http://cloud-3.steamusercontent.com/ugc/2027213118466443497/3CF9BB9AF968D245961494CC9A151774EB9BA638/ URL: http://cloud-3.steamusercontent.com/ugc/2462982115649258367/C20CC4C299A6FE5F1ECAB968E15BE590337CC019/
- Name: font_columbus
Type: 1
URL: http://cloud-3.steamusercontent.com/ugc/2027213118466515872/F473E4ACC75ACB6CE07457C45290B4912E0B3286/
- Name: font_oldremington
Type: 1
URL: http://cloud-3.steamusercontent.com/ugc/2027213118466515932/AFCE53F1E1D9580D166F53AD9EB0D77A331D4A26/
- Name: font_teutonic-arkham - Name: font_teutonic-arkham
Type: 1 Type: 1
URL: http://cloud-3.steamusercontent.com/ugc/2027213118467703445/89328E273B4C5180BF491516CE998DE3C604E162/ URL: http://cloud-3.steamusercontent.com/ugc/2027213118467703445/89328E273B4C5180BF491516CE998DE3C604E162/
- Name: font_uglyqua
Type: 1
URL: http://cloud-3.steamusercontent.com/ugc/2027213118466516005/113C19D37CFFA9E554394FD5B11B32967F846A62/
- Name: font_chinese_fzlibian
Type: 1
URL: http://cloud-3.steamusercontent.com/ugc/2028355502896482829/8DAB311590B97586309E66D795AC2C43D4913188/
- Name: header_cover - Name: header_cover
Type: 0 Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753624/53E7443E2A9957BC5CA4D73B67D5C1C30971C9F9/ URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753624/53E7443E2A9957BC5CA4D73B67D5C1C30971C9F9/
@ -143,24 +122,18 @@ CustomUIAssets:
- Name: header_olive - Name: header_olive
Type: 0 Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753733/F67B7B37FF7AA253B6D697E577DF54A3E76030C2/ URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753733/F67B7B37FF7AA253B6D697E577DF54A3E76030C2/
- Name: option_on
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2024962321889555728/22ABD35CBB49A001F3A5318E4AFCFB22D24FEA39/
- Name: option_off
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2024962321889555661/6643E5CC9160FF4624672C255D0DF7B313DA00A5/
- Name: SpeechBubble - Name: SpeechBubble
Type: 0 Type: 0
URL: https://i.imgur.com/6MReiEO.png URL: https://i.imgur.com/6MReiEO.png
- Name: Inv-Roland
Type: 0
URL: https://i.imgur.com/lx6unDY.png
- Name: NextArrow - Name: NextArrow
Type: 0 Type: 0
URL: https://i.imgur.com/MztSQis.png URL: https://i.imgur.com/MztSQis.png
- Name: Exit - Name: Exit
Type: 0 Type: 0
URL: https://i.imgur.com/8qmTXwt.png URL: https://i.imgur.com/8qmTXwt.png
- Name: Inv-Roland
Type: 0
URL: https://i.imgur.com/lx6unDY.png
- Name: Inv-Mandy - Name: Inv-Mandy
Type: 0 Type: 0
URL: https://i.imgur.com/hniMC5g.png URL: https://i.imgur.com/hniMC5g.png
@ -224,7 +197,37 @@ CustomUIAssets:
- Name: box-cover-mask-wide - Name: box-cover-mask-wide
Type: 0 Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2115061298538827369/A20C2ECB8ECDC1B0AD8B2B38F68CA1C1F5E07D37/ URL: http://cloud-3.steamusercontent.com/ugc/2115061298538827369/A20C2ECB8ECDC1B0AD8B2B38F68CA1C1F5E07D37/
Date: Mon Mar 4 23:52:37 CET 2024 - Name: token-skull
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374775547231/E0FEEF462DE4E7704832CA2415D0D027A6BF5041/
- Name: token-bless
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374775547028/7855033DE0EB1FDDF706E1303054D35FE0902532/
- Name: token-curse
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374775547135/2360372CBE9452CB7B4D135BE13BBA6D46B7D427/
- Name: token-cultist
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374792650461/10D8037632900AA86045BDD42A564716D5855B1B/
- Name: token-tablet
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374792650857/29DAE514E5C838C24C90ABBFFF92B1359B9A2F76/
- Name: token-elder-thing
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374792650683/1C046B6335317CA1AEBFC80645EEC18852D83D80/
- Name: token-frost
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374792650766/73E07A50BE6FD9BED266F3421B472C4BF913DE81/
- Name: token-auto-fail
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2510267932886739653/CB7AA2D73777EF5938A6E6CD664B2ABA52B6E20A/
- Name: token-eldersign
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2540675016035917168/C0D6F531A85FD94C2F54825DFC50781B5B499A1D/
- Name: token-custom-token
Type: 0
URL: http://cloud-3.steamusercontent.com/ugc/2380784374792650571/E4C2B2B69282A4EE15FE290FF6B08BEFC8FCA65C/
Date: Mon Jul 8 20:19:48 CEST 2024
DecalPallet: DecalPallet:
- ImageURL: http://cloud-3.steamusercontent.com/ugc/1474319121424323663/BC5570ECF747F1B30224461B576E8B0FE7FA5F33/ - ImageURL: http://cloud-3.steamusercontent.com/ugc/1474319121424323663/BC5570ECF747F1B30224461B576E8B0FE7FA5F33/
Name: Achivement Checkmark Name: Achivement Checkmark
@ -233,7 +236,7 @@ DecalPallet:
Name: Victory Display Name: Victory Display
Size: 15 Size: 15
Decals: [] Decals: []
EpochTime: 1709592757 EpochTime: 1720462788
GameComplexity: '' GameComplexity: ''
GameMode: Arkham Horror LCG - Super Complete Edition GameMode: Arkham Horror LCG - Super Complete Edition
GameType: '' GameType: ''
@ -284,7 +287,7 @@ Lighting:
LutIndex: 0 LutIndex: 0
ReflectionIntensity: 1 ReflectionIntensity: 1
LuaScript: !include 'unpacked.ttslua' LuaScript: !include 'unpacked.ttslua'
LuaScriptState: '{"acknowledgedUpgradeVersions":[],"chaosTokensGUID":[],"optionPanel":{"cardLanguage":"en","changePlayAreaImage":false,"playAreaConnectionColor":{"a":1,"b":0.4,"g":0.4,"r":0.4},"playAreaConnections":true,"playAreaSnapTags":true,"showAttachmentHelper":false,"showCleanUpHelper":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":false,"showSearchAssistant":false,"showTitleSplash":true,"useClueClickers":false,"useResourceCounters":"disabled","useSnapTags":true}}' LuaScriptState: '{"acknowledgedUpgradeVersions":[],"chaosTokensGUID":[],"optionPanel":{"cardLanguage":"en","changePlayAreaImage":false,"enableCardHelpers":true,"playAreaConnectionColor":{"a":1,"b":0.4,"g":0.4,"r":0.4},"playAreaConnections":true,"playAreaSnapTags":true,"showAttachmentHelper":false,"showCleanUpHelper":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":false,"showSearchAssistant":false,"showTitleSplash":true,"useClassTexture":true,"useClueClickers":false,"useResourceCounters":"disabled","useSnapTags":true}}'
MusicPlayer: MusicPlayer:
AudioLibrary: AudioLibrary:
- Item1: http://cloud-3.steamusercontent.com/ugc/784110538847453001/4481D1CC5684FCF04AB143954DEFE09E94BF5CEB/ - Item1: http://cloud-3.steamusercontent.com/ugc/784110538847453001/4481D1CC5684FCF04AB143954DEFE09E94BF5CEB/
@ -342,11 +345,14 @@ MusicPlayer:
Note: '' Note: ''
ObjectStates: ObjectStates:
- !include 'unpacked/go_game_piece_white GUID Reference Handler 123456.yaml' - !include 'unpacked/go_game_piece_white GUID Reference Handler 123456.yaml'
- !include 'unpacked/go_game_piece_white Game Key Handler fce69c.yaml'
- !include 'unpacked/Checker_white Token Spawn Tracker e3ffc9.yaml' - !include 'unpacked/Checker_white Token Spawn Tracker e3ffc9.yaml'
- !include 'unpacked/HandTrigger 5fe087.yaml' - !include 'unpacked/HandTrigger 5fe087.yaml'
- !include 'unpacked/HandTrigger be2f17.yaml' - !include 'unpacked/HandTrigger be2f17.yaml'
- !include 'unpacked/HandTrigger 0285cc.yaml' - !include 'unpacked/HandTrigger 0285cc.yaml'
- !include 'unpacked/HandTrigger a70eee.yaml' - !include 'unpacked/HandTrigger a70eee.yaml'
- !include 'unpacked/ScriptingTrigger a2f932.yaml'
- !include 'unpacked/FogOfWarTrigger 3aab97.yaml'
- !include 'unpacked/Custom_Assetbundle TableLegBottomRight afc863.yaml' - !include 'unpacked/Custom_Assetbundle TableLegBottomRight afc863.yaml'
- !include 'unpacked/Custom_Assetbundle TableLegBottomLeft c8edca.yaml' - !include 'unpacked/Custom_Assetbundle TableLegBottomLeft c8edca.yaml'
- !include 'unpacked/Custom_Assetbundle TableLegTopLeft 393bf7.yaml' - !include 'unpacked/Custom_Assetbundle TableLegTopLeft 393bf7.yaml'
@ -402,7 +408,9 @@ ObjectStates:
- !include 'unpacked/Custom_Model_Bag Trash 5f896a.yaml' - !include 'unpacked/Custom_Model_Bag Trash 5f896a.yaml'
- !include 'unpacked/Custom_Model_Bag Trash 147e80.yaml' - !include 'unpacked/Custom_Model_Bag Trash 147e80.yaml'
- !include 'unpacked/Custom_Model_Bag Trash f7b6c8.yaml' - !include 'unpacked/Custom_Model_Bag Trash f7b6c8.yaml'
- !include 'unpacked/Custom_Tile Patch Notes f47225.yaml'
- !include 'unpacked/Custom_PDF Rules Reference d99993.yaml' - !include 'unpacked/Custom_PDF Rules Reference d99993.yaml'
- !include 'unpacked/Custom_PDF Latest FAQ faqfaq.yaml'
- !include 'unpacked/Custom_Model_Infinite_Bag Doom tokens 16724b.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Doom tokens 16724b.yaml'
- !include 'unpacked/Custom_Model_Infinite_Bag Clue tokens fae2f6.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Clue tokens fae2f6.yaml'
- !include 'unpacked/Custom_Model_Infinite_Bag Clue tokens 3b2550.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Clue tokens 3b2550.yaml'
@ -416,8 +424,6 @@ ObjectStates:
- !include 'unpacked/Custom_Model_Infinite_Bag Damage Tokens 480bda.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Damage Tokens 480bda.yaml'
- !include 'unpacked/Custom_Model_Infinite_Bag Resource tokens 9fadf9.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Resource tokens 9fadf9.yaml'
- !include 'unpacked/Custom_Model_Infinite_Bag Connection markers 170f10.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Connection markers 170f10.yaml'
- !include 'unpacked/FogOfWarTrigger 3aab97.yaml'
- !include 'unpacked/Custom_Model_Bag Leaked Items 42cd6e.yaml'
- !include 'unpacked/Custom_Model_Bag Chaos Token Reserve 106418.yaml' - !include 'unpacked/Custom_Model_Bag Chaos Token Reserve 106418.yaml'
- !include 'unpacked/Custom_Model Clue Counter 37be78.yaml' - !include 'unpacked/Custom_Model Clue Counter 37be78.yaml'
- !include 'unpacked/Custom_Model Clue Counter 1769ed.yaml' - !include 'unpacked/Custom_Model Clue Counter 1769ed.yaml'
@ -426,8 +432,7 @@ ObjectStates:
- !include 'unpacked/Custom_Token Master Clue Counter 4a3aa4.yaml' - !include 'unpacked/Custom_Token Master Clue Counter 4a3aa4.yaml'
- !include 'unpacked/Custom_Model_Bag Legacy Assets 7165a9.yaml' - !include 'unpacked/Custom_Model_Bag Legacy Assets 7165a9.yaml'
- !include 'unpacked/Custom_Token Play Area 721ba2.yaml' - !include 'unpacked/Custom_Token Play Area 721ba2.yaml'
- !include 'unpacked/Bag Additional Player Cards 2cba6b.yaml' - !include 'unpacked/Custom_Model_Bag Additional Player Cards 2cba6b.yaml'
- !include 'unpacked/Custom_Assetbundle_Bag Barkham Horror 308439.yaml'
- !include 'unpacked/Custom_Token Chaos Bag Stat Tracker 766620.yaml' - !include 'unpacked/Custom_Token Chaos Bag Stat Tracker 766620.yaml'
- !include 'unpacked/Checker_white Token Spawn Tool 36b4ee.yaml' - !include 'unpacked/Checker_white Token Spawn Tool 36b4ee.yaml'
- !include 'unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml' - !include 'unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml'
@ -448,8 +453,6 @@ ObjectStates:
- !include 'unpacked/Custom_Model_Bag Chaos Bag fea079.yaml' - !include 'unpacked/Custom_Model_Bag Chaos Bag fea079.yaml'
- !include 'unpacked/Custom_Tile Data Helper 708279.yaml' - !include 'unpacked/Custom_Tile Data Helper 708279.yaml'
- !include 'unpacked/Custom_Token BlessCurse Manager 5933fb.yaml' - !include 'unpacked/Custom_Token BlessCurse Manager 5933fb.yaml'
- !include 'unpacked/Notecard d8d357.yaml'
- !include 'unpacked/ScriptingTrigger a2f932.yaml'
- !include 'unpacked/Custom_Model Edge of the Earth 895eaa.yaml' - !include 'unpacked/Custom_Model Edge of the Earth 895eaa.yaml'
- !include 'unpacked/Custom_Model The Dream-Eaters a16a1a.yaml' - !include 'unpacked/Custom_Model The Dream-Eaters a16a1a.yaml'
- !include 'unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml' - !include 'unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml'
@ -459,27 +462,11 @@ ObjectStates:
- !include 'unpacked/Custom_Tile Playermat 2 Orange bd0ff4.yaml' - !include 'unpacked/Custom_Tile Playermat 2 Orange bd0ff4.yaml'
- !include 'unpacked/Custom_Tile Playermat 3 Green 383d8b.yaml' - !include 'unpacked/Custom_Tile Playermat 3 Green 383d8b.yaml'
- !include 'unpacked/Custom_Tile Playermat 4 Red 0840d5.yaml' - !include 'unpacked/Custom_Tile Playermat 4 Red 0840d5.yaml'
- !include 'unpacked/Custom_Tile Neutral 2691e1.yaml'
- !include 'unpacked/Custom_Tile Neutral 748245.yaml'
- !include 'unpacked/Custom_Tile Neutral 271b17.yaml'
- !include 'unpacked/Custom_Tile Neutral 5bafdf.yaml'
- !include 'unpacked/Custom_Tile Neutral 012577.yaml'
- !include 'unpacked/Custom_Tile Neutral 04765b.yaml'
- !include 'unpacked/Custom_Tile Neutral b71036.yaml'
- !include 'unpacked/Custom_Tile Neutral 1cb302.yaml'
- !include 'unpacked/Custom_Tile Neutral bbc5d4.yaml'
- !include 'unpacked/Custom_Tile Neutral 429bb3.yaml'
- !include 'unpacked/Custom_Tile Neutral 183dbe.yaml'
- !include 'unpacked/Custom_Tile Neutral b80db6.yaml'
- !include 'unpacked/Custom_Tile Neutral af1927.yaml'
- !include 'unpacked/Custom_Tile Neutral 0329cc.yaml'
- !include 'unpacked/Custom_Tile Neutral 5bec40.yaml'
- !include 'unpacked/Custom_Tile Neutral 5825ca.yaml'
- !include 'unpacked/Custom_Token Lead Investigator acaa93.yaml' - !include 'unpacked/Custom_Token Lead Investigator acaa93.yaml'
- !include 'unpacked/Custom_Tile ArkhamDB Deck Importer a28140.yaml' - !include 'unpacked/Custom_Tile ArkhamDB Deck Importer a28140.yaml'
- !include 'unpacked/Checker_white Configuration 03804b.yaml' - !include 'unpacked/Checker_white Configuration 03804b.yaml'
- !include 'unpacked/Custom_Token Drawing Tool 280086.yaml' - !include 'unpacked/Custom_Token Drawing Tool 280086.yaml'
- !include 'unpacked/Custom_Token Playmat Image Swapper b7b45b.yaml' - !include 'unpacked/Custom_Token PlayArea Image Swapper b7b45b.yaml'
- !include 'unpacked/Bag All Player Cards 15bb07.yaml' - !include 'unpacked/Bag All Player Cards 15bb07.yaml'
- !include 'unpacked/Custom_Token Investigator Skill Tracker af7ed7.yaml' - !include 'unpacked/Custom_Token Investigator Skill Tracker af7ed7.yaml'
- !include 'unpacked/Custom_Token Investigator Skill Tracker e598c2.yaml' - !include 'unpacked/Custom_Token Investigator Skill Tracker e598c2.yaml'
@ -500,7 +487,6 @@ ObjectStates:
- !include 'unpacked/Custom_Tile Token Remover 2ba7a5.yaml' - !include 'unpacked/Custom_Tile Token Remover 2ba7a5.yaml'
- !include 'unpacked/Custom_Tile Token Remover 0a5a29.yaml' - !include 'unpacked/Custom_Tile Token Remover 0a5a29.yaml'
- !include 'unpacked/Custom_Tile Decoration - Map 6161b4.yaml' - !include 'unpacked/Custom_Tile Decoration - Map 6161b4.yaml'
- !include 'unpacked/Custom_Model_Bag Rulebooks, Guides and Tablets fcfa7f.yaml'
- !include 'unpacked/BlockRectangle Table Divider 612072.yaml' - !include 'unpacked/BlockRectangle Table Divider 612072.yaml'
- !include 'unpacked/BlockRectangle Table Divider 975c39.yaml' - !include 'unpacked/BlockRectangle Table Divider 975c39.yaml'
- !include 'unpacked/BlockRectangle Table Divider 75937e.yaml' - !include 'unpacked/BlockRectangle Table Divider 75937e.yaml'
@ -509,10 +495,10 @@ ObjectStates:
- !include 'unpacked/Custom_Model Decoration - Ammo b43845.yaml' - !include 'unpacked/Custom_Model Decoration - Ammo b43845.yaml'
- !include 'unpacked/Custom_Model Decoration - Ammo d35ee9.yaml' - !include 'unpacked/Custom_Model Decoration - Ammo d35ee9.yaml'
- !include 'unpacked/Custom_Token Victory Display 6ccd6d.yaml' - !include 'unpacked/Custom_Token Victory Display 6ccd6d.yaml'
- !include 'unpacked/Custom_Tile Campaign Overview e03c01.yaml' - !include 'unpacked/Custom_Tile Official Releases Overview 8e22bb.yaml'
- !include 'unpacked/Custom_Tile Fan-Made Expansion Overview de7cae.yaml'
- !include 'unpacked/Bag OptionPanel Source 830bd0.yaml' - !include 'unpacked/Bag OptionPanel Source 830bd0.yaml'
- !include 'unpacked/Custom_Assetbundle SoundCube 3c988f.yaml' - !include 'unpacked/Custom_Assetbundle SoundCube 3c988f.yaml'
- !include 'unpacked/go_game_piece_white Game Key Handler fce69c.yaml'
- !include 'unpacked/Custom_Tile Token Spawning Reference f8b3a7.yaml' - !include 'unpacked/Custom_Tile Token Spawning Reference f8b3a7.yaml'
- !include 'unpacked/3DText d628cc.yaml' - !include 'unpacked/3DText d628cc.yaml'
- !include 'unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml' - !include 'unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml'
@ -520,7 +506,7 @@ ObjectStates:
- !include 'unpacked/Custom_Token Token Arranger 022907.yaml' - !include 'unpacked/Custom_Token Token Arranger 022907.yaml'
- !include 'unpacked/Custom_Tile Chaos Bag Manager 023240.yaml' - !include 'unpacked/Custom_Tile Chaos Bag Manager 023240.yaml'
- !include 'unpacked/BlockRectangle Placeholder Box Dummy a93466.yaml' - !include 'unpacked/BlockRectangle Placeholder Box Dummy a93466.yaml'
- !include 'unpacked/Custom_Model The Matter of Britain 194cc5.yaml' - !include 'unpacked/Custom_Model Lovecrafter 3077 b08d20.yaml'
- !include 'unpacked/Custom_Tile Tokencache_+1 a15273.yaml' - !include 'unpacked/Custom_Tile Tokencache_+1 a15273.yaml'
- !include 'unpacked/Custom_Tile Tokencache_0 0a8592.yaml' - !include 'unpacked/Custom_Tile Tokencache_0 0a8592.yaml'
- !include 'unpacked/Custom_Tile Tokencache_-1 b644d2.yaml' - !include 'unpacked/Custom_Tile Tokencache_-1 b644d2.yaml'
@ -541,6 +527,18 @@ ObjectStates:
- !include 'unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml' - !include 'unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml'
- !include 'unpacked/Custom_Tile Tokencache_Frost b2b7be.yaml' - !include 'unpacked/Custom_Tile Tokencache_Frost b2b7be.yaml'
- !include 'unpacked/BlockSquare Physics Detector b300d8.yaml' - !include 'unpacked/BlockSquare Physics Detector b300d8.yaml'
- !include 'unpacked/Custom_Tile Neutral 834ad5.yaml'
- !include 'unpacked/Custom_Tile Neutral a84ae4.yaml'
- !include 'unpacked/Custom_Tile Neutral 762df8.yaml'
- !include 'unpacked/Custom_Tile Neutral 589c7d.yaml'
- !include 'unpacked/Custom_Tile Neutral 642585.yaml'
- !include 'unpacked/Custom_Tile Neutral 6441b3.yaml'
- !include 'unpacked/Custom_Tile Neutral f2d25a.yaml'
- !include 'unpacked/Custom_Tile Neutral a5476b.yaml'
- !include 'unpacked/Custom_Tile Neutral 06ee01.yaml'
- !include 'unpacked/Custom_Tile Neutral 88d9ff.yaml'
- !include 'unpacked/Custom_Tile Neutral 42ec66.yaml'
- !include 'unpacked/Custom_Tile Neutral f94579.yaml'
PlayArea: 1 PlayArea: 1
PlayerCounts: PlayerCounts:
- 0 - 0
@ -548,7 +546,7 @@ PlayerCounts:
PlayingTime: PlayingTime:
- 0 - 0
- 0 - 0
SaveName: Arkham SCE - 3.7.0 SaveName: Arkham SCE - 3.9.0
Sky: Sky_Museum Sky: Sky_Museum
SkyURL: https://i.imgur.com/GkQqaOF.jpg SkyURL: https://i.imgur.com/GkQqaOF.jpg
SnapPoints: SnapPoints:
@ -736,182 +734,80 @@ SnapPoints:
x: -26 x: -26
y: 1.48 y: 1.48
z: -87 z: -87
- Position:
x: 60
y: 1.48
z: 48
- Position:
x: -42
y: 1.48
z: 89
- Position:
x: -42
y: 1.48
z: 71
- Position:
x: -62
y: 1.48
z: 71
- Position:
x: -62
y: 1.48
z: 89
TabStates: TabStates:
'10': '1':
body: "Created by Whimsical\n\nAnything that passes over the remover that isn't body: 'Welcome to Arkham Horror LCG - Super Complete Edition!
a card, deck or chaos token will be deleted.\r\nTo use the remover, right click
on it, choose the \"Enable\" option, and take your card with resources/horror/damage
and swipe it over the remover. You may wish to unlock and/or copy the remover Make sure to take the tour that can be started with the token in the middle
to your play area first." of the main playarea. Some basic notes:
DECKBUILDING
- All currently existing investigators and player cards are accessible via the
player card panel in the upper left corner of the table.
- On the leftside underneath the Investigators, you will find the ArkhamDB Deckimporter.
Insert your deck ID and it will build the deck automatically for you.
SCENARIOS & SETUP
- Arkham Horror LCG comes with a core campaign (Night of the Zealot) and several
expansions. Within each box you will find all the cards required for each scenario
setup, as well as a the official campaign guide PDF.
2. Each scenario is setup differently, and while some of the work has been prepared
beforehand (such as building encounter decks), you will have to refer to the
Campaign Guide for specific instructions on how to set up each scenario.
INVESTIGATOR PLAYMAT AND GAMEPLAY
- Playermats are scripted to automate most of the gameplay for you.'
color: Grey color: Grey
id: 10 id: 1
title: Token Remover title: Basic Intro
visibleColor: visibleColor:
b: 0.5 b: 0.5
g: 0.5 g: 0.5
r: 0.5 r: 0.5
'11': '2':
body: 'By Whimsical. Requires Numlock set to On.
Numpad 1: Cut top 3 cards of deck
Numpad 2: Cut top 6 cards of deck
Numpad 3: Cut top 9 cards of deck
Numpad 4: Spawn Damage
Numpad 5: Spawn Connection Marker
Numpad 6: Spawn Horror
Numpad 7: Spawn Doom
Numpad 8: Spawn Clue
Numpad 9: Spawn Resource
Numpad 0: Draw lines between selected objects. Hold to draw lines from mouseover
object to other selected objects.'
color: Grey
id: 11
title: Numpad Hotkeys
visibleColor:
b: 0.5
g: 0.5
r: 0.5
'7':
body: The server host can enable or disable cards in hands being hidden from other body: The server host can enable or disable cards in hands being hidden from other
players by going to the menu at the top of the TTS screen, clicking options, players by going to the menu at the top of the TTS screen, clicking options,
and choosing Hands. The "Disable" setting reveals all player hands to all players, and choosing Hands. The "Disable" setting reveals all player hands to all players,
while the "Default" setting means that each player can only see the cards in while the "Default" setting means that each player can only see the cards in
their own hand. their own hand.
color: Grey color: Grey
id: 7 id: 2
title: How to Hide Hands title: How to Hide Hands
visibleColor: visibleColor:
b: 0.5 b: 0.5
g: 0.5 g: 0.5
r: 0.5 r: 0.5
'8':
body: "Welcome to Arkham Horror LCG - Super Complete Edition!\r\n\r\nBelow you
will find all the features and instructions this mod is loaded with, that will
make your AH LCG experience easier.\r\n\r\nDECKBUILDING\r\n1. All current existing
investigators are on the right-hand side, and within each chest you will find
their investigator-specific assets and weaknesses. Also included is a basic
starter deck which only requires you to add a basic random weakness to get going.\r\n\r\n2.
On the left-hand side you will find both the weakness decks as well as lvl 0
cards sorted by class. To reveal the cards, click on each corresponding token
to deal the cards onto the table. Cards are sorted by order of Skill, event
and Asset cards top-down and increasing resource cost, left to right. \r\n\r\n3.
On the upper side you have the upgrade cards. Similarly, click each token to
deal the cards out onto the table. Cards are arranged both in increasing xp
cost and resource cost, left to right. Typically, these are the cards you will
be spending XP on between scenarios to purchase and improve your deck.\r\n4.
On the right-hand side underneath the Investigators, you will find the automated
ArkhamDB Deckbuilder (coded and maintained by Grabben). Click the load cards
button to activate the Deckbuilder, check ArkhamDB for your chosen deck\u2019s
URL and insert its number code following the instructions on the deckbuilder,
and it will build the deck automatically for you.\r\n\r\nSCENARIOS & SETUP\r\n1.
\tArkham Horror LCG comes with a core campaign (Night of the Zealot) and several
expansions (The Dunwich Legacy, The Path to Carcosa & The Forgotten Age). Within
each box you will find the volumes that contain all the cards required for each
scenario setup, as well as a tablet linking to the official campaign guide PDF.
Also included are chaos token cards and a Campaign Log.\r\n\r\n2. \tEach scenario
is setup differently, and while some of the work has been prepared beforehand
(such as building encounter decks), you will have to refer to the Campaign Guide
for specific instructions on how to set up each scenario.\r\n\r\n3. \tThe chaos
bag is always placed on the scenario setup mat in the upper right-hand corner
onto a snap point that tilts it at a 45-degree angle. Each scenario volume will
contain a difficulty card, where you will have the choice of four difficulties.
Press the button on the card according to the difficulty of your choosing and
the chaos bag will automatically be configured with the tokens specific to that
difficulty. In campaign play it is recommended to save your decks and chaos
bag at the end of your scenario to carry over onto the next, as often tokens
are added or removed from the chaos bag depending on actions or decisions made
during the game. These additional tokens can be drawn from the token reserve
book resting next to the newspaper in the middle of the main table \u2013 right
click it and search for the token you need.\n\r\n4. \tWhen placing location
cards, always place them face down on the main play area (the dark map of Arkham,
Massachusetts) with the number of clues per location unrevealed. The mod is
scripted so that when you flip said location cards (usually when entering the
location with an investigator), if it contains clues, the number of clues specific
to that location will automatically spawn. Note, that the mod only spawns tokens
in relation to the number of players currently set on the playmat player settings.
To set the number of players, left-click on the \"Investigators Playing\" number
to increase, or right-click to decrease.\r\n\n5. To make location mapping easier,
you can draw location connector tokens from the arrow-shaped container below
the main play area. Each token has three states (one way, two way and four way)
to use them accordingly to better visualize how your locations connect.\n\r\n6.
\tIf you require additional doom or clue tokens, these are located on the scenario
playmat in their corresponding containers. A handy Doom counter has been also
been added to track the doom on the agenda \u2013 left-click to add to add,
and right-click to deduct. Keep in mind that any doom spawned on enemies, locations
or assets needs to be mentally added to the doom in play on the agenda to account
for total doom.\r\n\r\nINVESTIGATOR PLAYMAT AND GAMEPLAY\r\n1. \tInvestigator
mats are scripted to automate most of the gameplay for you. wdw\n\r\n2. \tEach
mat has slots for inventory, where if you play an asset (for example you put
a gun that has 4 ammo into your right-hand slot), the mod will automatically
spawn the 4 resource tokens onto your equipped card.\n\r\n3.\tThe draw encounter
button on the left-hand side will draw the topmost card from the encounter deck
and put it in your threat area. Left-clicking will draw the card face-down,
and right-clicking will draw the card face-up. When you draw a weakness, or
engage an enemy, it is recommended you put it in your threat area, and once
you defeat the enemy or treachery, you can send it to the encounter discard
pile by clicking the discard button. If you defeat an enemy with a victory point,
make sure not to discard to the discard pile, but pick the card up and drop
it at the victory display.\n\r\n4. \tThe Click for Chaos button does just that,
draw a random chaos token from your chaos bag. Clicking a second time, sends
your chaos token back into the bag, which is then shuffled. If one player clicks
to draw a token and doesn\u2019t click a second time to send it back, the click
from another player on his personal mat will send the token back first, and
the next click will draw the token. Additionally, right-clicking the button
will continue drawing tokens and line them up next to each other, which is useful
for specific draw conditions the game may require from you. Left-clicking again
will send all drawn tokens back to the bag.\n\nADDITIONAL FEATURES:\n1. Over
20 Fan-made scenarios created by the thriving community of Arkham Horror LCG
have been included. Some of these are one-scenario missions, others are long
involved campaigns spanning multiple scenarios. These are all contained in \"The
Side Missions\". This boxset also includes the official FFG-created sidemissions
Curse of the Rougarou, Carnevale of Horrors, Labrynths of Lunacy and The Eternal
Slumber. Read the rulebook on including a side-mission into an ongoing campaign,
or play it as a one-off adventure! Setup instructions are included in each
volume.\n\n2. If you are not a fan of the dark themed Arkham map for the playmat,
you can change the image on it to any you like. At the top left hand side of
the playmat is an image icon, which when clicked will reveal a image swap panel.
Input the URL for the image you want to repalce the playmat with, and the panel
will apply the image for you. Keep in mind this will not change the existing
snap points on the current playmat.\n\r\nAs a final comment, please be sure
to let me know on the mod page in steam workshop if you find any bugs, issues
or have any suggestions for improvement!\r\n\r\n\r\n \r\n\r\n"
color: Grey
id: 8
title: Basic Intro
visibleColor:
b: 0.5
g: 0.5
r: 0.5
'9':
body: "Implemented by Tikatoy\nIdea conceived by Cadentia\n\nVersion 3.3\n\nTop
buttons manage bless tokens, bottom buttons manage curse tokens\nADD - creates
a new token and adds it to the chaos bag\nREMOVE - removes a token from the
chaos bag and destroys it\nTAKE - takes a token from the chaos bag and places
it below the manager (for sealing)\nRETURN - returns the last token taken from
the chaos bag to the chaos bag\n\nTo use Parallel Wendy, go to Options -> Game
Keys, then bind a key or mouse button to Wendy's Menu. Hover over any card (won't
work on decks) then press the bound key. Right-click seal/release options will
be added to the card.\n\n---Other Notes---\n\nOnly use ONE token manager at
a time\nTokens are limited to 10 of each type in play\nBless and curse tokens
should be in the chaos bag before trying to REMOVE or TAKE them\nEach action
logs a message which ends with (# in bag/# taken); hit enter to view log\n**WARNING**:
Tracking # of tokens in bag and in play will NOT persist between saves\n\r"
color: Grey
id: 9
title: Bless / Curse Manager
visibleColor:
b: 0.5
g: 0.5
r: 0.5
Table: Table_None Table: Table_None
Tags: [] Tags: []
Turns: Turns:

View File

@ -1,55 +0,0 @@
AltLookAngle:
x: 0
y: 0
z: 0
Autoraise: true
Bag:
Order: 0
ColorDiffuse:
b: 0
g: 0.36652
r: 0.70588
Description: 'Put any cards in here to add them to the indices for the player card
panel and deck importer.
Select the ''update index'' entry in the context menu of this bag once you''ve added
all cards.
This can be used for custom cards too.'
DragSelectable: true
GMNotes: ''
GUID: 2cba6b
Grid: true
GridProjection: false
Hands: false
HideWhenFaceDown: false
IgnoreFoW: false
LayoutGroupSortIndex: 0
Locked: true
LuaScript: !include 'Bag Additional Player Cards 2cba6b.ttslua'
LuaScriptState: ''
MaterialIndex: -1
MeasureMovement: false
MeshIndex: -1
Name: Bag
Nickname: Additional Player Cards
Number: 0
Snap: true
Sticky: true
Tags:
- AllCardsHotfix
Tooltip: true
Transform:
posX: 60
posY: 1.2
posZ: 48
rotX: 0
rotY: 0
rotZ: 0
scaleX: 1.5
scaleY: 1.5
scaleZ: 1.5
Value: 0
XmlUI: ''

View File

@ -45,13 +45,16 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund
require("playercards/AllCardsBag") require("playercards/AllCardsBag")
end) end)
__bundle_register("playercards/AllCardsBag", function(require, _LOADED, __bundle_register, __bundle_modules) __bundle_register("playercards/AllCardsBag", function(require, _LOADED, __bundle_register, __bundle_modules)
local cardIdIndex = { } local guidReferenceApi = require("core/GUIDReferenceApi")
local classAndLevelIndex = { }
local basicWeaknessList = { } local cardIdIndex = {}
local uniqueWeaknessList = { } local classAndLevelIndex = {}
local cycleIndex = { } local basicWeaknessList = {}
local uniqueWeaknessList = {}
local cycleIndex = {}
local indexingDone = false local indexingDone = false
local otherCardsDetected = false
function onLoad() function onLoad()
self.addContextMenuItem("Rebuild Index", startIndexBuild) self.addContextMenuItem("Rebuild Index", startIndexBuild)
@ -65,7 +68,7 @@ end
-- called once indexing is complete it means the hotfix bag has been added -- called once indexing is complete it means the hotfix bag has been added
-- later, and we should rebuild the index to integrate the hotfix bag. -- later, and we should rebuild the index to integrate the hotfix bag.
function rebuildIndexForHotfix() function rebuildIndexForHotfix()
if (indexingDone) then if indexingDone then
startIndexBuild() startIndexBuild()
end end
end end
@ -73,23 +76,23 @@ end
-- Resets all current bag indexes -- Resets all current bag indexes
function clearIndexes() function clearIndexes()
indexingDone = false indexingDone = false
cardIdIndex = { } cardIdIndex = {}
classAndLevelIndex = { } classAndLevelIndex = {}
classAndLevelIndex["Guardian-upgrade"] = { } classAndLevelIndex["Guardian-upgrade"] = {}
classAndLevelIndex["Seeker-upgrade"] = { } classAndLevelIndex["Seeker-upgrade"] = {}
classAndLevelIndex["Mystic-upgrade"] = { } classAndLevelIndex["Mystic-upgrade"] = {}
classAndLevelIndex["Survivor-upgrade"] = { } classAndLevelIndex["Survivor-upgrade"] = {}
classAndLevelIndex["Rogue-upgrade"] = { } classAndLevelIndex["Rogue-upgrade"] = {}
classAndLevelIndex["Neutral-upgrade"] = { } classAndLevelIndex["Neutral-upgrade"] = {}
classAndLevelIndex["Guardian-level0"] = { } classAndLevelIndex["Guardian-level0"] = {}
classAndLevelIndex["Seeker-level0"] = { } classAndLevelIndex["Seeker-level0"] = {}
classAndLevelIndex["Mystic-level0"] = { } classAndLevelIndex["Mystic-level0"] = {}
classAndLevelIndex["Survivor-level0"] = { } classAndLevelIndex["Survivor-level0"] = {}
classAndLevelIndex["Rogue-level0"] = { } classAndLevelIndex["Rogue-level0"] = {}
classAndLevelIndex["Neutral-level0"] = { } classAndLevelIndex["Neutral-level0"] = {}
cycleIndex = { } cycleIndex = {}
basicWeaknessList = { } basicWeaknessList = {}
uniqueWeaknessList = { } uniqueWeaknessList = {}
end end
-- Clears the bag indexes and starts the coroutine to rebuild the indexes -- Clears the bag indexes and starts the coroutine to rebuild the indexes
@ -104,239 +107,301 @@ function onObjectLeaveContainer(container, _)
end end
end end
-- Create the card indexes by iterating all cards in the bag, parsing their -- Create the card indexes by iterating all cards in the bag, parsing their metadata
-- metadata, and creating the keyed lookup tables for the cards. This is a -- and creating the keyed lookup tables for the cards. This is a coroutine which will
-- coroutine which will spread the workload by processing 20 cards before -- spread the workload by processing 20 cards before yielding.
-- yielding. Based on the current count of cards this will require
-- approximately 60 frames to complete.
function buildIndex() function buildIndex()
local cardCount = 0 local cardCount = 0
indexingDone = false indexingDone = false
if (self.getData().ContainedObjects == nil) then otherCardsDetected = false
return 1
end -- process the allcardsbag itself
for i, cardData in ipairs(self.getData().ContainedObjects) do for _, cardData in ipairs(self.getData().ContainedObjects) do
local cardMetadata = JSON.decode(cardData.GMNotes) addCardToIndex(cardData)
if (cardMetadata ~= nil) then
addCardToIndex(cardData, cardMetadata)
cardCount = cardCount + 1 cardCount = cardCount + 1
if cardCount > 9 then if cardCount > 19 then
cardCount = 0 cardCount = 0
coroutine.yield(0) coroutine.yield(0)
end end
end end
-- process hotfix bags (and the additional playercards bag)
for _, hotfixBag in ipairs(getObjectsWithTag("AllCardsHotfix")) do
local hotfixData = hotfixBag.getData()
-- if the bag is empty, continue with the next bag
if not hotfixData.ContainedObjects then
goto nextBag
end end
local hotfixBags = getObjectsWithTag("AllCardsHotfix")
for _, hotfixBag in ipairs(hotfixBags) do for _, cardData in ipairs(hotfixData.ContainedObjects) do
if (#hotfixBag.getObjects() > 0) then
for i, cardData in ipairs(hotfixBag.getData().ContainedObjects) do
if cardData.ContainedObjects then if cardData.ContainedObjects then
for j, deepCardData in ipairs(cardData.ContainedObjects) do -- process containers
local deepCardMetadata = JSON.decode(deepCardData.GMNotes) for _, deepCardData in ipairs(cardData.ContainedObjects) do
if deepCardMetadata ~= nil then addCardToIndex(deepCardData)
addCardToIndex(deepCardData, deepCardMetadata)
cardCount = cardCount + 1 cardCount = cardCount + 1
if cardCount > 9 then if cardCount > 19 then
cardCount = 0 cardCount = 0
coroutine.yield(0) coroutine.yield(0)
end end
end end
end
else else
local cardMetadata = JSON.decode(cardData.GMNotes) -- process single cards
if cardMetadata ~= nil then addCardToIndex(cardData)
addCardToIndex(cardData, cardMetadata)
cardCount = cardCount + 1 cardCount = cardCount + 1
if cardCount > 9 then if cardCount > 19 then
cardCount = 0 cardCount = 0
coroutine.yield(0) coroutine.yield(0)
end end
end end
end end
::nextBag::
end end
end
end
buildSupplementalIndexes() buildSupplementalIndexes()
updatePlayerCardPanel()
indexingDone = true indexingDone = true
return 1 return 1
end end
-- Adds a card to any indexes it should be a part of, based on its metadata. -- Adds a card to any indexes it should be a part of, based on its metadata
---@param cardData table TTS object data for the card ---@param cardData table TTS object data for the card
---@param cardMetadata table SCED metadata for the card function addCardToIndex(cardData)
function addCardToIndex(cardData, cardMetadata) -- using the more efficient 'json.parse()' to speed this process up
-- use the ZoopGuid as fallback if no id present local status, cardMetadata = pcall(function() return json.parse(cardData.GMNotes) end)
if cardMetadata.id == nil and cardMetadata.TtsZoopGuid then
cardMetadata.id = cardMetadata.TtsZoopGuid -- if an error happens, fallback to the regular parser
if status ~= true or cardMetadata == nil then
log("Fast parser failed for " .. cardData.Nickname .. ", using old parser instead.")
cardMetadata = JSON.decode(cardData.GMNotes)
end end
-- if metadata was not valid JSON or empty, don't add the card
if not cardMetadata == nil then
log("Error parsing " .. cardData.Nickname)
return
end
-- use the ZoopGuid as fallback if no id present
cardMetadata.id = cardMetadata.id or cardMetadata.TtsZoopGuid
cardIdIndex[cardMetadata.id] = { data = cardData, metadata = cardMetadata } cardIdIndex[cardMetadata.id] = { data = cardData, metadata = cardMetadata }
if (cardMetadata.alternate_ids ~= nil) then
-- also add data for alternate ids
if cardMetadata.alternate_ids ~= nil then
for _, alternateId in ipairs(cardMetadata.alternate_ids) do for _, alternateId in ipairs(cardMetadata.alternate_ids) do
cardIdIndex[alternateId] = { data = cardData, metadata = cardMetadata } cardIdIndex[alternateId] = { data = cardData, metadata = cardMetadata }
end end
end end
end end
-- Creates the supplemental indexes for classes, weaknesses etc.
function buildSupplementalIndexes() function buildSupplementalIndexes()
for cardId, card in pairs(cardIdIndex) do for cardId, card in pairs(cardIdIndex) do
local cardMetadata = card.metadata -- If the ID key and the metadata ID don't match this is a duplicate card created by an alternate_id, and we should skip it
-- If the ID key and the metadata ID don't match this is a duplicate card created by an if cardId == card.metadata.id then
-- alternate_id, and we should skip it -- Add card to the basic weakness list, if appropriate. Some weaknesses have multiple copies, and are added multiple times
if cardId == cardMetadata.id then if card.metadata.weakness then
-- Add card to the basic weakness list, if appropriate. Some weaknesses have table.insert(uniqueWeaknessList, card.metadata.id)
-- multiple copies, and are added multiple times if card.metadata.basicWeaknessCount ~= nil then
if cardMetadata.weakness then for i = 1, card.metadata.basicWeaknessCount do
table.insert(uniqueWeaknessList, cardMetadata.id) table.insert(basicWeaknessList, card.metadata.id)
if cardMetadata.basicWeaknessCount ~= nil then
for i = 1, cardMetadata.basicWeaknessCount do
table.insert(basicWeaknessList, cardMetadata.id)
end end
end end
end end
-- Add the card to the appropriate class and level indexes -- Excludes signature cards (which have no class or level)
local isGuardian = false if card.metadata.class ~= nil and card.metadata.level ~= nil then
local isSeeker = false local upgradeKey = "-level0"
local isMystic = false if card.metadata.level > 0 then
local isRogue = false
local isSurvivor = false
local isNeutral = false
local upgradeKey
-- Excludes signature cards (which have no class or level) and alternate
-- ID entries
if (cardMetadata.class ~= nil and cardMetadata.level ~= nil) then
isGuardian = string.match(cardMetadata.class, "Guardian")
isSeeker = string.match(cardMetadata.class, "Seeker")
isMystic = string.match(cardMetadata.class, "Mystic")
isRogue = string.match(cardMetadata.class, "Rogue")
isSurvivor = string.match(cardMetadata.class, "Survivor")
isNeutral = string.match(cardMetadata.class, "Neutral")
if (cardMetadata.level > 0) then
upgradeKey = "-upgrade" upgradeKey = "-upgrade"
else
upgradeKey = "-level0"
end
if (isGuardian) then
table.insert(classAndLevelIndex["Guardian"..upgradeKey], cardMetadata.id)
end
if (isSeeker) then
table.insert(classAndLevelIndex["Seeker"..upgradeKey], cardMetadata.id)
end
if (isMystic) then
table.insert(classAndLevelIndex["Mystic"..upgradeKey], cardMetadata.id)
end
if (isRogue) then
table.insert(classAndLevelIndex["Rogue"..upgradeKey], cardMetadata.id)
end
if (isSurvivor) then
table.insert(classAndLevelIndex["Survivor"..upgradeKey], cardMetadata.id)
end
if (isNeutral) then
table.insert(classAndLevelIndex["Neutral"..upgradeKey], cardMetadata.id)
end end
local cycleName = cardMetadata.cycle -- parse classes (separated by "|") and add the card to the appropriate class and level indices
for str in card.metadata.class:gmatch("([^|]+)") do
table.insert(classAndLevelIndex[str .. upgradeKey], card.metadata.id)
end
-- add to cycle index
local cycleName = card.metadata.cycle
if cycleName ~= nil then if cycleName ~= nil then
cycleName = string.lower(cycleName) cycleName = string.lower(cycleName)
if string.match(cycleName, "return") then
cycleName = string.sub(cycleName, 11) -- remove "return to " from cycle names
end cycleName = cycleName:gsub("return to ", "")
if cycleName == "the night of the zealot" then
cycleName = "core" -- override cycle name for night of the zealot
cycleName = cycleName:gsub("the night of the zealot", "core")
else
-- track cards without defined cycle (should only be fan-made cards)
cycleName = "other"
otherCardsDetected = true
end end
-- maybe initialize table
if cycleIndex[cycleName] == nil then if cycleIndex[cycleName] == nil then
cycleIndex[cycleName] = { } cycleIndex[cycleName] = {}
end
table.insert(cycleIndex[cycleName], cardMetadata.id)
end end
table.insert(cycleIndex[cycleName], card.metadata.id)
end end
end end
end end
-- sort class and level indices
for _, indexTable in pairs(classAndLevelIndex) do for _, indexTable in pairs(classAndLevelIndex) do
table.sort(indexTable, cardComparator) table.sort(indexTable, cardComparator)
end end
-- sort cycle indices
for _, indexTable in pairs(cycleIndex) do for _, indexTable in pairs(cycleIndex) do
table.sort(indexTable) table.sort(indexTable)
end end
-- sort weakness indices
table.sort(basicWeaknessList, cardComparator) table.sort(basicWeaknessList, cardComparator)
table.sort(uniqueWeaknessList, cardComparator) table.sort(uniqueWeaknessList, cardComparator)
end end
-- Comparison function used to sort the class card bag indexes. Sorts by card -- Comparison function used to sort the class card bag indexes. Sorts by card level, then name, then subname.
-- level, then name, then subname.
function cardComparator(id1, id2) function cardComparator(id1, id2)
local card1 = cardIdIndex[id1] local card1 = cardIdIndex[id1]
local card2 = cardIdIndex[id2] local card2 = cardIdIndex[id2]
if (card1.metadata.level ~= card2.metadata.level) then if card1.metadata.level ~= card2.metadata.level then
return card1.metadata.level < card2.metadata.level return card1.metadata.level < card2.metadata.level
end elseif card1.data.Nickname ~= card2.data.Nickname then
if (card1.data.Nickname ~= card2.data.Nickname) then
return card1.data.Nickname < card2.data.Nickname return card1.data.Nickname < card2.data.Nickname
end else
return card1.data.Description < card2.data.Description return card1.data.Description < card2.data.Description
end
end end
-- inform the player card panel about the presence of other cards (no cycle -> fan-made)
function updatePlayerCardPanel()
local panel = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayerCardPanel")
panel.call("createXML", otherCardsDetected)
end
---@return boolean: If true, the bag is currently not indexing and ready to be accessed
function isIndexReady() function isIndexReady()
if not indexingDone then
broadcastToAll("Still loading player cards, please try again in a few seconds", { 0.9, 0.2, 0.2 })
end
return indexingDone return indexingDone
end end
-- Returns a specific card from the bag, based on ArkhamDB ID -- Returns a specific card from the bag, based on ArkhamDB ID
-- Params table: ---@param params table ID of the card to retrieve
-- id: String ID of the card to retrieve ---@return table: If the indexes are still being constructed, returns an empty table.
-- Return: If the indexes are still being constructed, an empty table is -- Otherwise, a single table with the following fields
-- returned. Otherwise, a single table with the following fields -- data: TTS object data, suitable for spawning the card
-- cardData: TTS object data, suitable for spawning the card -- metadata: Table of parsed metadata
-- cardMetadata: Table of parsed metadata
function getCardById(params) function getCardById(params)
if (not indexingDone) then if not isIndexReady() then return {} end
broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2})
return { }
end
return cardIdIndex[params.id] return cardIdIndex[params.id]
end end
-- Returns a list of cards from the bag matching a class and level (0 or upgraded) -- Returns a list of cards from the bag matching a class and level (0 or upgraded)
-- Params table: ---@param params table
-- class: String class to retrieve ("Guardian", "Seeker", etc) -- class: String class to retrieve ("Guardian", "Seeker", etc)
-- isUpgraded: true for upgraded cards (Level 1-5), false for Level 0 -- isUpgraded: true for upgraded cards (Level 1-5), false for Level 0
-- Return: If the indexes are still being constructed, returns an empty table. ---@return table: If the indexes are still being constructed, returns an empty table.
-- Otherwise, a list of tables, each with the following fields -- Otherwise, a list of tables, each with the following fields
-- cardData: TTS object data, suitable for spawning the card -- data: TTS object data, suitable for spawning the card
-- cardMetadata: Table of parsed metadata -- metadata: Table of parsed metadata
function getCardsByClassAndLevel(params) function getCardsByClassAndLevel(params)
if (not indexingDone) then if not isIndexReady() then return {} end
broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2})
return { } local upgradeKey = "-level0"
end if params.upgraded then
local upgradeKey
if (params.upgraded) then
upgradeKey = "-upgrade" upgradeKey = "-upgrade"
else
upgradeKey = "-level0"
end end
return classAndLevelIndex[params.class..upgradeKey]; return classAndLevelIndex[params.class .. upgradeKey]
end end
function getCardsByCycle(cycleName) -- Returns a list of cards from the bag matching a cycle
if (not indexingDone) then ---@param params table
broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) -- cycle: String cycle to retrieve ("The Scarlet Keys" etc.)
return { } -- sortByMetadata: true to sort the table by metadata instead of ID
---@return table: If the indexes are still being constructed, returns an empty table.
-- Otherwise, a list of tables, each with the following fields
-- data: TTS object data, suitable for spawning the card
-- metadata: Table of parsed metadata
function getCardsByCycle(params)
if not isIndexReady() then return {} end
if not params.sortByMetadata then
return cycleIndex[string.lower(params.cycle)]
end end
return cycleIndex[string.lower(cycleName)]
-- sort list by metadata (useful for custom cards without proper IDs)
local cardList = {}
for _, id in ipairs(cycleIndex[string.lower(params.cycle)]) do
table.insert(cardList, id)
end
table.sort(cardList, metadataSortFunction)
return cardList
end
-- sorts cards by metadata: class, type, level, name and then description
function metadataSortFunction(id1, id2)
local card1 = cardIdIndex[id1]
local card2 = cardIdIndex[id2]
-- extract class per card
local classValue1 = getClassValueFromString(card1.metadata.class)
local classValue2 = getClassValueFromString(card2.metadata.class)
-- conversion tables to simplify type sorting
local typeConversion = {
Asset = 1,
Event = 2,
Skill = 3
}
if classValue1 ~= classValue2 then
return classValue1 < classValue2
elseif typeConversion[card1.metadata.type] ~= typeConversion[card2.metadata.type] then
return typeConversion[card1.metadata.type] < typeConversion[card2.metadata.type]
elseif card1.metadata.level ~= card2.metadata.level then
return card1.metadata.level < card2.metadata.level
elseif card1.data.Nickname ~= card2.data.Nickname then
return card1.data.Nickname < card2.data.Nickname
else
return card1.data.Description < card2.data.Description
end
end
-- helper function to calculate the class value for sorting from the "|" separated string
function getClassValueFromString(s)
local classValueList = {
Guardian = 1,
Seeker = 2,
Rogue = 3,
Mystic = 4,
Survivor = 5,
Neutral = 6
}
local classValue = 0
for str in s:gmatch("([^|]+)") do
-- this sorts multiclass cards
classValue = classValue * 10 + classValueList[str]
end
return classValue
end end
-- Searches the bag for cards which match the given name and returns a list. Note that this is -- Searches the bag for cards which match the given name and returns a list. Note that this is
-- an O(n) search without index support. It may be slow. -- an O(n) search without index support. It may be slow.
-- Parameter array must contain these fields to define the search: -- Parameter array must contain these fields to define the search:
-- name String or string fragment to search for names -- name: String or string fragment to search for names
-- exact Whether the name match should be exact -- exact: Whether the name match should be exact
function getCardsByName(params) function getCardsByName(params)
local name = params.name local name = params.name
local exact = params.exact local exact = params.exact
local results = { } local results = {}
-- Track cards (by ID) that we've added to avoid duplicates that may come from alternate IDs -- Track cards (by ID) that we've added to avoid duplicates that may come from alternate IDs
local addedCards = { } local addedCards = {}
for _, cardData in pairs(cardIdIndex) do for _, cardData in pairs(cardIdIndex) do
if (not addedCards[cardData.metadata.id]) then if (not addedCards[cardData.metadata.id]) then
if (exact and (string.lower(cardData.data.Nickname) == string.lower(name))) if (exact and (string.lower(cardData.data.Nickname) == string.lower(name)))
@ -349,42 +414,65 @@ function getCardsByName(params)
return results return results
end end
-- Gets a random basic weakness from the bag. Once a given ID has been returned -- Gets a random basic weakness from the bag. Once a given ID has been returned it will be
-- it will be removed from the list and cannot be selected again until a reload -- removed from the list and cannot be selected again until a reload occurs or the indexes
-- occurs or the indexes are rebuilt, which will refresh the list to include all -- are rebuilt, which will refresh the list to include all weaknesses.
-- weaknesses. ---@return string: ID of the selected weakness
-- Return: String ID of the selected weakness.
function getRandomWeaknessId() function getRandomWeaknessId()
local availableWeaknesses = buildAvailableWeaknesses() local availableWeaknesses = buildAvailableWeaknesses()
if (#availableWeaknesses > 0) then if #availableWeaknesses > 0 then
return availableWeaknesses[math.random(#availableWeaknesses)] return availableWeaknesses[math.random(#availableWeaknesses)]
end end
end end
-- Constructs a list of available basic weaknesses by starting with the full pool of basic -- Constructs a list of available basic weaknesses by starting with the full pool of basic
-- weaknesses then removing any which are currently in the play or deck construction areas -- weaknesses then removing any which are currently in the play or deck construction areas
-- Return: Table array of weakness IDs which are valid to choose from ---@param traits? string Trait(s) to use as filter
function buildAvailableWeaknesses() ---@return table: Array of weakness IDs which are valid to choose from
local weaknessesInPlay = { } function buildAvailableWeaknesses(traits)
local weaknessesInPlay = {}
local allObjects = getAllObjects() local allObjects = getAllObjects()
for _, object in ipairs(allObjects) do for _, object in ipairs(allObjects) do
if (object.name == "Deck") then if object.type == "Deck" then
for _, cardData in ipairs(object.getData().ContainedObjects) do for _, cardData in ipairs(object.getData().ContainedObjects) do
local cardMetadata = JSON.decode(cardData.GMNotes) incrementWeaknessCount(weaknessesInPlay, JSON.decode(cardData.GMNotes))
incrementWeaknessCount(weaknessesInPlay, cardMetadata)
end end
elseif (object.name == "Card") then elseif object.type == "Card" then
local cardMetadata = JSON.decode(object.getGMNotes()) incrementWeaknessCount(weaknessesInPlay, JSON.decode(object.getGMNotes()))
incrementWeaknessCount(weaknessesInPlay, cardMetadata)
end end
end end
local availableWeaknesses = { } local availableWeaknesses = {}
for _, weaknessId in ipairs(basicWeaknessList) do for _, weaknessId in ipairs(basicWeaknessList) do
if (weaknessesInPlay[weaknessId] ~= nil and weaknessesInPlay[weaknessId] > 0) then if (weaknessesInPlay[weaknessId] ~= nil and weaknessesInPlay[weaknessId] > 0) then
weaknessesInPlay[weaknessId] = weaknessesInPlay[weaknessId] - 1 weaknessesInPlay[weaknessId] = weaknessesInPlay[weaknessId] - 1
else else
if traits then
-- split the string into separate traits (separated by "|")
local allowedTraits = {}
for str in traits:gmatch("([^|]+)") do
-- remove dots
str = str:gsub("[%.]", "")
-- remove leading and trailing whitespace
str = str:match("^%s*(.-)%s*$")
-- make sure string ends with a dot
str = string.lower(str .. ".")
table.insert(allowedTraits, str)
end
-- make sure the trait is present on the weakness
local card = cardIdIndex[weaknessId]
for _, allowedTrait in ipairs(allowedTraits) do
if string.contains(string.lower(card.metadata.traits), allowedTrait) then
table.insert(availableWeaknesses, weaknessId) table.insert(availableWeaknesses, weaknessId)
break
end
end
else
table.insert(availableWeaknesses, weaknessId)
end
end end
end end
return availableWeaknesses return availableWeaknesses
@ -400,8 +488,8 @@ end
-- Helper function that adds one to the table entry for the number of weaknesses in play -- Helper function that adds one to the table entry for the number of weaknesses in play
function incrementWeaknessCount(table, cardMetadata) function incrementWeaknessCount(table, cardMetadata)
if (isBasicWeakness(cardMetadata)) then if isBasicWeakness(cardMetadata) then
if (table[cardMetadata.id] == nil) then if table[cardMetadata.id] == nil then
table[cardMetadata.id] = 1 table[cardMetadata.id] = 1
else else
table[cardMetadata.id] = table[cardMetadata.id] + 1 table[cardMetadata.id] = table[cardMetadata.id] + 1
@ -416,4 +504,56 @@ function isBasicWeakness(cardMetadata)
and cardMetadata.basicWeaknessCount > 0 and cardMetadata.basicWeaknessCount > 0
end end
end) end)
__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local GUIDReferenceApi = {}
local function getGuidHandler()
return getObjectFromGUID("123456")
end
-- Returns the matching object
---@param owner string Parent object for this search
---@param type string Type of object to search for
---@return any: Object reference to the matching object
GUIDReferenceApi.getObjectByOwnerAndType = function(owner, type)
return getGuidHandler().call("getObjectByOwnerAndType", { owner = owner, type = type })
end
-- Returns all matching objects as a table with references
---@param type string Type of object to search for
---@return table: List of object references to matching objects
GUIDReferenceApi.getObjectsByType = function(type)
return getGuidHandler().call("getObjectsByType", type)
end
-- Returns all matching objects as a table with references
---@param owner string Parent object for this search
---@return table: List of object references to matching objects
GUIDReferenceApi.getObjectsByOwner = function(owner)
return getGuidHandler().call("getObjectsByOwner", owner)
end
-- Sends new information to the reference handler to edit the main index
---@param owner string Parent of the object
---@param type string Type of the object
---@param guid string GUID of the object
GUIDReferenceApi.editIndex = function(owner, type, guid)
return getGuidHandler().call("editIndex", {
owner = owner,
type = type,
guid = guid
})
end
-- Returns the owner of an object or the object it's located on
---@param object tts__GameObject Object for this search
---@return string: Parent of the object or object it's located on
GUIDReferenceApi.getOwnerOfObject = function(object)
return getGuidHandler().call("getOwnerOfObject", object)
end
return GUIDReferenceApi
end
end)
return __bundle_require("__root") return __bundle_require("__root")

View File

@ -16,6 +16,11 @@ ContainedObjects:
- !include 'Bag All Player Cards 15bb07/Card Reality Acid 0a1b3a.yaml' - !include 'Bag All Player Cards 15bb07/Card Reality Acid 0a1b3a.yaml'
- !include 'Bag All Player Cards 15bb07/Card Reality Acid Reference 858b0a.yaml' - !include 'Bag All Player Cards 15bb07/Card Reality Acid Reference 858b0a.yaml'
- !include 'Bag All Player Cards 15bb07/Card Ravenous 558b0a.yaml' - !include 'Bag All Player Cards 15bb07/Card Ravenous 558b0a.yaml'
- !include 'Bag All Player Cards 15bb07/CardCustom Rex Murphy (Parallel) 0a5492.yaml'
- !include 'Bag All Player Cards 15bb07/CardCustom Rex Murphy (Parallel Back) 0a5493.yaml'
- !include 'Bag All Player Cards 15bb07/CardCustom Rex Murphy (Parallel Front) 0a5494.yaml'
- !include 'Bag All Player Cards 15bb07/CardCustom Search for the Truth 4156dd.yaml'
- !include 'Bag All Player Cards 15bb07/Card Rex''s Curse 033a36.yaml'
- !include 'Bag All Player Cards 15bb07/Card Charlie Kane 4deeff.yaml' - !include 'Bag All Player Cards 15bb07/Card Charlie Kane 4deeff.yaml'
- !include 'Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml' - !include 'Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml'
- !include 'Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml' - !include 'Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml'
@ -1543,7 +1548,7 @@ ContainedObjects:
- !include 'Bag All Player Cards 15bb07/Card Mandy Thompson (Taboo) 4f3637.yaml' - !include 'Bag All Player Cards 15bb07/Card Mandy Thompson (Taboo) 4f3637.yaml'
- !include 'Bag All Player Cards 15bb07/Card Trish Scarborough (Taboo) 2ce76d.yaml' - !include 'Bag All Player Cards 15bb07/Card Trish Scarborough (Taboo) 2ce76d.yaml'
- !include 'Bag All Player Cards 15bb07/Card Lola Hayes (Taboo) 52956d.yaml' - !include 'Bag All Player Cards 15bb07/Card Lola Hayes (Taboo) 52956d.yaml'
- !include 'Bag All Player Cards 15bb07/Card Rex Murphy (Taboo) 0a5491.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Rex Murphy (Taboo) 0a5491.yaml'
- !include 'Bag All Player Cards 15bb07/Card Runic Axe Upgrade Sheet (Taboo) 4d729b.yaml' - !include 'Bag All Player Cards 15bb07/Card Runic Axe Upgrade Sheet (Taboo) 4d729b.yaml'
- !include 'Bag All Player Cards 15bb07/Card Power Word Upgrade Sheet (Taboo) ebce85.yaml' - !include 'Bag All Player Cards 15bb07/Card Power Word Upgrade Sheet (Taboo) ebce85.yaml'
- !include 'Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml' - !include 'Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml'
@ -1717,6 +1722,15 @@ ContainedObjects:
- !include 'Bag All Player Cards 15bb07/Card Servant of Brass 06bc7e.yaml' - !include 'Bag All Player Cards 15bb07/Card Servant of Brass 06bc7e.yaml'
- !include 'Bag All Player Cards 15bb07/Card Read the Signs (2) 5ce4d4.yaml' - !include 'Bag All Player Cards 15bb07/Card Read the Signs (2) 5ce4d4.yaml'
- !include 'Bag All Player Cards 15bb07/Card Elaborate Distraction d1422e.yaml' - !include 'Bag All Player Cards 15bb07/Card Elaborate Distraction d1422e.yaml'
- !include 'Bag All Player Cards 15bb07/Card Dr. Rosa Marquez 62d5a6.yaml'
- !include 'Bag All Player Cards 15bb07/Card The Pearl Diary 34a7b5.yaml'
- !include 'Bag All Player Cards 15bb07/Card Ajax f8a7c6.yaml'
- !include 'Bag All Player Cards 15bb07/Card Corn Husk Doll 3602f5.yaml'
- !include 'Bag All Player Cards 15bb07/Card The Hemlock Curse 0d0a2c.yaml'
- !include 'Bag All Player Cards 15bb07/Card Worry Rock 5e5dc6.yaml'
- !include 'Bag All Player Cards 15bb07/Card Little Sylvie 153a42.yaml'
- !include 'Bag All Player Cards 15bb07/Card Prismatic Shard 27fe24.yaml'
- !include 'Bag All Player Cards 15bb07/Card Helen Peters 33bfa1.yaml'
Description: '' Description: ''
DragSelectable: true DragSelectable: true
GMNotes: '' GMNotes: ''

View File

@ -20,7 +20,7 @@ CustomDeck:
Description: Advanced Description: Advanced
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Red Tide Rising\"\n}"
GUID: 89fe92 GUID: 89fe92
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,8 +20,9 @@ CustomDeck:
Description: '' Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"02266-t\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n GMNotes: "{\n \"id\": \"02266-t\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n
\ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"cycle\": \"The Dunwich \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"uses\": [\n {\n
Legacy\"\n}" \ \"count\": 3,\n \"type\": \"Universal\",\n \"token\": \"universalActionAbility\"\n
\ }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}"
GUID: e92f21 GUID: e92f21
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,8 +20,9 @@ CustomDeck:
Description: '' Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"02266\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n GMNotes: "{\n \"id\": \"02266\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n
\ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"cycle\": \"The Dunwich \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"uses\": [\n {\n
Legacy\"\n}" \ \"count\": 3,\n \"type\": \"Universal\",\n \"token\": \"universalActionAbility\"\n
\ }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}"
GUID: 074858 GUID: 074858
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,14 +21,15 @@ Description: The Waitress
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"01004-pb\",\n \"type\": \"Investigator\",\n \"class\": GMNotes: "{\n \"id\": \"01004-pb\",\n \"type\": \"Investigator\",\n \"class\":
\"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\":
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Bad Blood\",\n
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
[\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"01012\":
1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": 1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"90019\":
[\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n \"occult\"\n
3\n }\n }\n ]\n}" \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
\ }\n ]\n}"
GUID: 909f30 GUID: 909f30
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,14 +21,14 @@ Description: The Waitress
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"01004-pf\",\n \"type\": \"Investigator\",\n \"class\": GMNotes: "{\n \"id\": \"01004-pf\",\n \"type\": \"Investigator\",\n \"class\":
\"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\":
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Bad Blood\",\n
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
[\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"01012\":
1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": 1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"90019\":
[\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n
\ }\n ]\n}" \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
GUID: 02db0a GUID: 02db0a
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,14 +21,15 @@ Description: The Waitress
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"01004-p\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n GMNotes: "{\n \"id\": \"01004-p\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
\ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\": \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Bad Blood\",\n \"extraToken\":
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
[\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"signatures\": [\n {\n \"01012\": 1,\n \"90018\": 1\n
1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": \ },\n {\n \"01013\": 1,\n \"90019\": 1\n }\n ]\n
[\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n \"occult\"\n
3\n }\n }\n ]\n}" \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
\ }\n ]\n}"
GUID: 01b6ef GUID: 01b6ef
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,10 +22,10 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"01004\",\n \"alternate_ids\": [\n \"01504\"\n ],\n \"type\": GMNotes: "{\n \"id\": \"01004\",\n \"alternate_ids\": [\n \"01504\"\n ],\n \"type\":
\"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\":
5,\n \"intellectIcons\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": 5,\n \"intellectIcons\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\":
\"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \"Core\",\n \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\":
1,\n \"signatures\": [\n {\n \"01012\": 1,\n \"90018\": 1\n 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"01012\":
\ },\n {\n \"01013\": 1,\n \"90019\": 1\n }\n ]\n 1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"90019\":
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n
\ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
@ -70,15 +70,15 @@ States:
GMNotes: "{\r\n \"id\": \"01004\",\r\n \"alternate_ids\": [\r\n \"01504\"\r\n GMNotes: "{\r\n \"id\": \"01004\",\r\n \"alternate_ids\": [\r\n \"01504\"\r\n
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\": \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\":
\"Sorcerer.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": \"Sorcerer.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\":
2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"Core\",\r\n \"deck_requirements\": 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"Core\",\r\n \"extraToken\":
{\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": \"Reaction\", \r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\":
[\r\n {\r\n \"01012\": 1,\r\n \"90018\": 1\r\n },\r\n 1,\r\n \"signatures\": [\r\n {\r\n \"01012\": 1,\r\n \"90018\":
\ {\r\n \"01013\": 1,\r\n \"90019\": 1\r\n }\r\n ]\r\n 1\r\n },\r\n {\r\n \"01013\": 1,\r\n \"90019\": 1\r\n
\ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n \ }\r\n ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"faction\":
\ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n [\r\n \"mystic\",\r\n \"neutral\"\r\n ],\r\n \"level\":
\ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n {\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n
\ \"survivor\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n \ \"faction\": [\r\n \"survivor\"\r\n ],\r\n \"level\":
\ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" {\r\n \"min\": 0,\r\n \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n"
GUID: 6797bb GUID: 6797bb
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -81,12 +81,12 @@ States:
- Minicard - Minicard
Tooltip: true Tooltip: true
Transform: Transform:
posX: 40.7253036 posX: 40
posY: 1.29860592 posY: 1.3
posZ: 66.7765656 posZ: 66
rotX: 1.697304e-07 rotX: 0
rotY: 270.0102 rotY: 270
rotZ: 2.00479718e-07 rotZ: 0
scaleX: 0.6 scaleX: 0.6
scaleY: 1 scaleY: 1
scaleZ: 0.6 scaleZ: 0.6

View File

@ -0,0 +1,56 @@
AltLookAngle:
x: 0
y: 0
z: 0
Autoraise: true
CardID: 537606
ColorDiffuse:
b: 0.71324
g: 0.71324
r: 0.71324
CustomDeck:
'5376':
BackIsHidden: true
BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/
FaceURL: http://cloud-3.steamusercontent.com/ugc/2453969772006056023/3B1E7D4CD84213ED69594B15606531799383F4AA/
NumHeight: 3
NumWidth: 9
Type: 0
UniqueBack: false
Description: Faithful Steed
DragSelectable: true
GMNotes: "{\n \"id\": \"10642\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n
\ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Ally. Creature.\",\n
\ \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: f8a7c6
Grid: true
GridProjection: false
Hands: true
HideWhenFaceDown: true
IgnoreFoW: false
LayoutGroupSortIndex: 0
Locked: false
LuaScript: ''
LuaScriptState: ''
MeasureMovement: false
Name: Card
Nickname: Ajax
SidewaysCard: false
Snap: true
Sticky: true
Tags:
- Asset
- PlayerCard
Tooltip: true
Transform:
posX: 31.17
posY: 3.67
posZ: 11.69
rotX: 0
rotY: 270
rotZ: 0
scaleX: 1
scaleY: 1
scaleZ: 1
Value: 0
XmlUI: ''

View File

@ -22,7 +22,7 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"03004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n GMNotes: "{\n \"id\": \"03004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
\ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n
\ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
1,\n \"signatures\": [\n {\n \"03014\": 1\n },\n {\n \"03015\": 1,\n \"signatures\": [\n {\n \"03014\": 1\n },\n {\n \"03015\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":

View File

@ -22,12 +22,13 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"10009\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n GMNotes: "{\n \"id\": \"10009\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n
\ \"traits\": \"Drifter. Socialite.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": \ \"traits\": \"Drifter. Socialite.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\":
4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Feast of Hemlock 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Feast of Hemlock
Vale\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": Vale\",\n \"extraToken\": \"Parley\",\n \"deck_requirements\": {\n \"size\":
1,\n \"signatures\": [\n {\n \"10010\": 3\n },\n {\n \"10011\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"10010\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n 3\n },\n {\n \"10011\": 1\n }\n ]\n },\n \"deck_options\":
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": [\n {\n \"faction\": [\n \"rogue\",\n \"neutral\"\n ],\n
5\n }\n },\n {\n \"special\": [\n \"parley\"\n ],\n \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n }\n ]\n}" \ \"special\": [\n \"parley\"\n ],\n \"level\": {\n \"min\":
0,\n \"max\": 5\n }\n }\n ]\n}"
GUID: 54eaa5 GUID: 54eaa5
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,13 +22,14 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"07002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n GMNotes: "{\n \"id\": \"07002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n
\ \"traits\": \"Miskatonic. Scholar.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": \ \"traits\": \"Miskatonic. Scholar.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\":
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Innsmouth 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Innsmouth
Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": Conspiracy\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\":
1,\n \"signatures\": [\n {\n \"07008\": 1\n },\n {\n \"07009\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"07008\":
1\n }\n ]\n \n },\n \"deck_options\": [\n {\n \"faction\": 1\n },\n {\n \"07009\": 1\n }\n ]\n \n },\n \"deck_options\":
[\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": [\n {\n \"faction\": [\n \"seeker\",\n \"neutral\"\n ],\n
0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"practiced\"\n \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
\ ],\n \"type\": [\n \"skill\"\n ],\n \"level\": {\n \"min\": \ \"trait\": [\n \"practiced\"\n ],\n \"type\": [\n \"skill\"\n
0,\n \"max\": 3\n }\n }\n ]\n}" \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
\ }\n ]\n}"
GUID: 05b950 GUID: 05b950
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,13 +22,13 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"09011\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n GMNotes: "{\n \"id\": \"09011\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
\ \"traits\": \"Chosen. Cursed.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": \ \"traits\": \"Chosen. Cursed.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\":
3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"09012\": 1,\n \"09013\": 1\n \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"09012\":
\ },\n {\n \"09014\": 1\n }\n ]\n },\n \"deck_options\": 1,\n \"09013\": 1\n },\n {\n \"09014\": 1\n }\n ]\n
[\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ \"trait\": [\n \"charm\"\n ],\n \"level\": {\n \"min\": 5\n }\n },\n {\n \"trait\": [\n \"charm\"\n ],\n \"level\":
0,\n \"max\": 4\n }\n }\n ]\n}" {\n \"min\": 0,\n \"max\": 4\n }\n }\n ]\n}"
GUID: 4c2a3d GUID: 4c2a3d
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -0,0 +1,238 @@
-- Bundled by luabundle {"version":"1.6.0"}
local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire)
local loadingPlaceholder = {[{}] = true}
local register
local modules = {}
local require
local loaded = {}
register = function(name, body)
if not modules[name] then
modules[name] = body
end
end
require = function(name)
local loadedModule = loaded[name]
if loadedModule then
if loadedModule == loadingPlaceholder then
return nil
end
else
if not modules[name] then
if not superRequire then
local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name)
error('Tried to require ' .. identifier .. ', but no such module has been registered')
else
return superRequire(name)
end
end
loaded[name] = loadingPlaceholder
loadedModule = modules[name](require, loaded, register, modules)
loaded[name] = loadedModule
end
return loadedModule
end
return require, loaded, register, modules
end)(nil)
__bundle_register("playercards/CardsWithHelper", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that have helpers
This file is used to share code between cards with helpers.
It syncs the visibility of the helper with the option panel and
makes sure the card has the respective tag.
Additionally, it will call 'initiliaze()' and 'shutOff()'
in the parent file if they are present.
Instructions:
1) Define the global variables before requiring this file:
hasXML = true (whether the card has an XML display)
isHelperEnabled = false (default state of the helper, should be 'false')
2) In 'onLoad()'', call 'syncDisplayWithOptionPanel()'
----------------------------------------------------------]]
local optionPanelApi = require("core/OptionPanelApi")
-- if the respective option is enabled in onLoad(), enable the helper
function syncDisplayWithOptionPanel()
self.addTag("CardWithHelper")
local options = optionPanelApi.getOptions()
if options.enableCardHelpers then
setHelperState(true)
else
updateDisplay()
end
end
-- forces a new state
function setHelperState(newState)
isHelperEnabled = newState
updateSave()
updateDisplay()
end
-- toggles the current state
function toggleHelper()
isHelperEnabled = not isHelperEnabled
updateSave()
updateDisplay()
end
-- updates the visibility and calls events (after a small delay to allow XML being set)
function updateDisplay()
Wait.frames(actualDisplayUpdate, 5)
end
function actualDisplayUpdate()
if isHelperEnabled then
self.clearContextMenu()
self.addContextMenuItem("Disable Helper", toggleHelper)
if hasXML then self.UI.show("Helper") end
if initialize then initialize() end
else
self.clearContextMenu()
self.addContextMenuItem("Enable Helper", toggleHelper)
if hasXML then self.UI.hide("Helper") end
if shutOff then shutOff() end
end
end
end)
__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local OptionPanelApi = {}
-- loads saved options
---@param options table Set a new state for the option table
OptionPanelApi.loadSettings = function(options)
return Global.call("loadSettings", options)
end
---@return any: Table of option panel state
OptionPanelApi.getOptions = function()
return Global.getTable("optionPanel")
end
return OptionPanelApi
end
end)
__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/cards/Analysis")
end)
__bundle_register("playercards/cards/Analysis", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/CardsWithHelper")
require("playercards/CardsThatRedrawTokens")
end)
__bundle_register("playercards/CardsThatRedrawTokens", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that return and redraw tokens
This file is used to add an XML button to a card, turned on via context menu.
Valid options modify the appearance of the XML button, as well as the
behavior of the return and redraw function. Set options before requiring this file.
Parameters for the return and redraw functions. Typically set VALID_TOKENS or INVALID_TOKENS, not both.
If there are no restrictions on which tokens can be redrawn (e.g. Wendy Adams), keep both empty.
* VALID_TOKENS --@type table
- keyed table which lists all tokens that can be redrawn by the card
- example usage: "False Covenant"
> VALID_TOKENS = {
> ["Curse"] = true
> }
* INVALID_TOKENS --@type table
- keyed table which lists all tokens that cannot be redrawn by the card
- example usage: "Custom Ammunition"
> INVALID_TOKENS = {
> ["Auto-fail"] = true
> }
* DRAW_SPECIFIC_TOKEN --@type string (name of token or nil)
- if set, will attempt to draw that specific token
* RETURN_TO_POOL --@type string
- allows for the name of the card to be passed onto Global for any special handling
The following parameters modify the appearence of the XML button and are not listed as part of a table.
- buttonHeight (default is 450)
- buttonWidth (default is 1400)
- buttonPosition (default is "0 -55 -22")
- buttonFontSize (default is 250)
- buttonRotation (change if button is placed on an investigator cards)
- buttonLabel (default is "Redraw Token")
- buttonIcon (to add an icon to the right)
- buttonColor (default is "#77674DE6")
----------------------------------------------------------
EXAMPLE: Claypool's Furs
This card can only redraw the Frost token, and is replaced with a random token from the bag.
As a nice reminder the XML button takes on the Frost color and icon with the text "Cancel".
> buttonValue = "Cancel"
> buttonIcon = "token-frost"
> buttonColor = "#404450E6"
> buttonFontSize = 300
> VALID_TOKENS = {
> ["Frost"] = true
> }
>
> require...
----------------------------------------------------------]]
-- intentionally global
hasXML = true
isHelperEnabled = false
function updateSave()
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
end
function onLoad(savedData)
if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData)
isHelperEnabled = loadedData.isHelperEnabled
end
createHelperXML()
syncDisplayWithOptionPanel()
end
function createHelperXML()
local xmlTable = { {
tag = "Button",
attributes = {
active = "false",
id = "Helper",
height = buttonHeight or 450,
width = buttonWidth or 1400,
rotation = buttonRotation or "0 0 180",
scale = "0.1 0.1 1",
position = buttonPosition or "0 -55 -22",
padding = "50 50 50 50",
font = "font_teutonic-arkham",
fontSize = buttonFontSize or 250,
onClick = "triggerXMLTokenLabelCreation",
color = buttonColor or "#77674DE6",
textColor = "White"
},
value = buttonLabel or "Redraw Token"
} }
if buttonIcon then
xmlTable[1].attributes.iconWidth = "400"
xmlTable[1].attributes.iconAlignment = "Right"
xmlTable[1].attributes.icon = buttonIcon
end
self.UI.setXmlTable(xmlTable)
end
function triggerXMLTokenLabelCreation()
Global.call("activeRedrawEffect", {
VALID_TOKENS = VALID_TOKENS,
INVALID_TOKENS = INVALID_TOKENS,
RETURN_TO_POOL = RETURN_TO_POOL
})
end
end)
return __bundle_require("__root")

View File

@ -30,7 +30,7 @@ HideWhenFaceDown: true
IgnoreFoW: false IgnoreFoW: false
LayoutGroupSortIndex: 0 LayoutGroupSortIndex: 0
Locked: false Locked: false
LuaScript: '' LuaScript: !include 'Card Analysis 80285f.ttslua'
LuaScriptState: '' LuaScriptState: ''
MeasureMovement: false MeasureMovement: false
Name: Card Name: Card

View File

@ -21,7 +21,8 @@ Description: Basic Weakness
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"08130\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"08130\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n \ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n
\ \"cycle\": \"Edge of the Earth\"\n}" \ \"uses\": [\n {\n \"count\": 1,\n \"type\": \"Damage\",\n \"token\":
\"damage\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}"
GUID: 8f1420 GUID: 8f1420
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,11 +21,11 @@ Description: The Drifter
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"02005-pb\",\n \"type\": \"Investigator\",\n \"class\": GMNotes: "{\n \"id\": \"02005-pb\",\n \"type\": \"Investigator\",\n \"class\":
\"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"On the Road Again\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"FreeTrigger\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n 1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\":

View File

@ -21,11 +21,11 @@ Description: The Drifter
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"02005-pf\",\n \"type\": \"Investigator\",\n \"class\": GMNotes: "{\n \"id\": \"02005-pf\",\n \"type\": \"Investigator\",\n \"class\":
\"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"On the Road Again\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n 1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\":
0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5

View File

@ -21,11 +21,11 @@ Description: The Drifter
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"02005-p\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"02005-p\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
\ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n \ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n
\ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"On the Road Again\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n 1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\":

View File

@ -22,10 +22,10 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"02005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"02005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
\ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n \ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"FreeTrigger\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n 1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\":
0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5

View File

@ -21,7 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"09091\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n GMNotes: "{\n \"id\": \"09091\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n
\ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n
\ \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" \ \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 1,\n \"type\":
\"PlayItem\",\n \"token\": \"universalActionAbility\"\n }\n ],\n \"cycle\":
\"The Scarlet Keys\"\n}"
GUID: b5d894 GUID: b5d894
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,10 +21,10 @@ Description: Singing Your Song
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10062\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n GMNotes: "{\n \"id\": \"10062\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n
\ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally.
Criminal. Socialite.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": Criminal. Socialite.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\"10063\"\n }\n ],\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 1,\n \"id\": \"10063\"\n }\n ],\n \"agilityIcons\": 1,\n \"uses\": [\n
10,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n \ {\n \"count\": 10,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n
\ \"cycle\": \"The Feast of Hemlock Vale\"\n}" \ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: 897a94 GUID: 897a94
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -39,7 +39,7 @@ SidewaysCard: false
Snap: true Snap: true
Sticky: true Sticky: true
Tags: Tags:
- ScenarioCard - PlayerCard
Tooltip: true Tooltip: true
Transform: Transform:
posX: 48.98 posX: 48.98

View File

@ -21,7 +21,8 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10129\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"10129\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Double.\",\n \"wildIcons\": 1,\n \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Double.\",\n \"wildIcons\": 1,\n
\ \"cycle\": \"The Feast of Hemlock Vale\"\n}" \ \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Universal\",\n \"token\":
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: 24d3b3 GUID: 24d3b3
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,16 +22,17 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"08016\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"08016\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
\ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": \ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\":
4,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\",\n 4,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"PlayItem\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"08017\": 1\n },\n {\n \"08018\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"08017\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n 1\n },\n {\n \"08018\": 1\n }\n ]\n },\n \"deck_options\":
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n [\n {\n \"faction\": [\n \"survivor\"\n ],\n \"level\":
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n },\n {\n \"faction\":
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
[\n \"rogue\"\n ],\n \"level\": {\n \"min\": 1,\n \"max\":
5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\": 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\":
{\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"error\": {\n \"min\": 1,\n \"max\": 5\n }\n },\n {\n \"faction\":
\"You cannot have more than 5 level 0 Rogue cards\"\n }\n ]\n}" [\n \"rogue\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5
level 0 Rogue cards\"\n }\n ]\n}"
GUID: 419b0c GUID: 419b0c
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -14,18 +14,18 @@
onClick="resolveToken" onClick="resolveToken"
textColor="white" textColor="white"
active="false"/> active="false"/>
<Panel position="0 -55 -22" <TableLayout position="0 -55 -22"
rotation="0 0 180" rotation="0 0 180"
height="900" height="900"
width="1400" width="1400"
scale="0.1 0.1 1"/> scale="0.1 0.1 1"
<TableLayout active="false"
cellSpacing="80" cellSpacing="80"
cellBackgroundColor="rgba(1,1,1,0)"/> cellBackgroundColor="rgba(1,1,1,0)"/>
</Defaults> </Defaults>
<Panel> <Panel id="Helper"
<TableLayout id="actives"> active="false">
<TableLayout>
<Row> <Row>
<Cell> <Cell>
<Button id="Bless" <Button id="Bless"
@ -43,10 +43,7 @@
</Cell> </Cell>
</Row> </Row>
</TableLayout> </TableLayout>
</Panel> <TableLayout>
<Panel>
<TableLayout id="inactives">
<Row> <Row>
<Cell> <Cell>
<Button id="inactiveBless" <Button id="inactiveBless"

View File

@ -21,9 +21,10 @@ Description: Crown of Dying Light
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10133\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"10133\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Item. Charm. Mask.\",\n \"bonded\": \ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Item. Charm. Mask.\",\n \"bonded\":
[\n {\n \"count\": 1,\n \"id\": \"10134\"\n }\n ],\n \"wildIcons\": [\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"10134\"\n
1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Offering\",\n \"token\": \ }\n ],\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\":
\"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" \"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast
of Hemlock Vale\"\n}"
GUID: b6d35d GUID: b6d35d
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,12 +22,13 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"04005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"04005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
\ \"traits\": \"Cursed. Drifter.\",\n \"willpowerIcons\": 0,\n \"intellectIcons\": \ \"traits\": \"Cursed. Drifter.\",\n \"willpowerIcons\": 0,\n \"intellectIcons\":
0,\n \"combatIcons\": 0,\n \"agilityIcons\": 0,\n \"cycle\": \"The Forgotten 0,\n \"combatIcons\": 0,\n \"agilityIcons\": 0,\n \"cycle\": \"The Forgotten
Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": Age\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"04015\": 1\n },\n {\n \"04016\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"04015\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n 1\n },\n {\n \"04016\": 1\n }\n ]\n },\n \"deck_options\":
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": [\n {\n \"faction\": [\n \"survivor\",\n \"neutral\"\n ],\n
5\n }\n },\n {\n \"trait\": [\n \"spirit\"\n ],\n \"level\": \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
{\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}" \ \"trait\": [\n \"spirit\"\n ],\n \"level\": {\n \"min\":
0,\n \"max\": 3\n }\n }\n ]\n}"
GUID: b02a1e GUID: b02a1e
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,20 +22,20 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"05001\",\n \"alternate_ids\": [\n \"98010\"\n ],\n \"type\": GMNotes: "{\n \"id\": \"05001\",\n \"alternate_ids\": [\n \"98010\"\n ],\n \"type\":
\"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Medic.\",\n \"willpowerIcons\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Medic.\",\n \"willpowerIcons\":
3,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": 3,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\":
\"The Circle Undone\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \"The Circle Undone\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n
1,\n \"signatures\": [\n {\n \"05007\": 1,\n \"98011\": 1\n },\n \ \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n
\ {\n \"05008\": 1,\n \"98012\": 1\n }\n ]\n },\n \"deck_options\": \ {\n \"05007\": 1,\n \"98011\": 1\n },\n {\n \"05008\":
[\n {\n \"not\": true,\n \"trait\": [\n \"weapon\"\n ],\n 1,\n \"98012\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"not\":
\ \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n },\n {\n true,\n \"trait\": [\n \"weapon\"\n ],\n \"level\": {\n \"min\":
\ \"faction\": [\n \"guardian\"\n ],\n \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n
0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"neutral\"\n \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
\ },\n {\n \"special\": [\n \"heals_horror\"\n ],\n \"tag\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"special\":
[\n \"hh\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": [\n \"heals_horror\"\n ],\n \"tag\": [\n \"hh\"\n ],\n
5\n }\n },\n {\n \"faction\": [\n \"seeker\",\n \"mystic\"\n \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n \ \"faction\": [\n \"seeker\",\n \"mystic\"\n ],\n \"level\":
\ \"limit\": 15,\n \"error\": \"You cannot have more than 15 level 0-1 {\n \"min\": 0,\n \"max\": 1\n },\n \"limit\": 15,\n \"error\":
Seeker and/or Mystic cards\"\n }\n ]\n}" \"You cannot have more than 15 level 0-1 Seeker and/or Mystic cards\"\n }\n ]\n}"
GUID: b03b12 GUID: b03b12
Grid: true Grid: true
GridProjection: false GridProjection: false
@ -77,23 +77,24 @@ States:
GMNotes: "{\r\n \"id\": \"05001\",\r\n \"alternate_ids\": [\r\n \"98010\"\r\n GMNotes: "{\r\n \"id\": \"05001\",\r\n \"alternate_ids\": [\r\n \"98010\"\r\n
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Guardian\",\r\n \"traits\": \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Guardian\",\r\n \"traits\":
\"Medic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 4,\r\n \"combatIcons\": \"Medic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 4,\r\n \"combatIcons\":
2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle Undone\",\r\n \"deck_requirements\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle Undone\",\r\n \"extraToken\":
{\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": \"None\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\":
[\r\n {\r\n \"05007\": 1,\r\n \"98011\": 1\r\n },\r\n {\r\n 1,\r\n \"signatures\": [\r\n {\r\n \"05007\": 1,\r\n \"98011\":
\ \"05008\": 1,\r\n \"98012\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\": 1\r\n },\r\n {\r\n \"05008\": 1,\r\n \"98012\": 1\r\n }\r\n
[\r\n {\r\n \"not\": true,\r\n \"trait\": [\r\n \"weapon\"\r\n \ ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"not\": true,\r\n
\ ],\r\n \"level\": {\r\n \"min\": 1,\r\n \"max\": 5\r\n \ \"trait\": [\r\n \"weapon\"\r\n ],\r\n \"level\": {\r\n
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"guardian\"\r\n \ \"min\": 1,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 3\r\n \ \"faction\": [\r\n \"guardian\"\r\n ],\r\n \"level\":
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"neutral\"\r\n {\r\n \"min\": 0,\r\n \"max\": 3\r\n }\r\n },\r\n {\r\n
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n \ \"faction\": [\r\n \"neutral\"\r\n ],\r\n \"level\":
\ }\r\n },\r\n {\r\n \"special\": [\r\n \"heals_horror\"\r\n
\ ],\r\n \"tag\": [\r\n \"hh\"\r\n ],\r\n \"level\":
{\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n {\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n
\ \"faction\": [\r\n \"seeker\",\r\n \"mystic\"\r\n ],\r\n \ \"special\": [\r\n \"heals_horror\"\r\n ],\r\n \"tag\":
\ \"level\": {\r\n \"min\": 0,\r\n \"max\": 1\r\n },\r\n [\r\n \"hh\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
\ \"limit\": 15,\r\n \"error\": \"You cannot have more than 15 level \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n
0-1 Seeker and/or Mystic cards\"\r\n }\r\n ]\r\n}\r\n" \ \"seeker\",\r\n \"mystic\"\r\n ],\r\n \"level\": {\r\n
\ \"min\": 0,\r\n \"max\": 1\r\n },\r\n \"limit\": 15,\r\n
\ \"error\": \"You cannot have more than 15 level 0-1 Seeker and/or Mystic
cards\"\r\n }\r\n ]\r\n}\r\n"
GUID: 9900a3 GUID: 9900a3
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,20 +22,21 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"09001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n GMNotes: "{\n \"id\": \"09001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n
\ \"traits\": \"Assistant.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 2,\n \ \"traits\": \"Assistant.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 2,\n
\ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Scarlet Keys\",\n \ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Scarlet Keys\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Activate\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"09002\": 2\n },\n {\n \"09003\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"09002\":
1\n }\n ],\n \"choices\": 1\n },\n \"deck_options\": [\n {\n \"faction\": 2\n },\n {\n \"09003\": 1\n }\n ],\n \"choices\": 1\n
[\n \"guardian\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n
0,\n \"max\": 5\n }\n },\n {\n \"choiceName\": \"Seeker\",\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\": 5\n }\n },\n {\n \"choiceName\": \"Seeker\",\n \"faction\":
0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n [\n \"seeker\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Mystic\",\n 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n
\ \"faction\": [\n \"mystic\"\n ],\n \"level\": {\n \"min\": \ \"limit\": 10\n },\n {\n \"choiceName\": \"Mystic\",\n \"faction\":
0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n [\n \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n
\ \"faction\": [\n \"survivor\"\n ],\n \"level\": {\n \"min\": \ \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n \"faction\":
0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n [\n \"survivor\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ ],\n \"limit\": 10\n }\n ]\n}" 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n
\ \"limit\": 10\n }\n ]\n}"
GUID: dc96d1 GUID: dc96d1
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,7 +22,7 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"09018\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"09018\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Civic. Socialite.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": \ \"traits\": \"Civic. Socialite.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\",\n 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
1,\n \"signatures\": [\n {\n \"09019\": 1\n },\n {\n \"09020\": 1,\n \"signatures\": [\n {\n \"09019\": 1\n },\n {\n \"09020\":
1\n }\n ],\n \"choices\": 2\n },\n \"deck_options\": [\n {\n \"faction\": 1\n }\n ],\n \"choices\": 2\n },\n \"deck_options\": [\n {\n \"faction\":
[\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":

View File

@ -0,0 +1,247 @@
-- Bundled by luabundle {"version":"1.6.0"}
local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire)
local loadingPlaceholder = {[{}] = true}
local register
local modules = {}
local require
local loaded = {}
register = function(name, body)
if not modules[name] then
modules[name] = body
end
end
require = function(name)
local loadedModule = loaded[name]
if loadedModule then
if loadedModule == loadingPlaceholder then
return nil
end
else
if not modules[name] then
if not superRequire then
local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name)
error('Tried to require ' .. identifier .. ', but no such module has been registered')
else
return superRequire(name)
end
end
loaded[name] = loadingPlaceholder
loadedModule = modules[name](require, loaded, register, modules)
loaded[name] = loadedModule
end
return loadedModule
end
return require, loaded, register, modules
end)(nil)
__bundle_register("playercards/CardsThatRedrawTokens", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that return and redraw tokens
This file is used to add an XML button to a card, turned on via context menu.
Valid options modify the appearance of the XML button, as well as the
behavior of the return and redraw function. Set options before requiring this file.
Parameters for the return and redraw functions. Typically set VALID_TOKENS or INVALID_TOKENS, not both.
If there are no restrictions on which tokens can be redrawn (e.g. Wendy Adams), keep both empty.
* VALID_TOKENS --@type table
- keyed table which lists all tokens that can be redrawn by the card
- example usage: "False Covenant"
> VALID_TOKENS = {
> ["Curse"] = true
> }
* INVALID_TOKENS --@type table
- keyed table which lists all tokens that cannot be redrawn by the card
- example usage: "Custom Ammunition"
> INVALID_TOKENS = {
> ["Auto-fail"] = true
> }
* DRAW_SPECIFIC_TOKEN --@type string (name of token or nil)
- if set, will attempt to draw that specific token
* RETURN_TO_POOL --@type string
- allows for the name of the card to be passed onto Global for any special handling
The following parameters modify the appearence of the XML button and are not listed as part of a table.
- buttonHeight (default is 450)
- buttonWidth (default is 1400)
- buttonPosition (default is "0 -55 -22")
- buttonFontSize (default is 250)
- buttonRotation (change if button is placed on an investigator cards)
- buttonLabel (default is "Redraw Token")
- buttonIcon (to add an icon to the right)
- buttonColor (default is "#77674DE6")
----------------------------------------------------------
EXAMPLE: Claypool's Furs
This card can only redraw the Frost token, and is replaced with a random token from the bag.
As a nice reminder the XML button takes on the Frost color and icon with the text "Cancel".
> buttonValue = "Cancel"
> buttonIcon = "token-frost"
> buttonColor = "#404450E6"
> buttonFontSize = 300
> VALID_TOKENS = {
> ["Frost"] = true
> }
>
> require...
----------------------------------------------------------]]
-- intentionally global
hasXML = true
isHelperEnabled = false
function updateSave()
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
end
function onLoad(savedData)
if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData)
isHelperEnabled = loadedData.isHelperEnabled
end
createHelperXML()
syncDisplayWithOptionPanel()
end
function createHelperXML()
local xmlTable = { {
tag = "Button",
attributes = {
active = "false",
id = "Helper",
height = buttonHeight or 450,
width = buttonWidth or 1400,
rotation = buttonRotation or "0 0 180",
scale = "0.1 0.1 1",
position = buttonPosition or "0 -55 -22",
padding = "50 50 50 50",
font = "font_teutonic-arkham",
fontSize = buttonFontSize or 250,
onClick = "triggerXMLTokenLabelCreation",
color = buttonColor or "#77674DE6",
textColor = "White"
},
value = buttonLabel or "Redraw Token"
} }
if buttonIcon then
xmlTable[1].attributes.iconWidth = "400"
xmlTable[1].attributes.iconAlignment = "Right"
xmlTable[1].attributes.icon = buttonIcon
end
self.UI.setXmlTable(xmlTable)
end
function triggerXMLTokenLabelCreation()
Global.call("activeRedrawEffect", {
VALID_TOKENS = VALID_TOKENS,
INVALID_TOKENS = INVALID_TOKENS,
RETURN_TO_POOL = RETURN_TO_POOL
})
end
end)
__bundle_register("playercards/CardsWithHelper", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that have helpers
This file is used to share code between cards with helpers.
It syncs the visibility of the helper with the option panel and
makes sure the card has the respective tag.
Additionally, it will call 'initiliaze()' and 'shutOff()'
in the parent file if they are present.
Instructions:
1) Define the global variables before requiring this file:
hasXML = true (whether the card has an XML display)
isHelperEnabled = false (default state of the helper, should be 'false')
2) In 'onLoad()'', call 'syncDisplayWithOptionPanel()'
----------------------------------------------------------]]
local optionPanelApi = require("core/OptionPanelApi")
-- if the respective option is enabled in onLoad(), enable the helper
function syncDisplayWithOptionPanel()
self.addTag("CardWithHelper")
local options = optionPanelApi.getOptions()
if options.enableCardHelpers then
setHelperState(true)
else
updateDisplay()
end
end
-- forces a new state
function setHelperState(newState)
isHelperEnabled = newState
updateSave()
updateDisplay()
end
-- toggles the current state
function toggleHelper()
isHelperEnabled = not isHelperEnabled
updateSave()
updateDisplay()
end
-- updates the visibility and calls events (after a small delay to allow XML being set)
function updateDisplay()
Wait.frames(actualDisplayUpdate, 5)
end
function actualDisplayUpdate()
if isHelperEnabled then
self.clearContextMenu()
self.addContextMenuItem("Disable Helper", toggleHelper)
if hasXML then self.UI.show("Helper") end
if initialize then initialize() end
else
self.clearContextMenu()
self.addContextMenuItem("Enable Helper", toggleHelper)
if hasXML then self.UI.hide("Helper") end
if shutOff then shutOff() end
end
end
end)
__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local OptionPanelApi = {}
-- loads saved options
---@param options table Set a new state for the option table
OptionPanelApi.loadSettings = function(options)
return Global.call("loadSettings", options)
end
---@return any: Table of option panel state
OptionPanelApi.getOptions = function()
return Global.getTable("optionPanel")
end
return OptionPanelApi
end
end)
__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/cards/ClaypoolsFurs")
end)
__bundle_register("playercards/cards/ClaypoolsFurs", function(require, _LOADED, __bundle_register, __bundle_modules)
buttonLabel = "Cancel"
buttonIcon = "token-frost"
buttonColor = "#404450E6"
buttonFontSize = 300
VALID_TOKENS = {
["Frost"] = true
}
require("playercards/CardsWithHelper")
require("playercards/CardsThatRedrawTokens")
end)
return __bundle_require("__root")

View File

@ -30,7 +30,7 @@ HideWhenFaceDown: true
IgnoreFoW: false IgnoreFoW: false
LayoutGroupSortIndex: 0 LayoutGroupSortIndex: 0
Locked: false Locked: false
LuaScript: '' LuaScript: !include 'Card Claypool''s Furs c1f999.ttslua'
LuaScriptState: '' LuaScriptState: ''
MeasureMovement: false MeasureMovement: false
Name: Card Name: Card

View File

@ -0,0 +1,57 @@
AltLookAngle:
x: 0
y: 0
z: 0
Autoraise: true
CardID: 536430
ColorDiffuse:
b: 0.71324
g: 0.71324
r: 0.71324
CustomDeck:
'5364':
BackIsHidden: true
BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/
FaceURL: http://cloud-3.steamusercontent.com/ugc/2453969772006048567/4C173CF8E2E2F69C7374D65AAA2D842C048FC792/
NumHeight: 5
NumWidth: 8
Type: 0
UniqueBack: false
Description: Symbol of Innocence
DragSelectable: true
GMNotes: "{\n \"id\": \"10714\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
\ \"class\": \"Neutral\",\n \"cost\": 1,\n \"willpowerIcons\": 1,\n \"agilityIcons\":
1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Wish\",\n \"token\":
\"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: 3602f5
Grid: true
GridProjection: false
Hands: true
HideWhenFaceDown: true
IgnoreFoW: false
LayoutGroupSortIndex: 0
Locked: false
LuaScript: ''
LuaScriptState: ''
MeasureMovement: false
Name: Card
Nickname: Corn Husk Doll
SidewaysCard: false
Snap: true
Sticky: true
Tags:
- Asset
- PlayerCard
Tooltip: true
Transform:
posX: 34.33
posY: 3.67
posZ: 9.4
rotX: 0
rotY: 270
rotZ: 0
scaleX: 1
scaleY: 1
scaleZ: 1
Value: 0
XmlUI: ''

View File

@ -22,7 +22,7 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"90031\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90031\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Task.\",\n \"weakness\": true,\n \"uses\": [\n {\n \"count\": \ \"traits\": \"Task.\",\n \"weakness\": true,\n \"uses\": [\n {\n \"count\":
4,\n \"type\": \"Clue\",\n \"token\": \"clue\"\n }\n ],\n \"cycle\": 4,\n \"type\": \"Clue\",\n \"token\": \"clue\"\n }\n ],\n \"cycle\":
\"Standalone\"\n}" \"By the Book\"\n}"
GUID: f802e3 GUID: f802e3
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,8 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06024\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n GMNotes: "{\n \"id\": \"06024\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
\ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item.
Relic.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06025\"\n Relic.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\": 2,\n
\ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" \ \"id\": \"06025\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The
Dream-Eaters\"\n}"
GUID: 6692de GUID: 6692de
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -0,0 +1,242 @@
-- Bundled by luabundle {"version":"1.6.0"}
local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire)
local loadingPlaceholder = {[{}] = true}
local register
local modules = {}
local require
local loaded = {}
register = function(name, body)
if not modules[name] then
modules[name] = body
end
end
require = function(name)
local loadedModule = loaded[name]
if loadedModule then
if loadedModule == loadingPlaceholder then
return nil
end
else
if not modules[name] then
if not superRequire then
local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name)
error('Tried to require ' .. identifier .. ', but no such module has been registered')
else
return superRequire(name)
end
end
loaded[name] = loadingPlaceholder
loadedModule = modules[name](require, loaded, register, modules)
loaded[name] = loadedModule
end
return loadedModule
end
return require, loaded, register, modules
end)(nil)
__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/cards/CustomModifications")
end)
__bundle_register("playercards/cards/CustomModifications", function(require, _LOADED, __bundle_register, __bundle_modules)
INVALID_TOKENS = {
["Auto-fail"] = true
}
require("playercards/CardsWithHelper")
require("playercards/CardsThatRedrawTokens")
end)
__bundle_register("playercards/CardsThatRedrawTokens", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that return and redraw tokens
This file is used to add an XML button to a card, turned on via context menu.
Valid options modify the appearance of the XML button, as well as the
behavior of the return and redraw function. Set options before requiring this file.
Parameters for the return and redraw functions. Typically set VALID_TOKENS or INVALID_TOKENS, not both.
If there are no restrictions on which tokens can be redrawn (e.g. Wendy Adams), keep both empty.
* VALID_TOKENS --@type table
- keyed table which lists all tokens that can be redrawn by the card
- example usage: "False Covenant"
> VALID_TOKENS = {
> ["Curse"] = true
> }
* INVALID_TOKENS --@type table
- keyed table which lists all tokens that cannot be redrawn by the card
- example usage: "Custom Ammunition"
> INVALID_TOKENS = {
> ["Auto-fail"] = true
> }
* DRAW_SPECIFIC_TOKEN --@type string (name of token or nil)
- if set, will attempt to draw that specific token
* RETURN_TO_POOL --@type string
- allows for the name of the card to be passed onto Global for any special handling
The following parameters modify the appearence of the XML button and are not listed as part of a table.
- buttonHeight (default is 450)
- buttonWidth (default is 1400)
- buttonPosition (default is "0 -55 -22")
- buttonFontSize (default is 250)
- buttonRotation (change if button is placed on an investigator cards)
- buttonLabel (default is "Redraw Token")
- buttonIcon (to add an icon to the right)
- buttonColor (default is "#77674DE6")
----------------------------------------------------------
EXAMPLE: Claypool's Furs
This card can only redraw the Frost token, and is replaced with a random token from the bag.
As a nice reminder the XML button takes on the Frost color and icon with the text "Cancel".
> buttonValue = "Cancel"
> buttonIcon = "token-frost"
> buttonColor = "#404450E6"
> buttonFontSize = 300
> VALID_TOKENS = {
> ["Frost"] = true
> }
>
> require...
----------------------------------------------------------]]
-- intentionally global
hasXML = true
isHelperEnabled = false
function updateSave()
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
end
function onLoad(savedData)
if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData)
isHelperEnabled = loadedData.isHelperEnabled
end
createHelperXML()
syncDisplayWithOptionPanel()
end
function createHelperXML()
local xmlTable = { {
tag = "Button",
attributes = {
active = "false",
id = "Helper",
height = buttonHeight or 450,
width = buttonWidth or 1400,
rotation = buttonRotation or "0 0 180",
scale = "0.1 0.1 1",
position = buttonPosition or "0 -55 -22",
padding = "50 50 50 50",
font = "font_teutonic-arkham",
fontSize = buttonFontSize or 250,
onClick = "triggerXMLTokenLabelCreation",
color = buttonColor or "#77674DE6",
textColor = "White"
},
value = buttonLabel or "Redraw Token"
} }
if buttonIcon then
xmlTable[1].attributes.iconWidth = "400"
xmlTable[1].attributes.iconAlignment = "Right"
xmlTable[1].attributes.icon = buttonIcon
end
self.UI.setXmlTable(xmlTable)
end
function triggerXMLTokenLabelCreation()
Global.call("activeRedrawEffect", {
VALID_TOKENS = VALID_TOKENS,
INVALID_TOKENS = INVALID_TOKENS,
RETURN_TO_POOL = RETURN_TO_POOL
})
end
end)
__bundle_register("playercards/CardsWithHelper", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that have helpers
This file is used to share code between cards with helpers.
It syncs the visibility of the helper with the option panel and
makes sure the card has the respective tag.
Additionally, it will call 'initiliaze()' and 'shutOff()'
in the parent file if they are present.
Instructions:
1) Define the global variables before requiring this file:
hasXML = true (whether the card has an XML display)
isHelperEnabled = false (default state of the helper, should be 'false')
2) In 'onLoad()'', call 'syncDisplayWithOptionPanel()'
----------------------------------------------------------]]
local optionPanelApi = require("core/OptionPanelApi")
-- if the respective option is enabled in onLoad(), enable the helper
function syncDisplayWithOptionPanel()
self.addTag("CardWithHelper")
local options = optionPanelApi.getOptions()
if options.enableCardHelpers then
setHelperState(true)
else
updateDisplay()
end
end
-- forces a new state
function setHelperState(newState)
isHelperEnabled = newState
updateSave()
updateDisplay()
end
-- toggles the current state
function toggleHelper()
isHelperEnabled = not isHelperEnabled
updateSave()
updateDisplay()
end
-- updates the visibility and calls events (after a small delay to allow XML being set)
function updateDisplay()
Wait.frames(actualDisplayUpdate, 5)
end
function actualDisplayUpdate()
if isHelperEnabled then
self.clearContextMenu()
self.addContextMenuItem("Disable Helper", toggleHelper)
if hasXML then self.UI.show("Helper") end
if initialize then initialize() end
else
self.clearContextMenu()
self.addContextMenuItem("Enable Helper", toggleHelper)
if hasXML then self.UI.hide("Helper") end
if shutOff then shutOff() end
end
end
end)
__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local OptionPanelApi = {}
-- loads saved options
---@param options table Set a new state for the option table
OptionPanelApi.loadSettings = function(options)
return Global.call("loadSettings", options)
end
---@return any: Table of option panel state
OptionPanelApi.getOptions = function()
return Global.getTable("optionPanel")
end
return OptionPanelApi
end
end)
return __bundle_require("__root")

View File

@ -44,7 +44,7 @@ HideWhenFaceDown: true
IgnoreFoW: false IgnoreFoW: false
LayoutGroupSortIndex: 0 LayoutGroupSortIndex: 0
Locked: false Locked: false
LuaScript: '' LuaScript: !include 'Card Custom Modifications d2252d.ttslua'
LuaScriptState: '' LuaScriptState: ''
MeasureMovement: false MeasureMovement: false
Name: Card Name: Card

View File

@ -21,18 +21,19 @@ Description: The Librarian
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"01002-pb\",\n \"type\": \"Investigator\",\n \"class\": GMNotes: "{\n \"id\": \"01002-pb\",\n \"type\": \"Investigator\",\n \"class\":
\"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\":
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Read or Die\",\n
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": \ \"extraToken\": \"Tome\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
[\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\": 1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\": \ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
[\n \"tome\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ },\n \"deck_options\": [\n {\n \"trait\": [\n \"tome\"\n ],\n
5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
\ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\": \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\":
0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"guardian\",\n 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n
\ \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 \ },\n {\n \"faction\": [\n \"guardian\",\n \"mystic\"\n
Guardian and/or Mystic cards\"\n }\n ]\n}" \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n
\ \"limit\": 5,\n \"error\": \"You cannot have more than 5 Guardian and/or
Mystic cards\"\n }\n ]\n}"
GUID: 2f2e0d GUID: 2f2e0d
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,14 +21,14 @@ Description: The Librarian
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"01002-pf\",\n \"type\": \"Investigator\",\n \"class\": GMNotes: "{\n \"id\": \"01002-pf\",\n \"type\": \"Investigator\",\n \"class\":
\"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Read or Die\",\n
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": \ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
[\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\": 1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": \ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
[\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n
\ }\n ]\n}" \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
GUID: e8cafc GUID: e8cafc
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,18 +21,19 @@ Description: The Librarian
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"01002-p\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n GMNotes: "{\n \"id\": \"01002-p\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n
\ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": \ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Read or Die\",\n
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": \ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
[\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\": 1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\": \ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
[\n \"tome\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ },\n \"deck_options\": [\n {\n \"trait\": [\n \"tome\"\n ],\n
5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
\ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\": \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\":
0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"guardian\",\n 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n
\ \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 \ },\n {\n \"faction\": [\n \"guardian\",\n \"mystic\"\n
Guardian and/or Mystic cards\"\n }\n ]\n}" \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n
\ \"limit\": 5,\n \"error\": \"You cannot have more than 5 Guardian and/or
Mystic cards\"\n }\n ]\n}"
GUID: '282857' GUID: '282857'
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,10 +22,10 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"01002\",\n \"alternate_ids\": [\n \"01502\"\n ],\n \"type\": GMNotes: "{\n \"id\": \"01002\",\n \"alternate_ids\": [\n \"01502\"\n ],\n \"type\":
\"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": \"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\":
3,\n \"intellectIcons\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": 3,\n \"intellectIcons\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\":
\"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \"Core\",\n \"extraToken\": \"Tome\",\n \"deck_requirements\": {\n \"size\":
1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90002\":
\ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n 1,\n \"01008\": 1\n },\n {\n \"90003\": 1,\n \"01009\":
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n
\ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
@ -71,14 +71,15 @@ States:
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Seeker\",\r\n \"traits\": \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Seeker\",\r\n \"traits\":
\"Miskatonic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 5,\r\n \"Miskatonic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 5,\r\n
\ \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\",\r\n \ \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\",\r\n
\ \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Tome\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n
1,\r\n \"signatures\": [\r\n {\r\n \"90002\": 1,\r\n \"01008\": \ \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": [\r\n {\r\n
1\r\n },\r\n {\r\n \"90003\": 1,\r\n \"01009\": 1\r\n \ \"90002\": 1,\r\n \"01008\": 1\r\n },\r\n {\r\n \"90003\":
\ }\r\n ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"faction\": 1,\r\n \"01009\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\":
[\r\n \"seeker\",\r\n \"neutral\"\r\n ],\r\n \"level\": [\r\n {\r\n \"faction\": [\r\n \"seeker\",\r\n \"neutral\"\r\n
{\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n
\ \"faction\": [\r\n \"mystic\"\r\n ],\r\n \"level\": {\r\n \ }\r\n },\r\n {\r\n \"faction\": [\r\n \"mystic\"\r\n
\ \"min\": 0,\r\n \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 2\r\n
\ }\r\n }\r\n ]\r\n}\r\n"
GUID: ac7047 GUID: ac7047
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,7 +22,7 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"08001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n GMNotes: "{\n \"id\": \"08001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n
\ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": \ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
1,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\",\n 1,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
1,\n \"signatures\": [\n {\n \"08002\": 1\n },\n {\n \"08003\": 1,\n \"signatures\": [\n {\n \"08002\": 1\n },\n {\n \"08003\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\"\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\"\n
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n

View File

@ -20,7 +20,8 @@ CustomDeck:
Description: Advanced Description: Advanced
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90019\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90019\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n
\ \"cost\": 4,\n \"traits\": \"Spell.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" \ \"cost\": 4,\n \"traits\": \"Spell.\",\n \"weakness\": true,\n \"cycle\": \"Bad
Blood\"\n}"
GUID: 580a4d GUID: 580a4d
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,7 +22,7 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"09015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"09015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
\ \"traits\": \"Reporter.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 5,\n \ \"traits\": \"Reporter.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 5,\n
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
1,\n \"signatures\": [\n {\n \"09016\": 1\n },\n {\n \"09017\": 1,\n \"signatures\": [\n {\n \"09016\": 1\n },\n {\n \"09017\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":

View File

@ -22,10 +22,11 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"07004\",\n \"alternate_ids\": [\n \"98016\"\n ],\n \"type\": GMNotes: "{\n \"id\": \"07004\",\n \"alternate_ids\": [\n \"98016\"\n ],\n \"type\":
\"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer. Veteran.\",\n \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer. Veteran.\",\n
\ \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \"combatIcons\": 3,\n \"agilityIcons\": \ \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \"combatIcons\": 3,\n \"agilityIcons\":
2,\n \"cycle\": \"The Innsmouth Conspiracy\",\n \"deck_requirements\": {\n \"size\": 2,\n \"cycle\": \"The Innsmouth Conspiracy\",\n \"extraToken\": \"FreeTrigger\",\n
30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"98017\": \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
1,\n \"07012\": 1\n },\n {\n \"98018\": 1,\n \"07013\": 1,\n \"signatures\": [\n {\n \"98017\": 1,\n \"07012\": 1\n
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n \ },\n {\n \"98018\": 1,\n \"07013\": 1\n }\n ]\n
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\": 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\":
{\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
@ -71,15 +72,15 @@ States:
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\": \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\":
\"Sorcerer. Veteran.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": \"Sorcerer. Veteran.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\":
2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The
Innsmouth Conspiracy\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n Innsmouth Conspiracy\",\r\n \"extraToken\": \"Lightning\",\r\n \"deck_requirements\":
\ \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": [\r\n {\r\n {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\":
\ \"98017\": 1,\r\n \"07012\": 1\r\n },\r\n {\r\n \"98018\": [\r\n {\r\n \"98017\": 1,\r\n \"07012\": 1\r\n },\r\n
1,\r\n \"07013\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\": \ {\r\n \"98018\": 1,\r\n \"07013\": 1\r\n }\r\n ]\r\n
[\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n \"neutral\"\r\n \ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n \ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"rogue\"\r\n \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 2\r\n \ \"rogue\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
\ }\r\n }\r\n ]\r\n}\r\n" \ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n"
GUID: 3925ce GUID: 3925ce
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,13 +22,13 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"05004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n GMNotes: "{\n \"id\": \"05004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
\ \"traits\": \"Cultist. Silver Twilight.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": \ \"traits\": \"Cultist. Silver Twilight.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Circle Undone\",\n 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Circle Undone\",\n
\ \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 35,\n
1,\n \"signatures\": [\n {\n \"05013\": 1\n },\n {\n \"05014\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"05013\":
1\n },\n {\n \"05015\": 1\n }\n ]\n },\n \"deck_options\": 1\n },\n {\n \"05014\": 1\n },\n {\n \"05015\":
[\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
\ \"faction\": [\n \"guardian\"\n ],\n \"level\": {\n \"min\": 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n ],\n
0,\n \"max\": 2\n }\n }\n ]\n}" \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
GUID: 32b091 GUID: 32b091
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,7 +20,7 @@ CustomDeck:
Description: Leave No Doubt Description: Leave No Doubt
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90029\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90029\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
GUID: 07e7bd GUID: 07e7bd
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,7 +20,7 @@ CustomDeck:
Description: Seek the Truth Description: Seek the Truth
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90028\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90028\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
GUID: 0994c9 GUID: 0994c9
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,7 +20,7 @@ CustomDeck:
Description: Due Diligence Description: Due Diligence
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90025\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90025\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
GUID: '133521' GUID: '133521'
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,7 +20,7 @@ CustomDeck:
Description: Consult Experts Description: Consult Experts
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90027\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90027\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
GUID: 2d9256 GUID: 2d9256
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,7 +20,7 @@ CustomDeck:
Description: Red Tape Description: Red Tape
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90026\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90026\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
GUID: '706176' GUID: '706176'
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -0,0 +1,57 @@
AltLookAngle:
x: 0
y: 0
z: 0
Autoraise: true
CardID: 536427
ColorDiffuse:
b: 0.71324
g: 0.71324
r: 0.71324
CustomDeck:
'5364':
BackIsHidden: true
BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/
FaceURL: http://cloud-3.steamusercontent.com/ugc/2453969772006048567/4C173CF8E2E2F69C7374D65AAA2D842C048FC792/
NumHeight: 5
NumWidth: 8
Type: 0
UniqueBack: false
Description: Best in Her Field
DragSelectable: true
GMNotes: "{\n \"id\": \"10702\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n
\ \"class\": \"Neutral\",\n \"cost\": 4,\n \"traits\": \"Ally. Miskatonic. Wayfarer.\",\n
\ \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\":
\"The Feast of Hemlock Vale\"\n}"
GUID: 62d5a6
Grid: true
GridProjection: false
Hands: true
HideWhenFaceDown: true
IgnoreFoW: false
LayoutGroupSortIndex: 0
Locked: false
LuaScript: ''
LuaScriptState: ''
MeasureMovement: false
Name: Card
Nickname: Dr. Rosa Marquez
SidewaysCard: false
Snap: true
Sticky: true
Tags:
- Asset
- PlayerCard
Tooltip: true
Transform:
posX: 31.17
posY: 3.67
posZ: 13.98
rotX: 0
rotY: 270
rotZ: 0
scaleX: 1
scaleY: 1
scaleZ: 1
Value: 0
XmlUI: ''

View File

@ -21,9 +21,9 @@ Description: Dreams of an Explorer
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06236\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n GMNotes: "{\n \"id\": \"06236\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\ }\n ],\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The 1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"agilityIcons\":
Dream-Eaters\"\n}" 1,\n \"cycle\": \"The Dream-Eaters\"\n}"
GUID: 5f9a10 GUID: 5f9a10
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,9 +21,9 @@ Description: Dreams of a Madman
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06237\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n GMNotes: "{\n \"id\": \"06237\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\ }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The 1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\":
Dream-Eaters\"\n}" 1,\n \"cycle\": \"The Dream-Eaters\"\n}"
GUID: e5f9cb GUID: e5f9cb
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,9 +21,9 @@ Description: Dreams of a Child
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06238\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n GMNotes: "{\n \"id\": \"06238\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\ }\n ],\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The 1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"intellectIcons\":
Dream-Eaters\"\n}" 1,\n \"cycle\": \"The Dream-Eaters\"\n}"
GUID: ea40f6 GUID: ea40f6
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,8 +21,9 @@ Description: Untranslated
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06112\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n GMNotes: "{\n \"id\": \"06112\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" 1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\":
\"The Dream-Eaters\"\n}"
GUID: b81dcf GUID: b81dcf
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,10 +21,10 @@ Description: Abandoned by the Gods
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06276\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n GMNotes: "{\n \"id\": \"06276\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
\ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. \ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item.
Relic. Blessed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06277\"\n Relic. Blessed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\ }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n 1,\n \"id\": \"06277\"\n }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\":
\ \"count\": 0,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Charge\",\n \"token\":
\ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}"
GUID: c0d236 GUID: c0d236
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,8 +20,9 @@ CustomDeck:
Description: '' Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"09104\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"09104\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Spirit.\",\n \"cycle\": \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Spirit.\",\n \"uses\":
\"The Scarlet Keys\"\n}" [\n {\n \"count\": 1,\n \"type\": \"Universal\",\n \"token\":
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}"
GUID: a3d041 GUID: a3d041
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,8 +20,9 @@ CustomDeck:
Description: '' Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"04148\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"04148\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 2,\n \"cycle\": \ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 2,\n \"uses\":
\"The Forgotten Age\"\n}" [\n {\n \"count\": 1,\n \"type\": \"Explore\",\n \"token\": \"universalActionAbility\"\n
\ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}"
GUID: 9dc3d4 GUID: 9dc3d4
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,10 +21,10 @@ Description: The Mother's Cunning
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10035\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n GMNotes: "{\n \"id\": \"10035\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n
\ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item.
Relic. Spell.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"10036\"\n Relic. Spell.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
\ }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n 2,\n \"id\": \"10036\"\n }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\":
\ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": 1,\n \"uses\": [\n {\n \"type\": \"Charge\",\n \"token\": \"resource\"\n
\"The Feast of Hemlock Vale\"\n}" \ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: e7bfbe GUID: e7bfbe
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,8 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10082\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n GMNotes: "{\n \"id\": \"10082\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
\ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item.
Illicit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Illicit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n
Feast of Hemlock Vale\"\n}" \ \"count\": 0,\n \"type\": \"Suspicion\",\n \"token\": \"resource\"\n
\ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: 7ebb67 GUID: 7ebb67
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,7 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10066\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n GMNotes: "{\n \"id\": \"10066\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
\ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item.
Illicit.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" Illicit.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n
\ \"type\": \"Suspicion\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\":
\"The Feast of Hemlock Vale\"\n}"
GUID: acd38d GUID: acd38d
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -0,0 +1,248 @@
-- Bundled by luabundle {"version":"1.6.0"}
local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire)
local loadingPlaceholder = {[{}] = true}
local register
local modules = {}
local require
local loaded = {}
register = function(name, body)
if not modules[name] then
modules[name] = body
end
end
require = function(name)
local loadedModule = loaded[name]
if loadedModule then
if loadedModule == loadingPlaceholder then
return nil
end
else
if not modules[name] then
if not superRequire then
local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name)
error('Tried to require ' .. identifier .. ', but no such module has been registered')
else
return superRequire(name)
end
end
loaded[name] = loadingPlaceholder
loadedModule = modules[name](require, loaded, register, modules)
loaded[name] = loadedModule
end
return loadedModule
end
return require, loaded, register, modules
end)(nil)
__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local OptionPanelApi = {}
-- loads saved options
---@param options table Set a new state for the option table
OptionPanelApi.loadSettings = function(options)
return Global.call("loadSettings", options)
end
---@return any: Table of option panel state
OptionPanelApi.getOptions = function()
return Global.getTable("optionPanel")
end
return OptionPanelApi
end
end)
__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/cards/FalseCovenant")
end)
__bundle_register("playercards/cards/FalseCovenant", function(require, _LOADED, __bundle_register, __bundle_modules)
buttonLabel = "Cancel"
buttonIcon = "token-curse"
buttonColor = "#633A84E6"
buttonFontSize = 300
RETURN_TO_POOL = true
VALID_TOKENS = {
["Curse"] = true
}
require("playercards/CardsWithHelper")
require("playercards/CardsThatRedrawTokens")
end)
__bundle_register("playercards/CardsThatRedrawTokens", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that return and redraw tokens
This file is used to add an XML button to a card, turned on via context menu.
Valid options modify the appearance of the XML button, as well as the
behavior of the return and redraw function. Set options before requiring this file.
Parameters for the return and redraw functions. Typically set VALID_TOKENS or INVALID_TOKENS, not both.
If there are no restrictions on which tokens can be redrawn (e.g. Wendy Adams), keep both empty.
* VALID_TOKENS --@type table
- keyed table which lists all tokens that can be redrawn by the card
- example usage: "False Covenant"
> VALID_TOKENS = {
> ["Curse"] = true
> }
* INVALID_TOKENS --@type table
- keyed table which lists all tokens that cannot be redrawn by the card
- example usage: "Custom Ammunition"
> INVALID_TOKENS = {
> ["Auto-fail"] = true
> }
* DRAW_SPECIFIC_TOKEN --@type string (name of token or nil)
- if set, will attempt to draw that specific token
* RETURN_TO_POOL --@type string
- allows for the name of the card to be passed onto Global for any special handling
The following parameters modify the appearence of the XML button and are not listed as part of a table.
- buttonHeight (default is 450)
- buttonWidth (default is 1400)
- buttonPosition (default is "0 -55 -22")
- buttonFontSize (default is 250)
- buttonRotation (change if button is placed on an investigator cards)
- buttonLabel (default is "Redraw Token")
- buttonIcon (to add an icon to the right)
- buttonColor (default is "#77674DE6")
----------------------------------------------------------
EXAMPLE: Claypool's Furs
This card can only redraw the Frost token, and is replaced with a random token from the bag.
As a nice reminder the XML button takes on the Frost color and icon with the text "Cancel".
> buttonValue = "Cancel"
> buttonIcon = "token-frost"
> buttonColor = "#404450E6"
> buttonFontSize = 300
> VALID_TOKENS = {
> ["Frost"] = true
> }
>
> require...
----------------------------------------------------------]]
-- intentionally global
hasXML = true
isHelperEnabled = false
function updateSave()
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
end
function onLoad(savedData)
if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData)
isHelperEnabled = loadedData.isHelperEnabled
end
createHelperXML()
syncDisplayWithOptionPanel()
end
function createHelperXML()
local xmlTable = { {
tag = "Button",
attributes = {
active = "false",
id = "Helper",
height = buttonHeight or 450,
width = buttonWidth or 1400,
rotation = buttonRotation or "0 0 180",
scale = "0.1 0.1 1",
position = buttonPosition or "0 -55 -22",
padding = "50 50 50 50",
font = "font_teutonic-arkham",
fontSize = buttonFontSize or 250,
onClick = "triggerXMLTokenLabelCreation",
color = buttonColor or "#77674DE6",
textColor = "White"
},
value = buttonLabel or "Redraw Token"
} }
if buttonIcon then
xmlTable[1].attributes.iconWidth = "400"
xmlTable[1].attributes.iconAlignment = "Right"
xmlTable[1].attributes.icon = buttonIcon
end
self.UI.setXmlTable(xmlTable)
end
function triggerXMLTokenLabelCreation()
Global.call("activeRedrawEffect", {
VALID_TOKENS = VALID_TOKENS,
INVALID_TOKENS = INVALID_TOKENS,
RETURN_TO_POOL = RETURN_TO_POOL
})
end
end)
__bundle_register("playercards/CardsWithHelper", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that have helpers
This file is used to share code between cards with helpers.
It syncs the visibility of the helper with the option panel and
makes sure the card has the respective tag.
Additionally, it will call 'initiliaze()' and 'shutOff()'
in the parent file if they are present.
Instructions:
1) Define the global variables before requiring this file:
hasXML = true (whether the card has an XML display)
isHelperEnabled = false (default state of the helper, should be 'false')
2) In 'onLoad()'', call 'syncDisplayWithOptionPanel()'
----------------------------------------------------------]]
local optionPanelApi = require("core/OptionPanelApi")
-- if the respective option is enabled in onLoad(), enable the helper
function syncDisplayWithOptionPanel()
self.addTag("CardWithHelper")
local options = optionPanelApi.getOptions()
if options.enableCardHelpers then
setHelperState(true)
else
updateDisplay()
end
end
-- forces a new state
function setHelperState(newState)
isHelperEnabled = newState
updateSave()
updateDisplay()
end
-- toggles the current state
function toggleHelper()
isHelperEnabled = not isHelperEnabled
updateSave()
updateDisplay()
end
-- updates the visibility and calls events (after a small delay to allow XML being set)
function updateDisplay()
Wait.frames(actualDisplayUpdate, 5)
end
function actualDisplayUpdate()
if isHelperEnabled then
self.clearContextMenu()
self.addContextMenuItem("Disable Helper", toggleHelper)
if hasXML then self.UI.show("Helper") end
if initialize then initialize() end
else
self.clearContextMenu()
self.addContextMenuItem("Enable Helper", toggleHelper)
if hasXML then self.UI.hide("Helper") end
if shutOff then shutOff() end
end
end
end)
return __bundle_require("__root")

View File

@ -30,7 +30,7 @@ HideWhenFaceDown: true
IgnoreFoW: false IgnoreFoW: false
LayoutGroupSortIndex: 0 LayoutGroupSortIndex: 0
Locked: false Locked: false
LuaScript: '' LuaScript: !include 'Card False Covenant (2) 3442f5.ttslua'
LuaScriptState: '' LuaScriptState: ''
MeasureMovement: false MeasureMovement: false
Name: Card Name: Card

View File

@ -0,0 +1,39 @@
<!-- include playercards/FamilyInheritance.xml -->
<Defaults>
<Button padding="30 30 30 30"
font="font_teutonic-arkham"
textColor="white"
fontSize="235"
shadow="#405041B3"
shadowDistance="-15 15"/>
<TableLayout position="130 0 -22"
rotation="0 0 270"
height="460"
width="2600"
scale="0.1 0.1 1"
cellSpacing="80"
cellBackgroundColor="rgba(1,1,1,0)"/>
</Defaults>
<TableLayout id="Helper"
active="false">
<Row>
<Cell>
<Button onClick="loseAll"
color="#6D202C"
fontSize="195"
text="Discard all"/>
</Cell>
<Cell>
<Button onClick="takeAll"
color="#173B0B"
text="Move all"/>
</Cell>
<Cell>
<Button onClick="add4"
color="#77674D"
text="Place 4"/>
</Cell>
</Row>
</TableLayout>
<!-- include playercards/FamilyInheritance.xml -->

View File

@ -54,4 +54,4 @@ Transform:
scaleY: 1 scaleY: 1
scaleZ: 1 scaleZ: 1
Value: 0 Value: 0
XmlUI: '' XmlUI: !include 'Card Family Inheritance 394603.xml'

View File

@ -22,12 +22,13 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"04004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n GMNotes: "{\n \"id\": \"04004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
\ \"traits\": \"Believer. Warden.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": \ \"traits\": \"Believer. Warden.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
3,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Forgotten 3,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Forgotten
Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": Age\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"04013\": 1\n },\n {\n \"04014\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"04013\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n 1\n },\n {\n \"04014\": 1\n }\n ]\n },\n \"deck_options\":
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": [\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n
5\n }\n },\n {\n \"trait\": [\n \"blessed\"\n ],\n \"level\": \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
{\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}" \ \"trait\": [\n \"blessed\"\n ],\n \"level\": {\n \"min\":
0,\n \"max\": 3\n }\n }\n ]\n}"
GUID: eb96e6 GUID: eb96e6
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,8 +20,7 @@ CustomDeck:
Description: Advanced Description: Advanced
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90051\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90051\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich \ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"Laid to Rest\"\n}"
Legacy\"\n}"
GUID: '561775' GUID: '561775'
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,7 +22,7 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"04003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n GMNotes: "{\n \"id\": \"04003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n
\ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n \ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n
\ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\",\n \ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Evade\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
1,\n \"signatures\": [\n {\n \"04010\": 1\n },\n {\n \"04011\": 1,\n \"signatures\": [\n {\n \"04010\": 1\n },\n {\n \"04011\":
1\n },\n {\n \"04012\": 1\n }\n ]\n },\n \"deck_options\": 1\n },\n {\n \"04012\": 1\n }\n ]\n },\n \"deck_options\":
[\n {\n \"trait\": [\n \"illicit\"\n ],\n \"level\": {\n [\n {\n \"trait\": [\n \"illicit\"\n ],\n \"level\": {\n

View File

@ -21,8 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10005\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"10005\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"traits\": \"Item. Tool. Science.\",\n \"bonded\": \ \"startsInPlay\": true,\n \"traits\": \"Item. Tool. Science.\",\n \"bonded\":
[\n {\n \"count\": 1,\n \"id\": \"10006\"\n },\n {\n \"count\": [\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"10006\"\n
1,\n \"id\": \"10007\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" \ },\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"10007\"\n
\ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
GUID: 55990a GUID: 55990a
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -20,7 +20,9 @@ CustomDeck:
Description: Weakness. Description: Weakness.
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"08646\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"08646\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" \ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"uses\": [\n {\n \"count\":
1,\n \"type\": \"Damage\",\n \"token\": \"damage\"\n }\n ],\n \"cycle\":
\"Edge of the Earth\"\n}"
GUID: 8abd77 GUID: 8abd77
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,7 +21,8 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"60121\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n GMNotes: "{\n \"id\": \"60121\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n
\ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\":
2,\n \"cycle\": \"Investigator Packs\"\n}" 2,\n \"uses\": [\n {\n \"count\": 1,\n \"type\": \"Fight\",\n \"token\":
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"Investigator Packs\"\n}"
GUID: 9e7f6a GUID: 9e7f6a
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,9 +21,9 @@ Description: Worlds within Worlds
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"06013\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"06013\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
\ \"startsInPlay\": true,\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"bonded\": \ \"startsInPlay\": true,\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"bonded\":
[\n {\n \"count\": 1,\n \"id\": \"06015a\"\n }\n ],\n \"uses\": [\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"06015a\"\n
[\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n \ }\n ],\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n
\ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" \ \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}"
GUID: b8c891 GUID: b8c891
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,7 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"09053\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n GMNotes: "{\n \"id\": \"09053\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n
\ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"willpowerIcons\":
1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 1,\n \"type\":
\"Universal\",\n \"token\": \"universalActionAbility\"\n }\n ],\n \"cycle\":
\"The Scarlet Keys\"\n}"
GUID: '425841' GUID: '425841'
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,7 +21,8 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"03265\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n GMNotes: "{\n \"id\": \"03265\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n
\ \"cycle\": \"The Path to Carcosa\"\n}" \ \"uses\": [\n {\n \"count\": 1,\n \"type\": \"Universal\",\n \"token\":
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}"
GUID: bbfe9b GUID: bbfe9b
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,9 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"54002\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n GMNotes: "{\n \"id\": \"54002\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
\ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"maxCount\":
\"05314\"\n }\n ],\n \"willpowerIcons\": 2,\n \"cycle\": \"Return to the Circle 3,\n \"id\": \"05314\"\n }\n ],\n \"willpowerIcons\": 2,\n \"cycle\":
Undone\"\n}" \"Return to the Circle Undone\"\n}"
GUID: 78858f GUID: 78858f
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,8 +21,9 @@ Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"05313\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n GMNotes: "{\n \"id\": \"05313\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
\ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.
Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"maxCount\":
\"05314\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" 3,\n \"id\": \"05314\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\":
\"The Circle Undone\"\n}"
GUID: 312d38 GUID: 312d38
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -21,12 +21,13 @@ Description: The Farmhand
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"10015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n GMNotes: "{\n \"id\": \"10015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
\ \"traits\": \"Assistant. Warden.\",\n \"bonded\": [\n {\n \"count\": \ \"traits\": \"Assistant. Warden.\",\n \"bonded\": [\n {\n \"count\":
1,\n \"id\": \"10015-b1\"\n },\n {\n \"count\": 1,\n \"id\": 1,\n \"maxCount\": 1,\n \"id\": \"10015-b1\"\n },\n {\n \"count\":
\"10015-b2\"\n }\n ],\n \"willpowerIcons\": 3,\n \"intellectIcons\": 1,\n 1,\n \"maxCount\": 1,\n \"id\": \"10015-b2\"\n }\n ],\n \"willpowerIcons\":
\ \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\": \"The Feast of Hemlock 3,\n \"intellectIcons\": 1,\n \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\":
Vale\",\n \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": \"The Feast of Hemlock Vale\",\n \"extraToken\": \"None\",\n \"deck_requirements\":
1,\n \"signatures\": [\n {\n \"10017\": 1\n },\n {\n \"10018\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n [\n {\n \"10017\": 1\n },\n {\n \"10018\": 1\n }\n
\ ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
5\n }\n },\n {\n \"trait\": [\n \"insight\",\n \"spirit\"\n 5\n }\n },\n {\n \"trait\": [\n \"insight\",\n \"spirit\"\n
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n },\n \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n },\n

View File

@ -20,8 +20,8 @@ CustomDeck:
Description: '' Description: ''
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90048\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n GMNotes: "{\n \"id\": \"90048\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
\ \"traits\": \"Hardship.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich \ \"traits\": \"Hardship.\",\n \"weakness\": true,\n \"cycle\": \"On the Road
Legacy\"\n}" Again\"\n}"
GUID: '876557' GUID: '876557'
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -22,11 +22,11 @@ DragSelectable: true
GMNotes: "{\n \"id\": \"60201\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n GMNotes: "{\n \"id\": \"60201\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n
\ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": \ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
5,\n \"combatIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\",\n 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\",\n
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": \ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
1,\n \"signatures\": [\n {\n \"60202\": 1\n },\n {\n \"60203\": \ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"60202\":
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n 1\n },\n {\n \"60203\": 1\n }\n ]\n },\n \"deck_options\":
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": [\n {\n \"faction\": [\n \"seeker\",\n \"neutral\"\n ],\n
5\n }\n }\n ]\n}" \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n }\n ]\n}"
GUID: 1fa944 GUID: 1fa944
Grid: true Grid: true
GridProjection: false GridProjection: false

View File

@ -0,0 +1,250 @@
-- Bundled by luabundle {"version":"1.6.0"}
local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire)
local loadingPlaceholder = {[{}] = true}
local register
local modules = {}
local require
local loaded = {}
register = function(name, body)
if not modules[name] then
modules[name] = body
end
end
require = function(name)
local loadedModule = loaded[name]
if loadedModule then
if loadedModule == loadingPlaceholder then
return nil
end
else
if not modules[name] then
if not superRequire then
local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name)
error('Tried to require ' .. identifier .. ', but no such module has been registered')
else
return superRequire(name)
end
end
loaded[name] = loadingPlaceholder
loadedModule = modules[name](require, loaded, register, modules)
loaded[name] = loadedModule
end
return loadedModule
end
return require, loaded, register, modules
end)(nil)
__bundle_register("playercards/CardsWithHelper", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that have helpers
This file is used to share code between cards with helpers.
It syncs the visibility of the helper with the option panel and
makes sure the card has the respective tag.
Additionally, it will call 'initiliaze()' and 'shutOff()'
in the parent file if they are present.
Instructions:
1) Define the global variables before requiring this file:
hasXML = true (whether the card has an XML display)
isHelperEnabled = false (default state of the helper, should be 'false')
2) In 'onLoad()'', call 'syncDisplayWithOptionPanel()'
----------------------------------------------------------]]
local optionPanelApi = require("core/OptionPanelApi")
-- if the respective option is enabled in onLoad(), enable the helper
function syncDisplayWithOptionPanel()
self.addTag("CardWithHelper")
local options = optionPanelApi.getOptions()
if options.enableCardHelpers then
setHelperState(true)
else
updateDisplay()
end
end
-- forces a new state
function setHelperState(newState)
isHelperEnabled = newState
updateSave()
updateDisplay()
end
-- toggles the current state
function toggleHelper()
isHelperEnabled = not isHelperEnabled
updateSave()
updateDisplay()
end
-- updates the visibility and calls events (after a small delay to allow XML being set)
function updateDisplay()
Wait.frames(actualDisplayUpdate, 5)
end
function actualDisplayUpdate()
if isHelperEnabled then
self.clearContextMenu()
self.addContextMenuItem("Disable Helper", toggleHelper)
if hasXML then self.UI.show("Helper") end
if initialize then initialize() end
else
self.clearContextMenu()
self.addContextMenuItem("Enable Helper", toggleHelper)
if hasXML then self.UI.hide("Helper") end
if shutOff then shutOff() end
end
end
end)
__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local OptionPanelApi = {}
-- loads saved options
---@param options table Set a new state for the option table
OptionPanelApi.loadSettings = function(options)
return Global.call("loadSettings", options)
end
---@return any: Table of option panel state
OptionPanelApi.getOptions = function()
return Global.getTable("optionPanel")
end
return OptionPanelApi
end
end)
__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/cards/HeavyFurs")
end)
__bundle_register("playercards/cards/HeavyFurs", function(require, _LOADED, __bundle_register, __bundle_modules)
VALID_TOKENS = {
["Skull"] = true,
["Tablet"] = true,
["Elder Thing"] = true,
["Cultist"] = true,
["Frost"] = true,
["Custom Token"] = true,
["Elder Sign"] = true,
["Bless"] = true,
["Curse"] = true
}
require("playercards/CardsWithHelper")
require("playercards/CardsThatRedrawTokens")
end)
__bundle_register("playercards/CardsThatRedrawTokens", function(require, _LOADED, __bundle_register, __bundle_modules)
--[[ Library for cards that return and redraw tokens
This file is used to add an XML button to a card, turned on via context menu.
Valid options modify the appearance of the XML button, as well as the
behavior of the return and redraw function. Set options before requiring this file.
Parameters for the return and redraw functions. Typically set VALID_TOKENS or INVALID_TOKENS, not both.
If there are no restrictions on which tokens can be redrawn (e.g. Wendy Adams), keep both empty.
* VALID_TOKENS --@type table
- keyed table which lists all tokens that can be redrawn by the card
- example usage: "False Covenant"
> VALID_TOKENS = {
> ["Curse"] = true
> }
* INVALID_TOKENS --@type table
- keyed table which lists all tokens that cannot be redrawn by the card
- example usage: "Custom Ammunition"
> INVALID_TOKENS = {
> ["Auto-fail"] = true
> }
* DRAW_SPECIFIC_TOKEN --@type string (name of token or nil)
- if set, will attempt to draw that specific token
* RETURN_TO_POOL --@type string
- allows for the name of the card to be passed onto Global for any special handling
The following parameters modify the appearence of the XML button and are not listed as part of a table.
- buttonHeight (default is 450)
- buttonWidth (default is 1400)
- buttonPosition (default is "0 -55 -22")
- buttonFontSize (default is 250)
- buttonRotation (change if button is placed on an investigator cards)
- buttonLabel (default is "Redraw Token")
- buttonIcon (to add an icon to the right)
- buttonColor (default is "#77674DE6")
----------------------------------------------------------
EXAMPLE: Claypool's Furs
This card can only redraw the Frost token, and is replaced with a random token from the bag.
As a nice reminder the XML button takes on the Frost color and icon with the text "Cancel".
> buttonValue = "Cancel"
> buttonIcon = "token-frost"
> buttonColor = "#404450E6"
> buttonFontSize = 300
> VALID_TOKENS = {
> ["Frost"] = true
> }
>
> require...
----------------------------------------------------------]]
-- intentionally global
hasXML = true
isHelperEnabled = false
function updateSave()
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
end
function onLoad(savedData)
if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData)
isHelperEnabled = loadedData.isHelperEnabled
end
createHelperXML()
syncDisplayWithOptionPanel()
end
function createHelperXML()
local xmlTable = { {
tag = "Button",
attributes = {
active = "false",
id = "Helper",
height = buttonHeight or 450,
width = buttonWidth or 1400,
rotation = buttonRotation or "0 0 180",
scale = "0.1 0.1 1",
position = buttonPosition or "0 -55 -22",
padding = "50 50 50 50",
font = "font_teutonic-arkham",
fontSize = buttonFontSize or 250,
onClick = "triggerXMLTokenLabelCreation",
color = buttonColor or "#77674DE6",
textColor = "White"
},
value = buttonLabel or "Redraw Token"
} }
if buttonIcon then
xmlTable[1].attributes.iconWidth = "400"
xmlTable[1].attributes.iconAlignment = "Right"
xmlTable[1].attributes.icon = buttonIcon
end
self.UI.setXmlTable(xmlTable)
end
function triggerXMLTokenLabelCreation()
Global.call("activeRedrawEffect", {
VALID_TOKENS = VALID_TOKENS,
INVALID_TOKENS = INVALID_TOKENS,
RETURN_TO_POOL = RETURN_TO_POOL
})
end
end)
return __bundle_require("__root")

View File

@ -30,7 +30,7 @@ HideWhenFaceDown: true
IgnoreFoW: false IgnoreFoW: false
LayoutGroupSortIndex: 0 LayoutGroupSortIndex: 0
Locked: false Locked: false
LuaScript: '' LuaScript: !include 'Card Heavy Furs 275450.ttslua'
LuaScriptState: '' LuaScriptState: ''
MeasureMovement: false MeasureMovement: false
Name: Card Name: Card

View File

@ -21,7 +21,7 @@ Description: Artifact from Another Life (Advanced)
DragSelectable: true DragSelectable: true
GMNotes: "{\n \"id\": \"90018\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n GMNotes: "{\n \"id\": \"90018\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
\ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\":
1,\n \"combatIcons\": 1,\n \"wildIcons\": 2,\n \"cycle\": \"Standalone\"\n}" 1,\n \"combatIcons\": 1,\n \"wildIcons\": 2,\n \"cycle\": \"Bad Blood\"\n}"
GUID: bf151d GUID: bf151d
Grid: true Grid: true
GridProjection: false GridProjection: false

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