Compare commits
No commits in common. "patches" and "p3.7.0" have entirely different histories.
1847
unpacked.ttslua
1847
unpacked.ttslua
File diff suppressed because it is too large
Load Diff
106
unpacked.xml
106
unpacked.xml
@ -569,6 +569,9 @@
|
||||
<Text color="#FFFFFF"
|
||||
alignment="MiddleLeft" />
|
||||
|
||||
<Toggle isOn="False"
|
||||
rectAlignment="MiddleRight" />
|
||||
|
||||
<Dropdown rectAlignment="MiddleCenter" />
|
||||
|
||||
<Cell dontUseTableCellBackground="true"
|
||||
@ -627,14 +630,6 @@
|
||||
font="font_teutonic-arkham"/>
|
||||
<Panel class="doubleColumn-wrapper"
|
||||
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 -->
|
||||
<Button class="bottomButtons"
|
||||
@ -721,24 +716,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
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).
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"/>
|
||||
<Toggle id="showTitleSplash"
|
||||
onValueChanged="onClick_toggleOption(showTitleSplash)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -761,9 +740,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="playAreaSnapTags"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="playAreaSnapTags"
|
||||
onValueChanged="onClick_toggleOption(playAreaSnapTags)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -776,9 +754,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="playAreaConnections"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="playAreaConnections"
|
||||
onValueChanged="onClick_toggleOption(playAreaConnections)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -808,9 +785,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="changePlayAreaImage"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="changePlayAreaImage"
|
||||
onValueChanged="onClick_toggleOption(changePlayAreaImage)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -833,9 +809,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="useSnapTags"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="useSnapTags"
|
||||
onValueChanged="onClick_toggleOption(useSnapTags)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -848,24 +823,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
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"/>
|
||||
<Toggle id="showDrawButton"
|
||||
onValueChanged="onClick_toggleOption(showDrawButton)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -878,9 +837,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="useClueClickers"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="useClueClickers"
|
||||
onValueChanged="onClick_toggleOption(useClueClickers)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -945,9 +903,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="showAttachmentHelper"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="showAttachmentHelper"
|
||||
onValueChanged="onClick_toggleOption(showAttachmentHelper)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -960,9 +917,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="showCleanUpHelper"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="showCleanUpHelper"
|
||||
onValueChanged="onClick_toggleOption(showCleanUpHelper)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -975,9 +931,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="showCYOA"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="showCYOA"
|
||||
onValueChanged="onClick_toggleOption(showCYOA)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -990,9 +945,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="showDisplacementTool"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="showDisplacementTool"
|
||||
onValueChanged="onClick_toggleOption(showDisplacementTool)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -1005,9 +959,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="showHandHelper"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="showHandHelper"
|
||||
onValueChanged="onClick_toggleOption(showHandHelper)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
@ -1020,9 +973,8 @@
|
||||
</Panel>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Button class="optionToggle"
|
||||
id="showSearchAssistant"
|
||||
onClick="onClick_toggleOption"/>
|
||||
<Toggle id="showSearchAssistant"
|
||||
onValueChanged="onClick_toggleOption(showSearchAssistant)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
</TableLayout>
|
||||
|
356
unpacked.yaml
356
unpacked.yaml
@ -71,18 +71,33 @@ ComponentTags:
|
||||
normalized: investigator
|
||||
- displayed: chaosBag
|
||||
normalized: chaosbag
|
||||
- displayed: ActionToken
|
||||
normalized: actiontoken
|
||||
- displayed: LargeBox
|
||||
normalized: largebox
|
||||
- displayed: CampaignBox
|
||||
normalized: campaignbox
|
||||
- displayed: CameraZoom_ignore
|
||||
normalized: camerazoom_ignore
|
||||
- displayed: UniversalToken
|
||||
normalized: universaltoken
|
||||
CustomUIAssets:
|
||||
- Name: refresh
|
||||
Type: 0
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/1695031152736214852/EC3BBEF1A1788381A8F4C5ACB7FB27770CAF03C5/
|
||||
- Name: close
|
||||
Type: 0
|
||||
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
|
||||
Type: 0
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/1782854877010106784/6E00433E3425D0A7C6121E0DDB6A79167BA78569/
|
||||
@ -98,18 +113,24 @@ CustomUIAssets:
|
||||
- Name: option-gear
|
||||
Type: 0
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/2026086584372569912/5CB461AEAE2E59D3064D90A776EB86C46081EC78/
|
||||
- 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
|
||||
- Name: font_birmingham
|
||||
Type: 1
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/2462982115649258367/C20CC4C299A6FE5F1ECAB968E15BE590337CC019/
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/2027213118466443497/3CF9BB9AF968D245961494CC9A151774EB9BA638/
|
||||
- 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
|
||||
Type: 1
|
||||
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
|
||||
Type: 0
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753624/53E7443E2A9957BC5CA4D73B67D5C1C30971C9F9/
|
||||
@ -122,18 +143,24 @@ CustomUIAssets:
|
||||
- Name: header_olive
|
||||
Type: 0
|
||||
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
|
||||
Type: 0
|
||||
URL: https://i.imgur.com/6MReiEO.png
|
||||
- Name: Inv-Roland
|
||||
Type: 0
|
||||
URL: https://i.imgur.com/lx6unDY.png
|
||||
- Name: NextArrow
|
||||
Type: 0
|
||||
URL: https://i.imgur.com/MztSQis.png
|
||||
- Name: Exit
|
||||
Type: 0
|
||||
URL: https://i.imgur.com/8qmTXwt.png
|
||||
- Name: Inv-Roland
|
||||
Type: 0
|
||||
URL: https://i.imgur.com/lx6unDY.png
|
||||
- Name: Inv-Mandy
|
||||
Type: 0
|
||||
URL: https://i.imgur.com/hniMC5g.png
|
||||
@ -197,37 +224,7 @@ CustomUIAssets:
|
||||
- Name: box-cover-mask-wide
|
||||
Type: 0
|
||||
URL: http://cloud-3.steamusercontent.com/ugc/2115061298538827369/A20C2ECB8ECDC1B0AD8B2B38F68CA1C1F5E07D37/
|
||||
- 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
|
||||
Date: Mon Mar 4 23:52:37 CET 2024
|
||||
DecalPallet:
|
||||
- ImageURL: http://cloud-3.steamusercontent.com/ugc/1474319121424323663/BC5570ECF747F1B30224461B576E8B0FE7FA5F33/
|
||||
Name: Achivement Checkmark
|
||||
@ -236,7 +233,7 @@ DecalPallet:
|
||||
Name: Victory Display
|
||||
Size: 15
|
||||
Decals: []
|
||||
EpochTime: 1720462788
|
||||
EpochTime: 1709592757
|
||||
GameComplexity: ''
|
||||
GameMode: Arkham Horror LCG - Super Complete Edition
|
||||
GameType: ''
|
||||
@ -287,7 +284,7 @@ Lighting:
|
||||
LutIndex: 0
|
||||
ReflectionIntensity: 1
|
||||
LuaScript: !include 'unpacked.ttslua'
|
||||
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}}'
|
||||
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}}'
|
||||
MusicPlayer:
|
||||
AudioLibrary:
|
||||
- Item1: http://cloud-3.steamusercontent.com/ugc/784110538847453001/4481D1CC5684FCF04AB143954DEFE09E94BF5CEB/
|
||||
@ -345,14 +342,11 @@ MusicPlayer:
|
||||
Note: ''
|
||||
ObjectStates:
|
||||
- !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/HandTrigger 5fe087.yaml'
|
||||
- !include 'unpacked/HandTrigger be2f17.yaml'
|
||||
- !include 'unpacked/HandTrigger 0285cc.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 TableLegBottomLeft c8edca.yaml'
|
||||
- !include 'unpacked/Custom_Assetbundle TableLegTopLeft 393bf7.yaml'
|
||||
@ -408,9 +402,7 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Model_Bag Trash 5f896a.yaml'
|
||||
- !include 'unpacked/Custom_Model_Bag Trash 147e80.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 Latest FAQ faqfaq.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 3b2550.yaml'
|
||||
@ -424,6 +416,8 @@ ObjectStates:
|
||||
- !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 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 Clue Counter 37be78.yaml'
|
||||
- !include 'unpacked/Custom_Model Clue Counter 1769ed.yaml'
|
||||
@ -432,7 +426,8 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Token Master Clue Counter 4a3aa4.yaml'
|
||||
- !include 'unpacked/Custom_Model_Bag Legacy Assets 7165a9.yaml'
|
||||
- !include 'unpacked/Custom_Token Play Area 721ba2.yaml'
|
||||
- !include 'unpacked/Custom_Model_Bag Additional Player Cards 2cba6b.yaml'
|
||||
- !include 'unpacked/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/Checker_white Token Spawn Tool 36b4ee.yaml'
|
||||
- !include 'unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml'
|
||||
@ -453,6 +448,8 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Model_Bag Chaos Bag fea079.yaml'
|
||||
- !include 'unpacked/Custom_Tile Data Helper 708279.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 The Dream-Eaters a16a1a.yaml'
|
||||
- !include 'unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml'
|
||||
@ -462,11 +459,27 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Tile Playermat 2 Orange bd0ff4.yaml'
|
||||
- !include 'unpacked/Custom_Tile Playermat 3 Green 383d8b.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_Tile ArkhamDB Deck Importer a28140.yaml'
|
||||
- !include 'unpacked/Checker_white Configuration 03804b.yaml'
|
||||
- !include 'unpacked/Custom_Token Drawing Tool 280086.yaml'
|
||||
- !include 'unpacked/Custom_Token PlayArea Image Swapper b7b45b.yaml'
|
||||
- !include 'unpacked/Custom_Token Playmat Image Swapper b7b45b.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 e598c2.yaml'
|
||||
@ -487,6 +500,7 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Tile Token Remover 2ba7a5.yaml'
|
||||
- !include 'unpacked/Custom_Tile Token Remover 0a5a29.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 975c39.yaml'
|
||||
- !include 'unpacked/BlockRectangle Table Divider 75937e.yaml'
|
||||
@ -495,10 +509,10 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Model Decoration - Ammo b43845.yaml'
|
||||
- !include 'unpacked/Custom_Model Decoration - Ammo d35ee9.yaml'
|
||||
- !include 'unpacked/Custom_Token Victory Display 6ccd6d.yaml'
|
||||
- !include 'unpacked/Custom_Tile Official Releases Overview 8e22bb.yaml'
|
||||
- !include 'unpacked/Custom_Tile Fan-Made Expansion Overview de7cae.yaml'
|
||||
- !include 'unpacked/Custom_Tile Campaign Overview e03c01.yaml'
|
||||
- !include 'unpacked/Bag OptionPanel Source 830bd0.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/3DText d628cc.yaml'
|
||||
- !include 'unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml'
|
||||
@ -506,7 +520,7 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Token Token Arranger 022907.yaml'
|
||||
- !include 'unpacked/Custom_Tile Chaos Bag Manager 023240.yaml'
|
||||
- !include 'unpacked/BlockRectangle Placeholder Box Dummy a93466.yaml'
|
||||
- !include 'unpacked/Custom_Model Lovecrafter 3077 b08d20.yaml'
|
||||
- !include 'unpacked/Custom_Model The Matter of Britain 194cc5.yaml'
|
||||
- !include 'unpacked/Custom_Tile Tokencache_+1 a15273.yaml'
|
||||
- !include 'unpacked/Custom_Tile Tokencache_0 0a8592.yaml'
|
||||
- !include 'unpacked/Custom_Tile Tokencache_-1 b644d2.yaml'
|
||||
@ -527,18 +541,6 @@ ObjectStates:
|
||||
- !include 'unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml'
|
||||
- !include 'unpacked/Custom_Tile Tokencache_Frost b2b7be.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
|
||||
PlayerCounts:
|
||||
- 0
|
||||
@ -546,7 +548,7 @@ PlayerCounts:
|
||||
PlayingTime:
|
||||
- 0
|
||||
- 0
|
||||
SaveName: Arkham SCE - 3.9.0
|
||||
SaveName: Arkham SCE - 3.7.0
|
||||
Sky: Sky_Museum
|
||||
SkyURL: https://i.imgur.com/GkQqaOF.jpg
|
||||
SnapPoints:
|
||||
@ -734,80 +736,182 @@ SnapPoints:
|
||||
x: -26
|
||||
y: 1.48
|
||||
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:
|
||||
'1':
|
||||
body: 'Welcome to Arkham Horror LCG - Super Complete Edition!
|
||||
|
||||
|
||||
Make sure to take the tour that can be started with the token in the middle
|
||||
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.'
|
||||
'10':
|
||||
body: "Created by Whimsical\n\nAnything that passes over the remover that isn't
|
||||
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
|
||||
to your play area first."
|
||||
color: Grey
|
||||
id: 1
|
||||
title: Basic Intro
|
||||
id: 10
|
||||
title: Token Remover
|
||||
visibleColor:
|
||||
b: 0.5
|
||||
g: 0.5
|
||||
r: 0.5
|
||||
'2':
|
||||
'11':
|
||||
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
|
||||
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,
|
||||
while the "Default" setting means that each player can only see the cards in
|
||||
their own hand.
|
||||
color: Grey
|
||||
id: 2
|
||||
id: 7
|
||||
title: How to Hide Hands
|
||||
visibleColor:
|
||||
b: 0.5
|
||||
g: 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
|
||||
Tags: []
|
||||
Turns:
|
||||
|
@ -61,6 +61,50 @@ function onLoad()
|
||||
self.addContextMenuItem("Update card index", function() allCardsBagApi.rebuildIndexForHotfix() end)
|
||||
end
|
||||
end)
|
||||
__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules)
|
||||
do
|
||||
local GUIDReferenceApi = {}
|
||||
|
||||
local function getGuidHandler()
|
||||
return getObjectFromGUID("123456")
|
||||
end
|
||||
|
||||
---@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
|
||||
|
||||
return GUIDReferenceApi
|
||||
end
|
||||
end)
|
||||
__bundle_register("playercards/AllCardsBagApi", function(require, _LOADED, __bundle_register, __bundle_modules)
|
||||
do
|
||||
local AllCardsBagApi = {}
|
||||
@ -70,29 +114,22 @@ do
|
||||
return guidReferenceApi.getObjectByOwnerAndType("Mythos", "AllCardsBag")
|
||||
end
|
||||
|
||||
-- internal function to create a copy of the table to avoid operating on variables owned by different objects
|
||||
local function returnCopyOfList(data)
|
||||
local copiedList = {}
|
||||
for _, id in ipairs(data) do
|
||||
table.insert(copiedList, id)
|
||||
end
|
||||
return copiedList
|
||||
end
|
||||
|
||||
-- Returns a specific card from the bag, based on ArkhamDB ID
|
||||
---@param id string ID of the card to retrieve
|
||||
---@return table: If the indexes are still being constructed, returns an empty table.
|
||||
-- Otherwise, a single table with the following fields
|
||||
-- data: TTS object data, suitable for spawning the card
|
||||
-- metadata: Table of parsed metadata
|
||||
---@param id table String ID of the card to retrieve
|
||||
---@return table table
|
||||
-- If the indexes are still being constructed, an empty table is
|
||||
-- returned. Otherwise, a single table with the following fields
|
||||
-- cardData: TTS object data, suitable for spawning the card
|
||||
-- cardMetadata: Table of parsed metadata
|
||||
AllCardsBagApi.getCardById = function(id)
|
||||
return getAllCardsBag().call("getCardById", {id = id})
|
||||
end
|
||||
|
||||
-- Gets a random basic weakness from the bag. Once a given ID has been returned it
|
||||
-- will be removed from the list and cannot be selected again until a reload occurs
|
||||
-- or the indexes are rebuilt, which will refresh the list to include all weaknesses.
|
||||
---@return string: ID of the selected weakness
|
||||
-- Gets a random basic weakness from the bag. Once a given ID has been returned
|
||||
-- it will be removed from the list and cannot be selected again until a reload
|
||||
-- occurs or the indexes are rebuilt, which will refresh the list to include all
|
||||
-- weaknesses.
|
||||
---@return string: ID of the selected weakness.
|
||||
AllCardsBagApi.getRandomWeaknessId = function()
|
||||
return getAllCardsBag().call("getRandomWeaknessId")
|
||||
end
|
||||
@ -107,15 +144,15 @@ do
|
||||
-- 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.
|
||||
AllCardsBagApi.rebuildIndexForHotfix = function()
|
||||
getAllCardsBag().call("rebuildIndexForHotfix")
|
||||
return getAllCardsBag().call("rebuildIndexForHotfix")
|
||||
end
|
||||
|
||||
-- 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.
|
||||
-- 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.
|
||||
---@param name string or string fragment to search for names
|
||||
---@param exact boolean Whether the name match should be exact
|
||||
AllCardsBagApi.getCardsByName = function(name, exact)
|
||||
return returnCopyOfList(getAllCardsBag().call("getCardsByName", { name = name, exact = exact }))
|
||||
return getAllCardsBag().call("getCardsByName", {name = name, exact = exact})
|
||||
end
|
||||
|
||||
AllCardsBagApi.isBagPresent = function()
|
||||
@ -124,91 +161,24 @@ do
|
||||
|
||||
-- Returns a list of cards from the bag matching a class and level (0 or upgraded)
|
||||
---@param class string class to retrieve ("Guardian", "Seeker", etc)
|
||||
---@param upgraded boolean True for upgraded cards (Level 1-5), false for Level 0
|
||||
---@param upgraded boolean true for upgraded cards (Level 1-5), false for Level 0
|
||||
---@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
|
||||
-- cardData: TTS object data, suitable for spawning the card
|
||||
-- cardMetadata: Table of parsed metadata
|
||||
AllCardsBagApi.getCardsByClassAndLevel = function(class, upgraded)
|
||||
return returnCopyOfList(getAllCardsBag().call("getCardsByClassAndLevel", { class = class, upgraded = upgraded }))
|
||||
return getAllCardsBag().call("getCardsByClassAndLevel", {class = class, upgraded = upgraded})
|
||||
end
|
||||
|
||||
-- Returns a list of cards from the bag matching a cycle
|
||||
---@param cycle string Cycle to retrieve ("The Scarlet Keys" etc.)
|
||||
---@param sortByMetadata boolean If true, sorts 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
|
||||
AllCardsBagApi.getCardsByCycle = function(cycle, sortByMetadata)
|
||||
return returnCopyOfList(getAllCardsBag().call("getCardsByCycle", { cycle = cycle, sortByMetadata = sortByMetadata }))
|
||||
end
|
||||
|
||||
-- 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
|
||||
---@param traits? string Trait(s) to use as filter
|
||||
---@return table: Array of weakness IDs which are valid to choose from
|
||||
AllCardsBagApi.buildAvailableWeaknesses = function(traits)
|
||||
return returnCopyOfList(getAllCardsBag().call("buildAvailableWeaknesses", traits))
|
||||
AllCardsBagApi.getCardsByCycle = function(cycle)
|
||||
return getAllCardsBag().call("getCardsByCycle", cycle)
|
||||
end
|
||||
|
||||
AllCardsBagApi.getUniqueWeaknesses = function()
|
||||
return returnCopyOfList(getAllCardsBag().call("getUniqueWeaknesses"))
|
||||
return getAllCardsBag().call("getUniqueWeaknesses")
|
||||
end
|
||||
|
||||
return AllCardsBagApi
|
||||
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")
|
55
unpacked/Bag Additional Player Cards 2cba6b.yaml
Normal file
55
unpacked/Bag Additional Player Cards 2cba6b.yaml
Normal file
@ -0,0 +1,55 @@
|
||||
AltLookAngle:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
Autoraise: true
|
||||
Bag:
|
||||
Order: 0
|
||||
ColorDiffuse:
|
||||
b: 0
|
||||
g: 0.36652
|
||||
r: 0.70588
|
||||
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: ''
|
@ -45,8 +45,6 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund
|
||||
require("playercards/AllCardsBag")
|
||||
end)
|
||||
__bundle_register("playercards/AllCardsBag", function(require, _LOADED, __bundle_register, __bundle_modules)
|
||||
local guidReferenceApi = require("core/GUIDReferenceApi")
|
||||
|
||||
local cardIdIndex = { }
|
||||
local classAndLevelIndex = { }
|
||||
local basicWeaknessList = { }
|
||||
@ -54,7 +52,6 @@ local uniqueWeaknessList = {}
|
||||
local cycleIndex = { }
|
||||
|
||||
local indexingDone = false
|
||||
local otherCardsDetected = false
|
||||
|
||||
function onLoad()
|
||||
self.addContextMenuItem("Rebuild Index", startIndexBuild)
|
||||
@ -68,7 +65,7 @@ end
|
||||
-- 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.
|
||||
function rebuildIndexForHotfix()
|
||||
if indexingDone then
|
||||
if (indexingDone) then
|
||||
startIndexBuild()
|
||||
end
|
||||
end
|
||||
@ -107,299 +104,237 @@ function onObjectLeaveContainer(container, _)
|
||||
end
|
||||
end
|
||||
|
||||
-- Create the card indexes by iterating all cards in the bag, parsing their metadata
|
||||
-- and creating the keyed lookup tables for the cards. This is a coroutine which will
|
||||
-- spread the workload by processing 20 cards before yielding.
|
||||
-- Create the card indexes by iterating all cards in the bag, parsing their
|
||||
-- metadata, and creating the keyed lookup tables for the cards. This is a
|
||||
-- coroutine which will spread the workload by processing 20 cards before
|
||||
-- yielding. Based on the current count of cards this will require
|
||||
-- approximately 60 frames to complete.
|
||||
function buildIndex()
|
||||
local cardCount = 0
|
||||
indexingDone = false
|
||||
otherCardsDetected = false
|
||||
|
||||
-- process the allcardsbag itself
|
||||
for _, cardData in ipairs(self.getData().ContainedObjects) do
|
||||
addCardToIndex(cardData)
|
||||
if (self.getData().ContainedObjects == nil) then
|
||||
return 1
|
||||
end
|
||||
for i, cardData in ipairs(self.getData().ContainedObjects) do
|
||||
local cardMetadata = JSON.decode(cardData.GMNotes)
|
||||
if (cardMetadata ~= nil) then
|
||||
addCardToIndex(cardData, cardMetadata)
|
||||
cardCount = cardCount + 1
|
||||
if cardCount > 19 then
|
||||
if cardCount > 9 then
|
||||
cardCount = 0
|
||||
coroutine.yield(0)
|
||||
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
|
||||
|
||||
for _, cardData in ipairs(hotfixData.ContainedObjects) do
|
||||
local hotfixBags = getObjectsWithTag("AllCardsHotfix")
|
||||
for _, hotfixBag in ipairs(hotfixBags) do
|
||||
if (#hotfixBag.getObjects() > 0) then
|
||||
for i, cardData in ipairs(hotfixBag.getData().ContainedObjects) do
|
||||
if cardData.ContainedObjects then
|
||||
-- process containers
|
||||
for _, deepCardData in ipairs(cardData.ContainedObjects) do
|
||||
addCardToIndex(deepCardData)
|
||||
for j, deepCardData in ipairs(cardData.ContainedObjects) do
|
||||
local deepCardMetadata = JSON.decode(deepCardData.GMNotes)
|
||||
if deepCardMetadata ~= nil then
|
||||
addCardToIndex(deepCardData, deepCardMetadata)
|
||||
cardCount = cardCount + 1
|
||||
if cardCount > 19 then
|
||||
if cardCount > 9 then
|
||||
cardCount = 0
|
||||
coroutine.yield(0)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
-- process single cards
|
||||
addCardToIndex(cardData)
|
||||
local cardMetadata = JSON.decode(cardData.GMNotes)
|
||||
if cardMetadata ~= nil then
|
||||
addCardToIndex(cardData, cardMetadata)
|
||||
cardCount = cardCount + 1
|
||||
if cardCount > 19 then
|
||||
if cardCount > 9 then
|
||||
cardCount = 0
|
||||
coroutine.yield(0)
|
||||
end
|
||||
end
|
||||
end
|
||||
::nextBag::
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
buildSupplementalIndexes()
|
||||
updatePlayerCardPanel()
|
||||
indexingDone = true
|
||||
return 1
|
||||
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
|
||||
function addCardToIndex(cardData)
|
||||
-- using the more efficient 'json.parse()' to speed this process up
|
||||
local status, cardMetadata = pcall(function() return json.parse(cardData.GMNotes) end)
|
||||
|
||||
-- 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
|
||||
|
||||
-- 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
|
||||
|
||||
---@param cardMetadata table SCED metadata for the card
|
||||
function addCardToIndex(cardData, cardMetadata)
|
||||
-- use the ZoopGuid as fallback if no id present
|
||||
cardMetadata.id = cardMetadata.id or cardMetadata.TtsZoopGuid
|
||||
if cardMetadata.id == nil and cardMetadata.TtsZoopGuid then
|
||||
cardMetadata.id = cardMetadata.TtsZoopGuid
|
||||
end
|
||||
cardIdIndex[cardMetadata.id] = { data = cardData, metadata = cardMetadata }
|
||||
|
||||
-- also add data for alternate ids
|
||||
if cardMetadata.alternate_ids ~= nil then
|
||||
if (cardMetadata.alternate_ids ~= nil) then
|
||||
for _, alternateId in ipairs(cardMetadata.alternate_ids) do
|
||||
cardIdIndex[alternateId] = { data = cardData, metadata = cardMetadata }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Creates the supplemental indexes for classes, weaknesses etc.
|
||||
function buildSupplementalIndexes()
|
||||
for cardId, card in pairs(cardIdIndex) do
|
||||
-- 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 cardId == card.metadata.id then
|
||||
-- Add card to the basic weakness list, if appropriate. Some weaknesses have multiple copies, and are added multiple times
|
||||
if card.metadata.weakness then
|
||||
table.insert(uniqueWeaknessList, card.metadata.id)
|
||||
if card.metadata.basicWeaknessCount ~= nil then
|
||||
for i = 1, card.metadata.basicWeaknessCount do
|
||||
table.insert(basicWeaknessList, card.metadata.id)
|
||||
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 cardId == cardMetadata.id then
|
||||
-- Add card to the basic weakness list, if appropriate. Some weaknesses have
|
||||
-- multiple copies, and are added multiple times
|
||||
if cardMetadata.weakness then
|
||||
table.insert(uniqueWeaknessList, cardMetadata.id)
|
||||
if cardMetadata.basicWeaknessCount ~= nil then
|
||||
for i = 1, cardMetadata.basicWeaknessCount do
|
||||
table.insert(basicWeaknessList, cardMetadata.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Excludes signature cards (which have no class or level)
|
||||
if card.metadata.class ~= nil and card.metadata.level ~= nil then
|
||||
local upgradeKey = "-level0"
|
||||
if card.metadata.level > 0 then
|
||||
-- Add the card to the appropriate class and level indexes
|
||||
local isGuardian = false
|
||||
local isSeeker = false
|
||||
local isMystic = false
|
||||
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"
|
||||
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
|
||||
|
||||
-- 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
|
||||
local cycleName = cardMetadata.cycle
|
||||
if cycleName ~= nil then
|
||||
cycleName = string.lower(cycleName)
|
||||
|
||||
-- remove "return to " from cycle names
|
||||
cycleName = cycleName:gsub("return to ", "")
|
||||
|
||||
-- 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
|
||||
if string.match(cycleName, "return") then
|
||||
cycleName = string.sub(cycleName, 11)
|
||||
end
|
||||
if cycleName == "the night of the zealot" then
|
||||
cycleName = "core"
|
||||
end
|
||||
|
||||
-- maybe initialize table
|
||||
if cycleIndex[cycleName] == nil then
|
||||
cycleIndex[cycleName] = { }
|
||||
end
|
||||
table.insert(cycleIndex[cycleName], card.metadata.id)
|
||||
table.insert(cycleIndex[cycleName], cardMetadata.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- sort class and level indices
|
||||
for _, indexTable in pairs(classAndLevelIndex) do
|
||||
table.sort(indexTable, cardComparator)
|
||||
end
|
||||
|
||||
-- sort cycle indices
|
||||
for _, indexTable in pairs(cycleIndex) do
|
||||
table.sort(indexTable)
|
||||
end
|
||||
|
||||
-- sort weakness indices
|
||||
table.sort(basicWeaknessList, cardComparator)
|
||||
table.sort(uniqueWeaknessList, cardComparator)
|
||||
end
|
||||
|
||||
-- Comparison function used to sort the class card bag indexes. Sorts by card level, then name, then subname.
|
||||
-- Comparison function used to sort the class card bag indexes. Sorts by card
|
||||
-- level, then name, then subname.
|
||||
function cardComparator(id1, id2)
|
||||
local card1 = cardIdIndex[id1]
|
||||
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
|
||||
elseif card1.data.Nickname ~= card2.data.Nickname then
|
||||
end
|
||||
if (card1.data.Nickname ~= card2.data.Nickname) then
|
||||
return card1.data.Nickname < card2.data.Nickname
|
||||
else
|
||||
end
|
||||
return card1.data.Description < card2.data.Description
|
||||
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()
|
||||
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
|
||||
end
|
||||
|
||||
-- Returns a specific card from the bag, based on ArkhamDB ID
|
||||
---@param params table ID of the card to retrieve
|
||||
---@return table: If the indexes are still being constructed, returns an empty table.
|
||||
-- Otherwise, a single table with the following fields
|
||||
-- data: TTS object data, suitable for spawning the card
|
||||
-- metadata: Table of parsed metadata
|
||||
-- Params table:
|
||||
-- id: String ID of the card to retrieve
|
||||
-- Return: If the indexes are still being constructed, an empty table is
|
||||
-- returned. Otherwise, a single table with the following fields
|
||||
-- cardData: TTS object data, suitable for spawning the card
|
||||
-- cardMetadata: Table of parsed metadata
|
||||
function getCardById(params)
|
||||
if not isIndexReady() then return {} end
|
||||
if (not indexingDone) then
|
||||
broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2})
|
||||
return { }
|
||||
end
|
||||
return cardIdIndex[params.id]
|
||||
end
|
||||
|
||||
-- Returns a list of cards from the bag matching a class and level (0 or upgraded)
|
||||
---@param params table
|
||||
-- Params table:
|
||||
-- class: String class to retrieve ("Guardian", "Seeker", etc)
|
||||
-- isUpgraded: true for upgraded cards (Level 1-5), false for Level 0
|
||||
---@return table: If the indexes are still being constructed, returns an empty table.
|
||||
-- Return: 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
|
||||
-- cardData: TTS object data, suitable for spawning the card
|
||||
-- cardMetadata: Table of parsed metadata
|
||||
function getCardsByClassAndLevel(params)
|
||||
if not isIndexReady() then return {} end
|
||||
|
||||
local upgradeKey = "-level0"
|
||||
if params.upgraded then
|
||||
if (not indexingDone) then
|
||||
broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2})
|
||||
return { }
|
||||
end
|
||||
local upgradeKey
|
||||
if (params.upgraded) then
|
||||
upgradeKey = "-upgrade"
|
||||
end
|
||||
return classAndLevelIndex[params.class .. upgradeKey]
|
||||
end
|
||||
|
||||
-- Returns a list of cards from the bag matching a cycle
|
||||
---@param params table
|
||||
-- cycle: String cycle to retrieve ("The Scarlet Keys" etc.)
|
||||
-- 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
|
||||
|
||||
-- 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
|
||||
upgradeKey = "-level0"
|
||||
end
|
||||
return classAndLevelIndex[params.class..upgradeKey];
|
||||
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]
|
||||
function getCardsByCycle(cycleName)
|
||||
if (not indexingDone) then
|
||||
broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2})
|
||||
return { }
|
||||
end
|
||||
return classValue
|
||||
return cycleIndex[string.lower(cycleName)]
|
||||
end
|
||||
|
||||
-- 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.
|
||||
-- Parameter array must contain these fields to define the search:
|
||||
-- name: String or string fragment to search for names
|
||||
-- exact: Whether the name match should be exact
|
||||
-- name String or string fragment to search for names
|
||||
-- exact Whether the name match should be exact
|
||||
function getCardsByName(params)
|
||||
local name = params.name
|
||||
local exact = params.exact
|
||||
local results = { }
|
||||
|
||||
-- Track cards (by ID) that we've added to avoid duplicates that may come from alternate IDs
|
||||
local addedCards = { }
|
||||
for _, cardData in pairs(cardIdIndex) do
|
||||
@ -414,31 +349,33 @@ function getCardsByName(params)
|
||||
return results
|
||||
end
|
||||
|
||||
-- Gets a random basic weakness from the bag. Once a given ID has been returned it will be
|
||||
-- removed from the list and cannot be selected again until a reload occurs or the indexes
|
||||
-- are rebuilt, which will refresh the list to include all weaknesses.
|
||||
---@return string: ID of the selected weakness
|
||||
-- Gets a random basic weakness from the bag. Once a given ID has been returned
|
||||
-- it will be removed from the list and cannot be selected again until a reload
|
||||
-- occurs or the indexes are rebuilt, which will refresh the list to include all
|
||||
-- weaknesses.
|
||||
-- Return: String ID of the selected weakness.
|
||||
function getRandomWeaknessId()
|
||||
local availableWeaknesses = buildAvailableWeaknesses()
|
||||
if #availableWeaknesses > 0 then
|
||||
if (#availableWeaknesses > 0) then
|
||||
return availableWeaknesses[math.random(#availableWeaknesses)]
|
||||
end
|
||||
end
|
||||
|
||||
-- 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
|
||||
---@param traits? string Trait(s) to use as filter
|
||||
---@return table: Array of weakness IDs which are valid to choose from
|
||||
function buildAvailableWeaknesses(traits)
|
||||
-- Return: Table array of weakness IDs which are valid to choose from
|
||||
function buildAvailableWeaknesses()
|
||||
local weaknessesInPlay = { }
|
||||
local allObjects = getAllObjects()
|
||||
for _, object in ipairs(allObjects) do
|
||||
if object.type == "Deck" then
|
||||
if (object.name == "Deck") then
|
||||
for _, cardData in ipairs(object.getData().ContainedObjects) do
|
||||
incrementWeaknessCount(weaknessesInPlay, JSON.decode(cardData.GMNotes))
|
||||
local cardMetadata = JSON.decode(cardData.GMNotes)
|
||||
incrementWeaknessCount(weaknessesInPlay, cardMetadata)
|
||||
end
|
||||
elseif object.type == "Card" then
|
||||
incrementWeaknessCount(weaknessesInPlay, JSON.decode(object.getGMNotes()))
|
||||
elseif (object.name == "Card") then
|
||||
local cardMetadata = JSON.decode(object.getGMNotes())
|
||||
incrementWeaknessCount(weaknessesInPlay, cardMetadata)
|
||||
end
|
||||
end
|
||||
|
||||
@ -447,32 +384,7 @@ function buildAvailableWeaknesses(traits)
|
||||
if (weaknessesInPlay[weaknessId] ~= nil and weaknessesInPlay[weaknessId] > 0) then
|
||||
weaknessesInPlay[weaknessId] = weaknessesInPlay[weaknessId] - 1
|
||||
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)
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
table.insert(availableWeaknesses, weaknessId)
|
||||
end
|
||||
end
|
||||
end
|
||||
return availableWeaknesses
|
||||
@ -488,8 +400,8 @@ end
|
||||
|
||||
-- Helper function that adds one to the table entry for the number of weaknesses in play
|
||||
function incrementWeaknessCount(table, cardMetadata)
|
||||
if isBasicWeakness(cardMetadata) then
|
||||
if table[cardMetadata.id] == nil then
|
||||
if (isBasicWeakness(cardMetadata)) then
|
||||
if (table[cardMetadata.id] == nil) then
|
||||
table[cardMetadata.id] = 1
|
||||
else
|
||||
table[cardMetadata.id] = table[cardMetadata.id] + 1
|
||||
@ -504,56 +416,4 @@ function isBasicWeakness(cardMetadata)
|
||||
and cardMetadata.basicWeaknessCount > 0
|
||||
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")
|
@ -16,11 +16,6 @@ ContainedObjects:
|
||||
- !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 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 Finn Edwards dd40c0.yaml'
|
||||
- !include 'Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml'
|
||||
@ -1548,7 +1543,7 @@ ContainedObjects:
|
||||
- !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 Lola Hayes (Taboo) 52956d.yaml'
|
||||
- !include 'Bag All Player Cards 15bb07/CardCustom Rex Murphy (Taboo) 0a5491.yaml'
|
||||
- !include 'Bag All Player Cards 15bb07/Card 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 Power Word Upgrade Sheet (Taboo) ebce85.yaml'
|
||||
- !include 'Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml'
|
||||
@ -1722,15 +1717,6 @@ ContainedObjects:
|
||||
- !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 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: ''
|
||||
DragSelectable: true
|
||||
GMNotes: ''
|
||||
|
@ -20,7 +20,7 @@ CustomDeck:
|
||||
Description: Advanced
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
|
||||
\ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Red Tide Rising\"\n}"
|
||||
\ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: 89fe92
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,9 +20,8 @@ CustomDeck:
|
||||
Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"02266-t\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n
|
||||
\ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"uses\": [\n {\n
|
||||
\ \"count\": 3,\n \"type\": \"Universal\",\n \"token\": \"universalActionAbility\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}"
|
||||
\ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"cycle\": \"The Dunwich
|
||||
Legacy\"\n}"
|
||||
GUID: e92f21
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,9 +20,8 @@ CustomDeck:
|
||||
Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"02266\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n
|
||||
\ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"uses\": [\n {\n
|
||||
\ \"count\": 3,\n \"type\": \"Universal\",\n \"token\": \"universalActionAbility\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}"
|
||||
\ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"cycle\": \"The Dunwich
|
||||
Legacy\"\n}"
|
||||
GUID: 074858
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,15 +21,14 @@ Description: The Waitress
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01004-pb\",\n \"type\": \"Investigator\",\n \"class\":
|
||||
\"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\":
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Bad Blood\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"01012\":
|
||||
1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"90019\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"spell\",\n \"occult\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ }\n ]\n}"
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\":
|
||||
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\":
|
||||
1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n
|
||||
\ \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
3\n }\n }\n ]\n}"
|
||||
GUID: 909f30
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,14 +21,14 @@ Description: The Waitress
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01004-pf\",\n \"type\": \"Investigator\",\n \"class\":
|
||||
\"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\":
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Bad Blood\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"01012\":
|
||||
1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"90019\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\":
|
||||
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\":
|
||||
1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n
|
||||
\ }\n ]\n}"
|
||||
GUID: 02db0a
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,15 +21,14 @@ Description: The Waitress
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01004-p\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
|
||||
\ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n
|
||||
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Bad Blood\",\n \"extraToken\":
|
||||
\"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"01012\": 1,\n \"90018\": 1\n
|
||||
\ },\n {\n \"01013\": 1,\n \"90019\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"spell\",\n \"occult\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ }\n ]\n}"
|
||||
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\":
|
||||
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\":
|
||||
1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n
|
||||
\ \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
3\n }\n }\n ]\n}"
|
||||
GUID: 01b6ef
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,10 +22,10 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01004\",\n \"alternate_ids\": [\n \"01504\"\n ],\n \"type\":
|
||||
\"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\":
|
||||
5,\n \"intellectIcons\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\":
|
||||
\"Core\",\n \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\":
|
||||
30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"01012\":
|
||||
1,\n \"90018\": 1\n },\n {\n \"01013\": 1,\n \"90019\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"01012\": 1,\n \"90018\": 1\n
|
||||
\ },\n {\n \"01013\": 1,\n \"90019\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"survivor\"\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
|
||||
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\":
|
||||
\"Sorcerer.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\":
|
||||
2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"Core\",\r\n \"extraToken\":
|
||||
\"Reaction\", \r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\":
|
||||
1,\r\n \"signatures\": [\r\n {\r\n \"01012\": 1,\r\n \"90018\":
|
||||
1\r\n },\r\n {\r\n \"01013\": 1,\r\n \"90019\": 1\r\n
|
||||
\ }\r\n ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"faction\":
|
||||
[\r\n \"mystic\",\r\n \"neutral\"\r\n ],\r\n \"level\":
|
||||
{\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n
|
||||
\ \"faction\": [\r\n \"survivor\"\r\n ],\r\n \"level\":
|
||||
{\r\n \"min\": 0,\r\n \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n"
|
||||
2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"Core\",\r\n \"deck_requirements\":
|
||||
{\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\":
|
||||
[\r\n {\r\n \"01012\": 1,\r\n \"90018\": 1\r\n },\r\n
|
||||
\ {\r\n \"01013\": 1,\r\n \"90019\": 1\r\n }\r\n ]\r\n
|
||||
\ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n
|
||||
\ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
|
||||
\ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n
|
||||
\ \"survivor\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
|
||||
\ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n"
|
||||
GUID: 6797bb
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -81,12 +81,12 @@ States:
|
||||
- Minicard
|
||||
Tooltip: true
|
||||
Transform:
|
||||
posX: 40
|
||||
posY: 1.3
|
||||
posZ: 66
|
||||
rotX: 0
|
||||
rotY: 270
|
||||
rotZ: 0
|
||||
posX: 40.7253036
|
||||
posY: 1.29860592
|
||||
posZ: 66.7765656
|
||||
rotX: 1.697304e-07
|
||||
rotY: 270.0102
|
||||
rotZ: 2.00479718e-07
|
||||
scaleX: 0.6
|
||||
scaleY: 1
|
||||
scaleZ: 0.6
|
||||
|
@ -1,56 +0,0 @@
|
||||
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: ''
|
@ -22,7 +22,7 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"03004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
|
||||
\ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n
|
||||
\ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n
|
||||
\ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"03014\": 1\n },\n {\n \"03015\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
|
@ -22,13 +22,12 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10009\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n
|
||||
\ \"traits\": \"Drifter. Socialite.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\":
|
||||
4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Feast of Hemlock
|
||||
Vale\",\n \"extraToken\": \"Parley\",\n \"deck_requirements\": {\n \"size\":
|
||||
30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"10010\":
|
||||
3\n },\n {\n \"10011\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"rogue\",\n \"neutral\"\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}"
|
||||
Vale\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"10010\": 3\n },\n {\n \"10011\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n
|
||||
\ \"neutral\"\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
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,14 +22,13 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"07002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n
|
||||
\ \"traits\": \"Miskatonic. Scholar.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\":
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Innsmouth
|
||||
Conspiracy\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\":
|
||||
30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"07008\":
|
||||
1\n },\n {\n \"07009\": 1\n }\n ]\n \n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"seeker\",\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"trait\": [\n \"practiced\"\n ],\n \"type\": [\n \"skill\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ }\n ]\n}"
|
||||
Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"07008\": 1\n },\n {\n \"07009\":
|
||||
1\n }\n ]\n \n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"practiced\"\n
|
||||
\ ],\n \"type\": [\n \"skill\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 3\n }\n }\n ]\n}"
|
||||
GUID: 05b950
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,13 +22,13 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09011\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
|
||||
\ \"traits\": \"Chosen. Cursed.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\":
|
||||
3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"09012\":
|
||||
1,\n \"09013\": 1\n },\n {\n \"09014\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"trait\": [\n \"charm\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 4\n }\n }\n ]\n}"
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"09012\": 1,\n \"09013\": 1\n
|
||||
\ },\n {\n \"09014\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"trait\": [\n \"charm\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 4\n }\n }\n ]\n}"
|
||||
GUID: 4c2a3d
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -1,238 +0,0 @@
|
||||
-- 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")
|
@ -30,7 +30,7 @@ HideWhenFaceDown: true
|
||||
IgnoreFoW: false
|
||||
LayoutGroupSortIndex: 0
|
||||
Locked: false
|
||||
LuaScript: !include 'Card Analysis 80285f.ttslua'
|
||||
LuaScript: ''
|
||||
LuaScriptState: ''
|
||||
MeasureMovement: false
|
||||
Name: Card
|
||||
|
@ -21,8 +21,7 @@ Description: Basic Weakness
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"08130\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
|
||||
\ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n
|
||||
\ \"uses\": [\n {\n \"count\": 1,\n \"type\": \"Damage\",\n \"token\":
|
||||
\"damage\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}"
|
||||
\ \"cycle\": \"Edge of the Earth\"\n}"
|
||||
GUID: 8f1420
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,11 +21,11 @@ Description: The Drifter
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"02005-pb\",\n \"type\": \"Investigator\",\n \"class\":
|
||||
\"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"On the Road Again\",\n
|
||||
\ \"extraToken\": \"FreeTrigger\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
|
||||
1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
|
||||
2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n
|
||||
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\":
|
||||
|
@ -21,11 +21,11 @@ Description: The Drifter
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"02005-pf\",\n \"type\": \"Investigator\",\n \"class\":
|
||||
\"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
|
||||
2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"On the Road Again\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
|
||||
1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
|
||||
2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n
|
||||
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
|
||||
\ \"neutral\"\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
|
||||
|
@ -21,11 +21,11 @@ Description: The Drifter
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"02005-p\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
|
||||
\ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n
|
||||
\ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"On the Road Again\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
|
||||
1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
|
||||
\ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n
|
||||
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\":
|
||||
|
@ -22,10 +22,10 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"02005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
|
||||
\ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n
|
||||
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n
|
||||
\ \"extraToken\": \"FreeTrigger\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90047\":
|
||||
1,\n \"02014\": 1\n },\n {\n \"90048\": 1,\n \"02015\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n
|
||||
\ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
|
||||
\ \"neutral\"\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
|
||||
|
@ -21,9 +21,7 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09091\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n
|
||||
\ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n
|
||||
\ \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 1,\n \"type\":
|
||||
\"PlayItem\",\n \"token\": \"universalActionAbility\"\n }\n ],\n \"cycle\":
|
||||
\"The Scarlet Keys\"\n}"
|
||||
\ \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}"
|
||||
GUID: b5d894
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,10 +21,10 @@ Description: Singing Your Song
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10062\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n
|
||||
\ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally.
|
||||
Criminal. Socialite.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
1,\n \"id\": \"10063\"\n }\n ],\n \"agilityIcons\": 1,\n \"uses\": [\n
|
||||
\ {\n \"count\": 10,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
Criminal. Socialite.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\":
|
||||
\"10063\"\n }\n ],\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\":
|
||||
10,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n
|
||||
\ \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
GUID: 897a94
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -39,7 +39,7 @@ SidewaysCard: false
|
||||
Snap: true
|
||||
Sticky: true
|
||||
Tags:
|
||||
- PlayerCard
|
||||
- ScenarioCard
|
||||
Tooltip: true
|
||||
Transform:
|
||||
posX: 48.98
|
||||
|
@ -21,8 +21,7 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10129\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n
|
||||
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Double.\",\n \"wildIcons\": 1,\n
|
||||
\ \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Universal\",\n \"token\":
|
||||
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
\ \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
GUID: 24d3b3
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,17 +22,16 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"08016\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
|
||||
\ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\":
|
||||
4,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\",\n
|
||||
\ \"extraToken\": \"PlayItem\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"08017\":
|
||||
1\n },\n {\n \"08018\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"survivor\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 0\n }\n },\n {\n \"faction\":
|
||||
[\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"08017\": 1\n },\n {\n \"08018\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n
|
||||
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\":
|
||||
[\n \"rogue\"\n ],\n \"level\": {\n \"min\": 1,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\":
|
||||
{\n \"min\": 1,\n \"max\": 5\n }\n },\n {\n \"faction\":
|
||||
[\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}"
|
||||
{\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
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -14,18 +14,18 @@
|
||||
onClick="resolveToken"
|
||||
textColor="white"
|
||||
active="false"/>
|
||||
<TableLayout position="0 -55 -22"
|
||||
<Panel position="0 -55 -22"
|
||||
rotation="0 0 180"
|
||||
height="900"
|
||||
width="1400"
|
||||
scale="0.1 0.1 1"
|
||||
scale="0.1 0.1 1"/>
|
||||
<TableLayout active="false"
|
||||
cellSpacing="80"
|
||||
cellBackgroundColor="rgba(1,1,1,0)"/>
|
||||
</Defaults>
|
||||
|
||||
<Panel id="Helper"
|
||||
active="false">
|
||||
<TableLayout>
|
||||
<Panel>
|
||||
<TableLayout id="actives">
|
||||
<Row>
|
||||
<Cell>
|
||||
<Button id="Bless"
|
||||
@ -43,7 +43,10 @@
|
||||
</Cell>
|
||||
</Row>
|
||||
</TableLayout>
|
||||
<TableLayout>
|
||||
</Panel>
|
||||
|
||||
<Panel>
|
||||
<TableLayout id="inactives">
|
||||
<Row>
|
||||
<Cell>
|
||||
<Button id="inactiveBless"
|
||||
|
@ -21,10 +21,9 @@ Description: Crown of Dying Light
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10133\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Item. Charm. Mask.\",\n \"bonded\":
|
||||
[\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"10134\"\n
|
||||
\ }\n ],\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\":
|
||||
\"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast
|
||||
of Hemlock Vale\"\n}"
|
||||
[\n {\n \"count\": 1,\n \"id\": \"10134\"\n }\n ],\n \"wildIcons\":
|
||||
1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Offering\",\n \"token\":
|
||||
\"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
GUID: b6d35d
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,13 +22,12 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"04005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
|
||||
\ \"traits\": \"Cursed. Drifter.\",\n \"willpowerIcons\": 0,\n \"intellectIcons\":
|
||||
0,\n \"combatIcons\": 0,\n \"agilityIcons\": 0,\n \"cycle\": \"The Forgotten
|
||||
Age\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"04015\":
|
||||
1\n },\n {\n \"04016\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"survivor\",\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"trait\": [\n \"spirit\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 3\n }\n }\n ]\n}"
|
||||
Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"04015\": 1\n },\n {\n \"04016\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"trait\": [\n \"spirit\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}"
|
||||
GUID: b02a1e
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,20 +22,20 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"05001\",\n \"alternate_ids\": [\n \"98010\"\n ],\n \"type\":
|
||||
\"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Medic.\",\n \"willpowerIcons\":
|
||||
3,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\":
|
||||
\"The Circle Undone\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n
|
||||
\ \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n
|
||||
\ {\n \"05007\": 1,\n \"98011\": 1\n },\n {\n \"05008\":
|
||||
1,\n \"98012\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"not\":
|
||||
true,\n \"trait\": [\n \"weapon\"\n ],\n \"level\": {\n \"min\":
|
||||
1,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"special\":
|
||||
[\n \"heals_horror\"\n ],\n \"tag\": [\n \"hh\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"faction\": [\n \"seeker\",\n \"mystic\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 1\n },\n \"limit\": 15,\n \"error\":
|
||||
\"You cannot have more than 15 level 0-1 Seeker and/or Mystic cards\"\n }\n ]\n}"
|
||||
\"The Circle Undone\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"05007\": 1,\n \"98011\": 1\n },\n
|
||||
\ {\n \"05008\": 1,\n \"98012\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"not\": true,\n \"trait\": [\n \"weapon\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"faction\": [\n \"guardian\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"neutral\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n
|
||||
\ },\n {\n \"special\": [\n \"heals_horror\"\n ],\n \"tag\":
|
||||
[\n \"hh\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"seeker\",\n \"mystic\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n
|
||||
\ \"limit\": 15,\n \"error\": \"You cannot have more than 15 level 0-1
|
||||
Seeker and/or Mystic cards\"\n }\n ]\n}"
|
||||
GUID: b03b12
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
@ -77,24 +77,23 @@ States:
|
||||
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\":
|
||||
\"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 \"extraToken\":
|
||||
\"None\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\":
|
||||
1,\r\n \"signatures\": [\r\n {\r\n \"05007\": 1,\r\n \"98011\":
|
||||
1\r\n },\r\n {\r\n \"05008\": 1,\r\n \"98012\": 1\r\n }\r\n
|
||||
\ ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"not\": true,\r\n
|
||||
\ \"trait\": [\r\n \"weapon\"\r\n ],\r\n \"level\": {\r\n
|
||||
\ \"min\": 1,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n
|
||||
\ \"faction\": [\r\n \"guardian\"\r\n ],\r\n \"level\":
|
||||
{\r\n \"min\": 0,\r\n \"max\": 3\r\n }\r\n },\r\n {\r\n
|
||||
\ \"faction\": [\r\n \"neutral\"\r\n ],\r\n \"level\":
|
||||
2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle Undone\",\r\n \"deck_requirements\":
|
||||
{\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\":
|
||||
[\r\n {\r\n \"05007\": 1,\r\n \"98011\": 1\r\n },\r\n {\r\n
|
||||
\ \"05008\": 1,\r\n \"98012\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\":
|
||||
[\r\n {\r\n \"not\": true,\r\n \"trait\": [\r\n \"weapon\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 1,\r\n \"max\": 5\r\n
|
||||
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"guardian\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 3\r\n
|
||||
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"neutral\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n
|
||||
\ }\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
|
||||
\ \"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 \"faction\": [\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"
|
||||
\ \"faction\": [\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
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,21 +22,20 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n
|
||||
\ \"traits\": \"Assistant.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 2,\n
|
||||
\ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Scarlet Keys\",\n
|
||||
\ \"extraToken\": \"Activate\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"09002\":
|
||||
2\n },\n {\n \"09003\": 1\n }\n ],\n \"choices\": 1\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"choiceName\": \"Seeker\",\n \"faction\":
|
||||
[\n \"seeker\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n
|
||||
\ \"limit\": 10\n },\n {\n \"choiceName\": \"Mystic\",\n \"faction\":
|
||||
[\n \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n
|
||||
\ \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n \"faction\":
|
||||
[\n \"survivor\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n
|
||||
\ \"limit\": 10\n }\n ]\n}"
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"09002\": 2\n },\n {\n \"09003\":
|
||||
1\n }\n ],\n \"choices\": 1\n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"guardian\",\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"choiceName\": \"Seeker\",\n
|
||||
\ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n
|
||||
\ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Mystic\",\n
|
||||
\ \"faction\": [\n \"mystic\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n
|
||||
\ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n
|
||||
\ \"faction\": [\n \"survivor\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n
|
||||
\ ],\n \"limit\": 10\n }\n ]\n}"
|
||||
GUID: dc96d1
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,7 +22,7 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09018\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n
|
||||
\ \"traits\": \"Civic. Socialite.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
|
||||
1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\",\n
|
||||
\ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"09019\": 1\n },\n {\n \"09020\":
|
||||
1\n }\n ],\n \"choices\": 2\n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
|
@ -1,247 +0,0 @@
|
||||
-- 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")
|
@ -30,7 +30,7 @@ HideWhenFaceDown: true
|
||||
IgnoreFoW: false
|
||||
LayoutGroupSortIndex: 0
|
||||
Locked: false
|
||||
LuaScript: !include 'Card Claypool''s Furs c1f999.ttslua'
|
||||
LuaScript: ''
|
||||
LuaScriptState: ''
|
||||
MeasureMovement: false
|
||||
Name: Card
|
||||
|
@ -1,57 +0,0 @@
|
||||
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: ''
|
@ -22,7 +22,7 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90031\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
|
||||
\ \"traits\": \"Task.\",\n \"weakness\": true,\n \"uses\": [\n {\n \"count\":
|
||||
4,\n \"type\": \"Clue\",\n \"token\": \"clue\"\n }\n ],\n \"cycle\":
|
||||
\"By the Book\"\n}"
|
||||
\"Standalone\"\n}"
|
||||
GUID: f802e3
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -21,9 +21,8 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06024\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
|
||||
\ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item.
|
||||
Relic.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\": 2,\n
|
||||
\ \"id\": \"06025\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The
|
||||
Dream-Eaters\"\n}"
|
||||
Relic.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06025\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
GUID: 6692de
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -1,242 +0,0 @@
|
||||
-- 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")
|
@ -44,7 +44,7 @@ HideWhenFaceDown: true
|
||||
IgnoreFoW: false
|
||||
LayoutGroupSortIndex: 0
|
||||
Locked: false
|
||||
LuaScript: !include 'Card Custom Modifications d2252d.ttslua'
|
||||
LuaScript: ''
|
||||
LuaScriptState: ''
|
||||
MeasureMovement: false
|
||||
Name: Card
|
||||
|
@ -21,19 +21,18 @@ Description: The Librarian
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01002-pb\",\n \"type\": \"Investigator\",\n \"class\":
|
||||
\"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\":
|
||||
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Read or Die\",\n
|
||||
\ \"extraToken\": \"Tome\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
|
||||
\ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"trait\": [\n \"tome\"\n ],\n
|
||||
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\":
|
||||
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\":
|
||||
1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\":
|
||||
[\n \"tome\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ },\n {\n \"faction\": [\n \"guardian\",\n \"mystic\"\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}"
|
||||
\ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"guardian\",\n
|
||||
\ \"mystic\"\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
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,14 +21,14 @@ Description: The Librarian
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01002-pf\",\n \"type\": \"Investigator\",\n \"class\":
|
||||
\"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
|
||||
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Read or Die\",\n
|
||||
\ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
|
||||
\ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
|
||||
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\":
|
||||
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\":
|
||||
1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\":
|
||||
[\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n
|
||||
\ }\n ]\n}"
|
||||
GUID: e8cafc
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,19 +21,18 @@ Description: The Librarian
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01002-p\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n
|
||||
\ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
|
||||
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Read or Die\",\n
|
||||
\ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
|
||||
\ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"trait\": [\n \"tome\"\n ],\n
|
||||
5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\":
|
||||
{\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\":
|
||||
1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\":
|
||||
[\n \"tome\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n
|
||||
\ },\n {\n \"faction\": [\n \"guardian\",\n \"mystic\"\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}"
|
||||
\ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"guardian\",\n
|
||||
\ \"mystic\"\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'
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,10 +22,10 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"01002\",\n \"alternate_ids\": [\n \"01502\"\n ],\n \"type\":
|
||||
\"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\":
|
||||
3,\n \"intellectIcons\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\":
|
||||
\"Core\",\n \"extraToken\": \"Tome\",\n \"deck_requirements\": {\n \"size\":
|
||||
30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"90002\":
|
||||
1,\n \"01008\": 1\n },\n {\n \"90003\": 1,\n \"01009\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
|
||||
\"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n
|
||||
\ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
|
||||
@ -71,15 +71,14 @@ States:
|
||||
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Seeker\",\r\n \"traits\":
|
||||
\"Miskatonic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 5,\r\n
|
||||
\ \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\",\r\n
|
||||
\ \"extraToken\": \"Tome\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": [\r\n {\r\n
|
||||
\ \"90002\": 1,\r\n \"01008\": 1\r\n },\r\n {\r\n \"90003\":
|
||||
1,\r\n \"01009\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\":
|
||||
[\r\n {\r\n \"faction\": [\r\n \"seeker\",\r\n \"neutral\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n
|
||||
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"mystic\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 2\r\n
|
||||
\ }\r\n }\r\n ]\r\n}\r\n"
|
||||
\ \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\":
|
||||
1,\r\n \"signatures\": [\r\n {\r\n \"90002\": 1,\r\n \"01008\":
|
||||
1\r\n },\r\n {\r\n \"90003\": 1,\r\n \"01009\": 1\r\n
|
||||
\ }\r\n ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"faction\":
|
||||
[\r\n \"seeker\",\r\n \"neutral\"\r\n ],\r\n \"level\":
|
||||
{\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n
|
||||
\ \"faction\": [\r\n \"mystic\"\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
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,7 +22,7 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"08001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n
|
||||
\ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
|
||||
1,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\",\n
|
||||
\ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"08002\": 1\n },\n {\n \"08003\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n
|
||||
|
@ -20,8 +20,7 @@ CustomDeck:
|
||||
Description: Advanced
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90019\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n
|
||||
\ \"cost\": 4,\n \"traits\": \"Spell.\",\n \"weakness\": true,\n \"cycle\": \"Bad
|
||||
Blood\"\n}"
|
||||
\ \"cost\": 4,\n \"traits\": \"Spell.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: 580a4d
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
|
||||
\ \"traits\": \"Reporter.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 5,\n
|
||||
\ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n
|
||||
\ \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"09016\": 1\n },\n {\n \"09017\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -22,11 +22,10 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"07004\",\n \"alternate_ids\": [\n \"98016\"\n ],\n \"type\":
|
||||
\"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer. Veteran.\",\n
|
||||
\ \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \"combatIcons\": 3,\n \"agilityIcons\":
|
||||
2,\n \"cycle\": \"The Innsmouth Conspiracy\",\n \"extraToken\": \"FreeTrigger\",\n
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"98017\": 1,\n \"07012\": 1\n
|
||||
\ },\n {\n \"98018\": 1,\n \"07013\": 1\n }\n ]\n
|
||||
\ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
2,\n \"cycle\": \"The Innsmouth Conspiracy\",\n \"deck_requirements\": {\n \"size\":
|
||||
30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"98017\":
|
||||
1,\n \"07012\": 1\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\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
|
||||
@ -72,15 +71,15 @@ States:
|
||||
\ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\":
|
||||
\"Sorcerer. Veteran.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\":
|
||||
2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The
|
||||
Innsmouth Conspiracy\",\r\n \"extraToken\": \"Lightning\",\r\n \"deck_requirements\":
|
||||
{\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\":
|
||||
[\r\n {\r\n \"98017\": 1,\r\n \"07012\": 1\r\n },\r\n
|
||||
\ {\r\n \"98018\": 1,\r\n \"07013\": 1\r\n }\r\n ]\r\n
|
||||
\ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n
|
||||
\ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
|
||||
\ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n
|
||||
\ \"rogue\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n
|
||||
\ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n"
|
||||
Innsmouth Conspiracy\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": [\r\n {\r\n
|
||||
\ \"98017\": 1,\r\n \"07012\": 1\r\n },\r\n {\r\n \"98018\":
|
||||
1,\r\n \"07013\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\":
|
||||
[\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n \"neutral\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n
|
||||
\ }\r\n },\r\n {\r\n \"faction\": [\r\n \"rogue\"\r\n
|
||||
\ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 2\r\n
|
||||
\ }\r\n }\r\n ]\r\n}\r\n"
|
||||
GUID: 3925ce
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,13 +22,13 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"05004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
|
||||
\ \"traits\": \"Cultist. Silver Twilight.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\":
|
||||
3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Circle Undone\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 35,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"05013\":
|
||||
1\n },\n {\n \"05014\": 1\n },\n {\n \"05015\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}"
|
||||
\ \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"05013\": 1\n },\n {\n \"05014\":
|
||||
1\n },\n {\n \"05015\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"faction\": [\n \"guardian\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 2\n }\n }\n ]\n}"
|
||||
GUID: 32b091
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,7 +20,7 @@ CustomDeck:
|
||||
Description: Leave No Doubt
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90029\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: 07e7bd
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,7 +20,7 @@ CustomDeck:
|
||||
Description: Seek the Truth
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90028\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: 0994c9
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,7 +20,7 @@ CustomDeck:
|
||||
Description: Due Diligence
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90025\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: '133521'
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,7 +20,7 @@ CustomDeck:
|
||||
Description: Consult Experts
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90027\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: 2d9256
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,7 +20,7 @@ CustomDeck:
|
||||
Description: Red Tape
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90026\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"By the Book\"\n}"
|
||||
\ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}"
|
||||
GUID: '706176'
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -1,57 +0,0 @@
|
||||
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: ''
|
@ -21,9 +21,9 @@ Description: Dreams of an Explorer
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06236\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
|
||||
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"agilityIcons\":
|
||||
1,\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The
|
||||
Dream-Eaters\"\n}"
|
||||
GUID: 5f9a10
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,9 @@ Description: Dreams of a Madman
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06237\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
|
||||
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\":
|
||||
1,\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The
|
||||
Dream-Eaters\"\n}"
|
||||
GUID: e5f9cb
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,9 @@ Description: Dreams of a Child
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06238\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
|
||||
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"intellectIcons\":
|
||||
1,\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The
|
||||
Dream-Eaters\"\n}"
|
||||
GUID: ea40f6
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,8 @@ Description: Untranslated
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06112\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
|
||||
\ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
1,\n \"id\": \"06113\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\":
|
||||
\"The Dream-Eaters\"\n}"
|
||||
Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
GUID: b81dcf
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -21,10 +21,10 @@ Description: Abandoned by the Gods
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06276\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
|
||||
\ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item.
|
||||
Relic. Blessed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
1,\n \"id\": \"06277\"\n }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\":
|
||||
1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Charge\",\n \"token\":
|
||||
\"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
Relic. Blessed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06277\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n
|
||||
\ \"count\": 0,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
GUID: c0d236
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,9 +20,8 @@ CustomDeck:
|
||||
Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09104\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n
|
||||
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Spirit.\",\n \"uses\":
|
||||
[\n {\n \"count\": 1,\n \"type\": \"Universal\",\n \"token\":
|
||||
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}"
|
||||
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Spirit.\",\n \"cycle\":
|
||||
\"The Scarlet Keys\"\n}"
|
||||
GUID: a3d041
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,9 +20,8 @@ CustomDeck:
|
||||
Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"04148\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 2,\n \"uses\":
|
||||
[\n {\n \"count\": 1,\n \"type\": \"Explore\",\n \"token\": \"universalActionAbility\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}"
|
||||
\ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 2,\n \"cycle\":
|
||||
\"The Forgotten Age\"\n}"
|
||||
GUID: 9dc3d4
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,10 +21,10 @@ Description: The Mother's Cunning
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10035\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n
|
||||
\ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item.
|
||||
Relic. Spell.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"maxCount\":
|
||||
2,\n \"id\": \"10036\"\n }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\":
|
||||
1,\n \"uses\": [\n {\n \"type\": \"Charge\",\n \"token\": \"resource\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
Relic. Spell.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"10036\"\n
|
||||
\ }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n
|
||||
\ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\":
|
||||
\"The Feast of Hemlock Vale\"\n}"
|
||||
GUID: e7bfbe
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,8 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10082\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
|
||||
\ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item.
|
||||
Illicit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n
|
||||
\ \"count\": 0,\n \"type\": \"Suspicion\",\n \"token\": \"resource\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
Illicit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The
|
||||
Feast of Hemlock Vale\"\n}"
|
||||
GUID: 7ebb67
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,7 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10066\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n
|
||||
\ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item.
|
||||
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}"
|
||||
Illicit.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
GUID: acd38d
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -1,248 +0,0 @@
|
||||
-- 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")
|
@ -30,7 +30,7 @@ HideWhenFaceDown: true
|
||||
IgnoreFoW: false
|
||||
LayoutGroupSortIndex: 0
|
||||
Locked: false
|
||||
LuaScript: !include 'Card False Covenant (2) 3442f5.ttslua'
|
||||
LuaScript: ''
|
||||
LuaScriptState: ''
|
||||
MeasureMovement: false
|
||||
Name: Card
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,39 +0,0 @@
|
||||
<!-- 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 -->
|
@ -54,4 +54,4 @@ Transform:
|
||||
scaleY: 1
|
||||
scaleZ: 1
|
||||
Value: 0
|
||||
XmlUI: !include 'Card Family Inheritance 394603.xml'
|
||||
XmlUI: ''
|
||||
|
@ -22,13 +22,12 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"04004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n
|
||||
\ \"traits\": \"Believer. Warden.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
|
||||
3,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Forgotten
|
||||
Age\",\n \"extraToken\": \"None\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"04013\":
|
||||
1\n },\n {\n \"04014\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n
|
||||
\ \"trait\": [\n \"blessed\"\n ],\n \"level\": {\n \"min\":
|
||||
0,\n \"max\": 3\n }\n }\n ]\n}"
|
||||
Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"04013\": 1\n },\n {\n \"04014\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n },\n {\n \"trait\": [\n \"blessed\"\n ],\n \"level\":
|
||||
{\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}"
|
||||
GUID: eb96e6
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -20,7 +20,8 @@ CustomDeck:
|
||||
Description: Advanced
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90051\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
|
||||
\ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"Laid to Rest\"\n}"
|
||||
\ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich
|
||||
Legacy\"\n}"
|
||||
GUID: '561775'
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,7 +22,7 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"04003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n
|
||||
\ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n
|
||||
\ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\",\n
|
||||
\ \"extraToken\": \"Evade\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"04010\": 1\n },\n {\n \"04011\":
|
||||
1\n },\n {\n \"04012\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"trait\": [\n \"illicit\"\n ],\n \"level\": {\n
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -21,9 +21,8 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10005\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"traits\": \"Item. Tool. Science.\",\n \"bonded\":
|
||||
[\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"10006\"\n
|
||||
\ },\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"10007\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
[\n {\n \"count\": 1,\n \"id\": \"10006\"\n },\n {\n \"count\":
|
||||
1,\n \"id\": \"10007\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}"
|
||||
GUID: 55990a
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -20,9 +20,7 @@ CustomDeck:
|
||||
Description: Weakness.
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"08646\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\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}"
|
||||
\ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}"
|
||||
GUID: 8abd77
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,8 +21,7 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"60121\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n
|
||||
\ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\":
|
||||
2,\n \"uses\": [\n {\n \"count\": 1,\n \"type\": \"Fight\",\n \"token\":
|
||||
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"Investigator Packs\"\n}"
|
||||
2,\n \"cycle\": \"Investigator Packs\"\n}"
|
||||
GUID: 9e7f6a
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,9 @@ Description: Worlds within Worlds
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"06013\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n
|
||||
\ \"startsInPlay\": true,\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"bonded\":
|
||||
[\n {\n \"count\": 1,\n \"maxCount\": 1,\n \"id\": \"06015a\"\n
|
||||
\ }\n ],\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n
|
||||
\ \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
[\n {\n \"count\": 1,\n \"id\": \"06015a\"\n }\n ],\n \"uses\":
|
||||
[\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n
|
||||
\ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}"
|
||||
GUID: b8c891
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,7 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"09053\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n
|
||||
\ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"willpowerIcons\":
|
||||
1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 1,\n \"type\":
|
||||
\"Universal\",\n \"token\": \"universalActionAbility\"\n }\n ],\n \"cycle\":
|
||||
\"The Scarlet Keys\"\n}"
|
||||
1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}"
|
||||
GUID: '425841'
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,8 +21,7 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"03265\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n
|
||||
\ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n
|
||||
\ \"uses\": [\n {\n \"count\": 1,\n \"type\": \"Universal\",\n \"token\":
|
||||
\"universalActionAbility\"\n }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}"
|
||||
\ \"cycle\": \"The Path to Carcosa\"\n}"
|
||||
GUID: bbfe9b
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,9 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"54002\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
|
||||
\ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item.
|
||||
Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"maxCount\":
|
||||
3,\n \"id\": \"05314\"\n }\n ],\n \"willpowerIcons\": 2,\n \"cycle\":
|
||||
\"Return to the Circle Undone\"\n}"
|
||||
Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\":
|
||||
\"05314\"\n }\n ],\n \"willpowerIcons\": 2,\n \"cycle\": \"Return to the Circle
|
||||
Undone\"\n}"
|
||||
GUID: 78858f
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,9 +21,8 @@ Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"05313\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n
|
||||
\ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.
|
||||
Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"maxCount\":
|
||||
3,\n \"id\": \"05314\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\":
|
||||
\"The Circle Undone\"\n}"
|
||||
Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\":
|
||||
\"05314\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}"
|
||||
GUID: 312d38
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -21,13 +21,12 @@ Description: The Farmhand
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"10015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n
|
||||
\ \"traits\": \"Assistant. Warden.\",\n \"bonded\": [\n {\n \"count\":
|
||||
1,\n \"maxCount\": 1,\n \"id\": \"10015-b1\"\n },\n {\n \"count\":
|
||||
1,\n \"maxCount\": 1,\n \"id\": \"10015-b2\"\n }\n ],\n \"willpowerIcons\":
|
||||
3,\n \"intellectIcons\": 1,\n \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\":
|
||||
\"The Feast of Hemlock Vale\",\n \"extraToken\": \"None\",\n \"deck_requirements\":
|
||||
{\n \"size\": 35,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\":
|
||||
[\n {\n \"10017\": 1\n },\n {\n \"10018\": 1\n }\n
|
||||
\ ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
|
||||
1,\n \"id\": \"10015-b1\"\n },\n {\n \"count\": 1,\n \"id\":
|
||||
\"10015-b2\"\n }\n ],\n \"willpowerIcons\": 3,\n \"intellectIcons\": 1,\n
|
||||
\ \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\": \"The Feast of Hemlock
|
||||
Vale\",\n \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\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\":
|
||||
5\n }\n },\n {\n \"trait\": [\n \"insight\",\n \"spirit\"\n
|
||||
\ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n },\n
|
||||
|
@ -20,8 +20,8 @@ CustomDeck:
|
||||
Description: ''
|
||||
DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"90048\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n
|
||||
\ \"traits\": \"Hardship.\",\n \"weakness\": true,\n \"cycle\": \"On the Road
|
||||
Again\"\n}"
|
||||
\ \"traits\": \"Hardship.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich
|
||||
Legacy\"\n}"
|
||||
GUID: '876557'
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -22,11 +22,11 @@ DragSelectable: true
|
||||
GMNotes: "{\n \"id\": \"60201\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n
|
||||
\ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\":
|
||||
5,\n \"combatIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\",\n
|
||||
\ \"extraToken\": \"Reaction\",\n \"deck_requirements\": {\n \"size\": 30,\n
|
||||
\ \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"60202\":
|
||||
1\n },\n {\n \"60203\": 1\n }\n ]\n },\n \"deck_options\":
|
||||
[\n {\n \"faction\": [\n \"seeker\",\n \"neutral\"\n ],\n
|
||||
\ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n }\n ]\n}"
|
||||
\ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\":
|
||||
1,\n \"signatures\": [\n {\n \"60202\": 1\n },\n {\n \"60203\":
|
||||
1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n
|
||||
\ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\":
|
||||
5\n }\n }\n ]\n}"
|
||||
GUID: 1fa944
|
||||
Grid: true
|
||||
GridProjection: false
|
||||
|
@ -1,250 +0,0 @@
|
||||
-- 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")
|
@ -30,7 +30,7 @@ HideWhenFaceDown: true
|
||||
IgnoreFoW: false
|
||||
LayoutGroupSortIndex: 0
|
||||
Locked: false
|
||||
LuaScript: !include 'Card Heavy Furs 275450.ttslua'
|
||||
LuaScript: ''
|
||||
LuaScriptState: ''
|
||||
MeasureMovement: false
|
||||
Name: Card
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user