diff --git a/Backups/worlds/the-fall-of-plaguestone/world.the-fall-of-plaguestone.2023-11-12.1699769997716.bak b/Backups/worlds/the-fall-of-plaguestone/world.the-fall-of-plaguestone.2023-11-12.1699769997716.bak new file mode 100644 index 00000000..6a455a0b Binary files /dev/null and b/Backups/worlds/the-fall-of-plaguestone/world.the-fall-of-plaguestone.2023-11-12.1699769997716.bak differ diff --git a/Backups/worlds/the-fall-of-plaguestone/world.the-fall-of-plaguestone.2023-11-12.1699769997716.json b/Backups/worlds/the-fall-of-plaguestone/world.the-fall-of-plaguestone.2023-11-12.1699769997716.json new file mode 100644 index 00000000..890c1281 --- /dev/null +++ b/Backups/worlds/the-fall-of-plaguestone/world.the-fall-of-plaguestone.2023-11-12.1699769997716.json @@ -0,0 +1,25 @@ +{ + "title": "The Fall of Plaguestone", + "id": "world.the-fall-of-plaguestone.2023-11-12.1699769997716", + "system": "pf2e", + "compatibility": { + "minimum": "11", + "verified": "11.313" + }, + "description": "

A group of new adventurers traveling through the village of Etran's Folly—also known as Plaguestone—must come together to solve the murder of a friend. What starts as a simple investigation quickly turns sinister with the discovery of forbidden alchemy, mutant animals, and a nearby forest rotting away due to a mysterious blight. It becomes clear that if these heroes don't intervene to stop whatever evil is brewing, the fall of Plaguestone is all but certain!

The Fall of Plaguestone is the first standalone adventure for Pathfinder Second Edition, designed for 1st-level characters. It tells the story of how a group of strangers band together to form a group of adventurers while saving the town of Etran's Folly from a terrifying fate, serving as a perfect introduction to a new Pathfinder campaign!

", + "relationships": { + "requires": [], + "systems": [], + "recommends": [], + "conflicts": [], + "flags": {} + }, + "version": "0", + "size": 4983298, + "note": "", + "snapshotId": null, + "originalSize": 8061614, + "createdAt": 1699769997716, + "packageId": "the-fall-of-plaguestone", + "type": "world" +} \ No newline at end of file diff --git a/Data/modules/automated-evocations/packs/macros/000471.log b/Data/modules/automated-evocations/packs/macros/000475.log similarity index 100% rename from Data/modules/automated-evocations/packs/macros/000471.log rename to Data/modules/automated-evocations/packs/macros/000475.log diff --git a/Data/modules/automated-evocations/packs/macros/CURRENT b/Data/modules/automated-evocations/packs/macros/CURRENT index 65eef602..5e8bf268 100644 --- a/Data/modules/automated-evocations/packs/macros/CURRENT +++ b/Data/modules/automated-evocations/packs/macros/CURRENT @@ -1 +1 @@ -MANIFEST-000470 +MANIFEST-000474 diff --git a/Data/modules/automated-evocations/packs/macros/LOG b/Data/modules/automated-evocations/packs/macros/LOG index 4429a5d7..f93ba7da 100644 --- a/Data/modules/automated-evocations/packs/macros/LOG +++ b/Data/modules/automated-evocations/packs/macros/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.627717 ffff877ef0a0 Recovering log #468 -2023/10/23-05:12:18.636023 ffff877ef0a0 Delete type=0 #468 -2023/10/23-05:12:18.636044 ffff877ef0a0 Delete type=3 #466 +2023/11/12-06:20:01.526054 ffff7bfff0a0 Recovering log #472 +2023/11/12-06:20:01.535681 ffff7bfff0a0 Delete type=0 #472 +2023/11/12-06:20:01.535701 ffff7bfff0a0 Delete type=3 #470 diff --git a/Data/modules/automated-evocations/packs/macros/LOG.old b/Data/modules/automated-evocations/packs/macros/LOG.old index 21c4dec3..0b73c724 100644 --- a/Data/modules/automated-evocations/packs/macros/LOG.old +++ b/Data/modules/automated-evocations/packs/macros/LOG.old @@ -1,8 +1,8 @@ -2023/10/20-07:55:11.017296 ffff87fff0a0 Recovering log #464 -2023/10/20-07:55:11.021890 ffff87fff0a0 Delete type=0 #464 -2023/10/20-07:55:11.021910 ffff87fff0a0 Delete type=3 #462 -2023/10/23-05:11:51.655803 ffff85fbf0a0 Level-0 table #469: started -2023/10/23-05:11:51.655819 ffff85fbf0a0 Level-0 table #469: 0 bytes OK -2023/10/23-05:11:51.657559 ffff85fbf0a0 Delete type=0 #467 -2023/10/23-05:11:51.659781 ffff85fbf0a0 Manual compaction at level-0 from '!macros!DFIqi3kVXrYZ8S7y' @ 72057594037927935 : 1 .. '!macros!z5CFHKH4XzXITTGU' @ 0 : 0; will stop at (end) -2023/10/23-05:11:51.663827 ffff85fbf0a0 Manual compaction at level-1 from '!macros!DFIqi3kVXrYZ8S7y' @ 72057594037927935 : 1 .. '!macros!z5CFHKH4XzXITTGU' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.627717 ffff877ef0a0 Recovering log #468 +2023/10/23-05:12:18.636023 ffff877ef0a0 Delete type=0 #468 +2023/10/23-05:12:18.636044 ffff877ef0a0 Delete type=3 #466 +2023/11/12-06:17:24.202543 ffff85fbf0a0 Level-0 table #473: started +2023/11/12-06:17:24.202562 ffff85fbf0a0 Level-0 table #473: 0 bytes OK +2023/11/12-06:17:24.204580 ffff85fbf0a0 Delete type=0 #471 +2023/11/12-06:17:24.204972 ffff85fbf0a0 Manual compaction at level-0 from '!macros!DFIqi3kVXrYZ8S7y' @ 72057594037927935 : 1 .. '!macros!z5CFHKH4XzXITTGU' @ 0 : 0; will stop at (end) +2023/11/12-06:17:24.210711 ffff85fbf0a0 Manual compaction at level-1 from '!macros!DFIqi3kVXrYZ8S7y' @ 72057594037927935 : 1 .. '!macros!z5CFHKH4XzXITTGU' @ 0 : 0; will stop at (end) diff --git a/Data/modules/automated-evocations/packs/macros/MANIFEST-000470 b/Data/modules/automated-evocations/packs/macros/MANIFEST-000474 similarity index 65% rename from Data/modules/automated-evocations/packs/macros/MANIFEST-000470 rename to Data/modules/automated-evocations/packs/macros/MANIFEST-000474 index 1820adef..762a26b1 100644 Binary files a/Data/modules/automated-evocations/packs/macros/MANIFEST-000470 and b/Data/modules/automated-evocations/packs/macros/MANIFEST-000474 differ diff --git a/Data/modules/bossbar/packs/macros/000027.log b/Data/modules/bossbar/packs/macros/000031.log similarity index 100% rename from Data/modules/bossbar/packs/macros/000027.log rename to Data/modules/bossbar/packs/macros/000031.log diff --git a/Data/modules/bossbar/packs/macros/CURRENT b/Data/modules/bossbar/packs/macros/CURRENT index 8b152150..caa721af 100644 --- a/Data/modules/bossbar/packs/macros/CURRENT +++ b/Data/modules/bossbar/packs/macros/CURRENT @@ -1 +1 @@ -MANIFEST-000026 +MANIFEST-000030 diff --git a/Data/modules/bossbar/packs/macros/LOG b/Data/modules/bossbar/packs/macros/LOG index 5a52530a..f1168d03 100644 --- a/Data/modules/bossbar/packs/macros/LOG +++ b/Data/modules/bossbar/packs/macros/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.637198 ffff87fff0a0 Recovering log #24 -2023/10/23-05:12:18.642198 ffff87fff0a0 Delete type=3 #22 -2023/10/23-05:12:18.642221 ffff87fff0a0 Delete type=0 #24 +2023/11/12-06:20:01.536946 ffff89aae0a0 Recovering log #28 +2023/11/12-06:20:01.542063 ffff89aae0a0 Delete type=0 #28 +2023/11/12-06:20:01.542084 ffff89aae0a0 Delete type=3 #26 diff --git a/Data/modules/bossbar/packs/macros/LOG.old b/Data/modules/bossbar/packs/macros/LOG.old index 8f8b4709..c9247220 100644 --- a/Data/modules/bossbar/packs/macros/LOG.old +++ b/Data/modules/bossbar/packs/macros/LOG.old @@ -1,8 +1,8 @@ -2023/10/20-07:55:11.023015 ffff86fdf0a0 Recovering log #20 -2023/10/20-07:55:11.027896 ffff86fdf0a0 Delete type=0 #20 -2023/10/20-07:55:11.027916 ffff86fdf0a0 Delete type=3 #18 -2023/10/23-05:11:51.657720 ffff85fbf0a0 Level-0 table #25: started -2023/10/23-05:11:51.657744 ffff85fbf0a0 Level-0 table #25: 0 bytes OK -2023/10/23-05:11:51.659570 ffff85fbf0a0 Delete type=0 #23 -2023/10/23-05:11:51.661826 ffff85fbf0a0 Manual compaction at level-0 from '!macros!LD5Wc6K0vLQw0att' @ 72057594037927935 : 1 .. '!macros!iWwnlmoMWqNGJ54U' @ 0 : 0; will stop at (end) -2023/10/23-05:11:51.663971 ffff85fbf0a0 Manual compaction at level-1 from '!macros!LD5Wc6K0vLQw0att' @ 72057594037927935 : 1 .. '!macros!iWwnlmoMWqNGJ54U' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.637198 ffff87fff0a0 Recovering log #24 +2023/10/23-05:12:18.642198 ffff87fff0a0 Delete type=3 #22 +2023/10/23-05:12:18.642221 ffff87fff0a0 Delete type=0 #24 +2023/11/12-06:17:24.204988 ffff85fbf0a0 Level-0 table #29: started +2023/11/12-06:17:24.205003 ffff85fbf0a0 Level-0 table #29: 0 bytes OK +2023/11/12-06:17:24.207034 ffff85fbf0a0 Delete type=0 #27 +2023/11/12-06:17:24.210831 ffff85fbf0a0 Manual compaction at level-0 from '!macros!LD5Wc6K0vLQw0att' @ 72057594037927935 : 1 .. '!macros!iWwnlmoMWqNGJ54U' @ 0 : 0; will stop at (end) +2023/11/12-06:17:24.212705 ffff85fbf0a0 Manual compaction at level-1 from '!macros!LD5Wc6K0vLQw0att' @ 72057594037927935 : 1 .. '!macros!iWwnlmoMWqNGJ54U' @ 0 : 0; will stop at (end) diff --git a/Data/modules/bossbar/packs/macros/MANIFEST-000026 b/Data/modules/bossbar/packs/macros/MANIFEST-000030 similarity index 52% rename from Data/modules/bossbar/packs/macros/MANIFEST-000026 rename to Data/modules/bossbar/packs/macros/MANIFEST-000030 index 2603c9a7..383a0505 100644 Binary files a/Data/modules/bossbar/packs/macros/MANIFEST-000026 and b/Data/modules/bossbar/packs/macros/MANIFEST-000030 differ diff --git a/Data/modules/levels/packs/levels-samples/000969.log b/Data/modules/levels/packs/levels-samples/000973.log similarity index 100% rename from Data/modules/levels/packs/levels-samples/000969.log rename to Data/modules/levels/packs/levels-samples/000973.log diff --git a/Data/modules/levels/packs/levels-samples/CURRENT b/Data/modules/levels/packs/levels-samples/CURRENT index 0a8f1fe1..e74ce687 100644 --- a/Data/modules/levels/packs/levels-samples/CURRENT +++ b/Data/modules/levels/packs/levels-samples/CURRENT @@ -1 +1 @@ -MANIFEST-000968 +MANIFEST-000972 diff --git a/Data/modules/levels/packs/levels-samples/LOG b/Data/modules/levels/packs/levels-samples/LOG index 645255a4..318439df 100644 --- a/Data/modules/levels/packs/levels-samples/LOG +++ b/Data/modules/levels/packs/levels-samples/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.649746 ffff87fff0a0 Recovering log #966 -2023/10/23-05:12:18.655169 ffff87fff0a0 Delete type=0 #966 -2023/10/23-05:12:18.655188 ffff87fff0a0 Delete type=3 #964 +2023/11/12-06:20:01.550077 ffff89aae0a0 Recovering log #970 +2023/11/12-06:20:01.555194 ffff89aae0a0 Delete type=3 #968 +2023/11/12-06:20:01.555216 ffff89aae0a0 Delete type=0 #970 diff --git a/Data/modules/levels/packs/levels-samples/LOG.old b/Data/modules/levels/packs/levels-samples/LOG.old index 9b5cf9c4..66761523 100644 --- a/Data/modules/levels/packs/levels-samples/LOG.old +++ b/Data/modules/levels/packs/levels-samples/LOG.old @@ -1,8 +1,8 @@ -2023/10/20-07:55:11.035627 ffff86fdf0a0 Recovering log #962 -2023/10/20-07:55:11.040517 ffff86fdf0a0 Delete type=3 #960 -2023/10/20-07:55:11.040539 ffff86fdf0a0 Delete type=0 #962 -2023/10/23-05:11:51.661839 ffff85fbf0a0 Level-0 table #967: started -2023/10/23-05:11:51.661852 ffff85fbf0a0 Level-0 table #967: 0 bytes OK -2023/10/23-05:11:51.663788 ffff85fbf0a0 Delete type=0 #965 -2023/10/23-05:11:51.664057 ffff85fbf0a0 Manual compaction at level-0 from '!scenes!fT64AORvwMUdHzwr' @ 72057594037927935 : 1 .. '!scenes.walls!w5eztsez7EhiFrmE.zlashxFbpTyjyOHo' @ 0 : 0; will stop at (end) -2023/10/23-05:11:51.668488 ffff85fbf0a0 Manual compaction at level-1 from '!scenes!fT64AORvwMUdHzwr' @ 72057594037927935 : 1 .. '!scenes.walls!w5eztsez7EhiFrmE.zlashxFbpTyjyOHo' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.649746 ffff87fff0a0 Recovering log #966 +2023/10/23-05:12:18.655169 ffff87fff0a0 Delete type=0 #966 +2023/10/23-05:12:18.655188 ffff87fff0a0 Delete type=3 #964 +2023/11/12-06:17:24.208927 ffff85fbf0a0 Level-0 table #971: started +2023/11/12-06:17:24.208941 ffff85fbf0a0 Level-0 table #971: 0 bytes OK +2023/11/12-06:17:24.210672 ffff85fbf0a0 Delete type=0 #969 +2023/11/12-06:17:24.210861 ffff85fbf0a0 Manual compaction at level-0 from '!scenes!fT64AORvwMUdHzwr' @ 72057594037927935 : 1 .. '!scenes.walls!w5eztsez7EhiFrmE.zlashxFbpTyjyOHo' @ 0 : 0; will stop at (end) +2023/11/12-06:17:24.212957 ffff85fbf0a0 Manual compaction at level-1 from '!scenes!fT64AORvwMUdHzwr' @ 72057594037927935 : 1 .. '!scenes.walls!w5eztsez7EhiFrmE.zlashxFbpTyjyOHo' @ 0 : 0; will stop at (end) diff --git a/Data/modules/levels/packs/levels-samples/MANIFEST-000968 b/Data/modules/levels/packs/levels-samples/MANIFEST-000972 similarity index 86% rename from Data/modules/levels/packs/levels-samples/MANIFEST-000968 rename to Data/modules/levels/packs/levels-samples/MANIFEST-000972 index 524e9c49..127158b7 100644 Binary files a/Data/modules/levels/packs/levels-samples/MANIFEST-000968 and b/Data/modules/levels/packs/levels-samples/MANIFEST-000972 differ diff --git a/Data/modules/levels/packs/macros/000969.log b/Data/modules/levels/packs/macros/000973.log similarity index 100% rename from Data/modules/levels/packs/macros/000969.log rename to Data/modules/levels/packs/macros/000973.log diff --git a/Data/modules/levels/packs/macros/CURRENT b/Data/modules/levels/packs/macros/CURRENT index 0a8f1fe1..e74ce687 100644 --- a/Data/modules/levels/packs/macros/CURRENT +++ b/Data/modules/levels/packs/macros/CURRENT @@ -1 +1 @@ -MANIFEST-000968 +MANIFEST-000972 diff --git a/Data/modules/levels/packs/macros/LOG b/Data/modules/levels/packs/macros/LOG index a2721805..040e55ef 100644 --- a/Data/modules/levels/packs/macros/LOG +++ b/Data/modules/levels/packs/macros/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.643342 ffff877ef0a0 Recovering log #966 -2023/10/23-05:12:18.648199 ffff877ef0a0 Delete type=0 #966 -2023/10/23-05:12:18.648219 ffff877ef0a0 Delete type=3 #964 +2023/11/12-06:20:01.543301 ffff7bfff0a0 Recovering log #970 +2023/11/12-06:20:01.548324 ffff7bfff0a0 Delete type=3 #968 +2023/11/12-06:20:01.548347 ffff7bfff0a0 Delete type=0 #970 diff --git a/Data/modules/levels/packs/macros/LOG.old b/Data/modules/levels/packs/macros/LOG.old index 1badc184..63c4dd0a 100644 --- a/Data/modules/levels/packs/macros/LOG.old +++ b/Data/modules/levels/packs/macros/LOG.old @@ -1,8 +1,8 @@ -2023/10/20-07:55:11.029068 ffff87fff0a0 Recovering log #962 -2023/10/20-07:55:11.034068 ffff87fff0a0 Delete type=3 #960 -2023/10/20-07:55:11.034090 ffff87fff0a0 Delete type=0 #962 -2023/10/23-05:11:51.659810 ffff85fbf0a0 Level-0 table #967: started -2023/10/23-05:11:51.659829 ffff85fbf0a0 Level-0 table #967: 0 bytes OK -2023/10/23-05:11:51.661788 ffff85fbf0a0 Delete type=0 #965 -2023/10/23-05:11:51.663952 ffff85fbf0a0 Manual compaction at level-0 from '!macros!2LfY4Ky5rRDkK7h8' @ 72057594037927935 : 1 .. '!macros!yx7Eb76rfzjh0LEO' @ 0 : 0; will stop at (end) -2023/10/23-05:11:51.666374 ffff85fbf0a0 Manual compaction at level-1 from '!macros!2LfY4Ky5rRDkK7h8' @ 72057594037927935 : 1 .. '!macros!yx7Eb76rfzjh0LEO' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.643342 ffff877ef0a0 Recovering log #966 +2023/10/23-05:12:18.648199 ffff877ef0a0 Delete type=0 #966 +2023/10/23-05:12:18.648219 ffff877ef0a0 Delete type=3 #964 +2023/11/12-06:17:24.207072 ffff85fbf0a0 Level-0 table #971: started +2023/11/12-06:17:24.207088 ffff85fbf0a0 Level-0 table #971: 0 bytes OK +2023/11/12-06:17:24.208890 ffff85fbf0a0 Delete type=0 #969 +2023/11/12-06:17:24.210850 ffff85fbf0a0 Manual compaction at level-0 from '!macros!2LfY4Ky5rRDkK7h8' @ 72057594037927935 : 1 .. '!macros!yx7Eb76rfzjh0LEO' @ 0 : 0; will stop at (end) +2023/11/12-06:17:24.212865 ffff85fbf0a0 Manual compaction at level-1 from '!macros!2LfY4Ky5rRDkK7h8' @ 72057594037927935 : 1 .. '!macros!yx7Eb76rfzjh0LEO' @ 0 : 0; will stop at (end) diff --git a/Data/modules/levels/packs/macros/MANIFEST-000968 b/Data/modules/levels/packs/macros/MANIFEST-000972 similarity index 52% rename from Data/modules/levels/packs/macros/MANIFEST-000968 rename to Data/modules/levels/packs/macros/MANIFEST-000972 index e76c076a..c00d5204 100644 Binary files a/Data/modules/levels/packs/macros/MANIFEST-000968 and b/Data/modules/levels/packs/macros/MANIFEST-000972 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/000214.log b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/000218.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/000214.log rename to Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/000218.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/CURRENT index 51af8957..9aabe0cd 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/CURRENT @@ -1 +1 @@ -MANIFEST-000213 +MANIFEST-000217 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG index 48828e96..82f2d269 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.677757 ffff86fdf0a0 Recovering log #211 -2023/10/23-05:12:18.683119 ffff86fdf0a0 Delete type=0 #211 -2023/10/23-05:12:18.683139 ffff86fdf0a0 Delete type=3 #209 +2023/11/12-06:20:01.573535 ffff8929e0a0 Recovering log #215 +2023/11/12-06:20:01.578643 ffff8929e0a0 Delete type=0 #215 +2023/11/12-06:20:01.578662 ffff8929e0a0 Delete type=3 #213 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG.old index 3de6cdcb..93abf418 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.058378 ffff877ef0a0 Recovering log #207 -2023/10/20-07:55:11.063161 ffff877ef0a0 Delete type=3 #205 -2023/10/20-07:55:11.063184 ffff877ef0a0 Delete type=0 #207 -2023/10/23-05:11:51.668688 ffff85fbf0a0 Level-0 table #212: started -2023/10/23-05:11:51.668707 ffff85fbf0a0 Level-0 table #212: 0 bytes OK -2023/10/23-05:11:51.670818 ffff85fbf0a0 Delete type=0 #210 -2023/10/23-05:11:51.674988 ffff85fbf0a0 Manual compaction at level-0 from '!items!0WtqP7Wei3AxHh5M' @ 72057594037927935 : 1 .. '!items!zSlsnbvsGKdCTzL1' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.677757 ffff86fdf0a0 Recovering log #211 +2023/10/23-05:12:18.683119 ffff86fdf0a0 Delete type=0 #211 +2023/10/23-05:12:18.683139 ffff86fdf0a0 Delete type=3 #209 +2023/11/12-06:17:24.215191 ffff85fbf0a0 Level-0 table #216: started +2023/11/12-06:17:24.215205 ffff85fbf0a0 Level-0 table #216: 0 bytes OK +2023/11/12-06:17:24.216990 ffff85fbf0a0 Delete type=0 #214 +2023/11/12-06:17:24.221108 ffff85fbf0a0 Manual compaction at level-0 from '!items!0WtqP7Wei3AxHh5M' @ 72057594037927935 : 1 .. '!items!zSlsnbvsGKdCTzL1' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/MANIFEST-000213 b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/MANIFEST-000217 similarity index 81% rename from Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/MANIFEST-000213 rename to Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/MANIFEST-000217 index 3c19d66e..36445ce9 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/MANIFEST-000213 and b/Data/modules/pf2e-animal-companions/packs/ac-advanced-maneuvers/MANIFEST-000217 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/000216.log b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/000220.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/000216.log rename to Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/000220.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/CURRENT index 68076bd4..7d68d999 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/CURRENT @@ -1 +1 @@ -MANIFEST-000215 +MANIFEST-000219 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG index 5bb22ad5..c85446a2 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.659451 ffff86fdf0a0 Recovering log #213 -2023/10/23-05:12:18.664573 ffff86fdf0a0 Delete type=0 #213 -2023/10/23-05:12:18.664592 ffff86fdf0a0 Delete type=3 #211 +2023/11/12-06:20:01.559668 ffff8929e0a0 Recovering log #217 +2023/11/12-06:20:01.564637 ffff8929e0a0 Delete type=3 #215 +2023/11/12-06:20:01.564660 ffff8929e0a0 Delete type=0 #217 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG.old index 9448c909..69875e72 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.044977 ffff877ef0a0 Recovering log #209 -2023/10/20-07:55:11.049730 ffff877ef0a0 Delete type=3 #207 -2023/10/20-07:55:11.049753 ffff877ef0a0 Delete type=0 #209 -2023/10/23-05:11:51.664073 ffff85fbf0a0 Level-0 table #214: started -2023/10/23-05:11:51.664088 ffff85fbf0a0 Level-0 table #214: 0 bytes OK -2023/10/23-05:11:51.666336 ffff85fbf0a0 Delete type=0 #212 -2023/10/23-05:11:51.668601 ffff85fbf0a0 Manual compaction at level-0 from '!items!0BVoHy7R86KJoani' @ 72057594037927935 : 1 .. '!items!yukG72FSivsrqVoG' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.659451 ffff86fdf0a0 Recovering log #213 +2023/10/23-05:12:18.664573 ffff86fdf0a0 Delete type=0 #213 +2023/10/23-05:12:18.664592 ffff86fdf0a0 Delete type=3 #211 +2023/11/12-06:17:24.210871 ffff85fbf0a0 Level-0 table #218: started +2023/11/12-06:17:24.210886 ffff85fbf0a0 Level-0 table #218: 0 bytes OK +2023/11/12-06:17:24.212666 ffff85fbf0a0 Delete type=0 #216 +2023/11/12-06:17:24.213041 ffff85fbf0a0 Manual compaction at level-0 from '!items!0BVoHy7R86KJoani' @ 72057594037927935 : 1 .. '!items!yukG72FSivsrqVoG' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/MANIFEST-000215 b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/MANIFEST-000219 similarity index 81% rename from Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/MANIFEST-000215 rename to Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/MANIFEST-000219 index d80692d4..80f152cd 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/MANIFEST-000215 and b/Data/modules/pf2e-animal-companions/packs/ac-ancestries-and-class/MANIFEST-000219 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/000211.log b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/000215.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/000211.log rename to Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/000215.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/CURRENT index af31d429..f0a2cf15 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/CURRENT @@ -1 +1 @@ -MANIFEST-000210 +MANIFEST-000214 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG index e89b3b34..286be366 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.712482 ffff867cf0a0 Recovering log #208 -2023/10/23-05:12:18.717589 ffff867cf0a0 Delete type=3 #206 -2023/10/23-05:12:18.717613 ffff867cf0a0 Delete type=0 #208 +2023/11/12-06:20:01.607938 ffff88a8e0a0 Recovering log #212 +2023/11/12-06:20:01.613044 ffff88a8e0a0 Delete type=3 #210 +2023/11/12-06:20:01.613067 ffff88a8e0a0 Delete type=0 #212 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG.old index 97509209..c5faa4bd 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.097635 ffff867cf0a0 Recovering log #204 -2023/10/20-07:55:11.102669 ffff867cf0a0 Delete type=0 #204 -2023/10/20-07:55:11.102689 ffff867cf0a0 Delete type=3 #202 -2023/10/23-05:11:51.679758 ffff85fbf0a0 Level-0 table #209: started -2023/10/23-05:11:51.679779 ffff85fbf0a0 Level-0 table #209: 0 bytes OK -2023/10/23-05:11:51.681727 ffff85fbf0a0 Delete type=0 #207 -2023/10/23-05:11:51.685639 ffff85fbf0a0 Manual compaction at level-0 from '!items!1mE83uSucJZS4FB9' @ 72057594037927935 : 1 .. '!items!zo6B3JGQIt99K1HF' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.712482 ffff867cf0a0 Recovering log #208 +2023/10/23-05:12:18.717589 ffff867cf0a0 Delete type=3 #206 +2023/10/23-05:12:18.717613 ffff867cf0a0 Delete type=0 #208 +2023/11/12-06:17:24.225524 ffff85fbf0a0 Level-0 table #213: started +2023/11/12-06:17:24.225538 ffff85fbf0a0 Level-0 table #213: 0 bytes OK +2023/11/12-06:17:24.227479 ffff85fbf0a0 Delete type=0 #211 +2023/11/12-06:17:24.229813 ffff85fbf0a0 Manual compaction at level-0 from '!items!1mE83uSucJZS4FB9' @ 72057594037927935 : 1 .. '!items!zo6B3JGQIt99K1HF' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/MANIFEST-000210 b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/MANIFEST-000214 similarity index 82% rename from Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/MANIFEST-000210 rename to Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/MANIFEST-000214 index db1889df..4fd2f752 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/MANIFEST-000210 and b/Data/modules/pf2e-animal-companions/packs/ac-construct-breakthroughs/MANIFEST-000214 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/000211.log b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/000215.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-construct-companions/000211.log rename to Data/modules/pf2e-animal-companions/packs/ac-construct-companions/000215.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/CURRENT index af31d429..f0a2cf15 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/CURRENT @@ -1 +1 @@ -MANIFEST-000210 +MANIFEST-000214 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG index 65d7d230..67a7d118 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.705730 ffff86fdf0a0 Recovering log #208 -2023/10/23-05:12:18.710937 ffff86fdf0a0 Delete type=3 #206 -2023/10/23-05:12:18.710959 ffff86fdf0a0 Delete type=0 #208 +2023/11/12-06:20:01.601406 ffff8929e0a0 Recovering log #212 +2023/11/12-06:20:01.606257 ffff8929e0a0 Delete type=3 #210 +2023/11/12-06:20:01.606279 ffff8929e0a0 Delete type=0 #212 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG.old index bcc2ad14..d59cedb9 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.085765 ffff877ef0a0 Recovering log #204 -2023/10/20-07:55:11.090514 ffff877ef0a0 Delete type=0 #204 -2023/10/20-07:55:11.090534 ffff877ef0a0 Delete type=3 #202 -2023/10/23-05:11:51.677476 ffff85fbf0a0 Level-0 table #209: started -2023/10/23-05:11:51.677494 ffff85fbf0a0 Level-0 table #209: 0 bytes OK -2023/10/23-05:11:51.679602 ffff85fbf0a0 Delete type=0 #207 -2023/10/23-05:11:51.683581 ffff85fbf0a0 Manual compaction at level-0 from '!items!5v2Kj6Jh2YYGaSQq' @ 72057594037927935 : 1 .. '!items!mjDtydpNNfI9SuFq' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.705730 ffff86fdf0a0 Recovering log #208 +2023/10/23-05:12:18.710937 ffff86fdf0a0 Delete type=3 #206 +2023/10/23-05:12:18.710959 ffff86fdf0a0 Delete type=0 #208 +2023/11/12-06:17:24.223518 ffff85fbf0a0 Level-0 table #213: started +2023/11/12-06:17:24.223532 ffff85fbf0a0 Level-0 table #213: 0 bytes OK +2023/11/12-06:17:24.225487 ffff85fbf0a0 Delete type=0 #211 +2023/11/12-06:17:24.229725 ffff85fbf0a0 Manual compaction at level-0 from '!items!5v2Kj6Jh2YYGaSQq' @ 72057594037927935 : 1 .. '!items!mjDtydpNNfI9SuFq' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/MANIFEST-000210 b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/MANIFEST-000214 similarity index 82% rename from Data/modules/pf2e-animal-companions/packs/ac-construct-companions/MANIFEST-000210 rename to Data/modules/pf2e-animal-companions/packs/ac-construct-companions/MANIFEST-000214 index baca917a..c1300305 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/MANIFEST-000210 and b/Data/modules/pf2e-animal-companions/packs/ac-construct-companions/MANIFEST-000214 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/000213.log b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/000217.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-eidolons/000213.log rename to Data/modules/pf2e-animal-companions/packs/ac-eidolons/000217.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/CURRENT index 7d5a51c6..2cccabd9 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/CURRENT @@ -1 +1 @@ -MANIFEST-000212 +MANIFEST-000216 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG index d30f1129..9e099d4d 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.719203 ffff86fdf0a0 Recovering log #210 -2023/10/23-05:12:18.724705 ffff86fdf0a0 Delete type=3 #208 -2023/10/23-05:12:18.724728 ffff86fdf0a0 Delete type=0 #210 +2023/11/12-06:20:01.615125 ffff8929e0a0 Recovering log #214 +2023/11/12-06:20:01.620175 ffff8929e0a0 Delete type=0 #214 +2023/11/12-06:20:01.620195 ffff8929e0a0 Delete type=3 #212 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG.old index c355ff6a..767c0c2c 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.104393 ffff877ef0a0 Recovering log #206 -2023/10/20-07:55:11.109460 ffff877ef0a0 Delete type=3 #204 -2023/10/20-07:55:11.109483 ffff877ef0a0 Delete type=0 #206 -2023/10/23-05:11:51.681764 ffff85fbf0a0 Level-0 table #211: started -2023/10/23-05:11:51.681781 ffff85fbf0a0 Level-0 table #211: 0 bytes OK -2023/10/23-05:11:51.683542 ffff85fbf0a0 Delete type=0 #209 -2023/10/23-05:11:51.685759 ffff85fbf0a0 Manual compaction at level-0 from '!items!1YJoaMhZPvLGvj1J' @ 72057594037927935 : 1 .. '!items!zjIVbS6nGX6BS2UD' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.719203 ffff86fdf0a0 Recovering log #210 +2023/10/23-05:12:18.724705 ffff86fdf0a0 Delete type=3 #208 +2023/10/23-05:12:18.724728 ffff86fdf0a0 Delete type=0 #210 +2023/11/12-06:17:24.227516 ffff85fbf0a0 Level-0 table #215: started +2023/11/12-06:17:24.227532 ffff85fbf0a0 Level-0 table #215: 0 bytes OK +2023/11/12-06:17:24.229568 ffff85fbf0a0 Delete type=0 #213 +2023/11/12-06:17:24.234798 ffff85fbf0a0 Manual compaction at level-0 from '!items!1YJoaMhZPvLGvj1J' @ 72057594037927935 : 1 .. '!items!zjIVbS6nGX6BS2UD' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/MANIFEST-000212 b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/MANIFEST-000216 similarity index 81% rename from Data/modules/pf2e-animal-companions/packs/ac-eidolons/MANIFEST-000212 rename to Data/modules/pf2e-animal-companions/packs/ac-eidolons/MANIFEST-000216 index 27cc6567..7feae61a 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-eidolons/MANIFEST-000212 and b/Data/modules/pf2e-animal-companions/packs/ac-eidolons/MANIFEST-000216 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-features/000216.log b/Data/modules/pf2e-animal-companions/packs/ac-equipment/000216.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-features/000216.log rename to Data/modules/pf2e-animal-companions/packs/ac-equipment/000216.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-equipment/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-equipment/CURRENT index 12fd2820..68076bd4 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-equipment/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000211 +MANIFEST-000215 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG b/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG index c07f8845..6055d10e 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.684964 ffff867cf0a0 Recovering log #209 -2023/10/23-05:12:18.690072 ffff867cf0a0 Delete type=3 #207 -2023/10/23-05:12:18.690096 ffff867cf0a0 Delete type=0 #209 +2023/11/12-06:20:01.580562 ffff88a8e0a0 Recovering log #213 +2023/11/12-06:20:01.585378 ffff88a8e0a0 Delete type=0 #213 +2023/11/12-06:20:01.585397 ffff88a8e0a0 Delete type=3 #211 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG.old index 504de7a1..fe4c0485 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-equipment/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.064982 ffff867cf0a0 Recovering log #205 -2023/10/20-07:55:11.069869 ffff867cf0a0 Delete type=3 #203 -2023/10/20-07:55:11.069892 ffff867cf0a0 Delete type=0 #205 -2023/10/23-05:11:51.670977 ffff85fbf0a0 Level-0 table #210: started -2023/10/23-05:11:51.670998 ffff85fbf0a0 Level-0 table #210: 0 bytes OK -2023/10/23-05:11:51.672983 ffff85fbf0a0 Delete type=0 #208 -2023/10/23-05:11:51.677276 ffff85fbf0a0 Manual compaction at level-0 from '!items!2SeEnERJqaECplam' @ 72057594037927935 : 1 .. '!items!suEEtFqaGpPG2OHt' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.684964 ffff867cf0a0 Recovering log #209 +2023/10/23-05:12:18.690072 ffff867cf0a0 Delete type=3 #207 +2023/10/23-05:12:18.690096 ffff867cf0a0 Delete type=0 #209 +2023/11/12-06:17:24.217027 ffff85fbf0a0 Level-0 table #214: started +2023/11/12-06:17:24.217042 ffff85fbf0a0 Level-0 table #214: 0 bytes OK +2023/11/12-06:17:24.219004 ffff85fbf0a0 Delete type=0 #212 +2023/11/12-06:17:24.221195 ffff85fbf0a0 Manual compaction at level-0 from '!items!2SeEnERJqaECplam' @ 72057594037927935 : 1 .. '!items!suEEtFqaGpPG2OHt' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-equipment/MANIFEST-000211 b/Data/modules/pf2e-animal-companions/packs/ac-equipment/MANIFEST-000215 similarity index 82% rename from Data/modules/pf2e-animal-companions/packs/ac-equipment/MANIFEST-000211 rename to Data/modules/pf2e-animal-companions/packs/ac-equipment/MANIFEST-000215 index 08282a59..534f2638 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-equipment/MANIFEST-000211 and b/Data/modules/pf2e-animal-companions/packs/ac-equipment/MANIFEST-000215 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-equipment/000212.log b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/000215.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-equipment/000212.log rename to Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/000215.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/CURRENT index af31d429..f0a2cf15 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/CURRENT @@ -1 +1 @@ -MANIFEST-000210 +MANIFEST-000214 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG index c7bae8d4..6759df4e 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.726338 ffff867cf0a0 Recovering log #208 -2023/10/23-05:12:18.731969 ffff867cf0a0 Delete type=3 #206 -2023/10/23-05:12:18.731992 ffff867cf0a0 Delete type=0 #208 +2023/11/12-06:20:01.625797 ffff88a8e0a0 Recovering log #212 +2023/11/12-06:20:01.630911 ffff88a8e0a0 Delete type=3 #210 +2023/11/12-06:20:01.630934 ffff88a8e0a0 Delete type=0 #212 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG.old index f230d2c7..20f8ed50 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.111542 ffff867cf0a0 Recovering log #204 -2023/10/20-07:55:11.116717 ffff867cf0a0 Delete type=0 #204 -2023/10/20-07:55:11.116738 ffff867cf0a0 Delete type=3 #202 -2023/10/23-05:11:51.683698 ffff85fbf0a0 Level-0 table #209: started -2023/10/23-05:11:51.683719 ffff85fbf0a0 Level-0 table #209: 0 bytes OK -2023/10/23-05:11:51.685601 ffff85fbf0a0 Delete type=0 #207 -2023/10/23-05:11:51.692996 ffff85fbf0a0 Manual compaction at level-0 from '!items!00eOhkScQi1K5GZk' @ 72057594037927935 : 1 .. '!items!yCSsQaTFINIbr9Gh' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.726338 ffff867cf0a0 Recovering log #208 +2023/10/23-05:12:18.731969 ffff867cf0a0 Delete type=3 #206 +2023/10/23-05:12:18.731992 ffff867cf0a0 Delete type=0 #208 +2023/11/12-06:17:24.237737 ffff85fbf0a0 Level-0 table #213: started +2023/11/12-06:17:24.237768 ffff85fbf0a0 Level-0 table #213: 0 bytes OK +2023/11/12-06:17:24.240332 ffff85fbf0a0 Delete type=0 #211 +2023/11/12-06:17:24.242272 ffff85fbf0a0 Manual compaction at level-0 from '!items!00eOhkScQi1K5GZk' @ 72057594037927935 : 1 .. '!items!yCSsQaTFINIbr9Gh' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/MANIFEST-000210 b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/MANIFEST-000214 similarity index 81% rename from Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/MANIFEST-000210 rename to Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/MANIFEST-000214 index a853ad15..b2b52dc4 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/MANIFEST-000210 and b/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/MANIFEST-000214 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/000211.log b/Data/modules/pf2e-animal-companions/packs/ac-feats/000217.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-evolution-feats/000211.log rename to Data/modules/pf2e-animal-companions/packs/ac-feats/000217.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-feats/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-feats/CURRENT index 7d5a51c6..2cccabd9 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-feats/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-feats/CURRENT @@ -1 +1 @@ -MANIFEST-000212 +MANIFEST-000216 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG b/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG index 2efd5d27..f2b378c4 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.670958 ffff867cf0a0 Recovering log #210 -2023/10/23-05:12:18.676015 ffff867cf0a0 Delete type=3 #208 -2023/10/23-05:12:18.676040 ffff867cf0a0 Delete type=0 #210 +2023/11/12-06:20:01.566783 ffff88a8e0a0 Recovering log #214 +2023/11/12-06:20:01.571721 ffff88a8e0a0 Delete type=0 #214 +2023/11/12-06:20:01.571740 ffff88a8e0a0 Delete type=3 #212 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG.old index dbcd34cb..3a2ea000 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-feats/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.051785 ffff867cf0a0 Recovering log #206 -2023/10/20-07:55:11.056653 ffff867cf0a0 Delete type=3 #204 -2023/10/20-07:55:11.056675 ffff867cf0a0 Delete type=0 #206 -2023/10/23-05:11:51.666493 ffff85fbf0a0 Level-0 table #211: started -2023/10/23-05:11:51.666513 ffff85fbf0a0 Level-0 table #211: 0 bytes OK -2023/10/23-05:11:51.668449 ffff85fbf0a0 Delete type=0 #209 -2023/10/23-05:11:51.670857 ffff85fbf0a0 Manual compaction at level-0 from '!items!4gNZCu2ncgu98A0H' @ 72057594037927935 : 1 .. '!items!wZXL6VgEK88BCF0C' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.670958 ffff867cf0a0 Recovering log #210 +2023/10/23-05:12:18.676015 ffff867cf0a0 Delete type=3 #208 +2023/10/23-05:12:18.676040 ffff867cf0a0 Delete type=0 #210 +2023/11/12-06:17:24.213126 ffff85fbf0a0 Level-0 table #215: started +2023/11/12-06:17:24.213143 ffff85fbf0a0 Level-0 table #215: 0 bytes OK +2023/11/12-06:17:24.215154 ffff85fbf0a0 Delete type=0 #213 +2023/11/12-06:17:24.220989 ffff85fbf0a0 Manual compaction at level-0 from '!items!4gNZCu2ncgu98A0H' @ 72057594037927935 : 1 .. '!items!wZXL6VgEK88BCF0C' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-feats/MANIFEST-000212 b/Data/modules/pf2e-animal-companions/packs/ac-feats/MANIFEST-000216 similarity index 81% rename from Data/modules/pf2e-animal-companions/packs/ac-feats/MANIFEST-000212 rename to Data/modules/pf2e-animal-companions/packs/ac-feats/MANIFEST-000216 index 8e90eca8..580ad77d 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-feats/MANIFEST-000212 and b/Data/modules/pf2e-animal-companions/packs/ac-feats/MANIFEST-000216 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-feats/000213.log b/Data/modules/pf2e-animal-companions/packs/ac-features/000220.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-feats/000213.log rename to Data/modules/pf2e-animal-companions/packs/ac-features/000220.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-features/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-features/CURRENT index 68076bd4..7d68d999 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-features/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-features/CURRENT @@ -1 +1 @@ -MANIFEST-000215 +MANIFEST-000219 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-features/LOG b/Data/modules/pf2e-animal-companions/packs/ac-features/LOG index eb289904..9de390aa 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-features/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-features/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.691598 ffff86fdf0a0 Recovering log #213 -2023/10/23-05:12:18.696647 ffff86fdf0a0 Delete type=0 #213 -2023/10/23-05:12:18.696667 ffff86fdf0a0 Delete type=3 #211 +2023/11/12-06:20:01.587007 ffff8929e0a0 Recovering log #217 +2023/11/12-06:20:01.591926 ffff8929e0a0 Delete type=3 #215 +2023/11/12-06:20:01.591949 ffff8929e0a0 Delete type=0 #217 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-features/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-features/LOG.old index 53bada0a..82642f02 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-features/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-features/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.071381 ffff877ef0a0 Recovering log #209 -2023/10/20-07:55:11.076235 ffff877ef0a0 Delete type=3 #207 -2023/10/20-07:55:11.076257 ffff877ef0a0 Delete type=0 #209 -2023/10/23-05:11:51.673019 ffff85fbf0a0 Level-0 table #214: started -2023/10/23-05:11:51.673035 ffff85fbf0a0 Level-0 table #214: 0 bytes OK -2023/10/23-05:11:51.674950 ffff85fbf0a0 Delete type=0 #212 -2023/10/23-05:11:51.677388 ffff85fbf0a0 Manual compaction at level-0 from '!items!0i2ZSrRpjKG0KV4U' @ 72057594037927935 : 1 .. '!items!zF6bLjVwj7Njkqan' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.691598 ffff86fdf0a0 Recovering log #213 +2023/10/23-05:12:18.696647 ffff86fdf0a0 Delete type=0 #213 +2023/10/23-05:12:18.696667 ffff86fdf0a0 Delete type=3 #211 +2023/11/12-06:17:24.219040 ffff85fbf0a0 Level-0 table #218: started +2023/11/12-06:17:24.219056 ffff85fbf0a0 Level-0 table #218: 0 bytes OK +2023/11/12-06:17:24.220950 ffff85fbf0a0 Delete type=0 #216 +2023/11/12-06:17:24.221278 ffff85fbf0a0 Manual compaction at level-0 from '!items!0i2ZSrRpjKG0KV4U' @ 72057594037927935 : 1 .. '!items!zF6bLjVwj7Njkqan' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-features/MANIFEST-000215 b/Data/modules/pf2e-animal-companions/packs/ac-features/MANIFEST-000219 similarity index 80% rename from Data/modules/pf2e-animal-companions/packs/ac-features/MANIFEST-000215 rename to Data/modules/pf2e-animal-companions/packs/ac-features/MANIFEST-000219 index 471d2067..ed144bfb 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-features/MANIFEST-000215 and b/Data/modules/pf2e-animal-companions/packs/ac-features/MANIFEST-000219 differ diff --git a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/000214.log b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/000218.log similarity index 100% rename from Data/modules/pf2e-animal-companions/packs/ac-support-benefits/000214.log rename to Data/modules/pf2e-animal-companions/packs/ac-support-benefits/000218.log diff --git a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/CURRENT b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/CURRENT index 51af8957..9aabe0cd 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/CURRENT +++ b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/CURRENT @@ -1 +1 @@ -MANIFEST-000213 +MANIFEST-000217 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG index 0a7d87c6..f19d765c 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG +++ b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.698781 ffff867cf0a0 Recovering log #211 -2023/10/23-05:12:18.703939 ffff867cf0a0 Delete type=0 #211 -2023/10/23-05:12:18.703959 ffff867cf0a0 Delete type=3 #209 +2023/11/12-06:20:01.594207 ffff88a8e0a0 Recovering log #215 +2023/11/12-06:20:01.599496 ffff88a8e0a0 Delete type=0 #215 +2023/11/12-06:20:01.599515 ffff88a8e0a0 Delete type=3 #213 diff --git a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG.old b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG.old index 8dd87e97..4398ec39 100644 --- a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG.old +++ b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.078354 ffff867cf0a0 Recovering log #207 -2023/10/20-07:55:11.083248 ffff867cf0a0 Delete type=3 #205 -2023/10/20-07:55:11.083270 ffff867cf0a0 Delete type=0 #207 -2023/10/23-05:11:51.675097 ffff85fbf0a0 Level-0 table #212: started -2023/10/23-05:11:51.675117 ffff85fbf0a0 Level-0 table #212: 0 bytes OK -2023/10/23-05:11:51.677238 ffff85fbf0a0 Delete type=0 #210 -2023/10/23-05:11:51.679641 ffff85fbf0a0 Manual compaction at level-0 from '!items!2Jaz98WiQMNnqKCD' @ 72057594037927935 : 1 .. '!items!zE01vpjowhoKygig' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.698781 ffff867cf0a0 Recovering log #211 +2023/10/23-05:12:18.703939 ffff867cf0a0 Delete type=0 #211 +2023/10/23-05:12:18.703959 ffff867cf0a0 Delete type=3 #209 +2023/11/12-06:17:24.221352 ffff85fbf0a0 Level-0 table #216: started +2023/11/12-06:17:24.221370 ffff85fbf0a0 Level-0 table #216: 0 bytes OK +2023/11/12-06:17:24.223481 ffff85fbf0a0 Delete type=0 #214 +2023/11/12-06:17:24.229606 ffff85fbf0a0 Manual compaction at level-0 from '!items!2Jaz98WiQMNnqKCD' @ 72057594037927935 : 1 .. '!items!zE01vpjowhoKygig' @ 0 : 0; will stop at (end) diff --git a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/MANIFEST-000213 b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/MANIFEST-000217 similarity index 81% rename from Data/modules/pf2e-animal-companions/packs/ac-support-benefits/MANIFEST-000213 rename to Data/modules/pf2e-animal-companions/packs/ac-support-benefits/MANIFEST-000217 index 8cc015e2..df6a31ec 100644 Binary files a/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/MANIFEST-000213 and b/Data/modules/pf2e-animal-companions/packs/ac-support-benefits/MANIFEST-000217 differ diff --git a/Data/modules/wall-height/packs/macros/001041.log b/Data/modules/wall-height/packs/macros/001045.log similarity index 100% rename from Data/modules/wall-height/packs/macros/001041.log rename to Data/modules/wall-height/packs/macros/001045.log diff --git a/Data/modules/wall-height/packs/macros/CURRENT b/Data/modules/wall-height/packs/macros/CURRENT index dd123db1..440ca64e 100644 --- a/Data/modules/wall-height/packs/macros/CURRENT +++ b/Data/modules/wall-height/packs/macros/CURRENT @@ -1 +1 @@ -MANIFEST-001040 +MANIFEST-001044 diff --git a/Data/modules/wall-height/packs/macros/LOG b/Data/modules/wall-height/packs/macros/LOG index 01f364ad..396ee13b 100644 --- a/Data/modules/wall-height/packs/macros/LOG +++ b/Data/modules/wall-height/packs/macros/LOG @@ -1,3 +1,3 @@ -2023/10/23-05:12:18.733634 ffff86fdf0a0 Recovering log #1038 -2023/10/23-05:12:18.739053 ffff86fdf0a0 Delete type=0 #1038 -2023/10/23-05:12:18.739072 ffff86fdf0a0 Delete type=3 #1036 +2023/11/12-06:20:01.632711 ffff8929e0a0 Recovering log #1042 +2023/11/12-06:20:01.637732 ffff8929e0a0 Delete type=3 #1040 +2023/11/12-06:20:01.637755 ffff8929e0a0 Delete type=0 #1042 diff --git a/Data/modules/wall-height/packs/macros/LOG.old b/Data/modules/wall-height/packs/macros/LOG.old index fd673a05..40a449ea 100644 --- a/Data/modules/wall-height/packs/macros/LOG.old +++ b/Data/modules/wall-height/packs/macros/LOG.old @@ -1,7 +1,7 @@ -2023/10/20-07:55:11.118478 ffff877ef0a0 Recovering log #1034 -2023/10/20-07:55:11.123398 ffff877ef0a0 Delete type=3 #1032 -2023/10/20-07:55:11.123422 ffff877ef0a0 Delete type=0 #1034 -2023/10/23-05:11:51.689038 ffff85fbf0a0 Level-0 table #1039: started -2023/10/23-05:11:51.689068 ffff85fbf0a0 Level-0 table #1039: 0 bytes OK -2023/10/23-05:11:51.692955 ffff85fbf0a0 Delete type=0 #1037 -2023/10/23-05:11:51.700309 ffff85fbf0a0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) +2023/10/23-05:12:18.733634 ffff86fdf0a0 Recovering log #1038 +2023/10/23-05:12:18.739053 ffff86fdf0a0 Delete type=0 #1038 +2023/10/23-05:12:18.739072 ffff86fdf0a0 Delete type=3 #1036 +2023/11/12-06:17:24.240372 ffff85fbf0a0 Level-0 table #1043: started +2023/11/12-06:17:24.240389 ffff85fbf0a0 Level-0 table #1043: 0 bytes OK +2023/11/12-06:17:24.242231 ffff85fbf0a0 Delete type=0 #1041 +2023/11/12-06:17:24.242288 ffff85fbf0a0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/Data/modules/wall-height/packs/macros/MANIFEST-001040 b/Data/modules/wall-height/packs/macros/MANIFEST-001040 deleted file mode 100644 index 9fe15206..00000000 Binary files a/Data/modules/wall-height/packs/macros/MANIFEST-001040 and /dev/null differ diff --git a/Data/modules/wall-height/packs/macros/MANIFEST-001044 b/Data/modules/wall-height/packs/macros/MANIFEST-001044 new file mode 100644 index 00000000..4d66ed05 Binary files /dev/null and b/Data/modules/wall-height/packs/macros/MANIFEST-001044 differ diff --git a/Data/systems/pf2e/CHANGELOG.md b/Data/systems/pf2e/CHANGELOG.md index e465ec7e..dbe54a24 100644 --- a/Data/systems/pf2e/CHANGELOG.md +++ b/Data/systems/pf2e/CHANGELOG.md @@ -1,3 +1,173 @@ +## 5.8.3 + +### Notice + +The 5.8 series of system releases is the final one before changes from Pathfinder Player Core and Pathfinder GM Core are added. The majority of changes are simple renaming of some items, traits, and other elements, with some small tweaks to mechanics. Some of the coming non-renaming changes are more substantial: + +PC options: current Witch patron themes, Wizard arcane schools, and the Tiefling & Aasimar heritages are being moved to a "PF2e Legacy Data" module, which will be available soon. + +Alignment: alignment is being removed from all sheets, but the data will still exist on actors, hidden until a module enables the display of them as traits. + +Variant rules: the Dual Class and Ancestry Paragon variant rules are moving to the PF2e Workbench module. Other variants that were not reprinted, like Stamina, will be staying in the system as they are difficult to reproduce in module form. + +Premium modules: many adventure modules, such as those developed by Foundry Gaming and Sigil Services, keep up with system releases. This means updating the pf2e system version will be required to run such modules in the future. + +We will update our system wiki with a full list of changes prior to the 5.9 system release. + +### System Improvements + +- (jfn4th) Add separate setting to skip damage modifiers dialog +- (stwlam) Enable ephemeral effects for spell damage rolls +- (Supe) Add buttons to place measured template in spell summaries on actor sheets + +### Bugfixes + +- (jfn4th) Fix NPC shield labels +- (stwlam) Fix condition increasing in effects panel +- (stwlam) Fix issue causing some roll substitutions to not delete parent effect after rolling +- (stwlam) Include max stamina when determining whether massive damage is taken +- (stwlam) Show (core Foundry) secret text in item descriptions to GMs +- (Supe) Fix fatal override when base damage type is overwritten +- (Supe) Fix styling for spellcasting drag handle + +### Data Updates + +- (Abaddon) Fix description of Grindlegrub Steak and Jax +- (Dire Weasel) Add automation for Burning Mammoth Commando's Cruel Cutter +- (Dire Weasel) Add automation for House Drake's Silver Strike +- (Dire Weasel) Add automation for Stasian Smash +- (Dire Weasel) Add custom resistance for Perfect Droplet +- (Dire Weasel) Add damage automation to Garrote Bolt and Garrote Shot +- (Dire Weasel) Add effects for Glowing Lantern Fruit, Element Embodied (metal and wood), Silver Crescent, Thorn Triad +- (Dire Weasel) Add leshy trait to Towering Growth +- (Dire Weasel) Add Metal and Wood to effect for Elemental Absorption +- (Dire Weasel) Add silver material effect to Sterling Dynamo strikes and magical trait with Golem Dynamo strikes +- (Dire Weasel) Add spells to Spirit Turtle +- (Dire Weasel) Add TokenLight to Glorious Plate, Radiant Lance, and Songbird's Brush +- (Dire Weasel) Add Wood and Metal effects for Elemental Gift +- (Dire Weasel) Fix physical resistance exception for The First Faithful +- (Dire Weasel) Fix single action damage for Wronged Monk's Wrath +- (Intervención) Fix Purple Worm Sting damage +- (rectulo) Fix typo in description of Retch Rust feat +- (stwlam) Fix predicate in Ongoing Strategy feat + +## 5.8.2 + +### System Improvements + +- (stwlam) Automate damage-based instant death +- (stwlam) Display total bulk in vehicle sheet inventory +- (Supe) Support spell heighten trait overrides +- (Supe) Move always show dialog toggle from the header to the dialog body + +### Bugfixes + +- (stwlam) Fix issue preventing NPC loot sheet inventory from appearing to players +- (stwlam) Fix handling of shield block buttons on damage messages +- (Supe) Fix deleting spell fixed heightening entries +- (Supe) Fix shield hardness label in armor sheet + +### Data Updates + +- (Dire Weasel) Brush up Reginald Vancaskerkin and add effect for Overdrive Engine +- (Dire Weasel) Fix healing links in Life Shot +- (stwlam) Fix application of Blade Ally property rune effects on handwraps + +## 5.8.1 + +This release updates verified core compatibility to 11.314. + +### Bugfixes + +- (alexbrault) Localize damage label in item summary +- (In3luki) Restore "Rest for the Night" button listener in character sheet +- (stwlam) Remove checking of hands available for free-hand weapons +- (stwlam) Fix issue preventing damage weakness associated with fire aura junction from being properly recognized + +### Data Updates + +- (Dire Weasel) Add typed damage links to Manifestation Of Dahak's Focused Breath Weapon +- (Dire Weasel) Update The Eclipse damage to `@Damage` format + +## 5.8.0 + +### System Improvements + +- (In3luki, Supe) Add a damage-roll dialog, similar in purpose to the check roll dialog +- (In3luki) Add "not" button to Compendium Browser filter tags +- (stwlam) Add support for aura effect alterations +- (stwlam) Start adding support for designating damage rolls as actually being healing +- (stwlam) Add support for property-rune strike adjustments on melee items +- (stwlam) Do not emit effects from auras of GM-hidden tokens +- (stwlam) Draw aura textures underneath tokens +- (stwlam) Make PC attacks that require free hands always visible (though still disabled) on sheet +- (stwlam) Include UUID in actor roll options as "self:uuid:[uuid]" + +### Bugfixes + +- (stwlam) Fix some bonuses and modifiers slipping by battle-form damage exclusion +- (stwlam) Fix specific magic weapons receiving price changes due to precious materials +- (stwlam) Fix setting of attribute domain for strikes using weapons with finesse +- (stwlam) Localize publication form labels in actor/item sheets +- (stwlam) Fix issue preventing ephemeral effects from operating on elemental blasts +- (stwlam) Read in `options.difficultyClass` in `SingleCheckActionVariant#use` +- (stwlam) Restore editability of stamina & resolve from token HUD +- (stwlam) Fix issue preventing some automatic effect removals after rolls. +- (Supe) Fix display of variant spell descriptions +- (Supe) Fix some spell sheet errors and update to fieldset + +### Data Updates + +- (Cerapter) Allow Thaumaturge Implements to accept homebrew +- (Dire Weasel) Add aura to Aura of Forgetfulness +- (Dire Weasel) Add automation for Brimorak's Flaming Weapon, Corrupted Touch, Eunemvro's Blessed Strikes, Facetbound Nullifier's Field of Force, Secret-Keeper's Designate Apostate, Shoma Lyzerius' Natural-Born Burner, Spirit Turtle's Environmental Balance +- (Dire Weasel) Add utilize property runes on some NPC attacks +- (Dire Weasel) Add effect for Cloak of Light and auto-heighten damage link +- (Dire Weasel) Add effects for Blood Booster, Ghost Oil, Life-Boosting Oil, Wounding Oil +- (Dire Weasel) Add infused alchemical items to Amateur Chemist's inventory and add attacks +- (Dire Weasel) Add missing category to Numerian Construct action +- (Dire Weasel) Add note and damage link to Grendel's Hands of the Murderer +- (Dire Weasel) Add stupefied check to Vetalarana Emergent's Anticipatory Attack +- (Dire Weasel) Brush up some NPC Pack Attacks +- (Dire Weasel) Fix resistances and weaknesses of Bloom of Lamashtu +- (Dire Weasel) Fix size of The Beast +- (Dire Weasel) Fix War Formation to remove explicit damage type +- (Dire Weasel) Set Weapon Surge effect duration to 1 round +- (Dire Weasel) Update Desiccating Inhalation to include leveled damage in main description and add healing link +- (Dire Weasel) Update Facetbound Cascader's Energy Ward from effect to RollOptions with suboptions +- (Dire Weasel) Update some NPC strikes to use damage partials instead of rule elements +- (Dire Weasel) Fix Brochmaw's Hot Oil damage +- (In3luki) Fix issue causing hazards to not appear in compendium browser +- (InfamousSky) Add many equipment and spell icons +- (Intervención) Makes Overdrive Ally an action rather than passive ability +- (rectulo) Add missing level requirement in archetype journal for Sorcerer archetype +- (rectulo) Fix double "action-glyph" elements in some item descriptions +- (rectulo) Fix the bonus on attack rolls in the sulfur bomb (greater) description +- (SpartanCPA) Add Exploit Regret reaction to Ifrit Shuyookh +- (stwlam) Add aura junction effects for fire and water elements +- (stwlam) Fix hardness alteration of shield in sparkling targe class feature +- (stwlam) Fix reference to "Vs. Undead" spell effect in text of Lay on Hands +- (stwlam) Automate Keen rune, Keen-like abilities on PC options and creature attack effects +- (stwlam) Automatically add/increase Doomed condition at extreme oracular curse stage +- (stwlam) Remove scouting effects only after initiative rolls +- (Supe) Add label for fire impulse junction upgrade +- (Tikael) Add effect for Fresh Produce +- (Tikael) Add spell effect for Positive Luminance + +## 5.7.4 + +### Bugfixes + +- (Cuingamehtar) Remove empty common rarity tag on feat chat cards +- (In3luki) Restore availability of stamina token bar attribute +- (stwlam) Fix dropping feats in campaign feat group +- (stwlam) Fix rendering error in Firefox of actor sheet inventories + +## Data Updates + +- (stwlam) Automate Ghostly Resistance feat +- (Tikael) Fix rule element in Buckler Expertise + ## 5.7.3 ### System Improvements diff --git a/Data/systems/pf2e/icons/equipment/alchemical-items/alchemical-elixirs/fury-cocktail.webp b/Data/systems/pf2e/icons/equipment/alchemical-items/alchemical-elixirs/fury-cocktail.webp new file mode 100644 index 00000000..f14d1cba --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/alchemical-items/alchemical-elixirs/fury-cocktail.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5ac233d8d78627b780fd781c888a8b37d0e1fadc5d59399c6d94a7dc619bcfd +size 2146 diff --git a/Data/systems/pf2e/icons/equipment/alchemical-items/food/phantom-roll.webp b/Data/systems/pf2e/icons/equipment/alchemical-items/food/phantom-roll.webp new file mode 100644 index 00000000..35124c91 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/alchemical-items/food/phantom-roll.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:749440d683834b7c0ceeb5288a97a5fbaba7cc04497fe5692906d2feb71e446d +size 1768 diff --git a/Data/systems/pf2e/icons/equipment/armor/buckle-armor.webp b/Data/systems/pf2e/icons/equipment/armor/buckle-armor.webp new file mode 100644 index 00000000..6367455a --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/buckle-armor.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8dbe6455a61aba2374efa9cf8c4d586eb29fbd419842b9b1a112b257770b0c2e +size 2332 diff --git a/Data/systems/pf2e/icons/equipment/armor/ceramic-plate.webp b/Data/systems/pf2e/icons/equipment/armor/ceramic-plate.webp new file mode 100644 index 00000000..e4ff843f --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/ceramic-plate.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5358f35b72cda67dd05f15b1789f768efb5fa4f10636a23bc908c61d19a12fd +size 2004 diff --git a/Data/systems/pf2e/icons/equipment/armor/chainmail.webp b/Data/systems/pf2e/icons/equipment/armor/chainmail.webp index c2937042..d4c42775 100644 --- a/Data/systems/pf2e/icons/equipment/armor/chainmail.webp +++ b/Data/systems/pf2e/icons/equipment/armor/chainmail.webp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ea34b04b94835993adbf67c0e5191a8b2cafa504cb9bf7bde5db2e75ae6cbf3 -size 2428 +oid sha256:63c732a10165d0c03fd3db26805513fe80c9e6c9c5ae04c008748339263d12a2 +size 2430 diff --git a/Data/systems/pf2e/icons/equipment/armor/coral-armor.webp b/Data/systems/pf2e/icons/equipment/armor/coral-armor.webp new file mode 100644 index 00000000..d44c22af --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/coral-armor.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc33c14a493c7aeba4f139cc5919936ccedfeea4ca21aa39cb86bef119b43511 +size 2336 diff --git a/Data/systems/pf2e/icons/equipment/armor/lattice-armor.webp b/Data/systems/pf2e/icons/equipment/armor/lattice-armor.webp new file mode 100644 index 00000000..3239b2b8 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/lattice-armor.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5aaec7695985a820ff094228bf61b114f2f35d70211695ad6bbe5d8bac8d05b4 +size 2008 diff --git a/Data/systems/pf2e/icons/equipment/armor/mantis-shell.webp b/Data/systems/pf2e/icons/equipment/armor/mantis-shell.webp new file mode 100644 index 00000000..7638b30d --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/mantis-shell.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:501b6457728491b9fbdf70c8a0752da89585cc9a15b9d2a7c22e1c23cd603ea7 +size 2570 diff --git a/Data/systems/pf2e/icons/equipment/armor/niyahaat.webp b/Data/systems/pf2e/icons/equipment/armor/niyahaat.webp new file mode 100644 index 00000000..81e4c353 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/niyahaat.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50fbfd8414580bd964024ae266f0e42a4015e5fcea426c50775c1b629c604763 +size 2336 diff --git a/Data/systems/pf2e/icons/equipment/armor/o-yoroi.webp b/Data/systems/pf2e/icons/equipment/armor/o-yoroi.webp new file mode 100644 index 00000000..f9df9542 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/o-yoroi.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d20455b5a02c8c06249518f3083a46bea9f8cde42722b7ba2d6c9324ded4f00d +size 1208 diff --git a/Data/systems/pf2e/icons/equipment/armor/sankeit.webp b/Data/systems/pf2e/icons/equipment/armor/sankeit.webp new file mode 100644 index 00000000..54e56779 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/sankeit.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:072051f407d3cc243b4576d63b57f854b3379da70ed098c0a273d27aafd5d005 +size 1110 diff --git a/Data/systems/pf2e/icons/equipment/armor/scroll-robes.webp b/Data/systems/pf2e/icons/equipment/armor/scroll-robes.webp new file mode 100644 index 00000000..791b3cd7 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/armor/scroll-robes.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61ea8a511edbe048f677c9de9a84c5ebb7a8b68f192d39f39c1a55e99b1d96a2 +size 2824 diff --git a/Data/systems/pf2e/icons/equipment/consumables/ammunition/life-shot.webp b/Data/systems/pf2e/icons/equipment/consumables/ammunition/life-shot.webp new file mode 100644 index 00000000..fc2185bf --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/consumables/ammunition/life-shot.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:017acbb0cf809bb382477a9822a6b1a21fd103d210ff81febc1dc9201aaffd72 +size 2576 diff --git a/Data/systems/pf2e/icons/equipment/consumables/fulus/fulu-anathema.webp b/Data/systems/pf2e/icons/equipment/consumables/fulus/fulu-anathema.webp new file mode 100644 index 00000000..1240f46b --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/consumables/fulus/fulu-anathema.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2dc1a17eaf63d1d7767e3ece9a69fd8604f472308fd63c1b22cca18fec5de5d +size 2170 diff --git a/Data/systems/pf2e/icons/equipment/consumables/spellguns/reapers-spellgun.webp b/Data/systems/pf2e/icons/equipment/consumables/spellguns/reapers-spellgun.webp new file mode 100644 index 00000000..46a5b1e7 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/consumables/spellguns/reapers-spellgun.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9313cba92dbcae2b79ac5364301a5f0f880d8bcff29fb052b47049194807d35 +size 1710 diff --git a/Data/systems/pf2e/icons/equipment/held-items/bring-me-near.webp b/Data/systems/pf2e/icons/equipment/held-items/bring-me-near.webp new file mode 100644 index 00000000..4e6547c3 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/held-items/bring-me-near.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7792bee66e848d55635e56c20856ab8d48a38751cf778f0f5797c0db50801f4 +size 2242 diff --git a/Data/systems/pf2e/icons/equipment/held-items/fiddle-of-the-maestro.webp b/Data/systems/pf2e/icons/equipment/held-items/fiddle-of-the-maestro.webp new file mode 100644 index 00000000..f7315049 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/held-items/fiddle-of-the-maestro.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c42175e9d760b18f7d9bc8c59bef199765087224ff0b94376d13295794fdc98 +size 2558 diff --git a/Data/systems/pf2e/icons/equipment/held-items/magnifying-glass-of-elucidation.webp b/Data/systems/pf2e/icons/equipment/held-items/magnifying-glass-of-elucidation.webp index 6528b4f0..2048c546 100644 --- a/Data/systems/pf2e/icons/equipment/held-items/magnifying-glass-of-elucidation.webp +++ b/Data/systems/pf2e/icons/equipment/held-items/magnifying-glass-of-elucidation.webp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e07d5d6785487975ea6d93b4add9aab294f4eb628d994023c555bee1c6a648dd -size 884 +oid sha256:515f5d4ae657992f52a14ddd2db4add67a5ecf1d3239f366831603f5d0cb5852 +size 1744 diff --git a/Data/systems/pf2e/icons/equipment/held-items/wand-of-mental-purification.webp b/Data/systems/pf2e/icons/equipment/held-items/wand-of-mental-purification.webp new file mode 100644 index 00000000..b0d26665 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/held-items/wand-of-mental-purification.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09b0a55356b4b0fb1d00993d22c66d7df618bb3ae957b5de19b60b64fe83f6bf +size 1726 diff --git a/Data/systems/pf2e/icons/equipment/held-items/wand-of-refracting-rays.webp b/Data/systems/pf2e/icons/equipment/held-items/wand-of-refracting-rays.webp new file mode 100644 index 00000000..fb796775 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/held-items/wand-of-refracting-rays.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ee649ef4bfe231220c9f3d6e9b4f1adb159dab9bad966a80e8df2e340a0889 +size 1244 diff --git a/Data/systems/pf2e/icons/equipment/other/spellhearts/judgment-thurible.webp b/Data/systems/pf2e/icons/equipment/other/spellhearts/judgment-thurible.webp new file mode 100644 index 00000000..f6207bd1 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/other/spellhearts/judgment-thurible.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dca5afb4fe78a5504c69253e47fbb72428517e8128e691287c0635af63061bb +size 2274 diff --git a/Data/systems/pf2e/icons/equipment/other/spellhearts/radiant-prism.webp b/Data/systems/pf2e/icons/equipment/other/spellhearts/radiant-prism.webp new file mode 100644 index 00000000..1f679d4c --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/other/spellhearts/radiant-prism.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5257537e4eab0efef3a4ddd03d14a5fb16d19d89628e5458b48ba07cca0137bb +size 1662 diff --git a/Data/systems/pf2e/icons/equipment/staves/atmospheric-staff.webp b/Data/systems/pf2e/icons/equipment/staves/atmospheric-staff.webp new file mode 100644 index 00000000..f9590bb3 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/staves/atmospheric-staff.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0e7a983ffd41bec5b1f453a1bd5f1dea0c58ca8c9ad22d8da0cbc7b094d9133 +size 1572 diff --git a/Data/systems/pf2e/icons/equipment/tattoos/ancestral-geometry.webp b/Data/systems/pf2e/icons/equipment/tattoos/ancestral-geometry.webp new file mode 100644 index 00000000..9e615367 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/tattoos/ancestral-geometry.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80a4af5689f53b28ca89c52e1f6e06e98be8d3c7d90ceb7a886c10b367de2a0f +size 2122 diff --git a/Data/systems/pf2e/icons/equipment/tattoos/memoir-map.webp b/Data/systems/pf2e/icons/equipment/tattoos/memoir-map.webp new file mode 100644 index 00000000..e614df39 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/tattoos/memoir-map.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47d0762e969d06e91eea609bc974c1da3695b9986acdf7442699d4773978fe8e +size 2408 diff --git a/Data/systems/pf2e/icons/equipment/tattoos/nemesis-name.webp b/Data/systems/pf2e/icons/equipment/tattoos/nemesis-name.webp new file mode 100644 index 00000000..b998e033 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/tattoos/nemesis-name.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9bc1c6c7113effedd1a3322673c81160ecfaef3f9be0a2e35b2f160bd2292fb +size 2366 diff --git a/Data/systems/pf2e/icons/equipment/tattoos/one-hundred-victories.webp b/Data/systems/pf2e/icons/equipment/tattoos/one-hundred-victories.webp new file mode 100644 index 00000000..1e2db258 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/tattoos/one-hundred-victories.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61196bacac8c5fe1649bf9036ef1b2da4813ca6bce9cb7175c9ae2409d84d3d3 +size 1762 diff --git a/Data/systems/pf2e/icons/equipment/tattoos/silent-heart.webp b/Data/systems/pf2e/icons/equipment/tattoos/silent-heart.webp new file mode 100644 index 00000000..7601240c --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/tattoos/silent-heart.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb5da9d43e48cda75a216df28f17904592034bcfa73c716dcb87b40e24f58da0 +size 2894 diff --git a/Data/systems/pf2e/icons/equipment/tattoos/unbreakable-heart.webp b/Data/systems/pf2e/icons/equipment/tattoos/unbreakable-heart.webp new file mode 100644 index 00000000..6fc4c3cb --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/tattoos/unbreakable-heart.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7c0e687c4b64a07f63d8350577b8aa7c658b0a58e47f5512f7675fa1d5f0384 +size 1540 diff --git a/Data/systems/pf2e/icons/equipment/weapons/bec-de-corbin.webp b/Data/systems/pf2e/icons/equipment/weapons/bec-de-corbin.webp new file mode 100644 index 00000000..6c1e05f9 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/weapons/bec-de-corbin.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b643d66679895f5c5d883f4ffb1fa6aaa7ce4fca30738f2f797ee14c57ca05a +size 1502 diff --git a/Data/systems/pf2e/icons/equipment/weapons/frying-pan.webp b/Data/systems/pf2e/icons/equipment/weapons/frying-pan.webp new file mode 100644 index 00000000..c0218c70 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/weapons/frying-pan.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78d9bee01ed702fcab4e0222886225f27f5b49a179c86783df2f0888b66bc413 +size 1268 diff --git a/Data/systems/pf2e/icons/equipment/weapons/gauntlet-bow.webp b/Data/systems/pf2e/icons/equipment/weapons/gauntlet-bow.webp new file mode 100644 index 00000000..8df746e3 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/weapons/gauntlet-bow.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4363a8a9b10c0794dc84ffbc42c1d8c49cd269823a31ef8e37e9d8ebeb584706 +size 2470 diff --git a/Data/systems/pf2e/icons/equipment/weapons/shobhad-longrifle.webp b/Data/systems/pf2e/icons/equipment/weapons/shobhad-longrifle.webp new file mode 100644 index 00000000..23335134 --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/weapons/shobhad-longrifle.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edcdaf34d38fe453c311a4860c5956fc649ab352955f7e4540bace5cc3a596b1 +size 1802 diff --git a/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/eyes-of-the-eagle.webp b/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/eyes-of-the-eagle.webp index a3fe6484..22c80731 100644 --- a/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/eyes-of-the-eagle.webp +++ b/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/eyes-of-the-eagle.webp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42cefe4eb487256c8b0e47f8cb9b149359eeed53020124876dfed1d67f4edb5f -size 1296 +oid sha256:d01fa754f4a75dc4bbefbe8685a6b858681db31163c6100c56f766d8f54086ba +size 2384 diff --git a/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/persona-mask.webp b/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/persona-mask.webp index 87a65da1..27564dd4 100644 --- a/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/persona-mask.webp +++ b/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/persona-mask.webp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d46a119be3f3a3d39821e828c8d63a8cc9000e501bada58db91ee5374763a1f -size 1074 +oid sha256:e5e7e1ab777aa4c38bb4a37f61ae59d925b7d3319ca2b7db3ac2392f4f69cd96 +size 2620 diff --git a/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/psychopomp-mask.webp b/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/psychopomp-mask.webp new file mode 100644 index 00000000..fadfd5fc --- /dev/null +++ b/Data/systems/pf2e/icons/equipment/worn-items/other-worn-items/psychopomp-mask.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad053a064f932b30f4dd209804318bb5454b436644b5907d3273ded9b85b4c15 +size 2240 diff --git a/Data/systems/pf2e/lang/en.json b/Data/systems/pf2e/lang/en.json index a2efaee9..21d67d42 100644 --- a/Data/systems/pf2e/lang/en.json +++ b/Data/systems/pf2e/lang/en.json @@ -121,6 +121,12 @@ "DamagedForN": "{actor} takes {hpDamage} damage.", "DamagedForNShield": "{actor}'s shield absorbs {absorbedDamage} damage, with an additional {hpDamage} making it through.", "HealedForN": "{actor} is healed for {hpDamage} damage.", + "InstantDeath": { + "DeathEffect": "The death effect immediately kills them.", + "Destroyed": "They are destroyed.", + "FinePowder": "They are reduced to a fine powder; their gear remains.", + "MassiveDamage": "The massive damage immediately kills them." + }, "ShieldAbsorbsAll": "{actor} is unscathed, their shield completely absorbing {absorbedDamage} damage.", "ShieldDamagedForN": "Their shield is also damaged for {shieldDamage}.", "ShieldDamagedForNBroken": "Their shield also takes {shieldDamage} damage, breaking it.", @@ -183,6 +189,7 @@ }, "Title": "Configure Character" }, + "HandsOccupied": "Hands Occupied", "Proficiency": { "Attack": { "Advanced": "Advanced Weapons", @@ -249,9 +256,21 @@ "WithAcuity": "{sense} ({acuity})", "WithAcuityAndRange": "{sense} ({acuity} {range} Ft)" }, + "Shield": { + "ACBonus": "Shield AC Bonus (When Raised)", + "BrokenThreshold": "Shield Broken Threshold", + "Hardness": { + "Hint": "Shield Hardness", + "Label": "H" + }, + "HitPoints": { + "Value": "Shield HP", + "Max": "Shield Max HP" + } + }, "SpellPreparation": { "Hint": "To prepare a spell, drag one from this list to a slot on the actor sheet.", - "HintFlexible": "To prepare a spell, enable it here. To prepare a cantrip, drag one from this list to a slot on the actor sheet. ", + "HintFlexible": "To prepare a spell, enable it here. To prepare a cantrip, drag one from this list to a slot on the actor sheet.", "Search": "Search Spells", "Title": "{actor}: Spell Preparation" }, @@ -441,7 +460,6 @@ "AdditionalLanguagePlusInt": "(plus Intelligence)", "AdditionalSkills": "Additional Skills", "Age": "Age", - "AgeTitle": "The age of your character", "Alignment": "Alignment", "AlignmentCE": "Chaotic Evil", "AlignmentCG": "Chaotic Good", @@ -452,12 +470,10 @@ "AlignmentN": "Neutral", "AlignmentNE": "Neutral Evil", "AlignmentNG": "Neutral Good", - "AlignmentTitle": "Your alignment", "AllSavesLabel": "All Saves", "AncestryFeatLevels": "Ancestry Feat Levels", "AncestryFeatures": "Ancestry Features", "AncestryHP": "Ancestry HP", - "AncestryTitle": "Your character's ancestry", "AreaLabel": "Area", "AreaSize10": "10 Foot", "AreaSize100": "100 Foot", @@ -600,7 +616,6 @@ }, "Background": "Background", "BackgroundSkillFeats": "Skill Feats", - "BackgroundTitle": "Your character's background", "BaseModifier": "Base Modifier", "BaseWeapons": "Base Weapons", "BestiaryBrowserSearchHint": "You can search for name or custom attributes. Possible searchable attributes are:
source, spellType, level, school, components, materials, target, range, time, duration, damage, damageType, save, concentration, ritual, ability and classes.
Example: 'fire, damage:d6' to show all spells that have fire in their name and a d6 in the damage", @@ -620,13 +635,8 @@ "BiographyOrganizations": "Organizations", "BiographyPersonalityHeader": "Personality", "Bonus": "Bonus", - "BonusBulk": "Bonus Bulk Maximum", - "BonusBulkTitle": "Add or subtract from your bulk limit", - "BonusHPLabel": "Bonus HP", - "BonusHPperLevel": "Bonus HP per Level", - "BonusHPperLevelTitle": "Applies once for every level (CON mod is added separately)", "BonusLabel": { - "ability": "Ability Bonus", + "ability": "Attribute Bonus", "circumstance": "Circumstance Bonus", "item": "Item Bonus", "proficiency": "Proficiency Bonus", @@ -635,7 +645,6 @@ }, "BonusSPLabel": "Bonus SP", "BonusSPperLevel": "Bonus SP per Level", - "BonusSPperLevelTitle": "Applies once for every level (CON mod is added separately)", "BrowseLabel": "Browse", "BrowserClearFilter": "Clear Filter", "BrowserClearFilters": "Clear All Filters", @@ -693,7 +702,7 @@ "itemTypeLabel": "Item type: ", "label": "Create a spellcasting item from the dropped spell", "scroll": "Scroll", - "spellLevelLabel": "Heightened Level: ", + "spellLevelLabel": "Heightened Rank: ", "submit": "Create item", "title": "Create a spellcasting item", "wand": "Wand" @@ -765,7 +774,6 @@ "ClassFeatLevels": "Class Feat Levels", "ClassFeatures": "Class Features", "ClassHP": "Class HP", - "ClassTitle": "Your character's class", "ClickToSetInitiative": "Click to set initiative to selected token(s).", "ClickToSetInitiativeContext": "Set as Initiative", "ClipboardNotification": "Copied \"{clipText}\" to the clipboard.", @@ -955,10 +963,8 @@ "CurrencyGP": "Gold", "CurrencyPP": "Platinum", "CurrencySP": "Silver", - "CurrentHPTitle": "Your current hit points", "CurrentHitPointsShortLabel": "Current HP", "CurrentStaminaPointsShortLabel": "Current SP", - "CurrentStaminaTitle": "The amount of stamina points you have", "DCAdjustmentEasy": "easy", "DCAdjustmentHard": "hard", "DCAdjustmentIncrediblyEasy": "incredibly easy", @@ -971,17 +977,6 @@ "DCWithValueAndVisibility": "DC {dc} {text}", "Damage": { "Base": "Base", - "Dialog": { - "BaseDamage": "Base Damage", - "Bonus": "Bonus {dice}", - "BonusDice": "{dice} Dice", - "CriticalDamageRoll": "Critical Damage Roll", - "DamageRoll": "Damage Roll", - "DiceHeader": "Damage Dice", - "Label": "Label", - "None": "None", - "Splash": "{damageType} Splash" - }, "IWR": { "ActorIsImmune": "{actor} is immune to {effect}.", "ActorIsUnaffected": "{actor} is unaffected by {effect}.", @@ -1130,6 +1125,29 @@ "Half": "half hardness" }, "IncreasedFrom": "Increased from {original} to minimum of 1", + "Kind": { + "Both": { + "Roll": { + "Noun": "Damage/Healing Roll", + "Verb": "Roll Damage/Healing" + } + }, + "Damage": { + "Roll": { + "Noun": "Damage Roll", + "Verb": "Roll Damage" + } + }, + "Healing": { + "Apply": { + "Label": "Apply Healing" + }, + "Roll": { + "Noun": "Healing Roll", + "Verb": "Roll Healing" + } + } + }, "NoDamageFormulaLabel": "No damage", "PersistentTooltip": "Persistent {damageType}", "Precision": "Precision", @@ -1195,7 +1213,6 @@ "DecrementEffectTitle": "Decrease Effect Level", "DefensesLabel": "Defenses", "Deity": "Deity", - "DeityTitle": "Your deity", "DeleteQuestion": "Are you sure you want to delete {name}?", "DeleteConditionTitle": "Delete Condition", "DeleteItemTitle": "Delete Item", @@ -1395,12 +1412,6 @@ "FeaturesAncestryHeader": "Ancestry Features", "FeaturesClassHeader": "Class Features", "Feet": "feet", - "FlatBonusHP": "Flat Bonus HP", - "FlatBonusHPTitle": "Adds a static number to your HP", - "FlatBonusHPperLevel": "Bonus HP / Lvl", - "FlatBonusSP": "Flat Bonus SP", - "FlatBonusSPTitle": "Adds a static number to your SP", - "FlatBonusSPperLevel": "Bonus SP / Lvl", "FlatCheck": "Flat Check", "Focus": { "NotEnoughFocusPointsError": "You do not have enough focus points to cast this spell.", @@ -1409,9 +1420,7 @@ "Previous": "Previous", "Spells": "Focus Spells", "label": "Focus Points", - "pointLabel": "Points", - "pointTitle": "Your remaining Focus Points", - "poolTitle": "The size of your Focus Pool" + "pointLabel": "Points" }, "Foot": "Foot", "FormulaKnownTitle": "Known Formulas", @@ -1429,24 +1438,16 @@ "per": "per" }, "GenderPronoun": "Gender/Pronouns", - "GenderPronounTitle": "Your gender/pronouns", "GeneralFeatLevels": "General Feat Levels", - "GreaterWeaponSpecialization": " Greater Weapon Specialization", + "GreaterWeaponSpecialization": "Greater Weapon Specialization", "HardnessLabel": "Hardness", "HazardDescriptionLabel": "Description", - "HazardDescriptionTitle": "This explains what the hazard looks like and might include special rules", "HazardDisableLabel": "Disable", - "HazardHardnessLabel": "Hardness", - "HazardHardnessTitle": "Hazard damage is reduced by this hardness value", "HazardResetLabel": "Reset", - "HazardResetTitle": "If the hazard can be reset, that information is here", "HazardRoutineLabel": "Routine", - "HazardRoutineTitle": "This section describes what a complex hazard does on each of its turns during an encounter; the number in parentheses after the word \"Routine\" indicates how many actions the hazard can use each turn. Simple hazards don't have this entry", "HealingTypeTemporaryHealing": "Healing (Temporary)", "Height": "Height", - "HeightTitle": "Your height", "Heritage": "Heritage", - "HeritageTitle": "Your character's heritage", "HeroPointRatio": { "Many": "{value}/{max} Hero Points", "One": "1/{max} Hero Point" @@ -1661,7 +1662,7 @@ "Label": "Abomination" }, "Air": { - "Description": "You can control winds and the weather. ", + "Description": "You can control winds and the weather.", "Label": "Air" }, "AirApocryphal": { @@ -2043,6 +2044,10 @@ }, "Physical": { "Broken": "Broken", + "BrokenThreshold": { + "Label": "Broken Threshold", + "ShortLabel": "BT" + }, "Bulk": { "Light": "L", "Negligible": "—", @@ -2052,8 +2057,8 @@ "Destroyed": "Destroyed", "FromSpell": { "CantripDeck5": "Cantrip Deck of {name} (5-pack)", - "Scroll": "Scroll of {name} (Level {level})", - "Wand": "Wand of {name} (Level {level})" + "Scroll": "Scroll of {name} (Rank {level})", + "Wand": "Wand of {name} (Rank {level})" }, "GeneratedName": { "FourProperties": "{property1} {property2} {property3} {property4} {base}", @@ -2153,6 +2158,7 @@ }, "SidebarSummary": "{type} Summary", "Spell": { + "Area": "{size}-{unit} {shape}", "Counteract": { "Hint": "If you're counteracting an affliction, the DC is in the affliction's stat block. If it's a spell, use the caster's DC. The GM can also calculate a DC based on the target effect's level.", "Label": "Counteract", @@ -2164,9 +2170,12 @@ "LevelN": "Spell {level}", "MeasuredTemplate": { "Clear": "Clear Placed Templates", - "Place": "Place {size}-{unit} {shape}" + "Place": "Place {area}" + }, + "Rank": { + "Label": "Rank", + "Ordinal": "{rank} Rank" }, - "Rank": "Rank", "Variants": { "DeleteDialogText": "Are you sure you want to delete '{variantName}'?", "DeleteDialogTitle": "Delete Spell Variant", @@ -2398,6 +2407,14 @@ "LanguageYsoki": "Ysoki", "Languages": "Languages", "LanguagesAdditional": "Additional Languages", + "LastStopMessage": { + "Paragraph1": "This is the final release of the Pathfinder Second Edition system before changes from Pathfinder Player Core and Pathfinder GM Core are added. The majority of changes are simple renaming of some items, traits, and other elements, with some small tweaks to mechanics. Some of the coming non-renaming changes are more substantial:", + "Paragraph2": "PC options: current Witch patron themes, Wizard arcane schools, and the Tiefling & Aasimar heritages are being moved to a \"PF2e Legacy Data\" module, which will be available soon.", + "Paragraph3": "Alignment: alignment is being removed from all sheets, but the data will still exist on actors, hidden until a module enables the display of them as traits.", + "Paragraph4": "Variant rules: the Dual Class and Ancestry Paragon variant rules are moving to the PF2e Workbench module. Other variants that were not reprinted, like Stamina, will be staying in the system as they are difficult to reproduce in module form.", + "Paragraph5": "Premium modules: many adventure modules, such as those developed by Foundry Gaming and Sigil Services, keep up with system releases. This means updating the pf2e system version will be required to run such modules in the future.", + "Paragraph6": "We will update our system wiki with a full list of changes prior to the 5.9 system release." + }, "Level1": "Level 1", "Level10": "Level 10", "Level11": "Level 11", @@ -2473,7 +2490,6 @@ "MaxHitPointsBaseLabel": "Base Max HP {base}", "MaxHitPointsShortLabel": "Max HP", "MaxStaminaPointsShortLabel": "Max SP", - "MaxStaminaTitle": "Your maximum stamina points", "Migrations": { "Finished": "PF2E System Migration to version {version} completed!", "OnlyGMCanUse": "Only a gamemaster can use this tool.", @@ -2519,12 +2535,12 @@ "AttackOfOpportunity": "

Trigger A creature within the monster's reach uses a manipulate action or a move action, makes a ranged attack, or leaves a square during a move action it's using.

\n
\n

Effect The monster attempts a melee Strike against the triggering creature. If the attack is a critical hit and the trigger was a manipulate action, the monster disrupts that action. This Strike doesn't count toward the monster's multiple attack penalty, and its multiple attack penalty doesn't apply to this Strike.

", "Aura": "

A monster's aura automatically affects everything within a specified emanation around that monster. The monster doesn't need to spend actions on the aura; rather, the aura's effects are applied at specific times, such as when a creature ends its turn in the aura or when creatures enter the aura.

\n

If an aura does nothing but deal damage, its entry lists only the radius, damage, and saving throw. Such auras deal this damage to a creature when the creature enters the aura and when a creature starts its turn in the aura. A creature can take damage from the aura only once per round.

\n

The GM might determine that a monster's aura doesn't affect its own allies. For example, a creature might be immune to a monster's frightful presence if they have been around each other for a long time.

", "Buck": "
\n

Most monsters that serve as mounts can attempt to buck off unwanted or annoying riders, but most mounts will not use this reaction against a trusted creature unless the mounts are spooked or mistreated.

\n

Trigger A creature @UUID[Compendium.pf2e.actionspf2e.Item.PM5jvValFkbFH3TV]{Mounts} or uses the @UUID[Compendium.pf2e.actionspf2e.Item.q9nbyIF0PEBqMtYe]{Command an Animal} action while riding the monster.

\n
\n

Effect The triggering creature must succeed at a Reflex saving throw against the listed DC or fall off the creature and land @UUID[Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60]{Prone}. If the save is a critical failure, the triggering creature also takes [[/roll 1d6[bludgeoning]]]{1d6 bludgeoning damage} in addition to the normal damage for the fall.

", - "CatchRock": "

Requirements The monster must have a free hand but can @UUID[Compendium.pf2e.actionspf2e.Item.wQYmDStjdjn0I26t]{Release} anything it's holding as part of this reaction.

\n

Trigger The monster is targeted with a thrown rock Strike or a rock would fall on the monster.

\n
\n

Effect The monster gains a +4 circumstance bonus to its AC against the triggering attack or to any defense against the falling rock. If the attack misses or the monster successfully defends against the falling rock, the monster catches the rock, takes no damage, and is now holding the rock

", + "CatchRock": "

Requirements The monster must have a free hand but can @UUID[Compendium.pf2e.actionspf2e.Item.wQYmDStjdjn0I26t]{Release} anything it's holding as part of this reaction.

\n

Trigger The monster is targeted with a thrown rock Strike or a rock would fall on the monster.

\n
\n

Effect The monster gains a +4 circumstance bonus to its AC against the triggering attack or to any defense against the falling rock. If the attack misses or the monster successfully defends against the falling rock, the monster catches the rock, takes no damage, and is now holding the rock.

", "ChangeShape": "

The monster changes its shape indefinitely. It can use this action again to return to its natural shape or adopt a new shape. Unless otherwise noted, a monster cannot use Change Shape to appear as a specific individual. Using Change Shape counts as creating a disguise for the @UUID[Compendium.pf2e.actionspf2e.Item.AJstokjdG6iDjVjE]{Impersonate} use of Deception. The monster's transformation automatically defeats Perception DCs to determine whether the creature is a member of the ancestry or creature type into which it transformed, and it gains a +4 status bonus to its Deception DC to prevent others from seeing through its disguise. Change Shape abilities specify what shapes the monster can adopt. The monster doesn't gain any special abilities of the new shape, only its physical form. For example, in each shape, it replaces its normal Speeds and Strikes, and might potentially change its senses or size. Any changes are listed in its stat block.

", "ConstantSpells": "

A constant spell affects the monster without the monster needing to cast it, and its duration is unlimited. If a constant spell gets counteracted, the monster can reactivate it by spending the normal spellcasting actions the spell requires.

", "Constrict": "

The monster deals the listed amount of damage to any number of creatures @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed} or @UUID[Compendium.pf2e.conditionitems.Item.VcDeM8A5oI6VqhbM]{Restrained} by it. Each of those creatures can attempt a basic Fortitude save with the listed DC.

", - "Coven": "

This monster can form a coven with two or more other creatures who also have the coven ability. This involves performing an 8-hour ceremony with all prospective coven members. After the coven is formed, each of its members gains elite adjustments, adjusting their levels accordingly. Coven members can sense other members' locations and conditions by spending a single action, which has the concentrate trait, and can sense what another coven member is sensing as a two-action activity, which has the concentrate trait as well.

\n

Covens also grant spells and rituals to their members, but these can be cast only in cooperation between three coven members who are all within 30 feet of one another. A coven member can contribute to a coven spell with a single-action spellcasting activity that has a single verbal component. If two coven members have contributed these actions within the last round, a third member can cast a coven spell on her turn by spending the normal spellcasting actions. A coven can cast its coven spells an unlimited number of times but can cast only one coven spell each round. All covens grant the 8th-level @UUID[Compendium.pf2e.spells-srd.Item.dN8QBNuTiaBHCKUe]{Baleful Polymorph} spell and all the following spells, which the coven can cast at any level up to 5th: @UUID[Compendium.pf2e.spells-srd.Item.41TZEjhO6D1nWw2X]{Augury}, @UUID[Compendium.pf2e.spells-srd.Item.vLA0q0WOK2YPuJs6]{Charm}, @UUID[Compendium.pf2e.spells-srd.Item.HXhWYJviWalN5tQ2]{Clairaudience}, @UUID[Compendium.pf2e.spells-srd.Item.zvKWclOZ7A53DObE]{Clairvoyance}, @UUID[Compendium.pf2e.spells-srd.Item.yM3KTTSAIHhyuP14]{Dream Message}, @UUID[Compendium.pf2e.spells-srd.Item.i35dpZFI7jZcRoBo]{Illusory Disguise}, @UUID[Compendium.pf2e.spells-srd.Item.Ucf8eynbZMfUucjE]{Illusory Scene}, @UUID[Compendium.pf2e.spells-srd.Item.Ek5XI0aEdZhBgm21]{Prying Eye}, and @UUID[Compendium.pf2e.spells-srd.Item.FM3SmEW8N1FCRjqt]{Talking Corpse}. Individual creatures with the coven ability also grant additional spells to any coven they join. A coven can also cast the @UUID[Compendium.pf2e.spells-srd.Item.XkDCzMIyc0YOjw05]{Control Weather} ritual, with a DC of 23 instead of the standard DC.

\n

If a coven member leaving the coven or the death of a coven member brings the coven below three members, the remaining members keep their elite adjustments for 24 hours, but without enough members to contribute the necessary actions, they can't cast coven spells.

", - "Darkvision": "

A monster with darkvision can see perfectly well in areas of darkness and dim light, though such vision is in black and white only. Some forms of magical darkness, such as a 4th-level @UUID[Compendium.pf2e.spells-srd.Item.4GE2ZdODgIQtg51c]{Darkness} spell, block normal darkvision. A monster with @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.4Ho2xMPEC05aSxzr]{Greater Darkvision}, however, can see through even these forms of magical darkness.

", + "Coven": "

This monster can form a coven with two or more other creatures who also have the coven ability. This involves performing an 8-hour ceremony with all prospective coven members. After the coven is formed, each of its members gains elite adjustments, adjusting their levels accordingly. Coven members can sense other members' locations and conditions by spending a single action, which has the concentrate trait, and can sense what another coven member is sensing as a two-action activity, which has the concentrate trait as well.

\n

Covens also grant spells and rituals to their members, but these can be cast only in cooperation between three coven members who are all within 30 feet of one another. A coven member can contribute to a coven spell with a single-action spellcasting activity that has a single verbal component. If two coven members have contributed these actions within the last round, a third member can cast a coven spell on her turn by spending the normal spellcasting actions. A coven can cast its coven spells an unlimited number of times but can cast only one coven spell each round. All covens grant the 8th-rank @UUID[Compendium.pf2e.spells-srd.Item.dN8QBNuTiaBHCKUe]{Baleful Polymorph} spell and all the following spells, which the coven can cast at any rank up to 5th: @UUID[Compendium.pf2e.spells-srd.Item.41TZEjhO6D1nWw2X]{Augury}, @UUID[Compendium.pf2e.spells-srd.Item.vLA0q0WOK2YPuJs6]{Charm}, @UUID[Compendium.pf2e.spells-srd.Item.HXhWYJviWalN5tQ2]{Clairaudience}, @UUID[Compendium.pf2e.spells-srd.Item.zvKWclOZ7A53DObE]{Clairvoyance}, @UUID[Compendium.pf2e.spells-srd.Item.yM3KTTSAIHhyuP14]{Dream Message}, @UUID[Compendium.pf2e.spells-srd.Item.i35dpZFI7jZcRoBo]{Illusory Disguise}, @UUID[Compendium.pf2e.spells-srd.Item.Ucf8eynbZMfUucjE]{Illusory Scene}, @UUID[Compendium.pf2e.spells-srd.Item.Ek5XI0aEdZhBgm21]{Prying Eye}, and @UUID[Compendium.pf2e.spells-srd.Item.FM3SmEW8N1FCRjqt]{Talking Corpse}. Individual creatures with the coven ability also grant additional spells to any coven they join. A coven can also cast the @UUID[Compendium.pf2e.spells-srd.Item.XkDCzMIyc0YOjw05]{Control Weather} ritual, with a DC of 23 instead of the standard DC.

\n

If a coven member leaving the coven or the death of a coven member brings the coven below three members, the remaining members keep their elite adjustments for 24 hours, but without enough members to contribute the necessary actions, they can't cast coven spells.

", + "Darkvision": "

A monster with darkvision can see perfectly well in areas of darkness and dim light, though such vision is in black and white only. Some forms of magical darkness, such as a 4th-rank @UUID[Compendium.pf2e.spells-srd.Item.4GE2ZdODgIQtg51c]{Darkness} spell, block normal darkvision. A monster with @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.4Ho2xMPEC05aSxzr]{Greater Darkvision}, however, can see through even these forms of magical darkness.

", "Disease": "

When a creature is exposed to a monster's disease, it attempts a Fortitude save or succumbs to the disease. The level of a disease is the level of the monster inflicting the disease. The disease follows the rules for afflictions.

", "Engulf": "

The monster Strides up to double its Speed and can move through the spaces of any creatures in its path. Any creature of the monster's size or smaller whose space the monster moves through can attempt a Reflex save with the listed DC to avoid being engulfed. A creature unable to act automatically critically fails this save. If a creature succeeds at its save, it can choose to be either pushed aside (out of the monster's path) or pushed in front of the monster to the end of the monster's movement. The monster can attempt to Engulf the same creature only once in a single use of Engulf. The monster can contain as many creatures as can fit in its space.

\n

A creature that fails its save is pulled into the monster's body. It is @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed}, is @UUID[Compendium.pf2e.conditionitems.Item.xYTAsEpcJE1Ccni3]{Slowed 1}, and has to hold its breath or start suffocating. The creature takes the listed amount of damage when first engulfed and at the end of each of its turns while it's engulfed. An engulfed creature can get free by @UUID[Compendium.pf2e.actionspf2e.Item.SkZAQRkLLkmBQNB9]{Escaping} against the listed escape DC. An engulfed creature can attack the monster engulfing it, but only with unarmed attacks or with weapons of light Bulk or less. The engulfing creature is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} against the attack. If the monster takes piercing or slashing damage equaling or exceeding the listed Rupture value from a single attack or spell, the engulfed creature cuts itself free. A creature that gets free by either method can immediately breathe and exits the swallowing monster's space.

\n

If the monster dies, all creatures it has engulfed are automatically released as the monster's form loses cohesion.

", "FastHealing": "

A monster with this ability regains the given number of Hit Points each round at the beginning of its turn.

", @@ -2533,7 +2549,7 @@ "FrightfulPresence": "

A creature that first enters the area must attempt a Will save.

\n

Regardless of the result of the saving throw, the creature is temporarily immune to this monster's Frightful Presence for 1 minute.

\n
\n

Critical Success The creature is unaffected by the presence.

\n

Success The creature is @UUID[Compendium.pf2e.conditionitems.Item.TBSHQspnbcqxsmjL]{Frightened 1}.

\n

Failure The creature is @UUID[Compendium.pf2e.conditionitems.Item.TBSHQspnbcqxsmjL]{Frightened 2}.

\n

Critical Failure The creature is @UUID[Compendium.pf2e.conditionitems.Item.TBSHQspnbcqxsmjL]{Frightened 4}.

", "Grab": "

Requirements The monster's last action was a success with a Strike that lists Grab in its damage entry, or it has a creature grabbed using this action.

\n
\n

Effect The monster automatically Grabs the target until the end of the monster's next turn. The creature is @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed} by whichever body part the monster attacked with, and that body part can't be used to Strike creatures until the grab is ended. Using Grab extends the duration of the monster's Grab until the end of its next turn for all creatures grabbed by it. A grabbed creature can use the @UUID[Compendium.pf2e.actionspf2e.Item.SkZAQRkLLkmBQNB9]{Escape} action to get out of the grab, and the Grab ends for a grabbed creatures if the monster moves away from it.

", "GreaterConstrict": "

The monster deals the listed amount of damage to any number of creatures @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed} or @UUID[Compendium.pf2e.conditionitems.Item.VcDeM8A5oI6VqhbM]{Restrained} by it. Each of those creatures can attempt a basic Fortitude save with the listed DC. A creature that fails this save falls @UUID[Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf]{Unconscious}, and a creature that succeeds is then temporarily immune to falling unconscious from Greater Constrict for 1 minute.

", - "GreaterDarkvision": "

A creature with greater darkvision can see perfectly well in areas of darkness and dim light, though such vision is in black and white only. Some forms of magical darkness, such as a 4th-level @UUID[Compendium.pf2e.spells-srd.Item.4GE2ZdODgIQtg51c]{Darkness} spell, block normal @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.qCCLZhnp2HhP3Ex6]{Darkvision}. A creature with greater darkvision, however, can see through even these forms of magical darkness.

", + "GreaterDarkvision": "

A creature with greater darkvision can see perfectly well in areas of darkness and dim light, though such vision is in black and white only. Some forms of magical darkness, such as a 4th-rank @UUID[Compendium.pf2e.spells-srd.Item.4GE2ZdODgIQtg51c]{Darkness} spell, block normal @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.qCCLZhnp2HhP3Ex6]{Darkvision}. A creature with greater darkvision, however, can see through even these forms of magical darkness.

", "ImprovedGrab": "

The monster can use @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.Tkd8sH4pwFIPzqTr]{Grab} as a free action triggered by a hit with its initial attack. A monster with Improved Grab still needs to spend an action to extend the duration for creatures it already has @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed}.

", "ImprovedKnockdown": "

The monster can use @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.BCLvAx4Pz4MLa2pu]{Knockdown} as a free action triggered by a hit with its initial attack.

", "ImprovedPush": "

The monster can use @UUID[Compendium.pf2e.bestiary-ability-glossary-srd.Item.t6cx9FOODmeZQNYl]{Push} as a free action triggered by a hit with its initial attack.

", @@ -2788,6 +2804,17 @@ "PropertyRuneLabel2": "Property Rune (2nd)", "PropertyRuneLabel3": "Property Rune (3rd)", "PropertyRuneLabel4": "Property Rune (4th)", + "Publication": { + "Authors": "Author(s)", + "Label": "Publication", + "License": { + "Label": "License", + "OGL": "OGL", + "ORC": "ORC" + }, + "Remaster": "Remaster?", + "Title": "Title" + }, "QuantityLabel": "Quantity", "QuantityShortLabel": "Qty.", "RangePenalty": "Range Penalty", @@ -2845,16 +2872,36 @@ "ResistancesExceptionPlaceholder": "e.g. except silver", "ResistancesLabel": "Resistances", "ResolvePointsShortLabel": "Resolve", - "ResolveTitle": "The amount of resolve points you have", "RestoreSpellTitle": "Restore Spell", "RevertDamage": { "ButtonTooltip": "Undo", - "DamageMessage": "Damage applied to {actor} was reverted", - "HealingMessage": "Healing applied to {actor} was reverted" + "DamageMessage": "Damage applied to {actor} was reverted.", + "HealingMessage": "Healing applied to {actor} was reverted." }, "Roll": { "Add": "Add", "CriticalHit": "Critical Hit", + "Dialog": { + "Check": { + "Substitution": "Substitution", + "Utilize": "Utilize?" + }, + "Damage": { + "BaseDamage": "Base Damage", + "Dice": "{dice} Dice", + "DiceHeader": "Dice", + "DieSizeUpgrade": "Upgrade Die Size", + "ExtraDice": "Extra {dice}", + "Label": "Label", + "None": "None", + "Override": "Override {value}", + "Splash": "{damageType} Splash", + "TitleCritical": "Critical Damage Roll", + "Title": "Damage Roll" + }, + "ShowDefault": "Always Show Dialog", + "ShowDefaultHint": "If enabled, this dialog is always shown unless you hold Shift. If disabled, you can open this dialog by holding Shift." + }, "Fortune": "Fortune", "FortuneTitle": "{title} Fortune", "KeepHigher": "Keep Higher", @@ -2876,12 +2923,11 @@ "SETTINGS": { "Automation": { "ActorsDeadAtZero": { - "Both": "PCs and NPCs", - "Hint": "Upon reaching zero hit points, NPCs are marked as dead.", - "NPCsOnly": "Yes", - "Name": "NPCs Dead at 0 HP", - "Neither": "No", - "PCsOnly": "PCs only" + "Both": "Yes", + "Hint": "Upon reaching zero hit points, actors are marked as dead. For PCs, this only applies to damage that would immediately kill them.", + "NPCsOnly": "NPCS only", + "Name": "Actors Dead at 0 HP", + "Neither": "No" }, "Encumbrance": { "Hint": "Automatically apply the Encumbered condition to creatures carrying more than their respective limits.", @@ -3003,7 +3049,7 @@ }, "Name": "Homebrew Elements", "SpellTraits": { - "Hint": " Traits that can be applied to any spell (e.g., Cursebound, Healing)", + "Hint": "Traits that can be applied to any spell (e.g., Cursebound, Healing)", "Name": "Spell Traits" }, "Tabs": { @@ -3070,11 +3116,6 @@ "Hint": "Use better default token icons", "Name": "Nath Mode" }, - "Player": { - "QuickRolls": { - "DialogHint": "Always show this window before attempting checks." - } - }, "ResetChanges": "Reset Changes", "Settings": "Settings", "Sidebar": { @@ -3115,7 +3156,7 @@ "AutomaticBonus": { "Choices": { "ABPFundamentalPotency": "ABP: Allow Property Runes", - "ABPRulesAsWritten": "ABP: Disallow Property Runes ", + "ABPRulesAsWritten": "ABP: Disallow Property Runes", "noABP": "Do not use ABP" }, "Hint": "Reload Required: Support for Automatic Bonus Progression variant rules, except skills/apex ability.", @@ -3238,32 +3279,12 @@ "SellItemConfirmHeader": "Sell Confirmation", "SellItemQuestion": "Are you sure you want to sell {item}?", "Senses": "Senses", - "SettingsColorBlue": "Bluegray", - "SettingsColorFoundry-UI": "Work in Progress", - "SettingsColorLabel": "UI Theme", - "SettingsColorNotes": "UI themes are most visible on the sidebar and chat cards.", - "SettingsColorOriginal": "Original", - "SettingsColorRed": "Darkred", - "SettingsDataUriHighlightLabel": "Highlight images that use data: URI", - "SettingsDataUriHighlightNotes": "Images that use a data: URI are embedded in the character sheet. This has a negative performance impact on the character. If enabled, such images will be highlighted with a red border to make it easy to find and remove them.
This setting is only active for the current session.", - "SettingsQuickRollsLabel": "Preview D20 Rolls", - "SettingsQuickRollsNotes": "If disabled, dialogs to preview D20 rolls will appear only when a roll button is shift-clicked.", + "SettingsQuickChecksLabel": "Preview D20 Rolls", + "SettingsQuickChecksNotes": "If disabled, dialogs to preview D20 rolls will appear only when a roll button is shift-clicked.", + "SettingsQuickDamageLabel": "Preview Damage Rolls", + "SettingsQuickDamageNotes": "If disabled, dialogs to preview Damage rolls will appear only when a roll button is shift-clicked.", "SheetLabel": "{type} Sheet", - "SheetLabelDataEntry": "{type} Sheet (data entry)", - "SheetLabelNew": "{type} Sheet (preview)", - "SheetLabelOld": "{type} Sheet (legacy)", - "ShieldACBonusTitle": "The AC bonus of your shield (when you use the raise shield action)", - "ShieldBTShortLabel": "BT", - "ShieldBTTitle": "Your shield's Broken Threshold", - "ShieldBrokenThresholdLabel": "Broken Threshold", - "ShieldCurrentLabel": "Shield HP", - "ShieldCurrentTitle": "Your shield's current Hit Points", - "ShieldHardnessLabel": "Hardness", - "ShieldHardnessShortLabel": "H", - "ShieldHardnessTitle": "Shield damage is reduced by this hardness value", "ShieldLabel": "Shield", - "ShieldMaxLabel": "Max", - "ShieldMaxTitle": "Your shield's max Hit Points", "SidebarAppearanceLabel": "Appearance", "Size": "Size", "SizeLabel": "Size", @@ -3307,34 +3328,25 @@ "SkillThievery": "Thievery", "SkillsLabel": "Skills", "Slug": "Slug", - "Source": { - "AuthorLabel": "Author", - "AuthorPlaceholder": "Author", - "Label": "Source", - "SourcePlaceholder": "Book" - }, "SpecialLabel": "Special", "SpecialSensesLabel": "Special Senses", "Speed": "Speed", "SpeedBaseLabel": "Base {type} Speed", "SpeedFeet": "Speed (feet)", "SpeedLabel": "{type} Speed", - "SpeedTitle": "Your character's speed", "SpeedTypes": "Speed Types", "SpeedTypesBurrow": "Burrow", "SpeedTypesClimb": "Climb", "SpeedTypesFly": "Fly", "SpeedTypesLand": "Land", "SpeedTypesSwim": "Swim", - "SpeedTypesTitle": "Alternative movement types", "SpellAbilityLabel": "Key Attribute", "SpellAbilityModLabel": "+ Mod", - "SpellArea": "Area: {areaSize} {areaUnit} {areaType}", + "SpellArea": "Area: {area}", "SpellAttackLabel": "Spell Attack", "SpellAttackWithTradition": "{tradition} Spell Attack", "SpellBasicSaveOption": "Basic", "SpellBrowserSearchHint": "You can search for name or custom attributes. Possible searchable attributes are:
source, spellType, level, school, components, materials, target, range, time, duration, damage, damageType, save, concentration, ritual, ability and classes.
Example: 'fire, damage:d6' to show all spells that have fire in their name and a d6 in the damage", - "SpellCantripLabel": "Cantrip", "SpellCastingFormat": "{traditionSpells} {preparationType} Spells", "SpellCategoryFocus": "Focus", "SpellCategoryFocusCantrip": "Focus Cantrip", @@ -3362,21 +3374,9 @@ "SpellFocusLabel": "Focus", "SpellLabel": "Spell", "SpellLabelPlural": "Spells", - "SpellLevel": "{level} Level", - "SpellLevel1": "1st Level", - "SpellLevel10": "10th Level", - "SpellLevel2": "2nd Level", - "SpellLevel3": "3rd Level", - "SpellLevel4": "4th Level", - "SpellLevel5": "5th Level", - "SpellLevel6": "6th Level", - "SpellLevel7": "7th Level", - "SpellLevel8": "8th Level", - "SpellLevel9": "9th Level", "SpellLevelBase": "Base: {level}", "SpellLevelHeightened": "Heightened: +{heightened}", - "SpellLevelLabel": "Spell Level", - "SpellNonCantripLabel": "Non-Cantrip", + "SpellLevelLabel": "Spell Rank", "SpellPreparedLabel": "Prepared", "SpellPrimaryCheckLabel": "Primary Check", "SpellRangeLabel": "Range", @@ -3415,7 +3415,7 @@ "SpellUsesLabel": "Uses", "SpellcastingSettings": { "AutoHeightenDefault": "Default (Use Actor Level)", - "AutoHeightenLabel": "Auto Heighten Level", + "AutoHeightenLabel": "Auto Heighten Rank", "Title": "Spellcasting Settings" }, "SpellcastingTypeLabel": "Spellcasting Type", @@ -3485,7 +3485,6 @@ "TabPathfinderSociety": "Pathfinder Society", "TabSkillsLabel": "Proficiencies", "TabSpellbookLabel": "Spellcasting", - "TempHPTitle": "The amount of temporary hit points you have", "TempHitPointsShortLabel": "Temp HP", "TemplateLabel": "{size}-{unit} {shape}", "TemporaryItemToolTip": "This item is temporary and will expire after a duration or during daily preparations. It has no value and cannot be sold.", @@ -3504,7 +3503,7 @@ }, "ToggleEffectUnidentified": "Toggle Whether Effect Is Unidentified", "ToggleSignatureSpellTitle": "Toggle Signature Spell", - "ToggleSlotlessSpellLevelsTitle": "Toggle visibility of spell levels without slots", + "ToggleSlotlessSpellLevelsTitle": "Toggle visibility of spell ranks without slots", "ToggleSpellVisibilityTitle": "Spell Preparation", "ToggleUnreadyStrikes": "Toggle unequipped weapons", "ToggleWithName": "Toggle: {property}", @@ -3836,7 +3835,7 @@ "TraitDescriptionFighter": "This indicates abilities from the fighter class.", "TraitDescriptionFigurehead": "While many ships are adorned with decorative carvings, daring crews sometimes procure magical figureheads for their vessels.", "TraitDescriptionFinesse": "You can use your Dexterity modifier instead of your Strength modifier on attack rolls using this melee weapon. You still use your Strength modifier when calculating damage.", - "TraitDescriptionFinisher": " Finishers are spectacular finishing moves. You can use a finisher only if you have panache, and you lose your panache immediately after performing a finisher. Once you use a finisher, you can't use actions that have the attack trait for the rest of your turn. Some finisher actions also grant an effect on a failure. If your finisher succeeds, you can choose to apply the failure effect instead.", + "TraitDescriptionFinisher": "Finishers are spectacular finishing moves. You can use a finisher only if you have panache, and you lose your panache immediately after performing a finisher. Once you use a finisher, you can't use actions that have the attack trait for the rest of your turn. Some finisher actions also grant an effect on a failure. If your finisher succeeds, you can choose to apply the failure effect instead.", "TraitDescriptionFinite": "Planes with this trait consist of a limited amount of space.", "TraitDescriptionFire": "Effects with the fire trait deal fire damage or either conjure or manipulate fire. Those that manipulate fire have no effect in an area without fire. Creatures with this trait consist primarily of fire or have a magical connection to that element.", "TraitDescriptionFleshwarp": "A humanoid transformed so completely by outside forces that they are now a unique ancestry.", @@ -3881,7 +3880,7 @@ "TraitDescriptionIfrit": "A type of geniekin descended from a being from the Plane of Fire.", "TraitDescriptionIllusion": "Effects and magic items with this trait are associated with the illusion school of magic, typically involving false sensory stimuli.", "TraitDescriptionImpulse": "The primary magical actions kineticists use are called impulses. You can use an impulse only if your kinetic aura is active and channeling that element, and only if you have a hand free to shape the elemental flow. The impulse trait means the action has the concentrate trait unless another ability changes this. If an impulse allows you to choose an element, you can choose any element you're channeling, and the impulse gains that element's trait.", - "TraitDescriptionIncapacitation": "An ability with this trait can take a character completely out of the fight or even kill them, and it's harder to use on a more powerful character. If a spell has the incapacitation trait, any creature of more than twice the spell's level treats the result of their check to prevent being incapacitated by the spell as one degree of success better, or the result of any check the spellcaster made to incapacitate them as one degree of success worse. If any other effect has the incapacitation trait, a creature of higher level than the item, creature, or hazard generating the effect gains the same benefits.", + "TraitDescriptionIncapacitation": "An ability with this trait can take a character completely out of the fight or even kill them, and it's harder to use on a more powerful character. If a spell has the incapacitation trait, any creature of more than twice the spell's rank treats the result of their check to prevent being incapacitated by the spell as one degree of success better, or the result of any check the spellcaster made to incapacitate them as one degree of success worse. If any other effect has the incapacitation trait, a creature of higher level than the item, creature, or hazard generating the effect gains the same benefits.", "TraitDescriptionIncarnate": "A spell with the incarnate trait is similar in theme to spells that summon creatures, but it doesn't conjure a minion with the summoned trait. Instead, when summoned, the incarnate creature takes its Arrive action when you finish Casting the Spell. At the end of your next turn, the incarnate creature can either Step, Stride, or take the action for another movement type it has (such as Climb or Burrow), and then takes its Depart action. The spell then ends. The names of specific Arrive and Depart actions are listed in italics after the word “Arrive” or “Depart” respectively, along with any traits. A creature summoned by an incarnate spell acts in your interests, directs its effects away from you and your allies as much as possible, and might listen to your requests, but ultimately makes its own decisions. If the spell indicates that the incarnate makes a decision, the GM determines what the incarnate would do. It might even become more inclined to do precisely as you wish over multiple summonings. The incarnate is not fully a creature. It can't take any other actions, nor can it be targeted or harmed by Strikes, spells, or other effects unless they would be able to target or end a spell effect (such as dispel magic). It has a size for the purposes of determining its placement for effects, but it doesn't block movement. If applicable, its effects use your spell DCs and spell attack roll modifier.", "TraitDescriptionIncorporeal": "An incorporeal creature or object has no physical form. It can pass through solid objects, including walls. When inside an object, an incorporeal creature can't perceive, attack, or interact with anything outside the object, and if it starts its turn in an object, it is slowed 1. Corporeal creatures can pass through an incorporeal creature, but they can't end their movement in its space. An incorporeal creature can't attempt Strength-based checks against physical creatures or objects-only against incorporeal ones-unless those objects have the ghost touch property rune. Likewise, a corporeal creature can't attempt Strength-based checks against incorporeal creatures or objects. Incorporeal creatures usually have immunity to effects or conditions that require a physical body, like disease, poison, and precision damage. They usually have resistance against all damage (except force damage and damage from Strikes with the ghost touch property rune), with double the resistance against non-magical damage.", "TraitDescriptionInfused": "You created an alchemical item with the infused trait using your infused reagents, and it has a limited time before it becomes inert. Any nonpermanent effects from your infused alchemical items, with the exception of afflictions such as slow-acting poisons, end when you make your daily preparations again.", @@ -3934,6 +3933,7 @@ "TraitDescriptionMutagen": "An elixir with the mutagen trait temporarily transmogrifies the subject's body and alters its mind. A mutagen always conveys one or more beneficial effects paired with one or more detrimental effects. Mutagens are polymorph effects, meaning you can benefit from only one at a time.", "TraitDescriptionNagaji": "A traditionalist ancestry with reptilian features and serpentine heads.", "TraitDescriptionNecromancy": "Effects and magic items with this trait are associated with the necromancy school of magic, typically involving forces of life and death.", + "TraitDescriptionNindoru": "Nindorus are chaotic evil fiends that rise from corruptions to the cycle of reincarnating souls and live on the Material Plane. Although they often have elements in their appearance that make them seem undead, they're actually living beings. Most nindorus have darkvision, are immune to death effects, have weakness to silver, and possess the power to manifest objects or creatures from their thoughts.", "TraitDescriptionNoisy": "This armor is loud and likely to alert others to your presence when you're using the Avoid Notice exploration activity. The armor's check penalty applies to Stealth checks even if you meet the required Strength score.", "TraitDescriptionNone": "This trait has no description.", "TraitDescriptionNonlethal": "Attacks with this weapon are nonlethal, and are used to knock creatures unconscious instead of kill them. You can use a nonlethal weapon to make a lethal attack with a -2 circumstance penalty.", @@ -4012,7 +4012,7 @@ "TraitDescriptionStructure": "An item with the structure trait creates a magical building or other structure when activated. The item must be activated on a plot of land free of other structures. The structure adapts to the natural terrain, adopting the structural requirements for being built there. The structure adjusts around small features such as ponds or spires of rock, but it can't be created on water or other nonsolid surfaces. If activated on snow, sand dunes, or other soft surfaces with a solid surface underneath, the structure's foundation (if any) reaches the solid ground. If an item with this trait is activated on a solid but unstable surface, such as a swamp or an area plagued by tremors, roll a @Check[type:flat|dc:3] each day; on a failure, the structure begins to sink or collapse. The structure doesn't harm creatures within the area when it appears, and it can't be created within a crowd or in a densely populated area. Any creature inadvertently caught inside the structure when the item is activated ends up unharmed inside the complete structure and always has a clear path of escape. A creature inside the structure when the activation ends isn't harmed, and it lands harmlessly on the ground if it was on an upper level of the structure.", "TraitDescriptionSubjectiveGravity": "On planes with this trait, all bodies of mass can be centers of gravity with the same amount of force, but only if a non-mindless creature wills it.", "TraitDescriptionSuli": "Sulis are planar scions descended from jann.", - "TraitDescriptionSummoned": "A creature called by a spell or effect gains the summoned trait. A summoned creature can't summon other creatures, create things of value, or cast spells that require a cost. It has the minion trait. If it tries to Cast a Spell of equal or higher level than the spell that summoned it, it overpowers the summoning magic, causing its own spell to fail and the summon spell to end. Otherwise, the summoned creature uses the standard abilities for a creature of its kind. It generally attacks your enemies to the best of its ability. If you can communicate with it, you can attempt to command it, but the GM determines the degree to which it follows your commands. Immediately when you finish Casting the Spell, the summoned creature uses its 2 actions for that turn. A spawn or other creature generated from a summoned creature returns to its unaltered state (usually a corpse in the case of spawn) once the summoned creature is gone. If it's unclear what this state would be, the GM decides. Summoned creatures can be banished by various spells and effects. They are automatically banished if reduced to 0 Hit Points or if the spell that called them ends.", + "TraitDescriptionSummoned": "A creature called by a spell or effect gains the summoned trait. A summoned creature can't summon other creatures, create things of value, or cast spells that require a cost. It has the minion trait. If it tries to Cast a Spell of equal or higher rank than the spell that summoned it, it overpowers the summoning magic, causing its own spell to fail and the summon spell to end. Otherwise, the summoned creature uses the standard abilities for a creature of its kind. It generally attacks your enemies to the best of its ability. If you can communicate with it, you can attempt to command it, but the GM determines the degree to which it follows your commands. Immediately when you finish Casting the Spell, the summoned creature uses its 2 actions for that turn. A spawn or other creature generated from a summoned creature returns to its unaltered state (usually a corpse in the case of spawn) once the summoned creature is gone. If it's unclear what this state would be, the GM decides. Summoned creatures can be banished by various spells and effects. They are automatically banished if reduced to 0 Hit Points or if the spell that called them ends.", "TraitDescriptionSummoner": "This indicates abilities from the Summoner class.", "TraitDescriptionSwashbuckler": "This indicates abilities from the Swashbuckler class.", "TraitDescriptionSweep": "This weapon makes wide sweeping or spinning attacks, making it easier to attack multiple enemies. When you attack with this weapon, you gain a +1 circumstance bonus to your attack roll if you already attempted to attack a different target this turn using this weapon.", @@ -4021,6 +4021,7 @@ "TraitDescriptionTalos": "Taloses are planar scions descended from zuhras.", "TraitDescriptionTandem": "Actions with this trait involve you and your eidolon acting in concert. You can't use a tandem action if either you or your eidolon can't act, if you haven't Manifested your Eidolon, or if you've Manifested your Eidolon in a way where it isn't a separate entity (such as with the Meld into Eidolon feat). Tandem actions often let both you and your eidolon take separate actions, but these must be actions taken separately by you and your eidolon; you can't use a tandem action to take another tandem action.", "TraitDescriptionTattoo": "A tattoo is a type of item that is drawn or cut into a creature's skin and usually takes the form of images or symbols.", + "TraitDescriptionTea": "

Magic tea is a type of potion. It activates when you drink it, which uses it up. Magic tea has the potion and tea traits. When you craft a dose of magic tea, the raw materials you supply are in the form of unusual and costly tea leaves. The process of crafting magic tea includes infusing the leaves with magical reagents, purifying the water, and steeping the tea in the water, resulting in what's essentially a particularly delicious-tasting potion. You can activate magic tea with an Interact action as you drink it or feed it to another creature, as if it were a potion. You can also activate magic tea with a 10-minute activity that requires sterling tea ware (these artisan's tools can be shared by up to four people who take this activity simultaneously) to prepare the tea and then consume it or present it to someone during a short tea ceremony, after which the magic tea's effects begin; activating magic tea in this way enhances its effect, as detailed in each entry's Tea Ceremony.

Once you drink a dose of magic tea, you're temporarily immune to that particular type of magic tea for 24 hours.

", "TraitDescriptionTech": "Items with this trait are associated with the technology of Numeria.", "TraitDescriptionTelepathy": "A creature with telepathy can communicate mentally with creatures. This doesn't give any special access to their thoughts, and communicates no more information than normal speech would.", "TraitDescriptionTeleportation": "Teleportation effects allow you to instantaneously move from one point in space to another. Teleportation does not usually trigger reactions based on movement.", @@ -4270,6 +4271,7 @@ "TraitMutant": "Mutant", "TraitNagaji": "Nagaji", "TraitNecromancy": "Necromancy", + "TraitNindoru": "Nindoru", "TraitNoisy": "Noisy", "TraitNonlethal": "Nonlethal", "TraitNymph": "Nymph", @@ -4487,6 +4489,7 @@ "TraitTanggal": "Tanggal", "TraitTattoo": "Tattoo", "TraitTattooedOnTheBody": "Tattooed on the Body", + "TraitTea": "Tea", "TraitTech": "Tech", "TraitTechnological": "Technological", "TraitTelepathy": "Telepathy", @@ -4673,8 +4676,8 @@ }, "errorTargetToken": "Select at least one valid token.", "noDamageInfoForOutcome": "No damage information for outcome {outcome}.", - "shiftModifyDamageLabel": "Adjust Damage/Healing", - "shiftModifyDamageTitle": "Adjust the rolled damage/healing" + "shiftModifyDamageLabel": "Amount", + "shiftModifyDamageTitle": "Adjust Damage/Healing" }, "UUID": { "Label": "UUID", @@ -5138,8 +5141,8 @@ "greaterAnchoring": { "Name": "Greater Anchoring", "Note": { - "criticalSuccess": "When you critically hit a target with a weapon with the anchoring rune, the weapon casts 8th-level @UUID[Compendium.pf2e.spells-srd.Item.ksLCg62cLOojw3gN]{Dimensional Anchor} on the target (@Check[type:will|dc:38|name:Greater Anchoring Rune], counteract modifier [[/r 1d20+28 #Greater Anchoring Rune Counteract Check]]{+28}), except that if the target critically succeeds at its Will save, instead of having no effect, the dimensional anchor lasts for 1 round.", - "success": "When you hit a target with the weapon but don't critically hit, the target is affected by 4th-level @UUID[Compendium.pf2e.spells-srd.Item.ksLCg62cLOojw3gN]{Dimensional Anchor} for 1 round without a save (counteract modifier [[/r 1d20+28 #Greater Anchoring Rune Counteract Check]]{+28})." + "criticalSuccess": "When you critically hit a target with a weapon with the anchoring rune, the weapon casts 8th-rank @UUID[Compendium.pf2e.spells-srd.Item.ksLCg62cLOojw3gN]{Dimensional Anchor} on the target (@Check[type:will|dc:38|name:Greater Anchoring Rune], counteract modifier [[/r 1d20+28 #Greater Anchoring Rune Counteract Check]]{+28}), except that if the target critically succeeds at its Will save, instead of having no effect, the dimensional anchor lasts for 1 round.", + "success": "When you hit a target with the weapon but don't critically hit, the target is affected by 4th-rank @UUID[Compendium.pf2e.spells-srd.Item.ksLCg62cLOojw3gN]{Dimensional Anchor} for 1 round without a save (counteract modifier [[/r 1d20+28 #Greater Anchoring Rune Counteract Check]]{+28})." } }, "greaterAshen": { @@ -5289,8 +5292,7 @@ "Name": "Impossible" }, "keen": { - "Name": "Keen", - "Note": "Attacks with this weapon are a critical hit on a 19 on the die as long as that result is a success. This property has no effect on a 19 if the result would be a failure." + "Name": "Keen" }, "kinWarding": { "Name": "Kin-Warding" @@ -5405,7 +5407,6 @@ "WeaponTypeSpecial": "Other Weapons", "WeaponTypeUnarmed": "Unarmed Attack", "Weight": "Weight", - "WeightTitle": "Your weight", "WorldClock": { "AD": { "Era": "AD" @@ -5780,7 +5781,7 @@ }, "ui": { "armorEquipped": "Toggle wearing your equipment", - "equipmentInvested": "Toggle investing your equipment", + "equipmentInvested": "Toggle Investment", "sell": "Sell", "weaponEquipped": "Toggle holding your weapon" }, diff --git a/Data/systems/pf2e/lang/re-en.json b/Data/systems/pf2e/lang/re-en.json index 0367dc4a..79f7ba6d 100644 --- a/Data/systems/pf2e/lang/re-en.json +++ b/Data/systems/pf2e/lang/re-en.json @@ -96,6 +96,7 @@ "Beak": "Beak", "Beard": "Beard", "Bite": "Bite", + "Blade": "Blade", "Body": "Body", "BoneDart": "Bone Dart", "BoneShard": "Bone Shard", @@ -118,12 +119,14 @@ "Leg": "Leg", "LightningLash": "Lightning Lash", "Mandibles": "Mandibles", + "MetalShard": "Metal Shard", "Moonbeam": "Moonbeam", "PiercingHymn": "Piercing Hymn", "Pincer": "Pincer", "Pseudopod": "Pseudopod", "Quill": "Quill", "Rock": "Rock", + "Seed": "Seed", "Spikes": "Spikes", "Spine": "Spine", "Stinger": "Stinger", @@ -560,7 +563,11 @@ "Custom": { "AdamantineBludgeoning": "adamantine bludgeoning", "AllDamageFromUndead": "all damage from undead", + "AllMagicalDamage": "all magical damage", + "AllNonMagicalDamage": "all non-magical damage", + "AttacksWaterCreatures": "attacks by water creatures", "ColdIronBludgeoning": "cold iron bludgeoning", + "ImpulseFireFrom": "impulse fire from {origin}", "MagicalBludgeoning": "magical bludgeoning", "MagicalColdIron": "magical cold iron", "MagicalDarkwood": "magical darkwood", @@ -568,6 +575,7 @@ "MagicalSilverWeapons": "magical silver weapons", "MagicalWeaponsBrightLight": "magical weapons shedding bright light", "NonWeapons": "non-weapons", + "PersistentPoison": "persistent poison", "PhysicalRangedAttacks": "physical ranged attacks", "RangedWeaponAttacks": "ranged weapon attacks" } @@ -647,6 +655,9 @@ "AC": "Designated Prey attacks the Duskwalker", "Checks": "Duskwalker rolls checks against his Designated Prey" }, + "FacetboundCascader": { + "EnergyCharge": "Energy Charge" + }, "Falrok": { "LazuriteTerrainSwitch": "In lazurite infused terrain" }, @@ -704,6 +715,16 @@ "Necrohulk": { "AlchemicalCartridgeRuptured": "Alchemical Cartridge Ruptured" }, + "Nindoru": { + "Meokdan": { + "BoneClub": { + "Label": "Manifest Bone Club", + "New": "New", + "Shattered": "Shattered", + "ShatteredLabel": "Shattered Bone Club" + } + } + }, "PaleStranger": { "TargetMurderedPaleStranger": "Target Murdered Pale Stranger", "TargetNeverKilled": "Target has Never Killed" @@ -803,7 +824,7 @@ "NonTrivialEncounter": "In a non-trivial encounter" }, "Bones": { - "MajorUpgrade": " When you roll a critical failure at a saving throw against a disease, poison or death effect, you get a failure instead.", + "MajorUpgrade": "When you roll a critical failure at a saving throw against a disease, poison or death effect, you get a failure instead.", "ModerateUpgrade": "When you roll a success at a saving throw against a disease, poison or death effect, you get a critical success instead." }, "Label": { @@ -1918,6 +1939,10 @@ "ScapularOfShields": { "CriticalImmunityLabel": "Activate Scapular of Shields to gain critical immunity.", "ResistAllLabel": "Activate Scapular of Shields to gain resistance to all damage." + }, + "Sparkler": { + "CriticalHitNote": "On a critical hit, you cause the target to become @UUID[Compendium.pf2e.conditionitems.Item.TkIyaNPgTZFBCCuh]{Dazzled} for 1 round.", + "StrikeLabel": "Sparkler" } }, "ExemplaryFinisher": { @@ -2028,6 +2053,7 @@ "success": "You can end your satiation to make the target @UUID[Compendium.pf2e.conditionitems.Item.fesd1n5eVhpCSS18]{Sickened 1}" } }, + "GhostScarfLit": "Ghost Scarf is shedding light", "Gnome": { "GrimInsight": { "SaveNote": "When you roll a success on a saving throw against a fear effect, you get a critical success instead, and the source of the fear effect is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} to you until the end of your next turn." @@ -2136,7 +2162,7 @@ "Prompt": "Select a weapon to become trained in." }, "WitchWarden": { - "SaveNote": " If you roll a success on a saving throw against a curse or a spell cast by a witch or hag, you get a critical success instead." + "SaveNote": "If you roll a success on a saving throw against a curse or a spell cast by a witch or hag, you get a critical success instead." } }, "HuntPrey": { @@ -2152,6 +2178,9 @@ "MagmaSpikeCriticalSpecialization": "Instead of the normal critical specialization effect, the target takes [[/r 1d6[persistent,fire]]] damage; you gain a bonus on this persistent damage equal to your item bonus to attack rolls on unarmed attacks." } }, + "InCombat": { + "ToggleLabel": "In Combat" + }, "Inventor": { "Innovation": { "Armor": { @@ -2204,6 +2233,9 @@ }, "PursueALead": { "Label": "Investigating a designated subject with Pursue a Lead" + }, + "SharedStratagem": { + "Note": "The creature you hit is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} to a designated ally on the next attack the ally makes against the creature before the start of your next turn." } }, "Kineticist": { @@ -2770,7 +2802,11 @@ "AutomaticPower": "Automatic Power Driver Dynamo", "Label": "Sterling Dynamo", "ManualPercussive": "Manual Percussive Striker Dynamo", - "ManualPower": "Manual Power Driver Dynamo" + "ManualPower": "Manual Power Driver Dynamo", + "StasianSmash": { + "CriticalFailureText": "If you critically fail your dynamo Strike, you take @Damage[1d12[electricity]] damage.", + "SuccessText": "On a success, the Strike deals an additional 1d12 electricity damage to the target, as well as @Damage[(ternary(gte(@actor.level,18),2,1))d4[electricity]] damage to up to two other foes within 10 feet as sparks leap across the gaps." + } }, "SubstituteRoll": { "Assurance": "Assurance", @@ -2929,6 +2965,9 @@ "WardingRune": { "Prompt": "Select a school of magic other than divination." }, + "Weapon": { + "Metal": "Using a metal weapon" + }, "WeaponInfusion": { "Melee": "Melee Infusion", "Ranged": "Ranged Infusion" diff --git a/Data/systems/pf2e/packs/abomination-vaults-bestiary/000005.ldb b/Data/systems/pf2e/packs/abomination-vaults-bestiary/000005.ldb index 4c1a53cb..51fc95c4 100644 Binary files a/Data/systems/pf2e/packs/abomination-vaults-bestiary/000005.ldb and b/Data/systems/pf2e/packs/abomination-vaults-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG b/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG index 9e9ee7cb..0c91ff6d 100644 --- a/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG +++ b/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.180050 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.185298 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.202851 ffff87fff0a0 Level-0 table #5: 1387633 bytes OK -2023/10/23-05:12:16.207585 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.208074 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:58.996887 ffff8929e0a0 Recovering log #3 +2023/11/12-06:19:59.004516 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:19:59.022273 ffff8929e0a0 Level-0 table #5: 1386718 bytes OK +2023/11/12-06:19:59.027242 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:19:59.027702 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG.old b/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG.old index bd9f71c6..f62a7873 100644 --- a/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/abomination-vaults-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.526917 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.523774 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/abomination-vaults-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/abomination-vaults-bestiary/MANIFEST-000004 index 2bb5c48f..e838cf8b 100644 Binary files a/Data/systems/pf2e/packs/abomination-vaults-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/abomination-vaults-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/action-macros/LOG b/Data/systems/pf2e/packs/action-macros/LOG index adea8ba2..448d16e5 100644 --- a/Data/systems/pf2e/packs/action-macros/LOG +++ b/Data/systems/pf2e/packs/action-macros/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.568109 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.568175 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.570280 ffff877ef0a0 Level-0 table #5: 7022 bytes OK -2023/10/23-05:12:18.575078 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.575103 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.469136 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.469200 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.471200 ffff7bfff0a0 Level-0 table #5: 7022 bytes OK +2023/11/12-06:20:01.475442 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.475466 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/action-macros/LOG.old b/Data/systems/pf2e/packs/action-macros/LOG.old index 3c605f0f..b2aba426 100644 --- a/Data/systems/pf2e/packs/action-macros/LOG.old +++ b/Data/systems/pf2e/packs/action-macros/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.527398 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.523774 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/actions/000005.ldb b/Data/systems/pf2e/packs/actions/000005.ldb index 743a79f1..1423cfaa 100644 Binary files a/Data/systems/pf2e/packs/actions/000005.ldb and b/Data/systems/pf2e/packs/actions/000005.ldb differ diff --git a/Data/systems/pf2e/packs/actions/LOG b/Data/systems/pf2e/packs/actions/LOG index cb1f2721..057fae9f 100644 --- a/Data/systems/pf2e/packs/actions/LOG +++ b/Data/systems/pf2e/packs/actions/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.908408 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.909312 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.914373 ffff86fdf0a0 Level-0 table #5: 276012 bytes OK -2023/10/23-05:12:17.918875 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.918987 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.797091 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.797962 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.803370 ffff8929e0a0 Level-0 table #5: 275735 bytes OK +2023/11/12-06:20:00.807855 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.807964 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/actions/LOG.old b/Data/systems/pf2e/packs/actions/LOG.old index 8e661d80..3cf9e931 100644 --- a/Data/systems/pf2e/packs/actions/LOG.old +++ b/Data/systems/pf2e/packs/actions/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.526703 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.524407 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/actions/MANIFEST-000004 b/Data/systems/pf2e/packs/actions/MANIFEST-000004 index 79231762..81518cdd 100644 Binary files a/Data/systems/pf2e/packs/actions/MANIFEST-000004 and b/Data/systems/pf2e/packs/actions/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/adventure-specific-actions/000005.ldb b/Data/systems/pf2e/packs/adventure-specific-actions/000005.ldb index 9fa5ca56..8db31a59 100644 Binary files a/Data/systems/pf2e/packs/adventure-specific-actions/000005.ldb and b/Data/systems/pf2e/packs/adventure-specific-actions/000005.ldb differ diff --git a/Data/systems/pf2e/packs/adventure-specific-actions/LOG b/Data/systems/pf2e/packs/adventure-specific-actions/LOG index eed7b004..86c9995d 100644 --- a/Data/systems/pf2e/packs/adventure-specific-actions/LOG +++ b/Data/systems/pf2e/packs/adventure-specific-actions/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.605722 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.606071 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.609602 ffff877ef0a0 Level-0 table #5: 113628 bytes OK -2023/10/23-05:12:18.614608 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.614665 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.505140 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.505479 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.508843 ffff7bfff0a0 Level-0 table #5: 113625 bytes OK +2023/11/12-06:20:01.513351 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.513409 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/adventure-specific-actions/LOG.old b/Data/systems/pf2e/packs/adventure-specific-actions/LOG.old index 1b9367eb..254036fe 100644 --- a/Data/systems/pf2e/packs/adventure-specific-actions/LOG.old +++ b/Data/systems/pf2e/packs/adventure-specific-actions/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.527388 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.524457 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/adventure-specific-actions/MANIFEST-000004 b/Data/systems/pf2e/packs/adventure-specific-actions/MANIFEST-000004 index bf3d9b12..ee9fa534 100644 Binary files a/Data/systems/pf2e/packs/adventure-specific-actions/MANIFEST-000004 and b/Data/systems/pf2e/packs/adventure-specific-actions/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/age-of-ashes-bestiary/000005.ldb b/Data/systems/pf2e/packs/age-of-ashes-bestiary/000005.ldb index 607e5f1a..7d262161 100644 Binary files a/Data/systems/pf2e/packs/age-of-ashes-bestiary/000005.ldb and b/Data/systems/pf2e/packs/age-of-ashes-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG b/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG index 86861467..bc249d5a 100644 --- a/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG +++ b/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.245119 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:16.250889 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:16.274738 ffff877ef0a0 Level-0 table #5: 1594481 bytes OK -2023/10/23-05:12:16.279601 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:16.280149 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:19:59.062296 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:19:59.074310 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:19:59.100453 ffff7bfff0a0 Level-0 table #5: 1588097 bytes OK +2023/11/12-06:19:59.105251 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:19:59.105743 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG.old b/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG.old index 1236c24c..d83d4ddf 100644 --- a/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/age-of-ashes-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.529648 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.526561 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/age-of-ashes-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/age-of-ashes-bestiary/MANIFEST-000004 index 7abc3f73..7c5f6437 100644 Binary files a/Data/systems/pf2e/packs/age-of-ashes-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/age-of-ashes-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/000005.ldb b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/000005.ldb index 44736f4b..c56d36f5 100644 Binary files a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/000005.ldb and b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG index 6601f795..5cf6dc65 100644 --- a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG +++ b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.297304 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:16.304050 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:16.329495 ffff86fdf0a0 Level-0 table #5: 1905989 bytes OK -2023/10/23-05:12:16.334637 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:16.335281 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:19:59.123307 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.132859 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.157795 ffff88a8e0a0 Level-0 table #5: 1906793 bytes OK +2023/11/12-06:19:59.162353 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.163077 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG.old b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG.old index a83f90bd..725cea7a 100644 --- a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.531805 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.526742 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/MANIFEST-000004 index 30c16e52..e946407e 100644 Binary files a/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/agents-of-edgewatch-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/ancestries/000005.ldb b/Data/systems/pf2e/packs/ancestries/000005.ldb index 018e7461..2235bfee 100644 Binary files a/Data/systems/pf2e/packs/ancestries/000005.ldb and b/Data/systems/pf2e/packs/ancestries/000005.ldb differ diff --git a/Data/systems/pf2e/packs/ancestries/LOG b/Data/systems/pf2e/packs/ancestries/LOG index f96d9250..21d6c8c0 100644 --- a/Data/systems/pf2e/packs/ancestries/LOG +++ b/Data/systems/pf2e/packs/ancestries/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.929146 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.929266 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.931528 ffff877ef0a0 Level-0 table #5: 28101 bytes OK -2023/10/23-05:12:17.936390 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.936424 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.811947 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.812072 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.814535 ffff89aae0a0 Level-0 table #5: 28085 bytes OK +2023/11/12-06:20:00.819287 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.819321 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/ancestries/LOG.old b/Data/systems/pf2e/packs/ancestries/LOG.old index 040de3e5..23dc5993 100644 --- a/Data/systems/pf2e/packs/ancestries/LOG.old +++ b/Data/systems/pf2e/packs/ancestries/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.529730 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.527501 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/ancestries/MANIFEST-000004 b/Data/systems/pf2e/packs/ancestries/MANIFEST-000004 index ced2ea8e..3c869d97 100644 Binary files a/Data/systems/pf2e/packs/ancestries/MANIFEST-000004 and b/Data/systems/pf2e/packs/ancestries/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/ancestryfeatures/000005.ldb b/Data/systems/pf2e/packs/ancestryfeatures/000005.ldb index 4396f93d..671c757e 100644 Binary files a/Data/systems/pf2e/packs/ancestryfeatures/000005.ldb and b/Data/systems/pf2e/packs/ancestryfeatures/000005.ldb differ diff --git a/Data/systems/pf2e/packs/ancestryfeatures/LOG b/Data/systems/pf2e/packs/ancestryfeatures/LOG index 97eb9a52..4d394409 100644 --- a/Data/systems/pf2e/packs/ancestryfeatures/LOG +++ b/Data/systems/pf2e/packs/ancestryfeatures/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.938350 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.938454 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.941029 ffff86fdf0a0 Level-0 table #5: 23680 bytes OK -2023/10/23-05:12:17.946626 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.946659 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.821345 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.821445 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.823814 ffff8929e0a0 Level-0 table #5: 23661 bytes OK +2023/11/12-06:20:00.828555 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.828585 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/ancestryfeatures/LOG.old b/Data/systems/pf2e/packs/ancestryfeatures/LOG.old index 67c8e503..d7c7adef 100644 --- a/Data/systems/pf2e/packs/ancestryfeatures/LOG.old +++ b/Data/systems/pf2e/packs/ancestryfeatures/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.530243 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.527369 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/ancestryfeatures/MANIFEST-000004 b/Data/systems/pf2e/packs/ancestryfeatures/MANIFEST-000004 index c3109b3e..05bf3efe 100644 Binary files a/Data/systems/pf2e/packs/ancestryfeatures/MANIFEST-000004 and b/Data/systems/pf2e/packs/ancestryfeatures/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/backgrounds/000005.ldb b/Data/systems/pf2e/packs/backgrounds/000005.ldb index 9f0f221c..8101ab05 100644 Binary files a/Data/systems/pf2e/packs/backgrounds/000005.ldb and b/Data/systems/pf2e/packs/backgrounds/000005.ldb differ diff --git a/Data/systems/pf2e/packs/backgrounds/LOG b/Data/systems/pf2e/packs/backgrounds/LOG index 8d38d84d..e5287af5 100644 --- a/Data/systems/pf2e/packs/backgrounds/LOG +++ b/Data/systems/pf2e/packs/backgrounds/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.948605 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.949766 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.958359 ffff877ef0a0 Level-0 table #5: 370183 bytes OK -2023/10/23-05:12:17.963285 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.963428 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.832219 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.833400 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.840048 ffff89aae0a0 Level-0 table #5: 369912 bytes OK +2023/11/12-06:20:00.844286 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.844427 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/backgrounds/LOG.old b/Data/systems/pf2e/packs/backgrounds/LOG.old index bf479c6a..c66608d2 100644 --- a/Data/systems/pf2e/packs/backgrounds/LOG.old +++ b/Data/systems/pf2e/packs/backgrounds/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.533383 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.529457 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/backgrounds/MANIFEST-000004 b/Data/systems/pf2e/packs/backgrounds/MANIFEST-000004 index 74d52b73..13e8f4dc 100644 Binary files a/Data/systems/pf2e/packs/backgrounds/MANIFEST-000004 and b/Data/systems/pf2e/packs/backgrounds/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/000005.ldb b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/000005.ldb index 43c494d3..3583cccd 100644 Binary files a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/000005.ldb and b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/000005.ldb differ diff --git a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG index c48b66d5..22b7daba 100644 --- a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG +++ b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.583790 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.583875 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.586142 ffff877ef0a0 Level-0 table #5: 11536 bytes OK -2023/10/23-05:12:18.590870 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.590899 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.484277 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.484363 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.486430 ffff7bfff0a0 Level-0 table #5: 11525 bytes OK +2023/11/12-06:20:01.490687 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.490714 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG.old b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG.old index f3de4c9c..24f93620 100644 --- a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG.old +++ b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.532807 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.529802 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/MANIFEST-000004 b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/MANIFEST-000004 index 00760aec..2874b77e 100644 Binary files a/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/MANIFEST-000004 and b/Data/systems/pf2e/packs/bestiary-ability-glossary-srd/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/bestiary-effects/000005.ldb b/Data/systems/pf2e/packs/bestiary-effects/000005.ldb index 624d8e0a..37e0e27e 100644 Binary files a/Data/systems/pf2e/packs/bestiary-effects/000005.ldb and b/Data/systems/pf2e/packs/bestiary-effects/000005.ldb differ diff --git a/Data/systems/pf2e/packs/bestiary-effects/LOG b/Data/systems/pf2e/packs/bestiary-effects/LOG index eebaee9d..9a5d6535 100644 --- a/Data/systems/pf2e/packs/bestiary-effects/LOG +++ b/Data/systems/pf2e/packs/bestiary-effects/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.148726 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.149287 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.153039 ffff877ef0a0 Level-0 table #5: 130289 bytes OK -2023/10/23-05:12:18.157589 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.157658 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.044894 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.045448 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.049175 ffff7bfff0a0 Level-0 table #5: 131341 bytes OK +2023/11/12-06:20:01.053444 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.053528 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/bestiary-effects/LOG.old b/Data/systems/pf2e/packs/bestiary-effects/LOG.old index 587e5f91..b83d1419 100644 --- a/Data/systems/pf2e/packs/bestiary-effects/LOG.old +++ b/Data/systems/pf2e/packs/bestiary-effects/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.533911 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.530154 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/bestiary-effects/MANIFEST-000004 b/Data/systems/pf2e/packs/bestiary-effects/MANIFEST-000004 index e084172e..233d109f 100644 Binary files a/Data/systems/pf2e/packs/bestiary-effects/MANIFEST-000004 and b/Data/systems/pf2e/packs/bestiary-effects/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/000005.ldb b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/000005.ldb index 8f9988a8..49a5bedc 100644 Binary files a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/000005.ldb and b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG index 0161dee0..6a3794a8 100644 --- a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG +++ b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.592493 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:18.593176 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:18.597590 ffff87fff0a0 Level-0 table #5: 188002 bytes OK -2023/10/23-05:12:18.602887 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:18.602974 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:01.492494 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:01.493170 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:01.497283 ffff89aae0a0 Level-0 table #5: 187922 bytes OK +2023/11/12-06:20:01.502200 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:01.502289 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG.old b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG.old index 756889d5..cfb0a4d1 100644 --- a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG.old +++ b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.565702 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.530436 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/MANIFEST-000004 b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/MANIFEST-000004 index a90218ac..a02f94d8 100644 Binary files a/Data/systems/pf2e/packs/bestiary-family-ability-glossary/MANIFEST-000004 and b/Data/systems/pf2e/packs/bestiary-family-ability-glossary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/blog-bestiary/000005.ldb b/Data/systems/pf2e/packs/blog-bestiary/000005.ldb index 5f28e567..fef03bdf 100644 Binary files a/Data/systems/pf2e/packs/blog-bestiary/000005.ldb and b/Data/systems/pf2e/packs/blog-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/blog-bestiary/LOG b/Data/systems/pf2e/packs/blog-bestiary/LOG index 009f1928..a977e0f4 100644 --- a/Data/systems/pf2e/packs/blog-bestiary/LOG +++ b/Data/systems/pf2e/packs/blog-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.452731 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:16.453591 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:16.458583 ffff86fdf0a0 Level-0 table #5: 221955 bytes OK -2023/10/23-05:12:16.463475 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:16.463582 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:19:59.281172 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.281966 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.286725 ffff88a8e0a0 Level-0 table #5: 221835 bytes OK +2023/11/12-06:19:59.291563 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.291658 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/blog-bestiary/LOG.old b/Data/systems/pf2e/packs/blog-bestiary/LOG.old index 314608b6..cac9e8c1 100644 --- a/Data/systems/pf2e/packs/blog-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/blog-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.564320 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.532622 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/blog-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/blog-bestiary/MANIFEST-000004 index 1c23dd13..9c823e4f 100644 Binary files a/Data/systems/pf2e/packs/blog-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/blog-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/blood-lords-bestiary/000005.ldb b/Data/systems/pf2e/packs/blood-lords-bestiary/000005.ldb index af3dfce6..2813d1f0 100644 Binary files a/Data/systems/pf2e/packs/blood-lords-bestiary/000005.ldb and b/Data/systems/pf2e/packs/blood-lords-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/blood-lords-bestiary/LOG b/Data/systems/pf2e/packs/blood-lords-bestiary/LOG index 2b4ea079..e0f03291 100644 --- a/Data/systems/pf2e/packs/blood-lords-bestiary/LOG +++ b/Data/systems/pf2e/packs/blood-lords-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.391312 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:16.398452 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:16.426394 ffff877ef0a0 Level-0 table #5: 2088469 bytes OK -2023/10/23-05:12:16.431334 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:16.431971 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:19:59.218639 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:19:59.227379 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:19:59.255210 ffff7bfff0a0 Level-0 table #5: 2084593 bytes OK +2023/11/12-06:19:59.259787 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:19:59.260526 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/blood-lords-bestiary/LOG.old b/Data/systems/pf2e/packs/blood-lords-bestiary/LOG.old index 8b69f523..85a453f8 100644 --- a/Data/systems/pf2e/packs/blood-lords-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/blood-lords-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.566684 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.532888 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/blood-lords-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/blood-lords-bestiary/MANIFEST-000004 index 9ea41a7e..0e975a9f 100644 Binary files a/Data/systems/pf2e/packs/blood-lords-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/blood-lords-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/000005.ldb b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/000005.ldb index 2c986e08..23e2413f 100644 Binary files a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/000005.ldb and b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG index 2a7a28d6..fe342c4e 100644 --- a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG +++ b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.355499 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.359063 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.372565 ffff87fff0a0 Level-0 table #5: 1025867 bytes OK -2023/10/23-05:12:16.377917 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.378250 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.183612 ffff8929e0a0 Recovering log #3 +2023/11/12-06:19:59.187879 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:19:59.200855 ffff8929e0a0 Level-0 table #5: 1022119 bytes OK +2023/11/12-06:19:59.205572 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:19:59.205844 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG.old b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG.old index 55296493..155b6adb 100644 --- a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.568358 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.533355 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/MANIFEST-000004 index 8749b91f..b1ed4fd5 100644 Binary files a/Data/systems/pf2e/packs/book-of-the-dead-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/book-of-the-dead-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/boons-and-curses/000005.ldb b/Data/systems/pf2e/packs/boons-and-curses/000005.ldb index 1f334e22..a27872f3 100644 Binary files a/Data/systems/pf2e/packs/boons-and-curses/000005.ldb and b/Data/systems/pf2e/packs/boons-and-curses/000005.ldb differ diff --git a/Data/systems/pf2e/packs/boons-and-curses/LOG b/Data/systems/pf2e/packs/boons-and-curses/LOG index c6af7046..58db19f3 100644 --- a/Data/systems/pf2e/packs/boons-and-curses/LOG +++ b/Data/systems/pf2e/packs/boons-and-curses/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.160492 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.160955 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.164310 ffff86fdf0a0 Level-0 table #5: 110817 bytes OK -2023/10/23-05:12:18.168646 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.168708 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.056528 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.057182 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.060299 ffff8929e0a0 Level-0 table #5: 110000 bytes OK +2023/11/12-06:20:01.064548 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.064614 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/boons-and-curses/LOG.old b/Data/systems/pf2e/packs/boons-and-curses/LOG.old index 4441cf61..4293c1da 100644 --- a/Data/systems/pf2e/packs/boons-and-curses/LOG.old +++ b/Data/systems/pf2e/packs/boons-and-curses/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.568667 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.533009 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/boons-and-curses/MANIFEST-000004 b/Data/systems/pf2e/packs/boons-and-curses/MANIFEST-000004 index b80b5952..1d705816 100644 Binary files a/Data/systems/pf2e/packs/boons-and-curses/MANIFEST-000004 and b/Data/systems/pf2e/packs/boons-and-curses/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/campaign-effects/000005.ldb b/Data/systems/pf2e/packs/campaign-effects/000005.ldb index d6cb9a8f..9ae87678 100644 Binary files a/Data/systems/pf2e/packs/campaign-effects/000005.ldb and b/Data/systems/pf2e/packs/campaign-effects/000005.ldb differ diff --git a/Data/systems/pf2e/packs/campaign-effects/LOG b/Data/systems/pf2e/packs/campaign-effects/LOG index cc1bd2b2..5f591603 100644 --- a/Data/systems/pf2e/packs/campaign-effects/LOG +++ b/Data/systems/pf2e/packs/campaign-effects/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.179768 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.179855 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.182067 ffff86fdf0a0 Level-0 table #5: 20207 bytes OK -2023/10/23-05:12:18.186241 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.186274 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.075828 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.075912 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.078077 ffff8929e0a0 Level-0 table #5: 20198 bytes OK +2023/11/12-06:20:01.082505 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.082532 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/campaign-effects/LOG.old b/Data/systems/pf2e/packs/campaign-effects/LOG.old index c21c92d0..1727d026 100644 --- a/Data/systems/pf2e/packs/campaign-effects/LOG.old +++ b/Data/systems/pf2e/packs/campaign-effects/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.591426 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.558116 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/campaign-effects/MANIFEST-000004 b/Data/systems/pf2e/packs/campaign-effects/MANIFEST-000004 index 082737fc..1b394780 100644 Binary files a/Data/systems/pf2e/packs/campaign-effects/MANIFEST-000004 and b/Data/systems/pf2e/packs/campaign-effects/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/classes/000005.ldb b/Data/systems/pf2e/packs/classes/000005.ldb index ad488d02..ba3813d1 100644 Binary files a/Data/systems/pf2e/packs/classes/000005.ldb and b/Data/systems/pf2e/packs/classes/000005.ldb differ diff --git a/Data/systems/pf2e/packs/classes/LOG b/Data/systems/pf2e/packs/classes/LOG index b78ce1bb..c84fad1f 100644 --- a/Data/systems/pf2e/packs/classes/LOG +++ b/Data/systems/pf2e/packs/classes/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.967974 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.968173 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.970927 ffff86fdf0a0 Level-0 table #5: 61863 bytes OK -2023/10/23-05:12:17.975372 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.975414 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.850042 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.850228 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.853056 ffff8929e0a0 Level-0 table #5: 61867 bytes OK +2023/11/12-06:20:00.857556 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.857597 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/classes/LOG.old b/Data/systems/pf2e/packs/classes/LOG.old index cb5936b0..fdf26f96 100644 --- a/Data/systems/pf2e/packs/classes/LOG.old +++ b/Data/systems/pf2e/packs/classes/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.571536 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.557921 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/classes/MANIFEST-000004 b/Data/systems/pf2e/packs/classes/MANIFEST-000004 index ca697d53..2a54e2c7 100644 Binary files a/Data/systems/pf2e/packs/classes/MANIFEST-000004 and b/Data/systems/pf2e/packs/classes/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/classfeatures/000005.ldb b/Data/systems/pf2e/packs/classfeatures/000005.ldb index a97c8476..a8876588 100644 Binary files a/Data/systems/pf2e/packs/classfeatures/000005.ldb and b/Data/systems/pf2e/packs/classfeatures/000005.ldb differ diff --git a/Data/systems/pf2e/packs/classfeatures/LOG b/Data/systems/pf2e/packs/classfeatures/LOG index 34faf1b8..906b91b7 100644 --- a/Data/systems/pf2e/packs/classfeatures/LOG +++ b/Data/systems/pf2e/packs/classfeatures/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.977279 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.979045 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.987359 ffff877ef0a0 Level-0 table #5: 548690 bytes OK -2023/10/23-05:12:17.992144 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.992345 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.859583 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.861381 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.870098 ffff7bfff0a0 Level-0 table #5: 546817 bytes OK +2023/11/12-06:20:00.874883 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.875128 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/classfeatures/LOG.old b/Data/systems/pf2e/packs/classfeatures/LOG.old index 984df50a..5dc0e969 100644 --- a/Data/systems/pf2e/packs/classfeatures/LOG.old +++ b/Data/systems/pf2e/packs/classfeatures/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.591615 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.558037 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/classfeatures/MANIFEST-000004 b/Data/systems/pf2e/packs/classfeatures/MANIFEST-000004 index 613c0198..ac31e916 100644 Binary files a/Data/systems/pf2e/packs/classfeatures/MANIFEST-000004 and b/Data/systems/pf2e/packs/classfeatures/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/conditions/000005.ldb b/Data/systems/pf2e/packs/conditions/000005.ldb index c377a8b6..3784caf3 100644 Binary files a/Data/systems/pf2e/packs/conditions/000005.ldb and b/Data/systems/pf2e/packs/conditions/000005.ldb differ diff --git a/Data/systems/pf2e/packs/conditions/LOG b/Data/systems/pf2e/packs/conditions/LOG index 19651f18..fe7f9297 100644 --- a/Data/systems/pf2e/packs/conditions/LOG +++ b/Data/systems/pf2e/packs/conditions/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.171228 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.171343 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.173652 ffff877ef0a0 Level-0 table #5: 26788 bytes OK -2023/10/23-05:12:18.178009 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.178042 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.067377 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.067491 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.069731 ffff7bfff0a0 Level-0 table #5: 26776 bytes OK +2023/11/12-06:20:01.073911 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.073944 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/conditions/LOG.old b/Data/systems/pf2e/packs/conditions/LOG.old index b6f15089..838eb90b 100644 --- a/Data/systems/pf2e/packs/conditions/LOG.old +++ b/Data/systems/pf2e/packs/conditions/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.590283 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.559198 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/conditions/MANIFEST-000004 b/Data/systems/pf2e/packs/conditions/MANIFEST-000004 index fbf3e784..51df2d38 100644 Binary files a/Data/systems/pf2e/packs/conditions/MANIFEST-000004 and b/Data/systems/pf2e/packs/conditions/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/criticaldeck/LOG b/Data/systems/pf2e/packs/criticaldeck/LOG index 99d97c7f..8ab6f7e1 100644 --- a/Data/systems/pf2e/packs/criticaldeck/LOG +++ b/Data/systems/pf2e/packs/criticaldeck/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.515276 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.515543 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.518226 ffff877ef0a0 Level-0 table #5: 59661 bytes OK -2023/10/23-05:12:18.522548 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.522593 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.415503 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.415771 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.418546 ffff7bfff0a0 Level-0 table #5: 59661 bytes OK +2023/11/12-06:20:01.423302 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.423350 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/criticaldeck/LOG.old b/Data/systems/pf2e/packs/criticaldeck/LOG.old index f6515131..45bae00c 100644 --- a/Data/systems/pf2e/packs/criticaldeck/LOG.old +++ b/Data/systems/pf2e/packs/criticaldeck/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.593081 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.560656 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/000005.ldb b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/000005.ldb index 207bd22f..cd11f383 100644 Binary files a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/000005.ldb and b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG index ac62d951..065b9835 100644 --- a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG +++ b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.775800 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.776709 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.781975 ffff877ef0a0 Level-0 table #5: 261283 bytes OK -2023/10/23-05:12:17.786690 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.786826 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.690436 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.691390 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.696663 ffff89aae0a0 Level-0 table #5: 261284 bytes OK +2023/11/12-06:20:00.701730 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.701834 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG.old b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG.old index 7a26f61b..76d85e74 100644 --- a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.594411 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.560938 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/MANIFEST-000004 index c67764ad..348bbdfc 100644 Binary files a/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/crown-of-the-kobold-king-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/deities/000005.ldb b/Data/systems/pf2e/packs/deities/000005.ldb index 0cab912e..cb9e149d 100644 Binary files a/Data/systems/pf2e/packs/deities/000005.ldb and b/Data/systems/pf2e/packs/deities/000005.ldb differ diff --git a/Data/systems/pf2e/packs/deities/LOG b/Data/systems/pf2e/packs/deities/LOG index 7d98cc88..d2f7922f 100644 --- a/Data/systems/pf2e/packs/deities/LOG +++ b/Data/systems/pf2e/packs/deities/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.390209 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.391163 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.397723 ffff877ef0a0 Level-0 table #5: 361655 bytes OK -2023/10/23-05:12:18.402442 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.402580 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.287310 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.288242 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.294707 ffff7bfff0a0 Level-0 table #5: 361571 bytes OK +2023/11/12-06:20:01.300084 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.300201 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/deities/LOG.old b/Data/systems/pf2e/packs/deities/LOG.old index c4b68f6b..d572d378 100644 --- a/Data/systems/pf2e/packs/deities/LOG.old +++ b/Data/systems/pf2e/packs/deities/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.594593 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.560990 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/deities/MANIFEST-000004 b/Data/systems/pf2e/packs/deities/MANIFEST-000004 index 014352aa..d070ca2b 100644 Binary files a/Data/systems/pf2e/packs/deities/MANIFEST-000004 and b/Data/systems/pf2e/packs/deities/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/equipment-effects/000005.ldb b/Data/systems/pf2e/packs/equipment-effects/000005.ldb index 3311ab77..83981d85 100644 Binary files a/Data/systems/pf2e/packs/equipment-effects/000005.ldb and b/Data/systems/pf2e/packs/equipment-effects/000005.ldb differ diff --git a/Data/systems/pf2e/packs/equipment-effects/LOG b/Data/systems/pf2e/packs/equipment-effects/LOG index b615d835..c179cbce 100644 --- a/Data/systems/pf2e/packs/equipment-effects/LOG +++ b/Data/systems/pf2e/packs/equipment-effects/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.187912 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.189010 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.194225 ffff877ef0a0 Level-0 table #5: 269317 bytes OK -2023/10/23-05:12:18.198673 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.198826 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.084303 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.085393 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.090539 ffff7bfff0a0 Level-0 table #5: 285645 bytes OK +2023/11/12-06:20:01.094922 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.095067 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/equipment-effects/LOG.old b/Data/systems/pf2e/packs/equipment-effects/LOG.old index 864fb0c5..800cdd63 100644 --- a/Data/systems/pf2e/packs/equipment-effects/LOG.old +++ b/Data/systems/pf2e/packs/equipment-effects/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.596539 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.563844 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/equipment-effects/MANIFEST-000004 b/Data/systems/pf2e/packs/equipment-effects/MANIFEST-000004 index e3b81e3a..fb5f939c 100644 Binary files a/Data/systems/pf2e/packs/equipment-effects/MANIFEST-000004 and b/Data/systems/pf2e/packs/equipment-effects/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/equipment/000005.ldb b/Data/systems/pf2e/packs/equipment/000005.ldb index b7765ae1..083dfb3e 100644 Binary files a/Data/systems/pf2e/packs/equipment/000005.ldb and b/Data/systems/pf2e/packs/equipment/000005.ldb differ diff --git a/Data/systems/pf2e/packs/equipment/LOG b/Data/systems/pf2e/packs/equipment/LOG index de13e228..066153bc 100644 --- a/Data/systems/pf2e/packs/equipment/LOG +++ b/Data/systems/pf2e/packs/equipment/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.265008 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.281652 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.352015 ffff86fdf0a0 Level-0 table #5: 4822636 bytes OK -2023/10/23-05:12:18.357882 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.359850 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.159752 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.177794 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.246994 ffff8929e0a0 Level-0 table #5: 4845215 bytes OK +2023/11/12-06:20:01.252980 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.254175 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/equipment/LOG.old b/Data/systems/pf2e/packs/equipment/LOG.old index 5681ea2e..a97f2708 100644 --- a/Data/systems/pf2e/packs/equipment/LOG.old +++ b/Data/systems/pf2e/packs/equipment/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.594724 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.562827 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/equipment/MANIFEST-000004 b/Data/systems/pf2e/packs/equipment/MANIFEST-000004 index fbb0ac16..b4050dd1 100644 Binary files a/Data/systems/pf2e/packs/equipment/MANIFEST-000004 and b/Data/systems/pf2e/packs/equipment/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/extinction-curse-bestiary/000005.ldb b/Data/systems/pf2e/packs/extinction-curse-bestiary/000005.ldb index a0cfdafb..2bc8f00c 100644 Binary files a/Data/systems/pf2e/packs/extinction-curse-bestiary/000005.ldb and b/Data/systems/pf2e/packs/extinction-curse-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG b/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG index 2dba1676..cc7d0442 100644 --- a/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG +++ b/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.467911 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:16.474456 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:16.498399 ffff877ef0a0 Level-0 table #5: 1837588 bytes OK -2023/10/23-05:12:16.503025 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:16.503683 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:19:59.296977 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.304099 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.328109 ffff88a8e0a0 Level-0 table #5: 1832057 bytes OK +2023/11/12-06:19:59.333889 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.334454 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG.old b/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG.old index 6effdac1..553c70c6 100644 --- a/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/extinction-curse-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.597494 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.564168 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/extinction-curse-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/extinction-curse-bestiary/MANIFEST-000004 index d3e9dfdf..5a21b492 100644 Binary files a/Data/systems/pf2e/packs/extinction-curse-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/extinction-curse-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/fall-of-plaguestone/000005.ldb b/Data/systems/pf2e/packs/fall-of-plaguestone/000005.ldb index 46e96e78..a4717c59 100644 Binary files a/Data/systems/pf2e/packs/fall-of-plaguestone/000005.ldb and b/Data/systems/pf2e/packs/fall-of-plaguestone/000005.ldb differ diff --git a/Data/systems/pf2e/packs/fall-of-plaguestone/LOG b/Data/systems/pf2e/packs/fall-of-plaguestone/LOG index 75868466..66d2029f 100644 --- a/Data/systems/pf2e/packs/fall-of-plaguestone/LOG +++ b/Data/systems/pf2e/packs/fall-of-plaguestone/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.525236 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:16.525676 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:16.529281 ffff867cf0a0 Level-0 table #5: 109654 bytes OK -2023/10/23-05:12:16.533525 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:16.533589 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:19:59.353133 ffff89aae0a0 Recovering log #3 +2023/11/12-06:19:59.353558 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:19:59.357126 ffff89aae0a0 Level-0 table #5: 109478 bytes OK +2023/11/12-06:19:59.362689 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:19:59.362756 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/fall-of-plaguestone/LOG.old b/Data/systems/pf2e/packs/fall-of-plaguestone/LOG.old index 3d9366a6..e7c41971 100644 --- a/Data/systems/pf2e/packs/fall-of-plaguestone/LOG.old +++ b/Data/systems/pf2e/packs/fall-of-plaguestone/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.597412 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.564477 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/fall-of-plaguestone/MANIFEST-000004 b/Data/systems/pf2e/packs/fall-of-plaguestone/MANIFEST-000004 index a4273685..23370431 100644 Binary files a/Data/systems/pf2e/packs/fall-of-plaguestone/MANIFEST-000004 and b/Data/systems/pf2e/packs/fall-of-plaguestone/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/familiar-abilities/000005.ldb b/Data/systems/pf2e/packs/familiar-abilities/000005.ldb index 5910c42c..3f0b004f 100644 Binary files a/Data/systems/pf2e/packs/familiar-abilities/000005.ldb and b/Data/systems/pf2e/packs/familiar-abilities/000005.ldb differ diff --git a/Data/systems/pf2e/packs/familiar-abilities/LOG b/Data/systems/pf2e/packs/familiar-abilities/LOG index 2c0b50c3..4316abfb 100644 --- a/Data/systems/pf2e/packs/familiar-abilities/LOG +++ b/Data/systems/pf2e/packs/familiar-abilities/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.000463 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.000613 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.002981 ffff86fdf0a0 Level-0 table #5: 29776 bytes OK -2023/10/23-05:12:18.007693 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.007733 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.882070 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.882209 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.884808 ffff8929e0a0 Level-0 table #5: 29755 bytes OK +2023/11/12-06:20:00.889533 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.889567 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/familiar-abilities/LOG.old b/Data/systems/pf2e/packs/familiar-abilities/LOG.old index 3563df08..e51f8091 100644 --- a/Data/systems/pf2e/packs/familiar-abilities/LOG.old +++ b/Data/systems/pf2e/packs/familiar-abilities/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.597661 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.566098 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/familiar-abilities/MANIFEST-000004 b/Data/systems/pf2e/packs/familiar-abilities/MANIFEST-000004 index b7e759d3..e02526cb 100644 Binary files a/Data/systems/pf2e/packs/familiar-abilities/MANIFEST-000004 and b/Data/systems/pf2e/packs/familiar-abilities/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/feat-effects/000005.ldb b/Data/systems/pf2e/packs/feat-effects/000005.ldb index 0d163111..4fa103fc 100644 Binary files a/Data/systems/pf2e/packs/feat-effects/000005.ldb and b/Data/systems/pf2e/packs/feat-effects/000005.ldb differ diff --git a/Data/systems/pf2e/packs/feat-effects/LOG b/Data/systems/pf2e/packs/feat-effects/LOG index 6e918d8d..ba992e49 100644 --- a/Data/systems/pf2e/packs/feat-effects/LOG +++ b/Data/systems/pf2e/packs/feat-effects/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.218132 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.219062 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.225034 ffff877ef0a0 Level-0 table #5: 271193 bytes OK -2023/10/23-05:12:18.229958 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.230069 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.114072 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.115027 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.120278 ffff7bfff0a0 Level-0 table #5: 272562 bytes OK +2023/11/12-06:20:01.125125 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.125239 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/feat-effects/LOG.old b/Data/systems/pf2e/packs/feat-effects/LOG.old index 07d3c191..cb358e3e 100644 --- a/Data/systems/pf2e/packs/feat-effects/LOG.old +++ b/Data/systems/pf2e/packs/feat-effects/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.600341 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.566540 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/feat-effects/MANIFEST-000004 b/Data/systems/pf2e/packs/feat-effects/MANIFEST-000004 index 390cb8bd..69e28c7f 100644 Binary files a/Data/systems/pf2e/packs/feat-effects/MANIFEST-000004 and b/Data/systems/pf2e/packs/feat-effects/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/feats/000005.ldb b/Data/systems/pf2e/packs/feats/000005.ldb index 3987072c..f859d019 100644 Binary files a/Data/systems/pf2e/packs/feats/000005.ldb and b/Data/systems/pf2e/packs/feats/000005.ldb differ diff --git a/Data/systems/pf2e/packs/feats/LOG b/Data/systems/pf2e/packs/feats/LOG index bdeebceb..246bf249 100644 --- a/Data/systems/pf2e/packs/feats/LOG +++ b/Data/systems/pf2e/packs/feats/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.009750 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.019638 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.062283 ffff877ef0a0 Level-0 table #5: 2834112 bytes OK -2023/10/23-05:12:18.067236 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.068161 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.891573 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.901291 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.940798 ffff7bfff0a0 Level-0 table #5: 2837814 bytes OK +2023/11/12-06:20:00.945744 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.946433 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/feats/LOG.old b/Data/systems/pf2e/packs/feats/LOG.old index 3b137b8c..10bdc421 100644 --- a/Data/systems/pf2e/packs/feats/LOG.old +++ b/Data/systems/pf2e/packs/feats/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.600675 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.567005 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/feats/MANIFEST-000004 b/Data/systems/pf2e/packs/feats/MANIFEST-000004 index 43257b3f..72cbda90 100644 Binary files a/Data/systems/pf2e/packs/feats/MANIFEST-000004 and b/Data/systems/pf2e/packs/feats/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/000005.ldb b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/000005.ldb index 6638b395..d2f5f7fa 100644 Binary files a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/000005.ldb and b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG index 2b94088c..0c3dc373 100644 --- a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG +++ b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.536756 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:16.543073 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:16.566300 ffff877ef0a0 Level-0 table #5: 1768356 bytes OK -2023/10/23-05:12:16.571964 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:16.572535 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:19:59.398652 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.427861 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.467292 ffff88a8e0a0 Level-0 table #5: 1781093 bytes OK +2023/11/12-06:19:59.472471 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.473101 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG.old b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG.old index c42c16e4..2932eb43 100644 --- a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.601622 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.568126 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/MANIFEST-000004 index 56115e16..262ca0d9 100644 Binary files a/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/fists-of-the-ruby-phoenix-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/gatewalkers-bestiary/000005.ldb b/Data/systems/pf2e/packs/gatewalkers-bestiary/000005.ldb index acbc8a66..0c9c8740 100644 Binary files a/Data/systems/pf2e/packs/gatewalkers-bestiary/000005.ldb and b/Data/systems/pf2e/packs/gatewalkers-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG b/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG index ef6397f9..b4037c45 100644 --- a/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG +++ b/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.602497 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.604522 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.613538 ffff87fff0a0 Level-0 table #5: 603814 bytes OK -2023/10/23-05:12:16.618136 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.618346 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.505410 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.507423 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.516495 ffff88a8e0a0 Level-0 table #5: 603400 bytes OK +2023/11/12-06:19:59.521580 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.521800 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG.old b/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG.old index f7145278..17135509 100644 --- a/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/gatewalkers-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.601589 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.569012 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/gatewalkers-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/gatewalkers-bestiary/MANIFEST-000004 index e0c31698..1ad1701a 100644 Binary files a/Data/systems/pf2e/packs/gatewalkers-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/gatewalkers-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/gmg-srd/LOG b/Data/systems/pf2e/packs/gmg-srd/LOG index 7fba4997..e5a55949 100644 --- a/Data/systems/pf2e/packs/gmg-srd/LOG +++ b/Data/systems/pf2e/packs/gmg-srd/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.558816 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:18.558923 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:18.561492 ffff87fff0a0 Level-0 table #5: 24058 bytes OK -2023/10/23-05:12:18.566203 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:18.566233 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:01.459351 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:01.459457 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:01.461806 ffff89aae0a0 Level-0 table #5: 24058 bytes OK +2023/11/12-06:20:01.466993 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:01.467025 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/gmg-srd/LOG.old b/Data/systems/pf2e/packs/gmg-srd/LOG.old index 19cb6f6c..d9f106d2 100644 --- a/Data/systems/pf2e/packs/gmg-srd/LOG.old +++ b/Data/systems/pf2e/packs/gmg-srd/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.608346 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.569742 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/hazards/000005.ldb b/Data/systems/pf2e/packs/hazards/000005.ldb index 08ce752b..ba60f7d4 100644 Binary files a/Data/systems/pf2e/packs/hazards/000005.ldb and b/Data/systems/pf2e/packs/hazards/000005.ldb differ diff --git a/Data/systems/pf2e/packs/hazards/LOG b/Data/systems/pf2e/packs/hazards/LOG index d7f755af..9aff88fe 100644 --- a/Data/systems/pf2e/packs/hazards/LOG +++ b/Data/systems/pf2e/packs/hazards/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.590808 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:16.591091 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:16.594673 ffff86fdf0a0 Level-0 table #5: 78951 bytes OK -2023/10/23-05:12:16.599697 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:16.599750 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:19:59.491881 ffff89aae0a0 Recovering log #3 +2023/11/12-06:19:59.492158 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:19:59.497578 ffff89aae0a0 Level-0 table #5: 78640 bytes OK +2023/11/12-06:19:59.502202 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:19:59.502251 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/hazards/LOG.old b/Data/systems/pf2e/packs/hazards/LOG.old index e60fbc31..e97acd0a 100644 --- a/Data/systems/pf2e/packs/hazards/LOG.old +++ b/Data/systems/pf2e/packs/hazards/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.667305 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.569991 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/hazards/MANIFEST-000004 b/Data/systems/pf2e/packs/hazards/MANIFEST-000004 index 4b422892..3640fcf3 100644 Binary files a/Data/systems/pf2e/packs/hazards/MANIFEST-000004 and b/Data/systems/pf2e/packs/hazards/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/heritages/000005.ldb b/Data/systems/pf2e/packs/heritages/000005.ldb index ff83d69e..e48b57e2 100644 Binary files a/Data/systems/pf2e/packs/heritages/000005.ldb and b/Data/systems/pf2e/packs/heritages/000005.ldb differ diff --git a/Data/systems/pf2e/packs/heritages/LOG b/Data/systems/pf2e/packs/heritages/LOG index 13f20696..a0b40526 100644 --- a/Data/systems/pf2e/packs/heritages/LOG +++ b/Data/systems/pf2e/packs/heritages/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.090857 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.091348 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.095257 ffff877ef0a0 Level-0 table #5: 141010 bytes OK -2023/10/23-05:12:18.099914 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.099986 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.977174 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.977627 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.981782 ffff7bfff0a0 Level-0 table #5: 140912 bytes OK +2023/11/12-06:20:00.986677 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.986741 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/heritages/LOG.old b/Data/systems/pf2e/packs/heritages/LOG.old index 5cc833d0..19d1bb17 100644 --- a/Data/systems/pf2e/packs/heritages/LOG.old +++ b/Data/systems/pf2e/packs/heritages/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.668053 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.571381 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/heritages/MANIFEST-000004 b/Data/systems/pf2e/packs/heritages/MANIFEST-000004 index b2aa2322..831180d2 100644 Binary files a/Data/systems/pf2e/packs/heritages/MANIFEST-000004 and b/Data/systems/pf2e/packs/heritages/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/highhelm-bestiary/000005.ldb b/Data/systems/pf2e/packs/highhelm-bestiary/000005.ldb index 88b70bcf..fee263e3 100644 Binary files a/Data/systems/pf2e/packs/highhelm-bestiary/000005.ldb and b/Data/systems/pf2e/packs/highhelm-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/highhelm-bestiary/LOG b/Data/systems/pf2e/packs/highhelm-bestiary/LOG index 43bae02a..d98cc906 100644 --- a/Data/systems/pf2e/packs/highhelm-bestiary/LOG +++ b/Data/systems/pf2e/packs/highhelm-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.660702 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.660904 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.663622 ffff87fff0a0 Level-0 table #5: 41036 bytes OK -2023/10/23-05:12:16.668018 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.668055 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.559324 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.559466 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.562187 ffff88a8e0a0 Level-0 table #5: 40978 bytes OK +2023/11/12-06:19:59.567040 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.567076 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/highhelm-bestiary/LOG.old b/Data/systems/pf2e/packs/highhelm-bestiary/LOG.old index 622082cc..34f1c6c4 100644 --- a/Data/systems/pf2e/packs/highhelm-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/highhelm-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.668165 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.572018 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/highhelm-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/highhelm-bestiary/MANIFEST-000004 index fa26d322..204957e0 100644 Binary files a/Data/systems/pf2e/packs/highhelm-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/highhelm-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/iconics/000005.ldb b/Data/systems/pf2e/packs/iconics/000005.ldb index dd5a324f..f717b3e6 100644 Binary files a/Data/systems/pf2e/packs/iconics/000005.ldb and b/Data/systems/pf2e/packs/iconics/000005.ldb differ diff --git a/Data/systems/pf2e/packs/iconics/LOG b/Data/systems/pf2e/packs/iconics/LOG index ebf992be..3ee39fe2 100644 --- a/Data/systems/pf2e/packs/iconics/LOG +++ b/Data/systems/pf2e/packs/iconics/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.407398 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.412621 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.433131 ffff86fdf0a0 Level-0 table #5: 1604618 bytes OK -2023/10/23-05:12:18.437916 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.438459 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.304935 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.309992 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.331313 ffff8929e0a0 Level-0 table #5: 1599529 bytes OK +2023/11/12-06:20:01.336378 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.336887 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/iconics/LOG.old b/Data/systems/pf2e/packs/iconics/LOG.old index c30c0ed1..bddcad9b 100644 --- a/Data/systems/pf2e/packs/iconics/LOG.old +++ b/Data/systems/pf2e/packs/iconics/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.669392 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.572732 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/iconics/MANIFEST-000004 b/Data/systems/pf2e/packs/iconics/MANIFEST-000004 index 67ffc095..9c0cb691 100644 Binary files a/Data/systems/pf2e/packs/iconics/MANIFEST-000004 and b/Data/systems/pf2e/packs/iconics/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/impossible-lands-bestiary/000005.ldb b/Data/systems/pf2e/packs/impossible-lands-bestiary/000005.ldb index d895afbc..d55fa5f3 100644 Binary files a/Data/systems/pf2e/packs/impossible-lands-bestiary/000005.ldb and b/Data/systems/pf2e/packs/impossible-lands-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG b/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG index 19f314f6..911e81c4 100644 --- a/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG +++ b/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.628299 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:16.628694 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:16.632229 ffff86fdf0a0 Level-0 table #5: 118203 bytes OK -2023/10/23-05:12:16.636968 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:16.637026 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:19:59.530722 ffff89aae0a0 Recovering log #3 +2023/11/12-06:19:59.531167 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:19:59.534720 ffff89aae0a0 Level-0 table #5: 118075 bytes OK +2023/11/12-06:19:59.539388 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:19:59.539454 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG.old b/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG.old index 8a0861cf..6869f563 100644 --- a/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/impossible-lands-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.672366 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.573139 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/impossible-lands-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/impossible-lands-bestiary/MANIFEST-000004 index ef95a1da..af9fd7af 100644 Binary files a/Data/systems/pf2e/packs/impossible-lands-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/impossible-lands-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/journals/000005.ldb b/Data/systems/pf2e/packs/journals/000005.ldb index e58556e7..39b056d8 100644 Binary files a/Data/systems/pf2e/packs/journals/000005.ldb and b/Data/systems/pf2e/packs/journals/000005.ldb differ diff --git a/Data/systems/pf2e/packs/journals/LOG b/Data/systems/pf2e/packs/journals/LOG index faa2366f..551fe6ef 100644 --- a/Data/systems/pf2e/packs/journals/LOG +++ b/Data/systems/pf2e/packs/journals/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.524812 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.528207 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.543724 ffff86fdf0a0 Level-0 table #5: 1244760 bytes OK -2023/10/23-05:12:18.548666 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.549103 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.425726 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.429269 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.444452 ffff8929e0a0 Level-0 table #5: 1244760 bytes OK +2023/11/12-06:20:01.449187 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.449625 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/journals/LOG.old b/Data/systems/pf2e/packs/journals/LOG.old index 9b7f3279..8d55cd12 100644 --- a/Data/systems/pf2e/packs/journals/LOG.old +++ b/Data/systems/pf2e/packs/journals/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.670839 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.574353 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/kingmaker-bestiary/000005.ldb b/Data/systems/pf2e/packs/kingmaker-bestiary/000005.ldb index 13894b65..a0957452 100644 Binary files a/Data/systems/pf2e/packs/kingmaker-bestiary/000005.ldb and b/Data/systems/pf2e/packs/kingmaker-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/kingmaker-bestiary/LOG b/Data/systems/pf2e/packs/kingmaker-bestiary/LOG index 2121072e..274fcb72 100644 --- a/Data/systems/pf2e/packs/kingmaker-bestiary/LOG +++ b/Data/systems/pf2e/packs/kingmaker-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.809436 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:16.821406 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:16.869990 ffff867cf0a0 Level-0 table #5: 3403687 bytes OK -2023/10/23-05:12:16.876298 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:16.877467 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:19:59.713661 ffff8929e0a0 Recovering log #3 +2023/11/12-06:19:59.728263 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:19:59.776583 ffff8929e0a0 Level-0 table #5: 3397853 bytes OK +2023/11/12-06:19:59.782211 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:19:59.783264 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/kingmaker-bestiary/LOG.old b/Data/systems/pf2e/packs/kingmaker-bestiary/LOG.old index eb240e64..cd4d8905 100644 --- a/Data/systems/pf2e/packs/kingmaker-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/kingmaker-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.671878 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.574822 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/kingmaker-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/kingmaker-bestiary/MANIFEST-000004 index d9a67b7a..76da6624 100644 Binary files a/Data/systems/pf2e/packs/kingmaker-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/kingmaker-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/kingmaker-features/000005.ldb b/Data/systems/pf2e/packs/kingmaker-features/000005.ldb index 4f78e19d..90cddf38 100644 Binary files a/Data/systems/pf2e/packs/kingmaker-features/000005.ldb and b/Data/systems/pf2e/packs/kingmaker-features/000005.ldb differ diff --git a/Data/systems/pf2e/packs/kingmaker-features/LOG b/Data/systems/pf2e/packs/kingmaker-features/LOG index 3d1e0c7f..1cef29e9 100644 --- a/Data/systems/pf2e/packs/kingmaker-features/LOG +++ b/Data/systems/pf2e/packs/kingmaker-features/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.616816 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:18.617143 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:18.620659 ffff87fff0a0 Level-0 table #5: 100391 bytes OK -2023/10/23-05:12:18.625550 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:18.625615 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:01.515698 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:01.516031 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:01.519061 ffff89aae0a0 Level-0 table #5: 100508 bytes OK +2023/11/12-06:20:01.523771 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:01.523829 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/kingmaker-features/LOG.old b/Data/systems/pf2e/packs/kingmaker-features/LOG.old index 8096f3af..d38edbe9 100644 --- a/Data/systems/pf2e/packs/kingmaker-features/LOG.old +++ b/Data/systems/pf2e/packs/kingmaker-features/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.673609 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.575835 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/kingmaker-features/MANIFEST-000004 b/Data/systems/pf2e/packs/kingmaker-features/MANIFEST-000004 index 1ddd8f3e..f86a3bf8 100644 Binary files a/Data/systems/pf2e/packs/kingmaker-features/MANIFEST-000004 and b/Data/systems/pf2e/packs/kingmaker-features/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/macros/LOG b/Data/systems/pf2e/packs/macros/LOG index 0b119c1d..e2c4ad25 100644 --- a/Data/systems/pf2e/packs/macros/LOG +++ b/Data/systems/pf2e/packs/macros/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.576300 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:18.576329 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:18.578198 ffff87fff0a0 Level-0 table #5: 1742 bytes OK -2023/10/23-05:12:18.582613 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:18.582632 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:01.476741 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:01.476769 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:01.478639 ffff89aae0a0 Level-0 table #5: 1742 bytes OK +2023/11/12-06:20:01.483041 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:01.483061 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/macros/LOG.old b/Data/systems/pf2e/packs/macros/LOG.old index 81b09afa..4eb31fd9 100644 --- a/Data/systems/pf2e/packs/macros/LOG.old +++ b/Data/systems/pf2e/packs/macros/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.694167 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.576129 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/malevolence-bestiary/000005.ldb b/Data/systems/pf2e/packs/malevolence-bestiary/000005.ldb index 0cc27d59..1214633f 100644 Binary files a/Data/systems/pf2e/packs/malevolence-bestiary/000005.ldb and b/Data/systems/pf2e/packs/malevolence-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/malevolence-bestiary/LOG b/Data/systems/pf2e/packs/malevolence-bestiary/LOG index e4150c97..fc39b7c1 100644 --- a/Data/systems/pf2e/packs/malevolence-bestiary/LOG +++ b/Data/systems/pf2e/packs/malevolence-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.702291 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:16.702736 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:16.706289 ffff86fdf0a0 Level-0 table #5: 125242 bytes OK -2023/10/23-05:12:16.710898 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:16.710964 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:19:59.602617 ffff89aae0a0 Recovering log #3 +2023/11/12-06:19:59.603059 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:19:59.606743 ffff89aae0a0 Level-0 table #5: 125529 bytes OK +2023/11/12-06:19:59.611460 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:19:59.611553 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/malevolence-bestiary/LOG.old b/Data/systems/pf2e/packs/malevolence-bestiary/LOG.old index a935fc0a..3bbb3000 100644 --- a/Data/systems/pf2e/packs/malevolence-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/malevolence-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.694756 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.577778 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/malevolence-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/malevolence-bestiary/MANIFEST-000004 index 11055fe5..5e6353b3 100644 Binary files a/Data/systems/pf2e/packs/malevolence-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/malevolence-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/menace-under-otari-bestiary/000005.ldb b/Data/systems/pf2e/packs/menace-under-otari-bestiary/000005.ldb index b289a33c..7c5c2bfc 100644 Binary files a/Data/systems/pf2e/packs/menace-under-otari-bestiary/000005.ldb and b/Data/systems/pf2e/packs/menace-under-otari-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG b/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG index 465e35bb..3002c3bc 100644 --- a/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG +++ b/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.713918 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.715112 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.721422 ffff87fff0a0 Level-0 table #5: 311367 bytes OK -2023/10/23-05:12:16.725935 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.726063 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.614859 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.616006 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.621782 ffff88a8e0a0 Level-0 table #5: 310878 bytes OK +2023/11/12-06:19:59.626383 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.626516 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG.old b/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG.old index ac74bd9e..dad559f5 100644 --- a/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/menace-under-otari-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.696145 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.578267 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/menace-under-otari-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/menace-under-otari-bestiary/MANIFEST-000004 index 6d31878c..41297888 100644 Binary files a/Data/systems/pf2e/packs/menace-under-otari-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/menace-under-otari-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/000005.ldb b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/000005.ldb index ee136806..00f54b8d 100644 Binary files a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/000005.ldb and b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG index b8ec7cdd..61c0a0fc 100644 --- a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG +++ b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.670462 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:16.672273 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:16.680439 ffff86fdf0a0 Level-0 table #5: 514513 bytes OK -2023/10/23-05:12:16.684701 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:16.684934 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:19:59.569521 ffff89aae0a0 Recovering log #3 +2023/11/12-06:19:59.571235 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:19:59.579151 ffff89aae0a0 Level-0 table #5: 514109 bytes OK +2023/11/12-06:19:59.583765 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:19:59.583919 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG.old b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG.old index 006e49ed..4649f135 100644 --- a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.696779 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.579102 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/MANIFEST-000004 index 9591fcaf..75784eee 100644 Binary files a/Data/systems/pf2e/packs/monsters-of-myth-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/monsters-of-myth-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/000005.ldb b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/000005.ldb index 02701c30..9d3e0714 100644 Binary files a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/000005.ldb and b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG index 075dcbd6..9a5122c4 100644 --- a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG +++ b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.639957 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.640652 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.645158 ffff87fff0a0 Level-0 table #5: 201554 bytes OK -2023/10/23-05:12:16.649683 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.649777 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.545694 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.546382 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.550712 ffff88a8e0a0 Level-0 table #5: 201743 bytes OK +2023/11/12-06:19:59.555425 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.555534 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG.old b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG.old index 3b2f138b..aa4b7e4c 100644 --- a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.697548 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.579102 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/MANIFEST-000004 index 1c2bc9eb..f1a1501c 100644 Binary files a/Data/systems/pf2e/packs/mwangi-expanse-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/mwangi-expanse-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/000005.ldb b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/000005.ldb index a84f1eba..524ad48c 100644 Binary files a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/000005.ldb and b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG index 557a938f..0b40614d 100644 --- a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG +++ b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.760680 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.761533 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.766430 ffff86fdf0a0 Level-0 table #5: 242185 bytes OK -2023/10/23-05:12:17.771609 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.771716 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.675738 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.676557 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.681438 ffff8929e0a0 Level-0 table #5: 241889 bytes OK +2023/11/12-06:20:00.686353 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.686453 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG.old b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG.old index a90f4c20..1b036508 100644 --- a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.697716 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.580875 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/MANIFEST-000004 index 8e8537ac..5af3f7f5 100644 Binary files a/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/night-of-the-gray-death-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/npc-gallery/000005.ldb b/Data/systems/pf2e/packs/npc-gallery/000005.ldb index 88b5ac68..a49e7a7e 100644 Binary files a/Data/systems/pf2e/packs/npc-gallery/000005.ldb and b/Data/systems/pf2e/packs/npc-gallery/000005.ldb differ diff --git a/Data/systems/pf2e/packs/npc-gallery/LOG b/Data/systems/pf2e/packs/npc-gallery/LOG index 41e6e253..5a8040e4 100644 --- a/Data/systems/pf2e/packs/npc-gallery/LOG +++ b/Data/systems/pf2e/packs/npc-gallery/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.731781 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:16.735622 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:16.749920 ffff877ef0a0 Level-0 table #5: 1113942 bytes OK -2023/10/23-05:12:16.754987 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:16.755412 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:19:59.633522 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.638623 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.652660 ffff88a8e0a0 Level-0 table #5: 1110671 bytes OK +2023/11/12-06:19:59.657513 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.657874 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/npc-gallery/LOG.old b/Data/systems/pf2e/packs/npc-gallery/LOG.old index fa3bf57c..8e0c2a66 100644 --- a/Data/systems/pf2e/packs/npc-gallery/LOG.old +++ b/Data/systems/pf2e/packs/npc-gallery/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.701142 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.581513 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/npc-gallery/MANIFEST-000004 b/Data/systems/pf2e/packs/npc-gallery/MANIFEST-000004 index ae0e4e2f..53cd4715 100644 Binary files a/Data/systems/pf2e/packs/npc-gallery/MANIFEST-000004 and b/Data/systems/pf2e/packs/npc-gallery/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/one-shot-bestiary/000005.ldb b/Data/systems/pf2e/packs/one-shot-bestiary/000005.ldb index bf41b4db..0ef91a74 100644 Binary files a/Data/systems/pf2e/packs/one-shot-bestiary/000005.ldb and b/Data/systems/pf2e/packs/one-shot-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/one-shot-bestiary/LOG b/Data/systems/pf2e/packs/one-shot-bestiary/LOG index 1418ee91..6d0890e1 100644 --- a/Data/systems/pf2e/packs/one-shot-bestiary/LOG +++ b/Data/systems/pf2e/packs/one-shot-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.768519 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:16.769230 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:16.773822 ffff877ef0a0 Level-0 table #5: 195214 bytes OK -2023/10/23-05:12:16.778325 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:16.778410 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:19:59.671239 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.671906 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.676300 ffff88a8e0a0 Level-0 table #5: 195006 bytes OK +2023/11/12-06:19:59.680638 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.680732 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/one-shot-bestiary/LOG.old b/Data/systems/pf2e/packs/one-shot-bestiary/LOG.old index 3a63ebb8..52ccf64e 100644 --- a/Data/systems/pf2e/packs/one-shot-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/one-shot-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.699580 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.582572 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/one-shot-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/one-shot-bestiary/MANIFEST-000004 index acaa53ee..9198044d 100644 Binary files a/Data/systems/pf2e/packs/one-shot-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/one-shot-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/other-effects/000005.ldb b/Data/systems/pf2e/packs/other-effects/000005.ldb index 835aa7b7..e0ee4c5a 100644 Binary files a/Data/systems/pf2e/packs/other-effects/000005.ldb and b/Data/systems/pf2e/packs/other-effects/000005.ldb differ diff --git a/Data/systems/pf2e/packs/other-effects/LOG b/Data/systems/pf2e/packs/other-effects/LOG index a2d141f7..825afac8 100644 --- a/Data/systems/pf2e/packs/other-effects/LOG +++ b/Data/systems/pf2e/packs/other-effects/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.202853 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.202949 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.205487 ffff86fdf0a0 Level-0 table #5: 17150 bytes OK -2023/10/23-05:12:18.210148 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.210177 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.102868 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.102990 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.107546 ffff8929e0a0 Level-0 table #5: 17168 bytes OK +2023/11/12-06:20:01.111916 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.111947 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/other-effects/LOG.old b/Data/systems/pf2e/packs/other-effects/LOG.old index 4a3fff5f..30159df4 100644 --- a/Data/systems/pf2e/packs/other-effects/LOG.old +++ b/Data/systems/pf2e/packs/other-effects/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.701305 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.582275 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/other-effects/MANIFEST-000004 b/Data/systems/pf2e/packs/other-effects/MANIFEST-000004 index 971d5890..188811c7 100644 Binary files a/Data/systems/pf2e/packs/other-effects/MANIFEST-000004 and b/Data/systems/pf2e/packs/other-effects/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/000005.ldb b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/000005.ldb index 06f53db1..b80fec24 100644 Binary files a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/000005.ldb and b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG index c858b1b9..a07dca0c 100644 --- a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG +++ b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.782177 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:16.784616 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:16.794369 ffff867cf0a0 Level-0 table #5: 666663 bytes OK -2023/10/23-05:12:16.799130 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:16.799377 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:19:59.684564 ffff8929e0a0 Recovering log #3 +2023/11/12-06:19:59.687095 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:19:59.697075 ffff8929e0a0 Level-0 table #5: 664699 bytes OK +2023/11/12-06:19:59.701938 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:19:59.702178 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG.old b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG.old index cef031ec..f3299f81 100644 --- a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.700974 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.583803 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/MANIFEST-000004 index 075b9c1a..dd0b3514 100644 Binary files a/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/outlaws-of-alkenstar-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/paizo-pregens/000005.ldb b/Data/systems/pf2e/packs/paizo-pregens/000005.ldb index 51905422..ef51ae75 100644 Binary files a/Data/systems/pf2e/packs/paizo-pregens/000005.ldb and b/Data/systems/pf2e/packs/paizo-pregens/000005.ldb differ diff --git a/Data/systems/pf2e/packs/paizo-pregens/LOG b/Data/systems/pf2e/packs/paizo-pregens/LOG index d38083a5..357cb1f0 100644 --- a/Data/systems/pf2e/packs/paizo-pregens/LOG +++ b/Data/systems/pf2e/packs/paizo-pregens/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.453095 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.458453 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.479485 ffff86fdf0a0 Level-0 table #5: 1678573 bytes OK -2023/10/23-05:12:18.484218 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.484860 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.351646 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.356828 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.378587 ffff8929e0a0 Level-0 table #5: 1674014 bytes OK +2023/11/12-06:20:01.383346 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.383863 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/paizo-pregens/LOG.old b/Data/systems/pf2e/packs/paizo-pregens/LOG.old index 474cb1b1..f4ea7510 100644 --- a/Data/systems/pf2e/packs/paizo-pregens/LOG.old +++ b/Data/systems/pf2e/packs/paizo-pregens/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.702556 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.585020 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/paizo-pregens/MANIFEST-000004 b/Data/systems/pf2e/packs/paizo-pregens/MANIFEST-000004 index c933759d..307e9d93 100644 Binary files a/Data/systems/pf2e/packs/paizo-pregens/MANIFEST-000004 and b/Data/systems/pf2e/packs/paizo-pregens/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-2/000005.ldb b/Data/systems/pf2e/packs/pathfinder-bestiary-2/000005.ldb index 435b30c7..e1f43346 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-bestiary-2/000005.ldb and b/Data/systems/pf2e/packs/pathfinder-bestiary-2/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG b/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG index 85d880fc..a09a54ce 100644 --- a/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG +++ b/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.063370 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:17.076708 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:17.130299 ffff87fff0a0 Level-0 table #5: 3711251 bytes OK -2023/10/23-05:12:17.135911 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:17.137734 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.973089 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:19:59.989909 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.044968 ffff7bfff0a0 Level-0 table #5: 3708769 bytes OK +2023/11/12-06:20:00.049922 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.051205 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG.old b/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG.old index f2136eb6..f7532c53 100644 --- a/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG.old +++ b/Data/systems/pf2e/packs/pathfinder-bestiary-2/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.706398 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.585714 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-2/MANIFEST-000004 b/Data/systems/pf2e/packs/pathfinder-bestiary-2/MANIFEST-000004 index 5cd74466..e0db3fbc 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-bestiary-2/MANIFEST-000004 and b/Data/systems/pf2e/packs/pathfinder-bestiary-2/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-3/000005.ldb b/Data/systems/pf2e/packs/pathfinder-bestiary-3/000005.ldb index 00d52a4c..e9ffa67f 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-bestiary-3/000005.ldb and b/Data/systems/pf2e/packs/pathfinder-bestiary-3/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG b/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG index 7c721d78..b5b1cd17 100644 --- a/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG +++ b/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.171993 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.187123 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.252362 ffff86fdf0a0 Level-0 table #5: 4378205 bytes OK -2023/10/23-05:12:17.258128 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.259505 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.084982 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.106574 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.170928 ffff89aae0a0 Level-0 table #5: 4371283 bytes OK +2023/11/12-06:20:00.178250 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.179757 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG.old b/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG.old index 74ebecb6..96fbbefe 100644 --- a/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG.old +++ b/Data/systems/pf2e/packs/pathfinder-bestiary-3/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.704366 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.587064 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary-3/MANIFEST-000004 b/Data/systems/pf2e/packs/pathfinder-bestiary-3/MANIFEST-000004 index 87400a38..3ea9d79e 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-bestiary-3/MANIFEST-000004 and b/Data/systems/pf2e/packs/pathfinder-bestiary-3/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary/000005.ldb b/Data/systems/pf2e/packs/pathfinder-bestiary/000005.ldb index 0eee7afe..d4557e74 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pathfinder-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary/LOG b/Data/systems/pf2e/packs/pathfinder-bestiary/LOG index 2e04bcb5..09bb725e 100644 --- a/Data/systems/pf2e/packs/pathfinder-bestiary/LOG +++ b/Data/systems/pf2e/packs/pathfinder-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.906987 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:16.927100 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.004953 ffff867cf0a0 Level-0 table #5: 5306423 bytes OK -2023/10/23-05:12:17.011235 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.013382 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:19:59.811789 ffff8929e0a0 Recovering log #3 +2023/11/12-06:19:59.838735 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:19:59.916997 ffff8929e0a0 Level-0 table #5: 5292299 bytes OK +2023/11/12-06:19:59.923515 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:19:59.925105 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary/LOG.old b/Data/systems/pf2e/packs/pathfinder-bestiary/LOG.old index 730d744a..864f3cdc 100644 --- a/Data/systems/pf2e/packs/pathfinder-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pathfinder-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.704548 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.585044 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pathfinder-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pathfinder-bestiary/MANIFEST-000004 index 82d1bcd8..a2bdabb7 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pathfinder-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pathfinder-dark-archive/000005.ldb b/Data/systems/pf2e/packs/pathfinder-dark-archive/000005.ldb index fa640966..125750af 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-dark-archive/000005.ldb and b/Data/systems/pf2e/packs/pathfinder-dark-archive/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG b/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG index 0d97ce44..b778241b 100644 --- a/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG +++ b/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.297304 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.297665 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.301075 ffff867cf0a0 Level-0 table #5: 94483 bytes OK -2023/10/23-05:12:17.306227 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.306282 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.219529 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.219869 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.223183 ffff8929e0a0 Level-0 table #5: 94486 bytes OK +2023/11/12-06:20:00.227629 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.227682 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG.old b/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG.old index 98e4fcc7..2a9228d3 100644 --- a/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG.old +++ b/Data/systems/pf2e/packs/pathfinder-dark-archive/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.705269 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.587678 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pathfinder-dark-archive/MANIFEST-000004 b/Data/systems/pf2e/packs/pathfinder-dark-archive/MANIFEST-000004 index 5bd84dbb..d5d81032 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-dark-archive/MANIFEST-000004 and b/Data/systems/pf2e/packs/pathfinder-dark-archive/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pathfinder-society-boons/000005.ldb b/Data/systems/pf2e/packs/pathfinder-society-boons/000005.ldb index fb3ea902..6f188d6c 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-society-boons/000005.ldb and b/Data/systems/pf2e/packs/pathfinder-society-boons/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pathfinder-society-boons/LOG b/Data/systems/pf2e/packs/pathfinder-society-boons/LOG index 9ec6cef6..7976779d 100644 --- a/Data/systems/pf2e/packs/pathfinder-society-boons/LOG +++ b/Data/systems/pf2e/packs/pathfinder-society-boons/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.234387 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.234703 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.238041 ffff86fdf0a0 Level-0 table #5: 82652 bytes OK -2023/10/23-05:12:18.243077 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.243135 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.129708 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.130015 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.133028 ffff8929e0a0 Level-0 table #5: 82609 bytes OK +2023/11/12-06:20:01.137822 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.137875 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pathfinder-society-boons/LOG.old b/Data/systems/pf2e/packs/pathfinder-society-boons/LOG.old index d7800daf..caa14e7e 100644 --- a/Data/systems/pf2e/packs/pathfinder-society-boons/LOG.old +++ b/Data/systems/pf2e/packs/pathfinder-society-boons/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.708250 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.587986 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pathfinder-society-boons/MANIFEST-000004 b/Data/systems/pf2e/packs/pathfinder-society-boons/MANIFEST-000004 index cad1a445..017221e2 100644 Binary files a/Data/systems/pf2e/packs/pathfinder-society-boons/MANIFEST-000004 and b/Data/systems/pf2e/packs/pathfinder-society-boons/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pfs-introductions-bestiary/000005.ldb b/Data/systems/pf2e/packs/pfs-introductions-bestiary/000005.ldb index 5ec59975..764e9d33 100644 Binary files a/Data/systems/pf2e/packs/pfs-introductions-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pfs-introductions-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG b/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG index b569d12e..b5820baf 100644 --- a/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG +++ b/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.309170 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:17.309317 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:17.312081 ffff87fff0a0 Level-0 table #5: 36057 bytes OK -2023/10/23-05:12:17.316821 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:17.316858 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:00.230676 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.230817 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.233492 ffff7bfff0a0 Level-0 table #5: 35999 bytes OK +2023/11/12-06:20:00.237889 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.237924 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG.old b/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG.old index e53394c4..962cbeb8 100644 --- a/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pfs-introductions-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.707800 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.588519 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pfs-introductions-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pfs-introductions-bestiary/MANIFEST-000004 index 049aa4f4..5bd19299 100644 Binary files a/Data/systems/pf2e/packs/pfs-introductions-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pfs-introductions-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pfs-season-1-bestiary/000005.ldb b/Data/systems/pf2e/packs/pfs-season-1-bestiary/000005.ldb index ad6bdc7e..d5ac7032 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-1-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pfs-season-1-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG b/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG index ec36a920..5cf67324 100644 --- a/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG +++ b/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.319139 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.326875 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.356183 ffff867cf0a0 Level-0 table #5: 2065521 bytes OK -2023/10/23-05:12:17.361231 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.361976 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.240381 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.248008 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.276191 ffff8929e0a0 Level-0 table #5: 2062994 bytes OK +2023/11/12-06:20:00.281403 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.282090 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG.old b/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG.old index ea0e8210..47da18fc 100644 --- a/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pfs-season-1-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.708039 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.590098 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pfs-season-1-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pfs-season-1-bestiary/MANIFEST-000004 index 0a61a680..ef51f2c8 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-1-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pfs-season-1-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pfs-season-2-bestiary/000005.ldb b/Data/systems/pf2e/packs/pfs-season-2-bestiary/000005.ldb index dabeae6a..73eb2f53 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-2-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pfs-season-2-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG b/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG index 933fbc31..e9ba59f8 100644 --- a/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG +++ b/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.386012 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:17.391681 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:17.412232 ffff87fff0a0 Level-0 table #5: 1539382 bytes OK -2023/10/23-05:12:17.416924 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:17.417428 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:00.303316 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.308686 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.328588 ffff7bfff0a0 Level-0 table #5: 1536581 bytes OK +2023/11/12-06:20:00.332919 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.333350 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG.old b/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG.old index b60d7ee4..83c291b5 100644 --- a/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pfs-season-2-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.711253 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.590584 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pfs-season-2-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pfs-season-2-bestiary/MANIFEST-000004 index 970dda97..233b0dde 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-2-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pfs-season-2-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pfs-season-3-bestiary/000005.ldb b/Data/systems/pf2e/packs/pfs-season-3-bestiary/000005.ldb index 139733cd..26792f71 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-3-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pfs-season-3-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG b/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG index 9eb38754..4c8f87c0 100644 --- a/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG +++ b/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.435043 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.441463 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.465526 ffff867cf0a0 Level-0 table #5: 1726659 bytes OK -2023/10/23-05:12:17.470178 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.470752 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.351768 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.358104 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.381109 ffff8929e0a0 Level-0 table #5: 1726965 bytes OK +2023/11/12-06:20:00.385740 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.386442 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG.old b/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG.old index c36e2781..f282b504 100644 --- a/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pfs-season-3-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.710842 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.591174 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pfs-season-3-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pfs-season-3-bestiary/MANIFEST-000004 index 3d563fc2..20883f17 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-3-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pfs-season-3-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pfs-season-4-bestiary/000005.ldb b/Data/systems/pf2e/packs/pfs-season-4-bestiary/000005.ldb index 34d26b13..ba4da53b 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-4-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pfs-season-4-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG b/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG index 7e2a871f..9530c86a 100644 --- a/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG +++ b/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.489267 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:17.495594 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:17.520541 ffff87fff0a0 Level-0 table #5: 1824190 bytes OK -2023/10/23-05:12:17.525591 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:17.526180 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:00.405000 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.411490 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.435231 ffff7bfff0a0 Level-0 table #5: 1819231 bytes OK +2023/11/12-06:20:00.440095 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.440888 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG.old b/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG.old index a3a44706..2b2ba191 100644 --- a/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pfs-season-4-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.712836 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.591683 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pfs-season-4-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pfs-season-4-bestiary/MANIFEST-000004 index f3810a00..53ff1349 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-4-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pfs-season-4-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/pfs-season-5-bestiary/000005.ldb b/Data/systems/pf2e/packs/pfs-season-5-bestiary/000005.ldb index 19acaefb..5f2432b9 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-5-bestiary/000005.ldb and b/Data/systems/pf2e/packs/pfs-season-5-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG b/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG index 5ce19c0b..c8880735 100644 --- a/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG +++ b/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.544747 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.545886 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.551771 ffff867cf0a0 Level-0 table #5: 298466 bytes OK -2023/10/23-05:12:17.557604 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.557729 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.459653 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.460656 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.466393 ffff8929e0a0 Level-0 table #5: 298420 bytes OK +2023/11/12-06:20:00.470926 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.471108 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG.old b/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG.old index 77b5d69b..5a2513ca 100644 --- a/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/pfs-season-5-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.711689 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.592962 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/pfs-season-5-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/pfs-season-5-bestiary/MANIFEST-000004 index d1e5d42e..bc82f207 100644 Binary files a/Data/systems/pf2e/packs/pfs-season-5-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/pfs-season-5-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/000005.ldb b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/000005.ldb index 8d614712..7780459a 100644 Binary files a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/000005.ldb and b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG index 12471f1e..c886c7d1 100644 --- a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG +++ b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.563697 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.565953 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.575103 ffff877ef0a0 Level-0 table #5: 625808 bytes OK -2023/10/23-05:12:17.579501 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.579718 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.476651 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:20:00.478812 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:20:00.488058 ffff88a8e0a0 Level-0 table #5: 625381 bytes OK +2023/11/12-06:20:00.492514 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:20:00.492705 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG.old b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG.old index 6d988ddf..a29cb7e9 100644 --- a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.714257 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.593591 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/MANIFEST-000004 index 6b4ee245..5ca73e14 100644 Binary files a/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/quest-for-the-frozen-flame-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/rage-of-elements-bestiary/000005.ldb b/Data/systems/pf2e/packs/rage-of-elements-bestiary/000005.ldb index c827718b..82962174 100644 Binary files a/Data/systems/pf2e/packs/rage-of-elements-bestiary/000005.ldb and b/Data/systems/pf2e/packs/rage-of-elements-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG b/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG index c72a3593..df633675 100644 --- a/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG +++ b/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.860435 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.863052 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.881699 ffff877ef0a0 Level-0 table #5: 751790 bytes OK -2023/10/23-05:12:17.886479 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.886741 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.758605 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.761238 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.771588 ffff89aae0a0 Level-0 table #5: 750652 bytes OK +2023/11/12-06:20:00.776173 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.776412 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG.old b/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG.old index 29098a06..074d422f 100644 --- a/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/rage-of-elements-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.715814 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.594819 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/rage-of-elements-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/rage-of-elements-bestiary/MANIFEST-000004 index 90218e58..35b4399f 100644 Binary files a/Data/systems/pf2e/packs/rage-of-elements-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/rage-of-elements-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/rollable-tables/LOG b/Data/systems/pf2e/packs/rollable-tables/LOG index d1954ca8..fe68728b 100644 --- a/Data/systems/pf2e/packs/rollable-tables/LOG +++ b/Data/systems/pf2e/packs/rollable-tables/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.499285 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.500456 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.504907 ffff86fdf0a0 Level-0 table #5: 191129 bytes OK -2023/10/23-05:12:18.509321 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.509422 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:01.398352 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:01.399499 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.404007 ffff8929e0a0 Level-0 table #5: 191129 bytes OK +2023/11/12-06:20:01.409473 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.409565 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/rollable-tables/LOG.old b/Data/systems/pf2e/packs/rollable-tables/LOG.old index bd0b51a2..3e77aa2f 100644 --- a/Data/systems/pf2e/packs/rollable-tables/LOG.old +++ b/Data/systems/pf2e/packs/rollable-tables/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.715338 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.594669 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/rusthenge-bestiary/000005.ldb b/Data/systems/pf2e/packs/rusthenge-bestiary/000005.ldb index a02e7690..285c5357 100644 Binary files a/Data/systems/pf2e/packs/rusthenge-bestiary/000005.ldb and b/Data/systems/pf2e/packs/rusthenge-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/rusthenge-bestiary/LOG b/Data/systems/pf2e/packs/rusthenge-bestiary/LOG index 41cc239e..9f32031c 100644 --- a/Data/systems/pf2e/packs/rusthenge-bestiary/LOG +++ b/Data/systems/pf2e/packs/rusthenge-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.589100 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.589825 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.594505 ffff877ef0a0 Level-0 table #5: 224323 bytes OK -2023/10/23-05:12:17.598830 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.598932 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.501908 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:20:00.502611 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:20:00.507082 ffff88a8e0a0 Level-0 table #5: 223638 bytes OK +2023/11/12-06:20:00.511600 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:20:00.511696 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/rusthenge-bestiary/LOG.old b/Data/systems/pf2e/packs/rusthenge-bestiary/LOG.old index 97e8ac27..6b2773c6 100644 --- a/Data/systems/pf2e/packs/rusthenge-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/rusthenge-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.717132 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.596356 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/rusthenge-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/rusthenge-bestiary/MANIFEST-000004 index 94f18925..0364827d 100644 Binary files a/Data/systems/pf2e/packs/rusthenge-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/rusthenge-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/000005.ldb b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/000005.ldb index f2f613c5..c76bd5a6 100644 Binary files a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/000005.ldb and b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG index 600a075f..b75cd3fe 100644 --- a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG +++ b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.602562 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:17.603201 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:17.607307 ffff87fff0a0 Level-0 table #5: 177598 bytes OK -2023/10/23-05:12:17.611685 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:17.611771 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:20:00.515364 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:00.516518 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:00.522513 ffff7bfff0a0 Level-0 table #5: 366114 bytes OK +2023/11/12-06:20:00.526718 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:00.526858 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG.old b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG.old index 2fcf00bf..6ca9a896 100644 --- a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.717719 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.597437 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/MANIFEST-000004 index 3180936c..4a8a98ff 100644 Binary files a/Data/systems/pf2e/packs/season-of-ghosts-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/season-of-ghosts-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/000005.ldb b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/000005.ldb index 4abe4500..496091de 100644 Binary files a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/000005.ldb and b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG index ed03434f..226f6b03 100644 --- a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG +++ b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.615257 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.616119 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.621568 ffff877ef0a0 Level-0 table #5: 286499 bytes OK -2023/10/23-05:12:17.626031 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.626157 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.532997 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.533924 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.539091 ffff89aae0a0 Level-0 table #5: 286626 bytes OK +2023/11/12-06:20:00.543718 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.543825 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG.old b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG.old index 3de2130d..8856de9a 100644 --- a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.718878 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.597799 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/MANIFEST-000004 index 70bfb81f..9baee82b 100644 Binary files a/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/shadows-at-sundown-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/000005.ldb b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/000005.ldb index a8de52cb..dcd18368 100644 Binary files a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/000005.ldb and b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG index 5f142cfd..52bac416 100644 --- a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG +++ b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.630572 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.633705 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.646090 ffff867cf0a0 Level-0 table #5: 919923 bytes OK -2023/10/23-05:12:17.650587 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.650919 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.548191 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:20:00.551133 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:20:00.563264 ffff88a8e0a0 Level-0 table #5: 919537 bytes OK +2023/11/12-06:20:00.567617 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:20:00.567896 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG.old b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG.old index eeecc3a4..46621ba6 100644 --- a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.720023 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.598060 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/MANIFEST-000004 index 27d956f4..27bf911c 100644 Binary files a/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/sky-kings-tomb-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/spell-effects/000005.ldb b/Data/systems/pf2e/packs/spell-effects/000005.ldb index ce48fa6d..6f6a431f 100644 Binary files a/Data/systems/pf2e/packs/spell-effects/000005.ldb and b/Data/systems/pf2e/packs/spell-effects/000005.ldb differ diff --git a/Data/systems/pf2e/packs/spell-effects/LOG b/Data/systems/pf2e/packs/spell-effects/LOG index 91938d87..32eee72b 100644 --- a/Data/systems/pf2e/packs/spell-effects/LOG +++ b/Data/systems/pf2e/packs/spell-effects/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.245544 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:18.246858 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:18.253775 ffff877ef0a0 Level-0 table #5: 415661 bytes OK -2023/10/23-05:12:18.258456 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:18.258618 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:01.140424 ffff7bfff0a0 Recovering log #3 +2023/11/12-06:20:01.141761 ffff7bfff0a0 Level-0 table #5: started +2023/11/12-06:20:01.148575 ffff7bfff0a0 Level-0 table #5: 426592 bytes OK +2023/11/12-06:20:01.153158 ffff7bfff0a0 Delete type=0 #3 +2023/11/12-06:20:01.153335 ffff7bfff0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/spell-effects/LOG.old b/Data/systems/pf2e/packs/spell-effects/LOG.old index 29edab63..bb2f7e82 100644 --- a/Data/systems/pf2e/packs/spell-effects/LOG.old +++ b/Data/systems/pf2e/packs/spell-effects/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.719502 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.599590 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/spell-effects/MANIFEST-000004 b/Data/systems/pf2e/packs/spell-effects/MANIFEST-000004 index 828773f7..9e93f083 100644 Binary files a/Data/systems/pf2e/packs/spell-effects/MANIFEST-000004 and b/Data/systems/pf2e/packs/spell-effects/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/spells/000005.ldb b/Data/systems/pf2e/packs/spells/000005.ldb index 202b32b4..5fb59541 100644 Binary files a/Data/systems/pf2e/packs/spells/000005.ldb and b/Data/systems/pf2e/packs/spells/000005.ldb differ diff --git a/Data/systems/pf2e/packs/spells/LOG b/Data/systems/pf2e/packs/spells/LOG index a3e74b4a..38884309 100644 --- a/Data/systems/pf2e/packs/spells/LOG +++ b/Data/systems/pf2e/packs/spells/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:18.102696 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:18.107969 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:18.129978 ffff86fdf0a0 Level-0 table #5: 1655214 bytes OK -2023/10/23-05:12:18.135040 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:18.135608 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.989635 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.998992 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:01.025437 ffff8929e0a0 Level-0 table #5: 1679960 bytes OK +2023/11/12-06:20:01.030160 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:01.030745 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/spells/LOG.old b/Data/systems/pf2e/packs/spells/LOG.old index 0e3f5df8..f80d2359 100644 --- a/Data/systems/pf2e/packs/spells/LOG.old +++ b/Data/systems/pf2e/packs/spells/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.720123 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.600911 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/spells/MANIFEST-000004 b/Data/systems/pf2e/packs/spells/MANIFEST-000004 index e0983128..258f7fb0 100644 Binary files a/Data/systems/pf2e/packs/spells/MANIFEST-000004 and b/Data/systems/pf2e/packs/spells/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/stolen-fate-bestiary/000005.ldb b/Data/systems/pf2e/packs/stolen-fate-bestiary/000005.ldb index 9e9abf2d..f5c909e9 100644 Binary files a/Data/systems/pf2e/packs/stolen-fate-bestiary/000005.ldb and b/Data/systems/pf2e/packs/stolen-fate-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG b/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG index a04b1ac7..dfc956ca 100644 --- a/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG +++ b/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.791246 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.797256 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.821601 ffff867cf0a0 Level-0 table #5: 1747468 bytes OK -2023/10/23-05:12:17.826456 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.827051 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.706170 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:20:00.713242 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:20:00.736834 ffff88a8e0a0 Level-0 table #5: 1745717 bytes OK +2023/11/12-06:20:00.741527 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:20:00.742141 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG.old b/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG.old index 029ed38d..f2886299 100644 --- a/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/stolen-fate-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.722346 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.602057 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/stolen-fate-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/stolen-fate-bestiary/MANIFEST-000004 index e0a77bff..fe6f33f7 100644 Binary files a/Data/systems/pf2e/packs/stolen-fate-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/stolen-fate-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/000005.ldb b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/000005.ldb index 20ae5144..8da613a6 100644 Binary files a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/000005.ldb and b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG index edad7faf..77a59d3b 100644 --- a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG +++ b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.662307 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.668990 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.695279 ffff86fdf0a0 Level-0 table #5: 1879496 bytes OK -2023/10/23-05:12:17.700011 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.700655 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.580906 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.587483 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.613274 ffff8929e0a0 Level-0 table #5: 1876443 bytes OK +2023/11/12-06:20:00.618167 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.618732 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG.old b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG.old index e0048789..65176eec 100644 --- a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.722041 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.601201 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/MANIFEST-000004 index e46f2680..633c14bd 100644 Binary files a/Data/systems/pf2e/packs/strength-of-thousands-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/strength-of-thousands-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/000005.ldb b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/000005.ldb index a62edfac..8072c1ac 100644 Binary files a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/000005.ldb and b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG index 89d1d2eb..57bea160 100644 --- a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG +++ b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.719366 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.719904 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.723756 ffff867cf0a0 Level-0 table #5: 145155 bytes OK -2023/10/23-05:12:17.728550 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.728628 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.637528 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:20:00.638017 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:20:00.641940 ffff88a8e0a0 Level-0 table #5: 145071 bytes OK +2023/11/12-06:20:00.646881 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:20:00.646996 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG.old b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG.old index ca3b74e6..c8e316f4 100644 --- a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.723733 7fdbd3fff640 Delete type=3 #1 +2023/11/08-20:32:54.603379 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/MANIFEST-000004 index 2ce0ea6a..2a0429e3 100644 Binary files a/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/the-enmity-cycle-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/the-slithering-bestiary/000005.ldb b/Data/systems/pf2e/packs/the-slithering-bestiary/000005.ldb index 0e486e05..5dd069a4 100644 Binary files a/Data/systems/pf2e/packs/the-slithering-bestiary/000005.ldb and b/Data/systems/pf2e/packs/the-slithering-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/the-slithering-bestiary/LOG b/Data/systems/pf2e/packs/the-slithering-bestiary/LOG index 8bd4d15b..4fc0a111 100644 --- a/Data/systems/pf2e/packs/the-slithering-bestiary/LOG +++ b/Data/systems/pf2e/packs/the-slithering-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.734100 ffff86fdf0a0 Recovering log #3 -2023/10/23-05:12:17.734643 ffff86fdf0a0 Level-0 table #5: started -2023/10/23-05:12:17.738987 ffff86fdf0a0 Level-0 table #5: 152030 bytes OK -2023/10/23-05:12:17.744123 ffff86fdf0a0 Delete type=0 #3 -2023/10/23-05:12:17.744207 ffff86fdf0a0 Delete type=3 #2 +2023/11/12-06:20:00.650574 ffff8929e0a0 Recovering log #3 +2023/11/12-06:20:00.651142 ffff8929e0a0 Level-0 table #5: started +2023/11/12-06:20:00.655216 ffff8929e0a0 Level-0 table #5: 151500 bytes OK +2023/11/12-06:20:00.660259 ffff8929e0a0 Delete type=0 #3 +2023/11/12-06:20:00.660340 ffff8929e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/the-slithering-bestiary/LOG.old b/Data/systems/pf2e/packs/the-slithering-bestiary/LOG.old index eaa4e7a0..5d1229cf 100644 --- a/Data/systems/pf2e/packs/the-slithering-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/the-slithering-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.722448 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.604278 7f38abfff640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/the-slithering-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/the-slithering-bestiary/MANIFEST-000004 index 9a3c95a4..dc2aea90 100644 Binary files a/Data/systems/pf2e/packs/the-slithering-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/the-slithering-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/travel-guide-bestiary/000005.ldb b/Data/systems/pf2e/packs/travel-guide-bestiary/000005.ldb index 737be600..89abc553 100644 Binary files a/Data/systems/pf2e/packs/travel-guide-bestiary/000005.ldb and b/Data/systems/pf2e/packs/travel-guide-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/travel-guide-bestiary/LOG b/Data/systems/pf2e/packs/travel-guide-bestiary/LOG index d64c091b..afc57c68 100644 --- a/Data/systems/pf2e/packs/travel-guide-bestiary/LOG +++ b/Data/systems/pf2e/packs/travel-guide-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:16.693294 ffff87fff0a0 Recovering log #3 -2023/10/23-05:12:16.693394 ffff87fff0a0 Level-0 table #5: started -2023/10/23-05:12:16.695568 ffff87fff0a0 Level-0 table #5: 17054 bytes OK -2023/10/23-05:12:16.700079 ffff87fff0a0 Delete type=0 #3 -2023/10/23-05:12:16.700110 ffff87fff0a0 Delete type=3 #2 +2023/11/12-06:19:59.593006 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:19:59.593091 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:19:59.595481 ffff88a8e0a0 Level-0 table #5: 17009 bytes OK +2023/11/12-06:19:59.600313 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:19:59.600341 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/travel-guide-bestiary/LOG.old b/Data/systems/pf2e/packs/travel-guide-bestiary/LOG.old index 069f66b5..e8dc2148 100644 --- a/Data/systems/pf2e/packs/travel-guide-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/travel-guide-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.726232 7fdbe1ffd640 Delete type=3 #1 +2023/11/08-20:32:54.604588 7f38a9ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/travel-guide-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/travel-guide-bestiary/MANIFEST-000004 index 140584bc..a1b17291 100644 Binary files a/Data/systems/pf2e/packs/travel-guide-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/travel-guide-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/000005.ldb b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/000005.ldb index e1040bf6..bf9666b4 100644 Binary files a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/000005.ldb and b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/000005.ldb differ diff --git a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG index ca861488..381d1f86 100644 --- a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG +++ b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.748594 ffff867cf0a0 Recovering log #3 -2023/10/23-05:12:17.749060 ffff867cf0a0 Level-0 table #5: started -2023/10/23-05:12:17.752737 ffff867cf0a0 Level-0 table #5: 120871 bytes OK -2023/10/23-05:12:17.757531 ffff867cf0a0 Delete type=0 #3 -2023/10/23-05:12:17.757595 ffff867cf0a0 Delete type=3 #2 +2023/11/12-06:20:00.663732 ffff88a8e0a0 Recovering log #3 +2023/11/12-06:20:00.664162 ffff88a8e0a0 Level-0 table #5: started +2023/11/12-06:20:00.668000 ffff88a8e0a0 Level-0 table #5: 121219 bytes OK +2023/11/12-06:20:00.672576 ffff88a8e0a0 Delete type=0 #3 +2023/11/12-06:20:00.672638 ffff88a8e0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG.old b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG.old index fb4bcff5..f54b0262 100644 --- a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG.old +++ b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.725682 7fdbd2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.605323 7f38b1ffd640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/MANIFEST-000004 b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/MANIFEST-000004 index 8f3c1621..b93ef591 100644 Binary files a/Data/systems/pf2e/packs/troubles-in-otari-bestiary/MANIFEST-000004 and b/Data/systems/pf2e/packs/troubles-in-otari-bestiary/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/packs/vehicles/000005.ldb b/Data/systems/pf2e/packs/vehicles/000005.ldb index 6657483a..db82e952 100644 Binary files a/Data/systems/pf2e/packs/vehicles/000005.ldb and b/Data/systems/pf2e/packs/vehicles/000005.ldb differ diff --git a/Data/systems/pf2e/packs/vehicles/LOG b/Data/systems/pf2e/packs/vehicles/LOG index 529162bd..7f89b8db 100644 --- a/Data/systems/pf2e/packs/vehicles/LOG +++ b/Data/systems/pf2e/packs/vehicles/LOG @@ -1,5 +1,5 @@ -2023/10/23-05:12:17.898152 ffff877ef0a0 Recovering log #3 -2023/10/23-05:12:17.898411 ffff877ef0a0 Level-0 table #5: started -2023/10/23-05:12:17.901380 ffff877ef0a0 Level-0 table #5: 68529 bytes OK -2023/10/23-05:12:17.905797 ffff877ef0a0 Delete type=0 #3 -2023/10/23-05:12:17.905846 ffff877ef0a0 Delete type=3 #2 +2023/11/12-06:20:00.786492 ffff89aae0a0 Recovering log #3 +2023/11/12-06:20:00.786772 ffff89aae0a0 Level-0 table #5: started +2023/11/12-06:20:00.789726 ffff89aae0a0 Level-0 table #5: 68585 bytes OK +2023/11/12-06:20:00.794179 ffff89aae0a0 Delete type=0 #3 +2023/11/12-06:20:00.794227 ffff89aae0a0 Delete type=3 #2 diff --git a/Data/systems/pf2e/packs/vehicles/LOG.old b/Data/systems/pf2e/packs/vehicles/LOG.old index 0ab5d216..34b35ed9 100644 --- a/Data/systems/pf2e/packs/vehicles/LOG.old +++ b/Data/systems/pf2e/packs/vehicles/LOG.old @@ -1 +1 @@ -2023/10/21-22:35:17.728173 7fdbe2ffe640 Delete type=3 #1 +2023/11/08-20:32:54.606554 7f38aaffe640 Delete type=3 #1 diff --git a/Data/systems/pf2e/packs/vehicles/MANIFEST-000004 b/Data/systems/pf2e/packs/vehicles/MANIFEST-000004 index 25cc7a32..93ac51ae 100644 Binary files a/Data/systems/pf2e/packs/vehicles/MANIFEST-000004 and b/Data/systems/pf2e/packs/vehicles/MANIFEST-000004 differ diff --git a/Data/systems/pf2e/pf2e.mjs b/Data/systems/pf2e/pf2e.mjs index 0402cd7a..a6f1a779 100644 --- a/Data/systems/pf2e/pf2e.mjs +++ b/Data/systems/pf2e/pf2e.mjs @@ -1,4 +1,9 @@ -var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __defProp2=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__reflectGet=Reflect.get,__defNormalProp=__name((obj,key,value)=>key in obj?__defProp2(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,"__defNormalProp"),__name2=__name((target,value)=>__defProp2(target,"name",{value,configurable:!0}),"__name"),__publicField=__name((obj,key,value)=>(__defNormalProp(obj,typeof key!="symbol"?key+"":key,value),value),"__publicField"),__accessCheck=__name((obj,member,msg)=>{if(!member.has(obj))throw TypeError("Cannot "+msg)},"__accessCheck"),__privateGet=__name((obj,member,getter)=>(__accessCheck(obj,member,"read from private field"),getter?getter.call(obj):member.get(obj)),"__privateGet"),__privateAdd=__name((obj,member,value)=>{if(member.has(obj))throw TypeError("Cannot add the same private member more than once");member instanceof WeakSet?member.add(obj):member.set(obj,value)},"__privateAdd"),__privateSet=__name((obj,member,value,setter)=>(__accessCheck(obj,member,"write to private field"),setter?setter.call(obj,value):member.set(obj,value),value),"__privateSet"),__privateMethod=__name((obj,member,method)=>(__accessCheck(obj,member,"access private method"),method),"__privateMethod"),__superGet=__name((cls,obj,key)=>__reflectGet(__getProtoOf(cls),key,obj),"__superGet"),_updateMigrationRecord,updateMigrationRecord_fn,_migrateDocuments,migrateDocuments_fn,_migrateItem,migrateItem_fn,_migrateActor,migrateActor_fn,_migrateWorldJournalEntry,migrateWorldJournalEntry_fn,_migrateWorldMacro,migrateWorldMacro_fn,_migrateWorldTable,migrateWorldTable_fn,_migrateSceneToken,migrateSceneToken_fn,_migrateUser,migrateUser_fn,_data,_diehardPromise,_featSlugs,_featsPromise,_IMAGE_PATHS,_regexp,_renameToWebP,renameToWebP_fn,_isABCK,isABCK_fn,_BASE_ARMORS,_MAGIC_ARMOR_TO_BASE,_BASE_WEAPONS,_isTrue,isTrue_fn,_testBinaryOp,testBinaryOp_fn,_testCompound,testCompound_fn,_binaryOperators,_imageOverrides,_sizeOverrides,_isTokenImageFlag,isTokenImageFlag_fn,_isTokenSizeFlag,isTokenSizeFlag_fn,_needsRuleElement,needsRuleElement_fn,_increasesByOne,_isClassFeature,isClassFeature_fn,_pathsToRemove,_isRemovableAE,isRemovableAE_fn,_isRemoveableChange,isRemoveableChange_fn,_fixClassKeyAbilities,fixClassKeyAbilities_fn,_isTokenSizeRE,isTokenSizeRE_fn,_isActorSizeAELike,isActorSizeAELike_fn,_isBracketedValue,isBracketedValue_fn,_setAncestryVision,setAncestryVision_fn,_resolveBracketedValue,resolveBracketedValue_fn,_coerceNumber,coerceNumber_fn,_traitsDictionary,traitsDictionary_get,_handleModeAffectingTrait,handleModeAffectingTrait_fn,_getDegreeAdjustment,getDegreeAdjustment_fn,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn,_calculateDegreeOfSuccess,calculateDegreeOfSuccess_fn,_SKILL_LONG_FORM_PATH,_rewriteSkillLongFormPath,rewriteSkillLongFormPath_fn,_pathIsValid,pathIsValid_fn,_logChange,logChange_fn,_processEffects,processEffects_fn,_processAppearanceData,processAppearanceData_fn,_createMovementType,createMovementType_fn,_customLabel,_weapon,_resolveOptions,resolveOptions_fn,_actions,_lores,_prepareProficiencyRanks,prepareProficiencyRanks_fn,_prepareDCAdjustments,prepareDCAdjustments_fn,_generatePrompt,generatePrompt_fn,_htmlQueryTags,htmlQueryTags_fn,_formatLoreType,formatLoreType_fn,_formatActionType,formatActionType_fn,_getDC,getDC_fn,_constructCheck,constructCheck_fn,_renderFormula,renderFormula_fn,_prepareDamageTypes,prepareDamageTypes_fn,_getInputElements,getInputElements_fn,_disableScale,disableScale_fn,_reestablishPrototype,reestablishPrototype_fn,_disableVisionInputs,disableVisionInputs_fn,_drawBorder,drawBorder_fn,_drawTexture,drawTexture_fn,_drawLabel,drawLabel_fn,_showBordersHighlights,showBordersHighlights_get,_moveTime,_wheelListenerOptions,_onPreviewMouseMove,_onPreviewLeftClick,_onPreviewRightClick,_onPreviewMouseWheel,_squares,_prepareDerivedPerception,prepareDerivedPerception_fn,_getChoices,getChoices_fn,_filterTimeout,_getUpdateData,getUpdateData_fn,_search,search_fn,_onFilterResults,onFilterResults_fn,_updateIWR,updateIWR_fn,_sortableOnMoveData,_activateInventoryDragDrop,activateInventoryDragDrop_fn,_sortableOnMove,sortableOnMove_fn,_sortableOnEnd,sortableOnEnd_fn,_onClickDeleteItem,onClickDeleteItem_fn,_onClickBrowseEquipment,onClickBrowseEquipment_fn,_onClickCreateItem,onClickCreateItem_fn,_onClickSellAllTreasure,onClickSellAllTreasure_fn,_resolve,_originallyEnabled,_getModifierIcon,getModifierIcon_fn,_getTypeLabel,getTypeLabel_fn,_applyStackingRules,applyStackingRules_fn,_localize,localize_fn,_createTemplate,createTemplate_fn,_parseInlineParams,parseInlineParams_fn,_createCheck,createCheck_fn,_createSingleCheck,createSingleCheck_fn,_createDamageRoll,createDamageRoll_fn,_createActionOptions,createActionOptions_fn,_originallyEnabled2,_resolveSubstitutions,resolveSubstitutions_fn,_createTagFlavor,createTagFlavor_fn,_createResultFlavor,createResultFlavor_fn,_resolveCheckDC,resolveCheckDC_fn,_item,_resolve2,_action,_canSetAttribute,canSetAttribute_fn,_searchEngine,_getSpellFromEvent,getSpellFromEvent_fn,_onConfigureActor,onConfigureActor_fn,_onToggleSignatureSpell,onToggleSignatureSpell_fn,_onClickBrowseActions,onClickBrowseActions_fn,_onClickBrowseSpellCompendia,onClickBrowseSpellCompendia_fn,_abpEnabled,_createButtons,createButtons_fn,_calculateAncestryBoosts,calculateAncestryBoosts_fn,_calculateBackgroundBoosts,calculateBackgroundBoosts_fn,_calculateLeveledBoosts,calculateLeveledBoosts_fn,_getBoostFlawLabels,getBoostFlawLabels_fn,_updateRE,updateRE_fn,_blastConfigSchema,_blastInfusionSchema,_prepareBlastConfigs,prepareBlastConfigs_fn,_prepareBlastInfusion,prepareBlastInfusion_fn,_getBlastConfig,getBlastConfig_fn,_createModifiedItem,createModifiedItem_fn,_strengthModToDamage,strengthModToDamage_fn,_knownFormulas,_formulaQuantities,_prepareAbilities,prepareAbilities_fn,_prepareCraftingEntries,prepareCraftingEntries_fn,_getBlastData,getBlastData_fn,_activateBlastListeners,activateBlastListeners_fn,_onClickBrowseFeats,onClickBrowseFeats_fn,_onChangeAdjustStat,onChangeAdjustStat_fn,_onChangeAdjustItemStat,onChangeAdjustItemStat_fn,_onClickAdjustItemStat,onClickAdjustItemStat_fn,_getFeatSlotData,getFeatSlotData_fn,_sortFormulas,sortFormulas_fn,_strikeItemId,_strikeSlug,_strike,_elementTrait,_blasts,_getReach,getReach_fn,_isValid,isValid_fn,_constructWeapon,constructWeapon_fn,_defaultIcons,_setRollOptions,setRollOptions_fn,_prepareAC,prepareAC_fn,_prepareSenses,prepareSenses_fn,_prepareSize,prepareSize_fn,_prepareSpeeds,prepareSpeeds_fn,_prepareSkills,prepareSkills_fn,_prepareStrikes,prepareStrikes_fn,_prepareIWR,prepareIWR_fn,_suppressModifiers,suppressModifiers_fn,_filterModifier,filterModifier_fn,_suppressNotes,suppressNotes_fn,_resolveStrikeQueries,resolveStrikeQueries_fn,_resolve3,_setDefaultFlag,setDefaultFlag_fn,_choicesFromArray,choicesFromArray_fn,_choicesFromPath,choicesFromPath_fn,_choicesFromOwnedItems,choicesFromOwnedItems_fn,_choicesFromAttacks,choicesFromAttacks_fn,_getPreselection,getPreselection_fn,_setRollOption,setRollOption_fn,_getEffect,getEffect_fn,_isValidOverride,isValidOverride_fn,_resolvedBracketsIsValid,resolvedBracketsIsValid_fn,_validateForItem,_adjustCreatureShieldData,adjustCreatureShieldData_fn,_getNewInterval,getNewInterval_fn,_createDeferredEffect,createDeferredEffect_fn,_getOnDeleteActions,getOnDeleteActions_fn,_applyChoiceSelections,applyChoiceSelections_fn,_setGrantFlags,setGrantFlags_fn,_runGrantedItemPreCreates,runGrantedItemPreCreates_fn,_createInMemoryCondition,createInMemoryCondition_fn,_trackItem,trackItem_fn,_resolveOption,resolveOption_fn,_setFlag,setFlag_fn,_setRollOption2,setRollOption_fn2,_effect,_srcIsValid,srcIsValid_fn,_target,_resolve4,_cancelHandler,cancelHandler_fn,_checkRuleSource,checkRuleSource_fn,_activeTab,_getFormHelpers,getFormHelpers_fn,_effectsMap,_addEffect,addEffect_fn,_updateEffectsMap,updateEffectsMap_fn,_deleteEffect,deleteEffect_fn,_selectedRuleElementType,_editingRuleElementIndex,_rulesLastScrollTop,_ruleElementForms,_createRuleElementForms,createRuleElementForms_fn,_initialRefresh,_damageManager,_processDeletions,processDeletions_fn,_refreshSettings,refreshSettings_fn,_registerModuleTags,registerModuleTags_fn,_getConfigRecord,getConfigRecord_fn,_updateConfigRecords,updateConfigRecords_fn,_isFlatModifier,isFlatModifier_fn,_toRuleElement,toRuleElement_fn,_rationsSourceId,_rationsPromise,_isOldRations,isOldRations_fn,_getRationRefs,getRationRefs_fn,_migrateClass,migrateClass_fn,_migrateFeature,migrateFeature_fn,_isClassFeature2,isClassFeature_fn2,_isClassFeature3,isClassFeature_fn3,_isHeritageFeature,isHeritageFeature_fn,_officialAncestries,_heritagesWithoutAncestryInName,_ancestrySlugs,_heritageFromFeat,heritageFromFeat_fn,_explorersClothingVariants,_pathPattern,_hasWellFormedFeatType,hasWellFormedFeatType_fn,_needsTrait,needsTrait_fn,_hasBrokenThreshold,hasBrokenThreshold_fn,_shadowPromise,_cascadePromise,_isEffectTargetRE,isEffectTargetRE_fn,_toChoiceSet,toChoiceSet_fn,_loadedSpells,_isChoiceSetWithSelection,isChoiceSetWithSelection_fn,_newRules,newRules_fn,_toSkip,_hasThrownTrait,hasThrownTrait_fn,_cleanText,cleanText_fn,_updateEffect,updateEffect_fn,_updateFeat,updateFeat_fn,_vivaciousRules,vivaciousRules_get,_auraOfLife,_enlightenedPresence,_eternalBlessing,_marshalsAura,_findDamageDiceRE,findDamageDiceRE_fn,_isClassFeature4,isClassFeature_fn4,_athleticStrategist,athleticStrategist_get,_deviseAStratagem,deviseAStratagem_get,_ruffianPredicate,ruffianPredicate_get,_sneakAttackPredicate,sneakAttackPredicate_get,_updateSpeed,updateSpeed_fn,_suppressNoCrowbar,suppressNoCrowbar_get,_convertToUUIDs,convertToUUIDs_fn,_getRules,getRules_fn,_preciseStrikeRules,preciseStrikeRules_get,_finishingPrecisionRules,finishingPrecisionRules_get,_otherClassDCs,_isClassFeature5,isClassFeature_fn5,_critSpec,critSpec_get,_hands,hands_get,_convertLegacyData,convertLegacyData_fn,_isOldRawPredicate,isOldRawPredicate_fn,_isArrayChoiceSet,isArrayChoiceSet_fn,_isObjectChoiceSet,isObjectChoiceSet_fn,_shapeFeats,_flatFootedToggle,flatFootedToggle_get,_isFlatFootedToggle,isFlatFootedToggle_fn,_convertToEntry,convertToEntry_fn,_modifyFlag,modifyFlag_fn,_oldIdsPattern,_colorDarkvision,colorDarkvision_get,_AREA_TYPES,_isAreaType,isAreaType_fn,_hasDetails,hasDetails_fn,_pattern,_damageTypeLabelPattern,_updateDamageFormula,updateDamageFormula_fn,_automatonEnhancements,automatonEnhancements_get,_conditionPattern,_pattern2,_updateDamageFormula2,updateDamageFormula_fn2,_getWR,getWR_fn,_oldENmappings,_parseExceptions,parseExceptions_fn,_normalizeType,normalizeType_fn,_updateWeaponMaterialData,updateWeaponMaterialData_fn,_updateChoiceSet,updateChoiceSet_fn,_bomberSetFlags,bomberSetFlags_get,_chirurgeonSetFlags,chirurgeonSetFlags_get,_mutagenistSetFlags,mutagenistSetFlags_get,_toxicologistSetFlags,toxicologistSetFlags_get,_needsRE,needsRE_fn,_splashPattern1,_splashPattern2,_damagePatternSingle,_damagePatternPair,_cleanFormula,cleanFormula_fn,_buildSplashFormula,buildSplashFormula_fn,_buildDamageFormula,buildDamageFormula_fn,_updateDamageFormula3,updateDamageFormula_fn3,_rename,rename_fn,_removeLinks,removeLinks_fn,_cloisteredClericSetFlags,cloisteredClericSetFlags_get,_warpriestSetFlags,warpriestSetFlags_get,_updateCategoryData,updateCategoryData_fn,_rename2,rename_fn2,_wrapPredicate,wrapPredicate_fn,_replaceUUID,replaceUUID_fn,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn,_updateUUIDs,updateUUIDs_fn,_idMap,_oldToNew,_oldNamePattern,_newName,_imgPattern,_aToAnUUIDPatern,_replace,replace_fn,_OLD_TO_NEW_LANGUAGES,_testHasOption,testHasOption_fn,_hasOldMaterialData,hasOldMaterialData_fn,_resilientRuneValues,_replaceStrings,replaceStrings_fn,_mightyBulwarkRules,mightyBulwarkRules_get,_defensePathPattern,_mvSchema,mvSchema_fn,_setPublicationData,setPublicationData_fn,_list,_finalizeDamage,finalizeDamage_fn,_excludeDamage,excludeDamage_fn,_strengthModToDamage2,strengthModToDamage_fn2,_check,_dc,_determineLabel,determineLabel_fn,_createBonusesAndPenalties,createBonusesAndPenalties_fn,_createShieldBonus,createShieldBonus_fn,_baseMax,_currentFilter,_lastClick,_onClickButton,onClickButton_fn,_rollActorSaves,rollActorSaves_fn,_onHoverIn,onHoverIn_fn,_onHoverOut,onHoverOut_fn,_initialized,_value,_actorStrength,actorStrength_get,_flattenNonStowing,flattenNonStowing_fn,_localize2,_initialize,initialize_fn,_handleTrickItem,handleTrickItem_fn,_assertEntryIsDocument,assertEntryIsDocument_fn,_getRitualData,getRitualData_fn,_idMap2,_slugMap,_templatePaths,_getActor,getActor_fn,_getSource,getSource_fn,_getTarget,getTarget_fn,_tokenName,tokenName_fn,_sendMessage,sendMessage_fn,_messageFlavor,messageFlavor_fn,_findBestLocation,findBestLocation_fn,_getChildSlots,getChildSlots_fn,_editingSettlements,_prepareSettlement,prepareSettlement_fn,_activateSettlementEvents,activateSettlementEvents_fn,_getFeatSlotData2,getFeatSlotData_fn2,_prepareAbilityBuilder,prepareAbilityBuilder_fn,_originalValue,_slider,_noRefreshHook,_hasRollOptionData,hasRollOptionData_fn,_createItemMacro,createItemMacro_fn,_createRollOptionToggleMacro,createRollOptionToggleMacro_fn,_draggingParty,_onDragHighlightFolderLike,onDragHighlightFolderLike_fn,_appendBrowseButton,appendBrowseButton_fn,_appendBrowseButton2,appendBrowseButton_fn2,_messageFromEvent,messageFromEvent_fn,_onClickDamageButton,onClickDamageButton_fn,_onClickRevertDamage,onClickRevertDamage_fn,_onClickShieldBlock,onClickShieldBlock_fn,_onClickSender,onClickSender_fn,_dragPreview,dragPreview_get,_onToggleTarget,onToggleTarget_fn,_onDropCombatant,onDropCombatant_fn,_setModuleArt,setModuleArt_fn,_getSources,getSources_fn,_createFilteredIndex,createFilteredIndex_fn,_loadSources,loadSources_fn,_getSourceFromDocument,getSourceFromDocument_fn,_domParser,_getRollTableResults,getRollTableResults_fn,_localizeCoins,_creatureTraits,_resetInitializedTabs,resetInitializedTabs_fn,_renderResultList,renderResultList_fn,_activateResultListeners,activateResultListeners_fn,_takePhysicalItem,takePhysicalItem_fn,_buyPhysicalItem,buyPhysicalItem_fn,_getPhysicalItem,getPhysicalItem_fn,_resetFilters,resetFilters_fn,_clearScrollLimit,clearScrollLimit_fn,_getRemainingDurationLabel,getRemainingDurationLabel_fn,_getEnrichedDescriptions,getEnrichedDescriptions_fn,_lastCombatantToken,_ICON_THEME_DIRS,_conditionSummaries,_activateListeners,activateListeners_fn,_updateStatusIcons,updateStatusIcons_fn,_showStatusLabel,showStatusLabel_fn,_setStatusValue,setStatusValue_fn,_toggleStatus,toggleStatus_fn,_createChatMessage,createChatMessage_fn,_action2,_cost,_description,_slug,_traits,_variants,_action3,_effect2,_action4,_difficultyClass,_modifiers,_notes,_rollOptions,_statistic,_insert,insert_fn,_removeExpired,removeExpired_fn,_getArtMap,getArtMap_fn,_isModuleArt,isModuleArt_fn,_retrieve,retrieve_fn,_deposit,deposit_fn,_getDepositSpaces,getDepositSpaces_fn,_prepareActions,prepareActions_fn,_prepareSaves,prepareSaves_fn,_identificationData,_padAttempts,padAttempts_fn,_prepareAbilities2,prepareAbilities_fn2,_prepareAlignment,prepareAlignment_fn,_prepareSkills2,prepareSkills_fn2,_prepareSaves2,prepareSaves_fn2,_onClickRollable,onClickRollable_fn,_rollAbility,rollAbility_fn,_prepareActions2,prepareActions_fn2,_onChangeSpellcastingEntry,onChangeSpellcastingEntry_fn,_prepareMembers,prepareMembers_fn,_prepareOverviewSummary,prepareOverviewSummary_fn,_getActorsThatUnderstand,getActorsThatUnderstand_fn,_renderRegions,renderRegions_fn,_isValidDrop,isValidDrop_fn,_formatSpellComponents,formatSpellComponents_fn,_prepareHeighteningLevels,prepareHeighteningLevels_fn,_activateRBVListeners,activateRBVListeners_fn;import{i as isNil,T as Tagify,p as pick$1,m as mapToObj,a as mapValues$1,o as omit,b as isObject$1,c as compact,k as keys,u as uniq,d as isEmpty,g as groupBy$1,e as equals,s as sortBy$1,S as Sortable,f as uniqBy,M as MiniSearch,h as difference,D as Duration,j as meanBy,E as EditorView,l as basicSetup,n as json,q as linter,r as keymap,t as indentWithTab,v as autocompletion,w as syntaxTree,x as jsonParseLinter,y as fromPairs,z as maxBy,A as sumBy,B as pipe,C as filter,F as map,I as Interval,G as DateTime,H as noUiSlider,P as PipsMode,J as findLast,K as omitBy}from"./vendor.mjs";const BabeleReady={listen(){Hooks.once("babele.ready",()=>{game.pf2e.ConditionManager.initialize(!0)})}},CanvasInit={listen:()=>{Hooks.on("canvasInit",async canvas2=>{SquareGrid.prototype.measureDistances=__name2(__name(function(segments,options={}){if(!options.gridSpaces)return BaseGrid.prototype.measureDistances.call(this,segments,options);let nDiagonal=0;const d=canvas2.dimensions;return segments.map(s=>{const r=s.ray,nx=Math.abs(Math.ceil(r.dx/d.size)),ny=Math.abs(Math.ceil(r.dy/d.size)),nd=Math.min(nx,ny),ns=Math.abs(ny-nx);nDiagonal+=nd;const nd10=Math.floor(nDiagonal/2)-Math.floor((nDiagonal-nd)/2);return(nd10*2+(nd-nd10)+ns)*canvas2.dimensions.distance})},"measureDistances"),"measureDistances")})}},_BaseStatistic=class{static{__name(this,"_BaseStatistic")}actor;slug;label;data;domains;modifiers;constructor(actor,data){this.actor=actor,this.slug=data.slug,this.label=game.i18n.localize(data.label).trim(),this.data={...data},this.domains=[...data.domains??=[]];const modifiers=[data.modifiers??[],extractModifiers(this.actor.synthetics,this.domains)].flat();if(this.modifiers=new StatisticModifier("",modifiers).modifiers.map(m=>m.clone()),this.domains.length>0){const options=this.createRollOptions();for(const modifier of this.modifiers)modifier.test(options)}}createRollOptions(domains=this.domains){return new Set(this.actor.getRollOptions(domains))}};__name2(_BaseStatistic,"BaseStatistic");let BaseStatistic=_BaseStatistic;const _MigrationRunnerBase=class{static{__name(this,"_MigrationRunnerBase")}constructor(migrations=[]){__privateAdd(this,_updateMigrationRecord),__publicField(this,"migrations"),this.migrations=migrations.sort((a,b)=>a.version-b.version)}needsMigration(currentVersion){return currentVersion0&&__privateMethod(this,_updateMigrationRecord,updateMigrationRecord_fn).call(this,current.system._migration,migrations.slice(-1)[0]),current}async getUpdatedTable(tableSource,migrations){const current=deepClone(tableSource);for(const migration of migrations)try{await migration.updateTable?.(current)}catch(err){console.error(err)}return current}async getUpdatedMacro(macroSource,migrations){const current=deepClone(macroSource);for(const migration of migrations)try{await migration.updateMacro?.(current)}catch(err){console.error(err)}return current}async getUpdatedJournalEntry(source,migrations){const clone=deepClone(source);for(const migration of migrations)try{await migration.updateJournalEntry?.(clone)}catch(err){console.error(err)}return clone}async getUpdatedToken(token,migrations){const current=token.toObject();for(const migration of migrations)await migration.updateToken?.(current,token.actor,token.scene);return current}async getUpdatedUser(userData,migrations){const current=deepClone(userData);for(const migration of migrations)try{await migration.updateUser?.(current)}catch(err){console.error(err)}return current}};_updateMigrationRecord=new WeakSet,updateMigrationRecord_fn=__name2(function(migrations,latestMigration){if(!("game"in globalThis&&latestMigration))return;const fromVersion=typeof migrations.version=="number"?migrations.version:null;migrations.version=latestMigration.version,migrations.previous={schema:fromVersion,foundry:game.version,system:game.system.version}},"#updateMigrationRecord"),__name2(_MigrationRunnerBase,"MigrationRunnerBase"),__publicField(_MigrationRunnerBase,"LATEST_SCHEMA_VERSION",.878),__publicField(_MigrationRunnerBase,"MINIMUM_SAFE_VERSION",.618),__publicField(_MigrationRunnerBase,"RECOMMENDED_SAFE_VERSION",.634),__publicField(_MigrationRunnerBase,"FOUNDRY_SCHEMA_VERSIONS",{.8:.634,9:.7,10:.781,11:.841});let MigrationRunnerBase=_MigrationRunnerBase;const _Progress=class{static{__name(this,"_Progress")}value=0;max;label;constructor({max,label}){this.label=label??"",this.max=max}advance({by=1,label=this.label}={}){if(this.value===this.max)return;this.value+=Math.abs(by);const pct=Math.floor(this.value/this.max*100);SceneNavigation.displayProgressBar({label,pct})}close({label=""}={}){SceneNavigation.displayProgressBar({label,pct:100})}};__name2(_Progress,"Progress");let Progress=_Progress;const _MigrationRunner=class _MigrationRunner2 extends MigrationRunnerBase{static{__name(this,"_MigrationRunner")}constructor(){super(...arguments),__privateAdd(this,_migrateDocuments),__privateAdd(this,_migrateItem),__privateAdd(this,_migrateActor),__privateAdd(this,_migrateWorldJournalEntry),__privateAdd(this,_migrateWorldMacro),__privateAdd(this,_migrateWorldTable),__privateAdd(this,_migrateSceneToken),__privateAdd(this,_migrateUser)}needsMigration(){return super.needsMigration(game.settings.get("pf2e","worldSchemaVersion"))}static async ensureSchemaVersion(document2,migrations){if(migrations.length===0)return;const currentVersion=this.LATEST_SCHEMA_VERSION;if((Number(document2.schemaVersion)||0){try{return"items"in source?await runner.getUpdatedActor(source,runner.migrations):await runner.getUpdatedItem(source,runner.migrations)}catch{return null}})();updated&&document2.updateSource(updated)}if(document2.updateSource({"system._migration.version":currentVersion}),"items"in document2&&"token"in document2)for(const item of document2.items)item.schemaVersion||item.updateSource({"system._migration.version":currentVersion})}async runCompendiumMigration(compendium){const pack=compendium.metadata.id;ui.notifications.info(game.i18n.format("PF2E.Migrations.Starting",{version:game.system.version}));const documents=await compendium.getDocuments();await compendium.documentClass.updateDocuments(documents,{diff:!1,recursive:!1,pack}),ui.notifications.info(game.i18n.format("PF2E.Migrations.Finished",{version:game.system.version}))}async runMigrations(migrations){if(migrations.length===0)return;const progress=new Progress({label:game.i18n.localize("PF2E.Migrations.Running"),max:Math.floor(game.actors.size+game.items.size+game.scenes.map(s=>s.tokens.contents).flat().filter(t=>t.actor?.isToken).length)});await __privateMethod(this,_migrateDocuments,migrateDocuments_fn).call(this,game.actors,migrations,progress),await __privateMethod(this,_migrateDocuments,migrateDocuments_fn).call(this,game.items,migrations,progress);for(const entry of game.journal)await __privateMethod(this,_migrateWorldJournalEntry,migrateWorldJournalEntry_fn).call(this,entry,migrations);const promises=[];for(const macro of game.macros)promises.push(__privateMethod(this,_migrateWorldMacro,migrateWorldMacro_fn).call(this,macro,migrations));for(const table of game.tables)promises.push(__privateMethod(this,_migrateWorldTable,migrateWorldTable_fn).call(this,table,migrations));for(const user of game.users)promises.push(__privateMethod(this,_migrateUser,migrateUser_fn).call(this,user,migrations));for(const migration of migrations)migration.migrate&&promises.push(migration.migrate());await Promise.allSettled(promises);for(const scene of game.scenes)for(const token of scene.tokens){const{actor}=token;if(!actor||!!!await __privateMethod(this,_migrateSceneToken,migrateSceneToken_fn).call(this,token,migrations))continue;const deltaSource=token.delta?._source,hasMigratableData=!!deltaSource&&!!deltaSource.flags?.pf2e||((deltaSource??{}).items??[]).length>0||Object.keys(deltaSource?.system??{}).length>0;if(actor.isToken){if(hasMigratableData){const updated=await __privateMethod(this,_migrateActor,migrateActor_fn).call(this,migrations,actor);if(updated)try{await actor.update(updated,{noHook:!0})}catch(error){console.warn(error)}}progress.advance()}}progress.valueschemaVersion.current0&&await this.runMigrations(migrationPhase);await game.settings.set("pf2e","worldSchemaVersion",schemaVersion.latest)}};_migrateDocuments=new WeakSet,migrateDocuments_fn=__name2(async function(collection,migrations,progress){const DocumentClass=collection.documentClass,pack="metadata"in collection?collection.metadata.id:null,updateGroup=[];for(const document2 of collection.contents.sort(a=>a.type==="familiar"?1:-1)){if(updateGroup.length===50)try{await DocumentClass.updateDocuments(updateGroup,{noHook:!0,pack}),progress?.advance({by:updateGroup.length})}catch(error){console.warn(error)}finally{updateGroup.length=0}const updated="items"in document2?await __privateMethod(this,_migrateActor,migrateActor_fn).call(this,migrations,document2,{pack}):await __privateMethod(this,_migrateItem,migrateItem_fn).call(this,migrations,document2);updated&&updateGroup.push(updated)}if(updateGroup.length>0)try{await DocumentClass.updateDocuments(updateGroup,{noHook:!0,pack}),progress?.advance({by:updateGroup.length})}catch(error){console.warn(error)}},"#migrateDocuments"),_migrateItem=new WeakSet,migrateItem_fn=__name2(async function(migrations,item){const baseItem=item.toObject();try{return this.getUpdatedItem(baseItem,migrations)}catch(error){return error instanceof Error&&console.error(`Error thrown while migrating ${item.uuid}: ${error.message}`),null}},"#migrateItem"),_migrateActor=new WeakSet,migrateActor_fn=__name2(async function(migrations,actor,options={}){const{pack}=options,baseActor=actor.toObject(),updatedActor=await(()=>{try{return this.getUpdatedActor(baseActor,migrations)}catch(error){return error instanceof Error&&console.error(`Error thrown while migrating ${actor.uuid}: ${error.message}`),null}})();if(!updatedActor)return null;actor.effects.size>0&&actor.deleteEmbeddedDocuments("ActiveEffect",[],{deleteAll:!0});const baseItems=[...baseActor.items],updatedItems=[...updatedActor.items],itemDiff=this.diffCollection(baseItems,updatedItems),finalDeleted=itemDiff.deleted.filter(id=>actor.items.has(id));if(finalDeleted.length>0)try{await actor.deleteEmbeddedDocuments("Item",finalDeleted,{noHook:!0,pack})}catch(error){console.warn(error)}const finalUpdated=itemDiff.updated.filter(i=>actor.items.has(i._id));return updatedActor.items=[...itemDiff.inserted,...finalUpdated],updatedActor},"#migrateActor"),_migrateWorldJournalEntry=new WeakSet,migrateWorldJournalEntry_fn=__name2(async function(journalEntry,migrations){if(migrations.some(migration=>!!migration.updateJournalEntry))try{const updated=await this.getUpdatedJournalEntry(journalEntry.toObject(),migrations),changes=diffObject(journalEntry.toObject(),updated);Object.keys(changes).length>0&&await journalEntry.update(changes,{noHook:!0})}catch(error){console.warn(error)}},"#migrateWorldJournalEntry"),_migrateWorldMacro=new WeakSet,migrateWorldMacro_fn=__name2(async function(macro,migrations){if(migrations.some(migration=>!!migration.updateMacro))try{const updatedMacro=await this.getUpdatedMacro(macro.toObject(),migrations),changes=diffObject(macro.toObject(),updatedMacro);Object.keys(changes).length>0&&await macro.update(changes,{noHook:!0})}catch(error){console.warn(error)}},"#migrateWorldMacro"),_migrateWorldTable=new WeakSet,migrateWorldTable_fn=__name2(async function(table,migrations){if(migrations.some(migration=>!!migration.updateTable))try{const updatedMacro=await this.getUpdatedTable(table.toObject(),migrations),changes=diffObject(table.toObject(),updatedMacro);Object.keys(changes).length>0&&table.update(changes,{noHook:!0})}catch(error){console.warn(error)}},"#migrateWorldTable"),_migrateSceneToken=new WeakSet,migrateSceneToken_fn=__name2(async function(token,migrations){if(!migrations.some(migration=>!!migration.updateToken))return token.toObject();try{const updatedToken=await this.getUpdatedToken(token,migrations),changes=diffObject(token.toObject(),updatedToken);if(Object.keys(changes).length>0)try{await token.update(changes,{noHook:!0})}catch(error){console.warn(error)}return updatedToken}catch(error){return console.error(error),null}},"#migrateSceneToken"),_migrateUser=new WeakSet,migrateUser_fn=__name2(async function(user,migrations){if(migrations.some(migration=>!!migration.updateUser))try{const baseUser=user.toObject(),updatedUser=await this.getUpdatedUser(baseUser,migrations),changes=diffObject(user.toObject(),updatedUser);Object.keys(changes).length>0&&await user.update(changes,{noHook:!0})}catch(error){console.error(error)}},"#migrateUser"),__name2(_MigrationRunner,"MigrationRunner");let MigrationRunner=_MigrationRunner;const _MigrationBase=class{static{__name(this,"_MigrationBase")}version=this.constructor.version;requiresFlush=!1};__name2(_MigrationBase,"MigrationBase"),__publicField(_MigrationBase,"version");let MigrationBase=_MigrationBase;const _Migration600Reach=class extends MigrationBase{static{__name(this,"_Migration600Reach")}async updateItem(item){item.type==="ancestry"&&(item.system.reach=5)}};__name2(_Migration600Reach,"Migration600Reach"),__publicField(_Migration600Reach,"version",.6);let Migration600Reach=_Migration600Reach;function createHTMLElement(nodeName,{classes=[],dataset={},children=[],innerHTML}={}){const element=document.createElement(nodeName);classes.length>0&&element.classList.add(...classes);for(const[key,value]of Object.entries(dataset).filter(([,v])=>!isNil(v)))element.dataset[key]=String(value);if(innerHTML)element.innerHTML=innerHTML;else for(const child of children){const childElement=child instanceof HTMLElement?child:new Text(child);element.appendChild(childElement)}return element}__name(createHTMLElement,"createHTMLElement"),__name2(createHTMLElement,"createHTMLElement");function htmlQuery(parent,selectors){return parent instanceof Element||parent instanceof Document?parent.querySelector(selectors):null}__name(htmlQuery,"htmlQuery"),__name2(htmlQuery,"htmlQuery");function htmlQueryAll(parent,selectors){return parent instanceof Element||parent instanceof Document?Array.from(parent.querySelectorAll(selectors)):[]}__name(htmlQueryAll,"htmlQueryAll"),__name2(htmlQueryAll,"htmlQueryAll");function htmlClosest(child,selectors){return child instanceof Element?child.closest(selectors):null}__name(htmlClosest,"htmlClosest"),__name2(htmlClosest,"htmlClosest");function groupBy(array,criterion){const result=new Map;for(const elem of array){const key=criterion(elem),group=result.get(key);group?group.push(elem):result.set(key,[elem])}return result}__name(groupBy,"groupBy"),__name2(groupBy,"groupBy");function sortBy(mapping){return(a,b)=>{const value1=mapping(a),value2=mapping(b);return value1(result[key]=mapping(value,key),result),{})}__name(mapValues,"mapValues"),__name2(mapValues,"mapValues");function isBlank(text){return text==null||text.trim()===""}__name(isBlank,"isBlank"),__name2(isBlank,"isBlank");function addSign(number){return number<0?`${number}`:`+${number}`}__name(addSign,"addSign"),__name2(addSign,"addSign");function sum(values){return values.reduce((a,b)=>a+b,0)}__name(sum,"sum"),__name2(sum,"sum");function zip(a,b,zipFunction){return a.length>b.length?b.map((elem,index)=>zipFunction(a[index],elem)):a.map((elem,index)=>zipFunction(elem,b[index]))}__name(zip,"zip"),__name2(zip,"zip");function applyNTimes(func,times,start){let result=start;for(let i=0;i(key in obj&&(result[key]=obj[key]),result),{})}__name(pick,"pick"),__name2(pick,"pick");let intlNumberFormat;function signedInteger(value,{emptyStringZero=!1}={}){return value===0&&emptyStringZero?"":(intlNumberFormat??=new Intl.NumberFormat(game.i18n.lang,{maximumFractionDigits:0,signDisplay:"always"})).format(value)}__name(signedInteger,"signedInteger"),__name2(signedInteger,"signedInteger");const wordCharacter=String.raw`[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}]`,nonWordCharacter=String.raw`[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}]`,nonWordCharacterRE=new RegExp(nonWordCharacter,"gu"),wordBoundary=String.raw`(?:${wordCharacter})(?=${nonWordCharacter})|(?:${nonWordCharacter})(?=${wordCharacter})`,nonWordBoundary=String.raw`(?:${wordCharacter})(?=${wordCharacter})`,lowerCaseLetter=String.raw`\p{Lowercase_Letter}`,upperCaseLetter=String.raw`\p{Uppercase_Letter}`,lowerCaseThenUpperCaseRE=new RegExp(`(${lowerCaseLetter})(${upperCaseLetter}${nonWordBoundary})`,"gu"),nonWordCharacterHyphenOrSpaceRE=/[^-\p{White_Space}\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}]/gu,upperOrWordBoundariedLowerRE=new RegExp(`${upperCaseLetter}|(?:${wordBoundary})${lowerCaseLetter}`,"gu");function sluggify(text,{camel=null}={}){if(typeof text!="string")return console.warn("Non-string argument passed to `sluggify`"),"";if(text==="-")return text;switch(camel){case null:return text.replace(lowerCaseThenUpperCaseRE,"$1-$2").toLowerCase().replace(/['’]/g,"").replace(nonWordCharacterRE," ").trim().replace(/[-\s]+/g,"-");case"bactrian":{const dromedary=sluggify(text,{camel:"dromedary"});return dromedary.charAt(0).toUpperCase()+dromedary.slice(1)}case"dromedary":return text.replace(nonWordCharacterHyphenOrSpaceRE,"").replace(/[-_]+/g," ").replace(upperOrWordBoundariedLowerRE,(part,index)=>index===0?part.toLowerCase():part.toUpperCase()).replace(/\s+/g,"");default:throw ErrorPF2e("I don't think that's a real camel.")}}__name(sluggify,"sluggify"),__name2(sluggify,"sluggify");function parseHTML(unparsed){const fragment=document.createElement("template");fragment.innerHTML=unparsed;const element=fragment.content.firstElementChild;if(!(element instanceof HTMLElement))throw ErrorPF2e("Unexpected error parsing HTML");return element}__name(parseHTML,"parseHTML"),__name2(parseHTML,"parseHTML");function getActionTypeLabel(type,cost){switch(type){case"action":return cost===1?"PF2E.Item.Action.Type.Single":"PF2E.Item.Action.Type.Activity";case"free":return"PF2E.Item.Action.Type.Free";case"reaction":return"PF2E.Item.Action.Type.Reaction";default:return null}}__name(getActionTypeLabel,"getActionTypeLabel"),__name2(getActionTypeLabel,"getActionTypeLabel");const actionImgMap={0:"systems/pf2e/icons/actions/FreeAction.webp",free:"systems/pf2e/icons/actions/FreeAction.webp",1:"systems/pf2e/icons/actions/OneAction.webp",2:"systems/pf2e/icons/actions/TwoActions.webp",3:"systems/pf2e/icons/actions/ThreeActions.webp","1 or 2":"systems/pf2e/icons/actions/OneTwoActions.webp","1 to 3":"systems/pf2e/icons/actions/OneThreeActions.webp","2 or 3":"systems/pf2e/icons/actions/TwoThreeActions.webp",reaction:"systems/pf2e/icons/actions/Reaction.webp",passive:"systems/pf2e/icons/actions/Passive.webp"};function getActionIcon(action2,fallback="systems/pf2e/icons/actions/Empty.webp"){if(action2===null)return actionImgMap.passive;const value=typeof action2!="object"?action2:action2.type==="action"?action2.value:action2.type,sanitized=String(value??"").toLowerCase().trim();return actionImgMap[sanitized]??fallback}__name(getActionIcon,"getActionIcon"),__name2(getActionIcon,"getActionIcon");const actionGlyphMap={0:"F",free:"F",1:"A",2:"D",3:"T","1 or 2":"A/D","1 to 3":"A - T","2 or 3":"D/T",reaction:"R"};function getActionGlyph(action2){if(!action2&&action2!==0)return"";const value=typeof action2!="object"?action2:action2.type==="action"?action2.value:action2.type,sanitized=String(value??"").toLowerCase().trim();return actionGlyphMap[sanitized]??""}__name(getActionGlyph,"getActionGlyph"),__name2(getActionGlyph,"getActionGlyph");function ErrorPF2e(message){return Error(`PF2e System | ${message}`)}__name(ErrorPF2e,"ErrorPF2e"),__name2(ErrorPF2e,"ErrorPF2e");function ordinal(value){const pluralRules=new Intl.PluralRules(game.i18n.lang,{type:"ordinal"}),suffix=game.i18n.localize(`PF2E.OrdinalSuffixes.${pluralRules.select(value)}`);return game.i18n.format("PF2E.OrdinalNumber",{value,suffix})}__name(ordinal,"ordinal"),__name2(ordinal,"ordinal");function localizeList(items,{conjunction="or"}={}){items=[...items].sort((a,b)=>a.localeCompare(b,game.i18n.lang));const parts=conjunction==="or"?"PF2E.ListPartsOr":"PF2E.ListPartsAnd";if(items.length===0)return"";if(items.length===1)return items[0];if(items.length===2)return game.i18n.format(`${parts}.two`,{first:items[0],second:items[1]});let result=game.i18n.format(`${parts}.start`,{first:items[0],second:"{second}"});for(let i=1;i<=items.length-2;i++)if(i===items.length-2){const end=game.i18n.format(`${parts}.end`,{first:items[i],second:items[items.length-1]});result=result.replace("{second}",end)}else{const newSegment=game.i18n.format(`${parts}.middle`,{first:items[i],second:"{second}"});result=result.replace("{second}",newSegment)}return result}__name(localizeList,"localizeList"),__name2(localizeList,"localizeList");function fontAwesomeIcon(glyph,{style="solid",fixedWidth=!1}={}){const styleClass=`fa-${style}`,glyphClass=glyph.startsWith("fa-")?glyph:`fa-${glyph}`,icon=document.createElement("i");return icon.classList.add(styleClass,glyphClass),fixedWidth&&icon.classList.add("fa-fw"),icon}__name(fontAwesomeIcon,"fontAwesomeIcon"),__name2(fontAwesomeIcon,"fontAwesomeIcon");function isObject(value){return typeof value=="object"&&value!==null}__name(isObject,"isObject"),__name2(isObject,"isObject");function sortLabeledRecord(record){return Object.entries(record).sort((a,b)=>a[1].label.localeCompare(b[1].label,game.i18n.lang)).reduce((copy,[key,value])=>mergeObject(copy,{[key]:value}),{})}__name(sortLabeledRecord,"sortLabeledRecord"),__name2(sortLabeledRecord,"sortLabeledRecord");function sortStringRecord(record){return Object.fromEntries(Object.entries(record).map(entry=>(entry[1]=game.i18n.localize(entry[1]),entry)).sort((a,b)=>a[1].localeCompare(b[1],game.i18n.lang)))}__name(sortStringRecord,"sortStringRecord"),__name2(sortStringRecord,"sortStringRecord");function recursiveReplaceString(source,replace){const clone=Array.isArray(source)||isObject(source)?deepClone(source):source;if(typeof clone=="string")return replace(clone);if(Array.isArray(clone))return clone.map(e=>recursiveReplaceString(e,replace));if(isObject(clone))for(const key of Object.keys(clone))clone[key]=recursiveReplaceString(clone[key],replace);return clone}__name(recursiveReplaceString,"recursiveReplaceString"),__name2(recursiveReplaceString,"recursiveReplaceString");function localizer(prefix){return(...[suffix,formatArgs])=>formatArgs?game.i18n.format(`${prefix}.${suffix}`,formatArgs):game.i18n.localize(`${prefix}.${suffix}`)}__name(localizer,"localizer"),__name2(localizer,"localizer");function configFromLocalization(localization,prefix){return Object.entries(localization).reduce((result,[key,value])=>(result[key]=typeof value=="string"?`${prefix}.${key}`:configFromLocalization(value,`${prefix}.${key}`),result),{})}__name(configFromLocalization,"configFromLocalization"),__name2(configFromLocalization,"configFromLocalization");function isImageFilePath(path){return typeof path=="string"&&Object.keys(CONST.IMAGE_FILE_EXTENSIONS).some(e=>path.endsWith(`.${e}`))}__name(isImageFilePath,"isImageFilePath"),__name2(isImageFilePath,"isImageFilePath");function isVideoFilePath(path){return typeof path=="string"&&Object.keys(CONST.VIDEO_FILE_EXTENSIONS).some(e=>path.endsWith(`.${e}`))}__name(isVideoFilePath,"isVideoFilePath"),__name2(isVideoFilePath,"isVideoFilePath");function isImageOrVideoPath(path){return isImageFilePath(path)||isVideoFilePath(path)}__name(isImageOrVideoPath,"isImageOrVideoPath"),__name2(isImageOrVideoPath,"isImageOrVideoPath");const SORTABLE_DEFAULTS={animation:200,direction:"vertical",dragClass:"drag-preview",dragoverBubble:!0,easing:"cubic-bezier(1, 0, 0, 1)",ghostClass:"drag-gap",scroll:!0,scrollSensitivity:30,scrollSpeed:15};function traitSlugToObject(trait,dictionary){const traitObject={name:trait,label:game.i18n.localize(dictionary[trait]??trait)};return objectHasKey(CONFIG.PF2E.traitsDescriptions,trait)&&(traitObject.description=CONFIG.PF2E.traitsDescriptions[trait]),traitObject}__name(traitSlugToObject,"traitSlugToObject"),__name2(traitSlugToObject,"traitSlugToObject");function transformWhitelist(whitelist){return Array.isArray(whitelist)?whitelist:Object.entries(whitelist).map(([key,locPath])=>({id:key,value:game.i18n.localize(typeof locPath=="string"?locPath:locPath.label)})).sort((a,b)=>a.value.localeCompare(b.value,game.i18n.lang))}__name(transformWhitelist,"transformWhitelist"),__name2(transformWhitelist,"transformWhitelist");function tagify$1(input,{whitelist,maxTags,enforceWhitelist=!0}={}){if(input?.hasAttribute("name")&&input.dataset.dtype!=="JSON")throw ErrorPF2e("Usable only on input elements with JSON data-dtype");if(!input)return null;const whitelistTransformed=whitelist?transformWhitelist(whitelist):[],maxItems=whitelist?Object.keys(whitelistTransformed).length:void 0,tagify2=new Tagify(input,{enforceWhitelist:!!whitelist&&enforceWhitelist,keepInvalidTags:!1,skipInvalid:!!whitelist,maxTags:maxTags??maxItems,dropdown:{enabled:0,maxItems,searchKeys:["id","value"]},whitelist:whitelistTransformed});return input.name&&(tagify2.DOM.scope.dataset.name=input.name),tagify2.DOM.input.blur(),tagify2}__name(tagify$1,"tagify$1"),__name2(tagify$1,"tagify$1");const _DelegatedCollection=class{static{__name(this,"_DelegatedCollection")}constructor(entries=[]){__privateAdd(this,_data,void 0),__privateSet(this,_data,new Collection(entries))}[Symbol.iterator](){return __privateGet(this,_data).values()}get size(){return __privateGet(this,_data).size}get contents(){return __privateGet(this,_data).contents}get(key,options){return __privateGet(this,_data).get(key,options)}set(key,value){return __privateGet(this,_data).set(key,value),this}has(key){return __privateGet(this,_data).has(key)}find(predicate){return __privateGet(this,_data).find(predicate)}some(predicate){return __privateGet(this,_data).some(predicate)}filter(predicate){return __privateGet(this,_data).filter(predicate)}map(callback){return __privateGet(this,_data).map(callback)}delete(key){return __privateGet(this,_data).delete(key)}clear(){__privateGet(this,_data).clear()}};_data=new WeakMap,__name2(_DelegatedCollection,"DelegatedCollection");let DelegatedCollection=_DelegatedCollection;const _Migration601SplitEffectCompendia=class _Migration601SplitEffectCompendia2 extends MigrationBase{static{__name(this,"_Migration601SplitEffectCompendia")}async updateItem(item){typeof item.system.description.value=="string"&&(item.system.description.value=item.system.description.value.replace(/(@Compendium\[pf2e\.)(spell-effects)(\.)([a-zA-Z0-9]{16})(\]{.*?})/g,(_full,first,_replace2,dot,itemId,rest)=>{const packName=objectHasKey(_Migration601SplitEffectCompendia2.effectLocations,itemId)?_Migration601SplitEffectCompendia2.effectLocations[itemId]:"??";return first+packName+dot+itemId+rest})),typeof item.flags.core?.sourceId=="string"&&(item.flags.core.sourceId=item.flags.core.sourceId.replace(/(Compendium\.pf2e\.)(spell-effects)(\.)([a-zA-Z0-9]{16})/g,(_full,first,_replace2,dot,itemId)=>{const packName=objectHasKey(_Migration601SplitEffectCompendia2.effectLocations,itemId)?_Migration601SplitEffectCompendia2.effectLocations[itemId]:"??";return first+packName+dot+itemId}))}async migrate(){for(const macro of game.macros)macro._source.command=macro._source.command.replace(/(Compendium\.pf2e\.)(spell-effects)(\.)([a-zA-Z0-9]{16})/g,(_full,first,_replace2,dot,itemId)=>{const packName=objectHasKey(_Migration601SplitEffectCompendia2.effectLocations,itemId)?_Migration601SplitEffectCompendia2.effectLocations[itemId]:"??";return first+packName+dot+itemId})}};__name2(_Migration601SplitEffectCompendia,"Migration601SplitEffectCompendia"),__publicField(_Migration601SplitEffectCompendia,"version",.601),__publicField(_Migration601SplitEffectCompendia,"effectLocations",{QuZ5frBMJF3gi7RY:"consumable-effects","7z1iY4AaNEAIKuAU":"consumable-effects","1mKjaWC65KWPuFR4":"consumable-effects",mi4Md1fB2XThCand:"consumable-effects",R106i7WCXvHLGMTu:"consumable-effects",kkDbalYEavzRpYlp:"consumable-effects",qVKrrKpTghgMIuGH:"consumable-effects",HeRHBo2NaKy5IxhU:"consumable-effects",tTBJ33UGtzXjWOJp:"consumable-effects",xVAdPzFaSvJXPMKv:"consumable-effects",fYjvLx9DHIdCHdDx:"consumable-effects",kwD0wuW5Ndkc9YXB:"consumable-effects",fIpzDpuwLdIS4tW5:"consumable-effects","1ouUo8lLK6H79Rqh":"consumable-effects",xFQRiVU6h8EA6Lw9:"consumable-effects",MI5OCkF9IXmD2lPF:"consumable-effects",S4MZzALqFoXJsr6o:"consumable-effects",wFF0SZs1Hcf87Kk1:"consumable-effects","2C1HuKDQDGFZuv7l":"consumable-effects",q1EhQ716bPSgJVnC:"consumable-effects",eh7EqmDBDW30ShCu:"consumable-effects",wTZnKkT0K4Tdy8mD:"consumable-effects",Cxa7MdgMCUoMqbKm:"consumable-effects",PeuUz7JaabCgl6Yh:"consumable-effects",lNWACCNe9RYgaFxb:"consumable-effects",j9zVZwRBVAcnpEkE:"consumable-effects",qit1mLbJUyRTYcPU:"consumable-effects",jaBMZKdoywOTrQvP:"consumable-effects",RT1BxXrbbGgk40Ti:"consumable-effects",ztxW3lBPRcesF7wK:"consumable-effects","7vCenP9j6FuHRv5C":"consumable-effects","7UL8belWmo7U5YGM":"consumable-effects",bcxVvIbuZWOvsKcA:"consumable-effects","4tepFOJLhZSelPoa":"consumable-effects",qwoLV4awdezlEJ60:"consumable-effects",GBBjw61g4ekJymT0:"consumable-effects",vFOr2JAJxiVvvn2E:"consumable-effects",BV8RPntjc9FUzD3g:"consumable-effects",kgotU0sFmtAHYySB:"consumable-effects",VCypzSu659eC6jNi:"consumable-effects",wyLEew86nhNUXASu:"consumable-effects",Wa4317cqU4lJ8vAQ:"consumable-effects",Z9oPh462q82IYIZ6:"consumable-effects",EpB7yJPEuG6ez4z3:"consumable-effects",PpLxndUSgzgs6dd0:"consumable-effects",lPRuIRbu0rHBkoKY:"consumable-effects",Yxssrnh9UZJAM0V7:"consumable-effects","9MeHc072G4L8AJkp":"consumable-effects",xLilBqqf34ZJYO9i:"consumable-effects","1l139A2Qik4lBHKO":"consumable-effects","2PNo8u4wxSbz5WEs":"consumable-effects",fUrZ4xcMJz0CfTyG:"consumable-effects","6A8jsLR7upLGuRiv":"consumable-effects",Zdh2uO1vVYJmaqld:"consumable-effects",Mf9EBLhYmZerf0nS:"consumable-effects",ModBoFdCi7YQU4gP:"consumable-effects",W3xQBLj5hLOtb6Tj:"consumable-effects","2Bds6d4UGQZqYSZM":"consumable-effects","6PNLBIdlqqWNCFMy":"consumable-effects","988f6NpOo4YzFzIr":"consumable-effects",VPtsrpbP0AE642al:"consumable-effects",MCny5ohCGf09a7Wl:"consumable-effects",RRusoN3HEGnDO1Dg:"consumable-effects",thOpQunbQr77XWdF:"consumable-effects","9keegq0GdS1eSrNr":"consumable-effects",jw6Tr9FbErjLAFLQ:"consumable-effects","5xgapIXn5DwbXHKh":"consumable-effects",t7VUJHSUT6bkVUjg:"consumable-effects",yrbz0rZzp8aZEqbv:"consumable-effects","16tOZk4qy329s2aK":"consumable-effects",zd85Ny1RS46OL0TD:"consumable-effects",oAewXfq9c0ecaSfw:"consumable-effects",dpIrjd1UPY7EnWUD:"consumable-effects","9FfFhu2kl2wMTsiI":"consumable-effects",v5Ht1V4MZvRKRBjL:"consumable-effects",TkRuKKYyPHTGPfgf:"consumable-effects",XrlChFETfe8avLsX:"consumable-effects",qzRcSQ0HTTp58hV2:"consumable-effects",TsWUTODTVi487SEz:"consumable-effects","5Gof60StUppR2Xn9":"consumable-effects",mG6S6zm6hxaF7Tla:"consumable-effects",zlSNbMDIlTOpcO8R:"consumable-effects",b9DTIJyBT8kvIBpj:"consumable-effects",PEPOd38VfVzQMKG5:"consumable-effects","1xHHvQlW4pRR89qj":"consumable-effects",AMhUb42NAJ1aisZp:"consumable-effects",kwOtHtmlH69ctK0O:"consumable-effects",VrYfR2WuyA15zFhq:"consumable-effects",OAN5Fj21PJPhIqRU:"consumable-effects",e6dXfbKzv5sNr1zh:"consumable-effects",Hnt3Trd7TiFICB06:"consumable-effects",p2aGtovaY1feytws:"equipment-effects",yvabfuAO74pvH8hh:"equipment-effects",etJW0w4CiSFgMrWP:"equipment-effects",vOU4Yv2MyAfYBbmF:"equipment-effects",FbFl95WRpzrrijh3:"equipment-effects",iK6JeCsZwm5Vakks:"equipment-effects",P7Y7pO2ulZ5wBgxU:"equipment-effects",cg5qyeMJUh6b4fta:"equipment-effects",fbSFwwp60AuDDKpK:"equipment-effects","88kqcDmsoAEddzUt":"equipment-effects",lLP56tbG689TNKW5:"equipment-effects",PeiuJ951kkBPTCSM:"equipment-effects",G0lG7IIZnCZtYi6v:"equipment-effects",gDefAEEMXVVZgqXH:"equipment-effects",uXEp1rPU5fY4OiBf:"equipment-effects",Uadsb25G18pKdZ2e:"equipment-effects",viCX9fZzTWGuoO85:"equipment-effects",eeGWTG9ZAha4IIOY:"equipment-effects",ioGzmVSmMGXWWBYb:"equipment-effects",pAMyEbJzWBoYoGhs:"equipment-effects","7dLsA9PAb5ij7Bc6":"equipment-effects",NE7Fm5YnUhD4ySX3:"equipment-effects","8ersuvNJXX00XaIQ":"equipment-effects",EpNflrkmWzQ0lEb4:"equipment-effects",iEkH8BKLMUa2wxLX:"equipment-effects",bP40jr6wE6MCsRvY:"equipment-effects",eSIYyxi6uTKiP6W5:"equipment-effects",E4B02mJmNexQLa8F:"equipment-effects","3O5lvuX4VHqtpCkU":"equipment-effects",ah41XCrV4LFsVyzl:"equipment-effects",W3BCLbX6j1IqL0uB:"equipment-effects",zqKzWGLODgIvtiKf:"equipment-effects",lBMhT2W2raYMa8JS:"equipment-effects","5uK3fmGlfJrbWQz4":"equipment-effects",i0tm2ZHekp7rGGR3:"equipment-effects",Zb8RYgmzCI6fQE0o:"equipment-effects",QapoFh0tbUgMwSIB:"equipment-effects",UlalLihKzDxcOdXL:"equipment-effects",lO95TwgihBdTilAB:"equipment-effects","9PASRixhNM0ogqmG":"equipment-effects","7MgpgF8tOXOiDEwv":"equipment-effects","1S51uIRb9bnZtpFU":"equipment-effects","1nCwQErK6hpkNvfw":"feat-effects","5IGz4iheaiUWm5KR":"feat-effects",uFYvW3kFP9iyNfVX:"feat-effects",CgxYa0lrLUjS2ZhI:"feat-effects",nwkYZs6YwXYAJ4ps:"feat-effects",qUowHpn79Dpt1hVn:"feat-effects",RozqjLocahvQWERr:"feat-effects",tPKXLtDJ3bzJcXlv:"feat-effects",gYpy9XBPScIlY93p:"feat-effects",Im5JBInybWFbHEYS:"feat-effects",BCyGDKcplkJiSAKJ:"feat-effects",PMHwCrnh9W4sMu5b:"feat-effects",pf9yvKNg6jZLrE30:"feat-effects",eeAlh6edygcZIz9c:"feat-effects",b2kWJuCPj1rDMdwz:"feat-effects",UQ7vZgmfK0VSFS8A:"feature-effects",s1tulrmW6teTFjVd:"feature-effects",aKRo5TIhUtu0kyEr:"feature-effects",yfbP64r4a9e5oyli:"feature-effects",n1vhmOd7aNiuR3nk:"feature-effects",FNTTeJHiK6iOjrSq:"feature-effects","3gGBZHcUFsHLJeQH":"feature-effects",rJpkKaPRGaH0pLse:"feature-effects","9AUcoY48H5LrVZiF":"feature-effects",KVbS7AbhQdeuA0J6:"feature-effects","6fb15XuSV4TNuVAT":"feature-effects",vguxP8ukwVTWWWaA:"feature-effects",SVGW8CLKwixFlnTv:"feature-effects",ruRAfGJnik7lRavk:"feature-effects",uBJsxCzNhje8m8jj:"feature-effects","7BFd8A9HFrmg6vwL":"feature-effects",z3uyCMBddrPK5umr:"feature-effects",Nv70aqcQgCBpDYp8:"feature-effects",OqH6IaeOwRWkGPrk:"feature-effects",Lb4q2bBAgxamtix5:"feature-effects",Gqy7K6FnbLtwGpud:"spell-effects","41WThj17MZBXTO2X":"spell-effects",sPCWrhUHqlbGhYSD:"spell-effects","3qHKBDF7lrHw8jFK":"spell-effects",l9HRQggofFGIxEse:"spell-effects",beReeFroAx24hj83:"spell-effects",qkwb5DD3zmKwvbk0:"spell-effects",GnWkI3T3LYRlm3X8:"spell-effects",dWbg2gACxMkSnZag:"spell-effects",Jemq5UknGdMO7b73:"spell-effects",LXf1Cqi1zyo4DaLv:"spell-effects"});let Migration601SplitEffectCompendia=_Migration601SplitEffectCompendia;const _Migration602UpdateDiehardFeat=class extends MigrationBase{static{__name(this,"_Migration602UpdateDiehardFeat")}constructor(){super(),__publicField(this,"requiresFlush",!0),__privateAdd(this,_diehardPromise,void 0),__privateSet(this,_diehardPromise,fromUuid("Compendium.pf2e.feats-srd.I0BhPWqYf1bbzEYg"))}async updateActor(source){const diehard=source.items.find(itemData=>itemData.system.slug==="diehard"&&itemData.type==="feat");if(source.type==="character"&&diehard!==void 0&&"dying"in source.system.attributes&&isObject(source.system.attributes.dying)){source.system.attributes.dying.max=4;const diehardIndex=source.items.indexOf(diehard),newDiehard=await __privateGet(this,_diehardPromise);if(!(newDiehard instanceof FeatPF2e))throw Error("PF2E System | Expected item not found in Compendium");source.items.splice(diehardIndex,1,newDiehard.toObject())}}};_diehardPromise=new WeakMap,__name2(_Migration602UpdateDiehardFeat,"Migration602UpdateDiehardFeat"),__publicField(_Migration602UpdateDiehardFeat,"version",.602);let Migration602UpdateDiehardFeat=_Migration602UpdateDiehardFeat;const _Migration603ResetQuickRollDefault=class extends MigrationBase{static{__name(this,"_Migration603ResetQuickRollDefault")}async updateUser(userData){const flags=userData.flags;isObject(flags.PF2e)&&isObject(flags.PF2e.settings)&&typeof flags.PF2e.settings.quickD20roll=="boolean"&&(flags.PF2e.settings.quickD20roll=!1)}};__name2(_Migration603ResetQuickRollDefault,"Migration603ResetQuickRollDefault"),__publicField(_Migration603ResetQuickRollDefault,"version",.603);let Migration603ResetQuickRollDefault=_Migration603ResetQuickRollDefault;const _Migration604FixClassItem=class extends MigrationBase{static{__name(this,"_Migration604FixClassItem")}async updateItem(item){item.type==="class"&&(Array.isArray(item.system.ancestryFeatLevels)&&(item.system.ancestryFeatLevels={value:item.system.ancestryFeatLevels}),Array.isArray(item.system.classFeatLevels)&&(item.system.classFeatLevels={value:item.system.classFeatLevels}),Array.isArray(item.system.skillFeatLevels)&&(item.system.skillFeatLevels={value:item.system.skillFeatLevels}),Array.isArray(item.system.generalFeatLevels)&&(item.system.generalFeatLevels={value:item.system.generalFeatLevels}),Array.isArray(item.system.skillIncreaseLevels)&&(item.system.skillIncreaseLevels={value:item.system.skillIncreaseLevels}),Array.isArray(item.system.abilityBoostLevels)&&(item.system.abilityBoostLevels={value:item.system.abilityBoostLevels}))}};__name2(_Migration604FixClassItem,"Migration604FixClassItem"),__publicField(_Migration604FixClassItem,"version",.604);let Migration604FixClassItem=_Migration604FixClassItem;const PHYSICAL_ITEM_TYPES=new Set(["armor","backpack","book","consumable","equipment","treasure","weapon"]),BULK_VALUES=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","L"],PRECIOUS_MATERIAL_TYPES=new Set(["abysium","adamantine","cold-iron","darkwood","djezet","dragonhide","grisantian-pelt","inubrix","keep-stone","mithral","noqual","orichalcum","peachwood","siccatite","silver","sisterstone","sisterstone-dusk","sisterstone-scarlet","sovereign-steel","warpglass"]),PRECIOUS_MATERIAL_GRADES=new Set(["low","standard","high"]),DENOMINATIONS=["pp","gp","sp","cp"];function isItemSystemData(data){return isObject(data)&&isObject(data.description)&&typeof data.description.value=="string"&&Array.isArray(data.rules)&&(data.slug===null||typeof data.slug=="string")}__name(isItemSystemData,"isItemSystemData"),__name2(isItemSystemData,"isItemSystemData");function isPhysicalData(source){return setHasElement(PHYSICAL_ITEM_TYPES,source.type)}__name(isPhysicalData,"isPhysicalData"),__name2(isPhysicalData,"isPhysicalData");function hasInvestedProperty(source){return isPhysicalData(source)&&"invested"in source.system.equipped}__name(hasInvestedProperty,"hasInvestedProperty"),__name2(hasInvestedProperty,"hasInvestedProperty");const _Migration605CatchUpToTemplateJSON=class extends MigrationBase{static{__name(this,"_Migration605CatchUpToTemplateJSON")}addEffects(entityData){Array.isArray(entityData.effects)||(entityData.effects=[])}async updateActor(actorData){if(this.addEffects(actorData),actorData.type==="character"||actorData.type==="npc"){if("max"in actorData.system.attributes.hp&&typeof actorData.system.attributes.hp.max=="string"){const newMax=parseInt(actorData.system.attributes.hp.max,10);Number.isInteger(newMax)&&(actorData.system.attributes.hp.max=newMax)}if(typeof actorData.system.attributes.hp.value=="string"){const newValue=parseInt(actorData.system.attributes.hp.value,10);Number.isInteger(newValue)&&(actorData.system.attributes.hp.value=newValue)}if(typeof actorData.system.details.level.value=="string"){const newLevel=parseInt(actorData.system.details.level.value,10);Number.isInteger(newLevel)&&(actorData.system.details.level.value=newLevel)}"tempmax"in actorData.system.attributes.hp&&delete actorData.system.attributes.hp.tempmax,"special"in actorData.system.attributes.speed&&delete actorData.system.attributes.speed.special}}async updateItem(itemData,actorData){this.addEffects(itemData),!itemData.system.slug&&actorData&&(itemData.system.slug=null),Array.isArray(itemData.system.rules)||(itemData.system.rules=[]);const traits=itemData.system.traits;if(traits&&!traits.custom&&(traits.custom=""),traits&&!traits.rarity&&(traits.rarity={value:"common"}),isPhysicalData(itemData)&&!itemData.system.identification){const withoutIdentifyData=itemData.system;withoutIdentifyData.identification.status="identified"}itemData.type==="spell"&&!itemData.system.hasCounteractCheck&&(itemData.system.hasCounteractCheck={value:!1}),itemData.type==="lore"&&"featType"in itemData.system&&delete itemData.system.featType,itemData.type==="action"&&"skill_requirements"in itemData.system&&delete itemData.system.skill_requirements,itemData.type==="action"&&"skill_requirement"in itemData.system&&itemData.system.skill_requirement}};__name2(_Migration605CatchUpToTemplateJSON,"Migration605CatchUpToTemplateJSON"),__publicField(_Migration605CatchUpToTemplateJSON,"version",.605);let Migration605CatchUpToTemplateJSON=_Migration605CatchUpToTemplateJSON;const _Migration606SignatureSpells=class extends MigrationBase{static{__name(this,"_Migration606SignatureSpells")}async updateItem(item){if(item.type==="spellcastingEntry"){const data=item.system;data.signatureSpells||(data.signatureSpells={value:[]})}}};__name2(_Migration606SignatureSpells,"Migration606SignatureSpells"),__publicField(_Migration606SignatureSpells,"version",.606);let Migration606SignatureSpells=_Migration606SignatureSpells;const _Migration607MeleeItemDamageRolls=class extends MigrationBase{static{__name(this,"_Migration607MeleeItemDamageRolls")}async updateItem(itemData){if(itemData.type==="melee"&&Array.isArray(itemData.system.damageRolls)){const damageRolls={};itemData.system.damageRolls.forEach(roll=>{const key=randomID(20);damageRolls[key]=roll}),itemData.system.damageRolls=damageRolls}}};__name2(_Migration607MeleeItemDamageRolls,"Migration607MeleeItemDamageRolls"),__publicField(_Migration607MeleeItemDamageRolls,"version",.607);let Migration607MeleeItemDamageRolls=_Migration607MeleeItemDamageRolls;const _Migration608DeletePersistedKits=class extends MigrationBase{static{__name(this,"_Migration608DeletePersistedKits")}async updateItem(itemData,actorData){if(actorData&&itemData.type==="kit"){const index=actorData.items.indexOf(itemData);actorData.items.splice(index,1)}}};__name2(_Migration608DeletePersistedKits,"Migration608DeletePersistedKits"),__publicField(_Migration608DeletePersistedKits,"version",.608);let Migration608DeletePersistedKits=_Migration608DeletePersistedKits;const _Migration609LootActorTraits=class extends MigrationBase{static{__name(this,"_Migration609LootActorTraits")}async updateActor(source){if(source.type==="loot"&&source.system.traits&&"traits"in source.system.traits){const systemData=source.system;systemData.traits||(systemData.traits={rarity:{value:"common"},size:{value:"med"},traits:{value:[]},di:{value:[]},dr:[],dv:[],ci:[]})}}};__name2(_Migration609LootActorTraits,"Migration609LootActorTraits"),__publicField(_Migration609LootActorTraits,"version",.609);let Migration609LootActorTraits=_Migration609LootActorTraits;const _Migration610SetHeritageFeatType=class extends MigrationBase{static{__name(this,"_Migration610SetHeritageFeatType")}async updateItem(source){const itemTraits=source.system.traits?.value;if(source.type==="feat"&&itemTraits?.includes("heritage")){const{system}=source,featType="featType"in system&&isObject(system.featType)&&"value"in system.featType&&typeof system.featType.value=="string"?system.featType:{value:""};featType.value="heritage";const index=itemTraits.indexOf("heritage");itemTraits.splice(index,1)}}};__name2(_Migration610SetHeritageFeatType,"Migration610SetHeritageFeatType"),__publicField(_Migration610SetHeritageFeatType,"version",.61);let Migration610SetHeritageFeatType=_Migration610SetHeritageFeatType;const _Migration611UpdateToughnessMountainsStoutness=class extends MigrationBase{static{__name(this,"_Migration611UpdateToughnessMountainsStoutness")}constructor(){super(),__publicField(this,"requiresFlush",!0),__privateAdd(this,_featSlugs,["mountains-stoutness","mountain-s-stoutness","toughness"]),__privateAdd(this,_featsPromise,void 0),__privateSet(this,_featsPromise,game.packs.get("pf2e.feats-srd").getDocuments())}async updateActor(actorData){if(actorData.type!=="character")return;const oldFeatsData=actorData.items.filter(itemData=>__privateGet(this,_featSlugs).includes(itemData.system.slug??"")&&itemData.type==="feat");for(const oldFeatData of oldFeatsData){oldFeatData.system.slug==="mountain-s-stoutness"&&(oldFeatData.system.slug="mountains-stoutness");const newFeat=oldFeatData.system.slug==="toughness"?(await __privateGet(this,_featsPromise)).find(feat=>feat.slug==="toughness"):(await __privateGet(this,_featsPromise)).find(feat=>feat.slug==="mountains-stoutness");if(!(newFeat instanceof FeatPF2e))throw ErrorPF2e("Expected item not found in Compendium");newFeat._source.system.location=oldFeatData.system.location;const oldFeatIndex=actorData.items.indexOf(oldFeatData);actorData.items.splice(oldFeatIndex,1,newFeat.toObject())}}};_featSlugs=new WeakMap,_featsPromise=new WeakMap,__name2(_Migration611UpdateToughnessMountainsStoutness,"Migration611UpdateToughnessMountainsStoutness"),__publicField(_Migration611UpdateToughnessMountainsStoutness,"version",.611);let Migration611UpdateToughnessMountainsStoutness=_Migration611UpdateToughnessMountainsStoutness;const _Migration612NormalizeRarities=class extends MigrationBase{static{__name(this,"_Migration612NormalizeRarities")}async updateActor(source){const traitsRaw=source.system.traits;if(source.type==="familiar"||!traitsRaw)return;const traitsAndOtherMiscellany=traitsRaw;"rarity"in traitsAndOtherMiscellany||(traitsAndOtherMiscellany.rarity={value:"common"});const rarities=["common","uncommon","rare","unique"];for(const rarity of rarities){const{traits}=traitsAndOtherMiscellany;if(traits?.value.includes(rarity)){const index=traits.value.indexOf(rarity);traits.value.splice(index,1),traitsAndOtherMiscellany.rarity={value:rarity}}}}};__name2(_Migration612NormalizeRarities,"Migration612NormalizeRarities"),__publicField(_Migration612NormalizeRarities,"version",.612);let Migration612NormalizeRarities=_Migration612NormalizeRarities;const _Migration613RemoveAmmoCharges=class extends MigrationBase{static{__name(this,"_Migration613RemoveAmmoCharges")}async updateItem(itemData){itemData.type==="consumable"&&itemData.system.consumableType.value==="ammo"&&(itemData.system.charges.value=0,itemData.system.charges.max=0)}};__name2(_Migration613RemoveAmmoCharges,"Migration613RemoveAmmoCharges"),__publicField(_Migration613RemoveAmmoCharges,"version",.613);let Migration613RemoveAmmoCharges=_Migration613RemoveAmmoCharges;const _Migration614NumifyMeleeBonuses=class extends MigrationBase{static{__name(this,"_Migration614NumifyMeleeBonuses")}async updateItem(itemData){itemData.type==="melee"&&(itemData.system.bonus={value:Number(itemData.system.bonus.value)})}};__name2(_Migration614NumifyMeleeBonuses,"Migration614NumifyMeleeBonuses"),__publicField(_Migration614NumifyMeleeBonuses,"version",.614);let Migration614NumifyMeleeBonuses=_Migration614NumifyMeleeBonuses;const _Migration615RemoveInstinctTrait=class extends MigrationBase{static{__name(this,"_Migration615RemoveInstinctTrait")}async updateItem(itemData){const traits=itemData.system.traits;traits&&(typeof traits.value=="string"?traits.value=[]:traits.value=traits.value?.filter(trait=>trait!=="instinct"))}};__name2(_Migration615RemoveInstinctTrait,"Migration615RemoveInstinctTrait"),__publicField(_Migration615RemoveInstinctTrait,"version",.615);let Migration615RemoveInstinctTrait=_Migration615RemoveInstinctTrait;const _Migration616MigrateFeatPrerequisites=class extends MigrationBase{static{__name(this,"_Migration616MigrateFeatPrerequisites")}async updateItem(source){if(source.type==="feat"){const update=[],prerequisites=source.system.prerequisites;if(prerequisites.value){if(typeof prerequisites.value=="string")update.push({value:prerequisites.value});else if(Array.isArray(prerequisites.value))for(const p of prerequisites.value)p&&update.push({value:isObject(p)&&typeof p.value=="string"?p.value:String(p)})}else if(Array.isArray(prerequisites))for(const p of prerequisites)p&&update.push({value:p?.value?p.value:p});source.system.prerequisites={value:update}}}};__name2(_Migration616MigrateFeatPrerequisites,"Migration616MigrateFeatPrerequisites"),__publicField(_Migration616MigrateFeatPrerequisites,"version",.616);let Migration616MigrateFeatPrerequisites=_Migration616MigrateFeatPrerequisites;const _Migration617FixUserFlags=class extends MigrationBase{static{__name(this,"_Migration617FixUserFlags")}async updateUser(source){const flags=source.flags,settings=flags.PF2e?.settings;if(isObject(settings)&&typeof settings.color=="string"){const uiTheme=settings.color??"blue",showRollDialogs=!settings.quickD20roll;flags.pf2e??={},flags.pf2e.settings={uiTheme,showEffectPanel:flags.pf2e?.showEffectPanel??!0,showRollDialogs},delete flags.PF2e,flags["-=PF2e"]=null}}};__name2(_Migration617FixUserFlags,"Migration617FixUserFlags"),__publicField(_Migration617FixUserFlags,"version",.617);let Migration617FixUserFlags=_Migration617FixUserFlags;const _Migration618MigrateItemImagePaths=class extends MigrationBase{static{__name(this,"_Migration618MigrateItemImagePaths")}constructor(){super(...arguments),__privateAdd(this,_IMAGE_PATHS,{"systems/pf2e/icons/equipment/weapons/blowgun.png":"systems/pf2e/icons/equipment/weapons/blowgun.jpg","systems/pf2e/icons/equipment/weapons/trident.png":"systems/pf2e/icons/equipment/weapons/trident.jpg","systems/pf2e/icons/equipment/weapons/longsword.png":"systems/pf2e/icons/equipment/weapons/longsword.jpg","systems/pf2e/icons/equipment/weapons/composite-longbow.png":"systems/pf2e/icons/equipment/weapons/composite-longbow.jpg","systems/pf2e/icons/equipment/weapons/composite-shortbow.png":"systems/pf2e/icons/equipment/weapons/composite-shortbow.jpg","systems/pf2e/icons/equipment/weapons/dagger.png":"systems/pf2e/icons/equipment/weapons/dagger.jpg","systems/pf2e/icons/equipment/weapons/katar.png":"systems/pf2e/icons/equipment/weapons/katar.jpg","systems/pf2e/icons/equipment/weapons/kukri.png":"systems/pf2e/icons/equipment/weapons/kukri.jpg","systems/pf2e/icons/equipment/weapons/shortbow.png":"systems/pf2e/icons/equipment/weapons/shortbow.jpg","systems/pf2e/icons/equipment/weapons/scimitar.png":"systems/pf2e/icons/equipment/weapons/scimitar.jpg","systems/pf2e/icons/equipment/weapons/hatchet.png":"systems/pf2e/icons/equipment/weapons/hatchet.jpg","systems/pf2e/icons/equipment/weapons/halfling-sling-staff.png":"systems/pf2e/icons/equipment/weapons/halfling-sling-staff.jpg","systems/pf2e/icons/equipment/weapons/halberd.png":"systems/pf2e/icons/equipment/weapons/halberd.jpg","systems/pf2e/icons/equipment/weapons/shield-spikes.png":"systems/pf2e/icons/equipment/weapons/shield-spikes.jpg","systems/pf2e/icons/equipment/weapons/light-mace.jpg":"systems/pf2e/icons/equipment/weapons/light-mace.jpg","systems/pf2e/icons/equipment/weapons/morningstar.png":"systems/pf2e/icons/equipment/weapons/morningstar.jpg","systems/pf2e/icons/equipment/weapons/sling.png":"systems/pf2e/icons/equipment/weapons/sling.jpg","systems/pf2e/icons/equipment/weapons/main-gauche.png":"systems/pf2e/icons/equipment/weapons/main-gauche.jpg","systems/pf2e/icons/equipment/weapons/bastard-sword.png":"systems/pf2e/icons/equipment/weapons/bastard-sword.jpg","systems/pf2e/icons/equipment/weapons/spear.png":"systems/pf2e/icons/equipment/weapons/spear.jpg","systems/pf2e/icons/equipment/weapons/staff.png":"systems/pf2e/icons/equipment/weapons/staff.jpg","systems/pf2e/icons/equipment/weapons/katana.png":"systems/pf2e/icons/equipment/weapons/katana.jpg","systems/pf2e/icons/equipment/weapons/elven-curve-blade.png":"systems/pf2e/icons/equipment/weapons/elven-curve-blade.jpg","systems/pf2e/icons/equipment/weapons/bo-staff.png":"systems/pf2e/icons/equipment/weapons/bo-staff.jpg","systems/pf2e/icons/equipment/weapons/clan-dagger.png":"systems/pf2e/icons/equipment/weapons/clan-dagger.jpg","systems/pf2e/icons/equipment/weapons/dogslicer.png":"systems/pf2e/icons/equipment/weapons/dogslicer.jpg","systems/pf2e/icons/equipment/weapons/falchion.png":"systems/pf2e/icons/equipment/weapons/falchion.jpg","systems/pf2e/icons/equipment/weapons/fist.png":"systems/pf2e/icons/equipment/weapons/fist.jpg","systems/pf2e/icons/equipment/weapons/gauntlet.png":"systems/pf2e/icons/equipment/weapons/gauntlet.jpg","systems/pf2e/icons/equipment/weapons/gnome-hooked-hammer.png":"systems/pf2e/icons/equipment/weapons/gnome-hooked-hammer.jpg","systems/pf2e/icons/equipment/weapons/greatpick.png":"systems/pf2e/icons/equipment/weapons/greatpick.jpg","systems/pf2e/icons/equipment/weapons/guisarme.png":"systems/pf2e/icons/equipment/weapons/guisarme.jpg","systems/pf2e/icons/equipment/weapons/horsechopper.png":"systems/pf2e/icons/equipment/weapons/horsechopper.jpg","systems/pf2e/icons/equipment/weapons/lance.png":"systems/pf2e/icons/equipment/weapons/lance.jpg","systems/pf2e/icons/equipment/weapons/maul.png":"systems/pf2e/icons/equipment/weapons/maul.jpg","systems/pf2e/icons/equipment/weapons/pick.png":"systems/pf2e/icons/equipment/weapons/pick.jpg","systems/pf2e/icons/equipment/weapons/ranseur.png":"systems/pf2e/icons/equipment/weapons/ranseur.jpg","systems/pf2e/icons/equipment/weapons/sai.png":"systems/pf2e/icons/equipment/weapons/sai.jpg","systems/pf2e/icons/equipment/weapons/sawtooth-saber.png":"systems/pf2e/icons/equipment/weapons/sawtooth-saber.jpg","systems/pf2e/icons/equipment/weapons/shield-bash.png":"systems/pf2e/icons/equipment/weapons/shield-bash.jpg","systems/pf2e/icons/equipment/weapons/shield-boss.png":"systems/pf2e/icons/equipment/weapons/shield-boss.jpg","systems/pf2e/icons/equipment/weapons/shuriken.png":"systems/pf2e/icons/equipment/weapons/shuriken.jpg","systems/pf2e/icons/equipment/weapons/spiked-gauntlet.png":"systems/pf2e/icons/equipment/weapons/spiked-gauntlet.jpg","systems/pf2e/icons/equipment/weapons/broom.png":"systems/pf2e/icons/equipment/held-items/broom-of-flying.jpg","systems/pf2e/icons/equipment/weapons/cutlass.png":"systems/pf2e/icons/equipment/weapons/scimitar.jpg","systems/pf2e/icons/equipment/weapons/scalpel.png":"systems/pf2e/icons/equipment/weapons/war-razor.jpg","systems/pf2e/icons/equipment/weapons/cane.png":"systems/pf2e/icons/equipment/weapons/cane.jpg"})}async updateItem(itemData){itemData.img=__privateGet(this,_IMAGE_PATHS)[itemData.img]??itemData.img}};_IMAGE_PATHS=new WeakMap,__name2(_Migration618MigrateItemImagePaths,"Migration618MigrateItemImagePaths"),__publicField(_Migration618MigrateItemImagePaths,"version",.618);let Migration618MigrateItemImagePaths=_Migration618MigrateItemImagePaths;const LEGIT_TRADITIONS=["arcane","divine","occult","primal","focus","ritual","halcyon",""];function makeLowercase(value){return value.toLowerCase()}__name(makeLowercase,"makeLowercase"),__name2(makeLowercase,"makeLowercase");const _Migration619TraditionLowercaseAndRemoveWandScroll=class extends MigrationBase{static{__name(this,"_Migration619TraditionLowercaseAndRemoveWandScroll")}async updateItem(item,actorData){if(!actorData||item.type!=="spellcastingEntry")return;const tradition=item.system.tradition;if(tradition.value=makeLowercase(tradition.value),tupleHasValue(LEGIT_TRADITIONS,item.system.tradition.value))return;const highestTradition=actorData.items.filter(itemData=>itemData.type==="spellcastingEntry").reduce((prev,current)=>{if(tupleHasValue(LEGIT_TRADITIONS,current.system.tradition.value)){const value=current.system.spelldc.value??0;if(value>prev.value)return{name:current.system.tradition.value,value}}return prev},{name:"arcane",value:0});tradition.value=highestTradition.name}};__name2(_Migration619TraditionLowercaseAndRemoveWandScroll,"Migration619TraditionLowercaseAndRemoveWandScroll"),__publicField(_Migration619TraditionLowercaseAndRemoveWandScroll,"version",.619);let Migration619TraditionLowercaseAndRemoveWandScroll=_Migration619TraditionLowercaseAndRemoveWandScroll;const _Migration620RenameToWebp=class extends MigrationBase{static{__name(this,"_Migration620RenameToWebp")}constructor(){super(...arguments),__privateAdd(this,_renameToWebP),__privateAdd(this,_isABCK),__privateAdd(this,_regexp,/(\/?systems\/pf2e\/[^"]+)\.(?:jpg|png)\b/)}async updateActor(source){source.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,source.img),typeof source.prototypeToken?.texture.src=="string"&&(source.prototypeToken.texture.src=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,source.prototypeToken.texture.src));for(const effect of source.effects??[])effect.icon=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,effect.icon);if(source.type==="character"){const details=source.system.details;details.deity&&(details.deity.image=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,details.deity.image))}}async updateItem(itemData){itemData.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,itemData.img);for(const effect of itemData.effects??[])effect.icon=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,effect.icon);if(__privateMethod(this,_isABCK,isABCK_fn).call(this,itemData)){const embedData=itemData.system.items,embeds=Object.values(embedData).filter(maybeEmbed=>!!maybeEmbed);for(const embed of embeds)if(embed.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,embed.img),"items"in embed&&embed.items){const deepEmbeds=Object.values(embed.items).filter(maybeDeepEmbed=>!!maybeDeepEmbed);for(const deepEmbed of deepEmbeds)deepEmbed.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,deepEmbed.img)}}}async updateMacro(macroData){macroData.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,macroData.img)}async updateTable(tableData){tableData.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,tableData.img);for(const result of tableData.results)result.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,result.img)}async updateToken(tokenData){tokenData.texture.src=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,tokenData.texture.src),tokenData.effects=tokenData.effects.filter(texture=>!__privateGet(this,_regexp).test(texture))}async updateUser(source){source.avatar=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,source.avatar)}};_regexp=new WeakMap,_renameToWebP=new WeakSet,renameToWebP_fn=__name2(function(imgPath){return typeof imgPath=="string"&&__privateGet(this,_regexp).test(imgPath)?imgPath.replace(__privateGet(this,_regexp),"$1.webp"):imgPath?.replace("icons/svg/mystery-man.svg","systems/pf2e/icons/default-icons/mystery-man.svg")},"#renameToWebP"),_isABCK=new WeakSet,isABCK_fn=__name2(function(itemData){return["ancestry","background","class","kit"].includes(itemData.type)},"#isABCK"),__name2(_Migration620RenameToWebp,"Migration620RenameToWebp"),__publicField(_Migration620RenameToWebp,"version",.62);let Migration620RenameToWebp=_Migration620RenameToWebp;const MAGIC_SCHOOLS=new Set(["abjuration","conjuration","divination","enchantment","evocation","illusion","necromancy","transmutation"]),MAGIC_TRADITIONS=new Set(["arcane","divine","occult","primal"]),_Migration621RemoveConfigSpellSchools=class extends MigrationBase{static{__name(this,"_Migration621RemoveConfigSpellSchools")}KEY_MAP={abj:"abjuration",con:"conjuration",div:"divination",enc:"enchantment",evo:"evocation",ill:"illusion",nec:"necromancy",trs:"transmutation"};reassignSchool(abbreviation){return objectHasKey(this.KEY_MAP,abbreviation)?this.KEY_MAP[abbreviation]:setHasElement(MAGIC_SCHOOLS,abbreviation)?abbreviation:this.KEY_MAP.evo}async updateItem(itemData){if(itemData.type==="spell"){const school=itemData.system.school??{value:"evocation"};school.value=this.reassignSchool(school.value)}}};__name2(_Migration621RemoveConfigSpellSchools,"Migration621RemoveConfigSpellSchools"),__publicField(_Migration621RemoveConfigSpellSchools,"version",.621);let Migration621RemoveConfigSpellSchools=_Migration621RemoveConfigSpellSchools;const _Migration623NumifyPotencyRunes=class extends MigrationBase{static{__name(this,"_Migration623NumifyPotencyRunes")}async updateItem(itemData){if(!(itemData.type==="weapon"||itemData.type==="armor"))return;const potencyRune=itemData.system.potencyRune;potencyRune?potencyRune.value=Number(itemData.system.potencyRune.value)||null:itemData.system.potencyRune={value:null}}};__name2(_Migration623NumifyPotencyRunes,"Migration623NumifyPotencyRunes"),__publicField(_Migration623NumifyPotencyRunes,"version",.623);let Migration623NumifyPotencyRunes=_Migration623NumifyPotencyRunes;const _Migration624RemoveTokenEffectIconFlags=class extends MigrationBase{static{__name(this,"_Migration624RemoveTokenEffectIconFlags")}async updateActor(actorData){const flags=actorData.flags;flags.pf2e?.token?.effects&&(delete flags.pf2e.token.effects,"game"in globalThis&&(flags.pf2e.token["-=effects"]=null))}async updateToken(tokenData){const flags=tokenData.delta?.flags??{};flags.pf2e?.token?.effects&&(delete flags.pf2e.token.effects,"game"in globalThis&&(flags.pf2e.token["-=effects"]=null))}};__name2(_Migration624RemoveTokenEffectIconFlags,"Migration624RemoveTokenEffectIconFlags"),__publicField(_Migration624RemoveTokenEffectIconFlags,"version",.624);let Migration624RemoveTokenEffectIconFlags=_Migration624RemoveTokenEffectIconFlags;const _Migration625EnsurePresenceOfSaves=class extends MigrationBase{static{__name(this,"_Migration625EnsurePresenceOfSaves")}async updateActor(actorData){if(actorData.type!=="npc")return;const saves=actorData.system.saves;for(const key of["fortitude","reflex","will"])saves[key]??={value:0,saveDetail:""},typeof saves[key].value!="number"&&(saves[key].value=Number(saves[key].value)||0),typeof saves[key].saveDetail!="string"&&(saves[key].saveDetail="")}};__name2(_Migration625EnsurePresenceOfSaves,"Migration625EnsurePresenceOfSaves"),__publicField(_Migration625EnsurePresenceOfSaves,"version",.625);let Migration625EnsurePresenceOfSaves=_Migration625EnsurePresenceOfSaves;const _Migration626UpdateSpellCategory=class extends MigrationBase{static{__name(this,"_Migration626UpdateSpellCategory")}async updateItem(source){if(source.type!=="spell")return;const systemData=source.system,traditions=systemData.traditions,isFocus=traditions.value.includes("focus"),isRitual=traditions.value.includes("ritual");if(typeof traditions.value=="string"&&(traditions.value=[]),systemData.spellCategorie||systemData.spellCategory){const currentCategory=systemData.spellCategorie?.value??systemData.spellCategory?.value??"";source.system.category={value:isFocus?"focus":isRitual?"ritual":currentCategory===""?"spell":currentCategory},delete systemData.spellCategorie,delete systemData.spellCategory,"game"in globalThis&&(systemData["-=spellCategorie"]=null,systemData["-=spellCategory"]=null)}["focus","ritual"].includes(source.system.spellType.value)&&(source.system.spellType.value="utility"),traditions.value=traditions.value.filter(tradition=>!["focus","ritual"].includes(tradition))}};__name2(_Migration626UpdateSpellCategory,"Migration626UpdateSpellCategory"),__publicField(_Migration626UpdateSpellCategory,"version",.626);let Migration626UpdateSpellCategory=_Migration626UpdateSpellCategory;const _Migration627LowerCaseSpellSaves=class extends MigrationBase{static{__name(this,"_Migration627LowerCaseSpellSaves")}async updateItem(itemData){if(itemData.type!=="spell")return;const saveType=itemData.system.save.value?.toLowerCase()??"";tupleHasValue(["fortitude","reflex","will"],saveType)?itemData.system.save.value=saveType:itemData.system.save.value=""}};__name2(_Migration627LowerCaseSpellSaves,"Migration627LowerCaseSpellSaves"),__publicField(_Migration627LowerCaseSpellSaves,"version",.627);let Migration627LowerCaseSpellSaves=_Migration627LowerCaseSpellSaves;const _Migration629SetBaseItems=class extends MigrationBase{static{__name(this,"_Migration629SetBaseItems")}constructor(){super(...arguments),__privateAdd(this,_BASE_ARMORS,["explorers-clothing","padded-armor","leather-armor","studded-leather-armor","chain-shirt","hide-armor","scale-mail","chain-mail","breastplate","splint-mail","half-plate","full-plate","hellknight-plate"]),__privateAdd(this,_MAGIC_ARMOR_TO_BASE,{"breastplate-of-command-greater":"breastplate","breastplate-of-command":"breastplate","celestial-armor":"chain-mail","demon-armor":"full-plate",dragonplate:"full-plate","electric-eelskin":"leather-armor","forgotten-shell":"full-plate","ghoul-hide":"hide-armor","glorious-plate":"full-plate","impenetrable-scale":"scale-mail","jerkin-of-liberation":"studded-leather-armor","mail-of-luck":"splint-mail","moonlit-chain":"chain-shirt","noxious-jerkin":"padded-armor","numerian-steel-breastplate":"breastplate","plate-armor-of-the-deep":"full-plate","rhino-hide":"hide-armor","spangled-riders-suit":"studded-leather-armor","victory-plate":"full-plate"}),__privateAdd(this,_BASE_WEAPONS,["adze","aklys","alchemical-bomb","alchemical-crossbow","aldori-dueling-sword","arrows","bastard-sword","battle-axe","battle-lute","bladed-diabolo","bladed-hoop","bladed-scarf","blowgun-darts","blowgun","bo-staff","boarding-axe","boarding-pike","bola","bolts","buugeng","clan-dagger","claw","claw-blade","club","combat-grapnel","composite-longbow","composite-shortbow","crossbow","dagger","daikyu","dart","dogslicer","dwarven-war-axe","elven-curve-blade","exquisite-sword-cane-sheath","exquisite-sword-cane","falchion","fangwire","fauchard","fighting-fan","filchers-fork","fire-poi","fist","flail","gaff","gauntlet","gill-hook","glaive","gnome-flickmace","gnome-hooked-hammer","greataxe","greatclub","greatpick","greatsword","guisarme","halberd","halfling-sling-staff","hand-adze","hand-crossbow","hatchet","heavy-crossbow","horsechopper","javelin","jaws","juggling-club","kama","katana","katar","khakkhara","khopesh","kukri","lance","light-hammer","light-mace","light-pick","longbow","longspear","longsword","mace","machete","main-gauche","mambele","maul","meteor-hammer","monkeys-fist","morningstar","naginata","nightstick","nine-ring-sword","nunchaku","ogre-hook","orc-knuckle-dagger","orc-necksplitter","pick","poi","polytool","ranseur","rapier","rhoka-sword","rungu","sai","sap","sawtooth-saber","scimitar","scorpion-whip","scourge","scythe","shears","shield-bash","shield-boss","shield-spikes","shortbow","shortsword","shuriken","sickle","sling-bullets","sling","spear","spiked-chain","spiked-gauntlet","staff","starknife","stiletto-pen","sword-cane","tamchal-chakram","taw-launcher","tekko-kagi","temple-sword","tengu-gale-blade","throwing-knife","thunder-sling","tricky-pick","trident","urumi","wakizashi","war-flail","war-razor","warhammer","whip-claw","whip","wish-blade","wish-knife","wooden-taws"])}async updateItem(itemData){if(!isPhysicalData(itemData))return;const systemData=itemData.system;!systemData.slug||itemData.type!=="armor"&&itemData.type!=="weapon"||(itemData.type==="armor"?((systemData.slug==="hide"||sluggify(itemData.name)==="hide")&&(systemData.slug="hide-armor"),__privateGet(this,_BASE_ARMORS).includes(systemData.slug??"")?systemData.baseItem=systemData.slug:systemData.slug in __privateGet(this,_MAGIC_ARMOR_TO_BASE)&&(systemData.baseItem=__privateGet(this,_MAGIC_ARMOR_TO_BASE)[systemData.slug])):itemData.type==="weapon"&&(__privateGet(this,_BASE_WEAPONS).includes(systemData.slug)&&(systemData.baseItem=systemData.slug),systemData.slug==="cinderclaw-gauntlet"&&(systemData.baseItem="spiked-gauntlet")))}};_BASE_ARMORS=new WeakMap,_MAGIC_ARMOR_TO_BASE=new WeakMap,_BASE_WEAPONS=new WeakMap,__name2(_Migration629SetBaseItems,"Migration629SetBaseItems"),__publicField(_Migration629SetBaseItems,"version",.629);let Migration629SetBaseItems=_Migration629SetBaseItems;const _Migration630FixTalismanSpelling=class extends MigrationBase{static{__name(this,"_Migration630FixTalismanSpelling")}async updateItem(itemData){if(itemData.type==="consumable"){const consumableType=itemData.system.consumableType;consumableType.value==="talasman"&&(consumableType.value="talisman")}}};__name2(_Migration630FixTalismanSpelling,"Migration630FixTalismanSpelling"),__publicField(_Migration630FixTalismanSpelling,"version",.63);let Migration630FixTalismanSpelling=_Migration630FixTalismanSpelling;const _Migration631FixSenseRuleElementSelector=class extends MigrationBase{static{__name(this,"_Migration631FixSenseRuleElementSelector")}SENSE_SELECTOR_CONVERSION={lowlightvision:"lowLightVision",Tremorsense:"tremorsense"};async updateItem(source){const rules=source.system.rules;for(const rule of rules)rule.key==="PF2E.RuleElement.Sense"&&typeof rule.selector=="string"&&(rule.selector=this.SENSE_SELECTOR_CONVERSION[rule.selector]??rule.selector)}};__name2(_Migration631FixSenseRuleElementSelector,"Migration631FixSenseRuleElementSelector"),__publicField(_Migration631FixSenseRuleElementSelector,"version",.631);let Migration631FixSenseRuleElementSelector=_Migration631FixSenseRuleElementSelector;const _Migration632DeleteOrphanedSpells=class extends MigrationBase{static{__name(this,"_Migration632DeleteOrphanedSpells")}requiresFlush=!0;async updateActor(actorData){const spells=actorData.items.filter(itemData=>itemData.type==="spell"),entries=actorData.items.filter(itemData=>itemData.type==="spellcastingEntry"),orphans=spells.filter(spellData=>!entries.some(entryData=>entryData._id===spellData.system.location.value));actorData.items=actorData.items.filter(itemData=>!orphans.some(orphan=>orphan._id===itemData._id))}};__name2(_Migration632DeleteOrphanedSpells,"Migration632DeleteOrphanedSpells"),__publicField(_Migration632DeleteOrphanedSpells,"version",.632);let Migration632DeleteOrphanedSpells=_Migration632DeleteOrphanedSpells;const _Migration633DeleteUnidentifiedTraits=class extends MigrationBase{static{__name(this,"_Migration633DeleteUnidentifiedTraits")}async updateItem(itemData){if(itemData.type==="melee"){const systemData=itemData.system;systemData.identification&&("game"in globalThis?itemData["system.-=identification"]=null:delete systemData.identification)}if(!isPhysicalData(itemData))return;const unidentifiedDataData=itemData.system.identification?.unidentified?.data;unidentifiedDataData?.traits&&("game"in globalThis?itemData["system.identification.unidentified.data.-=traits"]=null:delete unidentifiedDataData.traits)}};__name2(_Migration633DeleteUnidentifiedTraits,"Migration633DeleteUnidentifiedTraits"),__publicField(_Migration633DeleteUnidentifiedTraits,"version",.633);let Migration633DeleteUnidentifiedTraits=_Migration633DeleteUnidentifiedTraits;const _Migration634PurgeMartialItems=class extends MigrationBase{static{__name(this,"_Migration634PurgeMartialItems")}async updateActor(actorData){const martialIds=actorData.items.filter(itemData=>itemData.type==="martial").map(itemData=>itemData._id),martialItemWeapons=actorData.items.filter(itemData=>{if(itemData.type!=="weapon")return!1;const systemData=itemData.system;return martialIds.includes(systemData.weaponType?.value??"")});for(const weaponData of martialItemWeapons)weaponData.data.category="simple";actorData.items=actorData.items.filter(itemData=>itemData.type!=="martial")}};__name2(_Migration634PurgeMartialItems,"Migration634PurgeMartialItems"),__publicField(_Migration634PurgeMartialItems,"version",.634);let Migration634PurgeMartialItems=_Migration634PurgeMartialItems;const _Migration635NumifyACAndQuantity=class extends MigrationBase{static{__name(this,"_Migration635NumifyACAndQuantity")}async updateActor(actorData){(actorData.type==="hazard"||actorData.type==="npc"||actorData.type==="vehicle")&&(actorData.system.attributes.ac.value=Number(actorData.system.attributes.ac.value))}async updateItem(itemData){if(isPhysicalData(itemData)){const quantity=itemData.system.quantity||{value:0};quantity instanceof Object&&(quantity.value=Number(quantity.value))}}};__name2(_Migration635NumifyACAndQuantity,"Migration635NumifyACAndQuantity"),__publicField(_Migration635NumifyACAndQuantity,"version",.635);let Migration635NumifyACAndQuantity=_Migration635NumifyACAndQuantity;const _Migration636NumifyArmorData=class extends MigrationBase{static{__name(this,"_Migration636NumifyArmorData")}async updateItem(source){if(source.type!=="armor")return;const systemData=source.system;isObject(systemData.armor)&&(systemData.armor.value=Number(systemData.armor.value)||0),isObject(systemData.check)&&(systemData.check.value=Number(systemData.check.value)||0),isObject(systemData.dex)&&(systemData.dex.value=Number(systemData.dex.value)||0),isObject(systemData.strength)&&(systemData.strength.value=Number(systemData.strength.value)||0),isObject(systemData.speed)&&typeof systemData.speed.value=="string"&&(systemData.speed.value=parseInt(systemData.speed.value,10)||0)}};__name2(_Migration636NumifyArmorData,"Migration636NumifyArmorData"),__publicField(_Migration636NumifyArmorData,"version",.636);let Migration636NumifyArmorData=_Migration636NumifyArmorData;const meleeKeys=new Set(["description","source","traits","rules","slug","weaponType","attack","damageRolls","bonus","attackEffects"]),_Migration637CleanMeleeItems=class extends MigrationBase{static{__name(this,"_Migration637CleanMeleeItems")}async updateItem(itemData){if(itemData.type!=="melee")return;const systemData=itemData.system;for(const key of Object.keys(systemData))meleeKeys.has(key)||delete systemData[key]}};__name2(_Migration637CleanMeleeItems,"Migration637CleanMeleeItems");let Migration637CleanMeleeItems=_Migration637CleanMeleeItems;const validComponents=["material","somatic","verbal"],_Migration638SpellComponents=class extends MigrationBase{static{__name(this,"_Migration638SpellComponents")}async updateItem(itemData){if(itemData.type!=="spell")return;const components=itemData.system.components,oldComponents=new Set(components.value?.split(",").map(v=>v.trim().toLowerCase()));for(const component of validComponents)components[component]=components[component]||oldComponents.has(component);delete components.value,"game"in globalThis&&(components["-=value"]=null)}};__name2(_Migration638SpellComponents,"Migration638SpellComponents"),__publicField(_Migration638SpellComponents,"version",.638);let Migration638SpellComponents=_Migration638SpellComponents;const SIZES=["tiny","sm","med","lg","huge","grg"],SIZE_SLUGS=["tiny","small","medium","large","huge","gargantuan"],RARITIES=["common","uncommon","rare","unique"];function goesToEleven(value){return value>=0&&value<=11}__name(goesToEleven,"goesToEleven"),__name2(goesToEleven,"goesToEleven");const PROFICIENCY_RANKS=["untrained","trained","expert","master","legendary"],STACK_DEFINITIONS={bolts:{size:10,lightBulk:1},arrows:{size:10,lightBulk:1},slingBullets:{size:10,lightBulk:1},blowgunDarts:{size:10,lightBulk:1},woodenTaws:{size:10,lightBulk:1},rounds5:{size:5,lightBulk:1},rounds10:{size:10,lightBulk:1},rations:{size:7,lightBulk:1},sacks:{size:5,lightBulk:1},coins:{size:1e3,lightBulk:10},gems:{size:2e3,lightBulk:10}},_Bulk=class _Bulk2{static{__name(this,"_Bulk")}normal;light;constructor({normal=0,light=0}={}){this.normal=normal+Math.floor(light/10),this.light=light%10}get isNegligible(){return this.normal===0&&this.light===0}get isLight(){return this.toLightBulk()<10&&!this.isNegligible}toLightBulk(){return this.normal*10+this.light}plus(bulk){return new _Bulk2({normal:this.normal+bulk.normal,light:this.light+bulk.light})}minus(bulk){const[thisBulk,otherBulk]=this._toSingleNumber(bulk),result=thisBulk-otherBulk;return result<0?new _Bulk2:new _Bulk2({normal:Math.floor(result/10),light:result%10})}_toSingleNumber(bulk){return[this.normal*10+this.light,bulk.normal*10+bulk.light]}times(factor){const normal=this.normal*factor,lightCarryOver=normal<1&&normal>0?1:0,light=Math.floor(this.light*factor)+lightCarryOver;return new _Bulk2({normal:Math.floor(normal),light})}isSmallerThan(bulk){const[thisBulk,otherBulk]=this._toSingleNumber(bulk);return thisBulkotherBulk}isEqualTo(bulk){return this.normal===bulk.normal&&this.light===bulk.light}isPositive(){return this.normal>0||this.light>0}toString(){const{light,normal}=this;return normal===0&&light===0?game.i18n.localize("PF2E.Item.Physical.Bulk.Negligible"):normal>0&&light===0?normal.toString():light===1&&normal===0?game.i18n.localize("PF2E.Item.Physical.Bulk.Light"):light>0&&normal===0?game.i18n.format("PF2E.Item.Physical.Bulk.NLight",{light}):game.i18n.format("PF2E.Item.Physical.Bulk.WithLight",{bulk:normal,light})}double(){return this.isNegligible?new _Bulk2({light:1}):this.isLight?this.times(10):this.times(2)}halve(){return this.isNegligible?new _Bulk2:this.isLight?new _Bulk2:this.normal===1?new _Bulk2({light:1}):this.times(.5)}convertToSize(itemSize,actorSize){const sizes=Array.from(SIZES).filter(size=>size!=="sm"),itemSizeIndex=sizes.indexOf(itemSize==="sm"?"med":itemSize),actorSizeIndex=sizes.indexOf(actorSize==="sm"?"med":actorSize);return itemSizeIndex===actorSizeIndex?this:itemSizeIndex>actorSizeIndex?applyNTimes(bulk=>bulk.double(),itemSizeIndex-actorSizeIndex,this):applyNTimes(bulk=>bulk.halve(),actorSizeIndex-itemSizeIndex,this)}};__name2(_Bulk,"Bulk");let Bulk=_Bulk;const lightBulkRegex=/^(\d*)l$/i,complexBulkRegex=/^(\d+);\s*(\d*)l$/i;function weightToBulk(weight){if(typeof weight!="string"&&typeof weight!="number")return null;const trimmed=String(weight).trim();if(/^\d+$/.test(trimmed))return new Bulk({normal:parseInt(trimmed,10)});const lightMatch=trimmed.match(lightBulkRegex);if(lightMatch)return new Bulk({light:parseInt(lightMatch[1]||"1",10)});const complexMatch=trimmed.match(complexBulkRegex);if(complexMatch){const[,normal,light]=complexMatch;return new Bulk({normal:Number(normal)||0,light:Number(light||1)||0})}return null}__name(weightToBulk,"weightToBulk"),__name2(weightToBulk,"weightToBulk");const _CoinsPF2e=class _CoinsPF2e2{static{__name(this,"_CoinsPF2e")}constructor(data){data??={};for(const denomination of DENOMINATIONS)this[denomination]=Math.max(Math.floor(Math.abs(data[denomination]??0)),0)}get copperValue(){const{cp,sp,gp,pp}=this;return cp+sp*10+gp*100+pp*1e3}get goldValue(){return this.copperValue/100}add(coins){const other=new _CoinsPF2e2(coins);return new _CoinsPF2e2({pp:this.pp+other.pp,gp:this.gp+other.gp,sp:this.sp+other.sp,cp:this.cp+other.cp})}scale(factor){const result=new _CoinsPF2e2(this);if(result.pp*=factor,result.gp*=factor,result.sp*=factor,result.cp*=factor,factor%1!==0){result.gp+=result.pp%1*10,result.sp+=result.gp%1*10,result.cp+=result.sp%1*10;for(const denomination of DENOMINATIONS)result[denomination]=Math.floor(Number(result[denomination].toFixed(1)))}return result}adjustForSize(size){const basePrice=new _CoinsPF2e2(this);switch(size){case"lg":return basePrice.scale(2);case"huge":return basePrice.scale(4);case"grg":return basePrice.scale(8);default:return basePrice}}toObject(){return DENOMINATIONS.reduce((result,denomination)=>this[denomination]!==0?{...result,[denomination]:this[denomination]}:result,{})}static fromString(coinString,quantity=1){return[...String(coinString).trim().replace(/,/g,"").matchAll(/(\d+)\s*([pgsc]p)/g)].map(match=>{const[value,denomination]=match.slice(1,3),computedValue=(Number(value)||0)*quantity;return{[denomination]:computedValue}}).reduce((first,second)=>first.add(second),new _CoinsPF2e2)}static fromPrice(price,factor){const per=Math.max(1,price.per??1);return new _CoinsPF2e2(price.value).scale(factor/per)}toString(){if(DENOMINATIONS.every(denomination=>!this[denomination]))return"0 gp";const DENOMINATIONS_REVERSED=[...DENOMINATIONS].reverse(),parts=[];for(const denomation of DENOMINATIONS_REVERSED)this[denomation]&&parts.push(`${this[denomation]} ${denomation}`);return parts.join(", ")}};__name2(_CoinsPF2e,"CoinsPF2e");let CoinsPF2e=_CoinsPF2e;const coinCompendiumIds={pp:"JuNPeK5Qm1w6wpb4",gp:"B6B7tBWJSqOBz5zz",sp:"5Ew82vBF9YfaiY9f",cp:"lzJ8AVhRcbFul5fh"};function getMaterialValuationData(item){const valuationData=item.isOfType("weapon")?WEAPON_MATERIAL_VALUATION_DATA:item.isOfType("armor")&&!item.isShield?ARMOR_MATERIAL_VALUATION_DATA:null;if(!valuationData)return null;const{material}=item;return!material.type||!material.grade?null:valuationData[material.type]?.[material.grade]??null}__name(getMaterialValuationData,"getMaterialValuationData"),__name2(getMaterialValuationData,"getMaterialValuationData");const WEAPON_MATERIAL_VALUATION_DATA={"":{low:null,standard:null,high:null},abysium:{low:null,standard:{level:12,price:2e3,rarity:"rare"},high:{level:18,price:24e3,rarity:"rare"}},adamantine:{low:null,standard:{level:11,price:1400,rarity:"uncommon"},high:{level:17,price:13500,rarity:"uncommon"}},"cold-iron":{low:{level:2,price:40,rarity:"common"},standard:{level:10,price:880,rarity:"common"},high:{level:16,price:9e3,rarity:"common"}},darkwood:{low:null,standard:{level:11,price:1400,rarity:"uncommon"},high:{level:17,price:13500,rarity:"uncommon"}},djezet:{low:null,standard:{level:12,price:1800,rarity:"rare"},high:{level:18,price:22e3,rarity:"rare"}},inubrix:{low:null,standard:{level:11,price:1400,rarity:"rare"},high:{level:17,price:13500,rarity:"rare"}},"keep-stone":{low:null,standard:null,high:{level:18,price:22500,rarity:"rare"}},mithral:{low:null,standard:{level:11,price:1400,rarity:"uncommon"},high:{level:17,price:13500,rarity:"uncommon"}},noqual:{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:18,price:24e3,rarity:"rare"}},peachwood:{low:null,standard:{level:12,price:2e3,rarity:"uncommon"},high:{level:18,price:19e3,rarity:"uncommon"}},orichalcum:{low:null,standard:null,high:{level:18,price:22500,rarity:"rare"}},siccatite:{low:null,standard:{level:11,price:1400,rarity:"rare"},high:{level:17,price:15e3,rarity:"rare"}},silver:{low:{level:2,price:40,rarity:"common"},standard:{level:10,price:880,rarity:"common"},high:{level:16,price:9e3,rarity:"common"}},"sisterstone-dusk":{low:{level:3,price:70,rarity:"rare"},standard:{level:11,price:1200,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},"sisterstone-scarlet":{low:{level:3,price:70,rarity:"rare"},standard:{level:11,price:1200,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},"sovereign-steel":{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},warpglass:{low:null,standard:null,high:{level:17,price:14e3,rarity:"rare"}}},ARMOR_MATERIAL_VALUATION_DATA={"":{low:null,standard:null,high:null},abysium:{low:null,standard:{level:12,price:2e3,rarity:"rare"},high:{level:19,price:4e4,rarity:"rare"}},adamantine:{low:null,standard:{level:11,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},"cold-iron":{low:{level:5,price:140,rarity:"common"},standard:{level:11,price:1200,rarity:"common"},high:{level:18,price:2e4,rarity:"common"}},darkwood:{low:null,standard:{level:12,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},djezet:{low:null,standard:{level:12,price:1800,rarity:"rare"},high:{level:19,price:35e3,rarity:"rare"}},dragonhide:{low:null,standard:{level:12,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},"grisantian-pelt":{low:null,standard:{level:12,price:1800,rarity:"rare"},high:{level:19,price:33e3,rarity:"rare"}},inubrix:{low:null,standard:{level:11,price:1200,rarity:"rare"},high:{level:18,price:18e3,rarity:"rare"}},"keep-stone":{low:null,standard:null,high:{level:20,price:56e3,rarity:"rare"}},mithral:{low:null,standard:{level:12,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},noqual:{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},peachwood:{low:null,standard:null,high:null},orichalcum:{low:null,standard:null,high:{level:20,price:55e3,rarity:"rare"}},siccatite:{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},silver:{low:{level:5,price:140,rarity:"common"},standard:{level:11,price:1200,rarity:"common"},high:{level:18,price:2e4,rarity:"common"}},"sisterstone-dusk":{low:{level:5,price:140,rarity:"rare"},standard:{level:10,price:1e3,rarity:"rare"},high:{level:18,price:19500,rarity:"rare"}},"sisterstone-scarlet":{low:{level:5,price:140,rarity:"rare"},standard:{level:10,price:1e3,rarity:"rare"},high:{level:18,price:19500,rarity:"rare"}},"sovereign-steel":{low:null,standard:{level:13,price:2400,rarity:"rare"},high:{level:20,price:5e4,rarity:"rare"}},warpglass:{low:null,standard:null,high:null}},_PredicatePF2e=class _PredicatePF2e2 extends Array{static{__name(this,"_PredicatePF2e")}constructor(...statements){super(...Array.isArray(statements[0])?statements[0]:statements),__privateAdd(this,_isTrue),__privateAdd(this,_testBinaryOp),__privateAdd(this,_testCompound),__publicField(this,"isValid"),this.isValid=_PredicatePF2e2.isValid(this)}static isValid(statements){return this.isArray(statements)}static isArray(statements){return super.isArray(statements)&&statements.every(s=>StatementValidator.isStatement(s))}static test(predicate=[],options){return predicate instanceof _PredicatePF2e2?predicate.test(options):new _PredicatePF2e2(...predicate).test(options)}test(options){if(this.length===0)return!0;if(!this.isValid)return console.warn("PF2e System | The provided predicate set is malformed."),!1;const domain=options instanceof Set?options:new Set(options);return this.every(s=>__privateMethod(this,_isTrue,isTrue_fn).call(this,s,domain))}toObject(){return deepClone([...this])}clone(){return new _PredicatePF2e2(this.toObject())}};_isTrue=new WeakSet,isTrue_fn=__name2(function(statement,domain){return typeof statement=="string"&&domain.has(statement)||StatementValidator.isBinaryOp(statement)&&__privateMethod(this,_testBinaryOp,testBinaryOp_fn).call(this,statement,domain)||StatementValidator.isCompound(statement)&&__privateMethod(this,_testCompound,testCompound_fn).call(this,statement,domain)},"#isTrue"),_testBinaryOp=new WeakSet,testBinaryOp_fn=__name2(function(statement,domain){if("eq"in statement)return domain.has(`${statement.eq[0]}:${statement.eq[1]}`);{const operator=Object.keys(statement)[0],[left,right]=Object.values(statement)[0],domainArray=Array.from(domain),getValues=__name2(operand=>{const maybeNumber=Number(operand);if(!Number.isNaN(maybeNumber))return[maybeNumber];const pattern=new RegExp(String.raw`^${operand}:([^:]+)$`),values=domainArray.map(s=>Number(pattern.exec(s)?.[1]||NaN)).filter(v=>!Number.isNaN(v));return values.length>0?values:[NaN]},"getValues"),leftValues=getValues(left),rightValues=getValues(right);switch(operator){case"gt":return leftValues.some(l=>rightValues.every(r=>l>r));case"gte":return leftValues.some(l=>rightValues.every(r=>l>=r));case"lt":return leftValues.some(l=>rightValues.every(r=>lrightValues.every(r=>l<=r));default:return console.warn("PF2e System | Malformed binary operation encountered"),!1}}},"#testBinaryOp"),_testCompound=new WeakSet,testCompound_fn=__name2(function(statement,domain){return"and"in statement&&statement.and.every(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"nand"in statement&&!statement.nand.every(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"or"in statement&&statement.or.some(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"xor"in statement&&statement.xor.filter(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain)).length===1||"nor"in statement&&!statement.nor.some(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"not"in statement&&!__privateMethod(this,_isTrue,isTrue_fn).call(this,statement.not,domain)||"if"in statement&&!(__privateMethod(this,_isTrue,isTrue_fn).call(this,statement.if,domain)&&!__privateMethod(this,_isTrue,isTrue_fn).call(this,statement.then,domain))},"#testCompound"),__name2(_PredicatePF2e,"PredicatePF2e");let PredicatePF2e=_PredicatePF2e;const _StatementValidator=class{static{__name(this,"_StatementValidator")}static isStatement(statement){return statement instanceof Object?this.isCompound(statement)||this.isBinaryOp(statement):typeof statement=="string"?this.isAtomic(statement):!1}static isAtomic(statement){return typeof statement=="string"&&statement.length>0||this.isBinaryOp(statement)}static isBinaryOp(statement){if(!isObject(statement))return!1;const entries=Object.entries(statement);if(entries.length>1)return!1;const[operator,operands]=entries[0];return __privateGet(this,_binaryOperators).has(operator)&&Array.isArray(operands)&&operands.length===2&&typeof operands[0]=="string"&&["string","number"].includes(typeof operands[1])}static isCompound(statement){return isObject(statement)&&(this.isAnd(statement)||this.isOr(statement)||this.isNand(statement)||this.isXor(statement)||this.isNor(statement)||this.isNot(statement)||this.isIf(statement))}static isAnd(statement){return Object.keys(statement).length===1&&Array.isArray(statement.and)&&statement.and.every(subProp=>this.isStatement(subProp))}static isNand(statement){return Object.keys(statement).length===1&&Array.isArray(statement.nand)&&statement.nand.every(subProp=>this.isStatement(subProp))}static isOr(statement){return Object.keys(statement).length===1&&Array.isArray(statement.or)&&statement.or.every(subProp=>this.isStatement(subProp))}static isXor(statement){return Object.keys(statement).length===1&&Array.isArray(statement.xor)&&statement.xor.every(subProp=>this.isStatement(subProp))}static isNor(statement){return Object.keys(statement).length===1&&Array.isArray(statement.nor)&&statement.nor.every(subProp=>this.isStatement(subProp))}static isNot(statement){return Object.keys(statement).length===1&&!!statement.not&&this.isStatement(statement.not)}static isIf(statement){return Object.keys(statement).length===2&&this.isStatement(statement.if)&&this.isStatement(statement.then)}};_binaryOperators=new WeakMap,__name2(_StatementValidator,"StatementValidator"),__privateAdd(_StatementValidator,_binaryOperators,new Set(["eq","gt","gte","lt","lte"]));let StatementValidator=_StatementValidator;const _AutomaticBonusProgression=class{static{__name(this,"_AutomaticBonusProgression")}static isEnabled(actor){if(actor&&!actor.flags?.pf2e)return!1;const settingEnabled=game.settings.get("pf2e","automaticBonusVariant")!=="noABP",abpDisabledForActor=!!actor?.flags.pf2e.disableABP;return settingEnabled&&!abpDisabledForActor}static getStrikingDice(level){return level<4?0:level<12?1:level<19?2:3}static concatModifiers(actor){if(!this.isEnabled(actor))return;const{level,synthetics}=actor,values=this.abpValues(level),ac=values.ac,perception=values.perception,save=values.save,setting=game.settings.get("pf2e","automaticBonusVariant");if(save>0&&(synthetics.modifiers["saving-throw"]??=[]).push(()=>new ModifierPF2e({slug:"save-potency",label:"PF2E.AutomaticBonusProgression.savePotency",modifier:save,type:"potency"})),ac>0&&(synthetics.modifiers.ac??=[]).push(()=>new ModifierPF2e({slug:"defense-potency",label:"PF2E.AutomaticBonusProgression.defensePotency",modifier:ac,type:"potency"})),perception>0&&(synthetics.modifiers.perception??=[]).push(()=>new ModifierPF2e({slug:"perception-potency",label:"PF2E.AutomaticBonusProgression.perceptionPotency",modifier:perception,type:"potency"})),setting==="ABPRulesAsWritten"){const attack=this.abpValues(level).attack;attack>0&&(synthetics.modifiers["strike-attack-roll"]??=[]).push(()=>new ModifierPF2e({slug:"attack-potency",label:"PF2E.AutomaticBonusProgression.attackPotency",modifier:attack,type:"potency"}))}if(setting==="ABPFundamentalPotency"){const attack=this.abpValues(level).attack;if(attack>0){const potency={label:game.i18n.localize("PF2E.AutomaticBonusProgression.attackPotency"),type:"potency",bonus:attack,predicate:new PredicatePF2e};(synthetics.weaponPotency["strike-attack-roll"]??=[]).push(potency)}}}static cleanupRunes(item){if(!this.isEnabled(item.actor))return;item.system.potencyRune.value=null;const otherFundamental=item.isOfType("weapon")?item.system.strikingRune:item.system.resiliencyRune;if(otherFundamental.value=null,game.settings.get("pf2e","automaticBonusVariant")==="ABPRulesAsWritten"){const propertyRunes=[1,2,3,4].map(n=>item.system[`propertyRune${n}`]);for(const rune of propertyRunes)rune.value=null}}static suppressRuleElement(rule,value){return this.isEnabled(rule.actor)&&rule.type==="item"&&value>=0&&rule.fromEquipment}static getAttackPotency(level){return level<2?0:level<10?1:level<16?2:3}static abpValues(level){const attack=this.getAttackPotency(level);let ac,perception,save;return level>=5&&level<11?ac=1:level>=11&&level<18?ac=2:level>=18?ac=3:ac=0,level>=7&&level<13?perception=1:level>=13&&level<19?perception=2:level>=19?perception=3:perception=0,level>=8&&level<14?save=1:level>=14&&level<20?save=2:level>=20?save=3:save=0,{attack,ac,perception,save}}};__name2(_AutomaticBonusProgression,"AutomaticBonusProgression");let AutomaticBonusProgression=_AutomaticBonusProgression;function getPropertySlots(item){const fromMaterial=item.system.material.type==="orichalcum"?1:0,fromPotency=AutomaticBonusProgression.isEnabled(item.actor)?AutomaticBonusProgression.getAttackPotency(!item.actor||item.actor.isOfType("loot")?20:item.actor.level):item.system.runes.potency;return fromMaterial+fromPotency}__name(getPropertySlots,"getPropertySlots"),__name2(getPropertySlots,"getPropertySlots");function prunePropertyRunes(runes,validTypes){const runeSet=new Set(runes);return Array.from(runeSet).filter(r=>!!r&&r in validTypes&&!runeSet.has(`greater${r.titleCase()}`)&&!runeSet.has(`major${r.replace(/^greater/,"").titleCase()}`)&&!runeSet.has(`true${r.replace(/^greater|^major/,"").titleCase()}`))}__name(prunePropertyRunes,"prunePropertyRunes"),__name2(prunePropertyRunes,"prunePropertyRunes");function getRuneValuationData(item){if(!item.isOfType("armor","weapon")||item.isOfType("armor")&&item.isShield)return[];const itemRunes=item.system.runes,data=item.isOfType("armor")?{runes:RUNE_DATA.armor,secondaryFundamental:"resilient"}:{runes:RUNE_DATA.weapon,secondaryFundamental:"striking"};return[data.runes.potency[item.system.runes.potency],data.runes[data.secondaryFundamental][itemRunes[data.secondaryFundamental]??""],...item.system.runes.property.map(p=>data.runes.property[p])].filter(d=>!!d)}__name(getRuneValuationData,"getRuneValuationData"),__name2(getRuneValuationData,"getRuneValuationData");const strikingRuneValues=new Map([["striking",1],["greaterStriking",2],["majorStriking",3]]);function getStrikingDice(itemData){return strikingRuneValues.get(itemData.strikingRune.value)??0}__name(getStrikingDice,"getStrikingDice"),__name2(getStrikingDice,"getStrikingDice");const resilientRuneValues=new Map([[null,0],["resilient",1],["greaterResilient",2],["majorResilient",3]]);function getResilientBonus(itemData){return resilientRuneValues.get(itemData.resiliencyRune.value)??0}__name(getResilientBonus,"getResilientBonus"),__name2(getResilientBonus,"getResilientBonus");function getPropertyRuneDice(runes,options){return runes.flatMap(rune=>{const runeData=WEAPON_PROPERTY_RUNES[rune];return deepClone(runeData.damage?.dice??[]).map(data=>{const dice=new DamageDicePF2e({selector:"strike-damage",slug:rune,label:RUNE_DATA.weapon.property[rune]?.name,diceNumber:data.diceNumber??1,dieSize:data.dieSize??"d6",damageType:data.damageType,category:data.category??null,predicate:data.predicate,critical:data.critical??null});return dice.test(options),dice})})}__name(getPropertyRuneDice,"getPropertyRuneDice"),__name2(getPropertyRuneDice,"getPropertyRuneDice");function getPropertyRuneStrikeAdjustments(runes){return runes.flatMap(r=>RUNE_DATA.weapon.property[r].strikeAdjustments??[])}__name(getPropertyRuneStrikeAdjustments,"getPropertyRuneStrikeAdjustments"),__name2(getPropertyRuneStrikeAdjustments,"getPropertyRuneStrikeAdjustments");function getPropertyRuneModifierAdjustments(runes){return runes.flatMap(r=>RUNE_DATA.weapon.property[r].damage?.adjustments??[])}__name(getPropertyRuneModifierAdjustments,"getPropertyRuneModifierAdjustments"),__name2(getPropertyRuneModifierAdjustments,"getPropertyRuneModifierAdjustments");const FUNDAMENTAL_ARMOR_RUNE_DATA={potency:{0:null,1:{name:"PF2E.ArmorPotencyRune1",value:1,level:5,price:160,rarity:"common",traits:["abjuration"]},2:{name:"PF2E.ArmorPotencyRune2",value:2,level:11,price:1060,rarity:"common",traits:["abjuration"]},3:{name:"PF2E.ArmorPotencyRune3",value:3,level:18,price:20560,rarity:"common",traits:["abjuration"]},4:{name:"PF2E.ArmorPotencyRune4",value:4,level:18,price:20560,rarity:"common",traits:["abjuration"]}},resilient:{0:null,1:{name:"PF2E.ArmorResilientRune",level:8,price:340,rarity:"common",slug:"resilient",traits:["abjuration"]},2:{name:"PF2E.ArmorGreaterResilientRune",level:14,price:3440,rarity:"common",slug:"greaterResilient",traits:["abjuration"]},3:{name:"PF2E.ArmorMajorResilientRune",level:20,price:49440,rarity:"common",slug:"majorResilient",traits:["abjuration"]}}},FUNDAMENTAL_WEAPON_RUNE_DATA={potency:{0:null,1:{name:"PF2E.WeaponPotencyRune1",value:1,level:2,price:35,rarity:"common",traits:["evocation"]},2:{name:"PF2E.WeaponPotencyRune2",value:2,level:10,price:935,rarity:"common",traits:["evocation"]},3:{name:"PF2E.WeaponPotencyRune3",value:3,level:16,price:8935,rarity:"common",traits:["evocation"]},4:{name:"PF2E.WeaponPotencyRune4",value:4,level:16,price:8935,rarity:"common",traits:["evocation"]}},striking:{0:null,1:{name:"PF2E.Item.Weapon.Rune.Striking.Striking",level:4,price:65,rarity:"common",slug:"striking",traits:["evocation"]},2:{name:"PF2E.Item.Weapon.Rune.Striking.Greater",level:12,price:1065,rarity:"common",slug:"greaterStriking",traits:["evocation"]},3:{name:"PF2E.Item.Weapon.Rune.Striking.Major",level:19,price:31065,rarity:"common",slug:"majorStriking",traits:["evocation"]}}},ARMOR_PROPERTY_RUNES={acidResistant:{name:"PF2E.ArmorPropertyRuneAcidResistant",level:8,price:420,rarity:"common",slug:"acidResistant",traits:["abjuration","magical"]},advancing:{name:"PF2E.ArmorPropertyRuneAdvancing",level:9,price:625,rarity:"common",slug:"advancing",traits:["magical","necromancy"]},aimAiding:{name:"PF2E.ArmorPropertyRuneAimAiding",level:6,price:225,rarity:"common",slug:"aimAiding",traits:["magical","transmutation"]},antimagic:{name:"PF2E.ArmorPropertyRuneAntimagic",level:15,price:6500,rarity:"uncommon",slug:"antimagic",traits:["abjuration","magical"]},assisting:{name:"PF2E.ArmorPropertyRuneAssisting",level:5,price:125,rarity:"common",slug:"assisting",traits:["magical","transmutation"]},bitter:{name:"PF2E.ArmorPropertyRuneBitter",level:9,price:135,rarity:"uncommon",slug:"bitter",traits:["magical","poison","transmutation"]},coldResistant:{name:"PF2E.ArmorPropertyRuneColdResistant",level:8,price:420,rarity:"common",slug:"coldResistant",traits:["abjuration","magical"]},deathless:{name:"PF2E.ArmorPropertyRuneDeathless",level:7,price:330,rarity:"uncommon",slug:"deathless",traits:["healing","magical","necromancy"]},electricityResistant:{name:"PF2E.ArmorPropertyRuneElectricityResistant",level:8,price:420,rarity:"common",slug:"electricityResistant",traits:["abjuration","magical"]},energyAdaptive:{name:"PF2E.ArmorPropertyRuneEnergyAdaptive",level:6,price:225,rarity:"common",slug:"energyAdaptive",traits:["magical","transmutation"]},ethereal:{name:"PF2E.ArmorPropertyRuneEthereal",level:17,price:13500,rarity:"common",slug:"ethereal",traits:["conjuration","magical"]},fireResistant:{name:"PF2E.ArmorPropertyRuneFireResistant",level:8,price:420,rarity:"common",slug:"fireResistant",traits:["abjuration","magical"]},fortification:{name:"PF2E.ArmorPropertyRuneFortification",level:12,price:2e3,rarity:"common",slug:"fortification",traits:["abjuration","magical"]},glamered:{name:"PF2E.ArmorPropertyRuneGlamered",level:5,price:140,rarity:"common",slug:"glamered",traits:["illusion","magical"]},gliding:{name:"PF2E.ArmorPropertyRuneGliding",level:8,price:450,rarity:"common",slug:"gliding",traits:["magical","transmutation"]},greaterAcidResistant:{name:"PF2E.ArmorPropertyRuneGreaterAcidResistant",level:12,price:1650,rarity:"common",slug:"greaterAcidResistant",traits:["abjuration","magical"]},greaterAdvancing:{name:"PF2E.ArmorPropertyRuneGreaterAdvancing",level:16,price:8e3,rarity:"common",slug:"greaterAdvancing",traits:["magical","necromancy"]},greaterColdResistant:{name:"PF2E.ArmorPropertyRuneGreaterColdResistant",level:12,price:1650,rarity:"common",slug:"greaterColdResistant",traits:["abjuration","magical"]},greaterDread:{name:"PF2E.ArmorPropertyRuneGreaterDread",level:18,price:21e3,rarity:"uncommon",slug:"greaterDread",traits:["emotion","enchantment","fear","magical","mental","visual"]},greaterElectricityResistant:{name:"PF2E.ArmorPropertyRuneGreaterElectricityResistant",level:12,price:1650,rarity:"common",slug:"greaterElectricityResistant",traits:["abjuration","magical"]},greaterFireResistant:{name:"PF2E.ArmorPropertyRuneGreaterFireResistant",level:12,price:1650,rarity:"common",slug:"greaterFireResistant",traits:["abjuration","magical"]},greaterFortification:{name:"PF2E.ArmorPropertyRuneGreaterFortification",level:19,price:24e3,rarity:"common",slug:"greaterFortification",traits:["abjuration","magical"]},greaterInvisibility:{name:"PF2E.ArmorPropertyRuneGreaterInvisibility",level:10,price:1e3,rarity:"common",slug:"greaterInvisibility",traits:["illusion","magical"]},greaterReady:{name:"PF2E.ArmorPropertyRuneGreaterReady",level:11,price:1200,rarity:"common",slug:"greaterReady",traits:["evocation","magical"]},greaterShadow:{name:"PF2E.ArmorPropertyRuneGreaterShadow",level:9,price:650,rarity:"common",slug:"greaterShadow",traits:["magical","transmutation"]},greaterSlick:{name:"PF2E.ArmorPropertyRuneGreaterSlick",level:8,price:450,rarity:"common",slug:"greaterSlick",traits:["magical","transmutation"]},greaterStanching:{name:"PF2E.ArmorPropertyRuneGreaterStanching",level:9,price:600,rarity:"uncommon",slug:"greaterStanching",traits:["magical","necromancy"]},greaterQuenching:{name:"PF2E.ArmorPropertyRuneGreaterQuenching",level:10,price:1e3,rarity:"common",slug:"greaterQuenching",traits:["abjuration","magical"]},greaterSwallowSpike:{name:"PF2E.ArmorPropertyRuneGreaterSwallowSpike",level:12,price:1750,rarity:"common",slug:"greaterSwallowSpike",traits:["magical","transmutation"]},greaterWinged:{name:"PF2E.ArmorPropertyRuneGreaterWinged",level:19,price:35e3,rarity:"common",slug:"greaterWinged",traits:["magical","transmutation"]},immovable:{name:"PF2E.ArmorPropertyRuneImmovable",level:12,price:1800,rarity:"uncommon",slug:"immovable",traits:["magical","transmutation"]},implacable:{name:"PF2E.ArmorPropertyRuneImplacable",level:11,price:1200,rarity:"uncommon",slug:"implacable",traits:["magical","transmutation"]},invisibility:{name:"PF2E.ArmorPropertyRuneInvisibility",level:8,price:500,rarity:"common",slug:"invisibility",traits:["illusion","magical"]},lesserDread:{name:"PF2E.ArmorPropertyRuneLesserDread",level:6,price:225,rarity:"uncommon",slug:"lesserDread",traits:["emotion","enchantment","fear","magical","mental","visual"]},magnetizing:{name:"PF2E.ArmorPropertyRuneMagnetizing",level:10,price:900,rarity:"common",slug:"magnetizing",traits:["evocation","magical"]},majorQuenching:{name:"PF2E.ArmorPropertyRuneMajorQuenching",level:14,price:4500,rarity:"common",slug:"majorQuenching",traits:["abjuration","magical"]},majorShadow:{name:"PF2E.ArmorPropertyRuneMajorShadow",level:17,price:14e3,rarity:"common",slug:"majorShadow",traits:["magical","transmutation"]},majorSlick:{name:"PF2E.ArmorPropertyRuneMajorSlick",level:16,price:9e3,rarity:"common",slug:"majorSlick",traits:["magical","transmutation"]},majorStanching:{name:"PF2E.ArmorPropertyRuneMajorStanching",level:13,price:2500,rarity:"uncommon",slug:"majorStanching",traits:["magical","necromancy"]},majorSwallowSpike:{name:"PF2E.ArmorPropertyRuneMajorSwallowSpike",level:16,price:19250,rarity:"common",slug:"majorSwallowSpike",traits:["magical","transmutation"]},malleable:{name:"PF2E.ArmorPropertyRuneMalleable",level:9,price:650,rarity:"common",slug:"malleable",traits:["magical","metal"]},misleading:{name:"PF2E.ArmorPropertyRuneMisleading",level:16,price:8e3,rarity:"common",slug:"misleading",traits:["illusion","magical"]},moderateDread:{name:"PF2E.ArmorPropertyRuneModerateDread",level:12,price:1800,rarity:"uncommon",slug:"moderateDread",traits:["emotion","enchantment","fear","magical","mental","visual"]},portable:{name:"PF2E.ArmorPropertyRunePortable",level:9,price:660,rarity:"common",slug:"portable",traits:["magical","transmutation"]},quenching:{name:"PF2E.ArmorPropertyRuneQuenching",level:6,price:250,rarity:"common",slug:"quenching",traits:["abjuration","magical"]},ready:{name:"PF2E.ArmorPropertyRuneReady",level:6,price:200,rarity:"common",slug:"ready",traits:["evocation","magical"]},rockBraced:{name:"PF2E.ArmorPropertyRuneRockBraced",level:13,price:3e3,rarity:"rare",slug:"rockBraced",traits:["abjuration","dwarf","magical","saggorak"]},shadow:{name:"PF2E.ArmorPropertyRuneShadow",level:5,price:55,rarity:"common",slug:"shadow",traits:["magical","transmutation"]},sinisterKnight:{name:"PF2E.ArmorPropertyRuneSinisterKnight",level:8,price:500,rarity:"uncommon",slug:"sinisterKnight",traits:["abjuration","illusion","magical"]},slick:{name:"PF2E.ArmorPropertyRuneSlick",level:5,price:45,rarity:"common",slug:"slick",traits:["magical","transmutation"]},soaring:{name:"PF2E.ArmorPropertyRuneSoaring",level:14,price:3750,rarity:"common",slug:"soaring",traits:["abjuration","magical"]},stanching:{name:"PF2E.ArmorPropertyRuneStanching",level:5,price:130,rarity:"uncommon",slug:"stanching",traits:["magical","necromancy"]},swallowSpike:{name:"PF2E.ArmorPropertyRuneSwallowSpike",level:6,price:200,rarity:"common",slug:"swallowSpike",traits:["magical","transmutation"]},trueQuenching:{name:"PF2E.ArmorPropertyRuneTrueQuenching",level:18,price:24e3,rarity:"common",slug:"trueQuenching",traits:["abjuration","magical"]},trueStanching:{name:"PF2E.ArmorPropertyRuneTrueStanching",level:17,price:12500,rarity:"uncommon",slug:"trueStanching",traits:["magical","necromancy"]},winged:{name:"PF2E.ArmorPropertyRuneWinged",level:13,price:2500,rarity:"common",slug:"winged",traits:["magical","transmutation"]}},WEAPON_PROPERTY_RUNES={anarchic:{damage:{dice:[{damageType:"chaotic",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.anarchic.Name",text:"PF2E.WeaponPropertyRune.anarchic.Note.criticalSuccess"}]},level:11,name:"PF2E.WeaponPropertyRune.anarchic.Name",price:1400,rarity:"common",slug:"anarchic",traits:["chaotic","evocation","magical"]},ancestralEchoing:{level:15,name:"PF2E.WeaponPropertyRune.ancestralEchoing.Name",price:9500,rarity:"rare",slug:"ancestralEchoing",traits:["dwarf","evocation","magical","saggorak"]},anchoring:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.anchoring.Name",text:"PF2E.WeaponPropertyRune.anchoring.Note.criticalSuccess"}]},level:10,name:"PF2E.WeaponPropertyRune.anchoring.Name",price:900,rarity:"uncommon",slug:"anchoring",traits:["abjuration","magical"]},ashen:{damage:{dice:[{damageType:"fire",category:"persistent",diceNumber:1,dieSize:"d4"}],notes:[{outcome:["success"],title:"PF2E.WeaponPropertyRune.ashen.Name",text:"PF2E.WeaponPropertyRune.ashen.Note.success"}]},level:9,name:"PF2E.WeaponPropertyRune.ashen.Name",price:700,rarity:"common",slug:"ashen",traits:["enchantment","magical"]},authorized:{level:3,name:"PF2E.WeaponPropertyRune.authorized.Name",price:50,rarity:"common",slug:"authorized",traits:["abjuration","magical"]},axiomatic:{damage:{dice:[{damageType:"lawful",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.axiomatic.Name",text:"PF2E.WeaponPropertyRune.axiomatic.Note.criticalSuccess"}]},level:11,name:"PF2E.WeaponPropertyRune.axiomatic.Name",price:1400,rarity:"common",slug:"axiomatic",traits:["evocation","lawful","magical"]},bane:{level:4,name:"PF2E.WeaponPropertyRune.bane.Name",price:100,rarity:"uncommon",slug:"bane",traits:["divination","magical"]},bloodbane:{level:8,name:"PF2E.WeaponPropertyRune.bloodbane.Name",price:475,rarity:"uncommon",slug:"bloodbane",traits:["dwarf","evocation","magical"]},bloodthirsty:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.bloodbane.Name",text:"PF2E.WeaponPropertyRune.bloodthirsty.Note.criticalSuccess"}]},level:16,name:"PF2E.WeaponPropertyRune.bloodthirsty.Name",price:8500,rarity:"uncommon",slug:"bloodthirsty",traits:["magical","necromancy"]},brilliant:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d4"},{damageType:"good",diceNumber:1,dieSize:"d4",predicate:[{or:["target:trait:fiend",{not:"target"}]}]},{damageType:"vitality",diceNumber:1,dieSize:"d4"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.brilliant.Name",text:"PF2E.WeaponPropertyRune.brilliant.Note.criticalSuccess"}]},level:12,name:"PF2E.WeaponPropertyRune.brilliant.Name",price:2e3,rarity:"common",slug:"brilliant",traits:["evocation","magical"]},called:{level:7,name:"PF2E.WeaponPropertyRune.called.Name",price:350,rarity:"common",slug:"called",traits:["conjuration","magical"]},coating:{level:9,name:"PF2E.WeaponPropertyRune.coating.Name",price:700,rarity:"common",slug:"coating",traits:["conjuration","extradimensional","magical"]},conducting:{level:7,name:"PF2E.WeaponPropertyRune.conducting.Name",price:300,rarity:"common",slug:"conducting",traits:["evocation","magical"]},corrosive:{damage:{dice:[{damageType:"acid",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.corrosive.Name",text:"PF2E.WeaponPropertyRune.corrosive.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.corrosive.Name",price:500,rarity:"common",slug:"corrosive",traits:["acid","conjuration","magical"]},crushing:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.crushing.Name",text:"PF2E.WeaponPropertyRune.crushing.Note.criticalSuccess"}]},level:3,name:"PF2E.WeaponPropertyRune.crushing.Name",price:50,rarity:"uncommon",slug:"crushing",traits:["magical","necromancy"]},cunning:{level:5,name:"PF2E.WeaponPropertyRune.cunning.Name",price:140,rarity:"common",slug:"cunning",traits:["divination","magical"]},dancing:{level:13,name:"PF2E.WeaponPropertyRune.dancing.Name",price:2700,rarity:"uncommon",slug:"dancing",traits:["evocation","magical"]},deathdrinking:{damage:{dice:[{slug:"deathdrinking-negative",damageType:"void",diceNumber:1,dieSize:"d6",critical:!0,predicate:["target:mode:living",{not:"target:negative-healing"}]},{slug:"deathdrinking-positive",damageType:"vitality",diceNumber:1,dieSize:"d6",critical:!0,predicate:["target:negative-healing"]}]},level:7,name:"PF2E.WeaponPropertyRune.deathdrinking.Name",price:360,rarity:"rare",slug:"deathdrinking",traits:["magical","necromancy"]},demolishing:{damage:{dice:[{damageType:"force",category:"persistent",diceNumber:1,dieSize:"d6",predicate:["target:trait:construct"]}]},level:6,name:"PF2E.WeaponPropertyRune.demolishing.Name",price:225,rarity:"rare",slug:"demolishing",traits:["evocation","magical"]},disrupting:{damage:{dice:[{damageType:"vitality",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.disrupting.Name",text:"PF2E.WeaponPropertyRune.disrupting.Note.criticalSuccess"}]},level:5,name:"PF2E.WeaponPropertyRune.disrupting.Name",price:150,rarity:"common",slug:"disrupting",traits:["magical","necromancy"]},earthbinding:{level:5,name:"PF2E.WeaponPropertyRune.earthbinding.Name",price:125,rarity:"common",slug:"earthbinding",traits:["magical","transmutation"]},energizing:{level:6,name:"PF2E.WeaponPropertyRune.energizing.Name",price:250,rarity:"uncommon",slug:"energizing",traits:["abjuration","magical"]},extending:{level:7,name:"PF2E.WeaponPropertyRune.extending.Name",price:700,rarity:"common",slug:"extending",traits:["magical","transmutation"]},fanged:{level:2,name:"PF2E.WeaponPropertyRune.fanged.Name",price:30,rarity:"uncommon",slug:"fanged",traits:["magical","transmutation"]},fearsome:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.fearsome.Name",text:"PF2E.WeaponPropertyRune.fearsome.Note.criticalSuccess"}]},level:5,name:"PF2E.WeaponPropertyRune.fearsome.Name",price:160,rarity:"common",slug:"fearsome",traits:["emotion","enchantment","fear","magical","mental"]},flaming:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d6"},{damageType:"fire",category:"persistent",diceNumber:1,dieSize:"d10",critical:!0}]},level:8,name:"PF2E.WeaponPropertyRune.flaming.Name",price:500,rarity:"common",slug:"flaming",traits:["conjuration","fire","magical"]},flurrying:{level:7,name:"PF2E.WeaponPropertyRune.flurrying.Name",price:360,rarity:"common",slug:"flurrying",traits:["evocation","magical"]},frost:{damage:{dice:[{damageType:"cold",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.frost.Name",text:"PF2E.WeaponPropertyRune.frost.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.frost.Name",price:500,rarity:"common",slug:"frost",traits:["cold","conjuration","magical"]},ghostTouch:{damage:{notes:[{predicate:[{or:["target:trait:incorporeal",{not:"target"}]}],title:"PF2E.WeaponPropertyRune.ghostTouch.Name",text:"PF2E.WeaponPropertyRune.ghostTouch.Note"}]},level:4,name:"PF2E.WeaponPropertyRune.ghostTouch.Name",price:75,rarity:"common",slug:"ghostTouch",traits:["magical","transmutation"]},giantKilling:{damage:{dice:[{slug:"giantKilling",damageType:"mental",diceNumber:1,dieSize:"d6",predicate:["target:trait:giant"]}],notes:[{outcome:["criticalSuccess"],predicate:["target:trait:giant"],title:"PF2E.WeaponPropertyRune.giantKilling.Name",text:"PF2E.WeaponPropertyRune.giantKilling.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.giantKilling.Name",price:450,rarity:"rare",slug:"giantKilling",traits:["magical","necromancy"]},greaterAnchoring:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterAnchoring.Name",text:"PF2E.WeaponPropertyRune.greaterAnchoring.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterAnchoring.Name",text:"PF2E.WeaponPropertyRune.greaterAnchoring.Note.success"}]},level:18,name:"PF2E.WeaponPropertyRune.greaterAnchoring.Name",price:22e3,rarity:"uncommon",slug:"greaterAnchoring",traits:["abjuration","magical"]},greaterAshen:{damage:{dice:[{damageType:"fire",category:"persistent",diceNumber:1,dieSize:"d8"}],notes:[{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterAshen.Name",text:"PF2E.WeaponPropertyRune.greaterAshen.Note.success"}]},level:16,name:"PF2E.WeaponPropertyRune.greaterAshen.Name",price:9e3,rarity:"common",slug:"greaterAshen",traits:["enchantment","magical"]},greaterBloodbane:{level:13,name:"PF2E.WeaponPropertyRune.greaterBloodbane.Name",price:2800,rarity:"uncommon",slug:"greaterBloodbane",traits:["dwarf","evocation","magical"]},greaterBrilliant:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d4"},{damageType:"good",diceNumber:1,dieSize:"d4",predicate:[{or:["target:trait:fiend",{not:"target"}]}]},{damageType:"vitality",diceNumber:1,dieSize:"d4"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterBrilliant.Name",text:"PF2E.WeaponPropertyRune.greaterBrilliant.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterBrilliant.Name",text:"PF2E.WeaponPropertyRune.greaterBrilliant.Note.success"}],ignoredResistances:[{type:"fire",max:null},{type:"good",max:null},{type:"vitality",max:null}]},level:18,name:"PF2E.WeaponPropertyRune.greaterBrilliant.Name",price:24e3,rarity:"common",slug:"greaterBrilliant",traits:["evocation","magical"]},greaterCorrosive:{damage:{dice:[{damageType:"acid",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterCorrosive.Name",text:"PF2E.WeaponPropertyRune.greaterCorrosive.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterCorrosive.Name",text:"PF2E.WeaponPropertyRune.greaterCorrosive.Note.success"}]},level:15,name:"PF2E.WeaponPropertyRune.greaterCorrosive.Name",price:6500,rarity:"common",slug:"greaterCorrosive",traits:["acid","conjuration","magical"]},greaterCrushing:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterCrushing.Name",text:"PF2E.WeaponPropertyRune.greaterCrushing.Note.criticalSuccess"}]},level:9,name:"PF2E.WeaponPropertyRune.greaterCrushing.Name",price:650,rarity:"uncommon",slug:"greaterCrushing",traits:["magical","necromancy"]},greaterDisrupting:{damage:{dice:[{damageType:"vitality",diceNumber:2,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterDisrupting.Name",text:"PF2E.WeaponPropertyRune.greaterDisrupting.Note.criticalSuccess"}]},level:14,name:"PF2E.WeaponPropertyRune.greaterDisrupting.Name",price:4300,rarity:"uncommon",slug:"greaterDisrupting",traits:["magical","necromancy"]},greaterExtending:{level:13,name:"PF2E.WeaponPropertyRune.greaterExtending.Name",price:3e3,rarity:"common",slug:"greaterExtending",traits:["magical","transmutation"]},greaterFanged:{level:8,name:"PF2E.WeaponPropertyRune.greaterFanged.Name",price:425,rarity:"uncommon",slug:"greaterFanged",traits:["magical","transmutation"]},greaterFearsome:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterFearsome.Name",text:"PF2E.WeaponPropertyRune.greaterFearsome.Note.criticalSuccess"}]},level:12,name:"PF2E.WeaponPropertyRune.greaterFearsome.Name",price:2e3,rarity:"common",slug:"greaterFearsome",traits:["emotion","enchantment","fear","magical","mental"]},greaterFlaming:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d6"},{damageType:"fire",category:"persistent",diceNumber:2,dieSize:"d10",critical:!0}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterFlaming.Name",text:"PF2E.WeaponPropertyRune.greaterFlaming.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterFlaming.Name",text:"PF2E.WeaponPropertyRune.greaterFlaming.Note.success"}],ignoredResistances:[{type:"fire",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterFlaming.Name",price:6500,rarity:"common",slug:"greaterFlaming",traits:["conjuration","fire","magical"]},greaterFrost:{damage:{dice:[{damageType:"cold",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterFrost.Name",text:"PF2E.WeaponPropertyRune.greaterFrost.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterFrost.Name",text:"PF2E.WeaponPropertyRune.greaterFrost.Note.success"}],ignoredResistances:[{type:"cold",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterFrost.Name",price:6500,rarity:"common",slug:"greaterFrost",traits:["cold","conjuration","magical"]},greaterGiantKilling:{damage:{dice:[{slug:"greaterGiantKilling",damageType:"mental",diceNumber:2,dieSize:"d6",predicate:["target:trait:giant"]}],ignoredResistances:[{type:"mental",max:null}],notes:[{outcome:["criticalSuccess"],predicate:["target:trait:giant"],title:"PF2E.WeaponPropertyRune.greaterGiantKilling.Name",text:"PF2E.WeaponPropertyRune.greaterGiantKilling.Note.criticalSuccess"}]},level:15,name:"PF2E.WeaponPropertyRune.greaterGiantKilling.Name",price:6e3,rarity:"rare",slug:"greaterGiantKilling",traits:["magical","necromancy"]},greaterHauling:{level:11,name:"PF2E.WeaponPropertyRune.greaterHauling.Name",price:1300,rarity:"uncommon",slug:"greaterHauling",traits:["evocation","magical"]},greaterImpactful:{damage:{dice:[{damageType:"force",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterImpactful.Name",text:"PF2E.WeaponPropertyRune.greaterImpactful.Note.criticalSuccess"}]},level:17,name:"PF2E.WeaponPropertyRune.greaterImpactful.Name",price:15e3,rarity:"common",slug:"greaterImpactful",traits:["evocation","force","magical"]},greaterRooting:{level:11,name:"PF2E.WeaponPropertyRune.greaterRooting.Name",price:1400,rarity:"common",slug:"greaterRooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterRooting.Name",text:"PF2E.WeaponPropertyRune.greaterRooting.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterRooting.Name",text:"PF2E.WeaponPropertyRune.greaterRooting.Note.success"}]}},greaterShock:{damage:{dice:[{damageType:"electricity",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterShock.Name",text:"PF2E.WeaponPropertyRune.greaterShock.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterShock.Name",text:"PF2E.WeaponPropertyRune.greaterShock.Note.success"}],ignoredResistances:[{type:"electricity",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterShock.Name",price:6500,rarity:"common",slug:"greaterShock",traits:["electricity","evocation","magical"]},greaterThundering:{damage:{dice:[{damageType:"sonic",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterThundering.Name",text:"PF2E.WeaponPropertyRune.greaterThundering.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterThundering.Name",text:"PF2E.WeaponPropertyRune.greaterThundering.Note.success"}],ignoredResistances:[{type:"sonic",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterThundering.Name",price:6500,rarity:"common",slug:"greaterThundering",traits:["evocation","magical","sonic"]},grievous:{damage:{dice:[{damageType:"bleed",diceNumber:1,dieSize:"d6",critical:!0,predicate:["critical-specialization","item:group:dart"]}],notes:[{outcome:["criticalSuccess"],predicate:["item:group:axe"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Axe"},{outcome:["criticalSuccess"],predicate:["item:group:brawling"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Brawling"},{outcome:["criticalSuccess"],predicate:["item:group:club"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Club"},{outcome:["criticalSuccess"],predicate:["item:group:flail"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Flail"},{outcome:["criticalSuccess"],predicate:["item:group:hammer"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Hammer"},{outcome:["criticalSuccess"],predicate:["item:group:knife"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Knife"},{outcome:["criticalSuccess"],predicate:["item:group:polearm"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Polearm"},{outcome:["criticalSuccess"],predicate:["item:group:shield"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Shield"},{outcome:["criticalSuccess"],predicate:["item:group:sling"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Sling"},{outcome:["criticalSuccess"],predicate:["item:group:spear"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Spear"},{outcome:["criticalSuccess"],predicate:["item:group:sword"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Sword"}],adjustments:[{slug:"critical-specialization",test:options=>new PredicatePF2e("item:group:pick").test(options),getNewValue:current=>current*2}]},level:9,name:"PF2E.WeaponPropertyRune.grievous.Name",price:700,rarity:"common",slug:"grievous",traits:["enchantment","magical"]},hauling:{level:6,name:"PF2E.WeaponPropertyRune.hauling.Name",price:225,rarity:"uncommon",slug:"hauling",traits:["evocation","magical"]},holy:{damage:{dice:[{damageType:"good",diceNumber:1,dieSize:"d6"}]},level:11,name:"PF2E.WeaponPropertyRune.holy.Name",price:1400,rarity:"common",slug:"holy",traits:["evocation","good","magical"]},hopeful:{attack:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.hopeful.Name",text:"PF2E.WeaponPropertyRune.hopeful.Note.criticalSuccess"}]},level:11,name:"PF2E.WeaponPropertyRune.hopeful.Name",price:1200,rarity:"uncommon",slug:"hopeful",traits:["enchantment","magical"]},hooked:{level:5,name:"PF2E.WeaponPropertyRune.hooked.Name",price:140,rarity:"rare",slug:"hooked",traits:["conjuration","magical"],strikeAdjustments:[{adjustWeapon:weapon=>{weapon.system.traits.value.includes("trip")||weapon.system.traits.value.push("trip")}}]},impactful:{damage:{dice:[{damageType:"force",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.impactful.Name",text:"PF2E.WeaponPropertyRune.impactful.Note.criticalSuccess"}]},level:10,name:"PF2E.WeaponPropertyRune.impactful.Name",price:1e3,rarity:"common",slug:"impactful",traits:["evocation","force","magical"]},impossible:{level:20,name:"PF2E.WeaponPropertyRune.impossible.Name",price:7e4,rarity:"common",slug:"impossible",traits:["conjuration","magical"],strikeAdjustments:[{adjustWeapon:weapon=>{if(weapon.isOfType("weapon")&&weapon.system.range&&weapon._source.system.range){const sourceRange=weapon._source.system.range,preparedRange=weapon.system.range;weapon.system.range=sourceRange*2+Math.abs(preparedRange-sourceRange)}}}]},keen:{attack:{notes:[{outcome:["success"],title:"PF2E.WeaponPropertyRune.keen.Name",text:"PF2E.WeaponPropertyRune.keen.Note"}]},level:13,name:"PF2E.WeaponPropertyRune.keen.Name",price:3e3,rarity:"uncommon",slug:"keen",traits:["magical","transmutation"]},kinWarding:{level:3,name:"PF2E.WeaponPropertyRune.kinWarding.Name",price:52,rarity:"uncommon",slug:"kinWarding",traits:["abjuration","dwarf","magical"]},majorFanged:{level:15,name:"PF2E.WeaponPropertyRune.majorFanged.Name",price:6e3,rarity:"uncommon",slug:"majorFanged",traits:["magical","transmutation"]},majorRooting:{level:15,name:"PF2E.WeaponPropertyRune.majorRooting.Name",price:6500,rarity:"common",slug:"majorRooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.majorRooting.Name",text:"PF2E.WeaponPropertyRune.majorRooting.Note.criticalSuccess"}]}},merciful:{strikeAdjustments:[{adjustWeapon:weapon=>{weapon.system.traits.value.includes("nonlethal")||weapon.system.traits.value.push("nonlethal")}}],level:4,name:"PF2E.WeaponPropertyRune.merciful.Name",price:70,rarity:"common",slug:"merciful",traits:["abjuration","magical","mental"]},pacifying:{level:5,name:"PF2E.WeaponPropertyRune.pacifying.Name",price:150,rarity:"uncommon",slug:"pacifying",traits:["enchantment","magical"]},returning:{attack:{notes:[{title:"PF2E.WeaponPropertyRune.returning.Name",text:"PF2E.WeaponPropertyRune.returning.Note"}]},level:3,name:"PF2E.WeaponPropertyRune.returning.Name",price:55,rarity:"common",slug:"returning",traits:["evocation","magical"]},rooting:{level:7,name:"PF2E.WeaponPropertyRune.rooting.Name",price:360,rarity:"common",slug:"rooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.rooting.Name",text:"PF2E.WeaponPropertyRune.rooting.Note.criticalSuccess"}]}},serrating:{damage:{dice:[{damageType:"slashing",diceNumber:1,dieSize:"d4"}]},level:10,name:"PF2E.WeaponPropertyRune.serrating.Name",price:1e3,rarity:"uncommon",slug:"serrating",traits:["evocation","magical"]},shifting:{level:6,name:"PF2E.WeaponPropertyRune.shifting.Name",price:225,rarity:"common",slug:"shifting",traits:["magical","transmutation"]},shock:{damage:{dice:[{damageType:"electricity",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.shock.Name",text:"PF2E.WeaponPropertyRune.shock.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.shock.Name",price:500,rarity:"common",slug:"shock",traits:["electricity","conjuration","magical"]},speed:{level:16,name:"PF2E.WeaponPropertyRune.speed.Name",price:1e4,rarity:"rare",slug:"speed",traits:["magical","transmutation"]},spellStoring:{level:13,name:"PF2E.WeaponPropertyRune.spellStoring.Name",price:2700,rarity:"uncommon",slug:"spellStoring",traits:["abjuration","magical"]},swarming:{level:9,name:"PF2E.WeaponPropertyRune.swarming.Name",price:700,rarity:"common",slug:"swarming",traits:["conjuration","magical"]},thundering:{damage:{dice:[{damageType:"sonic",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.thundering.Name",text:"PF2E.WeaponPropertyRune.thundering.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.thundering.Name",price:500,rarity:"common",slug:"thundering",traits:["evocation","magical","sonic"]},trueRooting:{level:19,name:"PF2E.WeaponPropertyRune.trueRooting.Name",price:4e4,rarity:"common",slug:"trueRooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.trueRooting.Name",text:"PF2E.WeaponPropertyRune.trueRooting.Note.criticalSuccess"}]}},underwater:{level:3,name:"PF2E.WeaponPropertyRune.underwater.Name",price:50,rarity:"common",slug:"underwater",traits:["magical","water"]},unholy:{damage:{dice:[{damageType:"evil",diceNumber:1,dieSize:"d6"}]},level:11,name:"PF2E.WeaponPropertyRune.unholy.Name",price:1400,rarity:"common",slug:"unholy",traits:["evil","evocation","magical"]},vorpal:{level:17,name:"PF2E.WeaponPropertyRune.vorpal.Name",price:15e3,rarity:"rare",slug:"vorpal",traits:["evocation","magical"]},wounding:{damage:{dice:[{damageType:"bleed",diceNumber:1,dieSize:"d6"}]},level:7,name:"PF2E.WeaponPropertyRune.wounding.Name",price:340,rarity:"common",slug:"wounding",traits:["magical","necromancy"]}},RUNE_DATA={armor:{...FUNDAMENTAL_ARMOR_RUNE_DATA,property:ARMOR_PROPERTY_RUNES},weapon:{...FUNDAMENTAL_WEAPON_RUNE_DATA,property:WEAPON_PROPERTY_RUNES}};function computePrice(item){const basePrice=item.price.value;if(item.isOfType("treasure"))return basePrice;const materialPrice=getMaterialValuationData(item)?.price??0,heldOrStowedBulk=new Bulk({light:item.system.bulk.heldOrStowed}),bulk=Math.max(Math.ceil(heldOrStowedBulk.normal),1),materialValue=materialPrice+bulk*materialPrice/10,runesData=getRuneValuationData(item),runeValue=item.isSpecific?0:runesData.reduce((sum2,rune)=>sum2+rune.price,0),afterMaterialAndRunes=runeValue?new CoinsPF2e({gp:runeValue+materialValue}):basePrice.add({gp:materialValue}),higher=afterMaterialAndRunes.copperValue>basePrice.copperValue?afterMaterialAndRunes:basePrice,afterShoddy=item.isShoddy?higher.scale(.5):higher;return item.isMagical?afterShoddy:afterShoddy.adjustForSize(item.size)}__name(computePrice,"computePrice"),__name2(computePrice,"computePrice");function computeLevelRarityPrice(item){const materialData=getMaterialValuationData(item),price=computePrice(item);if(!(item.isMagical||materialData)||item.isSpecific||item.isOfType("armor")&&item.isShield)return{...pick$1(item,["level","rarity"]),price};const runesData=getRuneValuationData(item),level=runesData.map(runeData=>runeData.level).concat(materialData?.level??0).reduce((highest,level2)=>level2>highest?level2:highest,item.level),rarityOrder={common:0,uncommon:1,rare:2,unique:3},baseRarity=item.rarity,rarity=runesData.map(runeData=>runeData.rarity).concat(materialData?.rarity??"common").reduce((highest,rarity2)=>rarityOrder[rarity2]>rarityOrder[highest]?rarity2:highest,baseRarity);return{level,rarity,price}}__name(computeLevelRarityPrice,"computeLevelRarityPrice"),__name2(computeLevelRarityPrice,"computeLevelRarityPrice");function generateItemName(item){if(!item.isOfType("armor","weapon")||item.isOfType("armor")&&item.isShield)return item.name;const[baseItemDictionary,propertyDictionary,fundamentalTwoDictionary]=item.isOfType("armor")?[CONFIG.PF2E.baseArmorTypes,RUNE_DATA.armor.property,RUNE_DATA.armor.resilient]:[CONFIG.PF2E.baseWeaponTypes,RUNE_DATA.weapon.property,RUNE_DATA.weapon.striking],storedName=item._source.name,baseType=item.baseType??"";if(!baseType||!(baseType in baseItemDictionary)||item.isSpecific||storedName!==game.i18n.localize(baseItemDictionary[baseType]??""))return item.name;const{material}=item,{runes}=item.system,potencyRune=runes.potency,fundamental2="resilient"in runes?runes.resilient:runes.striking,params={base:baseType?game.i18n.localize(baseItemDictionary[baseType]??""):item.name,material:material.type&&game.i18n.localize(CONFIG.PF2E.preciousMaterials[material.type]),potency:potencyRune,fundamental2:game.i18n.localize(fundamentalTwoDictionary[fundamental2]?.name??"")||null,property1:game.i18n.localize(propertyDictionary[runes.property[0]]?.name??"")||null,property2:game.i18n.localize(propertyDictionary[runes.property[1]]?.name??"")||null,property3:game.i18n.localize(propertyDictionary[runes.property[2]]?.name??"")||null,property4:game.i18n.localize(propertyDictionary[runes.property[3]]?.name??"")||null},formatString=(()=>{const potency=params.potency&&"Potency",fundamental22=params.fundamental2&&"Fundamental2",properties=params.property4?"FourProperties":params.property3?"ThreeProperties":params.property2?"TwoProperties":params.property1?"OneProperty":null,material2=params.material&&"Material",key=[potency,fundamental22,properties,material2].filter(keyPart=>!!keyPart).join("")||null;return key&&game.i18n.localize(key)})();return formatString?game.i18n.format(`PF2E.Item.Physical.GeneratedName.${formatString}`,params):item.name}__name(generateItemName,"generateItemName"),__name2(generateItemName,"generateItemName");function organizeBulkData(item){const stackData=STACK_DEFINITIONS[item.system.stackGroup??""]??null,per=stackData?.size??1,heldOrStowed=stackData?.lightBulk??weightToBulk(item.system.weight.value)?.toLightBulk()??0,worn=item.system.equippedBulk.value?weightToBulk(item.system.equippedBulk.value)?.toLightBulk()??0:heldOrStowed,value=item.isOfType("armor","equipment","backpack")&&item.isEquipped?worn:heldOrStowed;return{heldOrStowed,worn,value,per}}__name(organizeBulkData,"organizeBulkData"),__name2(organizeBulkData,"organizeBulkData");const _Migration639NormalizeLevelAndPrice=class extends MigrationBase{static{__name(this,"_Migration639NormalizeLevelAndPrice")}coinSlugs=new Set(["platinum-pieces","gold-pieces","silver-pieces","copper-pieces"]);async updateItem(source){if(source.system.level&&(source.system.level.value=Number(source.system.level.value)||0),!isPhysicalData(source)||this.coinSlugs.has(source.system.slug??""))return;const system=source.system,price=system.price;if(!(typeof price.value!="string"&&isObject(price.value)))if(price.value?price.value=price.value.trim():price.value="0 gp",/^[0-9]+$/.test(price.value))price.value=`${price.value} gp`;else{const quantity=system.quantity,priceValue=price.value;CoinsPF2e.fromString(priceValue,quantity).copperValue&&(price.value="0 gp")}}};__name2(_Migration639NormalizeLevelAndPrice,"Migration639NormalizeLevelAndPrice"),__publicField(_Migration639NormalizeLevelAndPrice,"version",.639);let Migration639NormalizeLevelAndPrice=_Migration639NormalizeLevelAndPrice;const _Migration640CantripsAreNotZeroLevel=class extends MigrationBase{static{__name(this,"_Migration640CantripsAreNotZeroLevel")}async updateItem(itemData){if(itemData.type!=="spell")return;const level=itemData.system.level;level.value===0&&(level.value=1,itemData.system.traits.value.includes("cantrip")||itemData.system.traits.value.push("cantrip"))}};__name2(_Migration640CantripsAreNotZeroLevel,"Migration640CantripsAreNotZeroLevel"),__publicField(_Migration640CantripsAreNotZeroLevel,"version",.64);let Migration640CantripsAreNotZeroLevel=_Migration640CantripsAreNotZeroLevel;const _Migration641SovereignSteelValue=class extends MigrationBase{static{__name(this,"_Migration641SovereignSteelValue")}async updateItem(source){if(source.type!=="weapon")return;const material=source.system.preciousMaterial??{};material.value?.toLowerCase()==="sovereign steel"&&(material.value="sovereignSteel")}};__name2(_Migration641SovereignSteelValue,"Migration641SovereignSteelValue"),__publicField(_Migration641SovereignSteelValue,"version",.641);let Migration641SovereignSteelValue=_Migration641SovereignSteelValue;const _Migration642TrackSchemaVersion=class extends MigrationBase{static{__name(this,"_Migration642TrackSchemaVersion")}async updateActor(actorSource){actorSource.system.schema??={version:null,lastMigration:null}}async updateItem(itemSource){itemSource.system.schema??={version:null,lastMigration:null}}};__name2(_Migration642TrackSchemaVersion,"Migration642TrackSchemaVersion"),__publicField(_Migration642TrackSchemaVersion,"version",.642);let Migration642TrackSchemaVersion=_Migration642TrackSchemaVersion;const _Migration643HazardLevel=class extends MigrationBase{static{__name(this,"_Migration643HazardLevel")}async updateActor(actorSource){if(actorSource.type!=="hazard")return;const hazardDetails=actorSource.system.details;if(typeof hazardDetails.level=="number"){const level=hazardDetails.level;hazardDetails.level={value:level}}}};__name2(_Migration643HazardLevel,"Migration643HazardLevel"),__publicField(_Migration643HazardLevel,"version",.643);let Migration643HazardLevel=_Migration643HazardLevel;const defaultTraditionByClass$1={wizard:"arcane",cleric:"divine",druid:"primal",bard:"occult",ranger:"primal",champion:"divine",monk:"divine"},_Migration644SpellcastingCategory=class extends MigrationBase{static{__name(this,"_Migration644SpellcastingCategory")}async updateItem(item,actor){if(!actor||item.type!=="spellcastingEntry")return;const spellcasting=item.system;if(spellcasting.tradition.value==="ritual")spellcasting.prepared.value="ritual",spellcasting.tradition.value="";else if(spellcasting.tradition.value==="focus"){spellcasting.prepared.value="focus";const possibleMatch=actor.items.find(testItem=>{if(testItem.type!=="spellcastingEntry")return!1;const testSpellcasting=testItem.system;return tupleHasValue(["prepared","spontaneous"],testSpellcasting.prepared.value)&&testSpellcasting.tradition.value!=="focus"&&(actor.type==="character"?testSpellcasting.proficiency.value===spellcasting.proficiency.value:testSpellcasting.spelldc.value===spellcasting.spelldc.value)&&(testSpellcasting.ability.value||"int")===(spellcasting.ability.value||"int")});if(possibleMatch)spellcasting.tradition.value=possibleMatch.system.tradition.value;else{const classItem=actor.items.find(testItem=>testItem.type==="class"),className=classItem?.system.slug||sluggify(classItem?.name??"");spellcasting.tradition.value=defaultTraditionByClass$1[className]??"arcane"}}}};__name2(_Migration644SpellcastingCategory,"Migration644SpellcastingCategory"),__publicField(_Migration644SpellcastingCategory,"version",.644);let Migration644SpellcastingCategory=_Migration644SpellcastingCategory;const _Migration645TokenImageSize=class extends MigrationBase{static{__name(this,"_Migration645TokenImageSize")}constructor(){super(...arguments),__privateAdd(this,_isTokenImageFlag),__privateAdd(this,_isTokenSizeFlag),__privateAdd(this,_imageOverrides,new Map),__privateAdd(this,_sizeOverrides,new Map)}async updateActor(actorSource){const flags=actorSource.flags,originalImg=flags.pf2e?.token?.img;__privateMethod(this,_isTokenImageFlag,isTokenImageFlag_fn).call(this,originalImg)&&__privateGet(this,_imageOverrides).set(actorSource._id,originalImg);const originalSize=flags.pf2e?.token?.size;__privateMethod(this,_isTokenSizeFlag,isTokenSizeFlag_fn).call(this,originalSize)&&__privateGet(this,_sizeOverrides).set(actorSource._id,originalSize),typeof flags.pf2e?.token=="object"&&("game"in globalThis&&(flags.pf2e["-=token"]=null),delete flags.pf2e.token)}async updateToken(tokenSource,actor){tokenSource.texture.src=__privateGet(this,_imageOverrides).get(actor?.id??"")??tokenSource.texture.src;const sizeOverride=__privateGet(this,_sizeOverrides).get(actor?.id??"");tokenSource.height=sizeOverride?.height??tokenSource.height,tokenSource.width=sizeOverride?.width??tokenSource.width}};_imageOverrides=new WeakMap,_sizeOverrides=new WeakMap,_isTokenImageFlag=new WeakSet,isTokenImageFlag_fn=__name2(function(flag){return typeof flag=="string"},"#isTokenImageFlag"),_isTokenSizeFlag=new WeakSet,isTokenSizeFlag_fn=__name2(function(flag){return flag instanceof Object&&"height"in flag&&typeof flag.height=="number"&&"width"in flag&&typeof flag.width=="number"},"#isTokenSizeFlag"),__name2(_Migration645TokenImageSize,"Migration645TokenImageSize"),__publicField(_Migration645TokenImageSize,"version",.645);let Migration645TokenImageSize=_Migration645TokenImageSize;const _Migration646UpdateInlineLinks=class extends MigrationBase{static{__name(this,"_Migration646UpdateInlineLinks")}updateCheckAttributes(markup=""){return markup.replace(/\bdata-pf2-([a-z]+)-check="\w*"/g,'data-pf2-check="$1"').replace(/\bdata-pf2-(?:saving-throw|skill-check)\b/g,"data-pf2-check")}async updateActor(actorData){if(actorData.type==="hazard"){const hazardDetails=actorData.system.details;hazardDetails.disable=this.updateCheckAttributes(hazardDetails.disable??"")}}async updateItem(itemData){const description=itemData.system.description;description.value=this.updateCheckAttributes(description.value??"")}};__name2(_Migration646UpdateInlineLinks,"Migration646UpdateInlineLinks"),__publicField(_Migration646UpdateInlineLinks,"version",.646);let Migration646UpdateInlineLinks=_Migration646UpdateInlineLinks;const _Migration647FixPCSenses=class extends MigrationBase{static{__name(this,"_Migration647FixPCSenses")}async updateActor(actorData){if(actorData.type!=="character")return;const notTraits=actorData.system.traits;Array.isArray(notTraits.senses)?notTraits.senses=notTraits.senses.filter(sense=>!!sense):notTraits.senses=[]}};__name2(_Migration647FixPCSenses,"Migration647FixPCSenses"),__publicField(_Migration647FixPCSenses,"version",.647);let Migration647FixPCSenses=_Migration647FixPCSenses;const _Migration648RemoveInvestedProperty=class extends MigrationBase{static{__name(this,"_Migration648RemoveInvestedProperty")}async updateItem(itemSource){if(!(itemSource.type==="treasure"||itemSource.type==="consumable"))return;const systemData=itemSource.system;delete systemData.invested,"game"in globalThis&&(systemData["-=invested"]=null)}};__name2(_Migration648RemoveInvestedProperty,"Migration648RemoveInvestedProperty"),__publicField(_Migration648RemoveInvestedProperty,"version",.648);let Migration648RemoveInvestedProperty=_Migration648RemoveInvestedProperty;function isCreatureSource(source){return["character","npc"].includes(source.type)}__name(isCreatureSource,"isCreatureSource"),__name2(isCreatureSource,"isCreatureSource");const _Migration649FocusToActor=class extends MigrationBase{static{__name(this,"_Migration649FocusToActor")}async updateActor(actorData){if(!isCreatureSource(actorData))return;const systemData=actorData.system;systemData.resources||(systemData.resources={});const spellLists=actorData.items.filter(i=>i.type==="spellcastingEntry").sort((a,b)=>(a.sort||0)-(b.sort||0)).map(i=>i.system).filter(i=>i.prepared.value==="focus"&&i.focus).sort((a,b)=>(b.focus?.pool||0)-(a.focus?.pool||0));if(spellLists.length===0)return;const focusOld=spellLists[0].focus,resources=actorData.system.resources;resources.focus={value:focusOld?.points??0,max:focusOld?.pool??1}}async updateItem(itemData){if(itemData.type!=="spellcastingEntry")return;const data=itemData.system;delete data.focus,"game"in globalThis&&(data["-=focus"]=null)}};__name2(_Migration649FocusToActor,"Migration649FocusToActor"),__publicField(_Migration649FocusToActor,"version",.649);let Migration649FocusToActor=_Migration649FocusToActor;const _Migration650StringifyWeaponProperties=class extends MigrationBase{static{__name(this,"_Migration650StringifyWeaponProperties")}async updateItem(itemData){if(itemData.type!=="weapon")return;const systemData=itemData.system;systemData.weaponType&&(systemData.weaponType.value||="simple");const range=systemData.range??={value:"melee"};range instanceof Object&&typeof range.value=="string"&&(range.value=range.value.trim()||"melee",range.value==="reach"&&(range.value="melee"))}};__name2(_Migration650StringifyWeaponProperties,"Migration650StringifyWeaponProperties"),__publicField(_Migration650StringifyWeaponProperties,"version",.65);let Migration650StringifyWeaponProperties=_Migration650StringifyWeaponProperties;const _Migration651EphemeralFocusPool=class extends MigrationBase{static{__name(this,"_Migration651EphemeralFocusPool")}constructor(){super(...arguments),__privateAdd(this,_needsRuleElement),__privateAdd(this,_isClassFeature),__privateAdd(this,_increasesByOne,new Set(["abundant-step","achaekeks-grip","advanced-bloodline","advanced-deitys-domain","advanced-domain","advanced-revelation","advanced-school-spell","advanced-seeker-of-truths","animal-feature","arcane-school-spell","apex-companion","basic-lesson","beastmasters-trance","blessed-sacrifice","cackle","champions-sacrifice","clinging-shadows-initiate","counter-perform","debilitating-dichotomy","domain-acumen","domain-fluency","empty-body","enlarge-companion","ephemeral-tracking","familiar-form","fatal-aria","gaze-of-veracity","greater-bloodline","greater-lesson","greater-revelation","heal-animal","healing-touch","hunters-luck","hunters-vision","impaling-briars","inspire-heroics","invoke-disaster","invoke-the-crimson-oath","ki-blast","ki-form","ki-rush","ki-strike","leaf-order","light-of-revelation","lingering-composition","litany-against-sloth","litany-against-wrath","litany-of-depravity","litany-of-righteousness","litany-of-self-interest","loremasters-etude","magic-hide","major-lesson","mantis-form","medusas-wrath","order-spell","perfect-ki-adept","perfect-strike","quivering-palm","rangers-bramble","shadow-magic","shadows-web","shall-not-falter-shall-not-rout","snare-hopping","song-of-the-fallen","soothing-ballad","soothing-mist","speaking-sky","spellmasters-ward","steal-the-sky","storm-order","sun-blade","suns-fury","terrain-transposition","transcribe-moment","universal-versatility","vision-of-weakness","wholeness-of-body","wild-winds-initiate","wind-caller","wind-jump","wronged-monks-wrath"]))}async updateActor(source){if(source.type!=="character")return;const systemData=source.system;systemData.resources??={};const resources=systemData.resources;typeof resources.focus?.max=="number"&&"game"in globalThis?resources.focus["-=max"]=null:delete resources.focus?.max}async updateItem(source){if(source.type!=="feat")return;const systemData=source.system,rule=(()=>{const slug=systemData.slug??sluggify(source.name);return slug==="revelation-spells"?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:2,priority:10}:slug==="major-curse"?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:3}:["composition-spells","devotion-spells","druidic-order","hexes"].includes(slug)||/^(?:arcane-school|bloodline)-/.test(slug)&&__privateMethod(this,_isClassFeature,isClassFeature_fn).call(this,source)?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:1,priority:10}:__privateGet(this,_increasesByOne).has(slug)||slug.startsWith("first-revelation-")?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"add",value:1}:null})();rule&&__privateMethod(this,_needsRuleElement,needsRuleElement_fn).call(this,source.system.rules)&&systemData.rules.push(rule)}};_needsRuleElement=new WeakSet,needsRuleElement_fn=__name2(function(rules){return!rules.some(rule=>rule.key==="ActiveEffectLike"&&rule.path==="system.resources.focus.max")},"#needsRuleElement"),_increasesByOne=new WeakMap,_isClassFeature=new WeakSet,isClassFeature_fn=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration651EphemeralFocusPool,"Migration651EphemeralFocusPool"),__publicField(_Migration651EphemeralFocusPool,"version",.651);let Migration651EphemeralFocusPool=_Migration651EphemeralFocusPool;const defaultTraditionByClass={wizard:"arcane",druid:"primal",ranger:"primal"},_Migration652KillHalcyonTradition=class extends MigrationBase{static{__name(this,"_Migration652KillHalcyonTradition")}async updateItem(itemData,actor){if(itemData.type!=="spellcastingEntry")return;const tradition=itemData.system.tradition;if(tradition.value==="halcyon"){const classItem=actor?.items.find(testItem=>testItem.type==="class"),className=classItem?.system.slug||sluggify(classItem?.name??"");tradition.value=defaultTraditionByClass[className]??"arcane"}}};__name2(_Migration652KillHalcyonTradition,"Migration652KillHalcyonTradition"),__publicField(_Migration652KillHalcyonTradition,"version",.652);let Migration652KillHalcyonTradition=_Migration652KillHalcyonTradition;const _Migration653AEstoREs=class extends MigrationBase{static{__name(this,"_Migration653AEstoREs")}constructor(){super(...arguments),__privateAdd(this,_isRemovableAE),__privateAdd(this,_isRemoveableChange),__privateAdd(this,_fixClassKeyAbilities),__privateAdd(this,_pathsToRemove,new Set([...["unarmored","light","medium","heavy"].map(category=>`system.martial.${category}.rank`),...["unarmed","simple","martial","advanced"].map(category=>`system.martial.${category}.rank`),...["fortitude","reflex","will"].map(save=>`system.saves.${save}.rank`),"system.details.keyability.value","system.attributes.perception.rank","system.attributes.classDC.rank"]))}async updateActor(actorSource){if(actorSource.type!=="character")return;const systemData=actorSource.system;systemData.martial={},actorSource.effects=actorSource.effects.filter(effect=>{const origin=effect.origin??"",itemId=/\bItem\.([A-Za-z0-9]{16})$/.exec(origin)?.[1],itemSource=actorSource.items.find(maybeSource=>maybeSource._id===itemId);return itemSource&&!(["class","effect","feat"].includes(itemSource.type)&&__privateMethod(this,_isRemovableAE,isRemovableAE_fn).call(this,effect))})}async updateItem(itemSource){if(!(itemSource.type==="class"||itemSource.type==="effect"||itemSource.type==="feat"))return;itemSource.type==="class"&&__privateMethod(this,_fixClassKeyAbilities,fixClassKeyAbilities_fn).call(this,itemSource);const modes2={1:"multiply",2:"add",3:"downgrade",4:"upgrade",5:"override"};for(const effect of[...itemSource.effects]){itemSource.type==="class"&&(effect.changes=effect.changes.filter(change=>!__privateGet(this,_pathsToRemove).has(change.key)));const toAELikes=effect.changes.filter(__privateMethod(this,_isRemoveableChange,isRemoveableChange_fn)),rules=itemSource.system.rules;for(const change of toAELikes){if(change.mode===0)continue;const newRule={key:"ActiveEffectLike",path:change.key,mode:modes2[change.mode],value:Number.isNaN(Number(change.value))?change.value:Number(change.value),priority:change.priority??50};rules.push(newRule)}effect.changes=effect.changes.filter(change=>!__privateMethod(this,_isRemoveableChange,isRemoveableChange_fn).call(this,change))}itemSource.effects=itemSource.effects.filter(effect=>!__privateMethod(this,_isRemovableAE,isRemovableAE_fn).call(this,effect))}};_pathsToRemove=new WeakMap,_isRemovableAE=new WeakSet,isRemovableAE_fn=__name2(function(effect){return effect.changes.every(__privateMethod(this,_isRemoveableChange,isRemoveableChange_fn))},"#isRemovableAE"),_isRemoveableChange=new WeakSet,isRemoveableChange_fn=__name2(function(change){return change.mode!==0&&Number.isInteger(Number(change.value))||change.mode===5&&!change.value.startsWith("{")},"#isRemoveableChange"),_fixClassKeyAbilities=new WeakSet,fixClassKeyAbilities_fn=__name2(function(classSource){const keyAbility=classSource.system.keyAbility;keyAbility.value=keyAbility.value.map(value=>typeof value=="string"?value:value.value)},"#fixClassKeyAbilities"),__name2(_Migration653AEstoREs,"Migration653AEstoREs"),__publicField(_Migration653AEstoREs,"version",.653);let Migration653AEstoREs=_Migration653AEstoREs;const _Migration654ActionTypeAndCount=class extends MigrationBase{static{__name(this,"_Migration654ActionTypeAndCount")}async updateItem(item){if(item.type!=="feat"&&item.type!=="action")return;const systemData=item.system;systemData.actions.value=Math.min(3,Math.max(Number(systemData.actions.value),0))||null}};__name2(_Migration654ActionTypeAndCount,"Migration654ActionTypeAndCount"),__publicField(_Migration654ActionTypeAndCount,"version",.654);let Migration654ActionTypeAndCount=_Migration654ActionTypeAndCount;const _Migration655CreatureTokenSizes=class extends MigrationBase{static{__name(this,"_Migration655CreatureTokenSizes")}constructor(){super(...arguments),__privateAdd(this,_isTokenSizeRE),__privateAdd(this,_isActorSizeAELike),__privateAdd(this,_isBracketedValue),__publicField(this,"dimensionToSize",{.5:"tiny",2:"lg",3:"huge",4:"grg"})}async updateItem(itemSource){itemSource.system.rules??=[];const rules=itemSource.system.rules,actorSizeAELike=rules.find(__privateMethod(this,_isActorSizeAELike,isActorSizeAELike_fn)),tokenSizeRE=rules.find(__privateMethod(this,_isTokenSizeRE,isTokenSizeRE_fn));if(actorSizeAELike)actorSizeAELike.key="CreatureSize",delete actorSizeAELike.path,delete actorSizeAELike.mode;else if(tokenSizeRE&&["number","string","object"].includes(typeof tokenSizeRE.value))if(tokenSizeRE.key="CreatureSize",__privateMethod(this,_isBracketedValue,isBracketedValue_fn).call(this,tokenSizeRE.value))for(const bracket of tokenSizeRE.value.brackets)typeof bracket.value=="number"&&(bracket.value=this.dimensionToSize[bracket.value]??"med");else typeof tokenSizeRE.value=="number"&&(tokenSizeRE.value=this.dimensionToSize[tokenSizeRE.value]??"med");tokenSizeRE&&tokenSizeRE.key!=="CreatureSize"&&itemSource.system.rules.splice(itemSource.system.rules.indexOf(tokenSizeRE),1)}};_isTokenSizeRE=new WeakSet,isTokenSizeRE_fn=__name2(function(rule){return typeof rule.key=="string"&&rule.key.endsWith("TokenSize")},"#isTokenSizeRE"),_isActorSizeAELike=new WeakSet,isActorSizeAELike_fn=__name2(function(rule){return typeof rule.key=="string"&&rule.key.endsWith("ActiveEffectLike")&&rule.path==="system.traits.size.value"},"#isActorSizeAELike"),_isBracketedValue=new WeakSet,isBracketedValue_fn=__name2(function(value){return isObject(value)&&Array.isArray(value.brackets)},"#isBracketedValue"),__name2(_Migration655CreatureTokenSizes,"Migration655CreatureTokenSizes"),__publicField(_Migration655CreatureTokenSizes,"version",.655);let Migration655CreatureTokenSizes=_Migration655CreatureTokenSizes;const _Migration656OtherFocusPoolSources=class extends MigrationBase{static{__name(this,"_Migration656OtherFocusPoolSources")}needsRuleElement(rules){return!rules.some(rule=>rule.key==="ActiveEffectLike"&&rule.path==="system.resources.focus.max")}increasesByOne=new Set(["additional-shadow-magic","basic-bloodline-spell","blessed-one-dedication","breath-of-the-dragon","crystal-ward-spells","domain-initiate","expanded-domain-initiate","gravity-weapon","heal-companion","leaf-order","shadow-illusion","storm-order","wings-of-the-dragon"]);async updateItem(itemSource){if(itemSource.type!=="feat")return;const systemData=itemSource.system,rule=(()=>{const slug=systemData.slug??sluggify(itemSource.name);return slug==="druidic-order"?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:1,priority:10}:this.increasesByOne.has(slug)?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"add",value:1}:null})();rule&&this.needsRuleElement(itemSource.system.rules)&&systemData.rules.push(rule)}};__name2(_Migration656OtherFocusPoolSources,"Migration656OtherFocusPoolSources"),__publicField(_Migration656OtherFocusPoolSources,"version",.656);let Migration656OtherFocusPoolSources=_Migration656OtherFocusPoolSources;const _Migration657RemoveSetProperty=class extends MigrationBase{static{__name(this,"_Migration657RemoveSetProperty")}async updateActor(actorSource){const systemFlags=actorSource.flags.pf2e??{};delete systemFlags["set-property"],"game"in globalThis&&"set-property"in systemFlags&&(systemFlags["-=set-property"]=null)}async updateItem(itemSource){itemSource.system.rules??=[];const rules=itemSource.system.rules,setPropertyRules=itemSource.system.rules.filter(rule=>typeof rule.key=="string"&&["SetProperty","PF2E.RuleElement.SetProperty"].includes(rule.key)&&typeof rule.property=="string"&&typeof rule.on=="object"&&rule.on!==null&&"added"in rule.on),aeLikes=setPropertyRules.map(setProperty2=>({key:"ActiveEffectLike",mode:"override",path:setProperty2.property.replace(/^flags\.2e/,"flags.pf2e"),value:setProperty2.on.added,priority:10}));for(const setPropertyRule of setPropertyRules){const index=rules.indexOf(setPropertyRule);rules.splice(index,1,aeLikes.shift())}itemSource.system.rules=itemSource.system.rules.filter(rule=>rule&&typeof rule.key=="string"&&!rule.key.trim().endsWith("SetProperty"))}};__name2(_Migration657RemoveSetProperty,"Migration657RemoveSetProperty"),__publicField(_Migration657RemoveSetProperty,"version",.657);let Migration657RemoveSetProperty=_Migration657RemoveSetProperty;const _Migration658MonkUnarmoredProficiency=class extends MigrationBase{static{__name(this,"_Migration658MonkUnarmoredProficiency")}async updateItem(itemSource){const slug=itemSource.system.slug??sluggify(itemSource.name);itemSource.type==="class"&&slug==="monk"&&itemSource.system.defenses.unarmored!==2&&(itemSource.system.defenses.unarmored=2)}};__name2(_Migration658MonkUnarmoredProficiency,"Migration658MonkUnarmoredProficiency"),__publicField(_Migration658MonkUnarmoredProficiency,"version",.658);let Migration658MonkUnarmoredProficiency=_Migration658MonkUnarmoredProficiency;const formulaHasValue=__name2(value=>!!value&&value!=="0","formulaHasValue"),modes=["level1","level2","level3","level4"],_Migration659MultipleDamageRows=class extends MigrationBase{static{__name(this,"_Migration659MultipleDamageRows")}async updateItem(source){if(source.type!=="spell")return;const data=source.system;if(data.scaling instanceof Object&&(typeof data.scaling.mode=="string"&&tupleHasValue(modes,data.scaling.mode)&&(data.scaling.interval=modes.indexOf(data.scaling.mode)+1),typeof data.scaling.formula=="string"&&formulaHasValue(data.scaling.formula)&&!data.scaling.damage&&(data.scaling.damage={0:data.scaling.formula}),!data.scaling.interval||!data.scaling.damage?"game"in globalThis?data["-=scaling"]=null:delete data.scaling:"game"in globalThis?(data.scaling["-=mode"]=null,data.scaling["-=formula"]=null):(delete data.scaling.mode,delete data.scaling.formula)),typeof data.damage.value=="string"){if(formulaHasValue(data.damage.value)||data.damage.applyMod){const value=data.damage.value;data.damage.value={0:{value,applyMod:data.damage.applyMod||void 0,type:{value:data.damageType?.value||"untyped",categories:[]}}}}else data.damage.value={};"game"in globalThis?data.damage["-=applyMod"]=null:delete data.damage.applyMod}"damageType"in data&&("game"in globalThis?data["-=damageType"]=null:data.damageType=void 0)}};__name2(_Migration659MultipleDamageRows,"Migration659MultipleDamageRows"),__publicField(_Migration659MultipleDamageRows,"version",.659);let Migration659MultipleDamageRows=_Migration659MultipleDamageRows;const _Migration660DerivedSpellTraits=class extends MigrationBase{static{__name(this,"_Migration660DerivedSpellTraits")}derivedTraits=[...MAGIC_SCHOOLS,...MAGIC_TRADITIONS];async updateItem(itemSource){if(itemSource.type==="spell"){const traits=itemSource.system.traits;traits.value=traits.value.filter(trait=>!this.derivedTraits.includes(trait))}}};__name2(_Migration660DerivedSpellTraits,"Migration660DerivedSpellTraits"),__publicField(_Migration660DerivedSpellTraits,"version",.66);let Migration660DerivedSpellTraits=_Migration660DerivedSpellTraits;const _Migration661NumifyVehicleDimensions=class extends MigrationBase{static{__name(this,"_Migration661NumifyVehicleDimensions")}async updateActor(actorSource){if(actorSource.type==="vehicle"){const{space}=actorSource.system.details;space.long=Number(space.long)||2,space.wide=Number(space.wide)||2,space.high=Number(space.high)||1}}};__name2(_Migration661NumifyVehicleDimensions,"Migration661NumifyVehicleDimensions"),__publicField(_Migration661NumifyVehicleDimensions,"version",.661);let Migration661NumifyVehicleDimensions=_Migration661NumifyVehicleDimensions;const _Migration662LinkToActorSizeDefaults=class extends MigrationBase{static{__name(this,"_Migration662LinkToActorSizeDefaults")}async updateActor(actorSource){const linkToActorSize=!["hazard","loot"].includes(actorSource.type);actorSource.prototypeToken.flags??={pf2e:{linkToActorSize}},actorSource.prototypeToken.flags.pf2e??={linkToActorSize},actorSource.prototypeToken.flags.pf2e.linkToActorSize??=linkToActorSize}async updateToken(tokenSource,actor){const linkToActorSize=!["hazard","loot"].includes(actor.type);tokenSource.flags.pf2e??={linkToActorSize},tokenSource.flags.pf2e.linkToActorSize??=linkToActorSize}};__name2(_Migration662LinkToActorSizeDefaults,"Migration662LinkToActorSizeDefaults"),__publicField(_Migration662LinkToActorSizeDefaults,"version",.662);let Migration662LinkToActorSizeDefaults=_Migration662LinkToActorSizeDefaults;function createBasicDamage(value,applyMod,damageType){return{0:{applyMod,type:{categories:[],value:damageType},value}}}__name(createBasicDamage,"createBasicDamage"),__name2(createBasicDamage,"createBasicDamage");function createBasicScaling(interval,scaling){return{interval,damage:{0:scaling}}}__name(createBasicScaling,"createBasicScaling"),__name2(createBasicScaling,"createBasicScaling");const _Migration663FixSpellDamage=class extends MigrationBase{static{__name(this,"_Migration663FixSpellDamage")}async updateItem(source){if(source.type!=="spell"||Object.keys(source.system.damage?.value??{}).length>0)return;const itemName=source.system.slug??sluggify(source.name),systemData=source.system;switch(itemName){case"animated-assault":systemData.damage.value=createBasicDamage("2d10",!1,"bludgeoning"),systemData.scaling=createBasicScaling(2,"2d10");break;case"daze":systemData.damage.value=createBasicDamage("0",!0,"mental"),systemData.scaling=createBasicScaling(2,"1d6");break;case"personal-blizzard":systemData.damage.value={0:{applyMod:!1,type:{value:"cold",categories:[]},value:"1d6"},1:{applyMod:!1,type:{value:"cold",subtype:"persistent",categories:[]},value:"1d6"}},systemData.scaling={interval:1,damage:{0:"1",1:"1"}};break;case"power-word-kill":systemData.damage.value=createBasicDamage("50",!1,"untyped");break}}};__name2(_Migration663FixSpellDamage,"Migration663FixSpellDamage"),__publicField(_Migration663FixSpellDamage,"version",.663);let Migration663FixSpellDamage=_Migration663FixSpellDamage;const _Migration664DeleteCUBConditions=class extends MigrationBase{static{__name(this,"_Migration664DeleteCUBConditions")}async updateActor(actorSource){const cubConditions=actorSource.items.filter(item=>item.type==="condition"&&!item.system.references?.overriddenBy);for(const condition of cubConditions)actorSource.items.findSplice(item=>item===condition)}};__name2(_Migration664DeleteCUBConditions,"Migration664DeleteCUBConditions"),__publicField(_Migration664DeleteCUBConditions,"version",.664);let Migration664DeleteCUBConditions=_Migration664DeleteCUBConditions;const _Migration665HandwrapsCorrections=class extends MigrationBase{static{__name(this,"_Migration665HandwrapsCorrections")}async updateItem(itemSource){const slug=itemSource.system.slug??sluggify(itemSource.name);if(itemSource.type==="weapon"&&slug==="handwraps-of-mighty-blows"){const usage=itemSource.system.usage;usage.value="worn-gloves"}const dirPath="systems/pf2e/icons/equipment/worn-items/other-worn-items";itemSource.img===`${dirPath}/handwraps-of-nighty-blows.webp`&&(itemSource.img=`${dirPath}/handwraps-of-mighty-blows.webp`)}};__name2(_Migration665HandwrapsCorrections,"Migration665HandwrapsCorrections"),__publicField(_Migration665HandwrapsCorrections,"version",.665);let Migration665HandwrapsCorrections=_Migration665HandwrapsCorrections;const _Migration666UsageAndStowingContainers=class extends MigrationBase{static{__name(this,"_Migration666UsageAndStowingContainers")}backpacks=new Set(["backpack","knapsack-of-halflingkind","knapsack-of-halflingkind-greater","sturdy-satchel","vaultbreaker-harness","voyagers-pack"]);wornGarment=new Set(["sleeves-of-storage","sleeves-of-storage-greater"]);wornGloves=new Set(["gloves-of-storing"]);heldInTwoHands=new Set(["bag-of-devouring-type-i","bag-of-devouring-type-ii","bag-of-devouring-type-iii","bag-of-holding-type-i","bag-of-holding-type-ii","bag-of-holding-type-iii","bag-of-holding-type-iv","bag-of-weasels","chest","sealing-chest-greater","sealing-chest-lesser","sealing-chest-moderate"]);stowingContainers=new Set([...this.backpacks,...this.heldInTwoHands,...this.wornGarment,...this.wornGloves,"extradimensional-stash"]);async updateItem(itemSource){if(!itemSource.system.traits)return;const traits=itemSource.system.traits;if(typeof traits.usage?.value=="string"){const traitUsage=traits.usage.value,isPhysical=isPhysicalData(itemSource),keepUsage=isPhysical&&(traitUsage!=="held-in-one-hand"||itemSource.system.usage.value==="");isPhysical&&keepUsage&&(itemSource.system.usage.value=traits.usage.value),"game"in globalThis?traits["-=usage"]=null:delete traits.usage}if(itemSource.type!=="backpack")return;const slug=itemSource.system.slug??sluggify(itemSource.name);this.backpacks.has(slug)?itemSource.system.usage.value="wornbackpack":this.heldInTwoHands.has(slug)?itemSource.system.usage.value="held-in-two-hands":this.wornGarment.has(slug)?itemSource.system.usage.value="worngarment":this.wornGloves.has(slug)?itemSource.system.usage.value="worngloves":itemSource.system.usage.value="worn",itemSource.system.stowing=this.stowingContainers.has(slug)}};__name2(_Migration666UsageAndStowingContainers,"Migration666UsageAndStowingContainers"),__publicField(_Migration666UsageAndStowingContainers,"version",.666);let Migration666UsageAndStowingContainers=_Migration666UsageAndStowingContainers;const _Migration667HPSubProperties=class extends MigrationBase{static{__name(this,"_Migration667HPSubProperties")}addRecoveryMultiplier(itemSource,slug){if(!["dream-may","fast-recovery"].includes(slug))return;const rules=itemSource.system.rules;if(!rules.some(rule=>"path"in rule&&rule.path==="system.attributes.hp.recoveryMultiplier")){const element={key:"ActiveEffectLike",mode:"add",path:"system.attributes.hp.recoveryMultiplier",value:1};rules.push(element)}}addNegativeHealing(itemSource,slug){if(!["dhampir","negative-healing"].includes(slug))return;const rules=itemSource.system.rules;if(!rules.some(rule=>"path"in rule&&rule.path==="system.attributes.hp.negativeHealing")){const element={key:"ActiveEffectLike",mode:"override",path:"system.attributes.hp.negativeHealing",value:!0};rules.push(element)}}async updateItem(itemSource){if(itemSource.type!=="feat"&&itemSource.type!=="action")return;const slug=itemSource.system.slug??sluggify(itemSource.name);this.addRecoveryMultiplier(itemSource,slug),this.addNegativeHealing(itemSource,slug)}};__name2(_Migration667HPSubProperties,"Migration667HPSubProperties"),__publicField(_Migration667HPSubProperties,"version",.667);let Migration667HPSubProperties=_Migration667HPSubProperties;const _Migration668ArmorSpeedPenalty=class extends MigrationBase{static{__name(this,"_Migration668ArmorSpeedPenalty")}async updateItem(itemSource){const slug=itemSource.system.slug??sluggify(itemSource.name);if(itemSource.type==="armor"){const rules=itemSource.system.rules??=[],rule=rules.find(r=>typeof r.key=="string"&&r.key.endsWith("FlatModifier")&&r.selector==="speed"&&typeof r.value=="object"&&JSON.stringify(r.predicate??null)===JSON.stringify({not:["unburdened-iron"]}));rule&&rules.splice(rules.indexOf(rule),1)}else if(itemSource.type==="feat"){if(slug==="unburdened-iron"){const rule={key:"RollOption",domain:"speed",option:"armor:ignore-speed-penalty"};itemSource.system.rules=[rule]}else if(slug==="armored-stealth"){const rule={key:"RollOption",domain:"stealth",option:"armor:ignore-noisy-penalty"};itemSource.system.rules=[rule]}}}};__name2(_Migration668ArmorSpeedPenalty,"Migration668ArmorSpeedPenalty"),__publicField(_Migration668ArmorSpeedPenalty,"version",.668);let Migration668ArmorSpeedPenalty=_Migration668ArmorSpeedPenalty;const _Migration669NPCAttackEffects=class extends MigrationBase{static{__name(this,"_Migration669NPCAttackEffects")}async updateItem(item,actor){!actor||item.type!=="melee"||(item.system.attackEffects??={value:[]},Array.isArray(item.system.attackEffects.value)&&item.system.attackEffects.value.forEach((entry,index,arr)=>{arr[index]=sluggify(entry)}))}};__name2(_Migration669NPCAttackEffects,"Migration669NPCAttackEffects"),__publicField(_Migration669NPCAttackEffects,"version",.669);let Migration669NPCAttackEffects=_Migration669NPCAttackEffects;const _Migration670AncestryVision=class extends MigrationBase{static{__name(this,"_Migration670AncestryVision")}constructor(){super(...arguments),__privateAdd(this,_setAncestryVision),__publicField(this,"DARKVISION_ID","HHVQDp61ehcpdiU8"),__publicField(this,"LOWLIGHTVISION_ID","DRtaqOHXTRtGRIUT")}async updateActor(source){if(source.type!=="character")return;const ancestry=source.items.find(item=>item.type==="ancestry");if(ancestry){__privateMethod(this,_setAncestryVision,setAncestryVision_fn).call(this,ancestry);for(const vision of["darkvision","low-light-vision"]){const index=source.items.findIndex(item=>item.type==="feat"&&(item.system.slug??sluggify(item.name))===vision);index!==-1&&source.items.splice(index,1)}}}async updateItem(source,actor){source.type==="ancestry"&&!actor&&__privateMethod(this,_setAncestryVision,setAncestryVision_fn).call(this,source)}};_setAncestryVision=new WeakSet,setAncestryVision_fn=__name2(function(ancestry){const features=ancestry.system.items;for(const[key,value]of Object.entries(features))value?.id===this.LOWLIGHTVISION_ID?("game"in globalThis?features[`-=${key}`]=null:delete features[key],ancestry.system.vision=ancestry.system.vision==="darkvision"?"darkvision":"lowLightVision"):value?.id===this.DARKVISION_ID&&("game"in globalThis?features[`-=${key}`]=null:delete features[key],ancestry.system.vision="darkvision");ancestry.system.vision??="normal"},"#setAncestryVision"),__name2(_Migration670AncestryVision,"Migration670AncestryVision"),__publicField(_Migration670AncestryVision,"version",.67);let Migration670AncestryVision=_Migration670AncestryVision;const _Migration670NoCustomTrait=class extends MigrationBase{static{__name(this,"_Migration670NoCustomTrait")}async updateItem(itemSource){const traits=itemSource.system.traits;traits&&(Array.isArray(traits.value)?traits.value=traits.value.filter(trait=>trait&&trait!=="custom"):traits.value=[])}};__name2(_Migration670NoCustomTrait,"Migration670NoCustomTrait"),__publicField(_Migration670NoCustomTrait,"version",.67);let Migration670NoCustomTrait=_Migration670NoCustomTrait;const _Migration671NoPCItemsOnNonPCs=class extends MigrationBase{static{__name(this,"_Migration671NoPCItemsOnNonPCs")}async updateActor(actorSource){if(actorSource.type==="character")return;const pcOnlyTypes=["ancestry","background","class","feat"],forbiddenItems=actorSource.items.filter(item=>pcOnlyTypes.includes(item.type));for(const forbiddenItem of forbiddenItems){const index=actorSource.items.findIndex(item=>item===forbiddenItem);index!==-1&&actorSource.items.splice(index,1)}}};__name2(_Migration671NoPCItemsOnNonPCs,"Migration671NoPCItemsOnNonPCs"),__publicField(_Migration671NoPCItemsOnNonPCs,"version",.671);let Migration671NoPCItemsOnNonPCs=_Migration671NoPCItemsOnNonPCs;const PHYSICAL_DAMAGE_TYPES=["bludgeoning","piercing","slashing","bleed"],LIFE_ENERGY_DAMAGE_TYPES=["vitality","void"],ENERGY_DAMAGE_TYPES=["acid","cold","electricity","fire","sonic","force",...LIFE_ENERGY_DAMAGE_TYPES],ALIGNMENT_DAMAGE_TYPES=["chaotic","lawful","good","evil"],DAMAGE_CATEGORIES_UNIQUE=new Set(["persistent","precision","splash"]),MATERIAL_DAMAGE_EFFECTS=new Set(["adamantine","cold-iron","darkwood","mithral","orichalcum","silver","sisterstone-dusk","sisterstone-scarlet","warpglass"]);[...DAMAGE_CATEGORIES_UNIQUE,...MATERIAL_DAMAGE_EFFECTS];const DAMAGE_DIE_FACES_TUPLE=["d4","d6","d8","d10","d12"],DAMAGE_DIE_FACES=new Set(DAMAGE_DIE_FACES_TUPLE),DAMAGE_TYPES=new Set([...PHYSICAL_DAMAGE_TYPES,...ENERGY_DAMAGE_TYPES,...ALIGNMENT_DAMAGE_TYPES,"mental","poison","spirit","untyped"]),BASE_DAMAGE_TYPES_TO_CATEGORIES={bludgeoning:"physical",piercing:"physical",slashing:"physical",bleed:"physical",acid:"energy",cold:"energy",electricity:"energy",fire:"energy",sonic:"energy",vitality:"energy",void:"energy",force:"energy",chaotic:"alignment",evil:"alignment",good:"alignment",lawful:"alignment",mental:null,poison:null,spirit:null,untyped:null},DAMAGE_TYPE_ICONS={bleed:"droplet",acid:"vial",bludgeoning:"hammer",chaotic:"face-zany",cold:"snowflake",electricity:"bolt",evil:"face-angry-horns",fire:"fire",force:"sparkles",good:"face-smile-halo",lawful:"scale-balanced",mental:"brain",piercing:"bow-arrow",poison:"spider",slashing:"axe",sonic:"waveform-lines",spirit:"ghost",vitality:"sun",void:"skull",untyped:null},PERSISTENT_DAMAGE_IMAGES={acid:"icons/magic/acid/dissolve-arm-flesh.webp",bludgeoning:"systems/pf2e/icons/equipment/weapons/bola.webp",chaotic:"systems/pf2e/icons/spells/dinosaur-form.webp",cold:"icons/magic/water/ice-snowman.webp",electricity:"systems/pf2e/icons/spells/chain-lightning.webp",evil:"icons/magic/unholy/strike-body-explode-disintegrate.webp",fire:"icons/magic/fire/flame-burning-creature-skeleton.webp",force:"systems/pf2e/icons/spells/magic-missile.webp",good:"systems/pf2e/icons/damage/persistent/good.webp",lawful:"systems/pf2e/icons/equipment/adventuring-gear/merchant-scale.webp",mental:"systems/pf2e/icons/spells/modify-memory.webp",piercing:"systems/pf2e/icons/equipment/weapons/throwing-knife.webp",poison:"systems/pf2e/icons/spells/acidic-burst.webp",slashing:"systems/pf2e/icons/equipment/weapons/scimitar.webp",sonic:"systems/pf2e/icons/spells/cry-of-destruction.webp",spirit:"icons/magic/unholy/hand-claw-fire-blue.webp",vitality:"systems/pf2e/icons/spells/moment-of-renewal.webp",void:"systems/pf2e/icons/spells/grim-tendrils.webp"},CRITICAL_INCLUSION={DOUBLE_ON_CRIT:null,CRITICAL_ONLY:!0,DONT_DOUBLE_ON_CRIT:!1},_MystifiedTraits=class{static{__name(this,"_MystifiedTraits")}static compile(){this.mystifiedTraits=new Set(["artifact","extradimensional","invested","shadow",...Object.keys(CONFIG.PF2E.consumableTraits).filter(t=>!["consumable","nonlethal"].includes(t))].sort())}static has(trait){return this.mystifiedTraits.has(trait)}};__name2(_MystifiedTraits,"MystifiedTraits"),__publicField(_MystifiedTraits,"mystifiedTraits",new Set);let MystifiedTraits=_MystifiedTraits;const ITEM_CARRY_TYPES=new Set(["held","worn","stowed","dropped"]),RANGE_TRAITS=["range-5","range-10","range-15","range-20","range-25","range-30","range-40","range-50","range-60","range-70","range-80","range-90","range-100","range-110","range-120","range-140","range-150","range-160","range-170","range-180","range-190","range-200","range-210","range-220","range-230","range-240","range-250","range-260","range-270","range-280","range-290","range-300","range-310","range-320","range-500","range-increment-5","range-increment-10","range-increment-15","range-increment-20","range-increment-25","range-increment-30","range-increment-40","range-increment-50","range-increment-60","range-increment-70","range-increment-75","range-increment-80","range-increment-90","range-increment-100","range-increment-110","range-increment-120","range-increment-130","range-increment-140","range-increment-150","range-increment-160","range-increment-170","range-increment-180","range-increment-190","range-increment-200","range-increment-210","range-increment-220","range-increment-230","range-increment-240","range-increment-250","range-increment-260","range-increment-270","range-increment-280","range-increment-290","range-increment-300","range-increment-310","range-increment-320"],ancestryTraits={"half-elf":"PF2E.TraitHalfElf","half-orc":"PF2E.TraitHalfOrc",aasimar:"PF2E.TraitAasimar",aberration:"PF2E.TraitAberration",anadi:"PF2E.TraitAnadi",android:"PF2E.TraitAndroid",aphorite:"PF2E.TraitAphorite",ardande:"PF2E.TraitArdande",automaton:"PF2E.TraitAutomaton",azarketi:"PF2E.TraitAzarketi",beastkin:"PF2E.TraitBeastkin",catfolk:"PF2E.TraitCatfolk",changeling:"PF2E.TraitChangeling",conrasu:"PF2E.TraitConrasu",dhampir:"PF2E.TraitDhampir",duskwalker:"PF2E.TraitDuskwalker",dwarf:"PF2E.TraitDwarf",elf:"PF2E.TraitElf",fetchling:"PF2E.TraitFetchling",fleshwarp:"PF2E.TraitFleshwarp",ganzi:"PF2E.TraitGanzi",geniekin:"PF2E.TraitGeniekin",ghoran:"PF2E.TraitGhoran",gnoll:"PF2E.TraitGnoll",gnome:"PF2E.TraitGnome",goblin:"PF2E.TraitGoblin",goloma:"PF2E.TraitGoloma",grippli:"PF2E.TraitGrippli",halfling:"PF2E.TraitHalfling",hobgoblin:"PF2E.TraitHobgoblin",human:"PF2E.TraitHuman",ifrit:"PF2E.TraitIfrit",kashrishi:"PF2E.TraitKashrishi",kitsune:"PF2E.TraitKitsune",kobold:"PF2E.TraitKobold",leshy:"PF2E.TraitLeshy",lizardfolk:"PF2E.TraitLizardfolk",nagaji:"PF2E.TraitNagaji",orc:"PF2E.TraitOrc",oread:"PF2E.TraitOread",poppet:"PF2E.TraitPoppet",ratfolk:"PF2E.TraitRatfolk",reflection:"PF2E.TraitReflection",shisk:"PF2E.TraitShisk",shoony:"PF2E.TraitShoony",skeleton:"PF2E.TraitSkeleton",sprite:"PF2E.TraitSprite",strix:"PF2E.TraitStrix",suli:"PF2E.TraitSuli",sylph:"PF2E.TraitSylph",talos:"PF2E.TraitTalos",tengu:"PF2E.TraitTengu",tiefling:"PF2E.TraitTiefling",undine:"PF2E.TraitUndine",vanara:"PF2E.TraitVanara",vishkanya:"PF2E.TraitVishkanya"},ancestryItemTraits={...ancestryTraits,aeon:"PF2E.TraitAeon",amphibious:"PF2E.TraitAmphibious",automaton:"PF2E.TraitAutomaton",construct:"PF2E.TraitConstruct",fey:"PF2E.TraitFey",fungus:"PF2E.TraitFungus",humanoid:"PF2E.TraitHumanoid",plant:"PF2E.TraitPlant",undead:"PF2E.TraitUndead"},elementTraits={air:"PF2E.TraitAir",earth:"PF2E.TraitEarth",fire:"PF2E.TraitFire",metal:"PF2E.TraitMetal",water:"PF2E.TraitWater",wood:"PF2E.TraitWood"},energyDamageTypes={acid:"PF2E.TraitAcid",cold:"PF2E.TraitCold",electricity:"PF2E.TraitElectricity",fire:"PF2E.TraitFire",force:"PF2E.TraitForce",sonic:"PF2E.TraitSonic",vitality:"PF2E.TraitVitality",void:"PF2E.TraitVoid"},magicTraditions={arcane:"PF2E.TraitArcane",divine:"PF2E.TraitDivine",occult:"PF2E.TraitOccult",primal:"PF2E.TraitPrimal"},creatureTraits={...ancestryItemTraits,...elementTraits,...energyDamageTypes,...magicTraditions,aberration:"PF2E.TraitAberration",aeon:"PF2E.TraitAeon",aesir:"PF2E.TraitAesir",agathion:"PF2E.TraitAgathion",alchemical:"PF2E.TraitAlchemical",angel:"PF2E.TraitAngel",animal:"PF2E.TraitAnimal",anugobu:"PF2E.TraitAnugobu",aquatic:"PF2E.TraitAquatic",archon:"PF2E.TraitArchon",astral:"PF2E.TraitAstral",asura:"PF2E.TraitAsura",azata:"PF2E.TraitAzata",beast:"PF2E.TraitBeast",boggard:"PF2E.TraitBoggard",caligni:"PF2E.TraitCaligni",celestial:"PF2E.TraitCelestial","charau-ka":"PF2E.TraitCharauKa",clockwork:"PF2E.TraitClockwork",construct:"PF2E.TraitConstruct",couatl:"PF2E.TraitCouatl",daemon:"PF2E.TraitDaemon",darvakka:"PF2E.TraitDarvakka",demon:"PF2E.TraitDemon",dero:"PF2E.TraitDero",devil:"PF2E.TraitDevil",dinosaur:"PF2E.TraitDinosaur",div:"PF2E.TraitDiv",dragon:"PF2E.TraitDragon",dream:"PF2E.TraitDream",drow:"PF2E.TraitDrow",duergar:"PF2E.TraitDuergar",duskwalker:"PF2E.TraitDuskwalker",eidolon:"PF2E.TraitEidolon",elemental:"PF2E.TraitElemental",ethereal:"PF2E.TraitEthereal",evocation:"PF2E.TraitEvocation",fiend:"PF2E.TraitFiend",formian:"PF2E.TraitFormian",fungus:"PF2E.TraitFungus",genie:"PF2E.TraitGenie",ghoran:"PF2E.TraitGhoran",ghost:"PF2E.TraitGhost",ghoul:"PF2E.TraitGhoul",ghul:"PF2E.TraitGhul",giant:"PF2E.TraitGiant",golem:"PF2E.TraitGolem",gremlin:"PF2E.TraitGremlin",grioth:"PF2E.TraitGrioth",grippli:"PF2E.TraitGrippli",hag:"PF2E.TraitHag",hantu:"PF2E.TraitHantu",herald:"PF2E.TraitHerald",hryngar:"PF2E.TraitHryngar",humanoid:"PF2E.TraitHumanoid",ifrit:"PF2E.TraitIfrit",ikeshti:"PF2E.TraitIkeshti",illusion:"PF2E.TraitIllusion",incorporeal:"PF2E.TraitIncorporeal",inevitable:"PF2E.TraitInevitable",kami:"PF2E.TraitKami",kovintus:"PF2E.TraitKovintus",light:"PF2E.TraitLight",lilu:"PF2E.TraitLilu",locathah:"PF2E.TraitLocathah",mental:"PF2E.TraitMental",merfolk:"PF2E.TraitMerfolk",mindless:"PF2E.TraitMindless",minion:"PF2E.TraitMinion",monitor:"PF2E.TraitMonitor",morlock:"PF2E.TraitMorlock",mortic:"PF2E.TraitMortic",mummy:"PF2E.TraitMummy",munavri:"PF2E.TraitMunavri",mutant:"PF2E.TraitMutant",nagaji:"PF2E.TraitNagaji",necromancy:"PF2E.TraitNecromancy",nymph:"PF2E.TraitNymph",oni:"PF2E.TraitOni",ooze:"PF2E.TraitOoze",orc:"PF2E.TraitOrc",oread:"PF2E.TraitOread",paaridar:"PF2E.TraitPaaridar",petitioner:"PF2E.TraitPetitioner",phantom:"PF2E.TraitPhantom",poison:"PF2E.TraitPoison",protean:"PF2E.TraitProtean",psychopomp:"PF2E.TraitPsychopomp",qlippoth:"PF2E.TraitQlippoth",rakshasa:"PF2E.TraitRakshasa",reflection:"PF2E.TraitReflection",sahkil:"PF2E.TraitSahkil",samsaran:"PF2E.TraitSamsaran","sea-devil":"PF2E.TraitSeaDevil",serpentfolk:"PF2E.TraitSerpentfolk",seugathi:"PF2E.TraitSeugathi",shabti:"PF2E.TraitShabti",shadow:"PF2E.TraitShadow",shobhad:"PF2E.TraitShobhad",siktempora:"PF2E.TraitSiktempora",skeleton:"PF2E.TraitSkeleton",skelm:"PF2E.TraitSkelm",skulk:"PF2E.TraitSkulk",soulbound:"PF2E.TraitSoulbound",spirit:"PF2E.TraitSpirit",sporeborn:"PF2E.TraitSporeborn",spriggan:"PF2E.TraitSpriggan",stheno:"PF2E.TraitStheno",summoned:"PF2E.TraitSummoned",swarm:"PF2E.TraitSwarm",sylph:"PF2E.TraitSylph",tane:"PF2E.TraitTane",tanggal:"PF2E.TraitTanggal",tengu:"PF2E.TraitTengu",time:"PF2E.TraitTime",titan:"PF2E.TraitTitan",troll:"PF2E.TraitTroll",troop:"PF2E.TraitTroop",undead:"PF2E.TraitUndead",undine:"PF2E.TraitUndine",urdefhan:"PF2E.TraitUrdefhan",vampire:"PF2E.TraitVampire",vanara:"PF2E.TraitVanara",velstrac:"PF2E.TraitVelstrac",vishkanya:"PF2E.TraitVishkanya",wayang:"PF2E.TraitWayang",werecreature:"PF2E.TraitWerecreature",wight:"PF2E.TraitWight","wild-hunt":"PF2E.TraitWildHunt",wraith:"PF2E.TraitWraith",wyrwood:"PF2E.TraitWyrwood",xulgath:"PF2E.TraitXulgath",zombie:"PF2E.TraitZombie"},backgroundTraits={"pervasive-magic":"PF2E.TraitPervasiveMagic"},classTraits={alchemist:"PF2E.TraitAlchemist",barbarian:"PF2E.TraitBarbarian",bard:"PF2E.TraitBard",champion:"PF2E.TraitChampion",cleric:"PF2E.TraitCleric",druid:"PF2E.TraitDruid",fighter:"PF2E.TraitFighter",gunslinger:"PF2E.TraitGunslinger",inventor:"PF2E.TraitInventor",investigator:"PF2E.TraitInvestigator",kineticist:"PF2E.TraitKineticist",magus:"PF2E.TraitMagus",monk:"PF2E.TraitMonk",oracle:"PF2E.TraitOracle",psychic:"PF2E.TraitPsychic",ranger:"PF2E.TraitRanger",rogue:"PF2E.TraitRogue",sorcerer:"PF2E.TraitSorcerer",summoner:"PF2E.TraitSummoner",swashbuckler:"PF2E.TraitSwashbuckler",thaumaturge:"PF2E.TraitThaumaturge",witch:"PF2E.TraitWitch",wizard:"PF2E.TraitWizard"},alignmentTraits={chaotic:"PF2E.TraitChaotic",evil:"PF2E.TraitEvil",good:"PF2E.TraitGood",lawful:"PF2E.TraitLawful"},damageTraits={...alignmentTraits,...elementTraits,...energyDamageTypes,light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",mental:"PF2E.TraitMental",nonlethal:"PF2E.TraitNonlethal",plant:"PF2E.TraitPlant",radiation:"PF2E.TraitRadiation",vitality:"PF2E.TraitVitality",void:"PF2E.TraitVoid"},magicSchools={abjuration:"PF2E.TraitAbjuration",conjuration:"PF2E.TraitConjuration",divination:"PF2E.TraitDivination",enchantment:"PF2E.TraitEnchantment",evocation:"PF2E.TraitEvocation",illusion:"PF2E.TraitIllusion",necromancy:"PF2E.TraitNecromancy",transmutation:"PF2E.TraitTransmutation"},spellTraits={...alignmentTraits,...classTraits,...damageTraits,...elementTraits,...magicSchools,...magicTraditions,amp:"PF2E.TraitAmp",attack:"PF2E.TraitAttack",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",beast:"PF2E.TraitBeast",cantrip:"PF2E.TraitCantrip",composition:"PF2E.TraitComposition",concentrate:"PF2E.TraitConcentrate",consecration:"PF2E.TraitConsecration",contingency:"PF2E.TraitContingency",curse:"PF2E.TraitCurse",cursebound:"PF2E.TraitCursebound",darkness:"PF2E.TraitDarkness",death:"PF2E.TraitDeath",detection:"PF2E.TraitDetection",disease:"PF2E.TraitDisease",dream:"PF2E.TraitDream",eidolon:"PF2E.TraitEidolon",emotion:"PF2E.TraitEmotion",extradimensional:"PF2E.TraitExtradimensional",fear:"PF2E.TraitFear",fortune:"PF2E.TraitFortune",fungus:"PF2E.TraitFungus",healing:"PF2E.TraitHealing",hex:"PF2E.TraitHex",incapacitation:"PF2E.TraitIncapacitation",incarnate:"PF2E.TraitIncarnate",incorporeal:"PF2E.TraitIncorporeal",inhaled:"PF2E.TraitInhaled",light:"PF2E.TraitLight",linguistic:"PF2E.TraitLinguistic",litany:"PF2E.TraitLitany",metamagic:"PF2E.TraitMetamagic",mindless:"PF2E.TraitMindless",misfortune:"PF2E.TraitMisfortune",morph:"PF2E.TraitMorph",move:"PF2E.TraitMove",nonlethal:"PF2E.TraitNonlethal",olfactory:"PF2E.TraitOlfactory",plant:"PF2E.TraitPlant",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",possession:"PF2E.TraitPossession",prediction:"PF2E.TraitPrediction",psyche:"PF2E.TraitPsyche",revelation:"PF2E.TraitRevelation",scrying:"PF2E.TraitScrying",shadow:"PF2E.TraitShadow",sleep:"PF2E.TraitSleep",stance:"PF2E.TraitStance",summoned:"PF2E.TraitSummoned",teleportation:"PF2E.TraitTeleportation","true-name":"PF2E.TraitTrueName",visual:"PF2E.TraitVisual"},weaponTraits={...alignmentTraits,...ancestryTraits,...elementTraits,...energyDamageTypes,...magicSchools,...magicTraditions,adjusted:"PF2E.TraitAdjusted",alchemical:"PF2E.TraitAlchemical",agile:"PF2E.TraitAgile",apex:"PF2E.TraitApex",artifact:"PF2E.TraitArtifact",attached:"PF2E.TraitAttached","attached-to-shield":"PF2E.TraitAttachedToShield","attached-to-crossbow-or-firearm":"PF2E.TraitAttachedToCrossbowOrFirearm",auditory:"PF2E.TraitAuditory",backstabber:"PF2E.TraitBackstabber",backswing:"PF2E.TraitBackswing",bomb:"PF2E.TraitBomb",brace:"PF2E.TraitBrace",brutal:"PF2E.TraitBrutal","capacity-2":"PF2E.TraitCapacity2","capacity-3":"PF2E.TraitCapacity3","capacity-4":"PF2E.TraitCapacity4","capacity-5":"PF2E.TraitCapacity5",climbing:"PF2E.TraitClimbing",clockwork:"PF2E.TraitClockwork",cobbled:"PF2E.TraitCobbled",combination:"PF2E.TraitCombination",concealable:"PF2E.TraitConcealable",concussive:"PF2E.TraitConcussive",consumable:"PF2E.TraitConsumable","critical-fusion":"PF2E.TraitCriticalFusion",cursed:"PF2E.TraitCursed","deadly-d4":"PF2E.TraitDeadlyD4","deadly-d6":"PF2E.TraitDeadlyD6","deadly-d8":"PF2E.TraitDeadlyD8","deadly-d10":"PF2E.TraitDeadlyD10","deadly-d12":"PF2E.TraitDeadlyD12",death:"PF2E.TraitDeath",disarm:"PF2E.TraitDisarm",disease:"PF2E.TraitDisease","double-barrel":"PF2E.TraitDoubleBarrel",emotion:"PF2E.TraitEmotion",extradimensional:"PF2E.TraitExtradimensional","fatal-aim-d10":"PF2E.TraitFatalAimD10","fatal-aim-d12":"PF2E.TraitFatalAimD12","fatal-d8":"PF2E.TraitFatalD8","fatal-d10":"PF2E.TraitFatalD10","fatal-d12":"PF2E.TraitFatalD12",fear:"PF2E.TraitFear",finesse:"PF2E.TraitFinesse",forceful:"PF2E.TraitForceful",fortune:"PF2E.TraitFortune","free-hand":"PF2E.TraitFreeHand",fungus:"PF2E.TraitFungus",grapple:"PF2E.TraitGrapple",hampering:"PF2E.TraitHampering",healing:"PF2E.TraitHealing",infused:"PF2E.TraitInfused",inhaled:"PF2E.TraitInhaled",injection:"PF2E.TraitInjection",intelligent:"PF2E.TraitIntelligent",invested:"PF2E.TraitInvested","jousting-d6":"PF2E.TraitJoustingD6",kickback:"PF2E.TraitKickback",light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",mental:"PF2E.TraitMental",modular:"PF2E.TraitModular",monk:"PF2E.TraitMonk",nonlethal:"PF2E.TraitNonlethal",olfactory:"PF2E.TraitOlfactory",parry:"PF2E.TraitParry",plant:"PF2E.TraitPlant",poison:"PF2E.TraitPoison",propulsive:"PF2E.TraitPropulsive","ranged-trip":"PF2E.TraitRangedTrip",razing:"PF2E.TraitRazing",reach:"PF2E.TraitReach",recovery:"PF2E.TraitRecovery",relic:"PF2E.TraitRelic",repeating:"PF2E.TraitRepeating",resonant:"PF2E.TraitResonant",saggorak:"PF2E.TraitSaggorak","scatter-5":"PF2E.TraitScatter5","scatter-10":"PF2E.TraitScatter10","scatter-15":"PF2E.TraitScatter15","scatter-20":"PF2E.TraitScatter20",scrying:"PF2E.TraitScrying",shadow:"PF2E.TraitShadow",shove:"PF2E.TraitShove",splash:"PF2E.TraitSplash",staff:"PF2E.TraitStaff",sweep:"PF2E.TraitSweep",tech:"PF2E.TraitTech",teleportation:"PF2E.TraitTeleportation",tethered:"PF2E.TraitTethered",thrown:"PF2E.TraitThrown","thrown-10":"PF2E.TraitThrown10","thrown-15":"PF2E.TraitThrown15","thrown-20":"PF2E.TraitThrown20","thrown-30":"PF2E.TraitThrown30","thrown-40":"PF2E.TraitThrown40","thrown-60":"PF2E.TraitThrown60","thrown-80":"PF2E.TraitThrown80","thrown-100":"PF2E.TraitThrown100","thrown-200":"PF2E.TraitThrown200",training:"PF2E.TraitTraining",trip:"PF2E.TraitTrip",twin:"PF2E.TraitTwin","two-hand-d6":"PF2E.TraitTwoHandD6","two-hand-d8":"PF2E.TraitTwoHandD8","two-hand-d10":"PF2E.TraitTwoHandD10","two-hand-d12":"PF2E.TraitTwoHandD12",unarmed:"PF2E.TraitUnarmed",vehicular:"PF2E.TraitVehicular","versatile-acid":"PF2E.TraitVersatileAcid","versatile-b":"PF2E.TraitVersatileB","versatile-chaotic":"PF2E.TraitVersatileChaotic","versatile-cold":"PF2E.TraitVersatileCold","versatile-electricity":"PF2E.TraitVersatileElectricity","versatile-evil":"PF2E.TraitVersatileEvil","versatile-fire":"PF2E.TraitVersatileFire","versatile-force":"PF2E.TraitVersatileForce","versatile-good":"PF2E.TraitVersatileGood","versatile-lawful":"PF2E.TraitVersatileLawful","versatile-p":"PF2E.TraitVersatileP","versatile-poison":"PF2E.TraitVersatilePoison","versatile-s":"PF2E.TraitVersatileS","versatile-sonic":"PF2E.TraitVersatileSonic","versatile-vitality":"PF2E.TraitVersatileVitality","versatile-void":"PF2E.TraitVersatileVoid","volley-20":"PF2E.TraitVolley20","volley-30":"PF2E.TraitVolley30","volley-50":"PF2E.TraitVolley50"},preciousMaterials={abysium:"PF2E.PreciousMaterialAbysium",adamantine:"PF2E.PreciousMaterialAdamantine","cold-iron":"PF2E.PreciousMaterialColdIron",darkwood:"PF2E.PreciousMaterialDarkwood",djezet:"PF2E.PreciousMaterialDjezet",dragonhide:"PF2E.PreciousMaterialDragonhide","grisantian-pelt":"PF2E.PreciousMaterialGrisantianPelt",inubrix:"PF2E.PreciousMaterialInubrix","keep-stone":"PF2E.PreciousMaterialKeepStone",mithral:"PF2E.PreciousMaterialMithral",noqual:"PF2E.PreciousMaterialNoqual",orichalcum:"PF2E.PreciousMaterialOrichalcum",peachwood:"PF2E.PreciousMaterialPeachwood",siccatite:"PF2E.PreciousMaterialSiccatite",silver:"PF2E.PreciousMaterialSilver",sisterstone:"PF2E.PreciousMaterialSisterstone","sisterstone-dusk":"PF2E.PreciousMaterialSisterstoneDusk","sisterstone-scarlet":"PF2E.PreciousMaterialSisterstoneScarlet","sovereign-steel":"PF2E.PreciousMaterialSovereignSteel",warpglass:"PF2E.PreciousMaterialWarpglass"},otherArmorTags={shoddy:"PF2E.Item.Physical.OtherTag.Shoddy"},otherConsumableTags={herbal:"PF2E.Item.Physical.OtherTag.Herbal"},otherWeaponTags={crossbow:"PF2E.Weapon.Base.crossbow",improvised:"PF2E.Item.Physical.OtherTag.Improvised",shoddy:"PF2E.Item.Physical.OtherTag.Shoddy"},rangeTraits=mapToObj(RANGE_TRAITS,trait=>[trait,`PF2E.Trait${sluggify(trait,{camel:"bactrian"})}`]),npcAttackTraits={...weaponTraits,...preciousMaterials,...rangeTraits,curse:"PF2E.TraitCurse","deadly-2d8":"PF2E.TraitDeadly2D8","deadly-3d8":"PF2E.TraitDeadly3D8","deadly-4d8":"PF2E.TraitDeadly4D8","deadly-2d10":"PF2E.TraitDeadly2D10","deadly-3d10":"PF2E.TraitDeadly3D10","deadly-4d10":"PF2E.TraitDeadly4D10","deadly-2d12":"PF2E.TraitDeadly2D12","deadly-3d12":"PF2E.TraitDeadly3D12","deadly-4d12":"PF2E.TraitDeadly4D12",incorporeal:"PF2E.TraitIncorporeal",radiation:"PF2E.TraitRadiation","reach-0":"PF2E.TraitReach0","reach-10":"PF2E.TraitReach10","reach-15":"PF2E.TraitReach15","reach-20":"PF2E.TraitReach20","reach-25":"PF2E.TraitReach25","reach-30":"PF2E.TraitReach30","reach-40":"PF2E.TraitReach40","reach-50":"PF2E.TraitReach50","reach-60":"PF2E.TraitReach60","reach-100":"PF2E.TraitReach100","reach-120":"PF2E.TraitReach120","reach-200":"PF2E.TraitReach200","reach-1000":"PF2E.TraitReach1000","reload-0":"PF2E.TraitReload0","reload-1":"PF2E.TraitReload1","reload-2":"PF2E.TraitReload2","reload-1-min":"PF2E.TraitReload1Min"},featTraits={...ancestryTraits,...classTraits,...damageTraits,...magicSchools,...magicTraditions,...spellTraits,additive1:"PF2E.TraitAdditive1",additive2:"PF2E.TraitAdditive2",additive3:"PF2E.TraitAdditive3",aftermath:"PF2E.TraitAftermath",alchemical:"PF2E.TraitAlchemical",archetype:"PF2E.TraitArchetype",artifact:"PF2E.TraitArtifact",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",circus:"PF2E.TraitCircus",class:"PF2E.Class",composite:"PF2E.TraitComposite",concentrate:"PF2E.TraitConcentrate",dedication:"PF2E.TraitDedication",detection:"PF2E.TraitDetection",deviant:"PF2E.TraitDeviant",downtime:"PF2E.TraitDowntime",emotion:"PF2E.TraitEmotion",evolution:"PF2E.TraitEvolution",esoterica:"PF2E.TraitEsoterica",exploration:"PF2E.TraitExploration",fear:"PF2E.TraitFear",finisher:"PF2E.TraitFinisher",flourish:"PF2E.TraitFlourish",fortune:"PF2E.TraitFortune",general:"PF2E.TraitGeneral",impulse:"PF2E.TraitImpulse",infusion:"PF2E.TraitInfusion",injury:"PF2E.TraitInjury",lineage:"PF2E.TraitLineage",manipulate:"PF2E.TraitManipulate",metamagic:"PF2E.TraitMetamagic",mindshift:"PF2E.TraitMindshift",modification:"PF2E.TraitModification",move:"PF2E.TraitMove",multiclass:"PF2E.TraitMulticlass",oath:"PF2E.TraitOath",olfactory:"PF2E.TraitOlfactory",open:"PF2E.TraitOpen",overflow:"PF2E.TraitOverflow","pervasive-magic":"PF2E.TraitPervasiveMagic",poison:"PF2E.TraitPoison",press:"PF2E.TraitPress",rage:"PF2E.TraitRage",reckless:"PF2E.TraitReckless",reflection:"PF2E.TraitReflection",secret:"PF2E.TraitSecret",skill:"PF2E.TraitSkill",social:"PF2E.TraitSocial",spellshot:"PF2E.TraitSpellshot",stamina:"PF2E.TraitStamina",stance:"PF2E.TraitStance",tandem:"PF2E.TraitTandem",time:"PF2E.TraitTime","true-name":"PF2E.TraitTrueName",unstable:"PF2E.TraitUnstable",vigilante:"PF2E.TraitVigilante",virulent:"PF2E.TraitVirulent",vitality:"PF2E.TraitVitality",void:"PF2E.TraitVoid"},consumableTraits={...damageTraits,...elementTraits,...magicSchools,...magicTraditions,additive1:"PF2E.TraitAdditive1",additive2:"PF2E.TraitAdditive2",additive3:"PF2E.TraitAdditive3",alchemical:"PF2E.TraitAlchemical",attack:"PF2E.TraitAttack",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura","bottled-breath":"PF2E.TraitBottledBreath",catalyst:"PF2E.TraitCatalyst",clockwork:"PF2E.TraitClockwork",consumable:"PF2E.TraitConsumable",contact:"PF2E.TraitContact",curse:"PF2E.TraitCurse",cursed:"PF2E.TraitCursed",drug:"PF2E.TraitDrug",elixir:"PF2E.TraitElixir",emotion:"PF2E.TraitEmotion",expandable:"PF2E.TraitExpandable",fear:"PF2E.TraitFear",fey:"PF2E.TraitFey",fortune:"PF2E.TraitFortune",fulu:"PF2E.TraitFulu",gadget:"PF2E.TraitGadget",healing:"PF2E.TraitHealing",incapacitation:"PF2E.TraitIncapacitation",infused:"PF2E.TraitInfused",ingested:"PF2E.TraitIngested",inhaled:"PF2E.TraitInhaled",injury:"PF2E.TraitInjury",kobold:"PF2E.TraitKobold",light:"PF2E.TraitLight",linguistic:"PF2E.TraitLinguistic",lozenge:"PF2E.TraitLozenge",magical:"PF2E.TraitMagical",mechanical:"PF2E.TraitMechanical",misfortune:"PF2E.TraitMisfortune",missive:"PF2E.TraitMissive",morph:"PF2E.TraitMorph",mutagen:"PF2E.TraitMutagen",oil:"PF2E.TraitOil",olfactory:"PF2E.TraitOlfactory",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",possession:"PF2E.TraitPossession",potion:"PF2E.TraitPotion",precious:"PF2E.TraitPrecious",processed:"PF2E.TraitProcessed",scroll:"PF2E.TraitScroll",scrying:"PF2E.TraitScrying",sleep:"PF2E.TraitSleep",snare:"PF2E.TraitSnare",spellgun:"PF2E.TraitSpellgun",splash:"PF2E.TraitSplash",structure:"PF2E.TraitStructure",talisman:"PF2E.TraitTalisman",teleportation:"PF2E.TraitTeleportation",trap:"PF2E.TraitTrap",virulent:"PF2E.TraitVirulent",visual:"PF2E.TraitVisual",wand:"PF2E.TraitWand"},actionTraits={...featTraits,...consumableTraits,...spellTraits,...pick$1(weaponTraits,["agile","propulsive","backswing","forceful","reach","sweep","thrown","volley-20","volley-30","volley-50"]),summon:"PF2E.TraitSummon"},hazardTraits={...damageTraits,...magicSchools,...magicTraditions,aberration:"PF2E.TraitAberration",alchemical:"PF2E.TraitAlchemical",animal:"PF2E.TraitAnimal",aquatic:"PF2E.TraitAquatic",auditory:"PF2E.TraitAuditory",beast:"PF2E.TraitBeast",clockwork:"PF2E.TraitClockwork",consumable:"PF2E.TraitConsumable",curse:"PF2E.TraitCurse",environmental:"PF2E.TraitEnvironmental",fungus:"PF2E.TraitFungus",haunt:"PF2E.TraitHaunt",inhaled:"PF2E.TraitInhaled",kaiju:"PF2E.TraitKaiju",magical:"PF2E.TraitMagical",mechanical:"PF2E.TraitMechanical",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",shadow:"PF2E.TraitShadow",steam:"PF2E.TraitSteam",summoned:"PF2E.TraitSummoned",technological:"PF2E.TraitTechnological",teleportation:"PF2E.TraitTeleportation",trap:"PF2E.TraitTrap",virulent:"PF2E.TraitVirulent",visual:"PF2E.TraitVisual"},vehicleTraits={...magicSchools,artifact:"PF2E.TraitArtifact",clockwork:"PF2E.TraitClockwork",magical:"PF2E.TraitMagical",teleportation:"PF2E.TraitTeleportation"},equipmentTraits={...alignmentTraits,...ancestryTraits,...elementTraits,...energyDamageTypes,...magicSchools,...magicTraditions,additive0:"PF2E.TraitAdditive0",additive1:"PF2E.TraitAdditive1",adjusted:"PF2E.TraitAdjusted",adjustment:"PF2E.TraitAdjustment",alchemical:"PF2E.TraitAlchemical",apex:"PF2E.TraitApex",artifact:"PF2E.TraitArtifact",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",barding:"PF2E.TraitBarding",censer:"PF2E.TraitCenser",clockwork:"PF2E.TraitClockwork",coda:"PF2E.TraitCoda",companion:"PF2E.TraitCompanion",contract:"PF2E.TraitContract",consecration:"PF2E.TraitConsecration",cursed:"PF2E.TraitCursed",darkness:"PF2E.TraitDarkness",death:"PF2E.TraitDeath",detection:"PF2E.TraitDetection",eidolon:"PF2E.TraitEidolon",emotion:"PF2E.TraitEmotion",expandable:"PF2E.TraitExpandable",extradimensional:"PF2E.TraitExtradimensional",fear:"PF2E.TraitFear",figurehead:"PF2E.TraitFigurehead",focused:"PF2E.TraitFocused",fortune:"PF2E.TraitFortune",fulu:"PF2E.TraitFulu",gadget:"PF2E.TraitGadget",grimoire:"PF2E.TraitGrimoire","harrow-court":"PF2E.TraitHarrowCourt",healing:"PF2E.TraitHealing",incapacitation:"PF2E.TraitIncapacitation",incorporeal:"PF2E.TraitIncorporeal",infused:"PF2E.TraitInfused",intelligent:"PF2E.TraitIntelligent",invested:"PF2E.TraitInvested",light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",mechanical:"PF2E.TraitMechanical",mental:"PF2E.TraitMental",misfortune:"PF2E.TraitMisfortune",morph:"PF2E.TraitMorph",mounted:"PF2E.TraitMounted",nonlethal:"PF2E.TraitNonlethal",plant:"PF2E.TraitPlant",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",portable:"PF2E.TraitPortable",precious:"PF2E.TraitPrecious",prediction:"PF2E.TraitPrediction",relic:"PF2E.TraitRelic",revelation:"PF2E.TraitRevelation",saggorak:"PF2E.TraitSaggorak",scrying:"PF2E.TraitScrying",shadow:"PF2E.TraitShadow",sleep:"PF2E.TraitSleep",spellgun:"PF2E.TraitSpellgun",spellheart:"PF2E.TraitSpellheart",staff:"PF2E.TraitStaff",steam:"PF2E.TraitSteam",structure:"PF2E.TraitStructure",tattoo:"PF2E.TraitTattoo",teleportation:"PF2E.TraitTeleportation",visual:"PF2E.TraitVisual",wand:"PF2E.TraitWand"},shieldTraits={"deflecting-bludgeoning":"PF2E.TraitDeflectingBludgeoning","deflecting-physical-ranged":"PF2E.TraitDeflectingPhysicalRanged","deflecting-piercing":"PF2E.TraitDeflectingPiercing","deflecting-slashing":"PF2E.TraitDeflectingSlashing",foldaway:"PF2E.TraitFoldaway",harnessed:"PF2E.TraitHarnessed","hefty-14":"PF2E.TraitHefty14",inscribed:"PF2E.TraitInscribed","integrated-1d6-b":"PF2E.TraitIntegrated1d6B","integrated-1d6-p":"PF2E.TraitIntegrated1d6P","integrated-1d6-s":"PF2E.TraitIntegrated1d6S","integrated-1d6-s-versatile-p":"PF2E.TraitIntegrated1d6SVersatileP","launching-dart":"PF2E.TraitLaunching","shield-throw-20":"PF2E.TraitShieldThrow20","shield-throw-30":"PF2E.TraitShieldThrow30"},armorTraits={...alignmentTraits,...elementTraits,...magicSchools,...magicTraditions,...shieldTraits,adjusted:"PF2E.TraitAdjusted",alchemical:"PF2E.TraitAlchemical",apex:"PF2E.TraitApex",aquadynamic:"PF2E.TraitAquadynamic",artifact:"PF2E.TraitArtifact",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",barding:"PF2E.TraitBarding",bulwark:"PF2E.TraitBulwark",clockwork:"PF2E.TraitClockwork",comfort:"PF2E.TraitComfort",companion:"PF2E.TraitCompanion",cursed:"PF2E.TraitCursed","entrench-melee":"PF2E.TraitEntrenchMelee","entrench-ranged":"PF2E.TraitEntrenchRanged",extradimensional:"PF2E.TraitExtradimensional",focused:"PF2E.TraitFocused",force:"PF2E.TraitForce",flexible:"PF2E.TraitFlexible",healing:"PF2E.TraitHealing",hindering:"PF2E.TraitHindering",inscribed:"PF2E.TraitInscribed",intelligent:"PF2E.TraitIntelligent",invested:"PF2E.TraitInvested",laminar:"PF2E.TraitLaminar",light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",noisy:"PF2E.TraitNoisy",plant:"PF2E.TraitPlant",ponderous:"PF2E.TraitPonderous"},rangeDescriptions=mapToObj(RANGE_TRAITS,trait=>[trait,"PF2E.TraitDescriptionRange"]),preciousMaterialDescriptions={abysium:"PF2E.PreciousMaterialAbysiumDescription",adamantine:"PF2E.PreciousMaterialAdamantineDescription","cold-iron":"PF2E.PreciousMaterialColdIronDescription",darkwood:"PF2E.PreciousMaterialDarkwoodDescription",djezet:"PF2E.PreciousMaterialDjezetDescription",dragonhide:"PF2E.PreciousMaterialDragonhideDescription","grisantian-pelt":"PF2E.PreciousMaterialGrisantianPeltDescription",inubrix:"PF2E.PreciousMaterialInubrixDescription",mithral:"PF2E.PreciousMaterialMithralDescription",noqual:"PF2E.PreciousMaterialNoqualDescription",orichalcum:"PF2E.PreciousMaterialOrichalcumDescription",siccatite:"PF2E.PreciousMaterialSiccatiteDescription",silver:"PF2E.PreciousMaterialSilverDescription",sisterstone:"PF2E.PreciousMaterialSisterstoneDescription","sisterstone-dusk":"PF2E.PreciousMaterialSisterstoneDescription","sisterstone-scarlet":"PF2E.PreciousMaterialSisterstoneDescription","sovereign-steel":"PF2E.PreciousMaterialSovereignSteelDescription",warpglass:"PF2E.PreciousMaterialWarpglassDescription"},traitDescriptions={aasimar:"PF2E.TraitDescriptionAasimar",aberration:"PF2E.TraitDescriptionAberration",abjuration:"PF2E.TraitDescriptionAbjuration",acid:"PF2E.TraitDescriptionAcid",additive0:"PF2E.TraitDescriptionAdditive",additive1:"PF2E.TraitDescriptionAdditive",additive2:"PF2E.TraitDescriptionAdditive",additive3:"PF2E.TraitDescriptionAdditive",adjusted:"PF2E.TraitDescriptionAdjusted",adjustment:"PF2E.TraitDescriptionAdjustment",aeon:"PF2E.TraitDescriptionAeon",aesir:"PF2E.TraitDescriptionAesir",aftermath:"PF2E.TraitDescriptionAftermath",agathion:"PF2E.TraitDescriptionAgathion",agile:"PF2E.TraitDescriptionAgile",air:"PF2E.TraitDescriptionAir",alchemical:"PF2E.TraitDescriptionAlchemical",alchemist:"PF2E.TraitDescriptionAlchemist",amphibious:"PF2E.TraitDescriptionAmphibious",anadi:"PF2E.TraitDescriptionAnadi",android:"PF2E.TraitDescriptionAndroid",apex:"PF2E.TraitDescriptionApex",aphorite:"PF2E.TraitDescriptionAphorite",aquadynamic:"PF2E.TraitDescriptionAquadynamic",arcane:"PF2E.TraitDescriptionArcane",archetype:"PF2E.TraitDescriptionArchetype",ardande:"PF2E.TraitDescriptionArdande",artifact:"PF2E.TraitDescriptionArtifact",attached:"PF2E.TraitDescriptionAttached","attached-to-crossbow-or-firearm":"PF2E.TraitDescriptionAttached","attached-to-shield":"PF2E.TraitDescriptionAttached",attack:"PF2E.TraitDescriptionAttack",auditory:"PF2E.TraitDescriptionAuditory",aura:"PF2E.TraitDescriptionAura",automaton:"PF2E.TraitDescriptionAutomaton",azarketi:"PF2E.TraitDescriptionAzarketi",backstabber:"PF2E.TraitDescriptionBackstabber",backswing:"PF2E.TraitDescriptionBackswing",barbarian:"PF2E.TraitDescriptionBarbarian",bard:"PF2E.TraitDescriptionBard",beastkin:"PF2E.TraitDescriptionBeastkin",bomb:"PF2E.TraitDescriptionBomb","bottled-breath":"PF2E.TraitDescriptionBottledBreath",brace:"PF2E.TraitDescriptionBrace",brutal:"PF2E.TraitDescriptionBrutal",bulwark:"PF2E.TraitDescriptionBulwark",cantrip:"PF2E.TraitDescriptionCantrip","capacity-2":"PF2E.TraitDescriptionCapacity","capacity-3":"PF2E.TraitDescriptionCapacity","capacity-4":"PF2E.TraitDescriptionCapacity","capacity-5":"PF2E.TraitDescriptionCapacity",catalyst:"PF2E.TraitDescriptionCatalyst",catfolk:"PF2E.TraitDescriptionCatfolk",censer:"PF2E.TraitDescriptionCenser",champion:"PF2E.TraitDescriptionChampion",changeling:"PF2E.TraitDescriptionChangeling",chaotic:"PF2E.TraitDescriptionChaotic",class:"PF2E.TraitDescriptionClass",cleric:"PF2E.TraitDescriptionCleric",climbing:"PF2E.TraitDescriptionClimbing",clockwork:"PF2E.TraitDescriptionClockwork",cobbled:"PF2E.TraitDescriptionCobbled",coda:"PF2E.TraitDescriptionCoda",cold:"PF2E.TraitDescriptionCold",combination:"PF2E.TraitDescriptionCombination",comfort:"PF2E.TraitDescriptionComfort",common:"PF2E.TraitDescriptionCommon",companion:"PF2E.TraitDescriptionCompanion",complex:"PF2E.TraitDescriptionComplex",composite:"PF2E.TraitDescriptionComposite",composition:"PF2E.TraitDescriptionComposition",concealable:"PF2E.TraitDescriptionConcealable",concentrate:"PF2E.TraitDescriptionConcentrate",concussive:"PF2E.TraitDescriptionConcussive",conjuration:"PF2E.TraitDescriptionConjuration",conrasu:"PF2E.TraitDescriptionConrasu",consecration:"PF2E.TraitDescriptionConsecration",consumable:"PF2E.TraitDescriptionConsumable",contact:"PF2E.TraitDescriptionContact",contingency:"PF2E.TraitDescriptionContingency",contract:"PF2E.TraitDescriptionContract","critical-fusion":"PF2E.TraitDescriptionCriticalFusion",curse:"PF2E.TraitDescriptionCurse",cursebound:"PF2E.TraitDescriptionCursebound",cursed:"PF2E.TraitDescriptionCursed",darkness:"PF2E.TraitDescriptionDarkness",darvakka:"PF2E.TraitDescriptionDarvakka","deadly-2d10":"PF2E.TraitDescriptionDeadly","deadly-2d12":"PF2E.TraitDescriptionDeadly","deadly-2d8":"PF2E.TraitDescriptionDeadly","deadly-3d10":"PF2E.TraitDescriptionDeadly","deadly-3d12":"PF2E.TraitDescriptionDeadly","deadly-3d8":"PF2E.TraitDescriptionDeadly","deadly-4d10":"PF2E.TraitDescriptionDeadly","deadly-4d12":"PF2E.TraitDescriptionDeadly","deadly-4d8":"PF2E.TraitDescriptionDeadly","deadly-d10":"PF2E.TraitDescriptionDeadly","deadly-d12":"PF2E.TraitDescriptionDeadly","deadly-d6":"PF2E.TraitDescriptionDeadly","deadly-d8":"PF2E.TraitDescriptionDeadly","deadly-d4":"PF2E.TraitDescriptionDeadly",death:"PF2E.TraitDescriptionDeath","deflecting-bludgeoning":"PF2E.TraitDescriptionDeflecting","deflecting-physical-ranged":"PF2E.TraitDescriptionDeflecting","deflecting-slashing":"PF2E.TraitDescriptionDeflecting",dedication:"PF2E.TraitDescriptionDedication",detection:"PF2E.TraitDescriptionDetection",deviant:"PF2E.TraitDescriptionDeviant",dhampir:"PF2E.TraitDescriptionDhampir",disarm:"PF2E.TraitDescriptionDisarm",disease:"PF2E.TraitDescriptionDisease",divination:"PF2E.TraitDescriptionDivination",divine:"PF2E.TraitDescriptionDivine","double-barrel":"PF2E.TraitDescriptionDoubleBarrel",downtime:"PF2E.TraitDescriptionDowntime",drug:"PF2E.TraitDescriptionDrug",druid:"PF2E.TraitDescriptionDruid",duskwalker:"PF2E.TraitDescriptionDuskwalker",dwarf:"PF2E.TraitDescriptionDwarf",earth:"PF2E.TraitDescriptionEarth",eidolon:"PF2E.TraitDescriptionEidolon",electricity:"PF2E.TraitDescriptionElectricity",elf:"PF2E.TraitDescriptionElf",elixir:"PF2E.TraitDescriptionElixir",emotion:"PF2E.TraitDescriptionEmotion",enchantment:"PF2E.TraitDescriptionEnchantment","entrench-melee":"PF2E.TraitDescriptionEntrench","entrench-ranged":"PF2E.TraitDescriptionEntrench",environment:"PF2E.TraitDescriptionEnvironment",esoterica:"PF2E.TraitDescriptionEsoterica",evil:"PF2E.TraitDescriptionEvil",evocation:"PF2E.TraitDescriptionEvocation",evolution:"PF2E.TraitDescriptionEvolution",expandable:"PF2E.TraitDescriptionExpandable",exploration:"PF2E.TraitDescriptionExploration",extradimensional:"PF2E.TraitDescriptionExtradimensional","fatal-aim-d10":"PF2E.TraitDescriptionFatalAim","fatal-aim-d12":"PF2E.TraitDescriptionFatalAim","fatal-d10":"PF2E.TraitDescriptionFatal","fatal-d12":"PF2E.TraitDescriptionFatal","fatal-d8":"PF2E.TraitDescriptionFatal",fear:"PF2E.TraitDescriptionFear",fetchling:"PF2E.TraitDescriptionFetchling",fey:"PF2E.TraitDescriptionFey",fighter:"PF2E.TraitDescriptionFighter",figurehead:"PF2E.TraitDescriptionFigurehead",finesse:"PF2E.TraitDescriptionFinesse",finisher:"PF2E.TraitDescriptionFinisher",fire:"PF2E.TraitDescriptionFire",fleshwarp:"PF2E.TraitDescriptionFleshwarp",flexible:"PF2E.TraitDescriptionFlexible",flourish:"PF2E.TraitDescriptionFlourish",focused:"PF2E.TraitDescriptionFocused",foldaway:"PF2E.TraitDescriptionFoldaway",force:"PF2E.TraitDescriptionForce",forceful:"PF2E.TraitDescriptionForceful",fortune:"PF2E.TraitDescriptionFortune","free-hand":"PF2E.TraitDescriptionFreeHand",fulu:"PF2E.TraitDescriptionFulu",fungus:"PF2E.TraitDescriptionFungus",gadget:"PF2E.TraitDescriptionGadget",ganzi:"PF2E.TraitDescriptionGanzi",general:"PF2E.TraitDescriptionGeneral",genie:"PF2E.TraitDescriptionGenie",geniekin:"PF2E.TraitDescriptionGeniekin",ghoran:"PF2E.TraitDescriptionGhoran",ghul:"PF2E.TraitDescriptionGhul",gnoll:"PF2E.TraitDescriptionGnoll",gnome:"PF2E.TraitDescriptionGnome",goblin:"PF2E.TraitDescriptionGoblin",goloma:"PF2E.TraitDescriptionGoloma",good:"PF2E.TraitDescriptionGood",grapple:"PF2E.TraitDescriptionGrapple",grimoire:"PF2E.TraitDescriptionGrimoire",grippli:"PF2E.TraitDescriptionGrippli",gunslinger:"PF2E.TraitDescriptionGunslinger",halfling:"PF2E.TraitDescriptionHalfling","half-elf":"PF2E.TraitDescriptionHalfElf","half-orc":"PF2E.TraitDescriptionHalfOrc","jousting-d6":"PF2E.TraitDescriptionJousting",hampering:"PF2E.TraitDescriptionHampering",harnessed:"PF2E.TraitDescriptionHarnessed",haunt:"PF2E.TraitDescriptionHaunt",healing:"PF2E.TraitDescriptionHealing","hefty-14":"PF2E.TraitDescriptionHefty",hex:"PF2E.TraitDescriptionHex",hindering:"PF2E.TraitDescriptionHindering",hobgoblin:"PF2E.TraitDescriptionHobgoblin",human:"PF2E.TraitDescriptionHuman",humanoid:"PF2E.TraitDescriptionHumanoid",ifrit:"PF2E.TraitDescriptionIfrit",illusion:"PF2E.TraitDescriptionIllusion",impulse:"PF2E.TraitDescriptionImpulse",incapacitation:"PF2E.TraitDescriptionIncapacitation",incarnate:"PF2E.TraitDescriptionIncarnate",incorporeal:"PF2E.TraitDescriptionIncorporeal",infused:"PF2E.TraitDescriptionInfused",infusion:"PF2E.TraitDescriptionInfusion",ingested:"PF2E.TraitDescriptionIngested",inhaled:"PF2E.TraitDescriptionInhaled",injection:"PF2E.TraitDescriptionInjection",injury:"PF2E.TraitDescriptionInjury",inscribed:"PF2E.TraitDescriptionInscribed","integrated-1d6-b":"PF2E.TraitDescriptionIntegrated","integrated-1d6-p":"PF2E.TraitDescriptionIntegrated","integrated-1d6-s":"PF2E.TraitDescriptionIntegrated","integrated-1d6-s-versatile-p":"PF2E.TraitDescriptionIntegrated",intelligent:"PF2E.TraitDescriptionIntelligent",inventor:"PF2E.TraitDescriptionInventor",invested:"PF2E.TraitDescriptionInvested",investigator:"PF2E.TraitDescriptionInvestigator",kashrishi:"PF2E.TraitDescriptionKashrishi","keep-stone":"PF2E.PreciousMaterialKeepStoneDescription",kickback:"PF2E.TraitDescriptionKickback",kineticist:"PF2E.TraitDescriptionKineticist",kitsune:"PF2E.TraitDescriptionKitsune",kobold:"PF2E.TraitDescriptionKobold",laminar:"PF2E.TraitDescriptionLaminar","launching-dart":"PF2E.TraitDescriptionLaunching",lawful:"PF2E.TraitDescriptionLawful",leshy:"PF2E.TraitDescriptionLeshy",light:"PF2E.TraitDescriptionLight",linguistic:"PF2E.TraitDescriptionLinguistic",litany:"PF2E.TraitDescriptionLitany",lizardfolk:"PF2E.TraitDescriptionLizardfolk",lozenge:"PF2E.TraitDescriptionLozenge",magical:"PF2E.TraitDescriptionMagical",magus:"PF2E.TraitDescriptionMagus",manipulate:"PF2E.TraitDescriptionManipulate",mechanical:"PF2E.TraitDescriptionMechanical",mental:"PF2E.TraitDescriptionMental",metal:"PF2E.TraitDescriptionMetal",metamagic:"PF2E.TraitDescriptionMetamagic",mindless:"PF2E.TraitDescriptionMindless",mindshift:"PF2E.TraitDescriptionMindshift",minion:"PF2E.TraitDescriptionMinion",misfortune:"PF2E.TraitDescriptionMisfortune",missive:"PF2E.TraitDescriptionMissive",modification:"PF2E.TraitDescriptionModification",modular:"PF2E.TraitDescriptionModular",monk:"PF2E.TraitDescriptionMonk",morph:"PF2E.TraitDescriptionMorph",mounted:"PF2E.TraitDescriptionMounted",move:"PF2E.TraitDescriptionMove",multiclass:"PF2E.TraitDescriptionMulticlass",mutagen:"PF2E.TraitDescriptionMutagen",nagaji:"PF2E.TraitDescriptionNagaji",necromancy:"PF2E.TraitDescriptionNecromancy",noisy:"PF2E.TraitDescriptionNoisy",nonlethal:"PF2E.TraitDescriptionNonlethal",oath:"PF2E.TraitDescriptionOath",occult:"PF2E.TraitDescriptionOccult",oil:"PF2E.TraitDescriptionOil",olfactory:"PF2E.TraitDescriptionOlfactory",open:"PF2E.TraitDescriptionOpen",oracle:"PF2E.TraitDescriptionOracle",orc:"PF2E.TraitDescriptionOrc",oread:"PF2E.TraitDescriptionOread",overflow:"PF2E.TraitDescriptionOverflow",parry:"PF2E.TraitDescriptionParry",peachwood:"PF2E.PreciousMaterialPeachwoodDescription",plant:"PF2E.TraitDescriptionPlant",poison:"PF2E.TraitDescriptionPoison",polymorph:"PF2E.TraitDescriptionPolymorph",ponderous:"PF2E.TraitDescriptionPonderous",poppet:"PF2E.TraitDescriptionPoppet",portable:"PF2E.TraitDescriptionPortable",possession:"PF2E.TraitDescriptionPossession",potion:"PF2E.TraitDescriptionPotion",precious:"PF2E.TraitDescriptionPrecious",prediction:"PF2E.TraitDescriptionPrediction",press:"PF2E.TraitDescriptionPress",primal:"PF2E.TraitDescriptionPrimal",propulsive:"PF2E.TraitDescriptionPropulsive",psyche:"PF2E.TraitDescriptionPsyche",psychic:"PF2E.TraitDescriptionPsychic",radiation:"PF2E.TraitDescriptionRadiation",rage:"PF2E.TraitDescriptionRage",ranger:"PF2E.TraitDescriptionRanger",...rangeDescriptions,"ranged-trip":"PF2E.TraitDescriptionRangedTrip",rare:"PF2E.TraitDescriptionRare",ratfolk:"PF2E.TraitDescriptionRatfolk",razing:"PF2E.TraitDescriptionRazing",reach:"PF2E.TraitDescriptionReach","reach-0":"PF2E.TraitDescriptionReach","reach-10":"PF2E.TraitDescriptionReach","reach-100":"PF2E.TraitDescriptionReach","reach-120":"PF2E.TraitDescriptionReach","reach-1000":"PF2E.TraitDescriptionReach","reach-15":"PF2E.TraitDescriptionReach","reach-20":"PF2E.TraitDescriptionReach","reach-200":"PF2E.TraitDescriptionReach","reach-25":"PF2E.TraitDescriptionReach","reach-30":"PF2E.TraitDescriptionReach","reach-40":"PF2E.TraitDescriptionReach","reach-50":"PF2E.TraitDescriptionReach","reach-60":"PF2E.TraitDescriptionReach",recovery:"PF2E.TraitDescriptionRecovery",reflection:"PF2E.TraitDescriptionReflection",relic:"PF2E.TraitDescriptionRelic",reload:"PF2E.TraitDescriptionReload","reload-0":"PF2E.TraitDescriptionReload","reload-1":"PF2E.TraitDescriptionReload","reload-1-min":"PF2E.TraitDescriptionReload","reload-2":"PF2E.TraitDescriptionReload",repeating:"PF2E.TraitDescriptionRepeating",resonant:"PF2E.TraitDescriptionResonant",revelation:"PF2E.TraitDescriptionRevelation",rogue:"PF2E.TraitDescriptionRogue",saggorak:"PF2E.TraitDescriptionSaggorak","scatter-10":"PF2E.TraitDescriptionScatter","scatter-15":"PF2E.TraitDescriptionScatter","scatter-20":"PF2E.TraitDescriptionScatter","scatter-5":"PF2E.TraitDescriptionScatter",scroll:"PF2E.TraitDescriptionScroll",scrying:"PF2E.TraitDescriptionScrying",secret:"PF2E.TraitDescriptionSecret",shadow:"PF2E.TraitDescriptionShadow","shield-throw-20":"PF2E.TraitDescriptionShieldThrow","shield-throw-30":"PF2E.TraitDescriptionShieldThrow",shisk:"PF2E.TraitDescriptionShisk",shoony:"PF2E.TraitDescriptionShoony",shove:"PF2E.TraitDescriptionShove",skeleton:"PF2E.TraitDescriptionSkeleton",skill:"PF2E.TraitDescriptionSkill",sleep:"PF2E.TraitDescriptionSleep",snare:"PF2E.TraitDescriptionSnare",social:"PF2E.TraitDescriptionSocial",sonic:"PF2E.TraitDescriptionSonic",sorcerer:"PF2E.TraitDescriptionSorcerer",spellgun:"PF2E.TraitDescriptionSpellgun",spellheart:"PF2E.TraitDescriptionSpellheart",spellshot:"PF2E.TraitNoDescription",splash:"PF2E.TraitDescriptionSplash","splash-10":"PF2E.TraitDescriptionSplash10",sprite:"PF2E.TraitDescriptionSprite",staff:"PF2E.TraitDescriptionStaff",stance:"PF2E.TraitDescriptionStance",steam:"PF2E.TraitDescriptionSteam",strix:"PF2E.TraitDescriptionStrix",structure:"PF2E.TraitDescriptionStructure",suli:"PF2E.TraitDescriptionSuli",summon:"PF2E.TraitDescriptionSummon",summoned:"PF2E.TraitDescriptionSummoned",summoner:"PF2E.TraitDescriptionSummoner",swashbuckler:"PF2E.TraitDescriptionSwashbuckler",sweep:"PF2E.TraitDescriptionSweep",sylph:"PF2E.TraitDescriptionSylph",talisman:"PF2E.TraitDescriptionTalisman",talos:"PF2E.TraitDescriptionTalos",tandem:"PF2E.TraitDescriptionTandem",tattoo:"PF2E.TraitDescriptionTattoo",tech:"PF2E.TraitDescriptionTech",telepathy:"PF2E.TraitDescriptionTelepathy",teleportation:"PF2E.TraitDescriptionTeleportation",tengu:"PF2E.TraitDescriptionTengu",tethered:"PF2E.TraitDescriptionTethered",thaumaturge:"PF2E.TraitDescriptionThaumaturge",thrown:"PF2E.TraitDescriptionThrown","thrown-10":"PF2E.TraitDescriptionThrown","thrown-100":"PF2E.TraitDescriptionThrown","thrown-15":"PF2E.TraitDescriptionThrown","thrown-20":"PF2E.TraitDescriptionThrown","thrown-200":"PF2E.TraitDescriptionThrown","thrown-25":"PF2E.TraitDescriptionThrown","thrown-30":"PF2E.TraitDescriptionThrown","thrown-40":"PF2E.TraitDescriptionThrown","thrown-50":"PF2E.TraitDescriptionThrown","thrown-60":"PF2E.TraitDescriptionThrown","thrown-80":"PF2E.TraitDescriptionThrown",tiefling:"PF2E.TraitDescriptionTiefling",time:"PF2E.TraitDescriptionTime",training:"PF2E.TraitDescriptionTraining",transmutation:"PF2E.TraitDescriptionTransmutation",trap:"PF2E.TraitDescriptionTrap",trip:"PF2E.TraitDescriptionTrip","true-name":"PF2E.TraitDescriptionTrueName",twin:"PF2E.TraitDescriptionTwin","two-hand-d10":"PF2E.TraitDescriptionTwoHand","two-hand-d12":"PF2E.TraitDescriptionTwoHand","two-hand-d6":"PF2E.TraitDescriptionTwoHand","two-hand-d8":"PF2E.TraitDescriptionTwoHand",unarmed:"PF2E.TraitDescriptionUnarmed",uncommon:"PF2E.TraitDescriptionUncommon",undine:"PF2E.TraitDescriptionUndine",unique:"PF2E.TraitDescriptionUnique",unstable:"PF2E.TraitDescriptionUnstable",vanara:"PF2E.TraitDescriptionVanara",vishkanya:"PF2E.TraitDescriptionVishkanya",vehicular:"PF2E.TraitDescriptionVehicular","versatile-acid":"PF2E.TraitDescriptionVersatile","versatile-b":"PF2E.TraitDescriptionVersatile","versatile-chaotic":"PF2E.TraitDescriptionVersatile","versatile-cold":"PF2E.TraitDescriptionVersatile","versatile-electricity":"PF2E.TraitDescriptionVersatile","versatile-evil":"PF2E.TraitDescriptionVersatile","versatile-fire":"PF2E.TraitDescriptionVersatile","versatile-force":"PF2E.TraitDescriptionVersatile","versatile-good":"PF2E.TraitDescriptionVersatile","versatile-lawful":"PF2E.TraitDescriptionVersatile","versatile-p":"PF2E.TraitDescriptionVersatile","versatile-poison":"PF2E.TraitDescriptionVersatile","versatile-s":"PF2E.TraitDescriptionVersatile","versatile-sonic":"PF2E.TraitDescriptionVersatile","versatile-vitality":"PF2E.TraitDescriptionVersatile","versatile-void":"PF2E.TraitDescriptionVersatile",virulent:"PF2E.TraitDescriptionVirulent",visual:"PF2E.TraitDescriptionVisual",vitality:"PF2E.TraitDescriptionVitality",void:"PF2E.TraitDescriptionVoid","volley-20":"PF2E.TraitDescriptionVolley","volley-30":"PF2E.TraitDescriptionVolley","volley-50":"PF2E.TraitDescriptionVolley",wand:"PF2E.TraitDescriptionWand",water:"PF2E.TraitDescriptionWater",witch:"PF2E.TraitDescriptionWitch",wizard:"PF2E.TraitDescriptionWizard",wood:"PF2E.TraitDescriptionWood",...preciousMaterialDescriptions},kingmakerTraits={...actionTraits,army:"PF2E.Kingmaker.Trait.army",cavalry:"PF2E.Kingmaker.Trait.cavalry",civic:"PF2E.Kingmaker.Trait.civic",commerce:"PF2E.Kingmaker.Trait.commerce",infantry:"PF2E.Kingmaker.Trait.infantry",kingdom:"PF2E.Kingmaker.Trait.kingdom",leadership:"PF2E.Kingmaker.Trait.leadership",maneuver:"PF2E.Kingmaker.Trait.maneuver",morale:"PF2E.Kingmaker.Trait.morale",region:"PF2E.Kingmaker.Trait.region",siege:"PF2E.Kingmaker.Trait.siege",skirmisher:"PF2E.Kingmaker.Trait.skirmisher",upkeep:"PF2E.Kingmaker.Trait.upkeep"},damageCategoriesUnique={persistent:"PF2E.ConditionTypePersistentShort",precision:"PF2E.Damage.Precision",splash:"PF2E.TraitSplash"},materialDamageEffects=pick$1(preciousMaterials,["abysium","adamantine","cold-iron","darkwood","djezet","inubrix","keep-stone","mithral","noqual","orichalcum","peachwood","siccatite","silver","sisterstone-dusk","sisterstone-scarlet","sovereign-steel","warpglass"]),damageCategories={...damageCategoriesUnique,...materialDamageEffects,alignment:"PF2E.Alignment",energy:"PF2E.TraitEnergy",physical:"PF2E.TraitPhysical"},physicalDamageTypes={bleed:"PF2E.TraitBleed",bludgeoning:"PF2E.TraitBludgeoning",piercing:"PF2E.TraitPiercing",slashing:"PF2E.TraitSlashing"},damageTypes={...alignmentTraits,...energyDamageTypes,...physicalDamageTypes,mental:"PF2E.TraitMental",poison:"PF2E.TraitPoison",spirit:"PF2E.TraitSpirit",untyped:"PF2E.TraitUntyped"},damageRollFlavors=[...DAMAGE_TYPES].reduce((result,key)=>(result[key]=`PF2E.Damage.RollFlavor.${key}`,result),{}),materialIWR=mapValues$1(omit(materialDamageEffects,["keep-stone","peachwood","sisterstone-dusk","sisterstone-scarlet","sovereign-steel","warpglass"]),(_v,k)=>`PF2E.Damage.IWR.Type.${k}`),immunityTypes={...materialIWR,acid:"PF2E.Damage.RollFlavor.acid",air:"PF2E.Damage.RollFlavor.air","area-damage":"PF2E.Damage.IWR.Type.area-damage",auditory:"PF2E.Damage.IWR.Type.auditory",bleed:"PF2E.Damage.RollFlavor.bleed",blinded:"PF2E.Damage.IWR.Type.blinded",bludgeoning:"PF2E.Damage.RollFlavor.bludgeoning",chaotic:"PF2E.Damage.RollFlavor.chaotic",clumsy:"PF2E.Damage.IWR.Type.clumsy",cold:"PF2E.Damage.RollFlavor.cold",confused:"PF2E.Damage.IWR.Type.confused",conjuration:"PF2E.Damage.IWR.Type.conjuration",controlled:"PF2E.Damage.IWR.Type.controlled","critical-hits":"PF2E.Damage.IWR.Type.critical-hits",curse:"PF2E.Damage.IWR.Type.curse",custom:"",darkwood:"PF2E.Damage.IWR.Type.darkwood",dazzled:"PF2E.Damage.IWR.Type.dazzled",deafened:"PF2E.Damage.IWR.Type.deafened","death-effects":"PF2E.Damage.IWR.Type.death-effects",disease:"PF2E.Damage.IWR.Type.disease",doomed:"PF2E.Damage.IWR.Type.doomed",drained:"PF2E.Damage.IWR.Type.drained",earth:"PF2E.Damage.RollFlavor.earth",electricity:"PF2E.Damage.RollFlavor.electricity",emotion:"PF2E.Damage.IWR.Type.emotion",enchantment:"PF2E.Damage.IWR.Type.enchantment",energy:"PF2E.Damage.IWR.Type.energy",enfeebled:"PF2E.Damage.IWR.Type.enfeebled",evil:"PF2E.Damage.RollFlavor.evil",evocation:"PF2E.Damage.IWR.Type.evocation",fascinated:"PF2E.Damage.IWR.Type.fascinated",fatigued:"PF2E.Damage.IWR.Type.fatigued","fear-effects":"PF2E.Damage.IWR.Type.fear-effects",fire:"PF2E.Damage.RollFlavor.fire",fleeing:"PF2E.Damage.IWR.Type.fleeing",force:"PF2E.Damage.RollFlavor.force",frightened:"PF2E.Damage.IWR.Type.frightened",good:"PF2E.Damage.RollFlavor.good",grabbed:"PF2E.Damage.IWR.Type.grabbed",healing:"PF2E.Damage.IWR.Type.healing",illusion:"PF2E.Damage.IWR.Type.illusion",immobilized:"PF2E.Damage.IWR.Type.immobilized",inhaled:"PF2E.Damage.IWR.Type.inhaled",lawful:"PF2E.Damage.RollFlavor.lawful",light:"PF2E.Damage.IWR.Type.light",magic:"PF2E.Damage.IWR.Type.magic",mental:"PF2E.Damage.RollFlavor.mental",metal:"PF2E.Damage.IWR.Type.metal","misfortune-effects":"PF2E.Damage.IWR.Type.misfortune-effects",necromancy:"PF2E.Damage.IWR.Type.necromancy","non-magical":"PF2E.Damage.IWR.Type.non-magical","nonlethal-attacks":"PF2E.Damage.IWR.Type.nonlethal-attacks","object-immunities":"PF2E.Damage.IWR.Type.object-immunities","off-guard":"PF2E.Damage.IWR.Type.off-guard",olfactory:"PF2E.Damage.IWR.Type.olfactory",paralyzed:"PF2E.Damage.IWR.Type.paralyzed","persistent-damage":"PF2E.Damage.IWR.Type.persistent-damage",petrified:"PF2E.Damage.IWR.Type.petrified",physical:"PF2E.Damage.IWR.Type.physical",piercing:"PF2E.Damage.RollFlavor.piercing",plant:"PF2E.Damage.IWR.Type.plant",poison:"PF2E.Damage.RollFlavor.poison",polymorph:"PF2E.Damage.IWR.Type.polymorph",possession:"PF2E.Damage.IWR.Type.possession",precision:"PF2E.Damage.RollFlavor.precision",prone:"PF2E.Damage.IWR.Type.prone",radiation:"PF2E.Damage.IWR.Type.radiation",restrained:"PF2E.Damage.IWR.Type.restrained","salt-water":"PF2E.Damage.IWR.Type.salt-water",scrying:"PF2E.Damage.IWR.Type.scrying",sickened:"PF2E.Damage.IWR.Type.sickened",slashing:"PF2E.Damage.RollFlavor.slashing",sleep:"PF2E.Damage.IWR.Type.sleep",slowed:"PF2E.Damage.IWR.Type.slowed",sonic:"PF2E.Damage.RollFlavor.sonic","spell-deflection":"PF2E.Damage.IWR.Type.spell-deflection",spirit:"PF2E.Damage.RollFlavor.spirit",stunned:"PF2E.Damage.IWR.Type.stunned",stupefied:"PF2E.Damage.IWR.Type.stupefied","swarm-attacks":"PF2E.Damage.IWR.Type.swarm-attacks","swarm-mind":"PF2E.Damage.IWR.Type.swarm-mind",transmutation:"PF2E.Damage.IWR.Type.transmutation",trip:"PF2E.Damage.IWR.Type.trip","unarmed-attacks":"PF2E.Damage.IWR.Type.unarmed-attacks",unconscious:"PF2E.Damage.IWR.Type.unconscious",visual:"PF2E.Damage.IWR.Type.visual",vitality:"PF2E.Damage.RollFlavor.vitality",void:"PF2E.Damage.RollFlavor.void",water:"PF2E.Damage.IWR.Type.water",wood:"PF2E.Damage.IWR.Type.wood",wounded:"PF2E.Damage.IWR.Type.wounded"},weaknessTypes={...materialIWR,acid:"PF2E.Damage.RollFlavor.acid",air:"PF2E.Damage.RollFlavor.air","area-damage":"PF2E.Damage.IWR.Type.area-damage","arrow-vulnerability":"PF2E.Damage.IWR.Type.arrow-vulnerability","axe-vulnerability":"PF2E.Damage.IWR.Type.axe-vulnerability",bleed:"PF2E.Damage.RollFlavor.bleed",bludgeoning:"PF2E.Damage.RollFlavor.bludgeoning",chaotic:"PF2E.Damage.RollFlavor.chaotic",cold:"PF2E.Damage.RollFlavor.cold","critical-hits":"PF2E.Damage.IWR.Type.critical-hits",custom:"",earth:"PF2E.Damage.RollFlavor.earth",electricity:"PF2E.Damage.RollFlavor.electricity",emotion:"PF2E.Damage.IWR.Type.emotion",energy:"PF2E.Damage.IWR.Type.energy",evil:"PF2E.Damage.RollFlavor.evil",fire:"PF2E.Damage.RollFlavor.fire",force:"PF2E.Damage.RollFlavor.force","ghost-touch":"PF2E.Damage.IWR.Type.ghost-touch",glass:"PF2E.Damage.IWR.Type.glass",good:"PF2E.Damage.RollFlavor.good",lawful:"PF2E.Damage.RollFlavor.lawful",light:"PF2E.Damage.IWR.Type.light",magical:"PF2E.Damage.IWR.Type.magical",mental:"PF2E.Damage.RollFlavor.mental",metal:"PF2E.Damage.RollFlavor.metal","non-magical":"PF2E.Damage.IWR.Type.non-magical","nonlethal-attacks":"PF2E.Damage.IWR.Type.nonlethal-attacks",physical:"PF2E.Damage.IWR.Type.physical",piercing:"PF2E.Damage.RollFlavor.piercing",plant:"PF2E.Damage.IWR.Type.plant",poison:"PF2E.Damage.RollFlavor.poison",precision:"PF2E.Damage.RollFlavor.precision",radiation:"PF2E.Damage.IWR.Type.radiation",salt:"PF2E.Damage.IWR.Type.salt","salt-water":"PF2E.Damage.IWR.Type.salt-water",slashing:"PF2E.Damage.RollFlavor.slashing",sonic:"PF2E.Damage.RollFlavor.sonic",spells:"PF2E.Damage.IWR.Type.spells",spirit:"PF2E.Damage.RollFlavor.spirit","splash-damage":"PF2E.Damage.IWR.Type.splash-damage","unarmed-attacks":"PF2E.Damage.IWR.Type.unarmed-attacks","vampire-weaknesses":"PF2E.Damage.IWR.Type.vampire-weaknesses",vitality:"PF2E.Damage.RollFlavor.vitality",void:"PF2E.Damage.RollFlavor.void",vorpal:"PF2E.Damage.IWR.Type.vorpal","vorpal-fear":"PF2E.Damage.IWR.Type.vorpal-fear","vulnerable-to-sunlight":"PF2E.Damage.IWR.Type.vulnerable-to-sunlight",water:"PF2E.Damage.IWR.Type.water",weapons:"PF2E.Damage.IWR.Type.weapons","weapons-shedding-bright-light":"PF2E.Damage.IWR.Type.weapons-shedding-bright-light",wood:"PF2E.Damage.IWR.Type.wood"},resistanceTypes={...materialIWR,acid:"PF2E.Damage.RollFlavor.acid",air:"PF2E.Damage.RollFlavor.air","all-damage":"PF2E.Damage.IWR.Type.all-damage","area-damage":"PF2E.Damage.IWR.Type.area-damage",bleed:"PF2E.Damage.RollFlavor.bleed",bludgeoning:"PF2E.Damage.RollFlavor.bludgeoning",chaotic:"PF2E.Damage.RollFlavor.chaotic",cold:"PF2E.Damage.RollFlavor.cold","critical-hits":"PF2E.Damage.IWR.Type.critical-hits",custom:"","damage-from-spells":"PF2E.Damage.IWR.Type.damage-from-spells",earth:"PF2E.Damage.RollFlavor.earth",electricity:"PF2E.Damage.RollFlavor.electricity",energy:"PF2E.Damage.IWR.Type.energy",evil:"PF2E.Damage.RollFlavor.evil",fire:"PF2E.Damage.RollFlavor.fire",force:"PF2E.Damage.RollFlavor.force","ghost-touch":"PF2E.Damage.IWR.Type.ghost-touch",good:"PF2E.Damage.RollFlavor.good",lawful:"PF2E.Damage.RollFlavor.lawful",light:"PF2E.Damage.IWR.Type.light",magical:"PF2E.Damage.IWR.Type.magical",mental:"PF2E.Damage.RollFlavor.mental",metal:"PF2E.Damage.RollFlavor.metal","non-magical":"PF2E.Damage.IWR.Type.non-magical",nonlethal:"PF2E.Damage.IWR.Type.nonlethal","nonlethal-attacks":"PF2E.Damage.IWR.Type.nonlethal-attacks",physical:"PF2E.Damage.IWR.Type.physical",piercing:"PF2E.Damage.RollFlavor.piercing",plant:"PF2E.Damage.IWR.Type.plant",poison:"PF2E.Damage.RollFlavor.poison",precision:"PF2E.Damage.RollFlavor.precision","protean-anatomy":"PF2E.Damage.IWR.Type.protean-anatomy",radiation:"PF2E.Damage.IWR.Type.radiation",salt:"PF2E.Damage.IWR.Type.salt","salt-water":"PF2E.Damage.IWR.Type.salt-water",slashing:"PF2E.Damage.RollFlavor.slashing",sonic:"PF2E.Damage.RollFlavor.sonic",spells:"PF2E.Damage.IWR.Type.spells",spirit:"PF2E.Damage.RollFlavor.spirit","unarmed-attacks":"PF2E.Damage.IWR.Type.unarmed-attacks",vitality:"PF2E.Damage.RollFlavor.vitality",void:"PF2E.Damage.RollFlavor.void",vorpal:"PF2E.Damage.IWR.Type.vorpal","vorpal-adamantine":"PF2E.Damage.IWR.Type.vorpal-adamantine",water:"PF2E.Damage.IWR.Type.water",weapons:"PF2E.Damage.IWR.Type.weapons","weapons-shedding-bright-light":"PF2E.Damage.IWR.Type.weapons-shedding-bright-light",wood:"PF2E.Damage.IWR.Type.wood"},ATTRIBUTE_ABBREVIATIONS=new Set(["str","dex","con","int","wis","cha"]),CREATURE_ACTOR_TYPES=["character","npc","familiar"],SAVE_TYPES=["fortitude","reflex","will"],IMMUNITY_TYPES=new Set(Object.keys(immunityTypes)),WEAKNESS_TYPES=new Set(Object.keys(weaknessTypes)),RESISTANCE_TYPES=new Set(Object.keys(resistanceTypes)),UNAFFECTED_TYPES=new Set(["bleed","good","evil","lawful","chaotic","spirit","vitality","void"]),SKILL_ABBREVIATIONS=new Set(["acr","arc","ath","cra","dec","dip","itm","med","nat","occ","prf","rel","soc","ste","sur","thi"]),SKILL_DICTIONARY={acr:"acrobatics",arc:"arcana",ath:"athletics",cra:"crafting",dec:"deception",dip:"diplomacy",itm:"intimidation",med:"medicine",nat:"nature",occ:"occultism",prf:"performance",rel:"religion",soc:"society",ste:"stealth",sur:"survival",thi:"thievery"},SKILL_LONG_FORMS=new Set(Object.values(SKILL_DICTIONARY));Object.fromEntries(Object.entries(SKILL_DICTIONARY).map(([abbrev,value])=>[value,abbrev])),[...SAVE_TYPES,...SKILL_LONG_FORMS];const SKILL_EXPANDED={acrobatics:{attribute:"dex",shortForm:"acr"},arcana:{attribute:"int",shortForm:"arc"},athletics:{attribute:"str",shortForm:"ath"},crafting:{attribute:"int",shortForm:"cra"},deception:{attribute:"cha",shortForm:"dec"},diplomacy:{attribute:"cha",shortForm:"dip"},intimidation:{attribute:"cha",shortForm:"itm"},medicine:{attribute:"wis",shortForm:"med"},nature:{attribute:"wis",shortForm:"nat"},occultism:{attribute:"int",shortForm:"occ"},performance:{attribute:"cha",shortForm:"prf"},religion:{attribute:"wis",shortForm:"rel"},society:{attribute:"int",shortForm:"soc"},stealth:{attribute:"dex",shortForm:"ste"},survival:{attribute:"wis",shortForm:"sur"},thievery:{attribute:"dex",shortForm:"thi"}},MOVEMENT_TYPES=["land","burrow","climb","fly","swim"],SIZE_LINKABLE_ACTOR_TYPES=new Set([...CREATURE_ACTOR_TYPES,"vehicle"]),_Migration672RemoveNPCBaseProperties=class extends MigrationBase{static{__name(this,"_Migration672RemoveNPCBaseProperties")}removeBase(property,replace="value"){property[replace]=Number(property[replace])||0,typeof property.base=="number"&&(property[replace]=property.base,"game"in globalThis?property["-=base?"]=null:delete property.base)}async updateActor(actorSource){if(actorSource.type!=="npc")return;const{ac,hp,perception}=actorSource.system.attributes;this.removeBase(ac),this.removeBase(hp,"max"),this.removeBase(perception);const{saves}=actorSource.system;for(const saveType of SAVE_TYPES)this.removeBase(saves[saveType])}async updateItem(itemSource,actorSource){actorSource?.type==="npc"&&itemSource.type==="lore"&&this.removeBase(itemSource.system.mod)}};__name2(_Migration672RemoveNPCBaseProperties,"Migration672RemoveNPCBaseProperties"),__publicField(_Migration672RemoveNPCBaseProperties,"version",.672);let Migration672RemoveNPCBaseProperties=_Migration672RemoveNPCBaseProperties;const _Migration673RemoveBulwarkREs=class extends MigrationBase{static{__name(this,"_Migration673RemoveBulwarkREs")}hasRuleElement(rules){return rules.some(r=>typeof r.key=="string"&&r.key.endsWith("FlatModifier")&&isObject(r.predicate)&&!!r.predicate.all?.includes("self:armor:trait:bulwark"))}async updateItem(item){const{rules}=item.system;if(item.type==="armor"){const index=rules.findIndex(rule=>typeof rule.key=="string"&&rule.key.endsWith("FlatModifier")&&rule.selector==="reflex"&&rule.type==="ability"&&/bulwark/i.test(String(rule.label??"")));index!==-1&&rules.splice(index)}const slug=item.system.slug??sluggify(item.name);if(item.type==="feat"&&slug==="mighty-bulwark"&&!this.hasRuleElement(rules)){const newRules=[{key:"FlatModifier",predicate:{all:["self:armor:trait:bulwark"]},selector:"reflex",type:"untyped",value:4},{key:"RollOption",domain:"reflex",option:"self:armor:bulwark-all"}];rules.push(...newRules)}}};__name2(_Migration673RemoveBulwarkREs,"Migration673RemoveBulwarkREs"),__publicField(_Migration673RemoveBulwarkREs,"version",.673);let Migration673RemoveBulwarkREs=_Migration673RemoveBulwarkREs;const HOMEBREW_TRAIT_KEYS=["creatureTraits","featTraits","languages","magicSchools","spellTraits","weaponCategories","weaponGroups","baseWeapons","weaponTraits","equipmentTraits"],SECONDARY_TRAIT_RECORDS={creatureTraits:["ancestryItemTraits"],equipmentTraits:["armorTraits","consumableTraits"],featTraits:["actionTraits"],weaponTraits:["npcAttackTraits"],magicSchools:["spellTraits"]};function itemIsOfType(item,...types){return types.some(t=>t==="physical"?setHasElement(PHYSICAL_ITEM_TYPES,item.type):item.type===t)}__name(itemIsOfType,"itemIsOfType"),__name2(itemIsOfType,"itemIsOfType");function reduceItemName(label){return label.includes(":")?label.replace(/^[^:]+:\s*|\s*\([^)]+\)$/g,""):label}__name(reduceItemName,"reduceItemName"),__name2(reduceItemName,"reduceItemName");const{fields:fields$2}=foundry.data,_LaxSchemaField=class extends fields$2.SchemaField{static{__name(this,"_LaxSchemaField")}_cleanType(data,options={}){options.source=options.source||data;for(const[name2,field]of this.entries())!(name2 in data)&&options.partial||(data[name2]=field.clean(data[name2],options),data[name2]===void 0&&delete data[name2]);return data}};__name2(_LaxSchemaField,"LaxSchemaField");let LaxSchemaField=_LaxSchemaField;const _StrictSchemaField=class extends fields$2.SchemaField{static{__name(this,"_StrictSchemaField")}_cast(value){return value}_cleanType(data,options){if(!isObject$1(data))throw Error(`${this.name} is not an object`);return super._cleanType(data,options)}};__name2(_StrictSchemaField,"StrictSchemaField");let StrictSchemaField=_StrictSchemaField;const _StrictStringField=class extends fields$2.StringField{static{__name(this,"_StrictStringField")}_cast(value){return value}};__name2(_StrictStringField,"StrictStringField");let StrictStringField=_StrictStringField;const _StrictNumberField=class extends fields$2.NumberField{static{__name(this,"_StrictNumberField")}_cast(value){return value}};__name2(_StrictNumberField,"StrictNumberField");let StrictNumberField=_StrictNumberField;const _StrictBooleanField=class extends fields$2.BooleanField{static{__name(this,"_StrictBooleanField")}_cast(value){return value}};__name2(_StrictBooleanField,"StrictBooleanField");let StrictBooleanField=_StrictBooleanField;const _StrictArrayField=class extends fields$2.ArrayField{static{__name(this,"_StrictArrayField")}_cast(value){return value}_cleanType(value){return value&&super._cleanType(value)}};__name2(_StrictArrayField,"StrictArrayField");let StrictArrayField=_StrictArrayField;const _StrictObjectField=class extends fields$2.ObjectField{static{__name(this,"_StrictObjectField")}_cast(value){return value}};__name2(_StrictObjectField,"StrictObjectField");let StrictObjectField=_StrictObjectField;const _DataUnionField=class extends fields$2.DataField{static{__name(this,"_DataUnionField")}fields;constructor(fields2,options){super(options),this.fields=fields2}_cast(value){return typeof value=="string"&&(value=value.trim()),value}clean(value,options){return Array.isArray(value)&&this.fields.some(f=>f instanceof foundry.data.fields.ArrayField)?this.fields.find(f=>f instanceof StrictArrayField)?.clean(value,options)??value:super.clean(value,options)}validate(value,options){const{DataModelValidationFailure}=foundry.data.validation,{StringField}=foundry.data.fields;for(const field of this.fields)if(!(field.validate(value,options)instanceof DataModelValidationFailure)){if(field instanceof StringField&&typeof value!="string")continue;return}return this.fields[0].validate(value,options)}initialize(value,model,options){return this.fields.find(f=>!f.validate(value))?.initialize(value,model,options)}};__name2(_DataUnionField,"DataUnionField");let DataUnionField=_DataUnionField;const _SlugField=class extends StrictStringField{static{__name(this,"_SlugField")}constructor(options={}){options.blank=!1,options.camel??=null,super(options)}static get _defaults(){return{...super._defaults,nullable:!0,initial:null,camel:null}}_cleanType(value,options){const slug=super._cleanType(value,options),camel=this.options.camel??null;return typeof slug=="string"?sluggify(slug,{camel}):slug}};__name2(_SlugField,"SlugField");let SlugField=_SlugField;const _PredicateStatementField=class extends fields$2.DataField{static{__name(this,"_PredicateStatementField")}constructor(options={}){super({...options,required:!0,nullable:!1,initial:void 0,validationError:"must be recognized predicated statement type"})}_validateType(value){return StatementValidator.isStatement(value)}_cast(value){return value}_cleanType(value){return typeof value=="string"?value.trim():value}};__name2(_PredicateStatementField,"PredicateStatementField");let PredicateStatementField=_PredicateStatementField;const _PredicateField=class extends StrictArrayField{static{__name(this,"_PredicateField")}constructor(options={}){super(new PredicateStatementField,{label:"PF2E.RuleEditor.General.Predicate",...options})}initialize(value,model,options){const statements=super.initialize(value,model,options);return statements&&new PredicatePF2e(...statements)}};__name2(_PredicateField,"PredicateField");let PredicateField=_PredicateField;const _RecordField=class extends fields$2.ObjectField{static{__name(this,"_RecordField")}keyField;valueField;constructor(keyField,valueField,options){if(super(options),!this._isValidKeyFieldType(keyField))throw new Error("key field must be a StringField or a NumberField");if(this.keyField=keyField,!(valueField instanceof fields$2.DataField))throw new Error(`${this.name} must have a DataField as its contained field`);this.valueField=valueField}_isValidKeyFieldType(keyField){if(keyField instanceof fields$2.StringField||keyField instanceof fields$2.NumberField){if(keyField.options.required!==!0||keyField.options.nullable===!0)throw new Error("key field must be required and non-nullable");return!0}return!1}_validateValues(values,options){const validationFailure=foundry.data.validation.DataModelValidationFailure,failures=new validationFailure;for(const[key,value]of Object.entries(values)){if(key.startsWith("-=")&&options?.partial)continue;const keyFailure=this.keyField.validate(key,options);keyFailure&&failures.elements.push({id:key,failure:keyFailure});const valueFailure=this.valueField.validate(value,options);valueFailure&&failures.elements.push({id:`${key}-value`,failure:valueFailure})}if(failures.elements.length)return failures}_cleanType(values,options){for(const[key,value]of Object.entries(values))values[key]=this.valueField.clean(value,options);return values}_validateType(values,options){return isObject$1(values)?this._validateValues(values,options):new foundry.data.validation.DataModelValidationFailure({message:"must be an Object"})}initialize(values,model,options){if(!values)return values;const data={};for(const[key,value]of Object.entries(values))data[key]=this.valueField.initialize(value,model,options);return data}};__name2(_RecordField,"RecordField"),__publicField(_RecordField,"recursive",!0);let RecordField=_RecordField;const _RuleElementPF2e=class extends foundry.abstract.DataModel{static{__name(this,"_RuleElementPF2e")}constructor(source,options){source.label??=options.parent.name,super(source,{parent:options.parent,strict:options.strict??!0,fallback:!1}),__privateAdd(this,_resolveBracketedValue),__publicField(this,"sourceIndex"),__publicField(this,"suppressWarnings");const{item}=this;if(this.suppressWarnings=options.suppressWarnings??!this.actor.id,this.sourceIndex=options.sourceIndex??null,!tupleHasValue(this.constructor.validActorTypes,item.actor.type)){const actorType=game.i18n.localize(`TYPES.Actor.${item.actor.type}`);this.failValidation(`this rule element type cannot be applied to a ${actorType}`),source.ignored=!0}this.label=typeof source.label=="string"?game.i18n.localize(this.resolveInjectedProperties(source.label)):item.name,this.invalid?this.ignored=!0:item instanceof PhysicalItemPF2e?(this.requiresEquipped=!!(source.requiresEquipped??!0),this.requiresInvestment=item.isInvested===null?null:!!(source.requiresInvestment??this.requiresEquipped),this.ignored===!1&&(this.ignored=!!this.requiresEquipped&&!item.isEquipped||item.system.equipped.carryType==="dropped"||!!this.requiresInvestment&&!item.isInvested)):(this.requiresEquipped=null,this.requiresInvestment=null)}static defineSchema(){const{fields:fields2}=foundry.data;return{key:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0}),slug:new SlugField({required:!0,nullable:!0,label:"PF2E.RuleEditor.General.Slug"}),label:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0,label:"PF2E.RuleEditor.General.Label"}),priority:new fields2.NumberField({required:!0,nullable:!1,integer:!0,initial:100}),ignored:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),predicate:new PredicateField,requiresEquipped:new fields2.BooleanField({required:!1,nullable:!0,initial:void 0}),requiresInvestment:new fields2.BooleanField({required:!1,nullable:!0,initial:void 0})}}static get schema(){if(this._schema&&Object.hasOwn(this,"_schema"))return this._schema;const schema=new LaxSchemaField(Object.freeze(this.defineSchema()));return schema.name=this.name,Object.defineProperty(this,"_schema",{value:schema,writable:!1}),schema}get item(){return this.parent}get actor(){return this.parent.actor}get token(){const actor=this.actor;if(actor.token)return actor.token;const tokens=actor.getActiveTokens();return tokens.find(token=>token.controlled)?.document??tokens.shift()?.document??null}getReducedLabel(label=this.label){return reduceItemName(label)}validate(options={}){try{return super.validate(options)}catch(error){if(error instanceof foundry.data.validation.DataModelValidationError){const message=error.message.replace(/validation errors|Joint Validation Error/,`validation errors on item ${this.item.name} (${this.item.uuid})`);return console.warn(message),!1}else throw error}}test(rollOptions){if(this.ignored)return!1;if(this.predicate.length===0)return!0;const optionSet=new Set([...rollOptions??this.actor.getRollOptions(),...this.item.getRollOptions("parent")]);return this.resolveInjectedProperties(this.predicate).test(optionSet)}failValidation(...message){const fullMessage=message.join(" "),{name:name2,uuid}=this.item;if(!this.suppressWarnings){const ruleName=game.i18n.localize(`PF2E.RuleElement.${this.key}`);this.actor.synthetics.preparationWarnings.add(`PF2e System | ${ruleName} rules element on item ${name2} (${uuid}) failed to validate: ${fullMessage}`)}this.ignored=!0}resolveInjectedProperties(source,{warn=!0}={}){if(source===null||typeof source=="number"||typeof source=="string"&&!source.includes("{"))return source;if(Array.isArray(source))for(let i=0;i{const data=key==="rule"?this:key==="actor"||key==="item"?this[key]:this.item,value=getProperty(data,prop);return value===void 0&&(this.ignored=!0,warn&&this.failValidation(`Failed to resolve injected property "${source}"`)),String(value)});return source}resolveValue(value,defaultValue=0,{evaluate=!0,resolvables={},warn=!0}={}){if(value??=defaultValue??null,typeof value=="number"||typeof value=="boolean"||value===null)return value;value=this.resolveInjectedProperties(value,{warn});const resolvedFromBracket=this.isBracketedValue(value)?__privateMethod(this,_resolveBracketedValue,resolveBracketedValue_fn).call(this,value,defaultValue):value;if(typeof resolvedFromBracket=="number")return resolvedFromBracket;if(resolvedFromBracket instanceof Object)return defaultValue instanceof Object?mergeObject(defaultValue,resolvedFromBracket,{inplace:!1}):resolvedFromBracket;if(typeof resolvedFromBracket=="string"){const saferEval=__name2(formula=>{try{const unresolveds=formula.match(/@[a-z.]+/gi)??[];if(unresolveds.length>0){const shouldWarn=warn&&!unresolveds.every(u=>u.startsWith("@target.")||u.startsWith("@actor.conditions."));return this.ignored=!0,shouldWarn&&this.failValidation(`Failed to resolve all components of formula, "${formula}"`),Number(defaultValue)}return Roll.safeEval(formula)}catch{return this.failValidation(`Error thrown while attempting to evaluate formula, "${formula}"`),0}},"saferEval");this.actor.isOfType("character")&&(resolvables.armor=this.actor.wornArmor);const trimmed=resolvedFromBracket.trim();return(trimmed.includes("@")||/^\d+$/.test(trimmed))&&evaluate?saferEval(Roll.replaceFormulaData(trimmed,{actor:this.actor,item:this.item,...resolvables})):trimmed}return defaultValue}isBracketedValue(value){return isObject(value)&&Array.isArray(value.brackets)&&(typeof value.field=="string"||!("fields"in value))}};_resolveBracketedValue=new WeakSet,resolveBracketedValue_fn=__name2(function(value,defaultValue){const bracketNumber=(()=>{if(!value.field)return this.actor.level;const field=String(value.field),separator=field.indexOf("|"),source=field.substring(0,separator),{actor,item}=this;switch(source){case"actor":return Number(getProperty(actor,field.substring(separator+1)))||0;case"item":return Number(getProperty(item,field.substring(separator+1)))||0;case"rule":return Number(getProperty(this,field.substring(separator+1)))||0;default:return Number(getProperty(actor,field.substring(0)))||0}})(),brackets=value.brackets??[],bracketFallthrough=(()=>{switch(typeof defaultValue){case"number":case"boolean":case"object":return defaultValue;case"string":return Number.isNaN(Number(defaultValue))?defaultValue:Number(defaultValue);default:return null}})();return brackets.find(bracket=>{const start=bracket.start??0,end=bracket.end??1/0;return start<=bracketNumber&&end>=bracketNumber})?.value??bracketFallthrough},"#resolveBracketedValue"),__name2(_RuleElementPF2e,"RuleElementPF2e"),__publicField(_RuleElementPF2e,"validActorTypes",["character","familiar","hazard","npc","party","vehicle"]);let RuleElementPF2e=_RuleElementPF2e;const _ResolvableValueField=class extends foundry.data.fields.DataField{static{__name(this,"_ResolvableValueField")}constructor(){super(...arguments),__privateAdd(this,_coerceNumber)}_validateType(value){return value!==null&&["string","number","object","boolean"].includes(typeof value)}_cast(value){return value}_cleanType(value){if(typeof value=="string")return __privateMethod(this,_coerceNumber,coerceNumber_fn).call(this,value);if(isObject(value)&&"brackets"in value){value.field||="actor|level";const brackets=value.brackets=compact(Object.values(value.brackets??{}));for(const bracket of brackets)bracket.start===null&&delete bracket.start,bracket.end===null&&delete bracket.end,bracket.value=typeof bracket.value=="string"?__privateMethod(this,_coerceNumber,coerceNumber_fn).call(this,bracket.value):bracket.value}return value}};_coerceNumber=new WeakSet,coerceNumber_fn=__name2(function(value){const trimmed=value.trim();return/^\d+(?:\.\d+)?$/.test(trimmed)?Number(trimmed):trimmed||0},"#coerceNumber"),__name2(_ResolvableValueField,"ResolvableValueField");let ResolvableValueField=_ResolvableValueField;const _ActorTraitsRuleElement=class extends RuleElementPF2e{static{__name(this,"_ActorTraitsRuleElement")}constructor(data,options){super({...data,priority:99},options),__privateAdd(this,_traitsDictionary),__privateAdd(this,_handleModeAffectingTrait)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),add:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,blank:!1})),remove:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,blank:!1}))}}beforePrepareData(){if(this.test()&&this.actor.system.traits){const traits=this.actor.system.traits,newTraits=this.resolveInjectedProperties(this.add).filter(t=>!traits.value.includes(t)),traitsDictionary=__privateGet(this,_traitsDictionary,traitsDictionary_get);for(const trait of newTraits){if(!(trait in traitsDictionary))return this.failValidation(`${trait} is not a recognized trait`);traits.value.push(trait),this.actor.rollOptions.all[`self:trait:${trait}`]=!0,["construct","undead"].includes(trait)&&__privateMethod(this,_handleModeAffectingTrait,handleModeAffectingTrait_fn).call(this)}const toRemoves=this.resolveInjectedProperties(this.remove);for(const trait of toRemoves)traits.value=traits.value.filter(t=>t!==trait),delete this.actor.rollOptions.all[`self:trait:${trait}`],["construct","undead"].includes(trait)&&__privateMethod(this,_handleModeAffectingTrait,handleModeAffectingTrait_fn).call(this)}}};_traitsDictionary=new WeakSet,traitsDictionary_get=__name2(function(){switch(this.actor.type){case"character":case"familiar":case"npc":return CONFIG.PF2E.creatureTraits;case"hazard":return CONFIG.PF2E.hazardTraits;case"vehicle":return CONFIG.PF2E.vehicleTraits;default:throw ErrorPF2e("unexpected actor type")}},"#traitsDictionary"),_handleModeAffectingTrait=new WeakSet,handleModeAffectingTrait_fn=__name2(function(){const{actor}=this,{rollOptions}=actor;for(const mode of["construct","living","undead"])delete rollOptions.all[`self:mode:${mode}`];rollOptions.all[`self:mode:${actor.modeOfBeing}`]=!0},"#handleModeAffectingTrait"),__name2(_ActorTraitsRuleElement,"ActorTraitsRuleElement"),__publicField(_ActorTraitsRuleElement,"validActorTypes",["character","npc","familiar","hazard","vehicle"]);let ActorTraitsRuleElement=_ActorTraitsRuleElement;const _DegreeOfSuccess=class{static{__name(this,"_DegreeOfSuccess")}constructor(roll,dc,dosAdjustments=null){__privateAdd(this,_getDegreeAdjustment),__privateAdd(this,_adjustDegreeOfSuccess),__privateAdd(this,_adjustDegreeByDieValue),__privateAdd(this,_calculateDegreeOfSuccess),__publicField(this,"value"),__publicField(this,"unadjusted"),__publicField(this,"adjustment"),__publicField(this,"dieResult"),__publicField(this,"rollTotal"),__publicField(this,"dc"),roll instanceof Roll?(this.dieResult=(roll.isDeterministic?roll.terms.find(t=>t instanceof NumericTerm):roll.dice.find(d=>d instanceof Die&&d.faces===20))?.total??1,this.rollTotal=roll.total):(this.dieResult=roll.dieValue,this.rollTotal=roll.dieValue+roll.modifier),this.dc=typeof dc=="number"?{value:dc}:dc,this.unadjusted=__privateMethod(this,_calculateDegreeOfSuccess,calculateDegreeOfSuccess_fn).call(this),this.adjustment=__privateMethod(this,_getDegreeAdjustment,getDegreeAdjustment_fn).call(this,this.unadjusted,dosAdjustments),this.value=this.adjustment?__privateMethod(this,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn).call(this,this.adjustment.amount,this.unadjusted):this.unadjusted}};_getDegreeAdjustment=new WeakSet,getDegreeAdjustment_fn=__name2(function(degree,adjustments){if(!adjustments)return null;for(const outcome of["all",...DEGREE_OF_SUCCESS_STRINGS]){const{label,amount}=adjustments[outcome]??{};if(amount&&label&&!(degree===_DegreeOfSuccess.CRITICAL_SUCCESS&&amount===DEGREE_ADJUSTMENT_AMOUNTS.INCREASE)&&!(degree===_DegreeOfSuccess.CRITICAL_FAILURE&&amount===DEGREE_ADJUSTMENT_AMOUNTS.LOWER)&&(outcome==="all"||DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome)===degree))return{label,amount}}return null},"#getDegreeAdjustment"),_adjustDegreeOfSuccess=new WeakSet,adjustDegreeOfSuccess_fn=__name2(function(amount,degreeOfSuccess){switch(amount){case"criticalFailure":return 0;case"failure":return 1;case"success":return 2;case"criticalSuccess":return 3;default:return Math.clamped(degreeOfSuccess+amount,0,3)}},"#adjustDegreeOfSuccess"),_adjustDegreeByDieValue=new WeakSet,adjustDegreeByDieValue_fn=__name2(function(degree){return this.dieResult===20?__privateMethod(this,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn).call(this,DEGREE_ADJUSTMENT_AMOUNTS.INCREASE,degree):this.dieResult===1?__privateMethod(this,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn).call(this,DEGREE_ADJUSTMENT_AMOUNTS.LOWER,degree):degree},"#adjustDegreeByDieValue"),_calculateDegreeOfSuccess=new WeakSet,calculateDegreeOfSuccess_fn=__name2(function(){const dc=this.dc.value;return this.rollTotal-dc>=10?__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.CRITICAL_SUCCESS):dc-this.rollTotal>=10?__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.CRITICAL_FAILURE):this.rollTotal>=dc?__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.SUCCESS):__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.FAILURE)},"#calculateDegreeOfSuccess"),__name2(_DegreeOfSuccess,"DegreeOfSuccess"),__publicField(_DegreeOfSuccess,"CRITICAL_FAILURE",0),__publicField(_DegreeOfSuccess,"FAILURE",1),__publicField(_DegreeOfSuccess,"SUCCESS",2),__publicField(_DegreeOfSuccess,"CRITICAL_SUCCESS",3);let DegreeOfSuccess=_DegreeOfSuccess;const DEGREE_ADJUSTMENT_AMOUNTS={LOWER_BY_TWO:-2,LOWER:-1,INCREASE:1,INCREASE_BY_TWO:2,TO_CRITICAL_FAILURE:"criticalFailure",TO_FAILURE:"failure",TO_SUCCESS:"success",TO_CRITICAL_SUCCESS:"criticalSuccess"},DEGREE_OF_SUCCESS={CRITICAL_SUCCESS:3,SUCCESS:2,FAILURE:1,CRITICAL_FAILURE:0},DEGREE_OF_SUCCESS_STRINGS=["criticalFailure","failure","success","criticalSuccess"],_AdjustDegreeOfSuccessRuleElement=class extends RuleElementPF2e{static{__name(this,"_AdjustDegreeOfSuccessRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,nullable:!1,blank:!1}),adjustment:new RecordField(new fields2.StringField({required:!0,nullable:!1,choices:["all",...DEGREE_OF_SUCCESS_STRINGS]}),new fields2.StringField({required:!0,nullable:!1,choices:degreeAdjustmentAmountString}),{required:!0,nullable:!1})}}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),adjustments=this.adjustment,stringToAdjustment={"two-degrees-better":DEGREE_ADJUSTMENT_AMOUNTS.INCREASE_BY_TWO,"one-degree-better":DEGREE_ADJUSTMENT_AMOUNTS.INCREASE,"one-degree-worse":DEGREE_ADJUSTMENT_AMOUNTS.LOWER,"two-degrees-worse":DEGREE_ADJUSTMENT_AMOUNTS.LOWER_BY_TWO,"to-critical-failure":DEGREE_ADJUSTMENT_AMOUNTS.TO_CRITICAL_FAILURE,"to-failure":DEGREE_ADJUSTMENT_AMOUNTS.TO_FAILURE,"to-success":DEGREE_ADJUSTMENT_AMOUNTS.TO_SUCCESS,"to-critical-success":DEGREE_ADJUSTMENT_AMOUNTS.TO_CRITICAL_SUCCESS},record=["all",...DEGREE_OF_SUCCESS_STRINGS].reduce((accumulated,outcome)=>{const adjustment=adjustments[outcome];return adjustment&&(accumulated[outcome]={label:this.label,amount:stringToAdjustment[adjustment]}),accumulated},{});(this.actor.synthetics.degreeOfSuccessAdjustments[selector]??=[]).push({adjustments:record,predicate:this.predicate})}};__name2(_AdjustDegreeOfSuccessRuleElement,"AdjustDegreeOfSuccessRuleElement"),__publicField(_AdjustDegreeOfSuccessRuleElement,"validActorTypes",["character","npc"]);let AdjustDegreeOfSuccessRuleElement=_AdjustDegreeOfSuccessRuleElement;const degreeAdjustmentAmountString=["one-degree-better","one-degree-worse","two-degrees-better","two-degrees-worse","to-critical-failure","to-failure","to-success","to-critical-success"],_AELikeRuleElement=class _AELikeRuleElement2 extends RuleElementPF2e{static{__name(this,"_AELikeRuleElement")}constructor(){super(...arguments),__privateAdd(this,_rewriteSkillLongFormPath),__privateAdd(this,_pathIsValid),__privateAdd(this,_logChange)}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema(),PRIORITIES=this.CHANGE_MODE_DEFAULT_PRIORITIES;return baseSchema.priority.initial=d=>PRIORITIES[String(d.mode)]??50,{...baseSchema,mode:new fields2.StringField({required:!0,choices:keys.strict(this.CHANGE_MODE_DEFAULT_PRIORITIES),initial:void 0}),path:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0}),phase:new fields2.StringField({required:!1,nullable:!1,choices:deepClone(this.PHASES),initial:"applyAEs"}),value:new ResolvableValueField({required:!0,nullable:!0,initial:void 0}),merge:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0})}}static validateJoint(data){if(super.validateJoint(data),data.merge){if(data.mode!=="override")throw new foundry.data.validation.DataModelValidationError(' merge: `mode` must be "override"');if(!isObject(data.value))throw new foundry.data.validation.DataModelValidationError(" merge: `value` must an object")}}onApplyActiveEffects(){this.phase==="applyAEs"&&this.applyAELike()}beforePrepareData(){this.phase==="beforeDerived"&&this.applyAELike()}afterPrepareData(){this.phase==="afterDerived"&&this.applyAELike()}beforeRoll(_domains,rollOptions){this.phase==="beforeRoll"&&this.applyAELike(rollOptions)}applyAELike(rollOptions){if(this.ignored)return;const path=__privateMethod(this,_rewriteSkillLongFormPath,rewriteSkillLongFormPath_fn).call(this,this.resolveInjectedProperties(this.path));if(this.ignored)return;if(!__privateMethod(this,_pathIsValid,pathIsValid_fn).call(this,path))return this.failValidation(`no data found at or near "${path}"`);if(rollOptions??=this.predicate.length>0?new Set(this.actor.getRollOptions()):new Set,!this.test(rollOptions))return;const{actor}=this,current=getProperty(actor,path),change=this.resolveValue(this.value),newValue=_AELikeRuleElement2.getNewValue(this.mode,current,change,this.merge);if(newValue instanceof foundry.data.validation.DataModelValidationFailure)return this.failValidation(newValue.asError().message);if(this.mode==="add"&&Array.isArray(current))current.includes(newValue)||current.push(newValue);else if(["subtract","remove"].includes(this.mode)&&Array.isArray(current))current.splice(current.indexOf(newValue),1);else try{setProperty(actor,path,newValue),__privateMethod(this,_logChange,logChange_fn).call(this,change)}catch(error){error instanceof Error?this.failValidation(error.message):console.warn(error)}}static getNewValue(mode,current,change,merge=!1){const{DataModelValidationFailure}=foundry.data.validation,addOrSubtract=__name2(value=>{const isNumericAdd=typeof value=="number"&&(typeof current=="number"||current===void 0||current===null),isArrayAdd=Array.isArray(current)&¤t.every(e=>typeof e==typeof value);return isNumericAdd?(current??0)+value:isArrayAdd?value:new DataModelValidationFailure({invalidValue:value,fallback:!1})},"addOrSubtract");switch(mode){case"multiply":return typeof change!="number"?new DataModelValidationFailure({invalidValue:change,fallback:!1}):typeof current=="number"||current===void 0?Math.trunc((current??0)*change):new DataModelValidationFailure({invalidValue:current,fallback:!1});case"add":return addOrSubtract(change);case"subtract":case"remove":{const addedChange=(typeof current=="number"||current===void 0)&&typeof change=="number"?-1*change:change;return addOrSubtract(addedChange)}case"downgrade":return typeof change!="number"?new DataModelValidationFailure({invalidValue:change,fallback:!1}):typeof current=="number"||current===void 0?Math.min(current??0,change):new DataModelValidationFailure({invalidValue:current,fallback:!1});case"upgrade":return typeof change!="number"?new DataModelValidationFailure({invalidValue:change,fallback:!1}):typeof current=="number"||current===void 0?Math.max(current??0,change):new DataModelValidationFailure({invalidValue:current,fallback:!1});case"override":return merge&&isObject(current)&&isObject(change)?mergeObject(current,change):change;default:return null}}};_SKILL_LONG_FORM_PATH=new WeakMap,_rewriteSkillLongFormPath=new WeakSet,rewriteSkillLongFormPath_fn=__name2(function(path){return path.replace(__privateGet(_AELikeRuleElement,_SKILL_LONG_FORM_PATH),(match,group)=>objectHasKey(SKILL_EXPANDED,group)?`system.skills.${SKILL_EXPANDED[group].shortForm}`:match)},"#rewriteSkillLongFormPath"),_pathIsValid=new WeakSet,pathIsValid_fn=__name2(function(path){const actor=this.item.actor;return path.length>0&&!/\bnull\b/.test(path)&&(path.startsWith("flags.")||[path,path.replace(/\.[-\w]+$/,""),path.replace(/\.?[-\w]+\.[-\w]+$/,"")].some(path2=>getProperty(actor,path2)!==void 0))},"#pathIsValid"),_logChange=new WeakSet,logChange_fn=__name2(function(value){const{item,mode}=this;if(!(!(typeof value=="number"||typeof value=="string")&&typeof value=="string"&&mode!=="override"))return;const level=item instanceof FeatPF2e?Number(/-(\d+)$/.exec(item.system.location??"")?.[1])||item.level:"level"in item&&typeof item.level=="number"?item.level:null,{autoChanges}=this.actor.system;(autoChanges[this.path]??=[]).push({mode,level,value,source:this.item.name})},"#logChange"),__name2(_AELikeRuleElement,"AELikeRuleElement"),__publicField(_AELikeRuleElement,"CHANGE_MODE_DEFAULT_PRIORITIES",{multiply:10,add:20,subtract:20,remove:20,downgrade:30,upgrade:40,override:50}),__publicField(_AELikeRuleElement,"PHASES",["applyAEs","beforeDerived","afterDerived","beforeRoll"]),__privateAdd(_AELikeRuleElement,_SKILL_LONG_FORM_PATH,(()=>{const skillLongForms=Array.from(SKILL_LONG_FORMS).join("|");return new RegExp(String.raw`^system\.skills\.(${skillLongForms})\b`)})());let AELikeRuleElement=_AELikeRuleElement;const _AdjustModifierRuleElement=class extends RuleElementPF2e{static{__name(this,"_AdjustModifierRuleElement")}applications=0;constructor(source,options){source.suppress&&(source.mode="override"),super(source,options),typeof source.selector=="string"&&this.selectors.length===0&&(this.selectors=[source.selector]),this.suppress??=!1,this.maxApplications??=1/0}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema(),PRIORITIES=AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES;return baseSchema.priority.initial=d=>PRIORITIES[String(d.mode)]??50,{...baseSchema,mode:new fields2.StringField({required:!0,choices:keys.strict(AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES),initial:void 0}),selector:new fields2.StringField({required:!1,blank:!1,initial:void 0}),selectors:new StrictArrayField(new fields2.StringField({required:!0,blank:!1})),relabel:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),damageType:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),suppress:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),maxApplications:new fields2.NumberField({required:!1,nullable:!0,initial:null}),value:new ResolvableValueField({required:!1,nullable:!0,initial:null})}}static validateJoint(data){super.validateJoint(data);const{DataModelValidationError}=foundry.data.validation;if(data.suppress===!0){if(typeof data.maxApplications=="number")throw new DataModelValidationError(" use of `maxApplications` in combination with `suppress` is not currently supported")}else if(data.value===null&&!data.damageType)throw new DataModelValidationError(" value: must be provided unless damageType is provided or suppress is true")}beforePrepareData(){if(this.ignored)return;const predicate=new PredicatePF2e(this.resolveInjectedProperties(deepClone([...this.predicate]))),adjustment={slug:this.slug,test:options=>predicate.test([...options,...this.item.getRollOptions("parent")]),suppress:this.suppress,getNewValue:current=>{if(this.value===null)return current;const change=Number(this.resolveValue(this.value));if(Number.isNaN(change))return this.failValidation("value does not resolve to a number"),current;if(this.ignored)return current;this.applications+=1,this.applications===this.maxApplications&&(this.ignored=!0);const newValue=AELikeRuleElement.getNewValue(this.mode,current,change);return newValue instanceof foundry.data.validation.DataModelValidationFailure?(this.failValidation(newValue.asError().message),current):newValue},getDamageType:current=>{if(!this.damageType)return current;const damageType=this.resolveInjectedProperties(this.damageType);return objectHasKey(CONFIG.PF2E.damageTypes,damageType)?damageType:(this.failValidation(`${damageType} is an unrecognized damage type.`),current)}};this.relabel&&(adjustment.relabel=this.getReducedLabel(this.resolveInjectedProperties(this.relabel)));for(const selector of this.selectors.map(s=>this.resolveInjectedProperties(s))){if(selector==="null")continue;(this.actor.synthetics.modifierAdjustments[selector]??=[]).push(adjustment)}}};__name2(_AdjustModifierRuleElement,"AdjustModifierRuleElement");let AdjustModifierRuleElement=_AdjustModifierRuleElement;const _AdjustStrikeRuleElement=class _AdjustStrikeRuleElement2 extends RuleElementPF2e{static{__name(this,"_AdjustStrikeRuleElement")}constructor(data,options){super({...data,priority:110},options)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),mode:new fields2.StringField({required:!0,choices:keys.strict(AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES),initial:void 0}),property:new fields2.StringField({required:!0,choices:Array.from(this.VALID_PROPERTIES),initial:void 0}),definition:new PredicateField,value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0})}}beforePrepareData(){if(!this.test())return;const change=this.resolveValue(this.value),adjustment=(()=>{if(!this.property)throw ErrorPF2e("Unexpected error applying adjustment");const definition=this.resolveInjectedProperties(this.definition);switch(this.property){case"materials":return{adjustDamageRoll:(weapon,{materials})=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of material effects must be used with the "add", "subtract", or "remove" mode.');if(!definition.test(weapon.getRollOptions("item")))return;if(!objectHasKey(CONFIG.PF2E.materialDamageEffects,change))return this.failValidation(`"${change}" is not a supported weapon material effect.`);const method=this.mode==="add"?"add":"delete";materials?.[method](change)}};case"range-increment":return{adjustWeapon:weapon=>{if(weapon.isOfType("melee"))return;if(typeof change!="number")return this.failValidation("Change value is not a number.");if(!definition.test(weapon.getRollOptions("item")))return;const rangeIncrement=weapon.range?.increment;if(typeof rangeIncrement!="number")return this.failValidation("A weapon that meets the definition lacks a range increment.");const newRangeIncrement=AELikeRuleElement.getNewValue(this.mode,rangeIncrement,change);weapon.system.range=newRangeIncrement}};case"traits":return{adjustTraits:(weapon,traits)=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of traits must be used with the "add", "subtract", or "remove" mode.');if(!objectHasKey(CONFIG.PF2E.actionTraits,change))return this.failValidation(`"${change}" is not a recognized action trait.`);definition.test(weapon.getRollOptions("item"))&&(this.mode==="add"&&!traits.includes(change)?traits.push(change):["subtract","remove"].includes(this.mode)&&traits.includes(change)&&traits.splice(traits.indexOf(change),1))}};case"weapon-traits":return{adjustWeapon:weapon=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of weapon traits must be used with the "add", "subtract", or "remove" mode.');if(!objectHasKey(CONFIG.PF2E.weaponTraits,change)&&!(weapon.isOfType("melee")&&objectHasKey(CONFIG.PF2E.npcAttackTraits,change)))return this.failValidation(`"${change}" is not a recognized weapon trait.`);if(!definition.test(weapon.getRollOptions("item"))||weapon.slug==="basic-unarmed"&&/^(?:modular|versatile)/.test(change))return;const traits=weapon.system.traits.value,annotatedTraitMatch=change.match(/^([a-z][-a-z]+)-(\d*d?\d+)$/);if(this.mode==="add"&&annotatedTraitMatch){const changeBaseTrait=annotatedTraitMatch[1],changeValue=annotatedTraitMatch[2],traitRegex=new RegExp(`${changeBaseTrait}-(\\d*d?\\d*)`),existingTraitMatch=traits.map(trait=>trait.match(traitRegex)).find(match=>!!match);if(existingTraitMatch){const existingTrait=existingTraitMatch[1],existingValue=_AdjustStrikeRuleElement2.getTraitScore(existingTrait);_AdjustStrikeRuleElement2.getTraitScore(changeValue)>existingValue&&traits.findSplice(trait=>trait===existingTraitMatch[0],change);return}}this.mode==="add"&&!traits.includes(change)?traits.push(change):this.mode!=="add"&&traits.includes(change)&&traits.splice(traits.indexOf(change),1)}};case"property-runes":return{adjustWeapon:weapon=>{if(weapon.isOfType("melee"))return;if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of weapon property runes must be used with the "add", "subtract", or "remove" mode.');const runeSlug=sluggify(String(change),{camel:"dromedary"});if(!objectHasKey(RUNE_DATA.weapon.property,runeSlug))return this.failValidation(`"${change}" is not a recognized weapon property rune.`);if(!definition.test(weapon.getRollOptions("item")))return;const propertyRunes=weapon.system.runes.property;this.mode==="add"?propertyRunes.push(runeSlug):propertyRunes.includes(runeSlug)&&propertyRunes.splice(propertyRunes.indexOf(runeSlug),1),weapon.system.runes.property=prunePropertyRunes(propertyRunes,RUNE_DATA.weapon.property)}}}})();this.actor.synthetics.strikeAdjustments.push(adjustment)}static getTraitScore(traitValue){const traitValueMatch=traitValue.match(/(\d*)d(\d+)/);return traitValueMatch?Number(traitValueMatch[1]||1)*((Number(traitValueMatch[2])+1)/2):Number(traitValue)}};__name2(_AdjustStrikeRuleElement,"AdjustStrikeRuleElement"),__publicField(_AdjustStrikeRuleElement,"validActorTypes",["character","familiar","npc"]),__publicField(_AdjustStrikeRuleElement,"VALID_PROPERTIES",new Set(["materials","property-runes","range-increment","traits","weapon-traits"]));let AdjustStrikeRuleElement=_AdjustStrikeRuleElement;const _AuraRuleElement=class extends RuleElementPF2e{static{__name(this,"_AuraRuleElement")}constructor(source,options){super(source,options),__privateAdd(this,_processEffects),__privateAdd(this,_processAppearanceData),this.slug??=this.item.slug??sluggify(this.item.name);for(const effect of this.effects)effect.includesSelf??=effect.affects!=="enemies",effect.removeOnExit??=Array.isArray(effect.events)?effect.events.includes("enter"):!1}static defineSchema(){const{fields:fields2}=foundry.data,auraTraitField=new StrictStringField({required:!0,nullable:!1,initial:void 0,choices:{...CONFIG.PF2E.spellTraits,...CONFIG.PF2E.actionTraits}}),effectSchemaField=new fields2.SchemaField({uuid:new StrictStringField({required:!0,blank:!1,nullable:!1,initial:void 0}),affects:new StrictStringField({required:!0,nullable:!1,blank:!1,initial:"all",choices:["allies","enemies","all"],label:"PF2E.RuleEditor.Aura.Effects.Affects"}),events:new StrictArrayField(new StrictStringField({required:!0,blank:!1,nullable:!1,initial:void 0,choices:["enter","turn-start","turn-end"]}),{required:!0,nullable:!1,initial:["enter"],label:"PF2E.RuleEditor.Aura.Effects.Events"}),save:new fields2.SchemaField({type:new StrictStringField({required:!0,nullable:!1,blank:!1,initial:void 0,choices:SAVE_TYPES,label:"PF2E.RuleEditor.Aura.Effects.Type"}),dc:new ResolvableValueField({required:!0,nullable:!1,initial:void 0,label:"PF2E.Check.DC.Unspecific"})},{required:!0,nullable:!0,initial:null,label:"PF2E.SavesHeader"}),predicate:new PredicateField({required:!1,nullable:!1}),removeOnExit:new StrictBooleanField({required:!0,nullable:!1,initial:!0,label:"PF2E.RuleEditor.Aura.Effects.RemoveOnExit"}),includesSelf:new StrictBooleanField({required:!1,nullable:!1,initial:void 0,label:"PF2E.RuleEditor.Aura.Effects.IncludesSelf"})}),xyPairSchema=__name2(({integer})=>({x:new StrictNumberField({required:!0,integer,nullable:!1,initial:void 0,label:"PF2E.RuleEditor.Aura.Appearance.Translation.X"}),y:new StrictNumberField({required:!0,integer,nullable:!1,initial:void 0,label:"PF2E.RuleEditor.Aura.Appearance.Translation.Y"})}),"xyPairSchema"),appearanceSchema={border:new fields2.SchemaField({color:new DataUnionField([new StrictStringField({required:!0,choices:["user-color"],initial:void 0}),new fields2.ColorField({required:!0,nullable:!1,initial:void 0})],{required:!0,nullable:!1,initial:"#000000",label:"PF2E.RuleEditor.Aura.Appearance.Color"}),alpha:new fields2.AlphaField({required:!0,nullable:!1,initial:.75,label:"PF2E.RuleEditor.General.Opacity"})},{required:!1,nullable:!0,initial:()=>({color:"#000000",alpha:.75}),label:"PF2E.RuleEditor.Aura.Appearance.Border"}),highlight:new fields2.SchemaField({color:new DataUnionField([new StrictStringField({required:!0,nullable:!1,choices:["user-color"],initial:void 0}),new fields2.ColorField({required:!0,nullable:!1,initial:void 0})],{required:!0,nullable:!1,initial:"user-color",label:"PF2E.RuleEditor.Aura.Appearance.Color"}),alpha:new fields2.AlphaField({required:!1,nullable:!1,initial:.25,label:"PF2E.RuleEditor.General.Opacity"})},{required:!1,nullable:!1,initial:()=>({color:"user-color",alpha:.25}),label:"PF2E.RuleEditor.Aura.Appearance.Highlight"}),texture:new fields2.SchemaField({src:new StrictStringField({required:!0,nullable:!1,initial:void 0,label:"TOKEN.ImagePath"}),alpha:new fields2.AlphaField({required:!0,nullable:!1,initial:1,label:"PF2E.RuleEditor.General.Opacity"}),scale:new StrictNumberField({required:!0,nullable:!1,positive:!0,initial:1,label:"Scale"}),translation:new fields2.SchemaField(xyPairSchema({integer:!0}),{required:!1,nullable:!0,initial:null,label:"PF2E.RuleEditor.Aura.Appearance.Translation.Label",hint:"PF2E.RuleEditor.Aura.Appearance.Translation.Hint"}),loop:new StrictBooleanField({required:!1,nullable:!1,initial:!0,label:"PF2E.RuleEditor.Aura.Appearance.Loop.Label",hint:"PF2E.RuleEditor.Aura.Appearance.Loop.Hint"}),playbackRate:new StrictNumberField({required:!1,nullable:!1,positive:!0,max:4,initial:1,label:"PF2E.RuleEditor.Aura.Appearance.PlaybackRate.Label",hint:"PF2E.RuleEditor.Aura.Appearance.PlaybackRate.Hint"})},{required:!1,nullable:!0,initial:null,label:"PF2E.RuleEditor.Aura.Appearance.Texture"})};return{...super.defineSchema(),radius:new ResolvableValueField({required:!0,nullable:!1,initial:5,label:"PF2E.RuleEditor.Aura.Basic.Radius"}),level:new ResolvableValueField({required:!1,nullable:!0,initial:null,label:"PF2E.RuleEditor.Aura.Basic.Level.Label",hint:"PF2E.RuleEditor.Aura.Basic.Level.Hint"}),traits:new StrictArrayField(auraTraitField,{required:!0,nullable:!1,label:"PF2E.TraitsLabel"}),effects:new StrictArrayField(effectSchemaField,{required:!0,nullable:!1,label:"PF2E.RuleEditor.Aura.Effects.Label"}),appearance:new fields2.SchemaField(appearanceSchema,{required:!0,nullable:!1,initial:()=>({border:{color:"#000000",alpha:.75},highlight:{color:"user-color",alpha:.25},texture:null}),label:"PF2E.RuleEditor.Aura.Appearance.Label"}),mergeExisting:new StrictBooleanField({required:!0,nullable:!1,initial:!0,label:"PF2E.RuleEditor.Aura.Basic.MergeExisting.Label",hint:"PF2E.RuleEditor.Aura.Basic.MergeExisting.Hint"})}}afterPrepareData(){if(!this.test())return;const radius=Math.clamped(Math.ceil(Number(this.resolveValue(this.radius))/5)*5,5,240);if(Number.isInteger(radius)&&radius>0){const level=this.resolveValue(this.level,null),data={slug:this.slug,radius,level:typeof level=="number"?Math.trunc(level):this.item.isOfType("effect")?this.item.level:null,effects:__privateMethod(this,_processEffects,processEffects_fn).call(this),traits:uniq(this.traits.filter(t=>t!=="aura")).sort(),appearance:__privateMethod(this,_processAppearanceData,processAppearanceData_fn).call(this)};for(const effect of data.effects){const indexEntry=fromUuidSync(effect.uuid);if(!(indexEntry&&"type"in indexEntry&&typeof indexEntry.type=="string")){this.failValidation(`Unable to resolve effect uuid: ${effect.uuid}`);return}["effect","affliction"].includes(indexEntry.type)||this.failValidation('effects transmitted by auras must be of type "effect" or "affliction"')}const existing=this.actor.auras.get(this.slug);if(existing&&this.mergeExisting){existing.radius=data.radius,existing.traits=uniq([...existing.traits,...data.traits]).sort(),existing.appearance=data.appearance;for(const effect of data.effects){const existingIndex=existing.effects.findIndex(e=>e.uuid===effect.uuid);existingIndex!==-1?existing.effects.splice(existingIndex,1,effect):existing.effects.push(effect)}}else this.actor.auras.set(this.slug,data)}}};_processEffects=new WeakSet,processEffects_fn=__name2(function(){return this.effects.map(e=>({...e,uuid:this.resolveInjectedProperties(e.uuid),save:null}))},"#processEffects"),_processAppearanceData=new WeakSet,processAppearanceData_fn=__name2(function(){const appearance=deepClone(this.appearance),{border,highlight,texture}=appearance,textureSrc=(()=>{if(!texture)return null;const maybeTextureSrc=this.resolveInjectedProperties(texture.src);return isImageOrVideoPath(maybeTextureSrc)?maybeTextureSrc:"icons/svg/hazard.svg"})();return border&&(border.color=border.color==="user-color"?userColorForActor(this.actor):border.color),highlight.color=highlight.color==="user-color"?userColorForActor(this.actor):highlight.color,{border:border&&{color:Number(Color.fromString(border.color)),alpha:border.alpha},highlight:{color:Number(Color.fromString(highlight.color)),alpha:highlight.alpha},texture:texture?.alpha&&textureSrc?{...texture,src:textureSrc}:null}},"#processAppearanceData"),__name2(_AuraRuleElement,"AuraRuleElement");let AuraRuleElement=_AuraRuleElement;const _BaseSpeedRuleElement=class extends RuleElementPF2e{static{__name(this,"_BaseSpeedRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_createMovementType),this.selector=this.selector?.trim().replace(/-speed$/,""),typeof this.value=="string"||typeof this.value=="number"||this.isBracketedValue(this.value)||this.failValidation("A value must be a number, string, or bracketed value")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1,initial:void 0}),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0})}}beforePrepareData(){if(this.ignored)return;const speedType=this.resolveInjectedProperties(this.selector);if(!tupleHasValue(MOVEMENT_TYPES,speedType))return this.failValidation("Unrecognized or missing selector");const speed=__privateMethod(this,_createMovementType,createMovementType_fn).call(this,speedType);(this.actor.synthetics.movementTypes[speedType]??=[]).push(speed)}};_createMovementType=new WeakSet,createMovementType_fn=__name2(function(type){return()=>{if(!this.test())return null;const value=Math.trunc(Number(this.resolveValue(this.value)));if(!Number.isInteger(value))return this.failValidation("Failed to resolve value"),null;const derivedFromLand=type!=="land"&&typeof this.value=="string"&&/attributes\.speed\.(?:value|total)/.test(this.value);return value>0?{type,value,source:this.item.name,derivedFromLand}:null}},"#createMovementType"),__name2(_BaseSpeedRuleElement,"BaseSpeedRuleElement"),__publicField(_BaseSpeedRuleElement,"validActorTypes",["character","familiar","npc"]);let BaseSpeedRuleElement=_BaseSpeedRuleElement;const ALIGNMENTS=new Set(["LG","NG","CG","LN","N","CN","LE","NE","CE"]),ALIGNMENT_TRAITS=new Set(["chaotic","evil","good","lawful"]),ALLIANCES=new Set(["party","opposition",null]),SAVING_THROW_DEFAULT_ATTRIBUTES={fortitude:"con",reflex:"dex",will:"wis"},SIZE_TO_REACH={tiny:0,sm:5,med:5,lg:5,huge:10,grg:15},SENSES_WITH_MANDATORY_ACUITIES={darkvision:"precise",heatsight:"precise",greaterDarkvision:"precise",lowLightVision:"precise",seeInvisibility:"precise"},_CreatureSensePF2e=class{static{__name(this,"_CreatureSensePF2e")}type;acuity;value;source;get range(){return Number(this.value)||1/0}constructor(data){this.type=data.type,this.acuity=objectHasKey(SENSES_WITH_MANDATORY_ACUITIES,this.type)?SENSES_WITH_MANDATORY_ACUITIES[this.type]:data.acuity??"precise",this.value=data.value??"",this.source=data.source||void 0}get label(){const buildLabel=__name2((type,acuity,range2)=>{const senses2=CONFIG.PF2E.senses,sense=game.i18n.localize(senses2[type]??"")||type,acuityLabel=acuity?game.i18n.localize(CONFIG.PF2E.senseAcuity[acuity]):null;return acuity&&range2?game.i18n.format("PF2E.Actor.Creature.Sense.WithAcuityAndRange",{sense,acuity:acuityLabel,range:range2}):acuity?game.i18n.format("PF2E.Actor.Creature.Sense.WithAcuity",{sense,acuity:acuityLabel}):sense},"buildLabel"),range=this.range<1/0?this.range:void 0;switch(this.type){case"darkvision":case"greaterDarkvision":case"lowLightVision":case"seeInvisibility":return buildLabel(this.type);case"scent":return this.acuity==="vague"?null:buildLabel(this.type,this.acuity,range);default:return buildLabel(this.type,this.acuity,range)}}isMoreAcuteThan(sense){return this.acuity==="precise"&&["imprecise","vague"].includes(sense.acuity??"precise")||this.acuity==="imprecise"&&sense.acuity==="vague"}hasLongerRangeThan(sense){return this.range>Number(sense.value)}};__name2(_CreatureSensePF2e,"CreatureSensePF2e");let CreatureSensePF2e=_CreatureSensePF2e;const SENSE_ACUITIES=["precise","imprecise","vague"],SENSE_TYPES=new Set(["darkvision","echolocation","greaterDarkvision","heatsight","lifesense","lowLightVision","motionsense","scent","seeInvisibility","spiritsense","thoughtsense","tremorsense","wavesense"]),CONDITION_SLUGS=new Set(["blinded","broken","clumsy","concealed","confused","controlled","dazzled","deafened","doomed","drained","dying","encumbered","enfeebled","fascinated","fatigued","fleeing","friendly","frightened","grabbed","helpful","hidden","hostile","immobilized","indifferent","invisible","malevolence","observed","off-guard","paralyzed","persistent-damage","petrified","prone","quickened","restrained","sickened","slowed","stunned","stupefied","unconscious","undetected","unfriendly","unnoticed","wounded"]),_IWR=class{static{__name(this,"_IWR")}constructor(data){__publicField(this,"type"),__publicField(this,"exceptions"),__publicField(this,"definition"),__publicField(this,"source"),__privateAdd(this,_customLabel,void 0),this.type=data.type,this.exceptions=deepClone(data.exceptions??[]),this.definition=data.definition??null,this.source=data.source??null,__privateSet(this,_customLabel,this.type==="custom"?data.customLabel??null:null)}get applicationLabel(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),key=`Exceptions${this.exceptions.length}DoubleVs0`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,...exceptions,value:""}).replace(/\s+/g," ").trim()}get typeLabel(){return game.i18n.localize(__privateGet(this,_customLabel)??this.typeLabels[this.type])}describe(iwrType){if(setHasElement(CONDITION_SLUGS,iwrType))return["item:type:condition",`item:slug:${iwrType}`];if(isObject(iwrType))return iwrType.definition;switch(iwrType){case"air":case"earth":case"metal":case"radiation":case"visual":case"water":case"wood":return[`item:trait:${iwrType}`];case"all-damage":return["damage"];case"area-damage":return["area-damage"];case"arrow-vulnerability":return["item:group:bow",{not:"item:tag:crossbow"}];case"auditory":return["item:trait:auditory"];case"axe-vulnerability":return["item:group:axe"];case"critical-hits":return["damage:component:critical"];case"custom":return this.definition??[];case"damage-from-spells":return["damage","item:type:spell","impulse"];case"disease":return["item:trait:disease"];case"emotion":return["item:type:effect","item:trait:emotion"];case"energy":case"physical":return[`damage:category:${iwrType}`];case"fear-effects":return["item:type:effect","item:trait:fear"];case"ghost-touch":return["item:rune:property:ghost-touch"];case"magical":return["item:magical"];case"mental":return[{or:["damage:type:mental",{and:["item:type:effect","item:trait:mental"]}]}];case"non-magical":return[{not:"item:magical"}];case"object-immunities":return[{or:["damage:type:bleed","damage:type:mental","damage:type:poison","damage:type:spirit",{and:["item:type:condition",{or:["item:slug:doomed","item:slug:drained","item:slug:fatigued","item:slug:paralyzed","item:slug:sickened","item:slug:unconscious"]}]}]}];case"precision":case"splash-damage":return[`damage:component:${iwrType==="splash-damage"?"splash":"precision"}`];case"spells":return["damage",{or:["item:type:spell","item:from-spell","impulse"]}];case"unarmed-attacks":return["item:category:unarmed"];default:{if(iwrType in CONFIG.PF2E.damageTypes)return[`damage:type:${iwrType}`];if(objectHasKey(CONFIG.PF2E.materialDamageEffects,iwrType))switch(iwrType){case"adamantine":return[{or:["damage:material:adamantine","damage:material:keep-stone"]}];case"cold-iron":return[{or:["damage:material:cold-iron","damage:material:sovereign-steel"]}];case"darkwood":return[{or:["damage:material:darkwood",{and:["self:mode:undead","damage:material:peachwood"]}]}];case"silver":return[{or:["damage:material:silver","damage:material:mithral"]}];default:return[`damage:material:${iwrType}`]}return setHasElement(MAGIC_SCHOOLS,iwrType)?["item:type:effect",`item:trait:${iwrType}`]:[`unhandled:${iwrType}`]}}}get predicate(){const typeStatements=this.describe(this.type),exceptions=this.exceptions.flatMap(exception=>{const described=this.describe(exception).filter(s=>s!=="damage");return described.length===1?described:{and:described}}),statements=[typeStatements,exceptions.length===0?[]:exceptions.length===1?{not:exceptions[0]}:{nor:exceptions}].flat();return new PredicatePF2e(statements)}toObject(){return{type:this.type,exceptions:deepClone(this.exceptions),source:this.source,label:this.label}}createFormatData({list,prefix}){return list.slice(0,4).map((exception,index)=>{const label=typeof exception=="string"?this.typeLabels[exception]:exception.label;return{[`${prefix}${index+1}`]:game.i18n.localize(label)}}).reduce((accum,obj)=>({...accum,...obj}),{})}test(statements){return this.predicate.test(statements)}};_customLabel=new WeakMap,__name2(_IWR,"IWR");let IWR=_IWR;const _Immunity=class extends IWR{static{__name(this,"_Immunity")}typeLabels=CONFIG.PF2E.immunityTypes;get label(){return this.applicationLabel}};__name2(_Immunity,"Immunity");let Immunity=_Immunity;const _Weakness=class extends IWR{static{__name(this,"_Weakness")}typeLabels=CONFIG.PF2E.weaknessTypes;value;constructor(data){super(data),this.value=data.value}get label(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),key=`Exceptions${this.exceptions.length}DoubleVs0`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,value:this.value,...exceptions})}toObject(){return{...super.toObject(),value:this.value}}};__name2(_Weakness,"Weakness");let Weakness=_Weakness;const _Resistance=class extends IWR{static{__name(this,"_Resistance")}typeLabels=CONFIG.PF2E.resistanceTypes;value;doubleVs;constructor(data){super(data),this.value=data.value,this.doubleVs=deepClone(data.doubleVs??[])}get label(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),doubleVs=this.createFormatData({list:this.doubleVs,prefix:"doubleVs"}),key=`Exceptions${this.exceptions.length}DoubleVs${this.doubleVs.length}`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,value:this.value,...exceptions,...doubleVs})}get applicationLabel(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),doubleVs=this.createFormatData({list:this.doubleVs,prefix:"doubleVs"}),key=`Exceptions${this.exceptions.length}DoubleVs${this.doubleVs.length}`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,value:"",...exceptions,...doubleVs}).replace(/\s+/g," ").trim()}toObject(){return{...super.toObject(),value:this.value,doubleVs:deepClone(this.doubleVs)}}getDoubledValue(damageDescription){return this.doubleVs.length===0?this.value:new PredicatePF2e(this.doubleVs.flatMap(d=>this.describe(d))).test(damageDescription)?this.value*2:this.value}};__name2(_Resistance,"Resistance");let Resistance=_Resistance;const NON_DAMAGE_WEAKNESSES=new Set(["air","earth","ghost-touch","metal","plant","radiation","salt","salt-water","spells","water","wood"]),_AttackTraitHelpers=class{static{__name(this,"_AttackTraitHelpers")}static getLabel(traitOrTag){const traits=CONFIG.PF2E.weaponTraits,tags=CONFIG.PF2E.otherWeaponTags;return traits[traitOrTag]??tags[traitOrTag]??traitOrTag}static getUnannotatedTrait(trait){return trait.replace(/-d?\d{1,3}$/,"")}static createAttackModifiers({item}){const{actor}=item;if(!actor)throw ErrorPF2e("The weapon must be embedded");return item.system.traits.value.flatMap(trait=>{const unannotatedTrait=this.getUnannotatedTrait(trait);switch(unannotatedTrait){case"volley":{if(!item.range?.increment)return[];const penaltyRange=Number(/-(\d+)$/.exec(trait)[1]);return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:-2,type:"untyped",ignored:!0,predicate:new PredicatePF2e({lte:["target:distance",penaltyRange]},{not:"self:ignore-volley-penalty"})})}case"sweep":return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:1,type:"circumstance",predicate:new PredicatePF2e("sweep-bonus")});case"backswing":return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:1,type:"circumstance",predicate:new PredicatePF2e("backswing-bonus")});default:return[]}})}};__name2(_AttackTraitHelpers,"AttackTraitHelpers");let AttackTraitHelpers=_AttackTraitHelpers;function setImmunitiesFromTraits(actor){if(actor.isOfType("character"))return;const{traits}=actor,{immunities}=actor.attributes;if(traits.has("construct")&&!traits.has("eidolon")){const constructImmunities=["bleed","death-effects","disease","doomed","drained","fatigued","healing","necromancy","nonlethal-attacks","paralyzed","poison","sickened","spirit","unconscious"];for(const immunityType of constructImmunities)immunities.some(i=>i.type===immunityType)||immunities.push(new Immunity({type:immunityType,source:game.i18n.localize("PF2E.TraitConstruct")}))}traits.has("mindless")&&!immunities.some(i=>i.type==="mental")&&immunities.push(new Immunity({type:"mental",source:game.i18n.localize("PF2E.TraitMindless")}))}__name(setImmunitiesFromTraits,"setImmunitiesFromTraits"),__name2(setImmunitiesFromTraits,"setImmunitiesFromTraits");function imposeEncumberedCondition(actor){if(game.settings.get("pf2e","automation.encumbrance")&&actor.inventory.bulk.isEncumbered&&actor.conditions.bySlug("encumbered").length===0){const source=game.pf2e.ConditionManager.getCondition("encumbered").toObject(),encumbered=new ConditionPF2e(mergeObject(source,{_id:"xxxENCUMBEREDxxx"}),{parent:actor});encumbered.prepareSiblingData(),encumbered.prepareActorData();for(const rule of encumbered.prepareRuleElements())rule.beforePrepareData?.();actor.conditions.set(encumbered.id,encumbered)}}__name(imposeEncumberedCondition,"imposeEncumberedCondition"),__name2(imposeEncumberedCondition,"imposeEncumberedCondition");const _WeaponTraitToggles=class{static{__name(this,"_WeaponTraitToggles")}constructor(weapon){__privateAdd(this,_resolveOptions),__privateAdd(this,_weapon,void 0),__privateSet(this,_weapon,weapon)}get modular(){const options=__privateMethod(this,_resolveOptions,resolveOptions_fn).call(this,"modular"),sourceSelection=__privateGet(this,_weapon)._source.system.traits.toggles?.modular?.selection,selection=tupleHasValue(options,sourceSelection)?sourceSelection:options.includes(__privateGet(this,_weapon).system.damage.damageType)?__privateGet(this,_weapon).system.damage.damageType:null;return{options,selection}}get versatile(){const options=__privateMethod(this,_resolveOptions,resolveOptions_fn).call(this,"versatile"),sourceSelection=__privateGet(this,_weapon)._source.system.traits.toggles?.versatile?.selection??null,selection=tupleHasValue(options,sourceSelection)?sourceSelection:null;return{options,selection}}};_weapon=new WeakMap,_resolveOptions=new WeakSet,resolveOptions_fn=__name2(function(toggle){const types=__privateGet(this,_weapon).system.traits.value.filter(t=>t.startsWith(toggle)).flatMap(trait=>{if(trait==="modular")return["bludgeoning","piercing","slashing"];const damageType=/^versatile-(\w+)$/.exec(trait)?.at(1);switch(damageType){case"b":return"bludgeoning";case"p":return"piercing";case"s":return"slashing";default:return objectHasKey(CONFIG.PF2E.damageTypes,damageType)?damageType:[]}}),allOptions=Array.from(new Set(types));return toggle==="modular"?allOptions:allOptions.filter(t=>__privateGet(this,_weapon).system.damage.damageType!==t)},"#resolveOptions"),__name2(_WeaponTraitToggles,"WeaponTraitToggles");let WeaponTraitToggles=_WeaponTraitToggles;async function toggleWeaponTrait({weapon,trait,selection}){if(weapon.system.traits.toggles[trait].selection===selection)return!1;const item=weapon.actor?.items.get(weapon.id);return item?.isOfType("weapon")&&item===weapon?await item.update({[`system.traits.toggles.${trait}.selection`]:selection}):item?.isOfType("weapon")&&weapon.altUsageType==="melee"?item.update({[`system.meleeUsage.traitToggles.${trait}`]:selection}):await item?.rules.find(r=>r.key==="Strike"&&!r.ignored&&r.slug===weapon.slug)?.toggleTrait({trait,selection}),!0}__name(toggleWeaponTrait,"toggleWeaponTrait"),__name2(toggleWeaponTrait,"toggleWeaponTrait");function createSheetOptions(options,selections=[],{selected=!1}={}){const sheetOptions=Object.entries(options).reduce((compiledOptions,[stringKey,label])=>{const selectionList=Array.isArray(selections)?selections:selections.value,key=typeof selectionList[0]=="number"?Number(stringKey):stringKey,isSelected=selectionList.includes(key);return(isSelected||!selected)&&(compiledOptions[key]={label:game.i18n.localize(label),value:stringKey,selected:isSelected}),compiledOptions},{});return sortLabeledRecord(sheetOptions)}__name(createSheetOptions,"createSheetOptions"),__name2(createSheetOptions,"createSheetOptions");function createSheetTags(options,selections){return createSheetOptions(options,selections,{selected:!0})}__name(createSheetTags,"createSheetTags"),__name2(createSheetTags,"createSheetTags");function createTagifyTraits(traits,{sourceTraits,record}){const sourceSet=new Set(sourceTraits),traitSlugs=[...traits],readonlyTraits=traitSlugs.filter(t=>!sourceSet.has(t));return traitSlugs.map(slug=>{const label=game.i18n.localize(record?.[slug]??slug);return{id:slug,value:label,readonly:readonlyTraits.includes(slug)}}).sort((t1,t2)=>t1.value.localeCompare(t2.value))}__name(createTagifyTraits,"createTagifyTraits"),__name2(createTagifyTraits,"createTagifyTraits");function processTagifyInSubmitData(form,data){const tagifyInputElements=form.querySelectorAll("tags.tagify ~ input");for(const inputEl of tagifyInputElements.values()){const path=inputEl.name,inputValue=data[path],selections=inputValue&&typeof inputValue=="string"?JSON.parse(inputValue):inputValue;Array.isArray(selections)&&(data[path]=selections.filter(s=>!s.readonly).map(s=>s.id??s.value))}}__name(processTagifyInSubmitData,"processTagifyInSubmitData"),__name2(processTagifyInSubmitData,"processTagifyInSubmitData");function getAdjustment(value,reference){const adjustedHigher=value>reference,adjustedLower=value{const unannotatedTrait=this.getUnannotatedTrait(trait);switch(unannotatedTrait){case"kickback":return new ModifierPF2e({slug:unannotatedTrait,label:CONFIG.PF2E.weaponTraits.kickback,modifier:-2,type:"circumstance",predicate:new PredicatePF2e({lt:["attribute:str:mod",2]}),adjustments:extractModifierAdjustments(synthetics,domains,unannotatedTrait)});case"improvised":return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:-2,type:"item",predicate:new PredicatePF2e({not:"self:ignore-improvised-penalty"}),adjustments:extractModifierAdjustments(synthetics,domains,unannotatedTrait)});default:return[]}});return[...super.createAttackModifiers({item}),...pcSpecificModifiers]}};__name2(_PCAttackTraitHelpers,"PCAttackTraitHelpers");let PCAttackTraitHelpers=_PCAttackTraitHelpers;const _WeaponAuxiliaryAction=class{static{__name(this,"_WeaponAuxiliaryAction")}weapon;action;actions;carryType;hands;purpose;fullPurpose;constructor({weapon,action:action2,purpose,hands}){this.weapon=weapon,this.action=action2,this.purpose=purpose,this.hands=hands??null;const[actions,carryType,fullPurpose]=(()=>{switch(purpose){case"Draw":return[1,"held",`${purpose}${hands}H`];case"PickUp":return[1,"held",`${purpose}${hands}H`];case"Retrieve":{const{container}=weapon;return[container?.system.usage.type==="worn"&&container.isWorn?1:container?.isHeld?2:3,"held",`${purpose}${hands}H`]}case"Grip":return[action2==="Interact"?1:0,"held",purpose];case"Sheathe":return[1,"worn",purpose];case"Modular":return[1,null,purpose];case"Drop":return[0,"dropped",purpose]}})();this.actions=actions,this.carryType=carryType,this.fullPurpose=fullPurpose}get actor(){return this.weapon.parent}get label(){return game.i18n.localize(`PF2E.Actions.${this.action}.${this.fullPurpose}.Title`)}get glyph(){return getActionGlyph(this.actions)}get options(){return this.purpose==="Modular"?createSheetOptions(pick(CONFIG.PF2E.damageTypes,this.weapon.system.traits.toggles.modular.options),[this.weapon.system.traits.toggles.modular.selection??[]].flat()):null}async execute({selection=null}={}){const{actor,weapon}=this;if(typeof this.carryType=="string")await actor.adjustCarryType(this.weapon,{carryType:this.carryType,handsHeld:this.hands??0});else if(selection&&tupleHasValue(weapon.system.traits.toggles.modular.options,selection)&&!await toggleWeaponTrait({weapon,trait:"modular",selection}))return;if(!game.combat)return;const templates={flavor:"./systems/pf2e/templates/chat/action/flavor.hbs",content:"./systems/pf2e/templates/chat/action/content.hbs"},flavorAction={title:`PF2E.Actions.${this.action}.Title`,subtitle:`PF2E.Actions.${this.action}.${this.fullPurpose}.Title`,glyph:this.glyph},flavor=await renderTemplate(templates.flavor,{action:flavorAction,traits:[traitSlugToObject("manipulate",CONFIG.PF2E.actionTraits)]}),content=await renderTemplate(templates.content,{imgPath:weapon.img,message:game.i18n.format(`PF2E.Actions.${this.action}.${this.fullPurpose}.Description`,{actor:actor.name,weapon:weapon.name,damageType:game.i18n.localize(`PF2E.Damage.RollFlavor.${selection}`)})}),token=actor.getActiveTokens(!1,!0).shift();await ChatMessagePF2e.create({content,speaker:ChatMessagePF2e.getSpeaker({actor,token}),flavor,type:CONST.CHAT_MESSAGE_TYPES.EMOTE})}};__name2(_WeaponAuxiliaryAction,"WeaponAuxiliaryAction");let WeaponAuxiliaryAction=_WeaponAuxiliaryAction;function imposeOversizedWeaponCondition(actor){const wieldedOversizedWeapon=actor.itemTypes.weapon.find(w=>w.isEquipped&&w.isOversized&&w.category!=="unarmed"),compendiumCondition=game.pf2e.ConditionManager.getCondition("clumsy"),conditionSource=wieldedOversizedWeapon&&actor.conditions.bySlug("clumsy").length===0?mergeObject(compendiumCondition.toObject(),{_id:"xxxxOVERSIZExxxx",system:{slug:"clumsy",references:{parent:{id:wieldedOversizedWeapon.id}}}}):null;if(!conditionSource)return;const clumsyOne=new ConditionPF2e(conditionSource,{parent:actor});clumsyOne.prepareSiblingData(),clumsyOne.prepareActorData();for(const rule of clumsyOne.prepareRuleElements())rule.beforePrepareData?.()}__name(imposeOversizedWeaponCondition,"imposeOversizedWeaponCondition"),__name2(imposeOversizedWeaponCondition,"imposeOversizedWeaponCondition");function createForceOpenPenalty(actor,domains){const slug="no-crowbar",{modifierAdjustments}=actor.synthetics;return new ModifierPF2e({slug,label:"PF2E.Actions.ForceOpen.NoCrowbarPenalty",type:"item",modifier:-2,predicate:["action:force-open","action:force-open:prying"],hideIfDisabled:!0,adjustments:extractModifierAdjustments(modifierAdjustments,domains,slug)})}__name(createForceOpenPenalty,"createForceOpenPenalty"),__name2(createForceOpenPenalty,"createForceOpenPenalty");function createShoddyPenalty(actor,item,domains){if(!actor.isOfType("character")||!item?.isShoddy)return null;const slug="shoddy";return new ModifierPF2e({label:"PF2E.Item.Physical.OtherTag.Shoddy",type:"item",slug,modifier:-2,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,slug)})}__name(createShoddyPenalty,"createShoddyPenalty"),__name2(createShoddyPenalty,"createShoddyPenalty");function createHinderingPenalty(actor){const slug="hindering";return actor.wornArmor?.traits.has(slug)?new ModifierPF2e({label:"PF2E.TraitHindering",type:"untyped",slug,modifier:-5,adjustments:[]}):null}__name(createHinderingPenalty,"createHinderingPenalty"),__name2(createHinderingPenalty,"createHinderingPenalty");function createPonderousPenalty(actor){const armor=actor.wornArmor,slug="ponderous";if(!armor?.traits.has(slug))return null;const penaltyValue=actor.abilities.str.mod>=(armor.strength??-1/0)?-1:armor.checkPenalty||-1;return new ModifierPF2e({label:"PF2E.TraitPonderous",type:"untyped",slug,modifier:penaltyValue,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,["all","initiative"],slug)})}__name(createPonderousPenalty,"createPonderousPenalty"),__name2(createPonderousPenalty,"createPonderousPenalty");const adjustmentScale=["incredibly-easy","very-easy","easy","normal","hard","very-hard","incredibly-hard"],dcAdjustments=new Map([["incredibly-easy",-10],["very-easy",-5],["easy",-2],["normal",0],["hard",2],["very-hard",5],["incredibly-hard",10]]),dcByLevel=new Map([[-1,13],[0,14],[1,15],[2,16],[3,18],[4,19],[5,20],[6,22],[7,23],[8,24],[9,26],[10,27],[11,28],[12,30],[13,31],[14,32],[15,34],[16,35],[17,36],[18,38],[19,39],[20,40],[21,42],[22,44],[23,46],[24,48],[25,50]]),simpleDCs=new Map([["untrained",10],["trained",15],["expert",20],["master",30],["legendary",40]]),simpleDCsWithoutLevel=new Map([["untrained",10],["trained",15],["expert",20],["master",25],["legendary",30]]);function rarityToDCAdjustment(rarity="common"){switch(rarity){case"uncommon":return"hard";case"rare":return"very-hard";case"unique":return"incredibly-hard";default:return"normal"}}__name(rarityToDCAdjustment,"rarityToDCAdjustment"),__name2(rarityToDCAdjustment,"rarityToDCAdjustment");function adjustDC(dc,adjustment="normal"){return dc+(dcAdjustments.get(adjustment)??0)}__name(adjustDC,"adjustDC"),__name2(adjustDC,"adjustDC");function adjustDCByRarity(dc,rarity="common"){return adjustDC(dc,rarityToDCAdjustment(rarity))}__name(adjustDCByRarity,"adjustDCByRarity"),__name2(adjustDCByRarity,"adjustDCByRarity");function calculateDC(level,{proficiencyWithoutLevel,rarity="common"}={}){proficiencyWithoutLevel??=game.settings.get("pf2e","proficiencyVariant");const dc=dcByLevel.get(level)??14;return adjustDCByRarity(proficiencyWithoutLevel?dc-Math.max(level,0):dc,rarity)}__name(calculateDC,"calculateDC"),__name2(calculateDC,"calculateDC");function calculateSimpleDC(rank,{proficiencyWithoutLevel=!1}={}){return proficiencyWithoutLevel?simpleDCsWithoutLevel.get(rank)??10:simpleDCs.get(rank)??10}__name(calculateSimpleDC,"calculateSimpleDC"),__name2(calculateSimpleDC,"calculateSimpleDC");function combineDCAdjustments(first,second){const startingIndex=adjustmentScale.indexOf(first),lowerByIndex=adjustmentScale.indexOf(second),resultIndex=Math.min(Math.max(startingIndex+lowerByIndex-3,0),6);return adjustmentScale[resultIndex]}__name(combineDCAdjustments,"combineDCAdjustments"),__name2(combineDCAdjustments,"combineDCAdjustments");function createDifficultyScale(dc,startAt){const beginAtIndex=adjustmentScale.indexOf(startAt);return adjustmentScale.filter((_value2,index)=>index>=beginAtIndex).map(value=>adjustDC(dc,value))}__name(createDifficultyScale,"createDifficultyScale"),__name2(createDifficultyScale,"createDifficultyScale");function loreSkillsFromActors(actors){const characters=(Array.isArray(actors)?actors:[actors]).filter(a=>a?.type==="character");return Object.fromEntries(characters.flatMap(m=>Object.values(m.skills)).filter(s=>!!s?.lore).map(s=>[s.slug,s.label]))}__name(loreSkillsFromActors,"loreSkillsFromActors"),__name2(loreSkillsFromActors,"loreSkillsFromActors");async function getActions(){const indexFields=["system.slug"],pack=game.packs.get("pf2e.actionspf2e");if(pack){const actions=(await pack.getIndex({fields:indexFields})).map(a=>[a.system.slug,a.name]);return Object.fromEntries(actions)}else return{}}__name(getActions,"getActions"),__name2(getActions,"getActions");const _CheckPromptDialog=class extends Application{static{__name(this,"_CheckPromptDialog")}constructor(){super(...arguments),__privateAdd(this,_prepareProficiencyRanks),__privateAdd(this,_prepareDCAdjustments),__privateAdd(this,_generatePrompt),__privateAdd(this,_htmlQueryTags),__privateAdd(this,_formatLoreType),__privateAdd(this,_formatActionType),__privateAdd(this,_getDC),__privateAdd(this,_constructCheck),__privateAdd(this,_actions,void 0),__privateAdd(this,_lores,void 0)}static get defaultOptions(){return{...super.defaultOptions,classes:["dialog"],id:"generate-check-prompt",tabs:[{navSelector:".skill-save-navigation",contentSelector:".check-prompt-content",initial:"skills"},{navSelector:".dc-navigation",contentSelector:".dc-content",initial:"set-dc"}],template:"systems/pf2e/templates/gm/check-prompt.hbs",title:game.i18n.localize("PF2E.Actor.Party.CheckPrompt.Title"),width:400,height:"auto"}}async getData(){return __privateSet(this,_actions,await getActions()),__privateSet(this,_lores,loreSkillsFromActors(this.options.actors??game.actors.party?.members??[])),{proficiencyRanks:__privateMethod(this,_prepareProficiencyRanks,prepareProficiencyRanks_fn).call(this),dcAdjustments:__privateMethod(this,_prepareDCAdjustments,prepareDCAdjustments_fn).call(this)}}activateListeners($html){const html=$html[0],skillEl=html.querySelector("input#check-prompt-skills"),skills={...omit(CONFIG.PF2E.skillList,["lore"]),perception:"PF2E.PerceptionLabel"};tagify$1(skillEl,{whitelist:skills});const saveEl=html.querySelector("input#check-prompt-saves");tagify$1(saveEl,{whitelist:CONFIG.PF2E.saves});const loreEl=html.querySelector("input#check-prompt-lores"),loreOptions=isEmpty(__privateGet(this,_lores)||{})?{}:{whitelist:__privateGet(this,_lores)};tagify$1(loreEl,loreOptions);const actionEl=html.querySelector("input#check-prompt-actions"),actionOptions=isEmpty(__privateGet(this,_actions)||{})?{}:{whitelist:__privateGet(this,_actions),enforceWhitelist:!1};tagify$1(actionEl,actionOptions);const traitEl=html.querySelector("input#check-prompt-traits");tagify$1(traitEl,{whitelist:CONFIG.PF2E.actionTraits,enforceWhitelist:!1}),html.querySelector("div.form-group a.add-roll-options")?.addEventListener("click",()=>{const sectionEl=html.querySelector("section.check-prompt-content");sectionEl&§ionEl.classList.toggle("show-roll-options")}),htmlQuery(html,"[data-action=post]")?.addEventListener("click",async()=>{__privateMethod(this,_generatePrompt,generatePrompt_fn).call(this)}),htmlQuery(html,"[data-action=cancel]")?.addEventListener("click",async()=>{this.close()})}};_actions=new WeakMap,_lores=new WeakMap,_prepareProficiencyRanks=new WeakSet,prepareProficiencyRanks_fn=__name2(function(){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant");return PROFICIENCY_RANKS.map(value=>({value,label:`${value} (${calculateSimpleDC(value,{proficiencyWithoutLevel})})`}))},"#prepareProficiencyRanks"),_prepareDCAdjustments=new WeakSet,prepareDCAdjustments_fn=__name2(function(){return Object.entries(CONFIG.PF2E.dcAdjustments).filter(([value,_])=>value!=="normal").map(([value,name2])=>({value,label:`${game.i18n.localize(name2)} (${signedInteger(adjustDC(0,value))})`}))},"#prepareDCAdjustments"),_generatePrompt=new WeakSet,generatePrompt_fn=__name2(function(){const html=this.element[0],types=[],traits=[],extras=[],activeSkillSaveTab=htmlQuery(html,"section.check-prompt-content section.tab.active");if(activeSkillSaveTab?.dataset.tab==="skills"?(types.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-skills")),types.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-lores").map(t=>__privateMethod(this,_formatLoreType,formatLoreType_fn).call(this,t))),traits.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-traits")),traits.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-actions").map(a=>__privateMethod(this,_formatActionType,formatActionType_fn).call(this,a))),html.querySelector("input#check-prompt-secret:checked")&&!traits.includes("secret")&&traits.push("secret")):activeSkillSaveTab?.dataset.tab==="saves"&&(types.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-saves")),htmlQuery(html,"input#check-prompt-basic-save:checked")&&extras.push("basic:true")),types.length>0){const titleEl=htmlQuery(html,"input#check-prompt-title"),flavor=titleEl?.value?`

${titleEl.value}


`:"",dc=__privateMethod(this,_getDC,getDC_fn).call(this,html),content=types.map(type=>__privateMethod(this,_constructCheck,constructCheck_fn).call(this,type,dc,traits,extras)).join("");ChatMessagePF2e.create({user:game.user.id,flavor,content})}},"#generatePrompt"),_htmlQueryTags=new WeakSet,htmlQueryTags_fn=__name2(function(html,selector){const el=htmlQuery(html,selector);return(el instanceof HTMLInputElement&&el.value?JSON.parse(el.value):[]).map(tag=>tag.id||tag.value)},"#htmlQueryTags"),_formatLoreType=new WeakSet,formatLoreType_fn=__name2(function(type){let loreType=type.toLowerCase().replaceAll(" ","-").trim();return loreType.includes("lore")||(loreType=loreType.concat("-lore")),loreType},"#formatLoreType"),_formatActionType=new WeakSet,formatActionType_fn=__name2(function(type){return`action:${type.toLowerCase().replace("action:","").trim()}`},"#formatActionType"),_getDC=new WeakSet,getDC_fn=__name2(function(html){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),dc=(()=>{const activeDCTab=htmlQuery(html,"section.dc-content section.tab.active");if(activeDCTab?.dataset.tab==="set-dc")return Number(htmlQuery(html,"input#check-prompt-dc")?.value||NaN);if(activeDCTab?.dataset.tab==="simple-dc"){const profRank=htmlQuery(html,"select#check-prompt-simple-dc")?.value;if(tupleHasValue(PROFICIENCY_RANKS,profRank))return calculateSimpleDC(profRank,{proficiencyWithoutLevel})}else if(activeDCTab?.dataset.tab==="level-dc"){const level=Number(htmlQuery(html,"input#check-prompt-level-dc")?.value||NaN);if(Number.isInteger(level))return calculateDC(+level,{proficiencyWithoutLevel})}return NaN})();if(Number.isInteger(dc)){const dcAdjustment=htmlQuery(html,"select#check-prompt-adjust-difficulty")?.value;return dcAdjustment?adjustDC(dc,dcAdjustment):dc}return null},"#getDC"),_constructCheck=new WeakSet,constructCheck_fn=__name2(function(type,dc,traits,extras){return`

@Check[${[type,Number.isInteger(dc)?`dc:${dc}`:null,traits.length?`traits:${traits.join(",")}`:null].concat(...extras).filter(p=>p).join("|")}]

`},"#constructCheck"),__name2(_CheckPromptDialog,"CheckPromptDialog");let CheckPromptDialog=_CheckPromptDialog;async function checkPrompt(options={}){new CheckPromptDialog(options.actors?{actors:options.actors}:{}).render(!0)}__name(checkPrompt,"checkPrompt"),__name2(checkPrompt,"checkPrompt");function buildRewards(...rewards){const[trained,expert,master,legendary]=rewards;return{1:new CoinsPF2e(trained),2:new CoinsPF2e(expert??trained),3:new CoinsPF2e(master??expert??trained),4:new CoinsPF2e(legendary??master??expert??trained)}}__name(buildRewards,"buildRewards"),__name2(buildRewards,"buildRewards");const earnIncomeTable={0:{failure:{cp:1},rewards:buildRewards({cp:5})},1:{failure:{cp:2},rewards:buildRewards({sp:2})},2:{failure:{cp:4},rewards:buildRewards({sp:3})},3:{failure:{cp:8},rewards:buildRewards({sp:5})},4:{failure:{sp:1},rewards:buildRewards({sp:7},{sp:8})},5:{failure:{sp:2},rewards:buildRewards({sp:9},{gp:1})},6:{failure:{sp:3},rewards:buildRewards({gp:1,sp:5},{gp:2})},7:{failure:{sp:4},rewards:buildRewards({gp:2},{gp:2,sp:5})},8:{failure:{sp:5},rewards:buildRewards({gp:2,sp:5},{gp:3})},9:{failure:{sp:6},rewards:buildRewards({gp:3},{gp:4})},10:{failure:{sp:7},rewards:buildRewards({gp:4},{gp:5},{gp:6})},11:{failure:{sp:8},rewards:buildRewards({gp:5},{gp:6},{gp:8})},12:{failure:{sp:9},rewards:buildRewards({gp:6},{gp:8},{gp:10})},13:{failure:{gp:1},rewards:buildRewards({gp:7},{gp:10},{gp:15})},14:{failure:{gp:1,sp:5},rewards:buildRewards({gp:8},{gp:15},{gp:20})},15:{failure:{gp:2},rewards:buildRewards({gp:10},{gp:20},{gp:28})},16:{failure:{gp:2,sp:5},rewards:buildRewards({gp:13},{gp:25},{gp:36},{gp:40})},17:{failure:{gp:3},rewards:buildRewards({gp:15},{gp:30},{gp:45},{gp:55})},18:{failure:{gp:4},rewards:buildRewards({gp:20},{gp:45},{gp:70},{gp:90})},19:{failure:{gp:6},rewards:buildRewards({gp:30},{gp:60},{gp:100},{gp:130})},20:{failure:{gp:8},rewards:buildRewards({gp:40},{gp:75},{gp:150},{gp:200})},21:{failure:{cp:0},rewards:buildRewards({gp:50},{gp:90},{gp:175},{gp:300})}};function getIncomeForLevel(level){const income=earnIncomeTable[Math.clamped(level,0,21)];return{failure:new CoinsPF2e(income.failure),rewards:income.rewards}}__name(getIncomeForLevel,"getIncomeForLevel"),__name2(getIncomeForLevel,"getIncomeForLevel");function applyIncomeOptions({result,options,level,proficiency}){options.useLoreAsExperiencedProfessional&&(result.degreeOfSuccess===DegreeOfSuccess.CRITICAL_FAILURE?(result.degreeOfSuccess=DegreeOfSuccess.FAILURE,result.rewards=new CoinsPF2e(getIncomeForLevel(level).failure)):result.degreeOfSuccess===DegreeOfSuccess.FAILURE&&proficiency!==1&&(result.rewards=new CoinsPF2e(result.rewards).scale(2)))}__name(applyIncomeOptions,"applyIncomeOptions"),__name2(applyIncomeOptions,"applyIncomeOptions");function earnIncome({level,days,rollBrief,proficiency,options,dc}){const degree=new DegreeOfSuccess(rollBrief,dc),result={rewards:new CoinsPF2e,degreeOfSuccess:degree.value};return degree.value===DegreeOfSuccess.CRITICAL_SUCCESS?result.rewards=getIncomeForLevel(level+1).rewards[proficiency]:degree.value===DegreeOfSuccess.SUCCESS?result.rewards=getIncomeForLevel(level).rewards[proficiency]:degree.value===DegreeOfSuccess.FAILURE&&(result.rewards=getIncomeForLevel(level).failure),applyIncomeOptions({result,options,level,proficiency}),{rewards:{perDay:result.rewards,combined:new CoinsPF2e(result.rewards).scale(days)},degreeOfSuccess:result.degreeOfSuccess,daysSpentWorking:days,level,dc,roll:degree.rollTotal}}__name(earnIncome,"earnIncome"),__name2(earnIncome,"earnIncome");function escapeHtml(text){const p=document.createElement("p");return p.innerText=text,p.innerHTML}__name(escapeHtml,"escapeHtml"),__name2(escapeHtml,"escapeHtml");function isExperiencedProfessional(actor){return actor.itemTypes.feat.some(i=>i.slug==="experienced-professional")}__name(isExperiencedProfessional,"isExperiencedProfessional"),__name2(isExperiencedProfessional,"isExperiencedProfessional");function degreeOfSuccessLabel(degreeIndex){const degreeSlug=DEGREE_OF_SUCCESS_STRINGS[degreeIndex];return game.i18n.localize(`PF2E.Check.Result.Degree.Check.${degreeSlug}`)}__name(degreeOfSuccessLabel,"degreeOfSuccessLabel"),__name2(degreeOfSuccessLabel,"degreeOfSuccessLabel");function coinsToString(coins,degreeOfSuccess){return degreeOfSuccess===0?"none":coins.toString()}__name(coinsToString,"coinsToString"),__name2(coinsToString,"coinsToString");function chatTemplate(skillName,earnIncomeResult){const degreeOfSuccess=degreeOfSuccessLabel(earnIncomeResult.degreeOfSuccess),payPerDay=escapeHtml(coinsToString(earnIncomeResult.rewards.perDay,earnIncomeResult.degreeOfSuccess)),combinedPay=escapeHtml(coinsToString(earnIncomeResult.rewards.combined,earnIncomeResult.degreeOfSuccess)),level=earnIncomeResult.level,daysSpentWorking=earnIncomeResult.daysSpentWorking,forDays=daysSpentWorking>1?`

Salary for ${daysSpentWorking} days ${combinedPay}

`:"",successColor=earnIncomeResult.degreeOfSuccess>1?"darkgreen":"darkred",dc=earnIncomeResult.dc,roll=earnIncomeResult.roll;return` +var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __defProp2=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__reflectGet=Reflect.get,__defNormalProp=__name((obj,key,value)=>key in obj?__defProp2(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,"__defNormalProp"),__name2=__name((target,value)=>__defProp2(target,"name",{value,configurable:!0}),"__name"),__publicField=__name((obj,key,value)=>(__defNormalProp(obj,typeof key!="symbol"?key+"":key,value),value),"__publicField"),__accessCheck=__name((obj,member,msg)=>{if(!member.has(obj))throw TypeError("Cannot "+msg)},"__accessCheck"),__privateGet=__name((obj,member,getter)=>(__accessCheck(obj,member,"read from private field"),getter?getter.call(obj):member.get(obj)),"__privateGet"),__privateAdd=__name((obj,member,value)=>{if(member.has(obj))throw TypeError("Cannot add the same private member more than once");member instanceof WeakSet?member.add(obj):member.set(obj,value)},"__privateAdd"),__privateSet=__name((obj,member,value,setter)=>(__accessCheck(obj,member,"write to private field"),setter?setter.call(obj,value):member.set(obj,value),value),"__privateSet"),__privateMethod=__name((obj,member,method)=>(__accessCheck(obj,member,"access private method"),method),"__privateMethod"),__superGet=__name((cls,obj,key)=>__reflectGet(__getProtoOf(cls),key,obj),"__superGet"),_updateMigrationRecord,updateMigrationRecord_fn,_migrateDocuments,migrateDocuments_fn,_migrateItem,migrateItem_fn,_migrateActor,migrateActor_fn,_migrateWorldJournalEntry,migrateWorldJournalEntry_fn,_migrateWorldMacro,migrateWorldMacro_fn,_migrateWorldTable,migrateWorldTable_fn,_migrateSceneToken,migrateSceneToken_fn,_migrateUser,migrateUser_fn,_data,_diehardPromise,_featSlugs,_featsPromise,_IMAGE_PATHS,_regexp,_renameToWebP,renameToWebP_fn,_isABCK,isABCK_fn,_BASE_ARMORS,_MAGIC_ARMOR_TO_BASE,_BASE_WEAPONS,_isTrue,isTrue_fn,_testBinaryOp,testBinaryOp_fn,_testCompound,testCompound_fn,_binaryOperators,_imageOverrides,_sizeOverrides,_isTokenImageFlag,isTokenImageFlag_fn,_isTokenSizeFlag,isTokenSizeFlag_fn,_needsRuleElement,needsRuleElement_fn,_increasesByOne,_isClassFeature,isClassFeature_fn,_pathsToRemove,_isRemovableAE,isRemovableAE_fn,_isRemoveableChange,isRemoveableChange_fn,_fixClassKeyAbilities,fixClassKeyAbilities_fn,_isTokenSizeRE,isTokenSizeRE_fn,_isActorSizeAELike,isActorSizeAELike_fn,_isBracketedValue,isBracketedValue_fn,_setAncestryVision,setAncestryVision_fn,_resolveBracketedValue,resolveBracketedValue_fn,_coerceNumber,coerceNumber_fn,_traitsDictionary,traitsDictionary_get,_handleModeAffectingTrait,handleModeAffectingTrait_fn,_getDegreeAdjustment,getDegreeAdjustment_fn,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn,_calculateDegreeOfSuccess,calculateDegreeOfSuccess_fn,_SKILL_LONG_FORM_PATH,_rewriteSkillLongFormPath,rewriteSkillLongFormPath_fn,_pathIsValid,pathIsValid_fn,_applyAELike,applyAELike_fn,_logChange,logChange_fn,_renderFormula,renderFormula_fn,_validateForItem,_adjustCreatureShieldData,adjustCreatureShieldData_fn,_getNewInterval,getNewInterval_fn,_processEffects,processEffects_fn,_processAppearanceData,processAppearanceData_fn,_createMovementType,createMovementType_fn,_customLabel,_weapon,_resolveOptions,resolveOptions_fn,_actions,_lores,_prepareProficiencyRanks,prepareProficiencyRanks_fn,_prepareDCAdjustments,prepareDCAdjustments_fn,_generatePrompt,generatePrompt_fn,_htmlQueryTags,htmlQueryTags_fn,_formatLoreType,formatLoreType_fn,_formatActionType,formatActionType_fn,_getDC,getDC_fn,_constructCheck,constructCheck_fn,_prepareDamageTypes,prepareDamageTypes_fn,_getInputElements,getInputElements_fn,_disableScale,disableScale_fn,_reestablishPrototype,reestablishPrototype_fn,_disableVisionInputs,disableVisionInputs_fn,_drawBorder,drawBorder_fn,_drawTexture,drawTexture_fn,_drawLabel,drawLabel_fn,_showBordersHighlights,showBordersHighlights_get,_moveTime,_wheelListenerOptions,_onPreviewMouseMove,_onPreviewLeftClick,_onPreviewRightClick,_onPreviewMouseWheel,_squares,_prepareDerivedPerception,prepareDerivedPerception_fn,_getChoices,getChoices_fn,_filterTimeout,_getUpdateData,getUpdateData_fn,_search,search_fn,_onFilterResults,onFilterResults_fn,_updateIWR,updateIWR_fn,_sortableOnMoveData,_activateInventoryDragDrop,activateInventoryDragDrop_fn,_sortableOnMove,sortableOnMove_fn,_sortableOnEnd,sortableOnEnd_fn,_onClickDeleteItem,onClickDeleteItem_fn,_onClickBrowseEquipment,onClickBrowseEquipment_fn,_onClickCreateItem,onClickCreateItem_fn,_onClickSellAllTreasure,onClickSellAllTreasure_fn,_resolve,_originallyEnabled,_getModifierIcon,getModifierIcon_fn,_getTypeLabel,getTypeLabel_fn,_applyStackingRules,applyStackingRules_fn,_localize,localize_fn,_createTemplate,createTemplate_fn,_parseInlineParams,parseInlineParams_fn,_createCheck,createCheck_fn,_createSingleCheck,createSingleCheck_fn,_createDamageRoll,createDamageRoll_fn,_createActionOptions,createActionOptions_fn,_originallyEnabled2,_resolveSubstitutions,resolveSubstitutions_fn,_createTagFlavor,createTagFlavor_fn,_createResultFlavor,createResultFlavor_fn,_resolveCheckDC,resolveCheckDC_fn,_item,_resolve2,_action,_canSetAttribute,canSetAttribute_fn,_searchEngine,_getSpellFromEvent,getSpellFromEvent_fn,_onConfigureActor,onConfigureActor_fn,_onToggleSignatureSpell,onToggleSignatureSpell_fn,_onClickBrowseActions,onClickBrowseActions_fn,_onClickBrowseSpellCompendia,onClickBrowseSpellCompendia_fn,_abpEnabled,_createButtons,createButtons_fn,_calculateAncestryBoosts,calculateAncestryBoosts_fn,_calculateBackgroundBoosts,calculateBackgroundBoosts_fn,_calculateLeveledBoosts,calculateLeveledBoosts_fn,_getBoostFlawLabels,getBoostFlawLabels_fn,_updateRE,updateRE_fn,_blastConfigSchema,_blastInfusionSchema,_prepareBlastConfigs,prepareBlastConfigs_fn,_prepareBlastInfusion,prepareBlastInfusion_fn,_getBlastConfig,getBlastConfig_fn,_createModifiedItem,createModifiedItem_fn,_strengthModToDamage,strengthModToDamage_fn,_knownFormulas,_formulaQuantities,_prepareAbilities,prepareAbilities_fn,_prepareCraftingEntries,prepareCraftingEntries_fn,_getBlastData,getBlastData_fn,_activateBlastListeners,activateBlastListeners_fn,_onClickBrowseFeats,onClickBrowseFeats_fn,_onChangeAdjustStat,onChangeAdjustStat_fn,_onChangeAdjustItemStat,onChangeAdjustItemStat_fn,_onClickAdjustItemStat,onClickAdjustItemStat_fn,_getFeatSlotData,getFeatSlotData_fn,_sortFormulas,sortFormulas_fn,_strikeItemId,_strikeSlug,_strike,_elementTrait,_blasts,_getReach,getReach_fn,_isValid,isValid_fn,_constructWeapon,constructWeapon_fn,_defaultIcons,_setRollOptions,setRollOptions_fn,_prepareAC,prepareAC_fn,_prepareSenses,prepareSenses_fn,_prepareSize,prepareSize_fn,_prepareSpeeds,prepareSpeeds_fn,_prepareSkills,prepareSkills_fn,_prepareStrikes,prepareStrikes_fn,_prepareIWR,prepareIWR_fn,_suppressModifiers,suppressModifiers_fn,_filterModifier,filterModifier_fn,_suppressNotes,suppressNotes_fn,_resolveStrikeQueries,resolveStrikeQueries_fn,_resolve3,_setDefaultFlag,setDefaultFlag_fn,_choicesFromArray,choicesFromArray_fn,_choicesFromPath,choicesFromPath_fn,_choicesFromOwnedItems,choicesFromOwnedItems_fn,_choicesFromAttacks,choicesFromAttacks_fn,_getPreselection,getPreselection_fn,_setRollOption,setRollOption_fn,_getEffect,getEffect_fn,_isValidOverride,isValidOverride_fn,_resolvedBracketsIsValid,resolvedBracketsIsValid_fn,_createDeferredEffect,createDeferredEffect_fn,_getOnDeleteActions,getOnDeleteActions_fn,_applyChoicePreselections,applyChoicePreselections_fn,_setGrantFlags,setGrantFlags_fn,_runGrantedItemPreCreates,runGrantedItemPreCreates_fn,_createInMemoryCondition,createInMemoryCondition_fn,_trackItem,trackItem_fn,_applyAlteration,applyAlteration_fn,_resolveOption,resolveOption_fn,_setFlag,setFlag_fn,_setRollOption2,setRollOption_fn2,_effect,_srcIsValid,srcIsValid_fn,_target,_resolve4,_cancelHandler,cancelHandler_fn,_checkRuleSource,checkRuleSource_fn,_activeTab,_getFormHelpers,getFormHelpers_fn,_effectsMap,_addEffect,addEffect_fn,_updateEffectsMap,updateEffectsMap_fn,_deleteEffect,deleteEffect_fn,_selectedRuleElementType,_editingRuleElementIndex,_rulesLastScrollTop,_ruleElementForms,_createRuleElementForms,createRuleElementForms_fn,_initialRefresh,_damageManager,_processDeletions,processDeletions_fn,_refreshSettings,refreshSettings_fn,_registerModuleTags,registerModuleTags_fn,_getConfigRecord,getConfigRecord_fn,_updateConfigRecords,updateConfigRecords_fn,_isFlatModifier,isFlatModifier_fn,_toRuleElement,toRuleElement_fn,_rationsSourceId,_rationsPromise,_isOldRations,isOldRations_fn,_getRationRefs,getRationRefs_fn,_migrateClass,migrateClass_fn,_migrateFeature,migrateFeature_fn,_isClassFeature2,isClassFeature_fn2,_isClassFeature3,isClassFeature_fn3,_isHeritageFeature,isHeritageFeature_fn,_officialAncestries,_heritagesWithoutAncestryInName,_ancestrySlugs,_heritageFromFeat,heritageFromFeat_fn,_explorersClothingVariants,_pathPattern,_hasWellFormedFeatType,hasWellFormedFeatType_fn,_needsTrait,needsTrait_fn,_hasBrokenThreshold,hasBrokenThreshold_fn,_shadowPromise,_cascadePromise,_isEffectTargetRE,isEffectTargetRE_fn,_toChoiceSet,toChoiceSet_fn,_loadedSpells,_isChoiceSetWithSelection,isChoiceSetWithSelection_fn,_newRules,newRules_fn,_toSkip,_hasThrownTrait,hasThrownTrait_fn,_cleanText,cleanText_fn,_updateEffect,updateEffect_fn,_updateFeat,updateFeat_fn,_vivaciousRules,vivaciousRules_get,_auraOfLife,_enlightenedPresence,_eternalBlessing,_marshalsAura,_findDamageDiceRE,findDamageDiceRE_fn,_isClassFeature4,isClassFeature_fn4,_athleticStrategist,athleticStrategist_get,_deviseAStratagem,deviseAStratagem_get,_ruffianPredicate,ruffianPredicate_get,_sneakAttackPredicate,sneakAttackPredicate_get,_updateSpeed,updateSpeed_fn,_suppressNoCrowbar,suppressNoCrowbar_get,_convertToUUIDs,convertToUUIDs_fn,_getRules,getRules_fn,_preciseStrikeRules,preciseStrikeRules_get,_finishingPrecisionRules,finishingPrecisionRules_get,_otherClassDCs,_isClassFeature5,isClassFeature_fn5,_critSpec,critSpec_get,_hands,hands_get,_convertLegacyData,convertLegacyData_fn,_isOldRawPredicate,isOldRawPredicate_fn,_isArrayChoiceSet,isArrayChoiceSet_fn,_isObjectChoiceSet,isObjectChoiceSet_fn,_shapeFeats,_flatFootedToggle,flatFootedToggle_get,_isFlatFootedToggle,isFlatFootedToggle_fn,_convertToEntry,convertToEntry_fn,_modifyFlag,modifyFlag_fn,_oldIdsPattern,_colorDarkvision,colorDarkvision_get,_AREA_TYPES,_isAreaType,isAreaType_fn,_hasDetails,hasDetails_fn,_pattern,_damageTypeLabelPattern,_updateDamageFormula,updateDamageFormula_fn,_automatonEnhancements,automatonEnhancements_get,_conditionPattern,_pattern2,_updateDamageFormula2,updateDamageFormula_fn2,_getWR,getWR_fn,_oldENmappings,_parseExceptions,parseExceptions_fn,_normalizeType,normalizeType_fn,_updateWeaponMaterialData,updateWeaponMaterialData_fn,_updateChoiceSet,updateChoiceSet_fn,_bomberSetFlags,bomberSetFlags_get,_chirurgeonSetFlags,chirurgeonSetFlags_get,_mutagenistSetFlags,mutagenistSetFlags_get,_toxicologistSetFlags,toxicologistSetFlags_get,_needsRE,needsRE_fn,_splashPattern1,_splashPattern2,_damagePatternSingle,_damagePatternPair,_cleanFormula,cleanFormula_fn,_buildSplashFormula,buildSplashFormula_fn,_buildDamageFormula,buildDamageFormula_fn,_updateDamageFormula3,updateDamageFormula_fn3,_rename,rename_fn,_removeLinks,removeLinks_fn,_cloisteredClericSetFlags,cloisteredClericSetFlags_get,_warpriestSetFlags,warpriestSetFlags_get,_updateCategoryData,updateCategoryData_fn,_rename2,rename_fn2,_wrapPredicate,wrapPredicate_fn,_replaceUUID,replaceUUID_fn,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn,_updateUUIDs,updateUUIDs_fn,_idMap,_oldToNew,_oldNamePattern,_newName,_imgPattern,_aToAnUUIDPatern,_replace,replace_fn,_OLD_TO_NEW_LANGUAGES,_testHasOption,testHasOption_fn,_hasOldMaterialData,hasOldMaterialData_fn,_resilientRuneValues,_replaceStrings,replaceStrings_fn,_mightyBulwarkRules,mightyBulwarkRules_get,_defensePathPattern,_mvSchema,mvSchema_fn,_setPublicationData,setPublicationData_fn,_list,_excludeDamage,excludeDamage_fn,_strengthModToDamage2,strengthModToDamage_fn2,_check,_dc,_determineLabel,determineLabel_fn,_createBonusesAndPenalties,createBonusesAndPenalties_fn,_createShieldBonus,createShieldBonus_fn,_baseMax,_lastClick,_onClickButton,onClickButton_fn,_rollActorSaves,rollActorSaves_fn,_onHoverIn,onHoverIn_fn,_onHoverOut,onHoverOut_fn,_initialized,_value,_actorStrength,actorStrength_get,_flattenNonStowing,flattenNonStowing_fn,_localize2,_initialize,initialize_fn,_handleTrickItem,handleTrickItem_fn,_assertEntryIsDocument,assertEntryIsDocument_fn,_getRitualData,getRitualData_fn,_slugMap,_templatePaths,_getActor,getActor_fn,_getSource,getSource_fn,_getTarget,getTarget_fn,_tokenName,tokenName_fn,_sendMessage,sendMessage_fn,_messageFlavor,messageFlavor_fn,_findBestLocation,findBestLocation_fn,_getChildSlots,getChildSlots_fn,_editingSettlements,_prepareSettlement,prepareSettlement_fn,_activateSettlementEvents,activateSettlementEvents_fn,_getFeatSlotData2,getFeatSlotData_fn2,_prepareAbilityBuilder,prepareAbilityBuilder_fn,_originalValue,_slider,_noRefreshHook,_hasRollOptionData,hasRollOptionData_fn,_createItemMacro,createItemMacro_fn,_createRollOptionToggleMacro,createRollOptionToggleMacro_fn,_extraFolders,_renderedOnce,_draggingParty,_onDragHighlightFolderLike,onDragHighlightFolderLike_fn,_appendBrowseButton,appendBrowseButton_fn,_appendBrowseButton2,appendBrowseButton_fn2,_messageFromEvent,messageFromEvent_fn,_onClickDamageButton,onClickDamageButton_fn,_onClickRevertDamage,onClickRevertDamage_fn,_onClickShieldBlock,onClickShieldBlock_fn,_onClickSender,onClickSender_fn,_dragPreview,dragPreview_get,_onToggleTarget,onToggleTarget_fn,_onDropCombatant,onDropCombatant_fn,_setModuleArt,setModuleArt_fn,_getSources,getSources_fn,_createFilteredIndex,createFilteredIndex_fn,_loadSources,loadSources_fn,_getSourceFromDocument,getSourceFromDocument_fn,_domParser,_getRollTableResults,getRollTableResults_fn,_localizeCoins,_creatureTraits,_resetInitializedTabs,resetInitializedTabs_fn,_renderResultList,renderResultList_fn,_activateResultListeners,activateResultListeners_fn,_takePhysicalItem,takePhysicalItem_fn,_buyPhysicalItem,buyPhysicalItem_fn,_getPhysicalItem,getPhysicalItem_fn,_resetFilters,resetFilters_fn,_clearScrollLimit,clearScrollLimit_fn,_getRemainingDurationLabel,getRemainingDurationLabel_fn,_getEnrichedDescriptions,getEnrichedDescriptions_fn,_lastCombatantToken,_ICON_THEME_DIRS,_conditionSummaries,_activateListeners,activateListeners_fn,_updateStatusIcons,updateStatusIcons_fn,_showStatusLabel,showStatusLabel_fn,_setStatusValue,setStatusValue_fn,_toggleStatus,toggleStatus_fn,_createChatMessage,createChatMessage_fn,_action2,_cost,_description,_slug,_traits,_variants,_action3,_effect2,_action4,_difficultyClass,_modifiers,_notes,_rollOptions,_statistic,_insert,insert_fn,_removeExpired,removeExpired_fn,_getArtMap,getArtMap_fn,_isModuleArt,isModuleArt_fn,_isRemigrating,_retrieve,retrieve_fn,_deposit,deposit_fn,_getDepositSpaces,getDepositSpaces_fn,_prepareActions,prepareActions_fn,_prepareSaves,prepareSaves_fn,_identificationData,_padAttempts,padAttempts_fn,_prepareAbilities2,prepareAbilities_fn2,_prepareAlignment,prepareAlignment_fn,_prepareSkills2,prepareSkills_fn2,_prepareSaves2,prepareSaves_fn2,_onClickRollable,onClickRollable_fn,_rollAbility,rollAbility_fn,_prepareActions2,prepareActions_fn2,_onChangeSpellcastingEntry,onChangeSpellcastingEntry_fn,_prepareMembers,prepareMembers_fn,_prepareOverviewSummary,prepareOverviewSummary_fn,_getActorsThatUnderstand,getActorsThatUnderstand_fn,_renderRegions,renderRegions_fn,_isValidDrop,isValidDrop_fn,_getOverlayFromElement,getOverlayFromElement_fn,_getDefaultProperty,getDefaultProperty_fn,_formatSpellComponents,formatSpellComponents_fn,_prepareHeighteningLevels,prepareHeighteningLevels_fn,_activateRBVListeners,activateRBVListeners_fn;import{i as isNil,T as Tagify,u as uniq,c as compact,p as pick$1,m as mapToObj,a as mapValues$1,o as omit,b as isObject$1,k as keys,g as groupBy$1,D as Duration,d as isEmpty,e as equals,s as sortBy$1,S as Sortable,f as pipe,h as map,j as filter,l as uniqBy,M as MiniSearch,n as difference,q as meanBy,E as EditorView,r as basicSetup,t as json,v as linter,w as keymap,x as indentWithTab,y as autocompletion,z as syntaxTree,A as jsonParseLinter,B as fromPairs,C as maxBy,U as UUIDv5,F as sumBy,I as Interval,G as DateTime,H as noUiSlider,P as PipsMode,J as findLast,K as omitBy}from"./vendor.mjs";const BabeleReady={listen(){Hooks.once("babele.ready",()=>{game.pf2e.ConditionManager.initialize(!0)})}},CanvasInit={listen:()=>{Hooks.on("canvasInit",async canvas2=>{SquareGrid.prototype.measureDistances=__name2(__name(function(segments,options={}){if(!options.gridSpaces)return BaseGrid.prototype.measureDistances.call(this,segments,options);let nDiagonal=0;const d=canvas2.dimensions;return segments.map(s=>{const r=s.ray,nx=Math.abs(Math.ceil(r.dx/d.size)),ny=Math.abs(Math.ceil(r.dy/d.size)),nd=Math.min(nx,ny),ns=Math.abs(ny-nx);nDiagonal+=nd;const nd10=Math.floor(nDiagonal/2)-Math.floor((nDiagonal-nd)/2);return(nd10*2+(nd-nd10)+ns)*canvas2.dimensions.distance})},"measureDistances"),"measureDistances")})}},_BaseStatistic=class{static{__name(this,"_BaseStatistic")}actor;slug;label;data;domains;modifiers;constructor(actor,data){this.actor=actor,this.slug=data.slug,this.label=game.i18n.localize(data.label).trim(),this.data={...data},this.domains=[...data.domains??=[]];const modifiers=[data.modifiers??[],extractModifiers(this.actor.synthetics,this.domains)].flat();if(this.modifiers=new StatisticModifier("",modifiers).modifiers.map(m=>m.clone()),this.domains.length>0){const options=this.createRollOptions();for(const modifier of this.modifiers)modifier.test(options)}}createRollOptions(domains=this.domains){return new Set(this.actor.getRollOptions(domains))}};__name2(_BaseStatistic,"BaseStatistic");let BaseStatistic=_BaseStatistic;const _MigrationRunnerBase=class{static{__name(this,"_MigrationRunnerBase")}constructor(migrations=[]){__privateAdd(this,_updateMigrationRecord),__publicField(this,"migrations"),this.migrations=migrations.sort((a,b)=>a.version-b.version)}needsMigration(currentVersion){return currentVersion0&&__privateMethod(this,_updateMigrationRecord,updateMigrationRecord_fn).call(this,current.system._migration,migrations.slice(-1)[0]),current}async getUpdatedTable(tableSource,migrations){const current=deepClone(tableSource);for(const migration of migrations)try{await migration.updateTable?.(current)}catch(err){console.error(err)}return current}async getUpdatedMacro(macroSource,migrations){const current=deepClone(macroSource);for(const migration of migrations)try{await migration.updateMacro?.(current)}catch(err){console.error(err)}return current}async getUpdatedJournalEntry(source,migrations){const clone=deepClone(source);for(const migration of migrations)try{await migration.updateJournalEntry?.(clone)}catch(err){console.error(err)}return clone}async getUpdatedToken(token,migrations){const current=token.toObject();for(const migration of migrations)await migration.updateToken?.(current,token.actor,token.scene);return current}async getUpdatedUser(userData,migrations){const current=deepClone(userData);for(const migration of migrations)try{await migration.updateUser?.(current)}catch(err){console.error(err)}return current}};_updateMigrationRecord=new WeakSet,updateMigrationRecord_fn=__name2(function(migrations,latestMigration){if(!("game"in globalThis&&latestMigration))return;const fromVersion=typeof migrations.version=="number"?migrations.version:null;migrations.version=latestMigration.version,migrations.previous={schema:fromVersion,foundry:game.version,system:game.system.version}},"#updateMigrationRecord"),__name2(_MigrationRunnerBase,"MigrationRunnerBase"),__publicField(_MigrationRunnerBase,"LATEST_SCHEMA_VERSION",.88),__publicField(_MigrationRunnerBase,"MINIMUM_SAFE_VERSION",.618),__publicField(_MigrationRunnerBase,"RECOMMENDED_SAFE_VERSION",.634),__publicField(_MigrationRunnerBase,"FOUNDRY_SCHEMA_VERSIONS",{.8:.634,9:.7,10:.781,11:.841});let MigrationRunnerBase=_MigrationRunnerBase;const _Progress=class{static{__name(this,"_Progress")}value=0;max;label;constructor({max,label}){this.label=label??"",this.max=max}advance({by=1,label=this.label}={}){if(this.value===this.max)return;this.value+=Math.abs(by);const pct=Math.floor(this.value/this.max*100);SceneNavigation.displayProgressBar({label,pct})}close({label=""}={}){SceneNavigation.displayProgressBar({label,pct:100})}};__name2(_Progress,"Progress");let Progress=_Progress;const _MigrationRunner=class _MigrationRunner2 extends MigrationRunnerBase{static{__name(this,"_MigrationRunner")}constructor(){super(...arguments),__privateAdd(this,_migrateDocuments),__privateAdd(this,_migrateItem),__privateAdd(this,_migrateActor),__privateAdd(this,_migrateWorldJournalEntry),__privateAdd(this,_migrateWorldMacro),__privateAdd(this,_migrateWorldTable),__privateAdd(this,_migrateSceneToken),__privateAdd(this,_migrateUser)}needsMigration(){return super.needsMigration(game.settings.get("pf2e","worldSchemaVersion"))}static async ensureSchemaVersion(document2,migrations){if(migrations.length===0)return;const currentVersion=this.LATEST_SCHEMA_VERSION;if((Number(document2.schemaVersion)||0){try{return"items"in source?await runner.getUpdatedActor(source,runner.migrations):await runner.getUpdatedItem(source,runner.migrations)}catch{return null}})();updated&&document2.updateSource(updated)}if(document2.updateSource({"system._migration.version":currentVersion}),"items"in document2&&"token"in document2)for(const item of document2.items)item.schemaVersion||item.updateSource({"system._migration.version":currentVersion})}async runCompendiumMigration(compendium){const pack=compendium.metadata.id;ui.notifications.info(game.i18n.format("PF2E.Migrations.Starting",{version:game.system.version}));const documents=await compendium.getDocuments();await compendium.documentClass.updateDocuments(documents,{diff:!1,recursive:!1,pack}),ui.notifications.info(game.i18n.format("PF2E.Migrations.Finished",{version:game.system.version}))}async runMigrations(migrations){if(migrations.length===0)return;const progress=new Progress({label:game.i18n.localize("PF2E.Migrations.Running"),max:Math.floor(game.actors.size+game.items.size+game.scenes.map(s=>s.tokens.contents).flat().filter(t=>t.actor?.isToken).length)});await __privateMethod(this,_migrateDocuments,migrateDocuments_fn).call(this,game.actors,migrations,progress),await __privateMethod(this,_migrateDocuments,migrateDocuments_fn).call(this,game.items,migrations,progress);for(const entry of game.journal)await __privateMethod(this,_migrateWorldJournalEntry,migrateWorldJournalEntry_fn).call(this,entry,migrations);const promises=[];for(const macro of game.macros)promises.push(__privateMethod(this,_migrateWorldMacro,migrateWorldMacro_fn).call(this,macro,migrations));for(const table of game.tables)promises.push(__privateMethod(this,_migrateWorldTable,migrateWorldTable_fn).call(this,table,migrations));for(const user of game.users)promises.push(__privateMethod(this,_migrateUser,migrateUser_fn).call(this,user,migrations));for(const migration of migrations)migration.migrate&&promises.push(migration.migrate());await Promise.allSettled(promises);for(const scene of game.scenes)for(const token of scene.tokens){const{actor}=token;if(!actor||!!!await __privateMethod(this,_migrateSceneToken,migrateSceneToken_fn).call(this,token,migrations))continue;const deltaSource=token.delta?._source,hasMigratableData=!!deltaSource&&!!deltaSource.flags?.pf2e||((deltaSource??{}).items??[]).length>0||Object.keys(deltaSource?.system??{}).length>0;if(actor.isToken){if(hasMigratableData){const updated=await __privateMethod(this,_migrateActor,migrateActor_fn).call(this,migrations,actor);if(updated)try{await actor.update(updated,{noHook:!0})}catch(error){console.warn(error)}}progress.advance()}}progress.valueschemaVersion.current0&&await this.runMigrations(migrationPhase);await game.settings.set("pf2e","worldSchemaVersion",schemaVersion.latest)}};_migrateDocuments=new WeakSet,migrateDocuments_fn=__name2(async function(collection,migrations,progress){const DocumentClass=collection.documentClass,pack="metadata"in collection?collection.metadata.id:null,updateGroup=[];for(const document2 of collection.contents.sort(a=>a.type==="familiar"?1:-1)){if(updateGroup.length===50)try{await DocumentClass.updateDocuments(updateGroup,{noHook:!0,pack}),progress?.advance({by:updateGroup.length})}catch(error){console.warn(error)}finally{updateGroup.length=0}const updated="items"in document2?await __privateMethod(this,_migrateActor,migrateActor_fn).call(this,migrations,document2,{pack}):await __privateMethod(this,_migrateItem,migrateItem_fn).call(this,migrations,document2);updated&&updateGroup.push(updated)}if(updateGroup.length>0)try{await DocumentClass.updateDocuments(updateGroup,{noHook:!0,pack}),progress?.advance({by:updateGroup.length})}catch(error){console.warn(error)}},"#migrateDocuments"),_migrateItem=new WeakSet,migrateItem_fn=__name2(async function(migrations,item){const baseItem=item.toObject();try{return this.getUpdatedItem(baseItem,migrations)}catch(error){return error instanceof Error&&console.error(`Error thrown while migrating ${item.uuid}: ${error.message}`),null}},"#migrateItem"),_migrateActor=new WeakSet,migrateActor_fn=__name2(async function(migrations,actor,options={}){const{pack}=options,baseActor=actor.toObject(),updatedActor=await(()=>{try{return this.getUpdatedActor(baseActor,migrations)}catch(error){return error instanceof Error&&console.error(`Error thrown while migrating ${actor.uuid}: ${error.message}`),null}})();if(!updatedActor)return null;actor.effects.size>0&&actor.deleteEmbeddedDocuments("ActiveEffect",[],{deleteAll:!0});const baseItems=[...baseActor.items],updatedItems=[...updatedActor.items],itemDiff=this.diffCollection(baseItems,updatedItems),finalDeleted=itemDiff.deleted.filter(id=>actor.items.has(id));if(finalDeleted.length>0)try{await actor.deleteEmbeddedDocuments("Item",finalDeleted,{noHook:!0,pack})}catch(error){console.warn(error)}const finalUpdated=itemDiff.updated.filter(i=>actor.items.has(i._id));return updatedActor.items=[...itemDiff.inserted,...finalUpdated],updatedActor},"#migrateActor"),_migrateWorldJournalEntry=new WeakSet,migrateWorldJournalEntry_fn=__name2(async function(journalEntry,migrations){if(migrations.some(migration=>!!migration.updateJournalEntry))try{const updated=await this.getUpdatedJournalEntry(journalEntry.toObject(),migrations),changes=diffObject(journalEntry.toObject(),updated);Object.keys(changes).length>0&&await journalEntry.update(changes,{noHook:!0})}catch(error){console.warn(error)}},"#migrateWorldJournalEntry"),_migrateWorldMacro=new WeakSet,migrateWorldMacro_fn=__name2(async function(macro,migrations){if(migrations.some(migration=>!!migration.updateMacro))try{const updatedMacro=await this.getUpdatedMacro(macro.toObject(),migrations),changes=diffObject(macro.toObject(),updatedMacro);Object.keys(changes).length>0&&await macro.update(changes,{noHook:!0})}catch(error){console.warn(error)}},"#migrateWorldMacro"),_migrateWorldTable=new WeakSet,migrateWorldTable_fn=__name2(async function(table,migrations){if(migrations.some(migration=>!!migration.updateTable))try{const updatedMacro=await this.getUpdatedTable(table.toObject(),migrations),changes=diffObject(table.toObject(),updatedMacro);Object.keys(changes).length>0&&table.update(changes,{noHook:!0})}catch(error){console.warn(error)}},"#migrateWorldTable"),_migrateSceneToken=new WeakSet,migrateSceneToken_fn=__name2(async function(token,migrations){if(!migrations.some(migration=>!!migration.updateToken))return token.toObject();try{const updatedToken=await this.getUpdatedToken(token,migrations),changes=diffObject(token.toObject(),updatedToken);if(Object.keys(changes).length>0)try{await token.update(changes,{noHook:!0})}catch(error){console.warn(error)}return updatedToken}catch(error){return console.error(error),null}},"#migrateSceneToken"),_migrateUser=new WeakSet,migrateUser_fn=__name2(async function(user,migrations){if(migrations.some(migration=>!!migration.updateUser))try{const baseUser=user.toObject(),updatedUser=await this.getUpdatedUser(baseUser,migrations),changes=diffObject(user.toObject(),updatedUser);Object.keys(changes).length>0&&await user.update(changes,{noHook:!0})}catch(error){console.error(error)}},"#migrateUser"),__name2(_MigrationRunner,"MigrationRunner");let MigrationRunner=_MigrationRunner;const _MigrationBase=class{static{__name(this,"_MigrationBase")}version=this.constructor.version;requiresFlush=!1};__name2(_MigrationBase,"MigrationBase"),__publicField(_MigrationBase,"version");let MigrationBase=_MigrationBase;const _Migration600Reach=class extends MigrationBase{static{__name(this,"_Migration600Reach")}async updateItem(item){item.type==="ancestry"&&(item.system.reach=5)}};__name2(_Migration600Reach,"Migration600Reach"),__publicField(_Migration600Reach,"version",.6);let Migration600Reach=_Migration600Reach;function createHTMLElement(nodeName,{classes=[],dataset={},children=[],innerHTML}={}){const element=document.createElement(nodeName);classes.length>0&&element.classList.add(...classes);for(const[key,value]of Object.entries(dataset).filter(([,v])=>!isNil(v)))element.dataset[key]=String(value);if(innerHTML)element.innerHTML=innerHTML;else for(const child of children){const childElement=child instanceof HTMLElement?child:new Text(child);element.appendChild(childElement)}return element}__name(createHTMLElement,"createHTMLElement"),__name2(createHTMLElement,"createHTMLElement");function htmlQuery(parent,selectors){return parent instanceof Element||parent instanceof Document?parent.querySelector(selectors):null}__name(htmlQuery,"htmlQuery"),__name2(htmlQuery,"htmlQuery");function htmlQueryAll(parent,selectors){return parent instanceof Element||parent instanceof Document?Array.from(parent.querySelectorAll(selectors)):[]}__name(htmlQueryAll,"htmlQueryAll"),__name2(htmlQueryAll,"htmlQueryAll");function htmlClosest(child,selectors){return child instanceof Element?child.closest(selectors):null}__name(htmlClosest,"htmlClosest"),__name2(htmlClosest,"htmlClosest");function groupBy(array,criterion){const result=new Map;for(const elem of array){const key=criterion(elem),group=result.get(key);group?group.push(elem):result.set(key,[elem])}return result}__name(groupBy,"groupBy"),__name2(groupBy,"groupBy");function sortBy(mapping){return(a,b)=>{const value1=mapping(a),value2=mapping(b);return value1(result[key]=mapping(value,key),result),{})}__name(mapValues,"mapValues"),__name2(mapValues,"mapValues");function isBlank(text){return text==null||text.trim()===""}__name(isBlank,"isBlank"),__name2(isBlank,"isBlank");function addSign(number){return number<0?`${number}`:`+${number}`}__name(addSign,"addSign"),__name2(addSign,"addSign");function sum(values){return values.reduce((a,b)=>a+b,0)}__name(sum,"sum"),__name2(sum,"sum");function zip(a,b,zipFunction){return a.length>b.length?b.map((elem,index)=>zipFunction(a[index],elem)):a.map((elem,index)=>zipFunction(elem,b[index]))}__name(zip,"zip"),__name2(zip,"zip");function applyNTimes(func,times,start){let result=start;for(let i=0;i(key in obj&&(result[key]=obj[key]),result),{})}__name(pick,"pick"),__name2(pick,"pick");let intlNumberFormat;function signedInteger(value,{emptyStringZero=!1}={}){return value===0&&emptyStringZero?"":(intlNumberFormat??=new Intl.NumberFormat(game.i18n.lang,{maximumFractionDigits:0,signDisplay:"always"})).format(value)}__name(signedInteger,"signedInteger"),__name2(signedInteger,"signedInteger");const wordCharacter=String.raw`[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}]`,nonWordCharacter=String.raw`[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}]`,nonWordCharacterRE=new RegExp(nonWordCharacter,"gu"),wordBoundary=String.raw`(?:${wordCharacter})(?=${nonWordCharacter})|(?:${nonWordCharacter})(?=${wordCharacter})`,nonWordBoundary=String.raw`(?:${wordCharacter})(?=${wordCharacter})`,lowerCaseLetter=String.raw`\p{Lowercase_Letter}`,upperCaseLetter=String.raw`\p{Uppercase_Letter}`,lowerCaseThenUpperCaseRE=new RegExp(`(${lowerCaseLetter})(${upperCaseLetter}${nonWordBoundary})`,"gu"),nonWordCharacterHyphenOrSpaceRE=/[^-\p{White_Space}\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}]/gu,upperOrWordBoundariedLowerRE=new RegExp(`${upperCaseLetter}|(?:${wordBoundary})${lowerCaseLetter}`,"gu");function sluggify(text,{camel=null}={}){if(typeof text!="string")return console.warn("Non-string argument passed to `sluggify`"),"";if(text==="-")return text;switch(camel){case null:return text.replace(lowerCaseThenUpperCaseRE,"$1-$2").toLowerCase().replace(/['’]/g,"").replace(nonWordCharacterRE," ").trim().replace(/[-\s]+/g,"-");case"bactrian":{const dromedary=sluggify(text,{camel:"dromedary"});return dromedary.charAt(0).toUpperCase()+dromedary.slice(1)}case"dromedary":return text.replace(nonWordCharacterHyphenOrSpaceRE,"").replace(/[-_]+/g," ").replace(upperOrWordBoundariedLowerRE,(part,index)=>index===0?part.toLowerCase():part.toUpperCase()).replace(/\s+/g,"");default:throw ErrorPF2e("I don't think that's a real camel.")}}__name(sluggify,"sluggify"),__name2(sluggify,"sluggify");function parseHTML(unparsed){const fragment=document.createElement("template");fragment.innerHTML=unparsed;const element=fragment.content.firstElementChild;if(!(element instanceof HTMLElement))throw ErrorPF2e("Unexpected error parsing HTML");return element}__name(parseHTML,"parseHTML"),__name2(parseHTML,"parseHTML");function getActionTypeLabel(type,cost){switch(type){case"action":return cost===1?"PF2E.Item.Action.Type.Single":"PF2E.Item.Action.Type.Activity";case"free":return"PF2E.Item.Action.Type.Free";case"reaction":return"PF2E.Item.Action.Type.Reaction";default:return null}}__name(getActionTypeLabel,"getActionTypeLabel"),__name2(getActionTypeLabel,"getActionTypeLabel");const actionImgMap={0:"systems/pf2e/icons/actions/FreeAction.webp",free:"systems/pf2e/icons/actions/FreeAction.webp",1:"systems/pf2e/icons/actions/OneAction.webp",2:"systems/pf2e/icons/actions/TwoActions.webp",3:"systems/pf2e/icons/actions/ThreeActions.webp","1 or 2":"systems/pf2e/icons/actions/OneTwoActions.webp","1 to 3":"systems/pf2e/icons/actions/OneThreeActions.webp","2 or 3":"systems/pf2e/icons/actions/TwoThreeActions.webp",reaction:"systems/pf2e/icons/actions/Reaction.webp",passive:"systems/pf2e/icons/actions/Passive.webp"};function getActionIcon(action2,fallback="systems/pf2e/icons/actions/Empty.webp"){if(action2===null)return actionImgMap.passive;const value=typeof action2!="object"?action2:action2.type==="action"?action2.value:action2.type,sanitized=String(value??"").toLowerCase().trim();return actionImgMap[sanitized]??fallback}__name(getActionIcon,"getActionIcon"),__name2(getActionIcon,"getActionIcon");const actionGlyphMap={0:"F",free:"F",1:"A",2:"D",3:"T","1 or 2":"A/D","1 to 3":"A - T","2 or 3":"D/T",reaction:"R"};function getActionGlyph(action2){if(!action2&&action2!==0)return"";const value=typeof action2!="object"?action2:action2.type==="action"?action2.value:action2.type,sanitized=String(value??"").toLowerCase().trim();return actionGlyphMap[sanitized]??""}__name(getActionGlyph,"getActionGlyph"),__name2(getActionGlyph,"getActionGlyph");function ErrorPF2e(message){return Error(`PF2e System | ${message}`)}__name(ErrorPF2e,"ErrorPF2e"),__name2(ErrorPF2e,"ErrorPF2e");function ordinalString(value){const pluralRules=new Intl.PluralRules(game.i18n.lang,{type:"ordinal"}),suffix=game.i18n.localize(`PF2E.OrdinalSuffixes.${pluralRules.select(value)}`);return game.i18n.format("PF2E.OrdinalNumber",{value,suffix})}__name(ordinalString,"ordinalString"),__name2(ordinalString,"ordinalString");function localizeList(items,{conjunction="or"}={}){items=[...items].sort((a,b)=>a.localeCompare(b,game.i18n.lang));const parts=conjunction==="or"?"PF2E.ListPartsOr":"PF2E.ListPartsAnd";if(items.length===0)return"";if(items.length===1)return items[0];if(items.length===2)return game.i18n.format(`${parts}.two`,{first:items[0],second:items[1]});let result=game.i18n.format(`${parts}.start`,{first:items[0],second:"{second}"});for(let i=1;i<=items.length-2;i++)if(i===items.length-2){const end=game.i18n.format(`${parts}.end`,{first:items[i],second:items[items.length-1]});result=result.replace("{second}",end)}else{const newSegment=game.i18n.format(`${parts}.middle`,{first:items[i],second:"{second}"});result=result.replace("{second}",newSegment)}return result}__name(localizeList,"localizeList"),__name2(localizeList,"localizeList");function fontAwesomeIcon(glyph,{style="solid",fixedWidth=!1}={}){const styleClass=`fa-${style}`,glyphClass=glyph.startsWith("fa-")?glyph:`fa-${glyph}`,icon=document.createElement("i");return icon.classList.add(styleClass,glyphClass),fixedWidth&&icon.classList.add("fa-fw"),icon}__name(fontAwesomeIcon,"fontAwesomeIcon"),__name2(fontAwesomeIcon,"fontAwesomeIcon");function isObject(value){return typeof value=="object"&&value!==null}__name(isObject,"isObject"),__name2(isObject,"isObject");function sortLabeledRecord(record){return Object.entries(record).sort((a,b)=>a[1].label.localeCompare(b[1].label,game.i18n.lang)).reduce((copy,[key,value])=>mergeObject(copy,{[key]:value}),{})}__name(sortLabeledRecord,"sortLabeledRecord"),__name2(sortLabeledRecord,"sortLabeledRecord");function sortStringRecord(record){return Object.fromEntries(Object.entries(record).map(entry=>(entry[1]=game.i18n.localize(entry[1]),entry)).sort((a,b)=>a[1].localeCompare(b[1],game.i18n.lang)))}__name(sortStringRecord,"sortStringRecord"),__name2(sortStringRecord,"sortStringRecord");function recursiveReplaceString(source,replace){const clone=Array.isArray(source)||isObject(source)?deepClone(source):source;if(typeof clone=="string")return replace(clone);if(Array.isArray(clone))return clone.map(e=>recursiveReplaceString(e,replace));if(isObject(clone))for(const key of Object.keys(clone))clone[key]=recursiveReplaceString(clone[key],replace);return clone}__name(recursiveReplaceString,"recursiveReplaceString"),__name2(recursiveReplaceString,"recursiveReplaceString");function localizer(prefix){return(...[suffix,formatArgs])=>formatArgs?game.i18n.format(`${prefix}.${suffix}`,formatArgs):game.i18n.localize(`${prefix}.${suffix}`)}__name(localizer,"localizer"),__name2(localizer,"localizer");function configFromLocalization(localization,prefix){return Object.entries(localization).reduce((result,[key,value])=>(result[key]=typeof value=="string"?`${prefix}.${key}`:configFromLocalization(value,`${prefix}.${key}`),result),{})}__name(configFromLocalization,"configFromLocalization"),__name2(configFromLocalization,"configFromLocalization");function isImageFilePath(path){return typeof path=="string"&&Object.keys(CONST.IMAGE_FILE_EXTENSIONS).some(e=>path.endsWith(`.${e}`))}__name(isImageFilePath,"isImageFilePath"),__name2(isImageFilePath,"isImageFilePath");function isVideoFilePath(path){return typeof path=="string"&&Object.keys(CONST.VIDEO_FILE_EXTENSIONS).some(e=>path.endsWith(`.${e}`))}__name(isVideoFilePath,"isVideoFilePath"),__name2(isVideoFilePath,"isVideoFilePath");function isImageOrVideoPath(path){return isImageFilePath(path)||isVideoFilePath(path)}__name(isImageOrVideoPath,"isImageOrVideoPath"),__name2(isImageOrVideoPath,"isImageOrVideoPath");const SORTABLE_DEFAULTS={animation:200,direction:"vertical",dragClass:"drag-preview",dragoverBubble:!0,easing:"cubic-bezier(1, 0, 0, 1)",ghostClass:"drag-gap",scroll:!0,scrollSensitivity:30,scrollSpeed:15};function traitSlugToObject(trait,dictionary){const traitObject={name:trait,label:game.i18n.localize(dictionary[trait]??trait)};return objectHasKey(CONFIG.PF2E.traitsDescriptions,trait)&&(traitObject.description=CONFIG.PF2E.traitsDescriptions[trait]),traitObject}__name(traitSlugToObject,"traitSlugToObject"),__name2(traitSlugToObject,"traitSlugToObject");function transformWhitelist(whitelist){return Array.isArray(whitelist)?whitelist:Object.entries(whitelist).map(([key,locPath])=>({id:key,value:game.i18n.localize(typeof locPath=="string"?locPath:locPath.label)})).sort((a,b)=>a.value.localeCompare(b.value,game.i18n.lang))}__name(transformWhitelist,"transformWhitelist"),__name2(transformWhitelist,"transformWhitelist");function tagify$1(input,{whitelist,maxTags,enforceWhitelist=!0}={}){if(input?.hasAttribute("name")&&input.dataset.dtype!=="JSON")throw ErrorPF2e("Usable only on input elements with JSON data-dtype");if(!input)return null;const whitelistTransformed=whitelist?transformWhitelist(whitelist):[],maxItems=whitelist?Object.keys(whitelistTransformed).length:void 0,tagify2=new Tagify(input,{enforceWhitelist:!!whitelist&&enforceWhitelist,keepInvalidTags:!1,skipInvalid:!!whitelist,maxTags:maxTags??maxItems,dropdown:{enabled:0,maxItems,searchKeys:["id","value"]},whitelist:whitelistTransformed});return input.name&&(tagify2.DOM.scope.dataset.name=input.name),tagify2.DOM.input.blur(),tagify2}__name(tagify$1,"tagify$1"),__name2(tagify$1,"tagify$1");const _DelegatedCollection=class{static{__name(this,"_DelegatedCollection")}constructor(entries=[]){__privateAdd(this,_data,void 0),__privateSet(this,_data,new Collection(entries))}[Symbol.iterator](){return __privateGet(this,_data).values()}get size(){return __privateGet(this,_data).size}get contents(){return __privateGet(this,_data).contents}get(key,options){return __privateGet(this,_data).get(key,options)}set(key,value){return __privateGet(this,_data).set(key,value),this}has(key){return __privateGet(this,_data).has(key)}find(predicate){return __privateGet(this,_data).find(predicate)}some(predicate){return __privateGet(this,_data).some(predicate)}filter(predicate){return __privateGet(this,_data).filter(predicate)}map(callback){return __privateGet(this,_data).map(callback)}delete(key){return __privateGet(this,_data).delete(key)}clear(){__privateGet(this,_data).clear()}};_data=new WeakMap,__name2(_DelegatedCollection,"DelegatedCollection");let DelegatedCollection=_DelegatedCollection;const _Migration601SplitEffectCompendia=class _Migration601SplitEffectCompendia2 extends MigrationBase{static{__name(this,"_Migration601SplitEffectCompendia")}async updateItem(item){typeof item.system.description.value=="string"&&(item.system.description.value=item.system.description.value.replace(/(@Compendium\[pf2e\.)(spell-effects)(\.)([a-zA-Z0-9]{16})(\]{.*?})/g,(_full,first,_replace2,dot,itemId,rest)=>{const packName=objectHasKey(_Migration601SplitEffectCompendia2.effectLocations,itemId)?_Migration601SplitEffectCompendia2.effectLocations[itemId]:"??";return first+packName+dot+itemId+rest})),typeof item.flags.core?.sourceId=="string"&&(item.flags.core.sourceId=item.flags.core.sourceId.replace(/(Compendium\.pf2e\.)(spell-effects)(\.)([a-zA-Z0-9]{16})/g,(_full,first,_replace2,dot,itemId)=>{const packName=objectHasKey(_Migration601SplitEffectCompendia2.effectLocations,itemId)?_Migration601SplitEffectCompendia2.effectLocations[itemId]:"??";return first+packName+dot+itemId}))}async migrate(){for(const macro of game.macros)macro._source.command=macro._source.command.replace(/(Compendium\.pf2e\.)(spell-effects)(\.)([a-zA-Z0-9]{16})/g,(_full,first,_replace2,dot,itemId)=>{const packName=objectHasKey(_Migration601SplitEffectCompendia2.effectLocations,itemId)?_Migration601SplitEffectCompendia2.effectLocations[itemId]:"??";return first+packName+dot+itemId})}};__name2(_Migration601SplitEffectCompendia,"Migration601SplitEffectCompendia"),__publicField(_Migration601SplitEffectCompendia,"version",.601),__publicField(_Migration601SplitEffectCompendia,"effectLocations",{QuZ5frBMJF3gi7RY:"consumable-effects","7z1iY4AaNEAIKuAU":"consumable-effects","1mKjaWC65KWPuFR4":"consumable-effects",mi4Md1fB2XThCand:"consumable-effects",R106i7WCXvHLGMTu:"consumable-effects",kkDbalYEavzRpYlp:"consumable-effects",qVKrrKpTghgMIuGH:"consumable-effects",HeRHBo2NaKy5IxhU:"consumable-effects",tTBJ33UGtzXjWOJp:"consumable-effects",xVAdPzFaSvJXPMKv:"consumable-effects",fYjvLx9DHIdCHdDx:"consumable-effects",kwD0wuW5Ndkc9YXB:"consumable-effects",fIpzDpuwLdIS4tW5:"consumable-effects","1ouUo8lLK6H79Rqh":"consumable-effects",xFQRiVU6h8EA6Lw9:"consumable-effects",MI5OCkF9IXmD2lPF:"consumable-effects",S4MZzALqFoXJsr6o:"consumable-effects",wFF0SZs1Hcf87Kk1:"consumable-effects","2C1HuKDQDGFZuv7l":"consumable-effects",q1EhQ716bPSgJVnC:"consumable-effects",eh7EqmDBDW30ShCu:"consumable-effects",wTZnKkT0K4Tdy8mD:"consumable-effects",Cxa7MdgMCUoMqbKm:"consumable-effects",PeuUz7JaabCgl6Yh:"consumable-effects",lNWACCNe9RYgaFxb:"consumable-effects",j9zVZwRBVAcnpEkE:"consumable-effects",qit1mLbJUyRTYcPU:"consumable-effects",jaBMZKdoywOTrQvP:"consumable-effects",RT1BxXrbbGgk40Ti:"consumable-effects",ztxW3lBPRcesF7wK:"consumable-effects","7vCenP9j6FuHRv5C":"consumable-effects","7UL8belWmo7U5YGM":"consumable-effects",bcxVvIbuZWOvsKcA:"consumable-effects","4tepFOJLhZSelPoa":"consumable-effects",qwoLV4awdezlEJ60:"consumable-effects",GBBjw61g4ekJymT0:"consumable-effects",vFOr2JAJxiVvvn2E:"consumable-effects",BV8RPntjc9FUzD3g:"consumable-effects",kgotU0sFmtAHYySB:"consumable-effects",VCypzSu659eC6jNi:"consumable-effects",wyLEew86nhNUXASu:"consumable-effects",Wa4317cqU4lJ8vAQ:"consumable-effects",Z9oPh462q82IYIZ6:"consumable-effects",EpB7yJPEuG6ez4z3:"consumable-effects",PpLxndUSgzgs6dd0:"consumable-effects",lPRuIRbu0rHBkoKY:"consumable-effects",Yxssrnh9UZJAM0V7:"consumable-effects","9MeHc072G4L8AJkp":"consumable-effects",xLilBqqf34ZJYO9i:"consumable-effects","1l139A2Qik4lBHKO":"consumable-effects","2PNo8u4wxSbz5WEs":"consumable-effects",fUrZ4xcMJz0CfTyG:"consumable-effects","6A8jsLR7upLGuRiv":"consumable-effects",Zdh2uO1vVYJmaqld:"consumable-effects",Mf9EBLhYmZerf0nS:"consumable-effects",ModBoFdCi7YQU4gP:"consumable-effects",W3xQBLj5hLOtb6Tj:"consumable-effects","2Bds6d4UGQZqYSZM":"consumable-effects","6PNLBIdlqqWNCFMy":"consumable-effects","988f6NpOo4YzFzIr":"consumable-effects",VPtsrpbP0AE642al:"consumable-effects",MCny5ohCGf09a7Wl:"consumable-effects",RRusoN3HEGnDO1Dg:"consumable-effects",thOpQunbQr77XWdF:"consumable-effects","9keegq0GdS1eSrNr":"consumable-effects",jw6Tr9FbErjLAFLQ:"consumable-effects","5xgapIXn5DwbXHKh":"consumable-effects",t7VUJHSUT6bkVUjg:"consumable-effects",yrbz0rZzp8aZEqbv:"consumable-effects","16tOZk4qy329s2aK":"consumable-effects",zd85Ny1RS46OL0TD:"consumable-effects",oAewXfq9c0ecaSfw:"consumable-effects",dpIrjd1UPY7EnWUD:"consumable-effects","9FfFhu2kl2wMTsiI":"consumable-effects",v5Ht1V4MZvRKRBjL:"consumable-effects",TkRuKKYyPHTGPfgf:"consumable-effects",XrlChFETfe8avLsX:"consumable-effects",qzRcSQ0HTTp58hV2:"consumable-effects",TsWUTODTVi487SEz:"consumable-effects","5Gof60StUppR2Xn9":"consumable-effects",mG6S6zm6hxaF7Tla:"consumable-effects",zlSNbMDIlTOpcO8R:"consumable-effects",b9DTIJyBT8kvIBpj:"consumable-effects",PEPOd38VfVzQMKG5:"consumable-effects","1xHHvQlW4pRR89qj":"consumable-effects",AMhUb42NAJ1aisZp:"consumable-effects",kwOtHtmlH69ctK0O:"consumable-effects",VrYfR2WuyA15zFhq:"consumable-effects",OAN5Fj21PJPhIqRU:"consumable-effects",e6dXfbKzv5sNr1zh:"consumable-effects",Hnt3Trd7TiFICB06:"consumable-effects",p2aGtovaY1feytws:"equipment-effects",yvabfuAO74pvH8hh:"equipment-effects",etJW0w4CiSFgMrWP:"equipment-effects",vOU4Yv2MyAfYBbmF:"equipment-effects",FbFl95WRpzrrijh3:"equipment-effects",iK6JeCsZwm5Vakks:"equipment-effects",P7Y7pO2ulZ5wBgxU:"equipment-effects",cg5qyeMJUh6b4fta:"equipment-effects",fbSFwwp60AuDDKpK:"equipment-effects","88kqcDmsoAEddzUt":"equipment-effects",lLP56tbG689TNKW5:"equipment-effects",PeiuJ951kkBPTCSM:"equipment-effects",G0lG7IIZnCZtYi6v:"equipment-effects",gDefAEEMXVVZgqXH:"equipment-effects",uXEp1rPU5fY4OiBf:"equipment-effects",Uadsb25G18pKdZ2e:"equipment-effects",viCX9fZzTWGuoO85:"equipment-effects",eeGWTG9ZAha4IIOY:"equipment-effects",ioGzmVSmMGXWWBYb:"equipment-effects",pAMyEbJzWBoYoGhs:"equipment-effects","7dLsA9PAb5ij7Bc6":"equipment-effects",NE7Fm5YnUhD4ySX3:"equipment-effects","8ersuvNJXX00XaIQ":"equipment-effects",EpNflrkmWzQ0lEb4:"equipment-effects",iEkH8BKLMUa2wxLX:"equipment-effects",bP40jr6wE6MCsRvY:"equipment-effects",eSIYyxi6uTKiP6W5:"equipment-effects",E4B02mJmNexQLa8F:"equipment-effects","3O5lvuX4VHqtpCkU":"equipment-effects",ah41XCrV4LFsVyzl:"equipment-effects",W3BCLbX6j1IqL0uB:"equipment-effects",zqKzWGLODgIvtiKf:"equipment-effects",lBMhT2W2raYMa8JS:"equipment-effects","5uK3fmGlfJrbWQz4":"equipment-effects",i0tm2ZHekp7rGGR3:"equipment-effects",Zb8RYgmzCI6fQE0o:"equipment-effects",QapoFh0tbUgMwSIB:"equipment-effects",UlalLihKzDxcOdXL:"equipment-effects",lO95TwgihBdTilAB:"equipment-effects","9PASRixhNM0ogqmG":"equipment-effects","7MgpgF8tOXOiDEwv":"equipment-effects","1S51uIRb9bnZtpFU":"equipment-effects","1nCwQErK6hpkNvfw":"feat-effects","5IGz4iheaiUWm5KR":"feat-effects",uFYvW3kFP9iyNfVX:"feat-effects",CgxYa0lrLUjS2ZhI:"feat-effects",nwkYZs6YwXYAJ4ps:"feat-effects",qUowHpn79Dpt1hVn:"feat-effects",RozqjLocahvQWERr:"feat-effects",tPKXLtDJ3bzJcXlv:"feat-effects",gYpy9XBPScIlY93p:"feat-effects",Im5JBInybWFbHEYS:"feat-effects",BCyGDKcplkJiSAKJ:"feat-effects",PMHwCrnh9W4sMu5b:"feat-effects",pf9yvKNg6jZLrE30:"feat-effects",eeAlh6edygcZIz9c:"feat-effects",b2kWJuCPj1rDMdwz:"feat-effects",UQ7vZgmfK0VSFS8A:"feature-effects",s1tulrmW6teTFjVd:"feature-effects",aKRo5TIhUtu0kyEr:"feature-effects",yfbP64r4a9e5oyli:"feature-effects",n1vhmOd7aNiuR3nk:"feature-effects",FNTTeJHiK6iOjrSq:"feature-effects","3gGBZHcUFsHLJeQH":"feature-effects",rJpkKaPRGaH0pLse:"feature-effects","9AUcoY48H5LrVZiF":"feature-effects",KVbS7AbhQdeuA0J6:"feature-effects","6fb15XuSV4TNuVAT":"feature-effects",vguxP8ukwVTWWWaA:"feature-effects",SVGW8CLKwixFlnTv:"feature-effects",ruRAfGJnik7lRavk:"feature-effects",uBJsxCzNhje8m8jj:"feature-effects","7BFd8A9HFrmg6vwL":"feature-effects",z3uyCMBddrPK5umr:"feature-effects",Nv70aqcQgCBpDYp8:"feature-effects",OqH6IaeOwRWkGPrk:"feature-effects",Lb4q2bBAgxamtix5:"feature-effects",Gqy7K6FnbLtwGpud:"spell-effects","41WThj17MZBXTO2X":"spell-effects",sPCWrhUHqlbGhYSD:"spell-effects","3qHKBDF7lrHw8jFK":"spell-effects",l9HRQggofFGIxEse:"spell-effects",beReeFroAx24hj83:"spell-effects",qkwb5DD3zmKwvbk0:"spell-effects",GnWkI3T3LYRlm3X8:"spell-effects",dWbg2gACxMkSnZag:"spell-effects",Jemq5UknGdMO7b73:"spell-effects",LXf1Cqi1zyo4DaLv:"spell-effects"});let Migration601SplitEffectCompendia=_Migration601SplitEffectCompendia;const _Migration602UpdateDiehardFeat=class extends MigrationBase{static{__name(this,"_Migration602UpdateDiehardFeat")}constructor(){super(),__publicField(this,"requiresFlush",!0),__privateAdd(this,_diehardPromise,void 0),__privateSet(this,_diehardPromise,fromUuid("Compendium.pf2e.feats-srd.I0BhPWqYf1bbzEYg"))}async updateActor(source){const diehard=source.items.find(itemData=>itemData.system.slug==="diehard"&&itemData.type==="feat");if(source.type==="character"&&diehard!==void 0&&"dying"in source.system.attributes&&isObject(source.system.attributes.dying)){source.system.attributes.dying.max=4;const diehardIndex=source.items.indexOf(diehard),newDiehard=await __privateGet(this,_diehardPromise);if(!(newDiehard instanceof FeatPF2e))throw Error("PF2E System | Expected item not found in Compendium");source.items.splice(diehardIndex,1,newDiehard.toObject())}}};_diehardPromise=new WeakMap,__name2(_Migration602UpdateDiehardFeat,"Migration602UpdateDiehardFeat"),__publicField(_Migration602UpdateDiehardFeat,"version",.602);let Migration602UpdateDiehardFeat=_Migration602UpdateDiehardFeat;const _Migration603ResetQuickRollDefault=class extends MigrationBase{static{__name(this,"_Migration603ResetQuickRollDefault")}async updateUser(userData){const flags=userData.flags;isObject(flags.PF2e)&&isObject(flags.PF2e.settings)&&typeof flags.PF2e.settings.quickD20roll=="boolean"&&(flags.PF2e.settings.quickD20roll=!1)}};__name2(_Migration603ResetQuickRollDefault,"Migration603ResetQuickRollDefault"),__publicField(_Migration603ResetQuickRollDefault,"version",.603);let Migration603ResetQuickRollDefault=_Migration603ResetQuickRollDefault;const _Migration604FixClassItem=class extends MigrationBase{static{__name(this,"_Migration604FixClassItem")}async updateItem(item){item.type==="class"&&(Array.isArray(item.system.ancestryFeatLevels)&&(item.system.ancestryFeatLevels={value:item.system.ancestryFeatLevels}),Array.isArray(item.system.classFeatLevels)&&(item.system.classFeatLevels={value:item.system.classFeatLevels}),Array.isArray(item.system.skillFeatLevels)&&(item.system.skillFeatLevels={value:item.system.skillFeatLevels}),Array.isArray(item.system.generalFeatLevels)&&(item.system.generalFeatLevels={value:item.system.generalFeatLevels}),Array.isArray(item.system.skillIncreaseLevels)&&(item.system.skillIncreaseLevels={value:item.system.skillIncreaseLevels}),Array.isArray(item.system.abilityBoostLevels)&&(item.system.abilityBoostLevels={value:item.system.abilityBoostLevels}))}};__name2(_Migration604FixClassItem,"Migration604FixClassItem"),__publicField(_Migration604FixClassItem,"version",.604);let Migration604FixClassItem=_Migration604FixClassItem;const PHYSICAL_ITEM_TYPES=new Set(["armor","backpack","book","consumable","equipment","treasure","weapon"]),BULK_VALUES=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","L"],PRECIOUS_MATERIAL_TYPES=new Set(["abysium","adamantine","cold-iron","darkwood","djezet","dragonhide","grisantian-pelt","inubrix","keep-stone","mithral","noqual","orichalcum","peachwood","siccatite","silver","sisterstone","sisterstone-dusk","sisterstone-scarlet","sovereign-steel","warpglass"]),PRECIOUS_MATERIAL_GRADES=new Set(["low","standard","high"]),DENOMINATIONS=["pp","gp","sp","cp"];function isItemSystemData(data){return isObject(data)&&isObject(data.description)&&typeof data.description.value=="string"&&Array.isArray(data.rules)&&(data.slug===null||typeof data.slug=="string")}__name(isItemSystemData,"isItemSystemData"),__name2(isItemSystemData,"isItemSystemData");function isPhysicalData(source){return setHasElement(PHYSICAL_ITEM_TYPES,source.type)}__name(isPhysicalData,"isPhysicalData"),__name2(isPhysicalData,"isPhysicalData");function hasInvestedProperty(source){return isPhysicalData(source)&&"invested"in source.system.equipped}__name(hasInvestedProperty,"hasInvestedProperty"),__name2(hasInvestedProperty,"hasInvestedProperty");const _Migration605CatchUpToTemplateJSON=class extends MigrationBase{static{__name(this,"_Migration605CatchUpToTemplateJSON")}addEffects(entityData){Array.isArray(entityData.effects)||(entityData.effects=[])}async updateActor(actorData){if(this.addEffects(actorData),actorData.type==="character"||actorData.type==="npc"){if("max"in actorData.system.attributes.hp&&typeof actorData.system.attributes.hp.max=="string"){const newMax=parseInt(actorData.system.attributes.hp.max,10);Number.isInteger(newMax)&&(actorData.system.attributes.hp.max=newMax)}if(typeof actorData.system.attributes.hp.value=="string"){const newValue=parseInt(actorData.system.attributes.hp.value,10);Number.isInteger(newValue)&&(actorData.system.attributes.hp.value=newValue)}if(typeof actorData.system.details.level.value=="string"){const newLevel=parseInt(actorData.system.details.level.value,10);Number.isInteger(newLevel)&&(actorData.system.details.level.value=newLevel)}"tempmax"in actorData.system.attributes.hp&&delete actorData.system.attributes.hp.tempmax,"special"in actorData.system.attributes.speed&&delete actorData.system.attributes.speed.special}}async updateItem(itemData,actorData){this.addEffects(itemData),!itemData.system.slug&&actorData&&(itemData.system.slug=null),Array.isArray(itemData.system.rules)||(itemData.system.rules=[]);const traits=itemData.system.traits;if(traits&&!traits.custom&&(traits.custom=""),traits&&!traits.rarity&&(traits.rarity={value:"common"}),isPhysicalData(itemData)&&!itemData.system.identification){const withoutIdentifyData=itemData.system;withoutIdentifyData.identification.status="identified"}itemData.type==="spell"&&!itemData.system.hasCounteractCheck&&(itemData.system.hasCounteractCheck={value:!1}),itemData.type==="lore"&&"featType"in itemData.system&&delete itemData.system.featType,itemData.type==="action"&&"skill_requirements"in itemData.system&&delete itemData.system.skill_requirements,itemData.type==="action"&&"skill_requirement"in itemData.system&&itemData.system.skill_requirement}};__name2(_Migration605CatchUpToTemplateJSON,"Migration605CatchUpToTemplateJSON"),__publicField(_Migration605CatchUpToTemplateJSON,"version",.605);let Migration605CatchUpToTemplateJSON=_Migration605CatchUpToTemplateJSON;const _Migration606SignatureSpells=class extends MigrationBase{static{__name(this,"_Migration606SignatureSpells")}async updateItem(item){if(item.type==="spellcastingEntry"){const data=item.system;data.signatureSpells||(data.signatureSpells={value:[]})}}};__name2(_Migration606SignatureSpells,"Migration606SignatureSpells"),__publicField(_Migration606SignatureSpells,"version",.606);let Migration606SignatureSpells=_Migration606SignatureSpells;const _Migration607MeleeItemDamageRolls=class extends MigrationBase{static{__name(this,"_Migration607MeleeItemDamageRolls")}async updateItem(itemData){if(itemData.type==="melee"&&Array.isArray(itemData.system.damageRolls)){const damageRolls={};itemData.system.damageRolls.forEach(roll=>{const key=randomID(20);damageRolls[key]=roll}),itemData.system.damageRolls=damageRolls}}};__name2(_Migration607MeleeItemDamageRolls,"Migration607MeleeItemDamageRolls"),__publicField(_Migration607MeleeItemDamageRolls,"version",.607);let Migration607MeleeItemDamageRolls=_Migration607MeleeItemDamageRolls;const _Migration608DeletePersistedKits=class extends MigrationBase{static{__name(this,"_Migration608DeletePersistedKits")}async updateItem(itemData,actorData){if(actorData&&itemData.type==="kit"){const index=actorData.items.indexOf(itemData);actorData.items.splice(index,1)}}};__name2(_Migration608DeletePersistedKits,"Migration608DeletePersistedKits"),__publicField(_Migration608DeletePersistedKits,"version",.608);let Migration608DeletePersistedKits=_Migration608DeletePersistedKits;const _Migration609LootActorTraits=class extends MigrationBase{static{__name(this,"_Migration609LootActorTraits")}async updateActor(source){if(source.type==="loot"&&source.system.traits&&"traits"in source.system.traits){const systemData=source.system;systemData.traits||(systemData.traits={rarity:{value:"common"},size:{value:"med"},traits:{value:[]},di:{value:[]},dr:[],dv:[],ci:[]})}}};__name2(_Migration609LootActorTraits,"Migration609LootActorTraits"),__publicField(_Migration609LootActorTraits,"version",.609);let Migration609LootActorTraits=_Migration609LootActorTraits;const _Migration610SetHeritageFeatType=class extends MigrationBase{static{__name(this,"_Migration610SetHeritageFeatType")}async updateItem(source){const itemTraits=source.system.traits?.value;if(source.type==="feat"&&itemTraits?.includes("heritage")){const{system}=source,featType="featType"in system&&isObject(system.featType)&&"value"in system.featType&&typeof system.featType.value=="string"?system.featType:{value:""};featType.value="heritage";const index=itemTraits.indexOf("heritage");itemTraits.splice(index,1)}}};__name2(_Migration610SetHeritageFeatType,"Migration610SetHeritageFeatType"),__publicField(_Migration610SetHeritageFeatType,"version",.61);let Migration610SetHeritageFeatType=_Migration610SetHeritageFeatType;const _Migration611UpdateToughnessMountainsStoutness=class extends MigrationBase{static{__name(this,"_Migration611UpdateToughnessMountainsStoutness")}constructor(){super(),__publicField(this,"requiresFlush",!0),__privateAdd(this,_featSlugs,["mountains-stoutness","mountain-s-stoutness","toughness"]),__privateAdd(this,_featsPromise,void 0),__privateSet(this,_featsPromise,game.packs.get("pf2e.feats-srd").getDocuments())}async updateActor(actorData){if(actorData.type!=="character")return;const oldFeatsData=actorData.items.filter(itemData=>__privateGet(this,_featSlugs).includes(itemData.system.slug??"")&&itemData.type==="feat");for(const oldFeatData of oldFeatsData){oldFeatData.system.slug==="mountain-s-stoutness"&&(oldFeatData.system.slug="mountains-stoutness");const newFeat=oldFeatData.system.slug==="toughness"?(await __privateGet(this,_featsPromise)).find(feat=>feat.slug==="toughness"):(await __privateGet(this,_featsPromise)).find(feat=>feat.slug==="mountains-stoutness");if(!(newFeat instanceof FeatPF2e))throw ErrorPF2e("Expected item not found in Compendium");newFeat._source.system.location=oldFeatData.system.location;const oldFeatIndex=actorData.items.indexOf(oldFeatData);actorData.items.splice(oldFeatIndex,1,newFeat.toObject())}}};_featSlugs=new WeakMap,_featsPromise=new WeakMap,__name2(_Migration611UpdateToughnessMountainsStoutness,"Migration611UpdateToughnessMountainsStoutness"),__publicField(_Migration611UpdateToughnessMountainsStoutness,"version",.611);let Migration611UpdateToughnessMountainsStoutness=_Migration611UpdateToughnessMountainsStoutness;const _Migration612NormalizeRarities=class extends MigrationBase{static{__name(this,"_Migration612NormalizeRarities")}async updateActor(source){const traitsRaw=source.system.traits;if(source.type==="familiar"||!traitsRaw)return;const traitsAndOtherMiscellany=traitsRaw;"rarity"in traitsAndOtherMiscellany||(traitsAndOtherMiscellany.rarity={value:"common"});const rarities=["common","uncommon","rare","unique"];for(const rarity of rarities){const{traits}=traitsAndOtherMiscellany;if(traits?.value.includes(rarity)){const index=traits.value.indexOf(rarity);traits.value.splice(index,1),traitsAndOtherMiscellany.rarity={value:rarity}}}}};__name2(_Migration612NormalizeRarities,"Migration612NormalizeRarities"),__publicField(_Migration612NormalizeRarities,"version",.612);let Migration612NormalizeRarities=_Migration612NormalizeRarities;const _Migration613RemoveAmmoCharges=class extends MigrationBase{static{__name(this,"_Migration613RemoveAmmoCharges")}async updateItem(itemData){itemData.type==="consumable"&&itemData.system.consumableType.value==="ammo"&&(itemData.system.charges.value=0,itemData.system.charges.max=0)}};__name2(_Migration613RemoveAmmoCharges,"Migration613RemoveAmmoCharges"),__publicField(_Migration613RemoveAmmoCharges,"version",.613);let Migration613RemoveAmmoCharges=_Migration613RemoveAmmoCharges;const _Migration614NumifyMeleeBonuses=class extends MigrationBase{static{__name(this,"_Migration614NumifyMeleeBonuses")}async updateItem(itemData){itemData.type==="melee"&&(itemData.system.bonus={value:Number(itemData.system.bonus.value)})}};__name2(_Migration614NumifyMeleeBonuses,"Migration614NumifyMeleeBonuses"),__publicField(_Migration614NumifyMeleeBonuses,"version",.614);let Migration614NumifyMeleeBonuses=_Migration614NumifyMeleeBonuses;const _Migration615RemoveInstinctTrait=class extends MigrationBase{static{__name(this,"_Migration615RemoveInstinctTrait")}async updateItem(itemData){const traits=itemData.system.traits;traits&&(typeof traits.value=="string"?traits.value=[]:traits.value=traits.value?.filter(trait=>trait!=="instinct"))}};__name2(_Migration615RemoveInstinctTrait,"Migration615RemoveInstinctTrait"),__publicField(_Migration615RemoveInstinctTrait,"version",.615);let Migration615RemoveInstinctTrait=_Migration615RemoveInstinctTrait;const _Migration616MigrateFeatPrerequisites=class extends MigrationBase{static{__name(this,"_Migration616MigrateFeatPrerequisites")}async updateItem(source){if(source.type==="feat"){const update=[],prerequisites=source.system.prerequisites;if(prerequisites.value){if(typeof prerequisites.value=="string")update.push({value:prerequisites.value});else if(Array.isArray(prerequisites.value))for(const p of prerequisites.value)p&&update.push({value:isObject(p)&&typeof p.value=="string"?p.value:String(p)})}else if(Array.isArray(prerequisites))for(const p of prerequisites)p&&update.push({value:p?.value?p.value:p});source.system.prerequisites={value:update}}}};__name2(_Migration616MigrateFeatPrerequisites,"Migration616MigrateFeatPrerequisites"),__publicField(_Migration616MigrateFeatPrerequisites,"version",.616);let Migration616MigrateFeatPrerequisites=_Migration616MigrateFeatPrerequisites;const _Migration617FixUserFlags=class extends MigrationBase{static{__name(this,"_Migration617FixUserFlags")}async updateUser(source){const flags=source.flags,settings=flags.PF2e?.settings;if(isObject(settings)&&typeof settings.color=="string"){const uiTheme=settings.color??"blue",showRollDialogs=!settings.quickD20roll;flags.pf2e??={},flags.pf2e.settings={uiTheme,showEffectPanel:flags.pf2e?.showEffectPanel??!0,showRollDialogs},delete flags.PF2e,flags["-=PF2e"]=null}}};__name2(_Migration617FixUserFlags,"Migration617FixUserFlags"),__publicField(_Migration617FixUserFlags,"version",.617);let Migration617FixUserFlags=_Migration617FixUserFlags;const _Migration618MigrateItemImagePaths=class extends MigrationBase{static{__name(this,"_Migration618MigrateItemImagePaths")}constructor(){super(...arguments),__privateAdd(this,_IMAGE_PATHS,{"systems/pf2e/icons/equipment/weapons/blowgun.png":"systems/pf2e/icons/equipment/weapons/blowgun.jpg","systems/pf2e/icons/equipment/weapons/trident.png":"systems/pf2e/icons/equipment/weapons/trident.jpg","systems/pf2e/icons/equipment/weapons/longsword.png":"systems/pf2e/icons/equipment/weapons/longsword.jpg","systems/pf2e/icons/equipment/weapons/composite-longbow.png":"systems/pf2e/icons/equipment/weapons/composite-longbow.jpg","systems/pf2e/icons/equipment/weapons/composite-shortbow.png":"systems/pf2e/icons/equipment/weapons/composite-shortbow.jpg","systems/pf2e/icons/equipment/weapons/dagger.png":"systems/pf2e/icons/equipment/weapons/dagger.jpg","systems/pf2e/icons/equipment/weapons/katar.png":"systems/pf2e/icons/equipment/weapons/katar.jpg","systems/pf2e/icons/equipment/weapons/kukri.png":"systems/pf2e/icons/equipment/weapons/kukri.jpg","systems/pf2e/icons/equipment/weapons/shortbow.png":"systems/pf2e/icons/equipment/weapons/shortbow.jpg","systems/pf2e/icons/equipment/weapons/scimitar.png":"systems/pf2e/icons/equipment/weapons/scimitar.jpg","systems/pf2e/icons/equipment/weapons/hatchet.png":"systems/pf2e/icons/equipment/weapons/hatchet.jpg","systems/pf2e/icons/equipment/weapons/halfling-sling-staff.png":"systems/pf2e/icons/equipment/weapons/halfling-sling-staff.jpg","systems/pf2e/icons/equipment/weapons/halberd.png":"systems/pf2e/icons/equipment/weapons/halberd.jpg","systems/pf2e/icons/equipment/weapons/shield-spikes.png":"systems/pf2e/icons/equipment/weapons/shield-spikes.jpg","systems/pf2e/icons/equipment/weapons/light-mace.jpg":"systems/pf2e/icons/equipment/weapons/light-mace.jpg","systems/pf2e/icons/equipment/weapons/morningstar.png":"systems/pf2e/icons/equipment/weapons/morningstar.jpg","systems/pf2e/icons/equipment/weapons/sling.png":"systems/pf2e/icons/equipment/weapons/sling.jpg","systems/pf2e/icons/equipment/weapons/main-gauche.png":"systems/pf2e/icons/equipment/weapons/main-gauche.jpg","systems/pf2e/icons/equipment/weapons/bastard-sword.png":"systems/pf2e/icons/equipment/weapons/bastard-sword.jpg","systems/pf2e/icons/equipment/weapons/spear.png":"systems/pf2e/icons/equipment/weapons/spear.jpg","systems/pf2e/icons/equipment/weapons/staff.png":"systems/pf2e/icons/equipment/weapons/staff.jpg","systems/pf2e/icons/equipment/weapons/katana.png":"systems/pf2e/icons/equipment/weapons/katana.jpg","systems/pf2e/icons/equipment/weapons/elven-curve-blade.png":"systems/pf2e/icons/equipment/weapons/elven-curve-blade.jpg","systems/pf2e/icons/equipment/weapons/bo-staff.png":"systems/pf2e/icons/equipment/weapons/bo-staff.jpg","systems/pf2e/icons/equipment/weapons/clan-dagger.png":"systems/pf2e/icons/equipment/weapons/clan-dagger.jpg","systems/pf2e/icons/equipment/weapons/dogslicer.png":"systems/pf2e/icons/equipment/weapons/dogslicer.jpg","systems/pf2e/icons/equipment/weapons/falchion.png":"systems/pf2e/icons/equipment/weapons/falchion.jpg","systems/pf2e/icons/equipment/weapons/fist.png":"systems/pf2e/icons/equipment/weapons/fist.jpg","systems/pf2e/icons/equipment/weapons/gauntlet.png":"systems/pf2e/icons/equipment/weapons/gauntlet.jpg","systems/pf2e/icons/equipment/weapons/gnome-hooked-hammer.png":"systems/pf2e/icons/equipment/weapons/gnome-hooked-hammer.jpg","systems/pf2e/icons/equipment/weapons/greatpick.png":"systems/pf2e/icons/equipment/weapons/greatpick.jpg","systems/pf2e/icons/equipment/weapons/guisarme.png":"systems/pf2e/icons/equipment/weapons/guisarme.jpg","systems/pf2e/icons/equipment/weapons/horsechopper.png":"systems/pf2e/icons/equipment/weapons/horsechopper.jpg","systems/pf2e/icons/equipment/weapons/lance.png":"systems/pf2e/icons/equipment/weapons/lance.jpg","systems/pf2e/icons/equipment/weapons/maul.png":"systems/pf2e/icons/equipment/weapons/maul.jpg","systems/pf2e/icons/equipment/weapons/pick.png":"systems/pf2e/icons/equipment/weapons/pick.jpg","systems/pf2e/icons/equipment/weapons/ranseur.png":"systems/pf2e/icons/equipment/weapons/ranseur.jpg","systems/pf2e/icons/equipment/weapons/sai.png":"systems/pf2e/icons/equipment/weapons/sai.jpg","systems/pf2e/icons/equipment/weapons/sawtooth-saber.png":"systems/pf2e/icons/equipment/weapons/sawtooth-saber.jpg","systems/pf2e/icons/equipment/weapons/shield-bash.png":"systems/pf2e/icons/equipment/weapons/shield-bash.jpg","systems/pf2e/icons/equipment/weapons/shield-boss.png":"systems/pf2e/icons/equipment/weapons/shield-boss.jpg","systems/pf2e/icons/equipment/weapons/shuriken.png":"systems/pf2e/icons/equipment/weapons/shuriken.jpg","systems/pf2e/icons/equipment/weapons/spiked-gauntlet.png":"systems/pf2e/icons/equipment/weapons/spiked-gauntlet.jpg","systems/pf2e/icons/equipment/weapons/broom.png":"systems/pf2e/icons/equipment/held-items/broom-of-flying.jpg","systems/pf2e/icons/equipment/weapons/cutlass.png":"systems/pf2e/icons/equipment/weapons/scimitar.jpg","systems/pf2e/icons/equipment/weapons/scalpel.png":"systems/pf2e/icons/equipment/weapons/war-razor.jpg","systems/pf2e/icons/equipment/weapons/cane.png":"systems/pf2e/icons/equipment/weapons/cane.jpg"})}async updateItem(itemData){itemData.img=__privateGet(this,_IMAGE_PATHS)[itemData.img]??itemData.img}};_IMAGE_PATHS=new WeakMap,__name2(_Migration618MigrateItemImagePaths,"Migration618MigrateItemImagePaths"),__publicField(_Migration618MigrateItemImagePaths,"version",.618);let Migration618MigrateItemImagePaths=_Migration618MigrateItemImagePaths;const LEGIT_TRADITIONS=["arcane","divine","occult","primal","focus","ritual","halcyon",""];function makeLowercase(value){return value.toLowerCase()}__name(makeLowercase,"makeLowercase"),__name2(makeLowercase,"makeLowercase");const _Migration619TraditionLowercaseAndRemoveWandScroll=class extends MigrationBase{static{__name(this,"_Migration619TraditionLowercaseAndRemoveWandScroll")}async updateItem(item,actorData){if(!actorData||item.type!=="spellcastingEntry")return;const tradition=item.system.tradition;if(tradition.value=makeLowercase(tradition.value),tupleHasValue(LEGIT_TRADITIONS,item.system.tradition.value))return;const highestTradition=actorData.items.filter(itemData=>itemData.type==="spellcastingEntry").reduce((prev,current)=>{if(tupleHasValue(LEGIT_TRADITIONS,current.system.tradition.value)){const value=current.system.spelldc.value??0;if(value>prev.value)return{name:current.system.tradition.value,value}}return prev},{name:"arcane",value:0});tradition.value=highestTradition.name}};__name2(_Migration619TraditionLowercaseAndRemoveWandScroll,"Migration619TraditionLowercaseAndRemoveWandScroll"),__publicField(_Migration619TraditionLowercaseAndRemoveWandScroll,"version",.619);let Migration619TraditionLowercaseAndRemoveWandScroll=_Migration619TraditionLowercaseAndRemoveWandScroll;const _Migration620RenameToWebp=class extends MigrationBase{static{__name(this,"_Migration620RenameToWebp")}constructor(){super(...arguments),__privateAdd(this,_renameToWebP),__privateAdd(this,_isABCK),__privateAdd(this,_regexp,/(\/?systems\/pf2e\/[^"]+)\.(?:jpg|png)\b/)}async updateActor(source){source.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,source.img),typeof source.prototypeToken?.texture.src=="string"&&(source.prototypeToken.texture.src=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,source.prototypeToken.texture.src));for(const effect of source.effects??[])effect.icon=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,effect.icon);if(source.type==="character"){const details=source.system.details;details.deity&&(details.deity.image=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,details.deity.image))}}async updateItem(itemData){itemData.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,itemData.img);for(const effect of itemData.effects??[])effect.icon=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,effect.icon);if(__privateMethod(this,_isABCK,isABCK_fn).call(this,itemData)){const embedData=itemData.system.items,embeds=Object.values(embedData).filter(maybeEmbed=>!!maybeEmbed);for(const embed of embeds)if(embed.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,embed.img),"items"in embed&&embed.items){const deepEmbeds=Object.values(embed.items).filter(maybeDeepEmbed=>!!maybeDeepEmbed);for(const deepEmbed of deepEmbeds)deepEmbed.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,deepEmbed.img)}}}async updateMacro(macroData){macroData.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,macroData.img)}async updateTable(tableData){tableData.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,tableData.img);for(const result of tableData.results)result.img=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,result.img)}async updateToken(tokenData){tokenData.texture.src=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,tokenData.texture.src),tokenData.effects=tokenData.effects.filter(texture=>!__privateGet(this,_regexp).test(texture))}async updateUser(source){source.avatar=__privateMethod(this,_renameToWebP,renameToWebP_fn).call(this,source.avatar)}};_regexp=new WeakMap,_renameToWebP=new WeakSet,renameToWebP_fn=__name2(function(imgPath){return typeof imgPath=="string"&&__privateGet(this,_regexp).test(imgPath)?imgPath.replace(__privateGet(this,_regexp),"$1.webp"):imgPath?.replace("icons/svg/mystery-man.svg","systems/pf2e/icons/default-icons/mystery-man.svg")},"#renameToWebP"),_isABCK=new WeakSet,isABCK_fn=__name2(function(itemData){return["ancestry","background","class","kit"].includes(itemData.type)},"#isABCK"),__name2(_Migration620RenameToWebp,"Migration620RenameToWebp"),__publicField(_Migration620RenameToWebp,"version",.62);let Migration620RenameToWebp=_Migration620RenameToWebp;const MAGIC_SCHOOLS=new Set(["abjuration","conjuration","divination","enchantment","evocation","illusion","necromancy","transmutation"]),MAGIC_TRADITIONS=new Set(["arcane","divine","occult","primal"]),_Migration621RemoveConfigSpellSchools=class extends MigrationBase{static{__name(this,"_Migration621RemoveConfigSpellSchools")}KEY_MAP={abj:"abjuration",con:"conjuration",div:"divination",enc:"enchantment",evo:"evocation",ill:"illusion",nec:"necromancy",trs:"transmutation"};reassignSchool(abbreviation){return objectHasKey(this.KEY_MAP,abbreviation)?this.KEY_MAP[abbreviation]:setHasElement(MAGIC_SCHOOLS,abbreviation)?abbreviation:this.KEY_MAP.evo}async updateItem(itemData){if(itemData.type==="spell"){const school=itemData.system.school??{value:"evocation"};school.value=this.reassignSchool(school.value)}}};__name2(_Migration621RemoveConfigSpellSchools,"Migration621RemoveConfigSpellSchools"),__publicField(_Migration621RemoveConfigSpellSchools,"version",.621);let Migration621RemoveConfigSpellSchools=_Migration621RemoveConfigSpellSchools;const _Migration623NumifyPotencyRunes=class extends MigrationBase{static{__name(this,"_Migration623NumifyPotencyRunes")}async updateItem(itemData){if(!(itemData.type==="weapon"||itemData.type==="armor"))return;const potencyRune=itemData.system.potencyRune;potencyRune?potencyRune.value=Number(itemData.system.potencyRune.value)||null:itemData.system.potencyRune={value:null}}};__name2(_Migration623NumifyPotencyRunes,"Migration623NumifyPotencyRunes"),__publicField(_Migration623NumifyPotencyRunes,"version",.623);let Migration623NumifyPotencyRunes=_Migration623NumifyPotencyRunes;const _Migration624RemoveTokenEffectIconFlags=class extends MigrationBase{static{__name(this,"_Migration624RemoveTokenEffectIconFlags")}async updateActor(actorData){const flags=actorData.flags;flags.pf2e?.token?.effects&&(delete flags.pf2e.token.effects,"game"in globalThis&&(flags.pf2e.token["-=effects"]=null))}async updateToken(tokenData){const flags=tokenData.delta?.flags??{};flags.pf2e?.token?.effects&&(delete flags.pf2e.token.effects,"game"in globalThis&&(flags.pf2e.token["-=effects"]=null))}};__name2(_Migration624RemoveTokenEffectIconFlags,"Migration624RemoveTokenEffectIconFlags"),__publicField(_Migration624RemoveTokenEffectIconFlags,"version",.624);let Migration624RemoveTokenEffectIconFlags=_Migration624RemoveTokenEffectIconFlags;const _Migration625EnsurePresenceOfSaves=class extends MigrationBase{static{__name(this,"_Migration625EnsurePresenceOfSaves")}async updateActor(actorData){if(actorData.type!=="npc")return;const saves=actorData.system.saves;for(const key of["fortitude","reflex","will"])saves[key]??={value:0,saveDetail:""},typeof saves[key].value!="number"&&(saves[key].value=Number(saves[key].value)||0),typeof saves[key].saveDetail!="string"&&(saves[key].saveDetail="")}};__name2(_Migration625EnsurePresenceOfSaves,"Migration625EnsurePresenceOfSaves"),__publicField(_Migration625EnsurePresenceOfSaves,"version",.625);let Migration625EnsurePresenceOfSaves=_Migration625EnsurePresenceOfSaves;const _Migration626UpdateSpellCategory=class extends MigrationBase{static{__name(this,"_Migration626UpdateSpellCategory")}async updateItem(source){if(source.type!=="spell")return;const systemData=source.system,traditions=systemData.traditions,isFocus=traditions.value.includes("focus"),isRitual=traditions.value.includes("ritual");if(typeof traditions.value=="string"&&(traditions.value=[]),systemData.spellCategorie||systemData.spellCategory){const currentCategory=systemData.spellCategorie?.value??systemData.spellCategory?.value??"";source.system.category={value:isFocus?"focus":isRitual?"ritual":currentCategory===""?"spell":currentCategory},delete systemData.spellCategorie,delete systemData.spellCategory,"game"in globalThis&&(systemData["-=spellCategorie"]=null,systemData["-=spellCategory"]=null)}["focus","ritual"].includes(source.system.spellType.value)&&(source.system.spellType.value="utility"),traditions.value=traditions.value.filter(tradition=>!["focus","ritual"].includes(tradition))}};__name2(_Migration626UpdateSpellCategory,"Migration626UpdateSpellCategory"),__publicField(_Migration626UpdateSpellCategory,"version",.626);let Migration626UpdateSpellCategory=_Migration626UpdateSpellCategory;const _Migration627LowerCaseSpellSaves=class extends MigrationBase{static{__name(this,"_Migration627LowerCaseSpellSaves")}async updateItem(itemData){if(itemData.type!=="spell")return;const saveType=itemData.system.save.value?.toLowerCase()??"";tupleHasValue(["fortitude","reflex","will"],saveType)?itemData.system.save.value=saveType:itemData.system.save.value=""}};__name2(_Migration627LowerCaseSpellSaves,"Migration627LowerCaseSpellSaves"),__publicField(_Migration627LowerCaseSpellSaves,"version",.627);let Migration627LowerCaseSpellSaves=_Migration627LowerCaseSpellSaves;const _Migration629SetBaseItems=class extends MigrationBase{static{__name(this,"_Migration629SetBaseItems")}constructor(){super(...arguments),__privateAdd(this,_BASE_ARMORS,["explorers-clothing","padded-armor","leather-armor","studded-leather-armor","chain-shirt","hide-armor","scale-mail","chain-mail","breastplate","splint-mail","half-plate","full-plate","hellknight-plate"]),__privateAdd(this,_MAGIC_ARMOR_TO_BASE,{"breastplate-of-command-greater":"breastplate","breastplate-of-command":"breastplate","celestial-armor":"chain-mail","demon-armor":"full-plate",dragonplate:"full-plate","electric-eelskin":"leather-armor","forgotten-shell":"full-plate","ghoul-hide":"hide-armor","glorious-plate":"full-plate","impenetrable-scale":"scale-mail","jerkin-of-liberation":"studded-leather-armor","mail-of-luck":"splint-mail","moonlit-chain":"chain-shirt","noxious-jerkin":"padded-armor","numerian-steel-breastplate":"breastplate","plate-armor-of-the-deep":"full-plate","rhino-hide":"hide-armor","spangled-riders-suit":"studded-leather-armor","victory-plate":"full-plate"}),__privateAdd(this,_BASE_WEAPONS,["adze","aklys","alchemical-bomb","alchemical-crossbow","aldori-dueling-sword","arrows","bastard-sword","battle-axe","battle-lute","bladed-diabolo","bladed-hoop","bladed-scarf","blowgun-darts","blowgun","bo-staff","boarding-axe","boarding-pike","bola","bolts","buugeng","clan-dagger","claw","claw-blade","club","combat-grapnel","composite-longbow","composite-shortbow","crossbow","dagger","daikyu","dart","dogslicer","dwarven-war-axe","elven-curve-blade","exquisite-sword-cane-sheath","exquisite-sword-cane","falchion","fangwire","fauchard","fighting-fan","filchers-fork","fire-poi","fist","flail","gaff","gauntlet","gill-hook","glaive","gnome-flickmace","gnome-hooked-hammer","greataxe","greatclub","greatpick","greatsword","guisarme","halberd","halfling-sling-staff","hand-adze","hand-crossbow","hatchet","heavy-crossbow","horsechopper","javelin","jaws","juggling-club","kama","katana","katar","khakkhara","khopesh","kukri","lance","light-hammer","light-mace","light-pick","longbow","longspear","longsword","mace","machete","main-gauche","mambele","maul","meteor-hammer","monkeys-fist","morningstar","naginata","nightstick","nine-ring-sword","nunchaku","ogre-hook","orc-knuckle-dagger","orc-necksplitter","pick","poi","polytool","ranseur","rapier","rhoka-sword","rungu","sai","sap","sawtooth-saber","scimitar","scorpion-whip","scourge","scythe","shears","shield-bash","shield-boss","shield-spikes","shortbow","shortsword","shuriken","sickle","sling-bullets","sling","spear","spiked-chain","spiked-gauntlet","staff","starknife","stiletto-pen","sword-cane","tamchal-chakram","taw-launcher","tekko-kagi","temple-sword","tengu-gale-blade","throwing-knife","thunder-sling","tricky-pick","trident","urumi","wakizashi","war-flail","war-razor","warhammer","whip-claw","whip","wish-blade","wish-knife","wooden-taws"])}async updateItem(itemData){if(!isPhysicalData(itemData))return;const systemData=itemData.system;!systemData.slug||itemData.type!=="armor"&&itemData.type!=="weapon"||(itemData.type==="armor"?((systemData.slug==="hide"||sluggify(itemData.name)==="hide")&&(systemData.slug="hide-armor"),__privateGet(this,_BASE_ARMORS).includes(systemData.slug??"")?systemData.baseItem=systemData.slug:systemData.slug in __privateGet(this,_MAGIC_ARMOR_TO_BASE)&&(systemData.baseItem=__privateGet(this,_MAGIC_ARMOR_TO_BASE)[systemData.slug])):itemData.type==="weapon"&&(__privateGet(this,_BASE_WEAPONS).includes(systemData.slug)&&(systemData.baseItem=systemData.slug),systemData.slug==="cinderclaw-gauntlet"&&(systemData.baseItem="spiked-gauntlet")))}};_BASE_ARMORS=new WeakMap,_MAGIC_ARMOR_TO_BASE=new WeakMap,_BASE_WEAPONS=new WeakMap,__name2(_Migration629SetBaseItems,"Migration629SetBaseItems"),__publicField(_Migration629SetBaseItems,"version",.629);let Migration629SetBaseItems=_Migration629SetBaseItems;const _Migration630FixTalismanSpelling=class extends MigrationBase{static{__name(this,"_Migration630FixTalismanSpelling")}async updateItem(itemData){if(itemData.type==="consumable"){const consumableType=itemData.system.consumableType;consumableType.value==="talasman"&&(consumableType.value="talisman")}}};__name2(_Migration630FixTalismanSpelling,"Migration630FixTalismanSpelling"),__publicField(_Migration630FixTalismanSpelling,"version",.63);let Migration630FixTalismanSpelling=_Migration630FixTalismanSpelling;const _Migration631FixSenseRuleElementSelector=class extends MigrationBase{static{__name(this,"_Migration631FixSenseRuleElementSelector")}SENSE_SELECTOR_CONVERSION={lowlightvision:"lowLightVision",Tremorsense:"tremorsense"};async updateItem(source){const rules=source.system.rules;for(const rule of rules)rule.key==="PF2E.RuleElement.Sense"&&typeof rule.selector=="string"&&(rule.selector=this.SENSE_SELECTOR_CONVERSION[rule.selector]??rule.selector)}};__name2(_Migration631FixSenseRuleElementSelector,"Migration631FixSenseRuleElementSelector"),__publicField(_Migration631FixSenseRuleElementSelector,"version",.631);let Migration631FixSenseRuleElementSelector=_Migration631FixSenseRuleElementSelector;const _Migration632DeleteOrphanedSpells=class extends MigrationBase{static{__name(this,"_Migration632DeleteOrphanedSpells")}requiresFlush=!0;async updateActor(actorData){const spells=actorData.items.filter(itemData=>itemData.type==="spell"),entries=actorData.items.filter(itemData=>itemData.type==="spellcastingEntry"),orphans=spells.filter(spellData=>!entries.some(entryData=>entryData._id===spellData.system.location.value));actorData.items=actorData.items.filter(itemData=>!orphans.some(orphan=>orphan._id===itemData._id))}};__name2(_Migration632DeleteOrphanedSpells,"Migration632DeleteOrphanedSpells"),__publicField(_Migration632DeleteOrphanedSpells,"version",.632);let Migration632DeleteOrphanedSpells=_Migration632DeleteOrphanedSpells;const _Migration633DeleteUnidentifiedTraits=class extends MigrationBase{static{__name(this,"_Migration633DeleteUnidentifiedTraits")}async updateItem(itemData){if(itemData.type==="melee"){const systemData=itemData.system;systemData.identification&&("game"in globalThis?itemData["system.-=identification"]=null:delete systemData.identification)}if(!isPhysicalData(itemData))return;const unidentifiedDataData=itemData.system.identification?.unidentified?.data;unidentifiedDataData?.traits&&("game"in globalThis?itemData["system.identification.unidentified.data.-=traits"]=null:delete unidentifiedDataData.traits)}};__name2(_Migration633DeleteUnidentifiedTraits,"Migration633DeleteUnidentifiedTraits"),__publicField(_Migration633DeleteUnidentifiedTraits,"version",.633);let Migration633DeleteUnidentifiedTraits=_Migration633DeleteUnidentifiedTraits;const _Migration634PurgeMartialItems=class extends MigrationBase{static{__name(this,"_Migration634PurgeMartialItems")}async updateActor(actorData){const martialIds=actorData.items.filter(itemData=>itemData.type==="martial").map(itemData=>itemData._id),martialItemWeapons=actorData.items.filter(itemData=>{if(itemData.type!=="weapon")return!1;const systemData=itemData.system;return martialIds.includes(systemData.weaponType?.value??"")});for(const weaponData of martialItemWeapons)weaponData.data.category="simple";actorData.items=actorData.items.filter(itemData=>itemData.type!=="martial")}};__name2(_Migration634PurgeMartialItems,"Migration634PurgeMartialItems"),__publicField(_Migration634PurgeMartialItems,"version",.634);let Migration634PurgeMartialItems=_Migration634PurgeMartialItems;const _Migration635NumifyACAndQuantity=class extends MigrationBase{static{__name(this,"_Migration635NumifyACAndQuantity")}async updateActor(actorData){(actorData.type==="hazard"||actorData.type==="npc"||actorData.type==="vehicle")&&(actorData.system.attributes.ac.value=Number(actorData.system.attributes.ac.value))}async updateItem(itemData){if(isPhysicalData(itemData)){const quantity=itemData.system.quantity||{value:0};quantity instanceof Object&&(quantity.value=Number(quantity.value))}}};__name2(_Migration635NumifyACAndQuantity,"Migration635NumifyACAndQuantity"),__publicField(_Migration635NumifyACAndQuantity,"version",.635);let Migration635NumifyACAndQuantity=_Migration635NumifyACAndQuantity;const _Migration636NumifyArmorData=class extends MigrationBase{static{__name(this,"_Migration636NumifyArmorData")}async updateItem(source){if(source.type!=="armor")return;const systemData=source.system;isObject(systemData.armor)&&(systemData.armor.value=Number(systemData.armor.value)||0),isObject(systemData.check)&&(systemData.check.value=Number(systemData.check.value)||0),isObject(systemData.dex)&&(systemData.dex.value=Number(systemData.dex.value)||0),isObject(systemData.strength)&&(systemData.strength.value=Number(systemData.strength.value)||0),isObject(systemData.speed)&&typeof systemData.speed.value=="string"&&(systemData.speed.value=parseInt(systemData.speed.value,10)||0)}};__name2(_Migration636NumifyArmorData,"Migration636NumifyArmorData"),__publicField(_Migration636NumifyArmorData,"version",.636);let Migration636NumifyArmorData=_Migration636NumifyArmorData;const meleeKeys=new Set(["description","source","traits","rules","slug","weaponType","attack","damageRolls","bonus","attackEffects"]),_Migration637CleanMeleeItems=class extends MigrationBase{static{__name(this,"_Migration637CleanMeleeItems")}async updateItem(itemData){if(itemData.type!=="melee")return;const systemData=itemData.system;for(const key of Object.keys(systemData))meleeKeys.has(key)||delete systemData[key]}};__name2(_Migration637CleanMeleeItems,"Migration637CleanMeleeItems");let Migration637CleanMeleeItems=_Migration637CleanMeleeItems;const validComponents=["material","somatic","verbal"],_Migration638SpellComponents=class extends MigrationBase{static{__name(this,"_Migration638SpellComponents")}async updateItem(itemData){if(itemData.type!=="spell")return;const components=itemData.system.components,oldComponents=new Set(components.value?.split(",").map(v=>v.trim().toLowerCase()));for(const component of validComponents)components[component]=components[component]||oldComponents.has(component);delete components.value,"game"in globalThis&&(components["-=value"]=null)}};__name2(_Migration638SpellComponents,"Migration638SpellComponents"),__publicField(_Migration638SpellComponents,"version",.638);let Migration638SpellComponents=_Migration638SpellComponents;const SIZES=["tiny","sm","med","lg","huge","grg"],SIZE_SLUGS=["tiny","small","medium","large","huge","gargantuan"],RARITIES=["common","uncommon","rare","unique"];function goesToEleven(value){return value>=0&&value<=11}__name(goesToEleven,"goesToEleven"),__name2(goesToEleven,"goesToEleven");const PROFICIENCY_RANKS=["untrained","trained","expert","master","legendary"],STACK_DEFINITIONS={bolts:{size:10,lightBulk:1},arrows:{size:10,lightBulk:1},slingBullets:{size:10,lightBulk:1},blowgunDarts:{size:10,lightBulk:1},woodenTaws:{size:10,lightBulk:1},rounds5:{size:5,lightBulk:1},rounds10:{size:10,lightBulk:1},rations:{size:7,lightBulk:1},sacks:{size:5,lightBulk:1},coins:{size:1e3,lightBulk:10},gems:{size:2e3,lightBulk:10}},_Bulk=class _Bulk2{static{__name(this,"_Bulk")}normal;light;constructor({normal=0,light=0}={}){this.normal=normal+Math.floor(light/10),this.light=light%10}get isNegligible(){return this.normal===0&&this.light===0}get isLight(){return this.toLightBulk()<10&&!this.isNegligible}toLightBulk(){return this.normal*10+this.light}plus(bulk){return new _Bulk2({normal:this.normal+bulk.normal,light:this.light+bulk.light})}minus(bulk){const[thisBulk,otherBulk]=this._toSingleNumber(bulk),result=thisBulk-otherBulk;return result<0?new _Bulk2:new _Bulk2({normal:Math.floor(result/10),light:result%10})}_toSingleNumber(bulk){return[this.normal*10+this.light,bulk.normal*10+bulk.light]}times(factor){const normal=this.normal*factor,lightCarryOver=normal<1&&normal>0?1:0,light=Math.floor(this.light*factor)+lightCarryOver;return new _Bulk2({normal:Math.floor(normal),light})}isSmallerThan(bulk){const[thisBulk,otherBulk]=this._toSingleNumber(bulk);return thisBulkotherBulk}isEqualTo(bulk){return this.normal===bulk.normal&&this.light===bulk.light}isPositive(){return this.normal>0||this.light>0}toString(){const{light,normal}=this;return normal===0&&light===0?game.i18n.localize("PF2E.Item.Physical.Bulk.Negligible"):normal>0&&light===0?normal.toString():light===1&&normal===0?game.i18n.localize("PF2E.Item.Physical.Bulk.Light"):light>0&&normal===0?game.i18n.format("PF2E.Item.Physical.Bulk.NLight",{light}):game.i18n.format("PF2E.Item.Physical.Bulk.WithLight",{bulk:normal,light})}double(){return this.isNegligible?new _Bulk2({light:1}):this.isLight?this.times(10):this.times(2)}halve(){return this.isNegligible?new _Bulk2:this.isLight?new _Bulk2:this.normal===1?new _Bulk2({light:1}):this.times(.5)}convertToSize(itemSize,actorSize){const sizes=Array.from(SIZES).filter(size=>size!=="sm"),itemSizeIndex=sizes.indexOf(itemSize==="sm"?"med":itemSize),actorSizeIndex=sizes.indexOf(actorSize==="sm"?"med":actorSize);return itemSizeIndex===actorSizeIndex?this:itemSizeIndex>actorSizeIndex?applyNTimes(bulk=>bulk.double(),itemSizeIndex-actorSizeIndex,this):applyNTimes(bulk=>bulk.halve(),actorSizeIndex-itemSizeIndex,this)}};__name2(_Bulk,"Bulk");let Bulk=_Bulk;const lightBulkRegex=/^(\d*)l$/i,complexBulkRegex=/^(\d+);\s*(\d*)l$/i;function weightToBulk(weight){if(typeof weight!="string"&&typeof weight!="number")return null;const trimmed=String(weight).trim();if(/^\d+$/.test(trimmed))return new Bulk({normal:parseInt(trimmed,10)});const lightMatch=trimmed.match(lightBulkRegex);if(lightMatch)return new Bulk({light:parseInt(lightMatch[1]||"1",10)});const complexMatch=trimmed.match(complexBulkRegex);if(complexMatch){const[,normal,light]=complexMatch;return new Bulk({normal:Number(normal)||0,light:Number(light||1)||0})}return null}__name(weightToBulk,"weightToBulk"),__name2(weightToBulk,"weightToBulk");const _CoinsPF2e=class _CoinsPF2e2{static{__name(this,"_CoinsPF2e")}constructor(data){data??={};for(const denomination of DENOMINATIONS)this[denomination]=Math.max(Math.floor(Math.abs(data[denomination]??0)),0)}get copperValue(){const{cp,sp,gp,pp}=this;return cp+sp*10+gp*100+pp*1e3}get goldValue(){return this.copperValue/100}add(coins){const other=new _CoinsPF2e2(coins);return new _CoinsPF2e2({pp:this.pp+other.pp,gp:this.gp+other.gp,sp:this.sp+other.sp,cp:this.cp+other.cp})}scale(factor){const result=new _CoinsPF2e2(this);if(result.pp*=factor,result.gp*=factor,result.sp*=factor,result.cp*=factor,factor%1!==0){result.gp+=result.pp%1*10,result.sp+=result.gp%1*10,result.cp+=result.sp%1*10;for(const denomination of DENOMINATIONS)result[denomination]=Math.floor(Number(result[denomination].toFixed(1)))}return result}adjustForSize(size){const basePrice=new _CoinsPF2e2(this);switch(size){case"lg":return basePrice.scale(2);case"huge":return basePrice.scale(4);case"grg":return basePrice.scale(8);default:return basePrice}}toObject(){return DENOMINATIONS.reduce((result,denomination)=>this[denomination]!==0?{...result,[denomination]:this[denomination]}:result,{})}static fromString(coinString,quantity=1){return[...String(coinString).trim().replace(/,/g,"").matchAll(/(\d+)\s*([pgsc]p)/g)].map(match=>{const[value,denomination]=match.slice(1,3),computedValue=(Number(value)||0)*quantity;return{[denomination]:computedValue}}).reduce((first,second)=>first.add(second),new _CoinsPF2e2)}static fromPrice(price,factor){const per=Math.max(1,price.per??1);return new _CoinsPF2e2(price.value).scale(factor/per)}toString(){if(DENOMINATIONS.every(denomination=>!this[denomination]))return"0 gp";const DENOMINATIONS_REVERSED=[...DENOMINATIONS].reverse(),parts=[];for(const denomation of DENOMINATIONS_REVERSED)this[denomation]&&parts.push(`${this[denomation]} ${denomation}`);return parts.join(", ")}};__name2(_CoinsPF2e,"CoinsPF2e");let CoinsPF2e=_CoinsPF2e;const coinCompendiumIds={pp:"JuNPeK5Qm1w6wpb4",gp:"B6B7tBWJSqOBz5zz",sp:"5Ew82vBF9YfaiY9f",cp:"lzJ8AVhRcbFul5fh"};function getMaterialValuationData(item){const valuationData=item.isOfType("weapon")?WEAPON_MATERIAL_VALUATION_DATA:item.isOfType("armor")&&!item.isShield?ARMOR_MATERIAL_VALUATION_DATA:null;if(!valuationData)return null;const{material}=item;return!material.type||!material.grade?null:valuationData[material.type]?.[material.grade]??null}__name(getMaterialValuationData,"getMaterialValuationData"),__name2(getMaterialValuationData,"getMaterialValuationData");const WEAPON_MATERIAL_VALUATION_DATA={"":{low:null,standard:null,high:null},abysium:{low:null,standard:{level:12,price:2e3,rarity:"rare"},high:{level:18,price:24e3,rarity:"rare"}},adamantine:{low:null,standard:{level:11,price:1400,rarity:"uncommon"},high:{level:17,price:13500,rarity:"uncommon"}},"cold-iron":{low:{level:2,price:40,rarity:"common"},standard:{level:10,price:880,rarity:"common"},high:{level:16,price:9e3,rarity:"common"}},darkwood:{low:null,standard:{level:11,price:1400,rarity:"uncommon"},high:{level:17,price:13500,rarity:"uncommon"}},djezet:{low:null,standard:{level:12,price:1800,rarity:"rare"},high:{level:18,price:22e3,rarity:"rare"}},inubrix:{low:null,standard:{level:11,price:1400,rarity:"rare"},high:{level:17,price:13500,rarity:"rare"}},"keep-stone":{low:null,standard:null,high:{level:18,price:22500,rarity:"rare"}},mithral:{low:null,standard:{level:11,price:1400,rarity:"uncommon"},high:{level:17,price:13500,rarity:"uncommon"}},noqual:{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:18,price:24e3,rarity:"rare"}},peachwood:{low:null,standard:{level:12,price:2e3,rarity:"uncommon"},high:{level:18,price:19e3,rarity:"uncommon"}},orichalcum:{low:null,standard:null,high:{level:18,price:22500,rarity:"rare"}},siccatite:{low:null,standard:{level:11,price:1400,rarity:"rare"},high:{level:17,price:15e3,rarity:"rare"}},silver:{low:{level:2,price:40,rarity:"common"},standard:{level:10,price:880,rarity:"common"},high:{level:16,price:9e3,rarity:"common"}},"sisterstone-dusk":{low:{level:3,price:70,rarity:"rare"},standard:{level:11,price:1200,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},"sisterstone-scarlet":{low:{level:3,price:70,rarity:"rare"},standard:{level:11,price:1200,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},"sovereign-steel":{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},warpglass:{low:null,standard:null,high:{level:17,price:14e3,rarity:"rare"}}},ARMOR_MATERIAL_VALUATION_DATA={"":{low:null,standard:null,high:null},abysium:{low:null,standard:{level:12,price:2e3,rarity:"rare"},high:{level:19,price:4e4,rarity:"rare"}},adamantine:{low:null,standard:{level:11,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},"cold-iron":{low:{level:5,price:140,rarity:"common"},standard:{level:11,price:1200,rarity:"common"},high:{level:18,price:2e4,rarity:"common"}},darkwood:{low:null,standard:{level:12,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},djezet:{low:null,standard:{level:12,price:1800,rarity:"rare"},high:{level:19,price:35e3,rarity:"rare"}},dragonhide:{low:null,standard:{level:12,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},"grisantian-pelt":{low:null,standard:{level:12,price:1800,rarity:"rare"},high:{level:19,price:33e3,rarity:"rare"}},inubrix:{low:null,standard:{level:11,price:1200,rarity:"rare"},high:{level:18,price:18e3,rarity:"rare"}},"keep-stone":{low:null,standard:null,high:{level:20,price:56e3,rarity:"rare"}},mithral:{low:null,standard:{level:12,price:1600,rarity:"uncommon"},high:{level:19,price:32e3,rarity:"uncommon"}},noqual:{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},peachwood:{low:null,standard:null,high:null},orichalcum:{low:null,standard:null,high:{level:20,price:55e3,rarity:"rare"}},siccatite:{low:null,standard:{level:12,price:1600,rarity:"rare"},high:{level:19,price:32e3,rarity:"rare"}},silver:{low:{level:5,price:140,rarity:"common"},standard:{level:11,price:1200,rarity:"common"},high:{level:18,price:2e4,rarity:"common"}},"sisterstone-dusk":{low:{level:5,price:140,rarity:"rare"},standard:{level:10,price:1e3,rarity:"rare"},high:{level:18,price:19500,rarity:"rare"}},"sisterstone-scarlet":{low:{level:5,price:140,rarity:"rare"},standard:{level:10,price:1e3,rarity:"rare"},high:{level:18,price:19500,rarity:"rare"}},"sovereign-steel":{low:null,standard:{level:13,price:2400,rarity:"rare"},high:{level:20,price:5e4,rarity:"rare"}},warpglass:{low:null,standard:null,high:null}},_PredicatePF2e=class _PredicatePF2e2 extends Array{static{__name(this,"_PredicatePF2e")}constructor(...statements){super(...Array.isArray(statements[0])?statements[0]:statements),__privateAdd(this,_isTrue),__privateAdd(this,_testBinaryOp),__privateAdd(this,_testCompound),__publicField(this,"isValid"),this.isValid=_PredicatePF2e2.isValid(this),Object.defineProperty(this,"isValid",{enumerable:!1})}static isValid(statements){return this.isArray(statements)}static isArray(statements){return super.isArray(statements)&&statements.every(s=>StatementValidator.isStatement(s))}static test(predicate=[],options){return predicate instanceof _PredicatePF2e2?predicate.test(options):new _PredicatePF2e2(...predicate).test(options)}test(options){if(this.length===0)return!0;if(!this.isValid)return console.warn("PF2e System | The provided predicate set is malformed."),!1;const domain=options instanceof Set?options:new Set(options);return this.every(s=>__privateMethod(this,_isTrue,isTrue_fn).call(this,s,domain))}toObject(){return deepClone([...this])}clone(){return new _PredicatePF2e2(this.toObject())}};_isTrue=new WeakSet,isTrue_fn=__name2(function(statement,domain){return typeof statement=="string"&&domain.has(statement)||StatementValidator.isBinaryOp(statement)&&__privateMethod(this,_testBinaryOp,testBinaryOp_fn).call(this,statement,domain)||StatementValidator.isCompound(statement)&&__privateMethod(this,_testCompound,testCompound_fn).call(this,statement,domain)},"#isTrue"),_testBinaryOp=new WeakSet,testBinaryOp_fn=__name2(function(statement,domain){if("eq"in statement)return domain.has(`${statement.eq[0]}:${statement.eq[1]}`);{const operator=Object.keys(statement)[0],[left,right]=Object.values(statement)[0],domainArray=Array.from(domain),getValues=__name2(operand=>{const maybeNumber=Number(operand);if(!Number.isNaN(maybeNumber))return[maybeNumber];const pattern=new RegExp(String.raw`^${operand}:([^:]+)$`),values=domainArray.map(s=>Number(pattern.exec(s)?.[1]||NaN)).filter(v=>!Number.isNaN(v));return values.length>0?values:[NaN]},"getValues"),leftValues=getValues(left),rightValues=getValues(right);switch(operator){case"gt":return leftValues.some(l=>rightValues.every(r=>l>r));case"gte":return leftValues.some(l=>rightValues.every(r=>l>=r));case"lt":return leftValues.some(l=>rightValues.every(r=>lrightValues.every(r=>l<=r));default:return console.warn("PF2e System | Malformed binary operation encountered"),!1}}},"#testBinaryOp"),_testCompound=new WeakSet,testCompound_fn=__name2(function(statement,domain){return"and"in statement&&statement.and.every(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"nand"in statement&&!statement.nand.every(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"or"in statement&&statement.or.some(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"xor"in statement&&statement.xor.filter(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain)).length===1||"nor"in statement&&!statement.nor.some(subProp=>__privateMethod(this,_isTrue,isTrue_fn).call(this,subProp,domain))||"not"in statement&&!__privateMethod(this,_isTrue,isTrue_fn).call(this,statement.not,domain)||"if"in statement&&!(__privateMethod(this,_isTrue,isTrue_fn).call(this,statement.if,domain)&&!__privateMethod(this,_isTrue,isTrue_fn).call(this,statement.then,domain))},"#testCompound"),__name2(_PredicatePF2e,"PredicatePF2e");let PredicatePF2e=_PredicatePF2e;const _StatementValidator=class{static{__name(this,"_StatementValidator")}static isStatement(statement){return statement instanceof Object?this.isCompound(statement)||this.isBinaryOp(statement):typeof statement=="string"?this.isAtomic(statement):!1}static isAtomic(statement){return typeof statement=="string"&&statement.length>0||this.isBinaryOp(statement)}static isBinaryOp(statement){if(!isObject(statement))return!1;const entries=Object.entries(statement);if(entries.length>1)return!1;const[operator,operands]=entries[0];return __privateGet(this,_binaryOperators).has(operator)&&Array.isArray(operands)&&operands.length===2&&typeof operands[0]=="string"&&["string","number"].includes(typeof operands[1])}static isCompound(statement){return isObject(statement)&&(this.isAnd(statement)||this.isOr(statement)||this.isNand(statement)||this.isXor(statement)||this.isNor(statement)||this.isNot(statement)||this.isIf(statement))}static isAnd(statement){return Object.keys(statement).length===1&&Array.isArray(statement.and)&&statement.and.every(subProp=>this.isStatement(subProp))}static isNand(statement){return Object.keys(statement).length===1&&Array.isArray(statement.nand)&&statement.nand.every(subProp=>this.isStatement(subProp))}static isOr(statement){return Object.keys(statement).length===1&&Array.isArray(statement.or)&&statement.or.every(subProp=>this.isStatement(subProp))}static isXor(statement){return Object.keys(statement).length===1&&Array.isArray(statement.xor)&&statement.xor.every(subProp=>this.isStatement(subProp))}static isNor(statement){return Object.keys(statement).length===1&&Array.isArray(statement.nor)&&statement.nor.every(subProp=>this.isStatement(subProp))}static isNot(statement){return Object.keys(statement).length===1&&!!statement.not&&this.isStatement(statement.not)}static isIf(statement){return Object.keys(statement).length===2&&this.isStatement(statement.if)&&this.isStatement(statement.then)}};_binaryOperators=new WeakMap,__name2(_StatementValidator,"StatementValidator"),__privateAdd(_StatementValidator,_binaryOperators,new Set(["eq","gt","gte","lt","lte"]));let StatementValidator=_StatementValidator;const _AutomaticBonusProgression=class{static{__name(this,"_AutomaticBonusProgression")}static isEnabled(actor){if(actor&&!actor.flags?.pf2e)return!1;const settingEnabled=game.settings.get("pf2e","automaticBonusVariant")!=="noABP",abpDisabledForActor=!!actor?.flags.pf2e.disableABP;return settingEnabled&&!abpDisabledForActor}static getStrikingDice(level){return level<4?0:level<12?1:level<19?2:3}static concatModifiers(actor){if(!this.isEnabled(actor))return;const{level,synthetics}=actor,values=this.abpValues(level),ac=values.ac,perception=values.perception,save=values.save,setting=game.settings.get("pf2e","automaticBonusVariant");if(save>0&&(synthetics.modifiers["saving-throw"]??=[]).push(()=>new ModifierPF2e({slug:"save-potency",label:"PF2E.AutomaticBonusProgression.savePotency",modifier:save,type:"potency"})),ac>0&&(synthetics.modifiers.ac??=[]).push(()=>new ModifierPF2e({slug:"defense-potency",label:"PF2E.AutomaticBonusProgression.defensePotency",modifier:ac,type:"potency"})),perception>0&&(synthetics.modifiers.perception??=[]).push(()=>new ModifierPF2e({slug:"perception-potency",label:"PF2E.AutomaticBonusProgression.perceptionPotency",modifier:perception,type:"potency"})),setting==="ABPRulesAsWritten"){const attack=this.abpValues(level).attack;attack>0&&(synthetics.modifiers["strike-attack-roll"]??=[]).push(()=>new ModifierPF2e({slug:"attack-potency",label:"PF2E.AutomaticBonusProgression.attackPotency",modifier:attack,type:"potency"}))}if(setting==="ABPFundamentalPotency"){const attack=this.abpValues(level).attack;if(attack>0){const potency={label:game.i18n.localize("PF2E.AutomaticBonusProgression.attackPotency"),type:"potency",bonus:attack,predicate:new PredicatePF2e};(synthetics.weaponPotency["strike-attack-roll"]??=[]).push(potency)}}}static cleanupRunes(item){if(!this.isEnabled(item.actor))return;item.system.potencyRune.value=null;const otherFundamental=item.isOfType("weapon")?item.system.strikingRune:item.system.resiliencyRune;if(otherFundamental.value=null,game.settings.get("pf2e","automaticBonusVariant")==="ABPRulesAsWritten"){const propertyRunes=[1,2,3,4].map(n=>item.system[`propertyRune${n}`]);for(const rune of propertyRunes)rune.value=null}}static suppressRuleElement(rule,value){return this.isEnabled(rule.actor)&&rule.type==="item"&&value>=0&&rule.fromEquipment}static getAttackPotency(level){return level<2?0:level<10?1:level<16?2:3}static abpValues(level){const attack=this.getAttackPotency(level);let ac,perception,save;return level>=5&&level<11?ac=1:level>=11&&level<18?ac=2:level>=18?ac=3:ac=0,level>=7&&level<13?perception=1:level>=13&&level<19?perception=2:level>=19?perception=3:perception=0,level>=8&&level<14?save=1:level>=14&&level<20?save=2:level>=20?save=3:save=0,{attack,ac,perception,save}}};__name2(_AutomaticBonusProgression,"AutomaticBonusProgression");let AutomaticBonusProgression=_AutomaticBonusProgression;function getPropertySlots(item){const fromMaterial=item.system.material.type==="orichalcum"?1:0,fromPotency=AutomaticBonusProgression.isEnabled(item.actor)?AutomaticBonusProgression.getAttackPotency(!item.actor||item.actor.isOfType("loot")?20:item.actor.level):item.system.runes.potency;return fromMaterial+fromPotency}__name(getPropertySlots,"getPropertySlots"),__name2(getPropertySlots,"getPropertySlots");function prunePropertyRunes(runes,validTypes){const runeSet=new Set(runes);return Array.from(runeSet).filter(r=>!!r&&r in validTypes&&!runeSet.has(`greater${r.titleCase()}`)&&!runeSet.has(`major${r.replace(/^greater/,"").titleCase()}`)&&!runeSet.has(`true${r.replace(/^greater|^major/,"").titleCase()}`))}__name(prunePropertyRunes,"prunePropertyRunes"),__name2(prunePropertyRunes,"prunePropertyRunes");function getRuneValuationData(item){if(!item.isOfType("armor","weapon")||item.isOfType("armor")&&item.isShield)return[];const itemRunes=item.system.runes,data=item.isOfType("armor")?{runes:RUNE_DATA.armor,secondaryFundamental:"resilient"}:{runes:RUNE_DATA.weapon,secondaryFundamental:"striking"};return[data.runes.potency[item.system.runes.potency],data.runes[data.secondaryFundamental][itemRunes[data.secondaryFundamental]??""],...item.system.runes.property.map(p=>data.runes.property[p])].filter(d=>!!d)}__name(getRuneValuationData,"getRuneValuationData"),__name2(getRuneValuationData,"getRuneValuationData");const strikingRuneValues=new Map([["striking",1],["greaterStriking",2],["majorStriking",3]]);function getStrikingDice(itemData){return strikingRuneValues.get(itemData.strikingRune.value)??0}__name(getStrikingDice,"getStrikingDice"),__name2(getStrikingDice,"getStrikingDice");function getPropertyRuneDegreeAdjustments(item){return uniq(compact([item.system.runes.property.map(p=>WEAPON_PROPERTY_RUNES[p].attack?.dosAdjustments),item.system.runes.effects.map(p=>WEAPON_PROPERTY_RUNES[p].attack?.dosAdjustments)].flat(2)))}__name(getPropertyRuneDegreeAdjustments,"getPropertyRuneDegreeAdjustments"),__name2(getPropertyRuneDegreeAdjustments,"getPropertyRuneDegreeAdjustments");const resilientRuneValues=new Map([[null,0],["resilient",1],["greaterResilient",2],["majorResilient",3]]);function getResilientBonus(itemData){return resilientRuneValues.get(itemData.resiliencyRune.value)??0}__name(getResilientBonus,"getResilientBonus"),__name2(getResilientBonus,"getResilientBonus");function getPropertyRuneDice(runes,options){return runes.flatMap(rune=>{const runeData=WEAPON_PROPERTY_RUNES[rune];return deepClone(runeData.damage?.dice??[]).map(data=>{const dice=new DamageDicePF2e({selector:"strike-damage",slug:rune,label:RUNE_DATA.weapon.property[rune]?.name,diceNumber:data.diceNumber??1,dieSize:data.dieSize??"d6",damageType:data.damageType,category:data.category??null,predicate:data.predicate,critical:data.critical??null});return dice.test(options),dice})})}__name(getPropertyRuneDice,"getPropertyRuneDice"),__name2(getPropertyRuneDice,"getPropertyRuneDice");function getPropertyRuneStrikeAdjustments(runes){return runes.flatMap(r=>RUNE_DATA.weapon.property[r].strikeAdjustments??[])}__name(getPropertyRuneStrikeAdjustments,"getPropertyRuneStrikeAdjustments"),__name2(getPropertyRuneStrikeAdjustments,"getPropertyRuneStrikeAdjustments");function getPropertyRuneModifierAdjustments(runes){return runes.flatMap(r=>RUNE_DATA.weapon.property[r].damage?.adjustments??[])}__name(getPropertyRuneModifierAdjustments,"getPropertyRuneModifierAdjustments"),__name2(getPropertyRuneModifierAdjustments,"getPropertyRuneModifierAdjustments");const FUNDAMENTAL_ARMOR_RUNE_DATA={potency:{0:null,1:{name:"PF2E.ArmorPotencyRune1",value:1,level:5,price:160,rarity:"common",traits:["abjuration"]},2:{name:"PF2E.ArmorPotencyRune2",value:2,level:11,price:1060,rarity:"common",traits:["abjuration"]},3:{name:"PF2E.ArmorPotencyRune3",value:3,level:18,price:20560,rarity:"common",traits:["abjuration"]},4:{name:"PF2E.ArmorPotencyRune4",value:4,level:18,price:20560,rarity:"common",traits:["abjuration"]}},resilient:{0:null,1:{name:"PF2E.ArmorResilientRune",level:8,price:340,rarity:"common",slug:"resilient",traits:["abjuration"]},2:{name:"PF2E.ArmorGreaterResilientRune",level:14,price:3440,rarity:"common",slug:"greaterResilient",traits:["abjuration"]},3:{name:"PF2E.ArmorMajorResilientRune",level:20,price:49440,rarity:"common",slug:"majorResilient",traits:["abjuration"]}}},FUNDAMENTAL_WEAPON_RUNE_DATA={potency:{0:null,1:{name:"PF2E.WeaponPotencyRune1",value:1,level:2,price:35,rarity:"common",traits:["evocation"]},2:{name:"PF2E.WeaponPotencyRune2",value:2,level:10,price:935,rarity:"common",traits:["evocation"]},3:{name:"PF2E.WeaponPotencyRune3",value:3,level:16,price:8935,rarity:"common",traits:["evocation"]},4:{name:"PF2E.WeaponPotencyRune4",value:4,level:16,price:8935,rarity:"common",traits:["evocation"]}},striking:{0:null,1:{name:"PF2E.Item.Weapon.Rune.Striking.Striking",level:4,price:65,rarity:"common",slug:"striking",traits:["evocation"]},2:{name:"PF2E.Item.Weapon.Rune.Striking.Greater",level:12,price:1065,rarity:"common",slug:"greaterStriking",traits:["evocation"]},3:{name:"PF2E.Item.Weapon.Rune.Striking.Major",level:19,price:31065,rarity:"common",slug:"majorStriking",traits:["evocation"]}}},ARMOR_PROPERTY_RUNES={acidResistant:{name:"PF2E.ArmorPropertyRuneAcidResistant",level:8,price:420,rarity:"common",slug:"acidResistant",traits:["abjuration","magical"]},advancing:{name:"PF2E.ArmorPropertyRuneAdvancing",level:9,price:625,rarity:"common",slug:"advancing",traits:["magical","necromancy"]},aimAiding:{name:"PF2E.ArmorPropertyRuneAimAiding",level:6,price:225,rarity:"common",slug:"aimAiding",traits:["magical","transmutation"]},antimagic:{name:"PF2E.ArmorPropertyRuneAntimagic",level:15,price:6500,rarity:"uncommon",slug:"antimagic",traits:["abjuration","magical"]},assisting:{name:"PF2E.ArmorPropertyRuneAssisting",level:5,price:125,rarity:"common",slug:"assisting",traits:["magical","transmutation"]},bitter:{name:"PF2E.ArmorPropertyRuneBitter",level:9,price:135,rarity:"uncommon",slug:"bitter",traits:["magical","poison","transmutation"]},coldResistant:{name:"PF2E.ArmorPropertyRuneColdResistant",level:8,price:420,rarity:"common",slug:"coldResistant",traits:["abjuration","magical"]},deathless:{name:"PF2E.ArmorPropertyRuneDeathless",level:7,price:330,rarity:"uncommon",slug:"deathless",traits:["healing","magical","necromancy"]},electricityResistant:{name:"PF2E.ArmorPropertyRuneElectricityResistant",level:8,price:420,rarity:"common",slug:"electricityResistant",traits:["abjuration","magical"]},energyAdaptive:{name:"PF2E.ArmorPropertyRuneEnergyAdaptive",level:6,price:225,rarity:"common",slug:"energyAdaptive",traits:["magical","transmutation"]},ethereal:{name:"PF2E.ArmorPropertyRuneEthereal",level:17,price:13500,rarity:"common",slug:"ethereal",traits:["conjuration","magical"]},fireResistant:{name:"PF2E.ArmorPropertyRuneFireResistant",level:8,price:420,rarity:"common",slug:"fireResistant",traits:["abjuration","magical"]},fortification:{name:"PF2E.ArmorPropertyRuneFortification",level:12,price:2e3,rarity:"common",slug:"fortification",traits:["abjuration","magical"]},glamered:{name:"PF2E.ArmorPropertyRuneGlamered",level:5,price:140,rarity:"common",slug:"glamered",traits:["illusion","magical"]},gliding:{name:"PF2E.ArmorPropertyRuneGliding",level:8,price:450,rarity:"common",slug:"gliding",traits:["magical","transmutation"]},greaterAcidResistant:{name:"PF2E.ArmorPropertyRuneGreaterAcidResistant",level:12,price:1650,rarity:"common",slug:"greaterAcidResistant",traits:["abjuration","magical"]},greaterAdvancing:{name:"PF2E.ArmorPropertyRuneGreaterAdvancing",level:16,price:8e3,rarity:"common",slug:"greaterAdvancing",traits:["magical","necromancy"]},greaterColdResistant:{name:"PF2E.ArmorPropertyRuneGreaterColdResistant",level:12,price:1650,rarity:"common",slug:"greaterColdResistant",traits:["abjuration","magical"]},greaterDread:{name:"PF2E.ArmorPropertyRuneGreaterDread",level:18,price:21e3,rarity:"uncommon",slug:"greaterDread",traits:["emotion","enchantment","fear","magical","mental","visual"]},greaterElectricityResistant:{name:"PF2E.ArmorPropertyRuneGreaterElectricityResistant",level:12,price:1650,rarity:"common",slug:"greaterElectricityResistant",traits:["abjuration","magical"]},greaterFireResistant:{name:"PF2E.ArmorPropertyRuneGreaterFireResistant",level:12,price:1650,rarity:"common",slug:"greaterFireResistant",traits:["abjuration","magical"]},greaterFortification:{name:"PF2E.ArmorPropertyRuneGreaterFortification",level:19,price:24e3,rarity:"common",slug:"greaterFortification",traits:["abjuration","magical"]},greaterInvisibility:{name:"PF2E.ArmorPropertyRuneGreaterInvisibility",level:10,price:1e3,rarity:"common",slug:"greaterInvisibility",traits:["illusion","magical"]},greaterReady:{name:"PF2E.ArmorPropertyRuneGreaterReady",level:11,price:1200,rarity:"common",slug:"greaterReady",traits:["evocation","magical"]},greaterShadow:{name:"PF2E.ArmorPropertyRuneGreaterShadow",level:9,price:650,rarity:"common",slug:"greaterShadow",traits:["magical","transmutation"]},greaterSlick:{name:"PF2E.ArmorPropertyRuneGreaterSlick",level:8,price:450,rarity:"common",slug:"greaterSlick",traits:["magical","transmutation"]},greaterStanching:{name:"PF2E.ArmorPropertyRuneGreaterStanching",level:9,price:600,rarity:"uncommon",slug:"greaterStanching",traits:["magical","necromancy"]},greaterQuenching:{name:"PF2E.ArmorPropertyRuneGreaterQuenching",level:10,price:1e3,rarity:"common",slug:"greaterQuenching",traits:["abjuration","magical"]},greaterSwallowSpike:{name:"PF2E.ArmorPropertyRuneGreaterSwallowSpike",level:12,price:1750,rarity:"common",slug:"greaterSwallowSpike",traits:["magical","transmutation"]},greaterWinged:{name:"PF2E.ArmorPropertyRuneGreaterWinged",level:19,price:35e3,rarity:"common",slug:"greaterWinged",traits:["magical","transmutation"]},immovable:{name:"PF2E.ArmorPropertyRuneImmovable",level:12,price:1800,rarity:"uncommon",slug:"immovable",traits:["magical","transmutation"]},implacable:{name:"PF2E.ArmorPropertyRuneImplacable",level:11,price:1200,rarity:"uncommon",slug:"implacable",traits:["magical","transmutation"]},invisibility:{name:"PF2E.ArmorPropertyRuneInvisibility",level:8,price:500,rarity:"common",slug:"invisibility",traits:["illusion","magical"]},lesserDread:{name:"PF2E.ArmorPropertyRuneLesserDread",level:6,price:225,rarity:"uncommon",slug:"lesserDread",traits:["emotion","enchantment","fear","magical","mental","visual"]},magnetizing:{name:"PF2E.ArmorPropertyRuneMagnetizing",level:10,price:900,rarity:"common",slug:"magnetizing",traits:["evocation","magical"]},majorQuenching:{name:"PF2E.ArmorPropertyRuneMajorQuenching",level:14,price:4500,rarity:"common",slug:"majorQuenching",traits:["abjuration","magical"]},majorShadow:{name:"PF2E.ArmorPropertyRuneMajorShadow",level:17,price:14e3,rarity:"common",slug:"majorShadow",traits:["magical","transmutation"]},majorSlick:{name:"PF2E.ArmorPropertyRuneMajorSlick",level:16,price:9e3,rarity:"common",slug:"majorSlick",traits:["magical","transmutation"]},majorStanching:{name:"PF2E.ArmorPropertyRuneMajorStanching",level:13,price:2500,rarity:"uncommon",slug:"majorStanching",traits:["magical","necromancy"]},majorSwallowSpike:{name:"PF2E.ArmorPropertyRuneMajorSwallowSpike",level:16,price:19250,rarity:"common",slug:"majorSwallowSpike",traits:["magical","transmutation"]},malleable:{name:"PF2E.ArmorPropertyRuneMalleable",level:9,price:650,rarity:"common",slug:"malleable",traits:["magical","metal"]},misleading:{name:"PF2E.ArmorPropertyRuneMisleading",level:16,price:8e3,rarity:"common",slug:"misleading",traits:["illusion","magical"]},moderateDread:{name:"PF2E.ArmorPropertyRuneModerateDread",level:12,price:1800,rarity:"uncommon",slug:"moderateDread",traits:["emotion","enchantment","fear","magical","mental","visual"]},portable:{name:"PF2E.ArmorPropertyRunePortable",level:9,price:660,rarity:"common",slug:"portable",traits:["magical","transmutation"]},quenching:{name:"PF2E.ArmorPropertyRuneQuenching",level:6,price:250,rarity:"common",slug:"quenching",traits:["abjuration","magical"]},ready:{name:"PF2E.ArmorPropertyRuneReady",level:6,price:200,rarity:"common",slug:"ready",traits:["evocation","magical"]},rockBraced:{name:"PF2E.ArmorPropertyRuneRockBraced",level:13,price:3e3,rarity:"rare",slug:"rockBraced",traits:["abjuration","dwarf","magical","saggorak"]},shadow:{name:"PF2E.ArmorPropertyRuneShadow",level:5,price:55,rarity:"common",slug:"shadow",traits:["magical","transmutation"]},sinisterKnight:{name:"PF2E.ArmorPropertyRuneSinisterKnight",level:8,price:500,rarity:"uncommon",slug:"sinisterKnight",traits:["abjuration","illusion","magical"]},slick:{name:"PF2E.ArmorPropertyRuneSlick",level:5,price:45,rarity:"common",slug:"slick",traits:["magical","transmutation"]},soaring:{name:"PF2E.ArmorPropertyRuneSoaring",level:14,price:3750,rarity:"common",slug:"soaring",traits:["abjuration","magical"]},stanching:{name:"PF2E.ArmorPropertyRuneStanching",level:5,price:130,rarity:"uncommon",slug:"stanching",traits:["magical","necromancy"]},swallowSpike:{name:"PF2E.ArmorPropertyRuneSwallowSpike",level:6,price:200,rarity:"common",slug:"swallowSpike",traits:["magical","transmutation"]},trueQuenching:{name:"PF2E.ArmorPropertyRuneTrueQuenching",level:18,price:24e3,rarity:"common",slug:"trueQuenching",traits:["abjuration","magical"]},trueStanching:{name:"PF2E.ArmorPropertyRuneTrueStanching",level:17,price:12500,rarity:"uncommon",slug:"trueStanching",traits:["magical","necromancy"]},winged:{name:"PF2E.ArmorPropertyRuneWinged",level:13,price:2500,rarity:"common",slug:"winged",traits:["magical","transmutation"]}},WEAPON_PROPERTY_RUNES={anarchic:{damage:{dice:[{damageType:"chaotic",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.anarchic.Name",text:"PF2E.WeaponPropertyRune.anarchic.Note.criticalSuccess"}]},level:11,name:"PF2E.WeaponPropertyRune.anarchic.Name",price:1400,rarity:"common",slug:"anarchic",traits:["chaotic","evocation","magical"]},ancestralEchoing:{level:15,name:"PF2E.WeaponPropertyRune.ancestralEchoing.Name",price:9500,rarity:"rare",slug:"ancestralEchoing",traits:["dwarf","evocation","magical","saggorak"]},anchoring:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.anchoring.Name",text:"PF2E.WeaponPropertyRune.anchoring.Note.criticalSuccess"}]},level:10,name:"PF2E.WeaponPropertyRune.anchoring.Name",price:900,rarity:"uncommon",slug:"anchoring",traits:["abjuration","magical"]},ashen:{damage:{dice:[{damageType:"fire",category:"persistent",diceNumber:1,dieSize:"d4"}],notes:[{outcome:["success"],title:"PF2E.WeaponPropertyRune.ashen.Name",text:"PF2E.WeaponPropertyRune.ashen.Note.success"}]},level:9,name:"PF2E.WeaponPropertyRune.ashen.Name",price:700,rarity:"common",slug:"ashen",traits:["enchantment","magical"]},authorized:{level:3,name:"PF2E.WeaponPropertyRune.authorized.Name",price:50,rarity:"common",slug:"authorized",traits:["abjuration","magical"]},axiomatic:{damage:{dice:[{damageType:"lawful",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.axiomatic.Name",text:"PF2E.WeaponPropertyRune.axiomatic.Note.criticalSuccess"}]},level:11,name:"PF2E.WeaponPropertyRune.axiomatic.Name",price:1400,rarity:"common",slug:"axiomatic",traits:["evocation","lawful","magical"]},bane:{level:4,name:"PF2E.WeaponPropertyRune.bane.Name",price:100,rarity:"uncommon",slug:"bane",traits:["divination","magical"]},bloodbane:{level:8,name:"PF2E.WeaponPropertyRune.bloodbane.Name",price:475,rarity:"uncommon",slug:"bloodbane",traits:["dwarf","evocation","magical"]},bloodthirsty:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.bloodbane.Name",text:"PF2E.WeaponPropertyRune.bloodthirsty.Note.criticalSuccess"}]},level:16,name:"PF2E.WeaponPropertyRune.bloodthirsty.Name",price:8500,rarity:"uncommon",slug:"bloodthirsty",traits:["magical","necromancy"]},brilliant:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d4"},{damageType:"good",diceNumber:1,dieSize:"d4",predicate:["target:trait:fiend"]},{damageType:"vitality",diceNumber:1,dieSize:"d4",predicate:["target:mode:undead"]}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.brilliant.Name",text:"PF2E.WeaponPropertyRune.brilliant.Note.criticalSuccess"}]},level:12,name:"PF2E.WeaponPropertyRune.brilliant.Name",price:2e3,rarity:"common",slug:"brilliant",traits:["evocation","magical"]},called:{level:7,name:"PF2E.WeaponPropertyRune.called.Name",price:350,rarity:"common",slug:"called",traits:["conjuration","magical"]},coating:{level:9,name:"PF2E.WeaponPropertyRune.coating.Name",price:700,rarity:"common",slug:"coating",traits:["conjuration","extradimensional","magical"]},conducting:{level:7,name:"PF2E.WeaponPropertyRune.conducting.Name",price:300,rarity:"common",slug:"conducting",traits:["evocation","magical"]},corrosive:{damage:{dice:[{damageType:"acid",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.corrosive.Name",text:"PF2E.WeaponPropertyRune.corrosive.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.corrosive.Name",price:500,rarity:"common",slug:"corrosive",traits:["acid","conjuration","magical"]},crushing:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.crushing.Name",text:"PF2E.WeaponPropertyRune.crushing.Note.criticalSuccess"}]},level:3,name:"PF2E.WeaponPropertyRune.crushing.Name",price:50,rarity:"uncommon",slug:"crushing",traits:["magical","necromancy"]},cunning:{level:5,name:"PF2E.WeaponPropertyRune.cunning.Name",price:140,rarity:"common",slug:"cunning",traits:["divination","magical"]},dancing:{level:13,name:"PF2E.WeaponPropertyRune.dancing.Name",price:2700,rarity:"uncommon",slug:"dancing",traits:["evocation","magical"]},deathdrinking:{damage:{dice:[{slug:"deathdrinking-negative",damageType:"void",diceNumber:1,dieSize:"d6",critical:!0,predicate:["target:mode:living",{not:"target:negative-healing"}]},{slug:"deathdrinking-positive",damageType:"vitality",diceNumber:1,dieSize:"d6",critical:!0,predicate:["target:negative-healing"]}]},level:7,name:"PF2E.WeaponPropertyRune.deathdrinking.Name",price:360,rarity:"rare",slug:"deathdrinking",traits:["magical","necromancy"]},demolishing:{damage:{dice:[{damageType:"force",category:"persistent",diceNumber:1,dieSize:"d6",predicate:["target:trait:construct"]}]},level:6,name:"PF2E.WeaponPropertyRune.demolishing.Name",price:225,rarity:"rare",slug:"demolishing",traits:["evocation","magical"]},disrupting:{damage:{dice:[{damageType:"vitality",diceNumber:1,dieSize:"d6",predicate:["target:mode:undead"]}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.disrupting.Name",text:"PF2E.WeaponPropertyRune.disrupting.Note.criticalSuccess",predicate:["target:mode:undead"]}]},level:5,name:"PF2E.WeaponPropertyRune.disrupting.Name",price:150,rarity:"common",slug:"disrupting",traits:["magical","necromancy"]},earthbinding:{level:5,name:"PF2E.WeaponPropertyRune.earthbinding.Name",price:125,rarity:"common",slug:"earthbinding",traits:["magical","transmutation"]},energizing:{level:6,name:"PF2E.WeaponPropertyRune.energizing.Name",price:250,rarity:"uncommon",slug:"energizing",traits:["abjuration","magical"]},extending:{level:7,name:"PF2E.WeaponPropertyRune.extending.Name",price:700,rarity:"common",slug:"extending",traits:["magical","transmutation"]},fanged:{level:2,name:"PF2E.WeaponPropertyRune.fanged.Name",price:30,rarity:"uncommon",slug:"fanged",traits:["magical","transmutation"]},fearsome:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.fearsome.Name",text:"PF2E.WeaponPropertyRune.fearsome.Note.criticalSuccess"}]},level:5,name:"PF2E.WeaponPropertyRune.fearsome.Name",price:160,rarity:"common",slug:"fearsome",traits:["emotion","enchantment","fear","magical","mental"]},flaming:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d6"},{damageType:"fire",category:"persistent",diceNumber:1,dieSize:"d10",critical:!0}]},level:8,name:"PF2E.WeaponPropertyRune.flaming.Name",price:500,rarity:"common",slug:"flaming",traits:["conjuration","fire","magical"]},flurrying:{level:7,name:"PF2E.WeaponPropertyRune.flurrying.Name",price:360,rarity:"common",slug:"flurrying",traits:["evocation","magical"]},frost:{damage:{dice:[{damageType:"cold",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.frost.Name",text:"PF2E.WeaponPropertyRune.frost.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.frost.Name",price:500,rarity:"common",slug:"frost",traits:["cold","conjuration","magical"]},ghostTouch:{level:4,name:"PF2E.WeaponPropertyRune.ghostTouch.Name",price:75,rarity:"common",slug:"ghostTouch",traits:["magical","transmutation"]},giantKilling:{damage:{dice:[{slug:"giantKilling",damageType:"mental",diceNumber:1,dieSize:"d6",predicate:["target:trait:giant"]}],notes:[{outcome:["criticalSuccess"],predicate:["target:trait:giant"],title:"PF2E.WeaponPropertyRune.giantKilling.Name",text:"PF2E.WeaponPropertyRune.giantKilling.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.giantKilling.Name",price:450,rarity:"rare",slug:"giantKilling",traits:["magical","necromancy"]},greaterAnchoring:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterAnchoring.Name",text:"PF2E.WeaponPropertyRune.greaterAnchoring.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterAnchoring.Name",text:"PF2E.WeaponPropertyRune.greaterAnchoring.Note.success"}]},level:18,name:"PF2E.WeaponPropertyRune.greaterAnchoring.Name",price:22e3,rarity:"uncommon",slug:"greaterAnchoring",traits:["abjuration","magical"]},greaterAshen:{damage:{dice:[{damageType:"fire",category:"persistent",diceNumber:1,dieSize:"d8"}],notes:[{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterAshen.Name",text:"PF2E.WeaponPropertyRune.greaterAshen.Note.success"}]},level:16,name:"PF2E.WeaponPropertyRune.greaterAshen.Name",price:9e3,rarity:"common",slug:"greaterAshen",traits:["enchantment","magical"]},greaterBloodbane:{level:13,name:"PF2E.WeaponPropertyRune.greaterBloodbane.Name",price:2800,rarity:"uncommon",slug:"greaterBloodbane",traits:["dwarf","evocation","magical"]},greaterBrilliant:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d4"},{damageType:"good",diceNumber:1,dieSize:"d4",predicate:["target:trait:fiend"]},{damageType:"vitality",diceNumber:1,dieSize:"d4",predicate:["target:mode:undead"]}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterBrilliant.Name",text:"PF2E.WeaponPropertyRune.greaterBrilliant.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterBrilliant.Name",text:"PF2E.WeaponPropertyRune.greaterBrilliant.Note.success"}],ignoredResistances:[{type:"fire",max:null},{type:"good",max:null},{type:"vitality",max:null}]},level:18,name:"PF2E.WeaponPropertyRune.greaterBrilliant.Name",price:24e3,rarity:"common",slug:"greaterBrilliant",traits:["evocation","magical"]},greaterCorrosive:{damage:{dice:[{damageType:"acid",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterCorrosive.Name",text:"PF2E.WeaponPropertyRune.greaterCorrosive.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterCorrosive.Name",text:"PF2E.WeaponPropertyRune.greaterCorrosive.Note.success"}]},level:15,name:"PF2E.WeaponPropertyRune.greaterCorrosive.Name",price:6500,rarity:"common",slug:"greaterCorrosive",traits:["acid","conjuration","magical"]},greaterCrushing:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterCrushing.Name",text:"PF2E.WeaponPropertyRune.greaterCrushing.Note.criticalSuccess"}]},level:9,name:"PF2E.WeaponPropertyRune.greaterCrushing.Name",price:650,rarity:"uncommon",slug:"greaterCrushing",traits:["magical","necromancy"]},greaterDisrupting:{damage:{dice:[{damageType:"vitality",diceNumber:2,dieSize:"d6",predicate:["target:mode:undead"]}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterDisrupting.Name",text:"PF2E.WeaponPropertyRune.greaterDisrupting.Note.criticalSuccess",predicate:["target:mode:undead"]}]},level:14,name:"PF2E.WeaponPropertyRune.greaterDisrupting.Name",price:4300,rarity:"uncommon",slug:"greaterDisrupting",traits:["magical","necromancy"]},greaterExtending:{level:13,name:"PF2E.WeaponPropertyRune.greaterExtending.Name",price:3e3,rarity:"common",slug:"greaterExtending",traits:["magical","transmutation"]},greaterFanged:{level:8,name:"PF2E.WeaponPropertyRune.greaterFanged.Name",price:425,rarity:"uncommon",slug:"greaterFanged",traits:["magical","transmutation"]},greaterFearsome:{damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterFearsome.Name",text:"PF2E.WeaponPropertyRune.greaterFearsome.Note.criticalSuccess"}]},level:12,name:"PF2E.WeaponPropertyRune.greaterFearsome.Name",price:2e3,rarity:"common",slug:"greaterFearsome",traits:["emotion","enchantment","fear","magical","mental"]},greaterFlaming:{damage:{dice:[{damageType:"fire",diceNumber:1,dieSize:"d6"},{damageType:"fire",category:"persistent",diceNumber:2,dieSize:"d10",critical:!0}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterFlaming.Name",text:"PF2E.WeaponPropertyRune.greaterFlaming.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterFlaming.Name",text:"PF2E.WeaponPropertyRune.greaterFlaming.Note.success"}],ignoredResistances:[{type:"fire",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterFlaming.Name",price:6500,rarity:"common",slug:"greaterFlaming",traits:["conjuration","fire","magical"]},greaterFrost:{damage:{dice:[{damageType:"cold",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterFrost.Name",text:"PF2E.WeaponPropertyRune.greaterFrost.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterFrost.Name",text:"PF2E.WeaponPropertyRune.greaterFrost.Note.success"}],ignoredResistances:[{type:"cold",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterFrost.Name",price:6500,rarity:"common",slug:"greaterFrost",traits:["cold","conjuration","magical"]},greaterGiantKilling:{damage:{dice:[{slug:"greaterGiantKilling",damageType:"mental",diceNumber:2,dieSize:"d6",predicate:["target:trait:giant"]}],ignoredResistances:[{type:"mental",max:null}],notes:[{outcome:["criticalSuccess"],predicate:["target:trait:giant"],title:"PF2E.WeaponPropertyRune.greaterGiantKilling.Name",text:"PF2E.WeaponPropertyRune.greaterGiantKilling.Note.criticalSuccess"}]},level:15,name:"PF2E.WeaponPropertyRune.greaterGiantKilling.Name",price:6e3,rarity:"rare",slug:"greaterGiantKilling",traits:["magical","necromancy"]},greaterHauling:{level:11,name:"PF2E.WeaponPropertyRune.greaterHauling.Name",price:1300,rarity:"uncommon",slug:"greaterHauling",traits:["evocation","magical"]},greaterImpactful:{damage:{dice:[{damageType:"force",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterImpactful.Name",text:"PF2E.WeaponPropertyRune.greaterImpactful.Note.criticalSuccess"}]},level:17,name:"PF2E.WeaponPropertyRune.greaterImpactful.Name",price:15e3,rarity:"common",slug:"greaterImpactful",traits:["evocation","force","magical"]},greaterRooting:{level:11,name:"PF2E.WeaponPropertyRune.greaterRooting.Name",price:1400,rarity:"common",slug:"greaterRooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterRooting.Name",text:"PF2E.WeaponPropertyRune.greaterRooting.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterRooting.Name",text:"PF2E.WeaponPropertyRune.greaterRooting.Note.success"}]}},greaterShock:{damage:{dice:[{damageType:"electricity",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterShock.Name",text:"PF2E.WeaponPropertyRune.greaterShock.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterShock.Name",text:"PF2E.WeaponPropertyRune.greaterShock.Note.success"}],ignoredResistances:[{type:"electricity",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterShock.Name",price:6500,rarity:"common",slug:"greaterShock",traits:["electricity","evocation","magical"]},greaterThundering:{damage:{dice:[{damageType:"sonic",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.greaterThundering.Name",text:"PF2E.WeaponPropertyRune.greaterThundering.Note.criticalSuccess"},{outcome:["success"],title:"PF2E.WeaponPropertyRune.greaterThundering.Name",text:"PF2E.WeaponPropertyRune.greaterThundering.Note.success"}],ignoredResistances:[{type:"sonic",max:null}]},level:15,name:"PF2E.WeaponPropertyRune.greaterThundering.Name",price:6500,rarity:"common",slug:"greaterThundering",traits:["evocation","magical","sonic"]},grievous:{damage:{dice:[{damageType:"bleed",diceNumber:1,dieSize:"d6",critical:!0,predicate:["critical-specialization","item:group:dart"]}],notes:[{outcome:["criticalSuccess"],predicate:["item:group:axe"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Axe"},{outcome:["criticalSuccess"],predicate:["item:group:brawling"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Brawling"},{outcome:["criticalSuccess"],predicate:["item:group:club"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Club"},{outcome:["criticalSuccess"],predicate:["item:group:flail"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Flail"},{outcome:["criticalSuccess"],predicate:["item:group:hammer"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Hammer"},{outcome:["criticalSuccess"],predicate:["item:group:knife"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Knife"},{outcome:["criticalSuccess"],predicate:["item:group:polearm"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Polearm"},{outcome:["criticalSuccess"],predicate:["item:group:shield"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Shield"},{outcome:["criticalSuccess"],predicate:["item:group:sling"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Sling"},{outcome:["criticalSuccess"],predicate:["item:group:spear"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Spear"},{outcome:["criticalSuccess"],predicate:["item:group:sword"],title:"PF2E.WeaponPropertyRune.grievous.Name",text:"PF2E.WeaponPropertyRune.grievous.Note.Sword"}],adjustments:[{slug:"critical-specialization",test:options=>new PredicatePF2e("item:group:pick").test(options),getNewValue:current=>current*2}]},level:9,name:"PF2E.WeaponPropertyRune.grievous.Name",price:700,rarity:"common",slug:"grievous",traits:["enchantment","magical"]},hauling:{level:6,name:"PF2E.WeaponPropertyRune.hauling.Name",price:225,rarity:"uncommon",slug:"hauling",traits:["evocation","magical"]},holy:{damage:{dice:[{damageType:"good",diceNumber:1,dieSize:"d6"}]},level:11,name:"PF2E.WeaponPropertyRune.holy.Name",price:1400,rarity:"common",slug:"holy",traits:["evocation","good","magical"]},hopeful:{attack:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.hopeful.Name",text:"PF2E.WeaponPropertyRune.hopeful.Note.criticalSuccess"}]},level:11,name:"PF2E.WeaponPropertyRune.hopeful.Name",price:1200,rarity:"uncommon",slug:"hopeful",traits:["enchantment","magical"]},hooked:{level:5,name:"PF2E.WeaponPropertyRune.hooked.Name",price:140,rarity:"rare",slug:"hooked",traits:["conjuration","magical"],strikeAdjustments:[{adjustWeapon:weapon=>{weapon.system.traits.value.includes("trip")||weapon.system.traits.value.push("trip")}}]},impactful:{damage:{dice:[{damageType:"force",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.impactful.Name",text:"PF2E.WeaponPropertyRune.impactful.Note.criticalSuccess"}]},level:10,name:"PF2E.WeaponPropertyRune.impactful.Name",price:1e3,rarity:"common",slug:"impactful",traits:["evocation","force","magical"]},impossible:{level:20,name:"PF2E.WeaponPropertyRune.impossible.Name",price:7e4,rarity:"common",slug:"impossible",traits:["conjuration","magical"],strikeAdjustments:[{adjustWeapon:weapon=>{if(weapon.isOfType("weapon")&&weapon.system.range&&weapon._source.system.range){const sourceRange=weapon._source.system.range,preparedRange=weapon.system.range;weapon.system.range=sourceRange*2+Math.abs(preparedRange-sourceRange)}}}]},keen:{attack:{dosAdjustments:[{adjustments:{success:{label:"PF2E.WeaponPropertyRune.keen.Name",amount:"criticalSuccess"}},predicate:new PredicatePF2e(["check:total:natural:19",{or:["item:damage:type:slashing","item:damage:type:piercing"]}])}]},level:13,name:"PF2E.WeaponPropertyRune.keen.Name",price:3e3,rarity:"uncommon",slug:"keen",traits:["magical","transmutation"]},kinWarding:{level:3,name:"PF2E.WeaponPropertyRune.kinWarding.Name",price:52,rarity:"uncommon",slug:"kinWarding",traits:["abjuration","dwarf","magical"]},majorFanged:{level:15,name:"PF2E.WeaponPropertyRune.majorFanged.Name",price:6e3,rarity:"uncommon",slug:"majorFanged",traits:["magical","transmutation"]},majorRooting:{level:15,name:"PF2E.WeaponPropertyRune.majorRooting.Name",price:6500,rarity:"common",slug:"majorRooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.majorRooting.Name",text:"PF2E.WeaponPropertyRune.majorRooting.Note.criticalSuccess"}]}},merciful:{strikeAdjustments:[{adjustWeapon:weapon=>{weapon.system.traits.value.includes("nonlethal")||weapon.system.traits.value.push("nonlethal")}}],level:4,name:"PF2E.WeaponPropertyRune.merciful.Name",price:70,rarity:"common",slug:"merciful",traits:["abjuration","magical","mental"]},pacifying:{level:5,name:"PF2E.WeaponPropertyRune.pacifying.Name",price:150,rarity:"uncommon",slug:"pacifying",traits:["enchantment","magical"]},returning:{attack:{notes:[{title:"PF2E.WeaponPropertyRune.returning.Name",text:"PF2E.WeaponPropertyRune.returning.Note"}]},level:3,name:"PF2E.WeaponPropertyRune.returning.Name",price:55,rarity:"common",slug:"returning",traits:["evocation","magical"]},rooting:{level:7,name:"PF2E.WeaponPropertyRune.rooting.Name",price:360,rarity:"common",slug:"rooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.rooting.Name",text:"PF2E.WeaponPropertyRune.rooting.Note.criticalSuccess"}]}},serrating:{damage:{dice:[{damageType:"slashing",diceNumber:1,dieSize:"d4"}]},level:10,name:"PF2E.WeaponPropertyRune.serrating.Name",price:1e3,rarity:"uncommon",slug:"serrating",traits:["evocation","magical"]},shifting:{level:6,name:"PF2E.WeaponPropertyRune.shifting.Name",price:225,rarity:"common",slug:"shifting",traits:["magical","transmutation"]},shock:{damage:{dice:[{damageType:"electricity",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.shock.Name",text:"PF2E.WeaponPropertyRune.shock.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.shock.Name",price:500,rarity:"common",slug:"shock",traits:["electricity","conjuration","magical"]},speed:{level:16,name:"PF2E.WeaponPropertyRune.speed.Name",price:1e4,rarity:"rare",slug:"speed",traits:["magical","transmutation"]},spellStoring:{level:13,name:"PF2E.WeaponPropertyRune.spellStoring.Name",price:2700,rarity:"uncommon",slug:"spellStoring",traits:["abjuration","magical"]},swarming:{level:9,name:"PF2E.WeaponPropertyRune.swarming.Name",price:700,rarity:"common",slug:"swarming",traits:["conjuration","magical"]},thundering:{damage:{dice:[{damageType:"sonic",diceNumber:1,dieSize:"d6"}],notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.thundering.Name",text:"PF2E.WeaponPropertyRune.thundering.Note.criticalSuccess"}]},level:8,name:"PF2E.WeaponPropertyRune.thundering.Name",price:500,rarity:"common",slug:"thundering",traits:["evocation","magical","sonic"]},trueRooting:{level:19,name:"PF2E.WeaponPropertyRune.trueRooting.Name",price:4e4,rarity:"common",slug:"trueRooting",traits:["plant","magical","wood"],damage:{notes:[{outcome:["criticalSuccess"],title:"PF2E.WeaponPropertyRune.trueRooting.Name",text:"PF2E.WeaponPropertyRune.trueRooting.Note.criticalSuccess"}]}},underwater:{level:3,name:"PF2E.WeaponPropertyRune.underwater.Name",price:50,rarity:"common",slug:"underwater",traits:["magical","water"]},unholy:{damage:{dice:[{damageType:"evil",diceNumber:1,dieSize:"d6"}]},level:11,name:"PF2E.WeaponPropertyRune.unholy.Name",price:1400,rarity:"common",slug:"unholy",traits:["evil","evocation","magical"]},vorpal:{level:17,name:"PF2E.WeaponPropertyRune.vorpal.Name",price:15e3,rarity:"rare",slug:"vorpal",traits:["evocation","magical"]},wounding:{damage:{dice:[{damageType:"bleed",diceNumber:1,dieSize:"d6"}]},level:7,name:"PF2E.WeaponPropertyRune.wounding.Name",price:340,rarity:"common",slug:"wounding",traits:["magical","necromancy"]}},RUNE_DATA={armor:{...FUNDAMENTAL_ARMOR_RUNE_DATA,property:ARMOR_PROPERTY_RUNES},weapon:{...FUNDAMENTAL_WEAPON_RUNE_DATA,property:WEAPON_PROPERTY_RUNES}};function computePrice(item){const basePrice=item.price.value;if(item.isOfType("treasure"))return basePrice;const materialPrice=getMaterialValuationData(item)?.price??0,heldOrStowedBulk=new Bulk({light:item.system.bulk.heldOrStowed}),bulk=Math.max(Math.ceil(heldOrStowedBulk.normal),1),materialValue=item.isSpecific?0:materialPrice+bulk*materialPrice/10,runesData=getRuneValuationData(item),runeValue=item.isSpecific?0:runesData.reduce((sum2,rune)=>sum2+rune.price,0),afterMaterialAndRunes=runeValue?new CoinsPF2e({gp:runeValue+materialValue}):basePrice.add({gp:materialValue}),higher=afterMaterialAndRunes.copperValue>basePrice.copperValue?afterMaterialAndRunes:basePrice,afterShoddy=item.isShoddy?higher.scale(.5):higher;return item.isMagical?afterShoddy:afterShoddy.adjustForSize(item.size)}__name(computePrice,"computePrice"),__name2(computePrice,"computePrice");function computeLevelRarityPrice(item){const materialData=getMaterialValuationData(item),price=computePrice(item);if(!(item.isMagical||materialData)||item.isSpecific||item.isOfType("armor")&&item.isShield)return{...pick$1(item,["level","rarity"]),price};const runesData=getRuneValuationData(item),level=runesData.map(runeData=>runeData.level).concat(materialData?.level??0).reduce((highest,level2)=>level2>highest?level2:highest,item.level),rarityOrder={common:0,uncommon:1,rare:2,unique:3},baseRarity=item.rarity,rarity=runesData.map(runeData=>runeData.rarity).concat(materialData?.rarity??"common").reduce((highest,rarity2)=>rarityOrder[rarity2]>rarityOrder[highest]?rarity2:highest,baseRarity);return{level,rarity,price}}__name(computeLevelRarityPrice,"computeLevelRarityPrice"),__name2(computeLevelRarityPrice,"computeLevelRarityPrice");function generateItemName(item){if(!item.isOfType("armor","weapon")||item.isOfType("armor")&&item.isShield)return item.name;const[baseItemDictionary,propertyDictionary,fundamentalTwoDictionary]=item.isOfType("armor")?[CONFIG.PF2E.baseArmorTypes,RUNE_DATA.armor.property,RUNE_DATA.armor.resilient]:[CONFIG.PF2E.baseWeaponTypes,RUNE_DATA.weapon.property,RUNE_DATA.weapon.striking],storedName=item._source.name,baseType=item.baseType??"";if(!baseType||!(baseType in baseItemDictionary)||item.isSpecific||storedName!==game.i18n.localize(baseItemDictionary[baseType]??""))return item.name;const{material}=item,{runes}=item.system,potencyRune=runes.potency,fundamental2="resilient"in runes?runes.resilient:runes.striking,params={base:baseType?game.i18n.localize(baseItemDictionary[baseType]??""):item.name,material:material.type&&game.i18n.localize(CONFIG.PF2E.preciousMaterials[material.type]),potency:potencyRune,fundamental2:game.i18n.localize(fundamentalTwoDictionary[fundamental2]?.name??"")||null,property1:game.i18n.localize(propertyDictionary[runes.property[0]]?.name??"")||null,property2:game.i18n.localize(propertyDictionary[runes.property[1]]?.name??"")||null,property3:game.i18n.localize(propertyDictionary[runes.property[2]]?.name??"")||null,property4:game.i18n.localize(propertyDictionary[runes.property[3]]?.name??"")||null},formatString=(()=>{const potency=params.potency&&"Potency",fundamental22=params.fundamental2&&"Fundamental2",properties=params.property4?"FourProperties":params.property3?"ThreeProperties":params.property2?"TwoProperties":params.property1?"OneProperty":null,material2=params.material&&"Material",key=[potency,fundamental22,properties,material2].filter(keyPart=>!!keyPart).join("")||null;return key&&game.i18n.localize(key)})();return formatString?game.i18n.format(`PF2E.Item.Physical.GeneratedName.${formatString}`,params):item.name}__name(generateItemName,"generateItemName"),__name2(generateItemName,"generateItemName");function organizeBulkData(item){const stackData=STACK_DEFINITIONS[item.system.stackGroup??""]??null,per=stackData?.size??1,heldOrStowed=stackData?.lightBulk??weightToBulk(item.system.weight.value)?.toLightBulk()??0,worn=item.system.equippedBulk.value?weightToBulk(item.system.equippedBulk.value)?.toLightBulk()??0:heldOrStowed,value=item.isOfType("armor","equipment","backpack")&&item.isEquipped?worn:heldOrStowed;return{heldOrStowed,worn,value,per}}__name(organizeBulkData,"organizeBulkData"),__name2(organizeBulkData,"organizeBulkData");const _Migration639NormalizeLevelAndPrice=class extends MigrationBase{static{__name(this,"_Migration639NormalizeLevelAndPrice")}coinSlugs=new Set(["platinum-pieces","gold-pieces","silver-pieces","copper-pieces"]);async updateItem(source){if(source.system.level&&(source.system.level.value=Number(source.system.level.value)||0),!isPhysicalData(source)||this.coinSlugs.has(source.system.slug??""))return;const system=source.system,price=system.price;if(!(typeof price.value!="string"&&isObject(price.value)))if(price.value?price.value=price.value.trim():price.value="0 gp",/^[0-9]+$/.test(price.value))price.value=`${price.value} gp`;else{const quantity=system.quantity,priceValue=price.value;CoinsPF2e.fromString(priceValue,quantity).copperValue&&(price.value="0 gp")}}};__name2(_Migration639NormalizeLevelAndPrice,"Migration639NormalizeLevelAndPrice"),__publicField(_Migration639NormalizeLevelAndPrice,"version",.639);let Migration639NormalizeLevelAndPrice=_Migration639NormalizeLevelAndPrice;const _Migration640CantripsAreNotZeroLevel=class extends MigrationBase{static{__name(this,"_Migration640CantripsAreNotZeroLevel")}async updateItem(itemData){if(itemData.type!=="spell")return;const level=itemData.system.level;level.value===0&&(level.value=1,itemData.system.traits.value.includes("cantrip")||itemData.system.traits.value.push("cantrip"))}};__name2(_Migration640CantripsAreNotZeroLevel,"Migration640CantripsAreNotZeroLevel"),__publicField(_Migration640CantripsAreNotZeroLevel,"version",.64);let Migration640CantripsAreNotZeroLevel=_Migration640CantripsAreNotZeroLevel;const _Migration641SovereignSteelValue=class extends MigrationBase{static{__name(this,"_Migration641SovereignSteelValue")}async updateItem(source){if(source.type!=="weapon")return;const material=source.system.preciousMaterial??{};material.value?.toLowerCase()==="sovereign steel"&&(material.value="sovereignSteel")}};__name2(_Migration641SovereignSteelValue,"Migration641SovereignSteelValue"),__publicField(_Migration641SovereignSteelValue,"version",.641);let Migration641SovereignSteelValue=_Migration641SovereignSteelValue;const _Migration642TrackSchemaVersion=class extends MigrationBase{static{__name(this,"_Migration642TrackSchemaVersion")}async updateActor(actorSource){actorSource.system.schema??={version:null,lastMigration:null}}async updateItem(itemSource){itemSource.system.schema??={version:null,lastMigration:null}}};__name2(_Migration642TrackSchemaVersion,"Migration642TrackSchemaVersion"),__publicField(_Migration642TrackSchemaVersion,"version",.642);let Migration642TrackSchemaVersion=_Migration642TrackSchemaVersion;const _Migration643HazardLevel=class extends MigrationBase{static{__name(this,"_Migration643HazardLevel")}async updateActor(actorSource){if(actorSource.type!=="hazard")return;const hazardDetails=actorSource.system.details;if(typeof hazardDetails.level=="number"){const level=hazardDetails.level;hazardDetails.level={value:level}}}};__name2(_Migration643HazardLevel,"Migration643HazardLevel"),__publicField(_Migration643HazardLevel,"version",.643);let Migration643HazardLevel=_Migration643HazardLevel;const defaultTraditionByClass$1={wizard:"arcane",cleric:"divine",druid:"primal",bard:"occult",ranger:"primal",champion:"divine",monk:"divine"},_Migration644SpellcastingCategory=class extends MigrationBase{static{__name(this,"_Migration644SpellcastingCategory")}async updateItem(item,actor){if(!actor||item.type!=="spellcastingEntry")return;const spellcasting=item.system;if(spellcasting.tradition.value==="ritual")spellcasting.prepared.value="ritual",spellcasting.tradition.value="";else if(spellcasting.tradition.value==="focus"){spellcasting.prepared.value="focus";const possibleMatch=actor.items.find(testItem=>{if(testItem.type!=="spellcastingEntry")return!1;const testSpellcasting=testItem.system;return tupleHasValue(["prepared","spontaneous"],testSpellcasting.prepared.value)&&testSpellcasting.tradition.value!=="focus"&&(actor.type==="character"?testSpellcasting.proficiency.value===spellcasting.proficiency.value:testSpellcasting.spelldc.value===spellcasting.spelldc.value)&&(testSpellcasting.ability.value||"int")===(spellcasting.ability.value||"int")});if(possibleMatch)spellcasting.tradition.value=possibleMatch.system.tradition.value;else{const classItem=actor.items.find(testItem=>testItem.type==="class"),className=classItem?.system.slug||sluggify(classItem?.name??"");spellcasting.tradition.value=defaultTraditionByClass$1[className]??"arcane"}}}};__name2(_Migration644SpellcastingCategory,"Migration644SpellcastingCategory"),__publicField(_Migration644SpellcastingCategory,"version",.644);let Migration644SpellcastingCategory=_Migration644SpellcastingCategory;const _Migration645TokenImageSize=class extends MigrationBase{static{__name(this,"_Migration645TokenImageSize")}constructor(){super(...arguments),__privateAdd(this,_isTokenImageFlag),__privateAdd(this,_isTokenSizeFlag),__privateAdd(this,_imageOverrides,new Map),__privateAdd(this,_sizeOverrides,new Map)}async updateActor(actorSource){const flags=actorSource.flags,originalImg=flags.pf2e?.token?.img;__privateMethod(this,_isTokenImageFlag,isTokenImageFlag_fn).call(this,originalImg)&&__privateGet(this,_imageOverrides).set(actorSource._id,originalImg);const originalSize=flags.pf2e?.token?.size;__privateMethod(this,_isTokenSizeFlag,isTokenSizeFlag_fn).call(this,originalSize)&&__privateGet(this,_sizeOverrides).set(actorSource._id,originalSize),typeof flags.pf2e?.token=="object"&&("game"in globalThis&&(flags.pf2e["-=token"]=null),delete flags.pf2e.token)}async updateToken(tokenSource,actor){tokenSource.texture.src=__privateGet(this,_imageOverrides).get(actor?.id??"")??tokenSource.texture.src;const sizeOverride=__privateGet(this,_sizeOverrides).get(actor?.id??"");tokenSource.height=sizeOverride?.height??tokenSource.height,tokenSource.width=sizeOverride?.width??tokenSource.width}};_imageOverrides=new WeakMap,_sizeOverrides=new WeakMap,_isTokenImageFlag=new WeakSet,isTokenImageFlag_fn=__name2(function(flag){return typeof flag=="string"},"#isTokenImageFlag"),_isTokenSizeFlag=new WeakSet,isTokenSizeFlag_fn=__name2(function(flag){return flag instanceof Object&&"height"in flag&&typeof flag.height=="number"&&"width"in flag&&typeof flag.width=="number"},"#isTokenSizeFlag"),__name2(_Migration645TokenImageSize,"Migration645TokenImageSize"),__publicField(_Migration645TokenImageSize,"version",.645);let Migration645TokenImageSize=_Migration645TokenImageSize;const _Migration646UpdateInlineLinks=class extends MigrationBase{static{__name(this,"_Migration646UpdateInlineLinks")}updateCheckAttributes(markup=""){return markup.replace(/\bdata-pf2-([a-z]+)-check="\w*"/g,'data-pf2-check="$1"').replace(/\bdata-pf2-(?:saving-throw|skill-check)\b/g,"data-pf2-check")}async updateActor(actorData){if(actorData.type==="hazard"){const hazardDetails=actorData.system.details;hazardDetails.disable=this.updateCheckAttributes(hazardDetails.disable??"")}}async updateItem(itemData){const description=itemData.system.description;description.value=this.updateCheckAttributes(description.value??"")}};__name2(_Migration646UpdateInlineLinks,"Migration646UpdateInlineLinks"),__publicField(_Migration646UpdateInlineLinks,"version",.646);let Migration646UpdateInlineLinks=_Migration646UpdateInlineLinks;const _Migration647FixPCSenses=class extends MigrationBase{static{__name(this,"_Migration647FixPCSenses")}async updateActor(actorData){if(actorData.type!=="character")return;const notTraits=actorData.system.traits;Array.isArray(notTraits.senses)?notTraits.senses=notTraits.senses.filter(sense=>!!sense):notTraits.senses=[]}};__name2(_Migration647FixPCSenses,"Migration647FixPCSenses"),__publicField(_Migration647FixPCSenses,"version",.647);let Migration647FixPCSenses=_Migration647FixPCSenses;const _Migration648RemoveInvestedProperty=class extends MigrationBase{static{__name(this,"_Migration648RemoveInvestedProperty")}async updateItem(itemSource){if(!(itemSource.type==="treasure"||itemSource.type==="consumable"))return;const systemData=itemSource.system;delete systemData.invested,"game"in globalThis&&(systemData["-=invested"]=null)}};__name2(_Migration648RemoveInvestedProperty,"Migration648RemoveInvestedProperty"),__publicField(_Migration648RemoveInvestedProperty,"version",.648);let Migration648RemoveInvestedProperty=_Migration648RemoveInvestedProperty;function isCreatureSource(source){return["character","npc"].includes(source.type)}__name(isCreatureSource,"isCreatureSource"),__name2(isCreatureSource,"isCreatureSource");const _Migration649FocusToActor=class extends MigrationBase{static{__name(this,"_Migration649FocusToActor")}async updateActor(actorData){if(!isCreatureSource(actorData))return;const systemData=actorData.system;systemData.resources||(systemData.resources={});const spellLists=actorData.items.filter(i=>i.type==="spellcastingEntry").sort((a,b)=>(a.sort||0)-(b.sort||0)).map(i=>i.system).filter(i=>i.prepared.value==="focus"&&i.focus).sort((a,b)=>(b.focus?.pool||0)-(a.focus?.pool||0));if(spellLists.length===0)return;const focusOld=spellLists[0].focus,resources=actorData.system.resources;resources.focus={value:focusOld?.points??0,max:focusOld?.pool??1}}async updateItem(itemData){if(itemData.type!=="spellcastingEntry")return;const data=itemData.system;delete data.focus,"game"in globalThis&&(data["-=focus"]=null)}};__name2(_Migration649FocusToActor,"Migration649FocusToActor"),__publicField(_Migration649FocusToActor,"version",.649);let Migration649FocusToActor=_Migration649FocusToActor;const _Migration650StringifyWeaponProperties=class extends MigrationBase{static{__name(this,"_Migration650StringifyWeaponProperties")}async updateItem(itemData){if(itemData.type!=="weapon")return;const systemData=itemData.system;systemData.weaponType&&(systemData.weaponType.value||="simple");const range=systemData.range??={value:"melee"};range instanceof Object&&typeof range.value=="string"&&(range.value=range.value.trim()||"melee",range.value==="reach"&&(range.value="melee"))}};__name2(_Migration650StringifyWeaponProperties,"Migration650StringifyWeaponProperties"),__publicField(_Migration650StringifyWeaponProperties,"version",.65);let Migration650StringifyWeaponProperties=_Migration650StringifyWeaponProperties;const _Migration651EphemeralFocusPool=class extends MigrationBase{static{__name(this,"_Migration651EphemeralFocusPool")}constructor(){super(...arguments),__privateAdd(this,_needsRuleElement),__privateAdd(this,_isClassFeature),__privateAdd(this,_increasesByOne,new Set(["abundant-step","achaekeks-grip","advanced-bloodline","advanced-deitys-domain","advanced-domain","advanced-revelation","advanced-school-spell","advanced-seeker-of-truths","animal-feature","arcane-school-spell","apex-companion","basic-lesson","beastmasters-trance","blessed-sacrifice","cackle","champions-sacrifice","clinging-shadows-initiate","counter-perform","debilitating-dichotomy","domain-acumen","domain-fluency","empty-body","enlarge-companion","ephemeral-tracking","familiar-form","fatal-aria","gaze-of-veracity","greater-bloodline","greater-lesson","greater-revelation","heal-animal","healing-touch","hunters-luck","hunters-vision","impaling-briars","inspire-heroics","invoke-disaster","invoke-the-crimson-oath","ki-blast","ki-form","ki-rush","ki-strike","leaf-order","light-of-revelation","lingering-composition","litany-against-sloth","litany-against-wrath","litany-of-depravity","litany-of-righteousness","litany-of-self-interest","loremasters-etude","magic-hide","major-lesson","mantis-form","medusas-wrath","order-spell","perfect-ki-adept","perfect-strike","quivering-palm","rangers-bramble","shadow-magic","shadows-web","shall-not-falter-shall-not-rout","snare-hopping","song-of-the-fallen","soothing-ballad","soothing-mist","speaking-sky","spellmasters-ward","steal-the-sky","storm-order","sun-blade","suns-fury","terrain-transposition","transcribe-moment","universal-versatility","vision-of-weakness","wholeness-of-body","wild-winds-initiate","wind-caller","wind-jump","wronged-monks-wrath"]))}async updateActor(source){if(source.type!=="character")return;const systemData=source.system;systemData.resources??={};const resources=systemData.resources;typeof resources.focus?.max=="number"&&"game"in globalThis?resources.focus["-=max"]=null:delete resources.focus?.max}async updateItem(source){if(source.type!=="feat")return;const systemData=source.system,rule=(()=>{const slug=systemData.slug??sluggify(source.name);return slug==="revelation-spells"?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:2,priority:10}:slug==="major-curse"?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:3}:["composition-spells","devotion-spells","druidic-order","hexes"].includes(slug)||/^(?:arcane-school|bloodline)-/.test(slug)&&__privateMethod(this,_isClassFeature,isClassFeature_fn).call(this,source)?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:1,priority:10}:__privateGet(this,_increasesByOne).has(slug)||slug.startsWith("first-revelation-")?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"add",value:1}:null})();rule&&__privateMethod(this,_needsRuleElement,needsRuleElement_fn).call(this,source.system.rules)&&systemData.rules.push(rule)}};_needsRuleElement=new WeakSet,needsRuleElement_fn=__name2(function(rules){return!rules.some(rule=>rule.key==="ActiveEffectLike"&&rule.path==="system.resources.focus.max")},"#needsRuleElement"),_increasesByOne=new WeakMap,_isClassFeature=new WeakSet,isClassFeature_fn=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration651EphemeralFocusPool,"Migration651EphemeralFocusPool"),__publicField(_Migration651EphemeralFocusPool,"version",.651);let Migration651EphemeralFocusPool=_Migration651EphemeralFocusPool;const defaultTraditionByClass={wizard:"arcane",druid:"primal",ranger:"primal"},_Migration652KillHalcyonTradition=class extends MigrationBase{static{__name(this,"_Migration652KillHalcyonTradition")}async updateItem(itemData,actor){if(itemData.type!=="spellcastingEntry")return;const tradition=itemData.system.tradition;if(tradition.value==="halcyon"){const classItem=actor?.items.find(testItem=>testItem.type==="class"),className=classItem?.system.slug||sluggify(classItem?.name??"");tradition.value=defaultTraditionByClass[className]??"arcane"}}};__name2(_Migration652KillHalcyonTradition,"Migration652KillHalcyonTradition"),__publicField(_Migration652KillHalcyonTradition,"version",.652);let Migration652KillHalcyonTradition=_Migration652KillHalcyonTradition;const _Migration653AEstoREs=class extends MigrationBase{static{__name(this,"_Migration653AEstoREs")}constructor(){super(...arguments),__privateAdd(this,_isRemovableAE),__privateAdd(this,_isRemoveableChange),__privateAdd(this,_fixClassKeyAbilities),__privateAdd(this,_pathsToRemove,new Set([...["unarmored","light","medium","heavy"].map(category=>`system.martial.${category}.rank`),...["unarmed","simple","martial","advanced"].map(category=>`system.martial.${category}.rank`),...["fortitude","reflex","will"].map(save=>`system.saves.${save}.rank`),"system.details.keyability.value","system.attributes.perception.rank","system.attributes.classDC.rank"]))}async updateActor(actorSource){if(actorSource.type!=="character")return;const systemData=actorSource.system;systemData.martial={},actorSource.effects=actorSource.effects.filter(effect=>{const origin=effect.origin??"",itemId=/\bItem\.([A-Za-z0-9]{16})$/.exec(origin)?.[1],itemSource=actorSource.items.find(maybeSource=>maybeSource._id===itemId);return itemSource&&!(["class","effect","feat"].includes(itemSource.type)&&__privateMethod(this,_isRemovableAE,isRemovableAE_fn).call(this,effect))})}async updateItem(itemSource){if(!(itemSource.type==="class"||itemSource.type==="effect"||itemSource.type==="feat"))return;itemSource.type==="class"&&__privateMethod(this,_fixClassKeyAbilities,fixClassKeyAbilities_fn).call(this,itemSource);const modes2={1:"multiply",2:"add",3:"downgrade",4:"upgrade",5:"override"};for(const effect of[...itemSource.effects]){itemSource.type==="class"&&(effect.changes=effect.changes.filter(change=>!__privateGet(this,_pathsToRemove).has(change.key)));const toAELikes=effect.changes.filter(__privateMethod(this,_isRemoveableChange,isRemoveableChange_fn)),rules=itemSource.system.rules;for(const change of toAELikes){if(change.mode===0)continue;const newRule={key:"ActiveEffectLike",path:change.key,mode:modes2[change.mode],value:Number.isNaN(Number(change.value))?change.value:Number(change.value),priority:change.priority??50};rules.push(newRule)}effect.changes=effect.changes.filter(change=>!__privateMethod(this,_isRemoveableChange,isRemoveableChange_fn).call(this,change))}itemSource.effects=itemSource.effects.filter(effect=>!__privateMethod(this,_isRemovableAE,isRemovableAE_fn).call(this,effect))}};_pathsToRemove=new WeakMap,_isRemovableAE=new WeakSet,isRemovableAE_fn=__name2(function(effect){return effect.changes.every(__privateMethod(this,_isRemoveableChange,isRemoveableChange_fn))},"#isRemovableAE"),_isRemoveableChange=new WeakSet,isRemoveableChange_fn=__name2(function(change){return change.mode!==0&&Number.isInteger(Number(change.value))||change.mode===5&&!change.value.startsWith("{")},"#isRemoveableChange"),_fixClassKeyAbilities=new WeakSet,fixClassKeyAbilities_fn=__name2(function(classSource){const keyAbility=classSource.system.keyAbility;keyAbility.value=keyAbility.value.map(value=>typeof value=="string"?value:value.value)},"#fixClassKeyAbilities"),__name2(_Migration653AEstoREs,"Migration653AEstoREs"),__publicField(_Migration653AEstoREs,"version",.653);let Migration653AEstoREs=_Migration653AEstoREs;const _Migration654ActionTypeAndCount=class extends MigrationBase{static{__name(this,"_Migration654ActionTypeAndCount")}async updateItem(item){if(item.type!=="feat"&&item.type!=="action")return;const systemData=item.system;systemData.actions.value=Math.min(3,Math.max(Number(systemData.actions.value),0))||null}};__name2(_Migration654ActionTypeAndCount,"Migration654ActionTypeAndCount"),__publicField(_Migration654ActionTypeAndCount,"version",.654);let Migration654ActionTypeAndCount=_Migration654ActionTypeAndCount;const _Migration655CreatureTokenSizes=class extends MigrationBase{static{__name(this,"_Migration655CreatureTokenSizes")}constructor(){super(...arguments),__privateAdd(this,_isTokenSizeRE),__privateAdd(this,_isActorSizeAELike),__privateAdd(this,_isBracketedValue),__publicField(this,"dimensionToSize",{.5:"tiny",2:"lg",3:"huge",4:"grg"})}async updateItem(itemSource){itemSource.system.rules??=[];const rules=itemSource.system.rules,actorSizeAELike=rules.find(__privateMethod(this,_isActorSizeAELike,isActorSizeAELike_fn)),tokenSizeRE=rules.find(__privateMethod(this,_isTokenSizeRE,isTokenSizeRE_fn));if(actorSizeAELike)actorSizeAELike.key="CreatureSize",delete actorSizeAELike.path,delete actorSizeAELike.mode;else if(tokenSizeRE&&["number","string","object"].includes(typeof tokenSizeRE.value))if(tokenSizeRE.key="CreatureSize",__privateMethod(this,_isBracketedValue,isBracketedValue_fn).call(this,tokenSizeRE.value))for(const bracket of tokenSizeRE.value.brackets)typeof bracket.value=="number"&&(bracket.value=this.dimensionToSize[bracket.value]??"med");else typeof tokenSizeRE.value=="number"&&(tokenSizeRE.value=this.dimensionToSize[tokenSizeRE.value]??"med");tokenSizeRE&&tokenSizeRE.key!=="CreatureSize"&&itemSource.system.rules.splice(itemSource.system.rules.indexOf(tokenSizeRE),1)}};_isTokenSizeRE=new WeakSet,isTokenSizeRE_fn=__name2(function(rule){return typeof rule.key=="string"&&rule.key.endsWith("TokenSize")},"#isTokenSizeRE"),_isActorSizeAELike=new WeakSet,isActorSizeAELike_fn=__name2(function(rule){return typeof rule.key=="string"&&rule.key.endsWith("ActiveEffectLike")&&rule.path==="system.traits.size.value"},"#isActorSizeAELike"),_isBracketedValue=new WeakSet,isBracketedValue_fn=__name2(function(value){return isObject(value)&&Array.isArray(value.brackets)},"#isBracketedValue"),__name2(_Migration655CreatureTokenSizes,"Migration655CreatureTokenSizes"),__publicField(_Migration655CreatureTokenSizes,"version",.655);let Migration655CreatureTokenSizes=_Migration655CreatureTokenSizes;const _Migration656OtherFocusPoolSources=class extends MigrationBase{static{__name(this,"_Migration656OtherFocusPoolSources")}needsRuleElement(rules){return!rules.some(rule=>rule.key==="ActiveEffectLike"&&rule.path==="system.resources.focus.max")}increasesByOne=new Set(["additional-shadow-magic","basic-bloodline-spell","blessed-one-dedication","breath-of-the-dragon","crystal-ward-spells","domain-initiate","expanded-domain-initiate","gravity-weapon","heal-companion","leaf-order","shadow-illusion","storm-order","wings-of-the-dragon"]);async updateItem(itemSource){if(itemSource.type!=="feat")return;const systemData=itemSource.system,rule=(()=>{const slug=systemData.slug??sluggify(itemSource.name);return slug==="druidic-order"?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"upgrade",value:1,priority:10}:this.increasesByOne.has(slug)?{key:"ActiveEffectLike",path:"system.resources.focus.max",mode:"add",value:1}:null})();rule&&this.needsRuleElement(itemSource.system.rules)&&systemData.rules.push(rule)}};__name2(_Migration656OtherFocusPoolSources,"Migration656OtherFocusPoolSources"),__publicField(_Migration656OtherFocusPoolSources,"version",.656);let Migration656OtherFocusPoolSources=_Migration656OtherFocusPoolSources;const _Migration657RemoveSetProperty=class extends MigrationBase{static{__name(this,"_Migration657RemoveSetProperty")}async updateActor(actorSource){const systemFlags=actorSource.flags.pf2e??{};delete systemFlags["set-property"],"game"in globalThis&&"set-property"in systemFlags&&(systemFlags["-=set-property"]=null)}async updateItem(itemSource){itemSource.system.rules??=[];const rules=itemSource.system.rules,setPropertyRules=itemSource.system.rules.filter(rule=>typeof rule.key=="string"&&["SetProperty","PF2E.RuleElement.SetProperty"].includes(rule.key)&&typeof rule.property=="string"&&typeof rule.on=="object"&&rule.on!==null&&"added"in rule.on),aeLikes=setPropertyRules.map(setProperty2=>({key:"ActiveEffectLike",mode:"override",path:setProperty2.property.replace(/^flags\.2e/,"flags.pf2e"),value:setProperty2.on.added,priority:10}));for(const setPropertyRule of setPropertyRules){const index=rules.indexOf(setPropertyRule);rules.splice(index,1,aeLikes.shift())}itemSource.system.rules=itemSource.system.rules.filter(rule=>rule&&typeof rule.key=="string"&&!rule.key.trim().endsWith("SetProperty"))}};__name2(_Migration657RemoveSetProperty,"Migration657RemoveSetProperty"),__publicField(_Migration657RemoveSetProperty,"version",.657);let Migration657RemoveSetProperty=_Migration657RemoveSetProperty;const _Migration658MonkUnarmoredProficiency=class extends MigrationBase{static{__name(this,"_Migration658MonkUnarmoredProficiency")}async updateItem(itemSource){const slug=itemSource.system.slug??sluggify(itemSource.name);itemSource.type==="class"&&slug==="monk"&&itemSource.system.defenses.unarmored!==2&&(itemSource.system.defenses.unarmored=2)}};__name2(_Migration658MonkUnarmoredProficiency,"Migration658MonkUnarmoredProficiency"),__publicField(_Migration658MonkUnarmoredProficiency,"version",.658);let Migration658MonkUnarmoredProficiency=_Migration658MonkUnarmoredProficiency;const formulaHasValue=__name2(value=>!!value&&value!=="0","formulaHasValue"),modes=["level1","level2","level3","level4"],_Migration659MultipleDamageRows=class extends MigrationBase{static{__name(this,"_Migration659MultipleDamageRows")}async updateItem(source){if(source.type!=="spell")return;const data=source.system;if(data.scaling instanceof Object&&(typeof data.scaling.mode=="string"&&tupleHasValue(modes,data.scaling.mode)&&(data.scaling.interval=modes.indexOf(data.scaling.mode)+1),typeof data.scaling.formula=="string"&&formulaHasValue(data.scaling.formula)&&!data.scaling.damage&&(data.scaling.damage={0:data.scaling.formula}),!data.scaling.interval||!data.scaling.damage?"game"in globalThis?data["-=scaling"]=null:delete data.scaling:"game"in globalThis?(data.scaling["-=mode"]=null,data.scaling["-=formula"]=null):(delete data.scaling.mode,delete data.scaling.formula)),typeof data.damage.value=="string"){if(formulaHasValue(data.damage.value)||data.damage.applyMod){const value=data.damage.value;data.damage.value={0:{value,applyMod:data.damage.applyMod||void 0,type:{value:data.damageType?.value||"untyped",categories:[]}}}}else data.damage.value={};"game"in globalThis?data.damage["-=applyMod"]=null:delete data.damage.applyMod}"damageType"in data&&("game"in globalThis?data["-=damageType"]=null:data.damageType=void 0)}};__name2(_Migration659MultipleDamageRows,"Migration659MultipleDamageRows"),__publicField(_Migration659MultipleDamageRows,"version",.659);let Migration659MultipleDamageRows=_Migration659MultipleDamageRows;const _Migration660DerivedSpellTraits=class extends MigrationBase{static{__name(this,"_Migration660DerivedSpellTraits")}derivedTraits=[...MAGIC_SCHOOLS,...MAGIC_TRADITIONS];async updateItem(itemSource){if(itemSource.type==="spell"){const traits=itemSource.system.traits;traits.value=traits.value.filter(trait=>!this.derivedTraits.includes(trait))}}};__name2(_Migration660DerivedSpellTraits,"Migration660DerivedSpellTraits"),__publicField(_Migration660DerivedSpellTraits,"version",.66);let Migration660DerivedSpellTraits=_Migration660DerivedSpellTraits;const _Migration661NumifyVehicleDimensions=class extends MigrationBase{static{__name(this,"_Migration661NumifyVehicleDimensions")}async updateActor(actorSource){if(actorSource.type==="vehicle"){const{space}=actorSource.system.details;space.long=Number(space.long)||2,space.wide=Number(space.wide)||2,space.high=Number(space.high)||1}}};__name2(_Migration661NumifyVehicleDimensions,"Migration661NumifyVehicleDimensions"),__publicField(_Migration661NumifyVehicleDimensions,"version",.661);let Migration661NumifyVehicleDimensions=_Migration661NumifyVehicleDimensions;const _Migration662LinkToActorSizeDefaults=class extends MigrationBase{static{__name(this,"_Migration662LinkToActorSizeDefaults")}async updateActor(actorSource){const linkToActorSize=!["hazard","loot"].includes(actorSource.type);actorSource.prototypeToken.flags??={pf2e:{linkToActorSize}},actorSource.prototypeToken.flags.pf2e??={linkToActorSize},actorSource.prototypeToken.flags.pf2e.linkToActorSize??=linkToActorSize}async updateToken(tokenSource,actor){const linkToActorSize=!["hazard","loot"].includes(actor.type);tokenSource.flags.pf2e??={linkToActorSize},tokenSource.flags.pf2e.linkToActorSize??=linkToActorSize}};__name2(_Migration662LinkToActorSizeDefaults,"Migration662LinkToActorSizeDefaults"),__publicField(_Migration662LinkToActorSizeDefaults,"version",.662);let Migration662LinkToActorSizeDefaults=_Migration662LinkToActorSizeDefaults;function createBasicDamage(value,applyMod,damageType){return{0:{applyMod,type:{categories:[],value:damageType},value}}}__name(createBasicDamage,"createBasicDamage"),__name2(createBasicDamage,"createBasicDamage");function createBasicScaling(interval,scaling){return{interval,damage:{0:scaling}}}__name(createBasicScaling,"createBasicScaling"),__name2(createBasicScaling,"createBasicScaling");const _Migration663FixSpellDamage=class extends MigrationBase{static{__name(this,"_Migration663FixSpellDamage")}async updateItem(source){if(source.type!=="spell"||Object.keys(source.system.damage?.value??{}).length>0)return;const itemName=source.system.slug??sluggify(source.name),systemData=source.system;switch(itemName){case"animated-assault":systemData.damage.value=createBasicDamage("2d10",!1,"bludgeoning"),systemData.scaling=createBasicScaling(2,"2d10");break;case"daze":systemData.damage.value=createBasicDamage("0",!0,"mental"),systemData.scaling=createBasicScaling(2,"1d6");break;case"personal-blizzard":systemData.damage.value={0:{applyMod:!1,type:{value:"cold",categories:[]},value:"1d6"},1:{applyMod:!1,type:{value:"cold",subtype:"persistent",categories:[]},value:"1d6"}},systemData.scaling={interval:1,damage:{0:"1",1:"1"}};break;case"power-word-kill":systemData.damage.value=createBasicDamage("50",!1,"untyped");break}}};__name2(_Migration663FixSpellDamage,"Migration663FixSpellDamage"),__publicField(_Migration663FixSpellDamage,"version",.663);let Migration663FixSpellDamage=_Migration663FixSpellDamage;const _Migration664DeleteCUBConditions=class extends MigrationBase{static{__name(this,"_Migration664DeleteCUBConditions")}async updateActor(actorSource){const cubConditions=actorSource.items.filter(item=>item.type==="condition"&&!item.system.references?.overriddenBy);for(const condition of cubConditions)actorSource.items.findSplice(item=>item===condition)}};__name2(_Migration664DeleteCUBConditions,"Migration664DeleteCUBConditions"),__publicField(_Migration664DeleteCUBConditions,"version",.664);let Migration664DeleteCUBConditions=_Migration664DeleteCUBConditions;const _Migration665HandwrapsCorrections=class extends MigrationBase{static{__name(this,"_Migration665HandwrapsCorrections")}async updateItem(itemSource){const slug=itemSource.system.slug??sluggify(itemSource.name);if(itemSource.type==="weapon"&&slug==="handwraps-of-mighty-blows"){const usage=itemSource.system.usage;usage.value="worn-gloves"}const dirPath="systems/pf2e/icons/equipment/worn-items/other-worn-items";itemSource.img===`${dirPath}/handwraps-of-nighty-blows.webp`&&(itemSource.img=`${dirPath}/handwraps-of-mighty-blows.webp`)}};__name2(_Migration665HandwrapsCorrections,"Migration665HandwrapsCorrections"),__publicField(_Migration665HandwrapsCorrections,"version",.665);let Migration665HandwrapsCorrections=_Migration665HandwrapsCorrections;const _Migration666UsageAndStowingContainers=class extends MigrationBase{static{__name(this,"_Migration666UsageAndStowingContainers")}backpacks=new Set(["backpack","knapsack-of-halflingkind","knapsack-of-halflingkind-greater","sturdy-satchel","vaultbreaker-harness","voyagers-pack"]);wornGarment=new Set(["sleeves-of-storage","sleeves-of-storage-greater"]);wornGloves=new Set(["gloves-of-storing"]);heldInTwoHands=new Set(["bag-of-devouring-type-i","bag-of-devouring-type-ii","bag-of-devouring-type-iii","bag-of-holding-type-i","bag-of-holding-type-ii","bag-of-holding-type-iii","bag-of-holding-type-iv","bag-of-weasels","chest","sealing-chest-greater","sealing-chest-lesser","sealing-chest-moderate"]);stowingContainers=new Set([...this.backpacks,...this.heldInTwoHands,...this.wornGarment,...this.wornGloves,"extradimensional-stash"]);async updateItem(itemSource){if(!itemSource.system.traits)return;const traits=itemSource.system.traits;if(typeof traits.usage?.value=="string"){const traitUsage=traits.usage.value,isPhysical=isPhysicalData(itemSource),keepUsage=isPhysical&&(traitUsage!=="held-in-one-hand"||itemSource.system.usage.value==="");isPhysical&&keepUsage&&(itemSource.system.usage.value=traits.usage.value),"game"in globalThis?traits["-=usage"]=null:delete traits.usage}if(itemSource.type!=="backpack")return;const slug=itemSource.system.slug??sluggify(itemSource.name);this.backpacks.has(slug)?itemSource.system.usage.value="wornbackpack":this.heldInTwoHands.has(slug)?itemSource.system.usage.value="held-in-two-hands":this.wornGarment.has(slug)?itemSource.system.usage.value="worngarment":this.wornGloves.has(slug)?itemSource.system.usage.value="worngloves":itemSource.system.usage.value="worn",itemSource.system.stowing=this.stowingContainers.has(slug)}};__name2(_Migration666UsageAndStowingContainers,"Migration666UsageAndStowingContainers"),__publicField(_Migration666UsageAndStowingContainers,"version",.666);let Migration666UsageAndStowingContainers=_Migration666UsageAndStowingContainers;const _Migration667HPSubProperties=class extends MigrationBase{static{__name(this,"_Migration667HPSubProperties")}addRecoveryMultiplier(itemSource,slug){if(!["dream-may","fast-recovery"].includes(slug))return;const rules=itemSource.system.rules;if(!rules.some(rule=>"path"in rule&&rule.path==="system.attributes.hp.recoveryMultiplier")){const element={key:"ActiveEffectLike",mode:"add",path:"system.attributes.hp.recoveryMultiplier",value:1};rules.push(element)}}addNegativeHealing(itemSource,slug){if(!["dhampir","negative-healing"].includes(slug))return;const rules=itemSource.system.rules;if(!rules.some(rule=>"path"in rule&&rule.path==="system.attributes.hp.negativeHealing")){const element={key:"ActiveEffectLike",mode:"override",path:"system.attributes.hp.negativeHealing",value:!0};rules.push(element)}}async updateItem(itemSource){if(itemSource.type!=="feat"&&itemSource.type!=="action")return;const slug=itemSource.system.slug??sluggify(itemSource.name);this.addRecoveryMultiplier(itemSource,slug),this.addNegativeHealing(itemSource,slug)}};__name2(_Migration667HPSubProperties,"Migration667HPSubProperties"),__publicField(_Migration667HPSubProperties,"version",.667);let Migration667HPSubProperties=_Migration667HPSubProperties;const _Migration668ArmorSpeedPenalty=class extends MigrationBase{static{__name(this,"_Migration668ArmorSpeedPenalty")}async updateItem(itemSource){const slug=itemSource.system.slug??sluggify(itemSource.name);if(itemSource.type==="armor"){const rules=itemSource.system.rules??=[],rule=rules.find(r=>typeof r.key=="string"&&r.key.endsWith("FlatModifier")&&r.selector==="speed"&&typeof r.value=="object"&&JSON.stringify(r.predicate??null)===JSON.stringify({not:["unburdened-iron"]}));rule&&rules.splice(rules.indexOf(rule),1)}else if(itemSource.type==="feat"){if(slug==="unburdened-iron"){const rule={key:"RollOption",domain:"speed",option:"armor:ignore-speed-penalty"};itemSource.system.rules=[rule]}else if(slug==="armored-stealth"){const rule={key:"RollOption",domain:"stealth",option:"armor:ignore-noisy-penalty"};itemSource.system.rules=[rule]}}}};__name2(_Migration668ArmorSpeedPenalty,"Migration668ArmorSpeedPenalty"),__publicField(_Migration668ArmorSpeedPenalty,"version",.668);let Migration668ArmorSpeedPenalty=_Migration668ArmorSpeedPenalty;const _Migration669NPCAttackEffects=class extends MigrationBase{static{__name(this,"_Migration669NPCAttackEffects")}async updateItem(item,actor){!actor||item.type!=="melee"||(item.system.attackEffects??={value:[]},Array.isArray(item.system.attackEffects.value)&&item.system.attackEffects.value.forEach((entry,index,arr)=>{arr[index]=sluggify(entry)}))}};__name2(_Migration669NPCAttackEffects,"Migration669NPCAttackEffects"),__publicField(_Migration669NPCAttackEffects,"version",.669);let Migration669NPCAttackEffects=_Migration669NPCAttackEffects;const _Migration670AncestryVision=class extends MigrationBase{static{__name(this,"_Migration670AncestryVision")}constructor(){super(...arguments),__privateAdd(this,_setAncestryVision),__publicField(this,"DARKVISION_ID","HHVQDp61ehcpdiU8"),__publicField(this,"LOWLIGHTVISION_ID","DRtaqOHXTRtGRIUT")}async updateActor(source){if(source.type!=="character")return;const ancestry=source.items.find(item=>item.type==="ancestry");if(ancestry){__privateMethod(this,_setAncestryVision,setAncestryVision_fn).call(this,ancestry);for(const vision of["darkvision","low-light-vision"]){const index=source.items.findIndex(item=>item.type==="feat"&&(item.system.slug??sluggify(item.name))===vision);index!==-1&&source.items.splice(index,1)}}}async updateItem(source,actor){source.type==="ancestry"&&!actor&&__privateMethod(this,_setAncestryVision,setAncestryVision_fn).call(this,source)}};_setAncestryVision=new WeakSet,setAncestryVision_fn=__name2(function(ancestry){const features=ancestry.system.items;for(const[key,value]of Object.entries(features))value?.id===this.LOWLIGHTVISION_ID?("game"in globalThis?features[`-=${key}`]=null:delete features[key],ancestry.system.vision=ancestry.system.vision==="darkvision"?"darkvision":"lowLightVision"):value?.id===this.DARKVISION_ID&&("game"in globalThis?features[`-=${key}`]=null:delete features[key],ancestry.system.vision="darkvision");ancestry.system.vision??="normal"},"#setAncestryVision"),__name2(_Migration670AncestryVision,"Migration670AncestryVision"),__publicField(_Migration670AncestryVision,"version",.67);let Migration670AncestryVision=_Migration670AncestryVision;const _Migration670NoCustomTrait=class extends MigrationBase{static{__name(this,"_Migration670NoCustomTrait")}async updateItem(itemSource){const traits=itemSource.system.traits;traits&&(Array.isArray(traits.value)?traits.value=traits.value.filter(trait=>trait&&trait!=="custom"):traits.value=[])}};__name2(_Migration670NoCustomTrait,"Migration670NoCustomTrait"),__publicField(_Migration670NoCustomTrait,"version",.67);let Migration670NoCustomTrait=_Migration670NoCustomTrait;const _Migration671NoPCItemsOnNonPCs=class extends MigrationBase{static{__name(this,"_Migration671NoPCItemsOnNonPCs")}async updateActor(actorSource){if(actorSource.type==="character")return;const pcOnlyTypes=["ancestry","background","class","feat"],forbiddenItems=actorSource.items.filter(item=>pcOnlyTypes.includes(item.type));for(const forbiddenItem of forbiddenItems){const index=actorSource.items.findIndex(item=>item===forbiddenItem);index!==-1&&actorSource.items.splice(index,1)}}};__name2(_Migration671NoPCItemsOnNonPCs,"Migration671NoPCItemsOnNonPCs"),__publicField(_Migration671NoPCItemsOnNonPCs,"version",.671);let Migration671NoPCItemsOnNonPCs=_Migration671NoPCItemsOnNonPCs;const PHYSICAL_DAMAGE_TYPES=["bludgeoning","piercing","slashing","bleed"],LIFE_ENERGY_DAMAGE_TYPES=["vitality","void"],ENERGY_DAMAGE_TYPES=["acid","cold","electricity","fire","sonic","force",...LIFE_ENERGY_DAMAGE_TYPES],ALIGNMENT_DAMAGE_TYPES=["chaotic","lawful","good","evil"],DAMAGE_CATEGORIES_UNIQUE=new Set(["persistent","precision","splash"]),MATERIAL_DAMAGE_EFFECTS=new Set(["adamantine","cold-iron","darkwood","mithral","orichalcum","silver","sisterstone-dusk","sisterstone-scarlet","warpglass"]);[...DAMAGE_CATEGORIES_UNIQUE,...MATERIAL_DAMAGE_EFFECTS];const DAMAGE_DIE_FACES_TUPLE=["d4","d6","d8","d10","d12"],DAMAGE_DIE_FACES=new Set(DAMAGE_DIE_FACES_TUPLE),DAMAGE_TYPES=new Set([...PHYSICAL_DAMAGE_TYPES,...ENERGY_DAMAGE_TYPES,...ALIGNMENT_DAMAGE_TYPES,"mental","poison","spirit","untyped"]),BASE_DAMAGE_TYPES_TO_CATEGORIES={bludgeoning:"physical",piercing:"physical",slashing:"physical",bleed:"physical",acid:"energy",cold:"energy",electricity:"energy",fire:"energy",sonic:"energy",vitality:"energy",void:"energy",force:"energy",chaotic:"alignment",evil:"alignment",good:"alignment",lawful:"alignment",mental:null,poison:null,spirit:null,untyped:null},DAMAGE_TYPE_ICONS={bleed:"droplet",acid:"vial",bludgeoning:"hammer",chaotic:"face-zany",cold:"snowflake",electricity:"bolt",evil:"face-angry-horns",fire:"fire",force:"sparkles",good:"face-smile-halo",lawful:"scale-balanced",mental:"brain",piercing:"bow-arrow",poison:"spider",slashing:"axe",sonic:"waveform-lines",spirit:"ghost",vitality:"sun",void:"skull",untyped:null},PERSISTENT_DAMAGE_IMAGES={acid:"icons/magic/acid/dissolve-arm-flesh.webp",bludgeoning:"systems/pf2e/icons/equipment/weapons/bola.webp",chaotic:"systems/pf2e/icons/spells/dinosaur-form.webp",cold:"icons/magic/water/ice-snowman.webp",electricity:"systems/pf2e/icons/spells/chain-lightning.webp",evil:"icons/magic/unholy/strike-body-explode-disintegrate.webp",fire:"icons/magic/fire/flame-burning-creature-skeleton.webp",force:"systems/pf2e/icons/spells/magic-missile.webp",good:"systems/pf2e/icons/damage/persistent/good.webp",lawful:"systems/pf2e/icons/equipment/adventuring-gear/merchant-scale.webp",mental:"systems/pf2e/icons/spells/modify-memory.webp",piercing:"systems/pf2e/icons/equipment/weapons/throwing-knife.webp",poison:"systems/pf2e/icons/spells/acidic-burst.webp",slashing:"systems/pf2e/icons/equipment/weapons/scimitar.webp",sonic:"systems/pf2e/icons/spells/cry-of-destruction.webp",spirit:"icons/magic/unholy/hand-claw-fire-blue.webp",vitality:"systems/pf2e/icons/spells/moment-of-renewal.webp",void:"systems/pf2e/icons/spells/grim-tendrils.webp"},CRITICAL_INCLUSION={DOUBLE_ON_CRIT:null,CRITICAL_ONLY:!0,DONT_DOUBLE_ON_CRIT:!1},_MystifiedTraits=class{static{__name(this,"_MystifiedTraits")}static compile(){this.mystifiedTraits=new Set(["artifact","extradimensional","invested","shadow",...Object.keys(CONFIG.PF2E.consumableTraits).filter(t=>!["consumable","nonlethal"].includes(t))].sort())}static has(trait){return this.mystifiedTraits.has(trait)}};__name2(_MystifiedTraits,"MystifiedTraits"),__publicField(_MystifiedTraits,"mystifiedTraits",new Set);let MystifiedTraits=_MystifiedTraits;const ITEM_CARRY_TYPES=new Set(["held","worn","stowed","dropped"]),RANGE_TRAITS=["range-5","range-10","range-15","range-20","range-25","range-30","range-40","range-50","range-60","range-70","range-80","range-90","range-100","range-110","range-120","range-140","range-150","range-160","range-170","range-180","range-190","range-200","range-210","range-220","range-230","range-240","range-250","range-260","range-270","range-280","range-290","range-300","range-310","range-320","range-500","range-increment-5","range-increment-10","range-increment-15","range-increment-20","range-increment-25","range-increment-30","range-increment-40","range-increment-50","range-increment-60","range-increment-70","range-increment-75","range-increment-80","range-increment-90","range-increment-100","range-increment-110","range-increment-120","range-increment-130","range-increment-140","range-increment-150","range-increment-160","range-increment-170","range-increment-180","range-increment-190","range-increment-200","range-increment-210","range-increment-220","range-increment-230","range-increment-240","range-increment-250","range-increment-260","range-increment-270","range-increment-280","range-increment-290","range-increment-300","range-increment-310","range-increment-320"],ancestryTraits={"half-elf":"PF2E.TraitHalfElf","half-orc":"PF2E.TraitHalfOrc",aasimar:"PF2E.TraitAasimar",aberration:"PF2E.TraitAberration",anadi:"PF2E.TraitAnadi",android:"PF2E.TraitAndroid",aphorite:"PF2E.TraitAphorite",ardande:"PF2E.TraitArdande",automaton:"PF2E.TraitAutomaton",azarketi:"PF2E.TraitAzarketi",beastkin:"PF2E.TraitBeastkin",catfolk:"PF2E.TraitCatfolk",changeling:"PF2E.TraitChangeling",conrasu:"PF2E.TraitConrasu",dhampir:"PF2E.TraitDhampir",duskwalker:"PF2E.TraitDuskwalker",dwarf:"PF2E.TraitDwarf",elf:"PF2E.TraitElf",fetchling:"PF2E.TraitFetchling",fleshwarp:"PF2E.TraitFleshwarp",ganzi:"PF2E.TraitGanzi",geniekin:"PF2E.TraitGeniekin",ghoran:"PF2E.TraitGhoran",gnoll:"PF2E.TraitGnoll",gnome:"PF2E.TraitGnome",goblin:"PF2E.TraitGoblin",goloma:"PF2E.TraitGoloma",grippli:"PF2E.TraitGrippli",halfling:"PF2E.TraitHalfling",hobgoblin:"PF2E.TraitHobgoblin",human:"PF2E.TraitHuman",ifrit:"PF2E.TraitIfrit",kashrishi:"PF2E.TraitKashrishi",kitsune:"PF2E.TraitKitsune",kobold:"PF2E.TraitKobold",leshy:"PF2E.TraitLeshy",lizardfolk:"PF2E.TraitLizardfolk",nagaji:"PF2E.TraitNagaji",orc:"PF2E.TraitOrc",oread:"PF2E.TraitOread",poppet:"PF2E.TraitPoppet",ratfolk:"PF2E.TraitRatfolk",reflection:"PF2E.TraitReflection",shisk:"PF2E.TraitShisk",shoony:"PF2E.TraitShoony",skeleton:"PF2E.TraitSkeleton",sprite:"PF2E.TraitSprite",strix:"PF2E.TraitStrix",suli:"PF2E.TraitSuli",sylph:"PF2E.TraitSylph",talos:"PF2E.TraitTalos",tengu:"PF2E.TraitTengu",tiefling:"PF2E.TraitTiefling",undine:"PF2E.TraitUndine",vanara:"PF2E.TraitVanara",vishkanya:"PF2E.TraitVishkanya"},ancestryItemTraits={...ancestryTraits,aeon:"PF2E.TraitAeon",amphibious:"PF2E.TraitAmphibious",automaton:"PF2E.TraitAutomaton",construct:"PF2E.TraitConstruct",fey:"PF2E.TraitFey",fungus:"PF2E.TraitFungus",humanoid:"PF2E.TraitHumanoid",plant:"PF2E.TraitPlant",undead:"PF2E.TraitUndead"},elementTraits={air:"PF2E.TraitAir",earth:"PF2E.TraitEarth",fire:"PF2E.TraitFire",metal:"PF2E.TraitMetal",water:"PF2E.TraitWater",wood:"PF2E.TraitWood"},energyDamageTypes={acid:"PF2E.TraitAcid",cold:"PF2E.TraitCold",electricity:"PF2E.TraitElectricity",fire:"PF2E.TraitFire",force:"PF2E.TraitForce",sonic:"PF2E.TraitSonic",vitality:"PF2E.TraitVitality",void:"PF2E.TraitVoid"},magicTraditions={arcane:"PF2E.TraitArcane",divine:"PF2E.TraitDivine",occult:"PF2E.TraitOccult",primal:"PF2E.TraitPrimal"},creatureTraits={...ancestryItemTraits,...elementTraits,...energyDamageTypes,...magicTraditions,aberration:"PF2E.TraitAberration",aeon:"PF2E.TraitAeon",aesir:"PF2E.TraitAesir",agathion:"PF2E.TraitAgathion",alchemical:"PF2E.TraitAlchemical",angel:"PF2E.TraitAngel",animal:"PF2E.TraitAnimal",anugobu:"PF2E.TraitAnugobu",aquatic:"PF2E.TraitAquatic",archon:"PF2E.TraitArchon",astral:"PF2E.TraitAstral",asura:"PF2E.TraitAsura",azata:"PF2E.TraitAzata",beast:"PF2E.TraitBeast",boggard:"PF2E.TraitBoggard",caligni:"PF2E.TraitCaligni",celestial:"PF2E.TraitCelestial","charau-ka":"PF2E.TraitCharauKa",clockwork:"PF2E.TraitClockwork",construct:"PF2E.TraitConstruct",couatl:"PF2E.TraitCouatl",daemon:"PF2E.TraitDaemon",darvakka:"PF2E.TraitDarvakka",demon:"PF2E.TraitDemon",dero:"PF2E.TraitDero",devil:"PF2E.TraitDevil",dinosaur:"PF2E.TraitDinosaur",div:"PF2E.TraitDiv",dragon:"PF2E.TraitDragon",dream:"PF2E.TraitDream",drow:"PF2E.TraitDrow",duergar:"PF2E.TraitDuergar",duskwalker:"PF2E.TraitDuskwalker",eidolon:"PF2E.TraitEidolon",elemental:"PF2E.TraitElemental",ethereal:"PF2E.TraitEthereal",evocation:"PF2E.TraitEvocation",fiend:"PF2E.TraitFiend",formian:"PF2E.TraitFormian",fungus:"PF2E.TraitFungus",genie:"PF2E.TraitGenie",ghoran:"PF2E.TraitGhoran",ghost:"PF2E.TraitGhost",ghoul:"PF2E.TraitGhoul",ghul:"PF2E.TraitGhul",giant:"PF2E.TraitGiant",golem:"PF2E.TraitGolem",gremlin:"PF2E.TraitGremlin",grioth:"PF2E.TraitGrioth",grippli:"PF2E.TraitGrippli",hag:"PF2E.TraitHag",hantu:"PF2E.TraitHantu",herald:"PF2E.TraitHerald",hryngar:"PF2E.TraitHryngar",humanoid:"PF2E.TraitHumanoid",ifrit:"PF2E.TraitIfrit",ikeshti:"PF2E.TraitIkeshti",illusion:"PF2E.TraitIllusion",incorporeal:"PF2E.TraitIncorporeal",inevitable:"PF2E.TraitInevitable",kami:"PF2E.TraitKami",kovintus:"PF2E.TraitKovintus",light:"PF2E.TraitLight",lilu:"PF2E.TraitLilu",locathah:"PF2E.TraitLocathah",mental:"PF2E.TraitMental",merfolk:"PF2E.TraitMerfolk",mindless:"PF2E.TraitMindless",minion:"PF2E.TraitMinion",monitor:"PF2E.TraitMonitor",morlock:"PF2E.TraitMorlock",mortic:"PF2E.TraitMortic",mummy:"PF2E.TraitMummy",munavri:"PF2E.TraitMunavri",mutant:"PF2E.TraitMutant",nagaji:"PF2E.TraitNagaji",necromancy:"PF2E.TraitNecromancy",nindoru:"PF2E.TraitNindoru",nymph:"PF2E.TraitNymph",oni:"PF2E.TraitOni",ooze:"PF2E.TraitOoze",orc:"PF2E.TraitOrc",oread:"PF2E.TraitOread",paaridar:"PF2E.TraitPaaridar",petitioner:"PF2E.TraitPetitioner",phantom:"PF2E.TraitPhantom",poison:"PF2E.TraitPoison",protean:"PF2E.TraitProtean",psychopomp:"PF2E.TraitPsychopomp",qlippoth:"PF2E.TraitQlippoth",rakshasa:"PF2E.TraitRakshasa",reflection:"PF2E.TraitReflection",sahkil:"PF2E.TraitSahkil",samsaran:"PF2E.TraitSamsaran","sea-devil":"PF2E.TraitSeaDevil",serpentfolk:"PF2E.TraitSerpentfolk",seugathi:"PF2E.TraitSeugathi",shabti:"PF2E.TraitShabti",shadow:"PF2E.TraitShadow",shobhad:"PF2E.TraitShobhad",siktempora:"PF2E.TraitSiktempora",skeleton:"PF2E.TraitSkeleton",skelm:"PF2E.TraitSkelm",skulk:"PF2E.TraitSkulk",soulbound:"PF2E.TraitSoulbound",spirit:"PF2E.TraitSpirit",sporeborn:"PF2E.TraitSporeborn",spriggan:"PF2E.TraitSpriggan",stheno:"PF2E.TraitStheno",summoned:"PF2E.TraitSummoned",swarm:"PF2E.TraitSwarm",sylph:"PF2E.TraitSylph",tane:"PF2E.TraitTane",tanggal:"PF2E.TraitTanggal",tengu:"PF2E.TraitTengu",time:"PF2E.TraitTime",titan:"PF2E.TraitTitan",troll:"PF2E.TraitTroll",troop:"PF2E.TraitTroop",undead:"PF2E.TraitUndead",undine:"PF2E.TraitUndine",urdefhan:"PF2E.TraitUrdefhan",vampire:"PF2E.TraitVampire",vanara:"PF2E.TraitVanara",velstrac:"PF2E.TraitVelstrac",vishkanya:"PF2E.TraitVishkanya",wayang:"PF2E.TraitWayang",werecreature:"PF2E.TraitWerecreature",wight:"PF2E.TraitWight","wild-hunt":"PF2E.TraitWildHunt",wraith:"PF2E.TraitWraith",wyrwood:"PF2E.TraitWyrwood",xulgath:"PF2E.TraitXulgath",zombie:"PF2E.TraitZombie"},backgroundTraits={"pervasive-magic":"PF2E.TraitPervasiveMagic"},classTraits={alchemist:"PF2E.TraitAlchemist",barbarian:"PF2E.TraitBarbarian",bard:"PF2E.TraitBard",champion:"PF2E.TraitChampion",cleric:"PF2E.TraitCleric",druid:"PF2E.TraitDruid",fighter:"PF2E.TraitFighter",gunslinger:"PF2E.TraitGunslinger",inventor:"PF2E.TraitInventor",investigator:"PF2E.TraitInvestigator",kineticist:"PF2E.TraitKineticist",magus:"PF2E.TraitMagus",monk:"PF2E.TraitMonk",oracle:"PF2E.TraitOracle",psychic:"PF2E.TraitPsychic",ranger:"PF2E.TraitRanger",rogue:"PF2E.TraitRogue",sorcerer:"PF2E.TraitSorcerer",summoner:"PF2E.TraitSummoner",swashbuckler:"PF2E.TraitSwashbuckler",thaumaturge:"PF2E.TraitThaumaturge",witch:"PF2E.TraitWitch",wizard:"PF2E.TraitWizard"},alignmentTraits={chaotic:"PF2E.TraitChaotic",evil:"PF2E.TraitEvil",good:"PF2E.TraitGood",lawful:"PF2E.TraitLawful"},damageTraits={...alignmentTraits,...elementTraits,...energyDamageTypes,light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",mental:"PF2E.TraitMental",nonlethal:"PF2E.TraitNonlethal",plant:"PF2E.TraitPlant",radiation:"PF2E.TraitRadiation",vitality:"PF2E.TraitVitality",void:"PF2E.TraitVoid"},magicSchools={abjuration:"PF2E.TraitAbjuration",conjuration:"PF2E.TraitConjuration",divination:"PF2E.TraitDivination",enchantment:"PF2E.TraitEnchantment",evocation:"PF2E.TraitEvocation",illusion:"PF2E.TraitIllusion",necromancy:"PF2E.TraitNecromancy",transmutation:"PF2E.TraitTransmutation"},spellTraits={...alignmentTraits,...classTraits,...damageTraits,...elementTraits,...magicSchools,...magicTraditions,amp:"PF2E.TraitAmp",attack:"PF2E.TraitAttack",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",beast:"PF2E.TraitBeast",cantrip:"PF2E.TraitCantrip",composition:"PF2E.TraitComposition",concentrate:"PF2E.TraitConcentrate",consecration:"PF2E.TraitConsecration",contingency:"PF2E.TraitContingency",curse:"PF2E.TraitCurse",cursebound:"PF2E.TraitCursebound",darkness:"PF2E.TraitDarkness",death:"PF2E.TraitDeath",detection:"PF2E.TraitDetection",disease:"PF2E.TraitDisease",dream:"PF2E.TraitDream",eidolon:"PF2E.TraitEidolon",emotion:"PF2E.TraitEmotion",extradimensional:"PF2E.TraitExtradimensional",fear:"PF2E.TraitFear",fortune:"PF2E.TraitFortune",fungus:"PF2E.TraitFungus",healing:"PF2E.TraitHealing",hex:"PF2E.TraitHex",incapacitation:"PF2E.TraitIncapacitation",incarnate:"PF2E.TraitIncarnate",incorporeal:"PF2E.TraitIncorporeal",inhaled:"PF2E.TraitInhaled",light:"PF2E.TraitLight",linguistic:"PF2E.TraitLinguistic",litany:"PF2E.TraitLitany",metamagic:"PF2E.TraitMetamagic",mindless:"PF2E.TraitMindless",misfortune:"PF2E.TraitMisfortune",morph:"PF2E.TraitMorph",move:"PF2E.TraitMove",nonlethal:"PF2E.TraitNonlethal",olfactory:"PF2E.TraitOlfactory",plant:"PF2E.TraitPlant",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",possession:"PF2E.TraitPossession",prediction:"PF2E.TraitPrediction",psyche:"PF2E.TraitPsyche",revelation:"PF2E.TraitRevelation",scrying:"PF2E.TraitScrying",shadow:"PF2E.TraitShadow",sleep:"PF2E.TraitSleep",stance:"PF2E.TraitStance",summoned:"PF2E.TraitSummoned",teleportation:"PF2E.TraitTeleportation","true-name":"PF2E.TraitTrueName",visual:"PF2E.TraitVisual"},weaponTraits={...alignmentTraits,...ancestryTraits,...elementTraits,...energyDamageTypes,...magicSchools,...magicTraditions,adjusted:"PF2E.TraitAdjusted",alchemical:"PF2E.TraitAlchemical",agile:"PF2E.TraitAgile",apex:"PF2E.TraitApex",artifact:"PF2E.TraitArtifact",attached:"PF2E.TraitAttached","attached-to-shield":"PF2E.TraitAttachedToShield","attached-to-crossbow-or-firearm":"PF2E.TraitAttachedToCrossbowOrFirearm",auditory:"PF2E.TraitAuditory",backstabber:"PF2E.TraitBackstabber",backswing:"PF2E.TraitBackswing",bomb:"PF2E.TraitBomb",brace:"PF2E.TraitBrace",brutal:"PF2E.TraitBrutal","capacity-2":"PF2E.TraitCapacity2","capacity-3":"PF2E.TraitCapacity3","capacity-4":"PF2E.TraitCapacity4","capacity-5":"PF2E.TraitCapacity5",climbing:"PF2E.TraitClimbing",clockwork:"PF2E.TraitClockwork",cobbled:"PF2E.TraitCobbled",combination:"PF2E.TraitCombination",concealable:"PF2E.TraitConcealable",concussive:"PF2E.TraitConcussive",consumable:"PF2E.TraitConsumable","critical-fusion":"PF2E.TraitCriticalFusion",cursed:"PF2E.TraitCursed","deadly-d4":"PF2E.TraitDeadlyD4","deadly-d6":"PF2E.TraitDeadlyD6","deadly-d8":"PF2E.TraitDeadlyD8","deadly-d10":"PF2E.TraitDeadlyD10","deadly-d12":"PF2E.TraitDeadlyD12",death:"PF2E.TraitDeath",disarm:"PF2E.TraitDisarm",disease:"PF2E.TraitDisease","double-barrel":"PF2E.TraitDoubleBarrel",emotion:"PF2E.TraitEmotion",extradimensional:"PF2E.TraitExtradimensional","fatal-aim-d10":"PF2E.TraitFatalAimD10","fatal-aim-d12":"PF2E.TraitFatalAimD12","fatal-d8":"PF2E.TraitFatalD8","fatal-d10":"PF2E.TraitFatalD10","fatal-d12":"PF2E.TraitFatalD12",fear:"PF2E.TraitFear",finesse:"PF2E.TraitFinesse",forceful:"PF2E.TraitForceful",fortune:"PF2E.TraitFortune","free-hand":"PF2E.TraitFreeHand",fungus:"PF2E.TraitFungus",grapple:"PF2E.TraitGrapple",hampering:"PF2E.TraitHampering",healing:"PF2E.TraitHealing",infused:"PF2E.TraitInfused",inhaled:"PF2E.TraitInhaled",injection:"PF2E.TraitInjection",intelligent:"PF2E.TraitIntelligent",invested:"PF2E.TraitInvested","jousting-d6":"PF2E.TraitJoustingD6",kickback:"PF2E.TraitKickback",light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",mental:"PF2E.TraitMental",modular:"PF2E.TraitModular",monk:"PF2E.TraitMonk",nonlethal:"PF2E.TraitNonlethal",olfactory:"PF2E.TraitOlfactory",parry:"PF2E.TraitParry",plant:"PF2E.TraitPlant",poison:"PF2E.TraitPoison",propulsive:"PF2E.TraitPropulsive","ranged-trip":"PF2E.TraitRangedTrip",razing:"PF2E.TraitRazing",reach:"PF2E.TraitReach",recovery:"PF2E.TraitRecovery",relic:"PF2E.TraitRelic",repeating:"PF2E.TraitRepeating",resonant:"PF2E.TraitResonant",saggorak:"PF2E.TraitSaggorak","scatter-5":"PF2E.TraitScatter5","scatter-10":"PF2E.TraitScatter10","scatter-15":"PF2E.TraitScatter15","scatter-20":"PF2E.TraitScatter20",scrying:"PF2E.TraitScrying",shadow:"PF2E.TraitShadow",shove:"PF2E.TraitShove",splash:"PF2E.TraitSplash",staff:"PF2E.TraitStaff",sweep:"PF2E.TraitSweep",tech:"PF2E.TraitTech",teleportation:"PF2E.TraitTeleportation",tethered:"PF2E.TraitTethered",thrown:"PF2E.TraitThrown","thrown-10":"PF2E.TraitThrown10","thrown-15":"PF2E.TraitThrown15","thrown-20":"PF2E.TraitThrown20","thrown-30":"PF2E.TraitThrown30","thrown-40":"PF2E.TraitThrown40","thrown-60":"PF2E.TraitThrown60","thrown-80":"PF2E.TraitThrown80","thrown-100":"PF2E.TraitThrown100","thrown-200":"PF2E.TraitThrown200",training:"PF2E.TraitTraining",trip:"PF2E.TraitTrip",twin:"PF2E.TraitTwin","two-hand-d6":"PF2E.TraitTwoHandD6","two-hand-d8":"PF2E.TraitTwoHandD8","two-hand-d10":"PF2E.TraitTwoHandD10","two-hand-d12":"PF2E.TraitTwoHandD12",unarmed:"PF2E.TraitUnarmed",vehicular:"PF2E.TraitVehicular","versatile-acid":"PF2E.TraitVersatileAcid","versatile-b":"PF2E.TraitVersatileB","versatile-chaotic":"PF2E.TraitVersatileChaotic","versatile-cold":"PF2E.TraitVersatileCold","versatile-electricity":"PF2E.TraitVersatileElectricity","versatile-evil":"PF2E.TraitVersatileEvil","versatile-fire":"PF2E.TraitVersatileFire","versatile-force":"PF2E.TraitVersatileForce","versatile-good":"PF2E.TraitVersatileGood","versatile-lawful":"PF2E.TraitVersatileLawful","versatile-p":"PF2E.TraitVersatileP","versatile-poison":"PF2E.TraitVersatilePoison","versatile-s":"PF2E.TraitVersatileS","versatile-sonic":"PF2E.TraitVersatileSonic","versatile-vitality":"PF2E.TraitVersatileVitality","versatile-void":"PF2E.TraitVersatileVoid","volley-20":"PF2E.TraitVolley20","volley-30":"PF2E.TraitVolley30","volley-50":"PF2E.TraitVolley50"},preciousMaterials={abysium:"PF2E.PreciousMaterialAbysium",adamantine:"PF2E.PreciousMaterialAdamantine","cold-iron":"PF2E.PreciousMaterialColdIron",darkwood:"PF2E.PreciousMaterialDarkwood",djezet:"PF2E.PreciousMaterialDjezet",dragonhide:"PF2E.PreciousMaterialDragonhide","grisantian-pelt":"PF2E.PreciousMaterialGrisantianPelt",inubrix:"PF2E.PreciousMaterialInubrix","keep-stone":"PF2E.PreciousMaterialKeepStone",mithral:"PF2E.PreciousMaterialMithral",noqual:"PF2E.PreciousMaterialNoqual",orichalcum:"PF2E.PreciousMaterialOrichalcum",peachwood:"PF2E.PreciousMaterialPeachwood",siccatite:"PF2E.PreciousMaterialSiccatite",silver:"PF2E.PreciousMaterialSilver",sisterstone:"PF2E.PreciousMaterialSisterstone","sisterstone-dusk":"PF2E.PreciousMaterialSisterstoneDusk","sisterstone-scarlet":"PF2E.PreciousMaterialSisterstoneScarlet","sovereign-steel":"PF2E.PreciousMaterialSovereignSteel",warpglass:"PF2E.PreciousMaterialWarpglass"},otherArmorTags={shoddy:"PF2E.Item.Physical.OtherTag.Shoddy"},otherConsumableTags={herbal:"PF2E.Item.Physical.OtherTag.Herbal"},otherWeaponTags={crossbow:"PF2E.Weapon.Base.crossbow",improvised:"PF2E.Item.Physical.OtherTag.Improvised",shoddy:"PF2E.Item.Physical.OtherTag.Shoddy"},rangeTraits=mapToObj(RANGE_TRAITS,trait=>[trait,`PF2E.Trait${sluggify(trait,{camel:"bactrian"})}`]),npcAttackTraits={...weaponTraits,...preciousMaterials,...rangeTraits,curse:"PF2E.TraitCurse","deadly-2d8":"PF2E.TraitDeadly2D8","deadly-3d8":"PF2E.TraitDeadly3D8","deadly-4d8":"PF2E.TraitDeadly4D8","deadly-2d10":"PF2E.TraitDeadly2D10","deadly-3d10":"PF2E.TraitDeadly3D10","deadly-4d10":"PF2E.TraitDeadly4D10","deadly-2d12":"PF2E.TraitDeadly2D12","deadly-3d12":"PF2E.TraitDeadly3D12","deadly-4d12":"PF2E.TraitDeadly4D12",incorporeal:"PF2E.TraitIncorporeal",radiation:"PF2E.TraitRadiation","reach-0":"PF2E.TraitReach0","reach-10":"PF2E.TraitReach10","reach-15":"PF2E.TraitReach15","reach-20":"PF2E.TraitReach20","reach-25":"PF2E.TraitReach25","reach-30":"PF2E.TraitReach30","reach-40":"PF2E.TraitReach40","reach-50":"PF2E.TraitReach50","reach-60":"PF2E.TraitReach60","reach-100":"PF2E.TraitReach100","reach-120":"PF2E.TraitReach120","reach-200":"PF2E.TraitReach200","reach-1000":"PF2E.TraitReach1000","reload-0":"PF2E.TraitReload0","reload-1":"PF2E.TraitReload1","reload-2":"PF2E.TraitReload2","reload-1-min":"PF2E.TraitReload1Min"},featTraits={...ancestryTraits,...classTraits,...damageTraits,...magicSchools,...magicTraditions,...spellTraits,additive1:"PF2E.TraitAdditive1",additive2:"PF2E.TraitAdditive2",additive3:"PF2E.TraitAdditive3",aftermath:"PF2E.TraitAftermath",alchemical:"PF2E.TraitAlchemical",archetype:"PF2E.TraitArchetype",artifact:"PF2E.TraitArtifact",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",circus:"PF2E.TraitCircus",class:"PF2E.Class",composite:"PF2E.TraitComposite",concentrate:"PF2E.TraitConcentrate",dedication:"PF2E.TraitDedication",detection:"PF2E.TraitDetection",deviant:"PF2E.TraitDeviant",downtime:"PF2E.TraitDowntime",emotion:"PF2E.TraitEmotion",evolution:"PF2E.TraitEvolution",esoterica:"PF2E.TraitEsoterica",exploration:"PF2E.TraitExploration",fear:"PF2E.TraitFear",finisher:"PF2E.TraitFinisher",flourish:"PF2E.TraitFlourish",fortune:"PF2E.TraitFortune",general:"PF2E.TraitGeneral",impulse:"PF2E.TraitImpulse",infusion:"PF2E.TraitInfusion",injury:"PF2E.TraitInjury",lineage:"PF2E.TraitLineage",manipulate:"PF2E.TraitManipulate",metamagic:"PF2E.TraitMetamagic",mindshift:"PF2E.TraitMindshift",modification:"PF2E.TraitModification",move:"PF2E.TraitMove",multiclass:"PF2E.TraitMulticlass",oath:"PF2E.TraitOath",olfactory:"PF2E.TraitOlfactory",open:"PF2E.TraitOpen",overflow:"PF2E.TraitOverflow","pervasive-magic":"PF2E.TraitPervasiveMagic",poison:"PF2E.TraitPoison",press:"PF2E.TraitPress",rage:"PF2E.TraitRage",reckless:"PF2E.TraitReckless",reflection:"PF2E.TraitReflection",secret:"PF2E.TraitSecret",skill:"PF2E.TraitSkill",social:"PF2E.TraitSocial",spellshot:"PF2E.TraitSpellshot",stamina:"PF2E.TraitStamina",stance:"PF2E.TraitStance",tandem:"PF2E.TraitTandem",time:"PF2E.TraitTime","true-name":"PF2E.TraitTrueName",unstable:"PF2E.TraitUnstable",vigilante:"PF2E.TraitVigilante",virulent:"PF2E.TraitVirulent",vitality:"PF2E.TraitVitality",void:"PF2E.TraitVoid"},consumableTraits={...damageTraits,...elementTraits,...magicSchools,...magicTraditions,additive1:"PF2E.TraitAdditive1",additive2:"PF2E.TraitAdditive2",additive3:"PF2E.TraitAdditive3",alchemical:"PF2E.TraitAlchemical",attack:"PF2E.TraitAttack",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura","bottled-breath":"PF2E.TraitBottledBreath",catalyst:"PF2E.TraitCatalyst",clockwork:"PF2E.TraitClockwork",consumable:"PF2E.TraitConsumable",contact:"PF2E.TraitContact",curse:"PF2E.TraitCurse",cursed:"PF2E.TraitCursed",drug:"PF2E.TraitDrug",elixir:"PF2E.TraitElixir",emotion:"PF2E.TraitEmotion",expandable:"PF2E.TraitExpandable",fear:"PF2E.TraitFear",fey:"PF2E.TraitFey",fortune:"PF2E.TraitFortune",fulu:"PF2E.TraitFulu",gadget:"PF2E.TraitGadget",healing:"PF2E.TraitHealing",incapacitation:"PF2E.TraitIncapacitation",infused:"PF2E.TraitInfused",ingested:"PF2E.TraitIngested",inhaled:"PF2E.TraitInhaled",injury:"PF2E.TraitInjury",kobold:"PF2E.TraitKobold",light:"PF2E.TraitLight",linguistic:"PF2E.TraitLinguistic",lozenge:"PF2E.TraitLozenge",magical:"PF2E.TraitMagical",mechanical:"PF2E.TraitMechanical",misfortune:"PF2E.TraitMisfortune",missive:"PF2E.TraitMissive",morph:"PF2E.TraitMorph",mutagen:"PF2E.TraitMutagen",oil:"PF2E.TraitOil",olfactory:"PF2E.TraitOlfactory",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",possession:"PF2E.TraitPossession",potion:"PF2E.TraitPotion",precious:"PF2E.TraitPrecious",processed:"PF2E.TraitProcessed",scroll:"PF2E.TraitScroll",scrying:"PF2E.TraitScrying",sleep:"PF2E.TraitSleep",snare:"PF2E.TraitSnare",spellgun:"PF2E.TraitSpellgun",splash:"PF2E.TraitSplash",structure:"PF2E.TraitStructure",talisman:"PF2E.TraitTalisman",tea:"PF2E.TraitTea",teleportation:"PF2E.TraitTeleportation",trap:"PF2E.TraitTrap",virulent:"PF2E.TraitVirulent",visual:"PF2E.TraitVisual",wand:"PF2E.TraitWand"},actionTraits={...featTraits,...consumableTraits,...spellTraits,...pick$1(weaponTraits,["agile","propulsive","backswing","forceful","reach","sweep","thrown","volley-20","volley-30","volley-50"]),summon:"PF2E.TraitSummon"},hazardTraits={...damageTraits,...magicSchools,...magicTraditions,aberration:"PF2E.TraitAberration",alchemical:"PF2E.TraitAlchemical",animal:"PF2E.TraitAnimal",aquatic:"PF2E.TraitAquatic",auditory:"PF2E.TraitAuditory",beast:"PF2E.TraitBeast",clockwork:"PF2E.TraitClockwork",consumable:"PF2E.TraitConsumable",curse:"PF2E.TraitCurse",environmental:"PF2E.TraitEnvironmental",fungus:"PF2E.TraitFungus",haunt:"PF2E.TraitHaunt",inhaled:"PF2E.TraitInhaled",kaiju:"PF2E.TraitKaiju",magical:"PF2E.TraitMagical",mechanical:"PF2E.TraitMechanical",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",shadow:"PF2E.TraitShadow",steam:"PF2E.TraitSteam",summoned:"PF2E.TraitSummoned",technological:"PF2E.TraitTechnological",teleportation:"PF2E.TraitTeleportation",trap:"PF2E.TraitTrap",virulent:"PF2E.TraitVirulent",visual:"PF2E.TraitVisual"},vehicleTraits={...magicSchools,artifact:"PF2E.TraitArtifact",clockwork:"PF2E.TraitClockwork",magical:"PF2E.TraitMagical",teleportation:"PF2E.TraitTeleportation"},equipmentTraits={...alignmentTraits,...ancestryTraits,...elementTraits,...energyDamageTypes,...magicSchools,...magicTraditions,additive0:"PF2E.TraitAdditive0",additive1:"PF2E.TraitAdditive1",adjusted:"PF2E.TraitAdjusted",adjustment:"PF2E.TraitAdjustment",alchemical:"PF2E.TraitAlchemical",apex:"PF2E.TraitApex",artifact:"PF2E.TraitArtifact",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",barding:"PF2E.TraitBarding",censer:"PF2E.TraitCenser",clockwork:"PF2E.TraitClockwork",coda:"PF2E.TraitCoda",companion:"PF2E.TraitCompanion",contract:"PF2E.TraitContract",consecration:"PF2E.TraitConsecration",cursed:"PF2E.TraitCursed",darkness:"PF2E.TraitDarkness",death:"PF2E.TraitDeath",detection:"PF2E.TraitDetection",eidolon:"PF2E.TraitEidolon",emotion:"PF2E.TraitEmotion",expandable:"PF2E.TraitExpandable",extradimensional:"PF2E.TraitExtradimensional",fear:"PF2E.TraitFear",figurehead:"PF2E.TraitFigurehead",focused:"PF2E.TraitFocused",fortune:"PF2E.TraitFortune",fulu:"PF2E.TraitFulu",gadget:"PF2E.TraitGadget",grimoire:"PF2E.TraitGrimoire","harrow-court":"PF2E.TraitHarrowCourt",healing:"PF2E.TraitHealing",incapacitation:"PF2E.TraitIncapacitation",incorporeal:"PF2E.TraitIncorporeal",infused:"PF2E.TraitInfused",intelligent:"PF2E.TraitIntelligent",invested:"PF2E.TraitInvested",light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",mechanical:"PF2E.TraitMechanical",mental:"PF2E.TraitMental",misfortune:"PF2E.TraitMisfortune",morph:"PF2E.TraitMorph",mounted:"PF2E.TraitMounted",nonlethal:"PF2E.TraitNonlethal",plant:"PF2E.TraitPlant",poison:"PF2E.TraitPoison",polymorph:"PF2E.TraitPolymorph",portable:"PF2E.TraitPortable",precious:"PF2E.TraitPrecious",prediction:"PF2E.TraitPrediction",relic:"PF2E.TraitRelic",revelation:"PF2E.TraitRevelation",saggorak:"PF2E.TraitSaggorak",scrying:"PF2E.TraitScrying",shadow:"PF2E.TraitShadow",sleep:"PF2E.TraitSleep",spellgun:"PF2E.TraitSpellgun",spellheart:"PF2E.TraitSpellheart",staff:"PF2E.TraitStaff",steam:"PF2E.TraitSteam",structure:"PF2E.TraitStructure",tattoo:"PF2E.TraitTattoo",teleportation:"PF2E.TraitTeleportation",visual:"PF2E.TraitVisual",wand:"PF2E.TraitWand"},shieldTraits={"deflecting-bludgeoning":"PF2E.TraitDeflectingBludgeoning","deflecting-physical-ranged":"PF2E.TraitDeflectingPhysicalRanged","deflecting-piercing":"PF2E.TraitDeflectingPiercing","deflecting-slashing":"PF2E.TraitDeflectingSlashing",foldaway:"PF2E.TraitFoldaway",harnessed:"PF2E.TraitHarnessed","hefty-14":"PF2E.TraitHefty14",inscribed:"PF2E.TraitInscribed","integrated-1d6-b":"PF2E.TraitIntegrated1d6B","integrated-1d6-p":"PF2E.TraitIntegrated1d6P","integrated-1d6-s":"PF2E.TraitIntegrated1d6S","integrated-1d6-s-versatile-p":"PF2E.TraitIntegrated1d6SVersatileP","launching-dart":"PF2E.TraitLaunching","shield-throw-20":"PF2E.TraitShieldThrow20","shield-throw-30":"PF2E.TraitShieldThrow30"},armorTraits={...alignmentTraits,...elementTraits,...magicSchools,...magicTraditions,...shieldTraits,adjusted:"PF2E.TraitAdjusted",alchemical:"PF2E.TraitAlchemical",apex:"PF2E.TraitApex",aquadynamic:"PF2E.TraitAquadynamic",artifact:"PF2E.TraitArtifact",auditory:"PF2E.TraitAuditory",aura:"PF2E.TraitAura",barding:"PF2E.TraitBarding",bulwark:"PF2E.TraitBulwark",clockwork:"PF2E.TraitClockwork",comfort:"PF2E.TraitComfort",companion:"PF2E.TraitCompanion",cursed:"PF2E.TraitCursed","entrench-melee":"PF2E.TraitEntrenchMelee","entrench-ranged":"PF2E.TraitEntrenchRanged",extradimensional:"PF2E.TraitExtradimensional",focused:"PF2E.TraitFocused",force:"PF2E.TraitForce",flexible:"PF2E.TraitFlexible",healing:"PF2E.TraitHealing",hindering:"PF2E.TraitHindering",inscribed:"PF2E.TraitInscribed",intelligent:"PF2E.TraitIntelligent",invested:"PF2E.TraitInvested",laminar:"PF2E.TraitLaminar",light:"PF2E.TraitLight",magical:"PF2E.TraitMagical",noisy:"PF2E.TraitNoisy",plant:"PF2E.TraitPlant",ponderous:"PF2E.TraitPonderous"},rangeDescriptions=mapToObj(RANGE_TRAITS,trait=>[trait,"PF2E.TraitDescriptionRange"]),preciousMaterialDescriptions={abysium:"PF2E.PreciousMaterialAbysiumDescription",adamantine:"PF2E.PreciousMaterialAdamantineDescription","cold-iron":"PF2E.PreciousMaterialColdIronDescription",darkwood:"PF2E.PreciousMaterialDarkwoodDescription",djezet:"PF2E.PreciousMaterialDjezetDescription",dragonhide:"PF2E.PreciousMaterialDragonhideDescription","grisantian-pelt":"PF2E.PreciousMaterialGrisantianPeltDescription",inubrix:"PF2E.PreciousMaterialInubrixDescription",mithral:"PF2E.PreciousMaterialMithralDescription",noqual:"PF2E.PreciousMaterialNoqualDescription",orichalcum:"PF2E.PreciousMaterialOrichalcumDescription",siccatite:"PF2E.PreciousMaterialSiccatiteDescription",silver:"PF2E.PreciousMaterialSilverDescription",sisterstone:"PF2E.PreciousMaterialSisterstoneDescription","sisterstone-dusk":"PF2E.PreciousMaterialSisterstoneDescription","sisterstone-scarlet":"PF2E.PreciousMaterialSisterstoneDescription","sovereign-steel":"PF2E.PreciousMaterialSovereignSteelDescription",warpglass:"PF2E.PreciousMaterialWarpglassDescription"},traitDescriptions={aasimar:"PF2E.TraitDescriptionAasimar",aberration:"PF2E.TraitDescriptionAberration",abjuration:"PF2E.TraitDescriptionAbjuration",acid:"PF2E.TraitDescriptionAcid",additive0:"PF2E.TraitDescriptionAdditive",additive1:"PF2E.TraitDescriptionAdditive",additive2:"PF2E.TraitDescriptionAdditive",additive3:"PF2E.TraitDescriptionAdditive",adjusted:"PF2E.TraitDescriptionAdjusted",adjustment:"PF2E.TraitDescriptionAdjustment",aeon:"PF2E.TraitDescriptionAeon",aesir:"PF2E.TraitDescriptionAesir",aftermath:"PF2E.TraitDescriptionAftermath",agathion:"PF2E.TraitDescriptionAgathion",agile:"PF2E.TraitDescriptionAgile",air:"PF2E.TraitDescriptionAir",alchemical:"PF2E.TraitDescriptionAlchemical",alchemist:"PF2E.TraitDescriptionAlchemist",amphibious:"PF2E.TraitDescriptionAmphibious",anadi:"PF2E.TraitDescriptionAnadi",android:"PF2E.TraitDescriptionAndroid",apex:"PF2E.TraitDescriptionApex",aphorite:"PF2E.TraitDescriptionAphorite",aquadynamic:"PF2E.TraitDescriptionAquadynamic",arcane:"PF2E.TraitDescriptionArcane",archetype:"PF2E.TraitDescriptionArchetype",ardande:"PF2E.TraitDescriptionArdande",artifact:"PF2E.TraitDescriptionArtifact",attached:"PF2E.TraitDescriptionAttached","attached-to-crossbow-or-firearm":"PF2E.TraitDescriptionAttached","attached-to-shield":"PF2E.TraitDescriptionAttached",attack:"PF2E.TraitDescriptionAttack",auditory:"PF2E.TraitDescriptionAuditory",aura:"PF2E.TraitDescriptionAura",automaton:"PF2E.TraitDescriptionAutomaton",azarketi:"PF2E.TraitDescriptionAzarketi",backstabber:"PF2E.TraitDescriptionBackstabber",backswing:"PF2E.TraitDescriptionBackswing",barbarian:"PF2E.TraitDescriptionBarbarian",bard:"PF2E.TraitDescriptionBard",beastkin:"PF2E.TraitDescriptionBeastkin",bomb:"PF2E.TraitDescriptionBomb","bottled-breath":"PF2E.TraitDescriptionBottledBreath",brace:"PF2E.TraitDescriptionBrace",brutal:"PF2E.TraitDescriptionBrutal",bulwark:"PF2E.TraitDescriptionBulwark",cantrip:"PF2E.TraitDescriptionCantrip","capacity-2":"PF2E.TraitDescriptionCapacity","capacity-3":"PF2E.TraitDescriptionCapacity","capacity-4":"PF2E.TraitDescriptionCapacity","capacity-5":"PF2E.TraitDescriptionCapacity",catalyst:"PF2E.TraitDescriptionCatalyst",catfolk:"PF2E.TraitDescriptionCatfolk",censer:"PF2E.TraitDescriptionCenser",champion:"PF2E.TraitDescriptionChampion",changeling:"PF2E.TraitDescriptionChangeling",chaotic:"PF2E.TraitDescriptionChaotic",class:"PF2E.TraitDescriptionClass",cleric:"PF2E.TraitDescriptionCleric",climbing:"PF2E.TraitDescriptionClimbing",clockwork:"PF2E.TraitDescriptionClockwork",cobbled:"PF2E.TraitDescriptionCobbled",coda:"PF2E.TraitDescriptionCoda",cold:"PF2E.TraitDescriptionCold",combination:"PF2E.TraitDescriptionCombination",comfort:"PF2E.TraitDescriptionComfort",common:"PF2E.TraitDescriptionCommon",companion:"PF2E.TraitDescriptionCompanion",complex:"PF2E.TraitDescriptionComplex",composite:"PF2E.TraitDescriptionComposite",composition:"PF2E.TraitDescriptionComposition",concealable:"PF2E.TraitDescriptionConcealable",concentrate:"PF2E.TraitDescriptionConcentrate",concussive:"PF2E.TraitDescriptionConcussive",conjuration:"PF2E.TraitDescriptionConjuration",conrasu:"PF2E.TraitDescriptionConrasu",consecration:"PF2E.TraitDescriptionConsecration",consumable:"PF2E.TraitDescriptionConsumable",contact:"PF2E.TraitDescriptionContact",contingency:"PF2E.TraitDescriptionContingency",contract:"PF2E.TraitDescriptionContract","critical-fusion":"PF2E.TraitDescriptionCriticalFusion",curse:"PF2E.TraitDescriptionCurse",cursebound:"PF2E.TraitDescriptionCursebound",cursed:"PF2E.TraitDescriptionCursed",darkness:"PF2E.TraitDescriptionDarkness",darvakka:"PF2E.TraitDescriptionDarvakka","deadly-2d10":"PF2E.TraitDescriptionDeadly","deadly-2d12":"PF2E.TraitDescriptionDeadly","deadly-2d8":"PF2E.TraitDescriptionDeadly","deadly-3d10":"PF2E.TraitDescriptionDeadly","deadly-3d12":"PF2E.TraitDescriptionDeadly","deadly-3d8":"PF2E.TraitDescriptionDeadly","deadly-4d10":"PF2E.TraitDescriptionDeadly","deadly-4d12":"PF2E.TraitDescriptionDeadly","deadly-4d8":"PF2E.TraitDescriptionDeadly","deadly-d10":"PF2E.TraitDescriptionDeadly","deadly-d12":"PF2E.TraitDescriptionDeadly","deadly-d6":"PF2E.TraitDescriptionDeadly","deadly-d8":"PF2E.TraitDescriptionDeadly","deadly-d4":"PF2E.TraitDescriptionDeadly",death:"PF2E.TraitDescriptionDeath","deflecting-bludgeoning":"PF2E.TraitDescriptionDeflecting","deflecting-physical-ranged":"PF2E.TraitDescriptionDeflecting","deflecting-slashing":"PF2E.TraitDescriptionDeflecting",dedication:"PF2E.TraitDescriptionDedication",detection:"PF2E.TraitDescriptionDetection",deviant:"PF2E.TraitDescriptionDeviant",dhampir:"PF2E.TraitDescriptionDhampir",disarm:"PF2E.TraitDescriptionDisarm",disease:"PF2E.TraitDescriptionDisease",divination:"PF2E.TraitDescriptionDivination",divine:"PF2E.TraitDescriptionDivine","double-barrel":"PF2E.TraitDescriptionDoubleBarrel",downtime:"PF2E.TraitDescriptionDowntime",drug:"PF2E.TraitDescriptionDrug",druid:"PF2E.TraitDescriptionDruid",duskwalker:"PF2E.TraitDescriptionDuskwalker",dwarf:"PF2E.TraitDescriptionDwarf",earth:"PF2E.TraitDescriptionEarth",eidolon:"PF2E.TraitDescriptionEidolon",electricity:"PF2E.TraitDescriptionElectricity",elf:"PF2E.TraitDescriptionElf",elixir:"PF2E.TraitDescriptionElixir",emotion:"PF2E.TraitDescriptionEmotion",enchantment:"PF2E.TraitDescriptionEnchantment","entrench-melee":"PF2E.TraitDescriptionEntrench","entrench-ranged":"PF2E.TraitDescriptionEntrench",environment:"PF2E.TraitDescriptionEnvironment",esoterica:"PF2E.TraitDescriptionEsoterica",evil:"PF2E.TraitDescriptionEvil",evocation:"PF2E.TraitDescriptionEvocation",evolution:"PF2E.TraitDescriptionEvolution",expandable:"PF2E.TraitDescriptionExpandable",exploration:"PF2E.TraitDescriptionExploration",extradimensional:"PF2E.TraitDescriptionExtradimensional","fatal-aim-d10":"PF2E.TraitDescriptionFatalAim","fatal-aim-d12":"PF2E.TraitDescriptionFatalAim","fatal-d10":"PF2E.TraitDescriptionFatal","fatal-d12":"PF2E.TraitDescriptionFatal","fatal-d8":"PF2E.TraitDescriptionFatal",fear:"PF2E.TraitDescriptionFear",fetchling:"PF2E.TraitDescriptionFetchling",fey:"PF2E.TraitDescriptionFey",fighter:"PF2E.TraitDescriptionFighter",figurehead:"PF2E.TraitDescriptionFigurehead",finesse:"PF2E.TraitDescriptionFinesse",finisher:"PF2E.TraitDescriptionFinisher",fire:"PF2E.TraitDescriptionFire",fleshwarp:"PF2E.TraitDescriptionFleshwarp",flexible:"PF2E.TraitDescriptionFlexible",flourish:"PF2E.TraitDescriptionFlourish",focused:"PF2E.TraitDescriptionFocused",foldaway:"PF2E.TraitDescriptionFoldaway",force:"PF2E.TraitDescriptionForce",forceful:"PF2E.TraitDescriptionForceful",fortune:"PF2E.TraitDescriptionFortune","free-hand":"PF2E.TraitDescriptionFreeHand",fulu:"PF2E.TraitDescriptionFulu",fungus:"PF2E.TraitDescriptionFungus",gadget:"PF2E.TraitDescriptionGadget",ganzi:"PF2E.TraitDescriptionGanzi",general:"PF2E.TraitDescriptionGeneral",genie:"PF2E.TraitDescriptionGenie",geniekin:"PF2E.TraitDescriptionGeniekin",ghoran:"PF2E.TraitDescriptionGhoran",ghul:"PF2E.TraitDescriptionGhul",gnoll:"PF2E.TraitDescriptionGnoll",gnome:"PF2E.TraitDescriptionGnome",goblin:"PF2E.TraitDescriptionGoblin",goloma:"PF2E.TraitDescriptionGoloma",good:"PF2E.TraitDescriptionGood",grapple:"PF2E.TraitDescriptionGrapple",grimoire:"PF2E.TraitDescriptionGrimoire",grippli:"PF2E.TraitDescriptionGrippli",gunslinger:"PF2E.TraitDescriptionGunslinger",halfling:"PF2E.TraitDescriptionHalfling","half-elf":"PF2E.TraitDescriptionHalfElf","half-orc":"PF2E.TraitDescriptionHalfOrc","jousting-d6":"PF2E.TraitDescriptionJousting",hampering:"PF2E.TraitDescriptionHampering",harnessed:"PF2E.TraitDescriptionHarnessed",haunt:"PF2E.TraitDescriptionHaunt",healing:"PF2E.TraitDescriptionHealing","hefty-14":"PF2E.TraitDescriptionHefty",hex:"PF2E.TraitDescriptionHex",hindering:"PF2E.TraitDescriptionHindering",hobgoblin:"PF2E.TraitDescriptionHobgoblin",human:"PF2E.TraitDescriptionHuman",humanoid:"PF2E.TraitDescriptionHumanoid",ifrit:"PF2E.TraitDescriptionIfrit",illusion:"PF2E.TraitDescriptionIllusion",impulse:"PF2E.TraitDescriptionImpulse",incapacitation:"PF2E.TraitDescriptionIncapacitation",incarnate:"PF2E.TraitDescriptionIncarnate",incorporeal:"PF2E.TraitDescriptionIncorporeal",infused:"PF2E.TraitDescriptionInfused",infusion:"PF2E.TraitDescriptionInfusion",ingested:"PF2E.TraitDescriptionIngested",inhaled:"PF2E.TraitDescriptionInhaled",injection:"PF2E.TraitDescriptionInjection",injury:"PF2E.TraitDescriptionInjury",inscribed:"PF2E.TraitDescriptionInscribed","integrated-1d6-b":"PF2E.TraitDescriptionIntegrated","integrated-1d6-p":"PF2E.TraitDescriptionIntegrated","integrated-1d6-s":"PF2E.TraitDescriptionIntegrated","integrated-1d6-s-versatile-p":"PF2E.TraitDescriptionIntegrated",intelligent:"PF2E.TraitDescriptionIntelligent",inventor:"PF2E.TraitDescriptionInventor",invested:"PF2E.TraitDescriptionInvested",investigator:"PF2E.TraitDescriptionInvestigator",kashrishi:"PF2E.TraitDescriptionKashrishi","keep-stone":"PF2E.PreciousMaterialKeepStoneDescription",kickback:"PF2E.TraitDescriptionKickback",kineticist:"PF2E.TraitDescriptionKineticist",kitsune:"PF2E.TraitDescriptionKitsune",kobold:"PF2E.TraitDescriptionKobold",laminar:"PF2E.TraitDescriptionLaminar","launching-dart":"PF2E.TraitDescriptionLaunching",lawful:"PF2E.TraitDescriptionLawful",leshy:"PF2E.TraitDescriptionLeshy",light:"PF2E.TraitDescriptionLight",linguistic:"PF2E.TraitDescriptionLinguistic",litany:"PF2E.TraitDescriptionLitany",lizardfolk:"PF2E.TraitDescriptionLizardfolk",lozenge:"PF2E.TraitDescriptionLozenge",magical:"PF2E.TraitDescriptionMagical",magus:"PF2E.TraitDescriptionMagus",manipulate:"PF2E.TraitDescriptionManipulate",mechanical:"PF2E.TraitDescriptionMechanical",mental:"PF2E.TraitDescriptionMental",metal:"PF2E.TraitDescriptionMetal",metamagic:"PF2E.TraitDescriptionMetamagic",mindless:"PF2E.TraitDescriptionMindless",mindshift:"PF2E.TraitDescriptionMindshift",minion:"PF2E.TraitDescriptionMinion",misfortune:"PF2E.TraitDescriptionMisfortune",missive:"PF2E.TraitDescriptionMissive",modification:"PF2E.TraitDescriptionModification",modular:"PF2E.TraitDescriptionModular",monk:"PF2E.TraitDescriptionMonk",morph:"PF2E.TraitDescriptionMorph",mounted:"PF2E.TraitDescriptionMounted",move:"PF2E.TraitDescriptionMove",multiclass:"PF2E.TraitDescriptionMulticlass",mutagen:"PF2E.TraitDescriptionMutagen",nagaji:"PF2E.TraitDescriptionNagaji",necromancy:"PF2E.TraitDescriptionNecromancy",nindoru:"PF2E.TraitDescriptionNindoru",noisy:"PF2E.TraitDescriptionNoisy",nonlethal:"PF2E.TraitDescriptionNonlethal",oath:"PF2E.TraitDescriptionOath",occult:"PF2E.TraitDescriptionOccult",oil:"PF2E.TraitDescriptionOil",olfactory:"PF2E.TraitDescriptionOlfactory",open:"PF2E.TraitDescriptionOpen",oracle:"PF2E.TraitDescriptionOracle",orc:"PF2E.TraitDescriptionOrc",oread:"PF2E.TraitDescriptionOread",overflow:"PF2E.TraitDescriptionOverflow",parry:"PF2E.TraitDescriptionParry",peachwood:"PF2E.PreciousMaterialPeachwoodDescription",plant:"PF2E.TraitDescriptionPlant",poison:"PF2E.TraitDescriptionPoison",polymorph:"PF2E.TraitDescriptionPolymorph",ponderous:"PF2E.TraitDescriptionPonderous",poppet:"PF2E.TraitDescriptionPoppet",portable:"PF2E.TraitDescriptionPortable",possession:"PF2E.TraitDescriptionPossession",potion:"PF2E.TraitDescriptionPotion",precious:"PF2E.TraitDescriptionPrecious",prediction:"PF2E.TraitDescriptionPrediction",press:"PF2E.TraitDescriptionPress",primal:"PF2E.TraitDescriptionPrimal",propulsive:"PF2E.TraitDescriptionPropulsive",psyche:"PF2E.TraitDescriptionPsyche",psychic:"PF2E.TraitDescriptionPsychic",radiation:"PF2E.TraitDescriptionRadiation",rage:"PF2E.TraitDescriptionRage",ranger:"PF2E.TraitDescriptionRanger",...rangeDescriptions,"ranged-trip":"PF2E.TraitDescriptionRangedTrip",rare:"PF2E.TraitDescriptionRare",ratfolk:"PF2E.TraitDescriptionRatfolk",razing:"PF2E.TraitDescriptionRazing",reach:"PF2E.TraitDescriptionReach","reach-0":"PF2E.TraitDescriptionReach","reach-10":"PF2E.TraitDescriptionReach","reach-100":"PF2E.TraitDescriptionReach","reach-120":"PF2E.TraitDescriptionReach","reach-1000":"PF2E.TraitDescriptionReach","reach-15":"PF2E.TraitDescriptionReach","reach-20":"PF2E.TraitDescriptionReach","reach-200":"PF2E.TraitDescriptionReach","reach-25":"PF2E.TraitDescriptionReach","reach-30":"PF2E.TraitDescriptionReach","reach-40":"PF2E.TraitDescriptionReach","reach-50":"PF2E.TraitDescriptionReach","reach-60":"PF2E.TraitDescriptionReach",recovery:"PF2E.TraitDescriptionRecovery",reflection:"PF2E.TraitDescriptionReflection",relic:"PF2E.TraitDescriptionRelic",reload:"PF2E.TraitDescriptionReload","reload-0":"PF2E.TraitDescriptionReload","reload-1":"PF2E.TraitDescriptionReload","reload-1-min":"PF2E.TraitDescriptionReload","reload-2":"PF2E.TraitDescriptionReload",repeating:"PF2E.TraitDescriptionRepeating",resonant:"PF2E.TraitDescriptionResonant",revelation:"PF2E.TraitDescriptionRevelation",rogue:"PF2E.TraitDescriptionRogue",saggorak:"PF2E.TraitDescriptionSaggorak","scatter-10":"PF2E.TraitDescriptionScatter","scatter-15":"PF2E.TraitDescriptionScatter","scatter-20":"PF2E.TraitDescriptionScatter","scatter-5":"PF2E.TraitDescriptionScatter",scroll:"PF2E.TraitDescriptionScroll",scrying:"PF2E.TraitDescriptionScrying",secret:"PF2E.TraitDescriptionSecret",shadow:"PF2E.TraitDescriptionShadow","shield-throw-20":"PF2E.TraitDescriptionShieldThrow","shield-throw-30":"PF2E.TraitDescriptionShieldThrow",shisk:"PF2E.TraitDescriptionShisk",shoony:"PF2E.TraitDescriptionShoony",shove:"PF2E.TraitDescriptionShove",skeleton:"PF2E.TraitDescriptionSkeleton",skill:"PF2E.TraitDescriptionSkill",sleep:"PF2E.TraitDescriptionSleep",snare:"PF2E.TraitDescriptionSnare",social:"PF2E.TraitDescriptionSocial",sonic:"PF2E.TraitDescriptionSonic",sorcerer:"PF2E.TraitDescriptionSorcerer",spellgun:"PF2E.TraitDescriptionSpellgun",spellheart:"PF2E.TraitDescriptionSpellheart",spellshot:"PF2E.TraitNoDescription",splash:"PF2E.TraitDescriptionSplash","splash-10":"PF2E.TraitDescriptionSplash10",sprite:"PF2E.TraitDescriptionSprite",staff:"PF2E.TraitDescriptionStaff",stance:"PF2E.TraitDescriptionStance",steam:"PF2E.TraitDescriptionSteam",strix:"PF2E.TraitDescriptionStrix",structure:"PF2E.TraitDescriptionStructure",suli:"PF2E.TraitDescriptionSuli",summon:"PF2E.TraitDescriptionSummon",summoned:"PF2E.TraitDescriptionSummoned",summoner:"PF2E.TraitDescriptionSummoner",swashbuckler:"PF2E.TraitDescriptionSwashbuckler",sweep:"PF2E.TraitDescriptionSweep",sylph:"PF2E.TraitDescriptionSylph",talisman:"PF2E.TraitDescriptionTalisman",talos:"PF2E.TraitDescriptionTalos",tandem:"PF2E.TraitDescriptionTandem",tattoo:"PF2E.TraitDescriptionTattoo",tea:"PF2E.TraitDescriptionTea",tech:"PF2E.TraitDescriptionTech",telepathy:"PF2E.TraitDescriptionTelepathy",teleportation:"PF2E.TraitDescriptionTeleportation",tengu:"PF2E.TraitDescriptionTengu",tethered:"PF2E.TraitDescriptionTethered",thaumaturge:"PF2E.TraitDescriptionThaumaturge",thrown:"PF2E.TraitDescriptionThrown","thrown-10":"PF2E.TraitDescriptionThrown","thrown-100":"PF2E.TraitDescriptionThrown","thrown-15":"PF2E.TraitDescriptionThrown","thrown-20":"PF2E.TraitDescriptionThrown","thrown-200":"PF2E.TraitDescriptionThrown","thrown-25":"PF2E.TraitDescriptionThrown","thrown-30":"PF2E.TraitDescriptionThrown","thrown-40":"PF2E.TraitDescriptionThrown","thrown-50":"PF2E.TraitDescriptionThrown","thrown-60":"PF2E.TraitDescriptionThrown","thrown-80":"PF2E.TraitDescriptionThrown",tiefling:"PF2E.TraitDescriptionTiefling",time:"PF2E.TraitDescriptionTime",training:"PF2E.TraitDescriptionTraining",transmutation:"PF2E.TraitDescriptionTransmutation",trap:"PF2E.TraitDescriptionTrap",trip:"PF2E.TraitDescriptionTrip","true-name":"PF2E.TraitDescriptionTrueName",twin:"PF2E.TraitDescriptionTwin","two-hand-d10":"PF2E.TraitDescriptionTwoHand","two-hand-d12":"PF2E.TraitDescriptionTwoHand","two-hand-d6":"PF2E.TraitDescriptionTwoHand","two-hand-d8":"PF2E.TraitDescriptionTwoHand",unarmed:"PF2E.TraitDescriptionUnarmed",uncommon:"PF2E.TraitDescriptionUncommon",undine:"PF2E.TraitDescriptionUndine",unique:"PF2E.TraitDescriptionUnique",unstable:"PF2E.TraitDescriptionUnstable",vanara:"PF2E.TraitDescriptionVanara",vishkanya:"PF2E.TraitDescriptionVishkanya",vehicular:"PF2E.TraitDescriptionVehicular","versatile-acid":"PF2E.TraitDescriptionVersatile","versatile-b":"PF2E.TraitDescriptionVersatile","versatile-chaotic":"PF2E.TraitDescriptionVersatile","versatile-cold":"PF2E.TraitDescriptionVersatile","versatile-electricity":"PF2E.TraitDescriptionVersatile","versatile-evil":"PF2E.TraitDescriptionVersatile","versatile-fire":"PF2E.TraitDescriptionVersatile","versatile-force":"PF2E.TraitDescriptionVersatile","versatile-good":"PF2E.TraitDescriptionVersatile","versatile-lawful":"PF2E.TraitDescriptionVersatile","versatile-p":"PF2E.TraitDescriptionVersatile","versatile-poison":"PF2E.TraitDescriptionVersatile","versatile-s":"PF2E.TraitDescriptionVersatile","versatile-sonic":"PF2E.TraitDescriptionVersatile","versatile-vitality":"PF2E.TraitDescriptionVersatile","versatile-void":"PF2E.TraitDescriptionVersatile",virulent:"PF2E.TraitDescriptionVirulent",visual:"PF2E.TraitDescriptionVisual",vitality:"PF2E.TraitDescriptionVitality",void:"PF2E.TraitDescriptionVoid","volley-20":"PF2E.TraitDescriptionVolley","volley-30":"PF2E.TraitDescriptionVolley","volley-50":"PF2E.TraitDescriptionVolley",wand:"PF2E.TraitDescriptionWand",water:"PF2E.TraitDescriptionWater",witch:"PF2E.TraitDescriptionWitch",wizard:"PF2E.TraitDescriptionWizard",wood:"PF2E.TraitDescriptionWood",...preciousMaterialDescriptions},kingmakerTraits={...actionTraits,army:"PF2E.Kingmaker.Trait.army",cavalry:"PF2E.Kingmaker.Trait.cavalry",civic:"PF2E.Kingmaker.Trait.civic",commerce:"PF2E.Kingmaker.Trait.commerce",infantry:"PF2E.Kingmaker.Trait.infantry",kingdom:"PF2E.Kingmaker.Trait.kingdom",leadership:"PF2E.Kingmaker.Trait.leadership",maneuver:"PF2E.Kingmaker.Trait.maneuver",morale:"PF2E.Kingmaker.Trait.morale",region:"PF2E.Kingmaker.Trait.region",siege:"PF2E.Kingmaker.Trait.siege",skirmisher:"PF2E.Kingmaker.Trait.skirmisher",upkeep:"PF2E.Kingmaker.Trait.upkeep"},damageCategoriesUnique={persistent:"PF2E.ConditionTypePersistentShort",precision:"PF2E.Damage.Precision",splash:"PF2E.TraitSplash"},materialDamageEffects=pick$1(preciousMaterials,["abysium","adamantine","cold-iron","darkwood","djezet","inubrix","keep-stone","mithral","noqual","orichalcum","peachwood","siccatite","silver","sisterstone-dusk","sisterstone-scarlet","sovereign-steel","warpglass"]),damageCategories={...damageCategoriesUnique,...materialDamageEffects,alignment:"PF2E.Alignment",energy:"PF2E.TraitEnergy",physical:"PF2E.TraitPhysical"},physicalDamageTypes={bleed:"PF2E.TraitBleed",bludgeoning:"PF2E.TraitBludgeoning",piercing:"PF2E.TraitPiercing",slashing:"PF2E.TraitSlashing"},damageTypes={...alignmentTraits,...energyDamageTypes,...physicalDamageTypes,mental:"PF2E.TraitMental",poison:"PF2E.TraitPoison",spirit:"PF2E.TraitSpirit",untyped:"PF2E.TraitUntyped"},damageRollFlavors=[...DAMAGE_TYPES].reduce((result,key)=>(result[key]=`PF2E.Damage.RollFlavor.${key}`,result),{}),materialIWR=mapValues$1(omit(materialDamageEffects,["keep-stone","peachwood","sisterstone-dusk","sisterstone-scarlet","sovereign-steel","warpglass"]),(_v,k)=>`PF2E.Damage.IWR.Type.${k}`),immunityTypes={...materialIWR,acid:"PF2E.Damage.RollFlavor.acid",air:"PF2E.Damage.RollFlavor.air","area-damage":"PF2E.Damage.IWR.Type.area-damage",auditory:"PF2E.Damage.IWR.Type.auditory",bleed:"PF2E.Damage.RollFlavor.bleed",blinded:"PF2E.Damage.IWR.Type.blinded",bludgeoning:"PF2E.Damage.RollFlavor.bludgeoning",chaotic:"PF2E.Damage.RollFlavor.chaotic",clumsy:"PF2E.Damage.IWR.Type.clumsy",cold:"PF2E.Damage.RollFlavor.cold",confused:"PF2E.Damage.IWR.Type.confused",conjuration:"PF2E.Damage.IWR.Type.conjuration",controlled:"PF2E.Damage.IWR.Type.controlled","critical-hits":"PF2E.Damage.IWR.Type.critical-hits",curse:"PF2E.Damage.IWR.Type.curse",custom:"",darkwood:"PF2E.Damage.IWR.Type.darkwood",dazzled:"PF2E.Damage.IWR.Type.dazzled",deafened:"PF2E.Damage.IWR.Type.deafened","death-effects":"PF2E.Damage.IWR.Type.death-effects",disease:"PF2E.Damage.IWR.Type.disease",doomed:"PF2E.Damage.IWR.Type.doomed",drained:"PF2E.Damage.IWR.Type.drained",earth:"PF2E.Damage.RollFlavor.earth",electricity:"PF2E.Damage.RollFlavor.electricity",emotion:"PF2E.Damage.IWR.Type.emotion",enchantment:"PF2E.Damage.IWR.Type.enchantment",energy:"PF2E.Damage.IWR.Type.energy",enfeebled:"PF2E.Damage.IWR.Type.enfeebled",evil:"PF2E.Damage.RollFlavor.evil",evocation:"PF2E.Damage.IWR.Type.evocation",fascinated:"PF2E.Damage.IWR.Type.fascinated",fatigued:"PF2E.Damage.IWR.Type.fatigued","fear-effects":"PF2E.Damage.IWR.Type.fear-effects",fire:"PF2E.Damage.RollFlavor.fire",fleeing:"PF2E.Damage.IWR.Type.fleeing",force:"PF2E.Damage.RollFlavor.force",frightened:"PF2E.Damage.IWR.Type.frightened",good:"PF2E.Damage.RollFlavor.good",grabbed:"PF2E.Damage.IWR.Type.grabbed",healing:"PF2E.Damage.IWR.Type.healing",illusion:"PF2E.Damage.IWR.Type.illusion",immobilized:"PF2E.Damage.IWR.Type.immobilized",inhaled:"PF2E.Damage.IWR.Type.inhaled",lawful:"PF2E.Damage.RollFlavor.lawful",light:"PF2E.Damage.IWR.Type.light",magic:"PF2E.Damage.IWR.Type.magic",mental:"PF2E.Damage.RollFlavor.mental",metal:"PF2E.Damage.IWR.Type.metal","misfortune-effects":"PF2E.Damage.IWR.Type.misfortune-effects",necromancy:"PF2E.Damage.IWR.Type.necromancy","non-magical":"PF2E.Damage.IWR.Type.non-magical","nonlethal-attacks":"PF2E.Damage.IWR.Type.nonlethal-attacks","object-immunities":"PF2E.Damage.IWR.Type.object-immunities","off-guard":"PF2E.Damage.IWR.Type.off-guard",olfactory:"PF2E.Damage.IWR.Type.olfactory",paralyzed:"PF2E.Damage.IWR.Type.paralyzed","persistent-damage":"PF2E.Damage.IWR.Type.persistent-damage",petrified:"PF2E.Damage.IWR.Type.petrified",physical:"PF2E.Damage.IWR.Type.physical",piercing:"PF2E.Damage.RollFlavor.piercing",plant:"PF2E.Damage.IWR.Type.plant",poison:"PF2E.Damage.RollFlavor.poison",polymorph:"PF2E.Damage.IWR.Type.polymorph",possession:"PF2E.Damage.IWR.Type.possession",precision:"PF2E.Damage.RollFlavor.precision",prone:"PF2E.Damage.IWR.Type.prone",radiation:"PF2E.Damage.IWR.Type.radiation",restrained:"PF2E.Damage.IWR.Type.restrained","salt-water":"PF2E.Damage.IWR.Type.salt-water",scrying:"PF2E.Damage.IWR.Type.scrying",sickened:"PF2E.Damage.IWR.Type.sickened",slashing:"PF2E.Damage.RollFlavor.slashing",sleep:"PF2E.Damage.IWR.Type.sleep",slowed:"PF2E.Damage.IWR.Type.slowed",sonic:"PF2E.Damage.RollFlavor.sonic","spell-deflection":"PF2E.Damage.IWR.Type.spell-deflection",spirit:"PF2E.Damage.RollFlavor.spirit",stunned:"PF2E.Damage.IWR.Type.stunned",stupefied:"PF2E.Damage.IWR.Type.stupefied","swarm-attacks":"PF2E.Damage.IWR.Type.swarm-attacks","swarm-mind":"PF2E.Damage.IWR.Type.swarm-mind",transmutation:"PF2E.Damage.IWR.Type.transmutation",trip:"PF2E.Damage.IWR.Type.trip","unarmed-attacks":"PF2E.Damage.IWR.Type.unarmed-attacks",unconscious:"PF2E.Damage.IWR.Type.unconscious",visual:"PF2E.Damage.IWR.Type.visual",vitality:"PF2E.Damage.RollFlavor.vitality",void:"PF2E.Damage.RollFlavor.void",water:"PF2E.Damage.IWR.Type.water",wood:"PF2E.Damage.IWR.Type.wood",wounded:"PF2E.Damage.IWR.Type.wounded"},weaknessTypes={...materialIWR,acid:"PF2E.Damage.RollFlavor.acid",air:"PF2E.Damage.RollFlavor.air","area-damage":"PF2E.Damage.IWR.Type.area-damage","arrow-vulnerability":"PF2E.Damage.IWR.Type.arrow-vulnerability","axe-vulnerability":"PF2E.Damage.IWR.Type.axe-vulnerability",bleed:"PF2E.Damage.RollFlavor.bleed",bludgeoning:"PF2E.Damage.RollFlavor.bludgeoning",chaotic:"PF2E.Damage.RollFlavor.chaotic",cold:"PF2E.Damage.RollFlavor.cold","critical-hits":"PF2E.Damage.IWR.Type.critical-hits",custom:"",earth:"PF2E.Damage.RollFlavor.earth",electricity:"PF2E.Damage.RollFlavor.electricity",emotion:"PF2E.Damage.IWR.Type.emotion",energy:"PF2E.Damage.IWR.Type.energy",evil:"PF2E.Damage.RollFlavor.evil",fire:"PF2E.Damage.RollFlavor.fire",force:"PF2E.Damage.RollFlavor.force","ghost-touch":"PF2E.Damage.IWR.Type.ghost-touch",glass:"PF2E.Damage.IWR.Type.glass",good:"PF2E.Damage.RollFlavor.good",lawful:"PF2E.Damage.RollFlavor.lawful",light:"PF2E.Damage.IWR.Type.light",magical:"PF2E.Damage.IWR.Type.magical",mental:"PF2E.Damage.RollFlavor.mental",metal:"PF2E.Damage.RollFlavor.metal","non-magical":"PF2E.Damage.IWR.Type.non-magical","nonlethal-attacks":"PF2E.Damage.IWR.Type.nonlethal-attacks",physical:"PF2E.Damage.IWR.Type.physical",piercing:"PF2E.Damage.RollFlavor.piercing",plant:"PF2E.Damage.IWR.Type.plant",poison:"PF2E.Damage.RollFlavor.poison",precision:"PF2E.Damage.RollFlavor.precision",radiation:"PF2E.Damage.IWR.Type.radiation",salt:"PF2E.Damage.IWR.Type.salt","salt-water":"PF2E.Damage.IWR.Type.salt-water",slashing:"PF2E.Damage.RollFlavor.slashing",sonic:"PF2E.Damage.RollFlavor.sonic",spells:"PF2E.Damage.IWR.Type.spells",spirit:"PF2E.Damage.RollFlavor.spirit","splash-damage":"PF2E.Damage.IWR.Type.splash-damage","unarmed-attacks":"PF2E.Damage.IWR.Type.unarmed-attacks","vampire-weaknesses":"PF2E.Damage.IWR.Type.vampire-weaknesses",vitality:"PF2E.Damage.RollFlavor.vitality",void:"PF2E.Damage.RollFlavor.void",vorpal:"PF2E.Damage.IWR.Type.vorpal","vorpal-fear":"PF2E.Damage.IWR.Type.vorpal-fear","vulnerable-to-sunlight":"PF2E.Damage.IWR.Type.vulnerable-to-sunlight",water:"PF2E.Damage.IWR.Type.water",weapons:"PF2E.Damage.IWR.Type.weapons","weapons-shedding-bright-light":"PF2E.Damage.IWR.Type.weapons-shedding-bright-light",wood:"PF2E.Damage.IWR.Type.wood"},resistanceTypes={...materialIWR,acid:"PF2E.Damage.RollFlavor.acid",air:"PF2E.Damage.RollFlavor.air","all-damage":"PF2E.Damage.IWR.Type.all-damage","area-damage":"PF2E.Damage.IWR.Type.area-damage",bleed:"PF2E.Damage.RollFlavor.bleed",bludgeoning:"PF2E.Damage.RollFlavor.bludgeoning",chaotic:"PF2E.Damage.RollFlavor.chaotic",cold:"PF2E.Damage.RollFlavor.cold","critical-hits":"PF2E.Damage.IWR.Type.critical-hits",custom:"","damage-from-spells":"PF2E.Damage.IWR.Type.damage-from-spells",earth:"PF2E.Damage.RollFlavor.earth",electricity:"PF2E.Damage.RollFlavor.electricity",energy:"PF2E.Damage.IWR.Type.energy",evil:"PF2E.Damage.RollFlavor.evil",fire:"PF2E.Damage.RollFlavor.fire",force:"PF2E.Damage.RollFlavor.force","ghost-touch":"PF2E.Damage.IWR.Type.ghost-touch",good:"PF2E.Damage.RollFlavor.good",lawful:"PF2E.Damage.RollFlavor.lawful",light:"PF2E.Damage.IWR.Type.light",magical:"PF2E.Damage.IWR.Type.magical",mental:"PF2E.Damage.RollFlavor.mental",metal:"PF2E.Damage.RollFlavor.metal","non-magical":"PF2E.Damage.IWR.Type.non-magical",nonlethal:"PF2E.Damage.IWR.Type.nonlethal","nonlethal-attacks":"PF2E.Damage.IWR.Type.nonlethal-attacks",physical:"PF2E.Damage.IWR.Type.physical",piercing:"PF2E.Damage.RollFlavor.piercing",plant:"PF2E.Damage.IWR.Type.plant",poison:"PF2E.Damage.RollFlavor.poison",precision:"PF2E.Damage.RollFlavor.precision","protean-anatomy":"PF2E.Damage.IWR.Type.protean-anatomy",radiation:"PF2E.Damage.IWR.Type.radiation",salt:"PF2E.Damage.IWR.Type.salt","salt-water":"PF2E.Damage.IWR.Type.salt-water",slashing:"PF2E.Damage.RollFlavor.slashing",sonic:"PF2E.Damage.RollFlavor.sonic",spells:"PF2E.Damage.IWR.Type.spells",spirit:"PF2E.Damage.RollFlavor.spirit","unarmed-attacks":"PF2E.Damage.IWR.Type.unarmed-attacks",vitality:"PF2E.Damage.RollFlavor.vitality",void:"PF2E.Damage.RollFlavor.void",vorpal:"PF2E.Damage.IWR.Type.vorpal","vorpal-adamantine":"PF2E.Damage.IWR.Type.vorpal-adamantine",water:"PF2E.Damage.IWR.Type.water",weapons:"PF2E.Damage.IWR.Type.weapons","weapons-shedding-bright-light":"PF2E.Damage.IWR.Type.weapons-shedding-bright-light",wood:"PF2E.Damage.IWR.Type.wood"},ATTRIBUTE_ABBREVIATIONS=new Set(["str","dex","con","int","wis","cha"]),CREATURE_ACTOR_TYPES=["character","npc","familiar"],SAVE_TYPES=["fortitude","reflex","will"],IMMUNITY_TYPES=new Set(Object.keys(immunityTypes)),WEAKNESS_TYPES=new Set(Object.keys(weaknessTypes)),RESISTANCE_TYPES=new Set(Object.keys(resistanceTypes)),UNAFFECTED_TYPES=new Set(["bleed","good","evil","lawful","chaotic","spirit","vitality","void"]),SKILL_ABBREVIATIONS=new Set(["acr","arc","ath","cra","dec","dip","itm","med","nat","occ","prf","rel","soc","ste","sur","thi"]),SKILL_DICTIONARY={acr:"acrobatics",arc:"arcana",ath:"athletics",cra:"crafting",dec:"deception",dip:"diplomacy",itm:"intimidation",med:"medicine",nat:"nature",occ:"occultism",prf:"performance",rel:"religion",soc:"society",ste:"stealth",sur:"survival",thi:"thievery"},SKILL_LONG_FORMS=new Set(Object.values(SKILL_DICTIONARY));Object.fromEntries(Object.entries(SKILL_DICTIONARY).map(([abbrev,value])=>[value,abbrev]));const DC_SLUGS=new Set(["ac","armor","perception",...SAVE_TYPES,...SKILL_LONG_FORMS]),SKILL_EXPANDED={acrobatics:{attribute:"dex",shortForm:"acr"},arcana:{attribute:"int",shortForm:"arc"},athletics:{attribute:"str",shortForm:"ath"},crafting:{attribute:"int",shortForm:"cra"},deception:{attribute:"cha",shortForm:"dec"},diplomacy:{attribute:"cha",shortForm:"dip"},intimidation:{attribute:"cha",shortForm:"itm"},medicine:{attribute:"wis",shortForm:"med"},nature:{attribute:"wis",shortForm:"nat"},occultism:{attribute:"int",shortForm:"occ"},performance:{attribute:"cha",shortForm:"prf"},religion:{attribute:"wis",shortForm:"rel"},society:{attribute:"int",shortForm:"soc"},stealth:{attribute:"dex",shortForm:"ste"},survival:{attribute:"wis",shortForm:"sur"},thievery:{attribute:"dex",shortForm:"thi"}},MOVEMENT_TYPES=["land","burrow","climb","fly","swim"],SIZE_LINKABLE_ACTOR_TYPES=new Set([...CREATURE_ACTOR_TYPES,"vehicle"]),_Migration672RemoveNPCBaseProperties=class extends MigrationBase{static{__name(this,"_Migration672RemoveNPCBaseProperties")}removeBase(property,replace="value"){property[replace]=Number(property[replace])||0,typeof property.base=="number"&&(property[replace]=property.base,"game"in globalThis?property["-=base?"]=null:delete property.base)}async updateActor(actorSource){if(actorSource.type!=="npc")return;const{ac,hp,perception}=actorSource.system.attributes;this.removeBase(ac),this.removeBase(hp,"max"),this.removeBase(perception);const{saves}=actorSource.system;for(const saveType of SAVE_TYPES)this.removeBase(saves[saveType])}async updateItem(itemSource,actorSource){actorSource?.type==="npc"&&itemSource.type==="lore"&&this.removeBase(itemSource.system.mod)}};__name2(_Migration672RemoveNPCBaseProperties,"Migration672RemoveNPCBaseProperties"),__publicField(_Migration672RemoveNPCBaseProperties,"version",.672);let Migration672RemoveNPCBaseProperties=_Migration672RemoveNPCBaseProperties;const _Migration673RemoveBulwarkREs=class extends MigrationBase{static{__name(this,"_Migration673RemoveBulwarkREs")}hasRuleElement(rules){return rules.some(r=>typeof r.key=="string"&&r.key.endsWith("FlatModifier")&&isObject(r.predicate)&&!!r.predicate.all?.includes("self:armor:trait:bulwark"))}async updateItem(item){const{rules}=item.system;if(item.type==="armor"){const index=rules.findIndex(rule=>typeof rule.key=="string"&&rule.key.endsWith("FlatModifier")&&rule.selector==="reflex"&&rule.type==="ability"&&/bulwark/i.test(String(rule.label??"")));index!==-1&&rules.splice(index)}const slug=item.system.slug??sluggify(item.name);if(item.type==="feat"&&slug==="mighty-bulwark"&&!this.hasRuleElement(rules)){const newRules=[{key:"FlatModifier",predicate:{all:["self:armor:trait:bulwark"]},selector:"reflex",type:"untyped",value:4},{key:"RollOption",domain:"reflex",option:"self:armor:bulwark-all"}];rules.push(...newRules)}}};__name2(_Migration673RemoveBulwarkREs,"Migration673RemoveBulwarkREs"),__publicField(_Migration673RemoveBulwarkREs,"version",.673);let Migration673RemoveBulwarkREs=_Migration673RemoveBulwarkREs;const HOMEBREW_TRAIT_KEYS=["creatureTraits","featTraits","languages","magicSchools","spellTraits","weaponCategories","weaponGroups","baseWeapons","weaponTraits","equipmentTraits"],SECONDARY_TRAIT_RECORDS={creatureTraits:["ancestryItemTraits"],equipmentTraits:["armorTraits","consumableTraits"],featTraits:["actionTraits"],weaponTraits:["npcAttackTraits"],magicSchools:["spellTraits"]};function itemIsOfType(item,...types){return types.some(t=>t==="physical"?setHasElement(PHYSICAL_ITEM_TYPES,item.type):item.type===t)}__name(itemIsOfType,"itemIsOfType"),__name2(itemIsOfType,"itemIsOfType");function reduceItemName(label){return label.includes(":")?label.replace(/^[^:]+:\s*|\s*\([^)]+\)$/g,""):label}__name(reduceItemName,"reduceItemName"),__name2(reduceItemName,"reduceItemName");const{fields:fields$2}=foundry.data,_LaxSchemaField=class extends fields$2.SchemaField{static{__name(this,"_LaxSchemaField")}_cleanType(data,options={}){options.source=options.source||data;for(const[name2,field]of this.entries())!(name2 in data)&&options.partial||(data[name2]=field.clean(data[name2],options),data[name2]===void 0&&delete data[name2]);return data}};__name2(_LaxSchemaField,"LaxSchemaField");let LaxSchemaField=_LaxSchemaField;const _StrictSchemaField=class extends fields$2.SchemaField{static{__name(this,"_StrictSchemaField")}_cast(value){return value}_cleanType(data,options){if(!isObject$1(data))throw Error(`${this.name} is not an object`);return super._cleanType(data,options)}};__name2(_StrictSchemaField,"StrictSchemaField");let StrictSchemaField=_StrictSchemaField;const _StrictStringField=class extends fields$2.StringField{static{__name(this,"_StrictStringField")}_cast(value){return value}};__name2(_StrictStringField,"StrictStringField");let StrictStringField=_StrictStringField;const _StrictNumberField=class extends fields$2.NumberField{static{__name(this,"_StrictNumberField")}_cast(value){return value}};__name2(_StrictNumberField,"StrictNumberField");let StrictNumberField=_StrictNumberField;const _StrictBooleanField=class extends fields$2.BooleanField{static{__name(this,"_StrictBooleanField")}_cast(value){return value}};__name2(_StrictBooleanField,"StrictBooleanField");let StrictBooleanField=_StrictBooleanField;const _StrictArrayField=class extends fields$2.ArrayField{static{__name(this,"_StrictArrayField")}_cast(value){return value}_cleanType(value){return Array.isArray(value)?super._cleanType(value):value}initialize(value,model,options){return Array.isArray(value)?super.initialize(value,model,options):null}};__name2(_StrictArrayField,"StrictArrayField");let StrictArrayField=_StrictArrayField;const _StrictObjectField=class extends fields$2.ObjectField{static{__name(this,"_StrictObjectField")}_cast(value){return value}};__name2(_StrictObjectField,"StrictObjectField");let StrictObjectField=_StrictObjectField;const _DataUnionField=class extends fields$2.DataField{static{__name(this,"_DataUnionField")}fields;constructor(fields2,options){super(options),this.fields=fields2}_cast(value){return typeof value=="string"&&(value=value.trim()),value}clean(value,options){return Array.isArray(value)&&this.fields.some(f=>f instanceof foundry.data.fields.ArrayField)?this.fields.find(f=>f instanceof StrictArrayField)?.clean(value,options)??value:super.clean(value,options)}validate(value,options){const{DataModelValidationFailure}=foundry.data.validation,{StringField}=foundry.data.fields;for(const field of this.fields)if(!(field.validate(value,options)instanceof DataModelValidationFailure)){if(field instanceof StringField&&typeof value!="string")continue;return}return this.fields[0].validate(value,options)}initialize(value,model,options){return this.fields.find(f=>!f.validate(value))?.initialize(value,model,options)}};__name2(_DataUnionField,"DataUnionField");let DataUnionField=_DataUnionField;const _SlugField=class extends StrictStringField{static{__name(this,"_SlugField")}constructor(options={}){options.blank=!1,options.camel??=null,super(options)}static get _defaults(){return{...super._defaults,nullable:!0,initial:null,camel:null}}_cleanType(value,options){const slug=super._cleanType(value,options),camel=this.options.camel??null;return typeof slug=="string"?sluggify(slug,{camel}):slug}};__name2(_SlugField,"SlugField");let SlugField=_SlugField;const _PredicateStatementField=class extends fields$2.DataField{static{__name(this,"_PredicateStatementField")}constructor(options={}){super({...options,required:!0,nullable:!1,initial:void 0,validationError:"must be recognized predicated statement type"})}_validateType(value){return StatementValidator.isStatement(value)}_cast(value){return value}_cleanType(value){return typeof value=="string"?value.trim():value}};__name2(_PredicateStatementField,"PredicateStatementField");let PredicateStatementField=_PredicateStatementField;const _PredicateField=class extends StrictArrayField{static{__name(this,"_PredicateField")}constructor(options={}){super(new PredicateStatementField,{label:"PF2E.RuleEditor.General.Predicate",...options})}initialize(value,model,options){const statements=super.initialize(value,model,options);return Array.isArray(statements)?new PredicatePF2e(...statements):statements}};__name2(_PredicateField,"PredicateField");let PredicateField=_PredicateField;const _RecordField=class extends fields$2.ObjectField{static{__name(this,"_RecordField")}keyField;valueField;constructor(keyField,valueField,options){if(super(options),!this._isValidKeyFieldType(keyField))throw new Error("key field must be a StringField or a NumberField");if(this.keyField=keyField,!(valueField instanceof fields$2.DataField))throw new Error(`${this.name} must have a DataField as its contained field`);this.valueField=valueField}_isValidKeyFieldType(keyField){if(keyField instanceof fields$2.StringField||keyField instanceof fields$2.NumberField){if(keyField.options.required!==!0||keyField.options.nullable===!0)throw new Error("key field must be required and non-nullable");return!0}return!1}_validateValues(values,options){const validationFailure=foundry.data.validation.DataModelValidationFailure,failures=new validationFailure;for(const[key,value]of Object.entries(values)){if(key.startsWith("-=")&&options?.partial)continue;const keyFailure=this.keyField.validate(key,options);keyFailure&&failures.elements.push({id:key,failure:keyFailure});const valueFailure=this.valueField.validate(value,options);valueFailure&&failures.elements.push({id:`${key}-value`,failure:valueFailure})}if(failures.elements.length)return failures}_cleanType(values,options){for(const[key,value]of Object.entries(values))values[key]=this.valueField.clean(value,options);return values}_validateType(values,options){return isObject$1(values)?this._validateValues(values,options):new foundry.data.validation.DataModelValidationFailure({message:"must be an Object"})}initialize(values,model,options){if(!values)return values;const data={};for(const[key,value]of Object.entries(values))data[key]=this.valueField.initialize(value,model,options);return data}};__name2(_RecordField,"RecordField"),__publicField(_RecordField,"recursive",!0);let RecordField=_RecordField;const _RuleElementPF2e=class extends foundry.abstract.DataModel{static{__name(this,"_RuleElementPF2e")}constructor(source,options){source.label??=options.parent.name,super(source,{parent:options.parent,strict:options.strict??!0,fallback:!1}),__privateAdd(this,_resolveBracketedValue),__publicField(this,"sourceIndex"),__publicField(this,"suppressWarnings");const{item}=this;if(this.suppressWarnings=options.suppressWarnings??!this.actor.id,this.sourceIndex=options.sourceIndex??null,!tupleHasValue(this.constructor.validActorTypes,item.actor.type)){const actorType=game.i18n.localize(`TYPES.Actor.${item.actor.type}`);this.failValidation(`this rule element type cannot be applied to a ${actorType}`),source.ignored=!0}this.label=typeof source.label=="string"?game.i18n.format(this.resolveInjectedProperties(source.label),{actor:item.actor.name,item:item.name,origin:item.isOfType("effect")?item.origin?.name??null:null}):item.name,this.invalid?this.ignored=!0:item instanceof PhysicalItemPF2e?(this.requiresEquipped=!!(source.requiresEquipped??!0),this.requiresInvestment=item.isInvested===null?null:!!(source.requiresInvestment??this.requiresEquipped),this.ignored===!1&&(this.ignored=!!this.requiresEquipped&&!item.isEquipped||item.system.equipped.carryType==="dropped"||!!this.requiresInvestment&&!item.isInvested)):(this.requiresEquipped=null,this.requiresInvestment=null)}static defineSchema(){const{fields:fields2}=foundry.data;return{key:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0}),slug:new SlugField({required:!0,nullable:!0,label:"PF2E.RuleEditor.General.Slug"}),label:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0,label:"PF2E.RuleEditor.General.Label"}),priority:new fields2.NumberField({required:!0,nullable:!1,integer:!0,initial:100}),ignored:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),predicate:new PredicateField,requiresEquipped:new fields2.BooleanField({required:!1,nullable:!0,initial:void 0}),requiresInvestment:new fields2.BooleanField({required:!1,nullable:!0,initial:void 0})}}static get schema(){if(this._schema&&Object.hasOwn(this,"_schema"))return this._schema;const schema=new LaxSchemaField(Object.freeze(this.defineSchema()));return schema.name=this.name,Object.defineProperty(this,"_schema",{value:schema,writable:!1}),schema}get item(){return this.parent}get actor(){return this.parent.actor}get token(){const actor=this.actor;if(actor.token)return actor.token;const tokens=actor.getActiveTokens();return tokens.find(token=>token.controlled)?.document??tokens.shift()?.document??null}getReducedLabel(label=this.label){return reduceItemName(label)}validate(options={}){try{return super.validate(options)}catch(error){if(error instanceof foundry.data.validation.DataModelValidationError){const message=error.message.replace(/validation errors|Joint Validation Error/,`validation errors on item ${this.item.name} (${this.item.uuid})`);return console.warn(message),!1}else throw error}}test(rollOptions){if(this.ignored)return!1;if(this.predicate.length===0)return!0;const optionSet=new Set([...rollOptions??this.actor.getRollOptions(),...this.item.getRollOptions("parent")]);return this.resolveInjectedProperties(this.predicate).test(optionSet)}failValidation(...message){const fullMessage=message.join(" "),{name:name2,uuid}=this.item;if(!this.suppressWarnings){const ruleName=game.i18n.localize(`PF2E.RuleElement.${this.key}`);this.actor.synthetics.preparationWarnings.add(`PF2e System | ${ruleName} rules element on item ${name2} (${uuid}) failed to validate: ${fullMessage}`)}this.ignored=!0}resolveInjectedProperties(source,{warn=!0}={}){if(source===null||typeof source=="number"||typeof source=="string"&&!source.includes("{"))return source;if(Array.isArray(source))for(let i=0;i{const data=key==="rule"?this:key==="actor"||key==="item"?this[key]:this.item,value=getProperty(data,prop);return value===void 0&&(this.ignored=!0,warn&&this.failValidation(`Failed to resolve injected property "${source}"`)),String(value)});return source}resolveValue(value,defaultValue=0,{evaluate=!0,resolvables={},warn=!0}={}){if(value??=defaultValue??null,typeof value=="number"||typeof value=="boolean"||value===null)return value;value=this.resolveInjectedProperties(value,{warn});const resolvedFromBracket=this.isBracketedValue(value)?__privateMethod(this,_resolveBracketedValue,resolveBracketedValue_fn).call(this,value,defaultValue):value;if(typeof resolvedFromBracket=="number")return resolvedFromBracket;if(resolvedFromBracket instanceof Object)return defaultValue instanceof Object?mergeObject(defaultValue,resolvedFromBracket,{inplace:!1}):resolvedFromBracket;if(typeof resolvedFromBracket=="string"){const saferEval=__name2(formula=>{try{const unresolveds=formula.match(/@[a-z.]+/gi)??[];if(unresolveds.length>0){const shouldWarn=warn&&!unresolveds.every(u=>u.startsWith("@target.")||u.startsWith("@actor.conditions."));return this.ignored=!0,shouldWarn&&this.failValidation(`Failed to resolve all components of formula, "${formula}"`),Number(defaultValue)}return Roll.safeEval(formula)}catch{return this.failValidation(`Error thrown while attempting to evaluate formula, "${formula}"`),0}},"saferEval");this.actor.isOfType("character")&&(resolvables.armor=this.actor.wornArmor);const trimmed=resolvedFromBracket.trim();return(trimmed.includes("@")||/^\d+$/.test(trimmed))&&evaluate?saferEval(Roll.replaceFormulaData(trimmed,{actor:this.actor,item:this.item,...resolvables})):trimmed}return defaultValue}isBracketedValue(value){return isObject(value)&&Array.isArray(value.brackets)&&(typeof value.field=="string"||!("fields"in value))}};_resolveBracketedValue=new WeakSet,resolveBracketedValue_fn=__name2(function(value,defaultValue){const bracketNumber=(()=>{if(!value.field)return this.actor.level;const field=String(value.field),separator=field.indexOf("|"),source=field.substring(0,separator),{actor,item}=this;switch(source){case"actor":return Number(getProperty(actor,field.substring(separator+1)))||0;case"item":return Number(getProperty(item,field.substring(separator+1)))||0;case"rule":return Number(getProperty(this,field.substring(separator+1)))||0;default:return Number(getProperty(actor,field.substring(0)))||0}})(),brackets=value.brackets??[],bracketFallthrough=(()=>{switch(typeof defaultValue){case"number":case"boolean":case"object":return defaultValue;case"string":return Number.isNaN(Number(defaultValue))?defaultValue:Number(defaultValue);default:return null}})();return brackets.find(bracket=>{const start=bracket.start??0,end=bracket.end??1/0;return start<=bracketNumber&&end>=bracketNumber})?.value??bracketFallthrough},"#resolveBracketedValue"),__name2(_RuleElementPF2e,"RuleElementPF2e"),__publicField(_RuleElementPF2e,"validActorTypes",["character","familiar","hazard","npc","party","vehicle"]);let RuleElementPF2e=_RuleElementPF2e;const _ResolvableValueField=class extends foundry.data.fields.DataField{static{__name(this,"_ResolvableValueField")}constructor(){super(...arguments),__privateAdd(this,_coerceNumber)}_validateType(value){return value!==null&&["string","number","object","boolean"].includes(typeof value)}_cast(value){return value}_cleanType(value){if(typeof value=="string")return __privateMethod(this,_coerceNumber,coerceNumber_fn).call(this,value);if(isObject(value)&&"brackets"in value){value.field||="actor|level";const brackets=value.brackets=compact(Object.values(value.brackets??{}));for(const bracket of brackets)bracket.start===null&&delete bracket.start,bracket.end===null&&delete bracket.end,bracket.value=typeof bracket.value=="string"?__privateMethod(this,_coerceNumber,coerceNumber_fn).call(this,bracket.value):bracket.value}return value}};_coerceNumber=new WeakSet,coerceNumber_fn=__name2(function(value){const trimmed=value.trim();return/^\d+(?:\.\d+)?$/.test(trimmed)?Number(trimmed):trimmed||0},"#coerceNumber"),__name2(_ResolvableValueField,"ResolvableValueField");let ResolvableValueField=_ResolvableValueField;const _ActorTraitsRuleElement=class extends RuleElementPF2e{static{__name(this,"_ActorTraitsRuleElement")}constructor(data,options){super({...data,priority:99},options),__privateAdd(this,_traitsDictionary),__privateAdd(this,_handleModeAffectingTrait)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),add:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,blank:!1})),remove:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,blank:!1}))}}beforePrepareData(){if(this.test()&&this.actor.system.traits){const traits=this.actor.system.traits,newTraits=this.resolveInjectedProperties(this.add).filter(t=>!traits.value.includes(t)),traitsDictionary=__privateGet(this,_traitsDictionary,traitsDictionary_get);for(const trait of newTraits){if(!(trait in traitsDictionary))return this.failValidation(`${trait} is not a recognized trait`);traits.value.push(trait),this.actor.rollOptions.all[`self:trait:${trait}`]=!0,["construct","undead"].includes(trait)&&__privateMethod(this,_handleModeAffectingTrait,handleModeAffectingTrait_fn).call(this)}const toRemoves=this.resolveInjectedProperties(this.remove);for(const trait of toRemoves)traits.value=traits.value.filter(t=>t!==trait),delete this.actor.rollOptions.all[`self:trait:${trait}`],["construct","undead"].includes(trait)&&__privateMethod(this,_handleModeAffectingTrait,handleModeAffectingTrait_fn).call(this)}}};_traitsDictionary=new WeakSet,traitsDictionary_get=__name2(function(){switch(this.actor.type){case"character":case"familiar":case"npc":return CONFIG.PF2E.creatureTraits;case"hazard":return CONFIG.PF2E.hazardTraits;case"vehicle":return CONFIG.PF2E.vehicleTraits;default:throw ErrorPF2e("unexpected actor type")}},"#traitsDictionary"),_handleModeAffectingTrait=new WeakSet,handleModeAffectingTrait_fn=__name2(function(){const{actor}=this,{rollOptions}=actor;for(const mode of["construct","living","undead"])delete rollOptions.all[`self:mode:${mode}`];rollOptions.all[`self:mode:${actor.modeOfBeing}`]=!0},"#handleModeAffectingTrait"),__name2(_ActorTraitsRuleElement,"ActorTraitsRuleElement"),__publicField(_ActorTraitsRuleElement,"validActorTypes",["character","npc","familiar","hazard","vehicle"]);let ActorTraitsRuleElement=_ActorTraitsRuleElement;const _DegreeOfSuccess=class{static{__name(this,"_DegreeOfSuccess")}constructor(roll,dc,dosAdjustments=null){__privateAdd(this,_getDegreeAdjustment),__privateAdd(this,_adjustDegreeOfSuccess),__privateAdd(this,_adjustDegreeByDieValue),__privateAdd(this,_calculateDegreeOfSuccess),__publicField(this,"value"),__publicField(this,"unadjusted"),__publicField(this,"adjustment"),__publicField(this,"dieResult"),__publicField(this,"rollTotal"),__publicField(this,"dc"),roll instanceof Roll?(this.dieResult=(roll.isDeterministic?roll.terms.find(t=>t instanceof NumericTerm):roll.dice.find(d=>d instanceof Die&&d.faces===20))?.total??1,this.rollTotal=roll.total):(this.dieResult=roll.dieValue,this.rollTotal=roll.dieValue+roll.modifier),this.dc=typeof dc=="number"?{value:dc}:dc,this.unadjusted=__privateMethod(this,_calculateDegreeOfSuccess,calculateDegreeOfSuccess_fn).call(this),this.adjustment=__privateMethod(this,_getDegreeAdjustment,getDegreeAdjustment_fn).call(this,this.unadjusted,dosAdjustments),this.value=this.adjustment?__privateMethod(this,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn).call(this,this.adjustment.amount,this.unadjusted):this.unadjusted}};_getDegreeAdjustment=new WeakSet,getDegreeAdjustment_fn=__name2(function(degree,adjustments){if(!adjustments)return null;for(const outcome of["all",...DEGREE_OF_SUCCESS_STRINGS]){const{label,amount}=adjustments[outcome]??{};if(amount&&label&&!(degree===_DegreeOfSuccess.CRITICAL_SUCCESS&&amount===DEGREE_ADJUSTMENT_AMOUNTS.INCREASE)&&!(degree===_DegreeOfSuccess.CRITICAL_FAILURE&&amount===DEGREE_ADJUSTMENT_AMOUNTS.LOWER)&&(outcome==="all"||DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome)===degree))return{label,amount}}return null},"#getDegreeAdjustment"),_adjustDegreeOfSuccess=new WeakSet,adjustDegreeOfSuccess_fn=__name2(function(amount,degreeOfSuccess){switch(amount){case"criticalFailure":return 0;case"failure":return 1;case"success":return 2;case"criticalSuccess":return 3;default:return Math.clamped(degreeOfSuccess+amount,0,3)}},"#adjustDegreeOfSuccess"),_adjustDegreeByDieValue=new WeakSet,adjustDegreeByDieValue_fn=__name2(function(degree){return this.dieResult===20?__privateMethod(this,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn).call(this,DEGREE_ADJUSTMENT_AMOUNTS.INCREASE,degree):this.dieResult===1?__privateMethod(this,_adjustDegreeOfSuccess,adjustDegreeOfSuccess_fn).call(this,DEGREE_ADJUSTMENT_AMOUNTS.LOWER,degree):degree},"#adjustDegreeByDieValue"),_calculateDegreeOfSuccess=new WeakSet,calculateDegreeOfSuccess_fn=__name2(function(){const dc=this.dc.value;return this.rollTotal-dc>=10?__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.CRITICAL_SUCCESS):dc-this.rollTotal>=10?__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.CRITICAL_FAILURE):this.rollTotal>=dc?__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.SUCCESS):__privateMethod(this,_adjustDegreeByDieValue,adjustDegreeByDieValue_fn).call(this,_DegreeOfSuccess.FAILURE)},"#calculateDegreeOfSuccess"),__name2(_DegreeOfSuccess,"DegreeOfSuccess"),__publicField(_DegreeOfSuccess,"CRITICAL_FAILURE",0),__publicField(_DegreeOfSuccess,"FAILURE",1),__publicField(_DegreeOfSuccess,"SUCCESS",2),__publicField(_DegreeOfSuccess,"CRITICAL_SUCCESS",3);let DegreeOfSuccess=_DegreeOfSuccess;const DEGREE_ADJUSTMENT_AMOUNTS={LOWER_BY_TWO:-2,LOWER:-1,INCREASE:1,INCREASE_BY_TWO:2,TO_CRITICAL_FAILURE:"criticalFailure",TO_FAILURE:"failure",TO_SUCCESS:"success",TO_CRITICAL_SUCCESS:"criticalSuccess"},DEGREE_OF_SUCCESS={CRITICAL_SUCCESS:3,SUCCESS:2,FAILURE:1,CRITICAL_FAILURE:0},DEGREE_OF_SUCCESS_STRINGS=["criticalFailure","failure","success","criticalSuccess"],_AdjustDegreeOfSuccessRuleElement=class extends RuleElementPF2e{static{__name(this,"_AdjustDegreeOfSuccessRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,nullable:!1,blank:!1}),adjustment:new RecordField(new fields2.StringField({required:!0,nullable:!1,choices:["all",...DEGREE_OF_SUCCESS_STRINGS]}),new fields2.StringField({required:!0,nullable:!1,choices:degreeAdjustmentAmountString}),{required:!0,nullable:!1})}}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),adjustments=this.adjustment,stringToAdjustment={"two-degrees-better":DEGREE_ADJUSTMENT_AMOUNTS.INCREASE_BY_TWO,"one-degree-better":DEGREE_ADJUSTMENT_AMOUNTS.INCREASE,"one-degree-worse":DEGREE_ADJUSTMENT_AMOUNTS.LOWER,"two-degrees-worse":DEGREE_ADJUSTMENT_AMOUNTS.LOWER_BY_TWO,"to-critical-failure":DEGREE_ADJUSTMENT_AMOUNTS.TO_CRITICAL_FAILURE,"to-failure":DEGREE_ADJUSTMENT_AMOUNTS.TO_FAILURE,"to-success":DEGREE_ADJUSTMENT_AMOUNTS.TO_SUCCESS,"to-critical-success":DEGREE_ADJUSTMENT_AMOUNTS.TO_CRITICAL_SUCCESS},record=["all",...DEGREE_OF_SUCCESS_STRINGS].reduce((accumulated,outcome)=>{const adjustment=adjustments[outcome];return adjustment&&(accumulated[outcome]={label:this.label,amount:stringToAdjustment[adjustment]}),accumulated},{});(this.actor.synthetics.degreeOfSuccessAdjustments[selector]??=[]).push({adjustments:record,predicate:this.predicate})}};__name2(_AdjustDegreeOfSuccessRuleElement,"AdjustDegreeOfSuccessRuleElement"),__publicField(_AdjustDegreeOfSuccessRuleElement,"validActorTypes",["character","npc"]);let AdjustDegreeOfSuccessRuleElement=_AdjustDegreeOfSuccessRuleElement;const degreeAdjustmentAmountString=["one-degree-better","one-degree-worse","two-degrees-better","two-degrees-worse","to-critical-failure","to-failure","to-success","to-critical-success"],_AELikeRuleElement=class extends RuleElementPF2e{static{__name(this,"_AELikeRuleElement")}constructor(){super(...arguments),__privateAdd(this,_rewriteSkillLongFormPath),__privateAdd(this,_pathIsValid),__privateAdd(this,_applyAELike),__privateAdd(this,_logChange)}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema(),PRIORITIES=this.CHANGE_MODE_DEFAULT_PRIORITIES;return baseSchema.priority.initial=d=>PRIORITIES[String(d.mode)]??50,{...baseSchema,mode:new fields2.StringField({required:!0,choices:keys.strict(this.CHANGE_MODE_DEFAULT_PRIORITIES),initial:void 0}),path:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0}),phase:new fields2.StringField({required:!1,nullable:!1,choices:deepClone(this.PHASES),initial:"applyAEs"}),value:new ResolvableValueField({required:!0,nullable:!0,initial:void 0}),merge:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0})}}static validateJoint(data){if(super.validateJoint(data),data.merge){if(data.mode!=="override")throw new foundry.data.validation.DataModelValidationError(' merge: `mode` must be "override"');if(!isObject(data.value))throw new foundry.data.validation.DataModelValidationError(" merge: `value` must an object")}}async preCreate(){this.phase==="applyAEs"&&__privateMethod(this,_applyAELike,applyAELike_fn).call(this)}onApplyActiveEffects(){this.phase==="applyAEs"&&__privateMethod(this,_applyAELike,applyAELike_fn).call(this)}beforePrepareData(){this.phase==="beforeDerived"&&__privateMethod(this,_applyAELike,applyAELike_fn).call(this)}afterPrepareData(){this.phase==="afterDerived"&&__privateMethod(this,_applyAELike,applyAELike_fn).call(this)}beforeRoll(_domains,rollOptions){this.phase==="beforeRoll"&&__privateMethod(this,_applyAELike,applyAELike_fn).call(this,rollOptions)}static getNewValue(mode,current,change,merge=!1){const{DataModelValidationFailure}=foundry.data.validation,addOrSubtract=__name2(value=>{const isNumericAdd=typeof value=="number"&&(typeof current=="number"||current===void 0||current===null),isArrayAdd=Array.isArray(current)&¤t.every(e=>typeof e==typeof value);return isNumericAdd?(current??0)+value:isArrayAdd?value:new DataModelValidationFailure({invalidValue:value,fallback:!1})},"addOrSubtract");switch(mode){case"multiply":return typeof change!="number"?new DataModelValidationFailure({invalidValue:change,fallback:!1}):typeof current=="number"||current===void 0?Math.trunc((current??0)*change):new DataModelValidationFailure({invalidValue:current,fallback:!1});case"add":return addOrSubtract(change);case"subtract":case"remove":{const addedChange=(typeof current=="number"||current===void 0)&&typeof change=="number"?-1*change:change;return addOrSubtract(addedChange)}case"downgrade":return typeof change!="number"?new DataModelValidationFailure({invalidValue:change,fallback:!1}):typeof current=="number"||current===void 0?Math.min(current??0,change):new DataModelValidationFailure({invalidValue:current,fallback:!1});case"upgrade":return typeof change!="number"?new DataModelValidationFailure({invalidValue:change,fallback:!1}):typeof current=="number"||current===void 0?Math.max(current??0,change):new DataModelValidationFailure({invalidValue:current,fallback:!1});case"override":return merge&&isObject(current)&&isObject(change)?mergeObject(current,change):change;default:return null}}};_SKILL_LONG_FORM_PATH=new WeakMap,_rewriteSkillLongFormPath=new WeakSet,rewriteSkillLongFormPath_fn=__name2(function(path){return path.replace(__privateGet(_AELikeRuleElement,_SKILL_LONG_FORM_PATH),(match,group)=>objectHasKey(SKILL_EXPANDED,group)?`system.skills.${SKILL_EXPANDED[group].shortForm}`:match)},"#rewriteSkillLongFormPath"),_pathIsValid=new WeakSet,pathIsValid_fn=__name2(function(path){const actor=this.item.actor;return path.length>0&&!/\bnull\b/.test(path)&&(path.startsWith("flags.")||[path,path.replace(/\.[-\w]+$/,""),path.replace(/\.?[-\w]+\.[-\w]+$/,"")].some(path2=>getProperty(actor,path2)!==void 0))},"#pathIsValid"),_applyAELike=new WeakSet,applyAELike_fn=__name2(function(rollOptions){if(this.ignored)return;const path=__privateMethod(this,_rewriteSkillLongFormPath,rewriteSkillLongFormPath_fn).call(this,this.resolveInjectedProperties(this.path));if(this.ignored)return;if(!__privateMethod(this,_pathIsValid,pathIsValid_fn).call(this,path))return this.failValidation(`no data found at or near "${path}"`);if(rollOptions??=this.predicate.length>0?new Set(this.actor.getRollOptions()):new Set,!this.test(rollOptions))return;const{actor}=this,current=getProperty(actor,path),change=this.resolveValue(this.value),newValue=_AELikeRuleElement.getNewValue(this.mode,current,change,this.merge);if(newValue instanceof foundry.data.validation.DataModelValidationFailure)return this.failValidation(newValue.asError().message);if(this.mode==="add"&&Array.isArray(current))current.includes(newValue)||current.push(newValue);else if(["subtract","remove"].includes(this.mode)&&Array.isArray(current))current.splice(current.indexOf(newValue),1);else try{setProperty(actor,path,newValue),__privateMethod(this,_logChange,logChange_fn).call(this,change)}catch(error){error instanceof Error?this.failValidation(error.message):console.warn(error)}},"#applyAELike"),_logChange=new WeakSet,logChange_fn=__name2(function(value){const{item,mode}=this;if(!(!(typeof value=="number"||typeof value=="string")&&typeof value=="string"&&mode!=="override"))return;const level=item instanceof FeatPF2e?Number(/-(\d+)$/.exec(item.system.location??"")?.[1])||item.level:"level"in item&&typeof item.level=="number"?item.level:null,{autoChanges}=this.actor.system;(autoChanges[this.path]??=[]).push({mode,level,value,source:this.item.name})},"#logChange"),__name2(_AELikeRuleElement,"AELikeRuleElement"),__publicField(_AELikeRuleElement,"CHANGE_MODE_DEFAULT_PRIORITIES",{multiply:10,add:20,subtract:20,remove:20,downgrade:30,upgrade:40,override:50}),__publicField(_AELikeRuleElement,"PHASES",["applyAEs","beforeDerived","afterDerived","beforeRoll"]),__privateAdd(_AELikeRuleElement,_SKILL_LONG_FORM_PATH,(()=>{const skillLongForms=Array.from(SKILL_LONG_FORMS).join("|");return new RegExp(String.raw`^system\.skills\.(${skillLongForms})\b`)})());let AELikeRuleElement=_AELikeRuleElement;const _AdjustModifierRuleElement=class extends RuleElementPF2e{static{__name(this,"_AdjustModifierRuleElement")}applications=0;constructor(source,options){source.suppress&&(source.mode="override"),super(source,options),typeof source.selector=="string"&&this.selectors.length===0&&(this.selectors=[source.selector]),this.suppress??=!1,this.maxApplications??=1/0}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema(),PRIORITIES=AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES;return baseSchema.priority.initial=d=>PRIORITIES[String(d.mode)]??50,{...baseSchema,mode:new fields2.StringField({required:!0,choices:keys.strict(AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES),initial:void 0}),selector:new fields2.StringField({required:!1,blank:!1,initial:void 0}),selectors:new StrictArrayField(new fields2.StringField({required:!0,blank:!1})),relabel:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),damageType:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),suppress:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),maxApplications:new fields2.NumberField({required:!1,nullable:!0,initial:null}),value:new ResolvableValueField({required:!1,nullable:!0,initial:null})}}static validateJoint(data){super.validateJoint(data);const{DataModelValidationError}=foundry.data.validation;if(data.suppress===!0){if(typeof data.maxApplications=="number")throw new DataModelValidationError(" use of `maxApplications` in combination with `suppress` is not currently supported")}else if(data.value===null&&!data.damageType)throw new DataModelValidationError(" value: must be provided unless damageType is provided or suppress is true")}beforePrepareData(){if(this.ignored)return;const predicate=new PredicatePF2e(this.resolveInjectedProperties(deepClone([...this.predicate]))),adjustment={slug:this.slug,test:options=>predicate.test([...options,...this.item.getRollOptions("parent")]),suppress:this.suppress,getNewValue:current=>{if(this.value===null)return current;const change=Number(this.resolveValue(this.value));if(Number.isNaN(change))return this.failValidation("value does not resolve to a number"),current;if(this.ignored)return current;this.applications+=1,this.applications===this.maxApplications&&(this.ignored=!0);const newValue=AELikeRuleElement.getNewValue(this.mode,current,change);return newValue instanceof foundry.data.validation.DataModelValidationFailure?(this.failValidation(newValue.asError().message),current):newValue},getDamageType:current=>{if(!this.damageType)return current;const damageType=this.resolveInjectedProperties(this.damageType);return objectHasKey(CONFIG.PF2E.damageTypes,damageType)?damageType:(this.failValidation(`${damageType} is an unrecognized damage type.`),current)}};this.relabel&&(adjustment.relabel=this.getReducedLabel(this.resolveInjectedProperties(this.relabel)));for(const selector of this.selectors.map(s=>this.resolveInjectedProperties(s))){if(selector==="null")continue;(this.actor.synthetics.modifierAdjustments[selector]??=[]).push(adjustment)}}};__name2(_AdjustModifierRuleElement,"AdjustModifierRuleElement");let AdjustModifierRuleElement=_AdjustModifierRuleElement;const _AdjustStrikeRuleElement=class _AdjustStrikeRuleElement2 extends RuleElementPF2e{static{__name(this,"_AdjustStrikeRuleElement")}constructor(data,options){super({...data,priority:110},options)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),mode:new fields2.StringField({required:!0,choices:keys.strict(AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES),initial:void 0}),property:new fields2.StringField({required:!0,choices:Array.from(this.VALID_PROPERTIES),initial:void 0}),definition:new PredicateField,value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0})}}beforePrepareData(){if(!this.test())return;const change=this.resolveValue(this.value),adjustment=(()=>{if(!this.property)throw ErrorPF2e("Unexpected error applying adjustment");const definition=this.resolveInjectedProperties(this.definition);switch(this.property){case"materials":return{adjustDamageRoll:(weapon,{materials})=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of material effects must be used with the "add", "subtract", or "remove" mode.');if(!definition.test(weapon.getRollOptions("item")))return;if(!objectHasKey(CONFIG.PF2E.materialDamageEffects,change))return this.failValidation(`"${change}" is not a supported weapon material effect.`);const method=this.mode==="add"?"add":"delete";materials?.[method](change)}};case"range-increment":return{adjustWeapon:weapon=>{if(weapon.isOfType("melee"))return;if(typeof change!="number")return this.failValidation("Change value is not a number.");if(!definition.test(weapon.getRollOptions("item")))return;const rangeIncrement=weapon.range?.increment;if(typeof rangeIncrement!="number")return this.failValidation("A weapon that meets the definition lacks a range increment.");const newRangeIncrement=AELikeRuleElement.getNewValue(this.mode,rangeIncrement,change);weapon.system.range=newRangeIncrement}};case"traits":return{adjustTraits:(weapon,traits)=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of traits must be used with the "add", "subtract", or "remove" mode.');if(!objectHasKey(CONFIG.PF2E.actionTraits,change))return this.failValidation(`"${change}" is not a recognized action trait.`);definition.test(weapon.getRollOptions("item"))&&(this.mode==="add"&&!traits.includes(change)?traits.push(change):["subtract","remove"].includes(this.mode)&&traits.includes(change)&&traits.splice(traits.indexOf(change),1))}};case"weapon-traits":return{adjustWeapon:weapon=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of weapon traits must be used with the "add", "subtract", or "remove" mode.');if(!objectHasKey(CONFIG.PF2E.weaponTraits,change)&&!(weapon.isOfType("melee")&&objectHasKey(CONFIG.PF2E.npcAttackTraits,change)))return this.failValidation(`"${change}" is not a recognized weapon trait.`);if(!definition.test(weapon.getRollOptions("item"))||weapon.slug==="basic-unarmed"&&/^(?:modular|versatile)/.test(change))return;const traits=weapon.system.traits.value,annotatedTraitMatch=change.match(/^([a-z][-a-z]+)-(\d*d?\d+)$/);if(this.mode==="add"&&annotatedTraitMatch){const changeBaseTrait=annotatedTraitMatch[1],changeValue=annotatedTraitMatch[2],traitRegex=new RegExp(`${changeBaseTrait}-(\\d*d?\\d*)`),existingTraitMatch=traits.map(trait=>trait.match(traitRegex)).find(match=>!!match);if(existingTraitMatch){const existingTrait=existingTraitMatch[1],existingValue=_AdjustStrikeRuleElement2.getTraitScore(existingTrait);_AdjustStrikeRuleElement2.getTraitScore(changeValue)>existingValue&&traits.findSplice(trait=>trait===existingTraitMatch[0],change);return}}this.mode==="add"&&!traits.includes(change)?traits.push(change):this.mode!=="add"&&traits.includes(change)&&traits.splice(traits.indexOf(change),1)}};case"property-runes":return{adjustWeapon:weapon=>{if(!["add","subtract","remove"].includes(this.mode))return this.failValidation('A strike adjustment of weapon property runes must be used with the "add", "subtract", or "remove" mode.');const runeSlug=sluggify(String(change),{camel:"dromedary"});if(!objectHasKey(RUNE_DATA.weapon.property,runeSlug))return this.failValidation(`"${change}" is not a recognized weapon property rune.`);if(!definition.test(weapon.getRollOptions("item")))return;const propertyRunes=weapon.system.runes.property;this.mode==="add"?propertyRunes.push(runeSlug):propertyRunes.includes(runeSlug)&&propertyRunes.splice(propertyRunes.indexOf(runeSlug),1),weapon.system.runes.property=prunePropertyRunes(propertyRunes,RUNE_DATA.weapon.property)}}}})();this.actor.synthetics.strikeAdjustments.push(adjustment)}static getTraitScore(traitValue){const traitValueMatch=traitValue.match(/(\d*)d(\d+)/);return traitValueMatch?Number(traitValueMatch[1]||1)*((Number(traitValueMatch[2])+1)/2):Number(traitValue)}};__name2(_AdjustStrikeRuleElement,"AdjustStrikeRuleElement"),__publicField(_AdjustStrikeRuleElement,"validActorTypes",["character","familiar","npc"]),__publicField(_AdjustStrikeRuleElement,"VALID_PROPERTIES",new Set(["materials","property-runes","range-increment","traits","weapon-traits"]));let AdjustStrikeRuleElement=_AdjustStrikeRuleElement;function createDamageFormula(damage,degree=DEGREE_OF_SUCCESS.SUCCESS){if(damage={...deepClone(omit(damage,["dice"])),dice:damage.dice.map(d=>d.clone())},degree===DEGREE_OF_SUCCESS.CRITICAL_FAILURE)return null;degree===DEGREE_OF_SUCCESS.FAILURE&&(damage.dice=damage.dice.filter(d=>d.category==="splash"),damage.modifiers=damage.modifiers.filter(m=>m.damageCategory==="splash"));const critical=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS;if(!damage.base.length)return null;applyDamageDiceOverrides(damage.base,damage.dice,{critical,maxIncreases:damage.maxIncreases});const typeMap=new Map;for(const baseEntry of damage.base){const list=typeMap.get(baseEntry.damageType)??[];if(typeMap.set(baseEntry.damageType,list),baseEntry.terms)list.push(...baseEntry.terms.map(t=>({...baseEntry,...t,label:null,critical:null})));else if(baseEntry.diceNumber&&baseEntry.dieSize||baseEntry.modifier){const{diceNumber,dieSize,damageType}=baseEntry,modifier=baseEntry.modifier??0,label=(()=>{const diceSection=diceNumber?`${diceNumber}${dieSize}`:null;if(!diceSection)return String(modifier);const displayedModifier=modifier?Math.abs(modifier):null,operator=modifier<0?" - ":" + ";return[diceSection,displayedModifier].filter(p=>p!==null).join(operator)})();list.push({label,dice:diceNumber&&dieSize?{number:diceNumber,faces:Number(dieSize.replace("d",""))}:null,modifier,critical:null,damageType,category:baseEntry.category,materials:baseEntry.materials??[]})}}const BONUS_BASE_LABELS=["PF2E.ConditionTypePersistent"].map(l=>game.i18n.localize(l)),outcomeMatches=__name2(m=>critical||m.critical!==!0,"outcomeMatches");for(const dice of damage.dice.filter(d=>d.enabled&&outcomeMatches(d))){const matchingBase=damage.base.find(b=>b.damageType===dice.damageType)??damage.base[0],baseDieSize=Number(matchingBase.dieSize?.replace("d",""))||matchingBase.terms?.[0].dice?.faces,faces=Number(dice.dieSize?.replace("d",""))||baseDieSize||null,damageType=dice.damageType??matchingBase.damageType;if(dice.diceNumber>0&&faces){const list=typeMap.get(damageType)??[];list.push({label:BONUS_BASE_LABELS.includes(dice.label)?null:`${dice.label} +${dice.diceNumber}d${faces}`,dice:{number:dice.diceNumber,faces},modifier:0,damageType,category:dice.category,critical:dice.critical}),typeMap.set(damageType,list)}}for(const modifier of damage.modifiers.filter(m=>m.enabled&&outcomeMatches(m))){const bonusableDamage=[...damage.base,...damage.dice,...damage.modifiers.filter(m=>m.value>0&&m.type==="untyped")],matchingDamage=modifier.kind==="modifier"?bonusableDamage.find(b=>b.damageType===(modifier.damageType??b.damageType))??damage.base.at(0):bonusableDamage.find(b=>b.damageType===(modifier.damageType??b.damageType)&&b.category===modifier.category);if(!matchingDamage)continue;const damageType=modifier.damageType??matchingDamage.damageType??"untyped",list=typeMap.get(damageType)??[];list.push({label:BONUS_BASE_LABELS.includes(modifier.label)?null:`${modifier.label} ${signedInteger(modifier.value)}`,dice:null,modifier:modifier.value,damageType,category:modifier.damageCategory,critical:modifier.critical}),typeMap.set(damageType,list)}const instances=[instancesFromTypeMap(typeMap,{degree,kinds:damage.kinds}),instancesFromTypeMap(typeMap,{degree,persistent:!0})].flat(),commaSeparated=instances.map(i=>i.formula).join(","),breakdown=instances.flatMap(i=>i.breakdown);return{formula:`{${commaSeparated}}`,breakdown}}__name(createDamageFormula,"createDamageFormula"),__name2(createDamageFormula,"createDamageFormula");function instancesFromTypeMap(typeMap,{degree,kinds=new Set(["damage"]),persistent=!1}){return Array.from(typeMap.entries()).flatMap(([damageType,typePartials])=>{const partials=typePartials.filter(p=>p.category==="persistent"===persistent);if(partials.length===0)return[];const groups=groupBy(partials,partial=>partial.category),nonCriticalDamage=(()=>{const criticalInclusion=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS?[CRITICAL_INCLUSION.DOUBLE_ON_CRIT]:[CRITICAL_INCLUSION.DOUBLE_ON_CRIT,CRITICAL_INCLUSION.DONT_DOUBLE_ON_CRIT],doubleDice=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&criticalInclusion.includes(null)&&game.settings.get("pf2e","critRule")==="doubledice",double=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&!doubleDice;return sumExpression(createPartialFormulas(groups,{criticalInclusion,doubleDice}),{double})})(),criticalDamage=(()=>{if(degree!==DEGREE_OF_SUCCESS.CRITICAL_SUCCESS)return null;const criticalInclusion=[CRITICAL_INCLUSION.CRITICAL_ONLY,CRITICAL_INCLUSION.DONT_DOUBLE_ON_CRIT];return sumExpression(createPartialFormulas(groups,{criticalInclusion}))})(),summedDamage=sumExpression(degree?[nonCriticalDamage,criticalDamage]:[nonCriticalDamage]),enclosed=ensureValidFormulaHead(summedDamage)||"0";if(enclosed==="0"&&persistent)return[];const flavor=(()=>{const kindFlavor=kinds.has("damage")?kinds.has("healing")?["damage","healing"]:["damage"]:["healing"],typeFlavor=damageType==="untyped"&&!persistent?[]:[damageType],persistentFlavor=persistent?["persistent"]:[],materialFlavor=typePartials.flatMap(p=>p.materials??[]),allFlavor=[kindFlavor,typeFlavor,persistentFlavor,materialFlavor].flat().join(",");return allFlavor.length>0?`[${allFlavor}]`:""})(),breakdown=(()=>{const flattenedDamage=[null,"persistent","precision","splash"].flatMap(c=>{const partials2=groups.get(c)??[],breakdownDamage2=partials2.filter(e=>e.label!==null),leadingTerms=partials2.filter(p=>p.label===null&&(p.modifier||p.dice?.number||partials2.every(pp=>pp.label===null)));if(leadingTerms.length){const append=c==="splash"?` ${game.i18n.localize("PF2E.Damage.RollFlavor.splash")}`:"",label=createSimpleFormula(leadingTerms)+append;breakdownDamage2.unshift({...leadingTerms[0],label})}return breakdownDamage2}),breakdownDamage=flattenedDamage.filter(d=>d.critical!==!0);if(degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&breakdownDamage.push(...flattenedDamage.filter(d=>d.critical===!0)),breakdownDamage.length===0)return[];const damageTypeLabel=breakdownDamage[0].category==="persistent"?game.i18n.format("PF2E.Damage.PersistentTooltip",{damageType:game.i18n.localize(CONFIG.PF2E.damageTypes[damageType]??damageType)}):game.i18n.localize(CONFIG.PF2E.damageTypes[damageType]??damageType),labelParts=breakdownDamage.map(d=>d.label);return labelParts[0]=`${labelParts[0].replace(/^\s+\+/,"")} ${damageTypeLabel}`,labelParts})(),formula=enclosed&&flavor?`${enclosed}${flavor}`:enclosed;return formula?{formula,breakdown}:[]})}__name(instancesFromTypeMap,"instancesFromTypeMap"),__name2(instancesFromTypeMap,"instancesFromTypeMap");function createPartialFormulas(partials,{criticalInclusion,doubleDice=!1}){return[null,"persistent","precision","splash"].flatMap(category=>{const requestedPartials=(partials.get(category)??[]).filter(p=>criticalInclusion.includes(p.critical)),term=(()=>{const expression=createSimpleFormula(requestedPartials,{doubleDice});return expression==="0"?"":["precision","splash"].includes(category??"")&&hasOperators(expression)?`(${expression})`:expression})();return(term&&category&&category!=="persistent"?term.endsWith("]")?`(${term})[${category}]`:`${term}[${category}]`:term)||[]})}__name(createPartialFormulas,"createPartialFormulas"),__name2(createPartialFormulas,"createPartialFormulas");function combinePartialTerms(terms){const modifier=terms.reduce((total,p)=>total+p.modifier,0),constantTerm=modifier?{dice:null,modifier}:null,dice=terms.filter(p=>!!p.dice&&p.dice.number>0).sort(sortBy(t=>-t.dice.faces)),combinedDice=[...groupBy(dice,t=>t.dice.faces).values()].map(terms2=>({modifier:0,dice:{...terms2[0].dice,number:sum(terms2.map(d=>d.dice.number))}})),combined=compact([...combinedDice,constantTerm]);return combined.length?combined:[{dice:null,modifier:0}]}__name(combinePartialTerms,"combinePartialTerms"),__name2(combinePartialTerms,"combinePartialTerms");function createSimpleFormula(terms,{doubleDice}={}){terms=combinePartialTerms(terms);const constant=terms.find(t=>!!t.modifier)?.modifier??0;return[terms.filter(t=>!!t.dice&&t.dice.number>0).map(term=>{const number=doubleDice?term.dice.number*2:term.dice.number,faces=term.dice.faces;return doubleDice?`${number}d${faces}[doubled]`:`${number}d${faces}`}).join(" + "),Math.abs(constant)].filter(e=>!!e).map(e=>typeof e=="number"&&doubleDice?`2 * ${e}`:e).join(constant>0?" + ":" - ")||"0"}__name(createSimpleFormula,"createSimpleFormula"),__name2(createSimpleFormula,"createSimpleFormula");function parseTermsFromSimpleFormula(formula,options){return(formula instanceof Roll?formula:new Roll(formula,options?.rollData)).terms.reduceRight((result,term)=>{if(term.expression===" + ")return result;if(term.expression===" - "){const termToModify=result[0];return termToModify&&(termToModify.modifier&&(termToModify.modifier*=-1),termToModify.dice&&(termToModify.dice.number*=-1)),result}return result.unshift({modifier:term instanceof NumericTerm?term.number:0,dice:term instanceof Die?{faces:term.faces,number:term.number}:null}),result},[])}__name(parseTermsFromSimpleFormula,"parseTermsFromSimpleFormula"),__name2(parseTermsFromSimpleFormula,"parseTermsFromSimpleFormula");function sumExpression(terms,{double=!1}={}){if(terms.every(t=>!t))return null;const summed=terms.filter(p=>!!p).join(" + ")||null,enclosed=double&&hasOperators(summed)?`(${summed})`:summed;return double?`2 * ${enclosed}`:enclosed}__name(sumExpression,"sumExpression"),__name2(sumExpression,"sumExpression");function hasOperators(formula){return/[-+*/]/.test(formula??"")}__name(hasOperators,"hasOperators"),__name2(hasOperators,"hasOperators");function ensureValidFormulaHead(formula){if(!formula)return null;const isWrapped=/^\(.*\)$/.test(formula),isSimple=/^\d+(d\d+)?$/.test(formula);return isWrapped||isSimple?formula:`(${formula})`}__name(ensureValidFormulaHead,"ensureValidFormulaHead"),__name2(ensureValidFormulaHead,"ensureValidFormulaHead");const _ArithmeticExpression=class _ArithmeticExpression2 extends RollTerm{static{__name(this,"_ArithmeticExpression")}operator;operands;constructor(termData){super(termData),this.operator=termData.operator,this.operands=termData.operands.slice(0,2).map(datum=>{if(datum instanceof RollTerm)return datum;const TermCls=CONFIG.Dice.termTypes[datum.class??""]??Object.values(CONFIG.Dice.terms).find(t=>t.name===datum.class)??Die;return simplifyTerm(TermCls.fromData(datum))}),this.operator==="*"&&this.operands[0]instanceof NumericTerm&&tupleHasValue([2,3],this.operands[0].number)&&markAsCrit(this.operands[1],this.operands[0].number)}static fromData(data){return super.fromData({...data,class:"ArithmeticExpression"})}static totalOf(operator,left,right){if(!(left===void 0||right===void 0))switch(operator){case"+":return left+right;case"-":return left-right;case"*":return left*right;case"/":return left/right;case"%":return left%right}}get dice(){return this.operands.flatMap(o=>o instanceof DiceTerm?o:o instanceof Grouping||o instanceof _ArithmeticExpression2||o instanceof IntermediateDie?o.dice:[])}get expression(){if(this.isDeterministic&&typeof this.total=="number"&&!Number.isNaN(this.total)&&!isFlavoredArithmetic(this))return this.total.toString();const{operator,operands}=this;return`${operands[0].expression} ${operator} ${operands[1].expression}`}get formula(){const{operator,operands}=this;return`${operands[0].formula} ${operator} ${operands[1].formula}`}get total(){if(!this._evaluated&&!this.isDeterministic)return;const operands=[Number(this.operands[0].total),Number(this.operands[1].total)];return _ArithmeticExpression2.totalOf(this.operator,...operands)}get critImmuneTotal(){if(!this._evaluated)return;const[left,right]=this.operands;if(left instanceof NumericTerm&&left.number===2&&this.operator==="*")return typeof right.total=="string"?Number(right.total):right.total;const undoubledLeft=(()=>left instanceof _ArithmeticExpression2||left instanceof Grouping?Number(left.critImmuneTotal):Number(left.total))(),undoubledRight=right instanceof _ArithmeticExpression2||right instanceof Grouping?Number(right.critImmuneTotal):Number(right.total);return _ArithmeticExpression2.totalOf(this.operator,undoubledLeft,undoubledRight)}get isDeterministic(){return this.operands.every(o=>o.isDeterministic)}get minimumValue(){const left=DamageInstance.getValue(this.operands[0],"minimum"),right=DamageInstance.getValue(this.operands[1],"minimum");return _ArithmeticExpression2.totalOf(this.operator,left,right)}get expectedValue(){const left=DamageInstance.getValue(this.operands[0]),right=DamageInstance.getValue(this.operands[1]);return _ArithmeticExpression2.totalOf(this.operator,left,right)}get maximumValue(){const left=DamageInstance.getValue(this.operands[0],"maximum"),right=DamageInstance.getValue(this.operands[1],"maximum");return _ArithmeticExpression2.totalOf(this.operator,left,right)}render(){const fragment=new DocumentFragment,{operator,operands}=this;if(operator==="*"&&operands[0]instanceof NumericTerm&&operands[1]instanceof NumericTerm)return fragment.append((operands[0].total*operands[1].total).toString()),fragment;const[left,right]=operands.map(o=>["precision","splash"].includes(o.flavor)?renderComponentDamage(o):isSystemDamageTerm(o)?o.render():o.expression);return fragment.append(left,` ${this.operator} `,right),fragment}async _evaluate(options={}){for(const operand of this.operands)operand._evaluated||await operand.evaluate({async:!0,...options});return this._evaluated=!0,this}toJSON(){return{...super.toJSON(),operands:[this.operands[0].toJSON(),this.operands[1].toJSON()]}}};__name2(_ArithmeticExpression,"ArithmeticExpression"),__publicField(_ArithmeticExpression,"SERIALIZE_ATTRIBUTES",["operator","operands"]);let ArithmeticExpression=_ArithmeticExpression;const _Grouping=class _Grouping2 extends RollTerm{static{__name(this,"_Grouping")}term;constructor(termData){const TermCls=CONFIG.Dice.termTypes[termData.term.class??""]??Object.values(CONFIG.Dice.terms).find(t=>t.name===termData.term.class)??NumericTerm,childTerm=simplifyTerm(TermCls.fromData(termData.term));childTerm instanceof _Grouping2?(super(childTerm.toJSON()),this.term=childTerm.term):(super(termData),this.term=childTerm),this._evaluated=termData.evaluated??this.term._evaluated??!0}static fromData(data){return super.fromData({...data,class:"Grouping"})}get dice(){if(this.term instanceof DiceTerm)return[this.term];if(isObject(this.term)&&"dice"in this.term){const{dice}=this.term;if(Array.isArray(dice)&&dice.every(d=>d instanceof DiceTerm))return dice}return[]}get expression(){return this.isDeterministic&&typeof this.total=="number"&&!Number.isNaN(this.total)&&!isFlavoredArithmetic(this.term)?this.total.toString():this.term instanceof DiceTerm||this.term instanceof MathTerm?this.term.expression:`(${this.term.expression})`}get formula(){const termFormula=this.term.formula,flavor=this.flavor?`[${this.flavor}]`:"";return`(${termFormula})${flavor}`}get total(){return this._evaluated||this.isDeterministic?Number(this.term.total):void 0}get critImmuneTotal(){return this.term instanceof ArithmeticExpression||this.term instanceof _Grouping2?this.term.critImmuneTotal:this.total}get isDeterministic(){return this.term.isDeterministic}get minimumValue(){return DamageInstance.getValue(this.term,"minimum")}get expectedValue(){return DamageInstance.getValue(this.term)}get maximumValue(){return DamageInstance.getValue(this.term,"maximum")}async _evaluate(options={}){return this.term._evaluated||await this.term.evaluate({async:!0,...options}),this._evaluated=!0,this}toJSON(){return{...super.toJSON(),term:this.term.toJSON()}}render(){const expression=["precision","splash"].includes(this.flavor)?renderComponentDamage(this.term):isSystemDamageTerm(this.term)?this.term.render():this.expression,fragment=new DocumentFragment,nodes=this.term instanceof NumericTerm||this.term instanceof Die?[expression]:["(",expression,")"];return fragment.append(...nodes),fragment}};__name2(_Grouping,"Grouping"),__publicField(_Grouping,"SERIALIZE_ATTRIBUTES",["term"]);let Grouping=_Grouping;const _IntermediateDie=class extends RollTerm{static{__name(this,"_IntermediateDie")}number;faces;die;constructor(data){super(data);const setTerm=__name2(termData=>{if(typeof termData=="number")return termData;const TermCls=CONFIG.Dice.termTypes[termData.class??"NumericTerm"],term=simplifyTerm(TermCls.fromData(termData));return term instanceof NumericTerm?term.number:term.isDeterministic?Roll.safeEval(term.formula):term instanceof Grouping?(term.isIntermediate=!0,term):(term instanceof MathTerm||console.warn(`Unexpected term type: ${term.constructor.name}`),term)},"setTerm");this.number=setTerm(data.number),this.faces=setTerm(data.faces),this.die=(()=>data.die?Die.fromData({...data.die,class:"Die"}):typeof this.number=="number"&&typeof this.faces=="number"?Die.fromData({number:this.number,faces:this.faces,evaluated:this._evaluated,options:this.options}):null)()}get expression(){return this.die?.expression??`${this.number}d${this.faces}`}get total(){return this.isDeterministic?Number(this.number)*Number(this.faces):this.die?.total}get dice(){return this.die?[this.die]:[]}get isDeterministic(){return this.number===0||this.faces===0||this.faces===1}get minimumValue(){return DamageInstance.getValue(this.die??new Die({number:Number(this.number),faces:Number(this.faces)}),"minimum")}get expectedValue(){return DamageInstance.getValue(this.die??new Die({number:Number(this.number),faces:Number(this.faces)}))}get maximumValue(){return DamageInstance.getValue(this.die??new Die({number:Number(this.number),faces:Number(this.faces)}),"maximum")}async _evaluate(){return typeof this.number!="number"&&(this.number=(await this.number.evaluate({async:!0})).total),typeof this.faces!="number"&&(this.faces=(await this.faces.evaluate({async:!0})).total),this.die=await new Die({number:this.number,faces:this.faces,options:this.options}).evaluate({async:!0}),this._evaluated=!0,this}toJSON(){return this.die?this.die.toJSON():typeof this.number=="number"&&typeof this.faces=="number"?Die.fromData({class:"Die",number:this.number,faces:this.faces,evaluated:this._evaluated,options:this.options}):{...super.toJSON(),number:typeof this.number=="number"?this.number:this.number.toJSON(),faces:typeof this.faces=="number"?this.faces:this.faces.toJSON()}}};__name2(_IntermediateDie,"IntermediateDie"),__publicField(_IntermediateDie,"SERIALIZE_ATTRIBUTES",["number","faces","die"]);let IntermediateDie=_IntermediateDie;const _InstancePool=class extends PoolTerm{static{__name(this,"_InstancePool")}static fromRolls(rolls=[]){const allEvaluated=rolls.every(r=>r._evaluated),noneEvaluated=!rolls.some(r=>r._evaluated);if(!(allEvaluated||noneEvaluated))return super.fromRolls(rolls);const pool=new this({terms:rolls.map(r=>r._formula),modifiers:[],rolls,results:allEvaluated?rolls.map(r=>({result:r.total,active:!0})):[]});return pool._evaluated=allEvaluated,pool}};__name2(_InstancePool,"InstancePool");let InstancePool=_InstancePool;function nextDamageDieSize(next){const[faces,direction]="upgrade"in next?[next.upgrade,1]:[next.downgrade,-1];return DAMAGE_DIE_FACES_TUPLE[DAMAGE_DIE_FACES_TUPLE.indexOf(faces)+direction]??faces}__name(nextDamageDieSize,"nextDamageDieSize"),__name2(nextDamageDieSize,"nextDamageDieSize");const DamageCategorization={fromDamageType:damageType=>BASE_DAMAGE_TYPES_TO_CATEGORIES[damageType],allCategories:()=>new Set(Object.values(BASE_DAMAGE_TYPES_TO_CATEGORIES)),baseCategories:()=>new Set(Object.values(BASE_DAMAGE_TYPES_TO_CATEGORIES)),toDamageTypes:category=>{const types=Object.entries(BASE_DAMAGE_TYPES_TO_CATEGORIES).filter(([_key,value])=>value===category).map(([key])=>key);return new Set(types)}},FACES=[4,6,8,10,12];function applyDamageDiceOverrides(baseEntries,dice,options={}){const critical=options.critical??!1,maxIncreases=options.maxIncreases??1/0,overrideDice=dice.filter(d=>!d.ignored&&!!d.override);if(overrideDice.length)for(const base of baseEntries){const die=base.terms?.find(t=>!!t.dice);if(base.terms&&!die)continue;const adjustments=overrideDice.filter(m=>(m.critical===null||critical&&m.critical||!critical&&!m.critical)&&(!m.damageType||m.damageType===base.damageType)),numUpgrades=Math.min(maxIncreases,adjustments.filter(d=>d.override?.upgrade).length),numDowngrades=Math.min(maxIncreases,adjustments.filter(d=>d.override?.downgrade).length),delta=numUpgrades-numDowngrades;for(let i=0;i0?1:-1;die.dice.faces=FACES[FACES.indexOf(die.dice.faces)+direction]??die.dice.faces}else base.dieSize&&(base.dieSize=delta>0?nextDamageDieSize({upgrade:base.dieSize}):nextDamageDieSize({downgrade:base.dieSize}));for(const adjustment of adjustments)if(adjustment.override){base.damageType=adjustment.override.damageType??base.damageType;for(const die2 of dice.filter(d=>/^(?:deadly|fatal)-/.test(d.slug)))die2.damageType=adjustment.override.damageType??die2.damageType;if(die){if(die.dice.number=adjustment.override.diceNumber??die.dice.number,adjustment.override.dieSize){const faces=Number(/\d{1,2}/.exec(adjustment.override.dieSize)?.shift());Number.isInteger(faces)&&(die.dice.faces=faces)}}else base.dieSize=adjustment.override.dieSize??base.dieSize,base.diceNumber=adjustment.override.diceNumber??base.diceNumber}}}__name(applyDamageDiceOverrides,"applyDamageDiceOverrides"),__name2(applyDamageDiceOverrides,"applyDamageDiceOverrides");function extractBaseDamage(roll){function recursiveExtractTerms(expression,{category=null}={}){if(category=setHasElement(DAMAGE_CATEGORIES_UNIQUE,expression.options.flavor)?expression.options.flavor:category,expression instanceof Grouping)return recursiveExtractTerms(expression.term,{category});if(expression instanceof Die)return[{dice:pick$1(expression,["number","faces"]),modifier:0,category}];if(expression instanceof IntermediateDie){if(typeof expression.number!="number"||typeof expression.faces!="number")throw ErrorPF2e("Unable to parse DamageRoll with non-deterministic intermediate expressions.");return[{dice:{number:expression.number,faces:expression.faces},modifier:0,category}]}if(expression.isDeterministic)return[{dice:null,modifier:DamageInstance.getValue(expression,"expected"),category}];if(expression instanceof ArithmeticExpression){const operator=expression.operator;if(operator==="*"||operator==="/")throw ErrorPF2e(`Cannot use ${operator} on non-deterministic artithmetic terms`);const leftTerms=recursiveExtractTerms(expression.operands[0],{category}),rightTerms=recursiveExtractTerms(expression.operands[1],{category});if(operator==="-")for(const term of rightTerms)term.dice&&(term.dice.number*=-1),term.modifier*=-1;const groups=groupBy$1([...leftTerms,...rightTerms],t=>t.category??"");return Object.values(groups).flatMap(terms=>{const category2=terms[0].category;return combinePartialTerms(terms).map(t=>({...t,category:category2}))})}throw expression.isDeterministic?ErrorPF2e("Unrecognized roll term type "+expression.constructor.name):ErrorPF2e(`Unable to parse DamageRoll with non-deterministic ${expression.constructor.name}.`)}return __name(recursiveExtractTerms,"recursiveExtractTerms"),__name2(recursiveExtractTerms,"recursiveExtractTerms"),roll.instances.flatMap(instance=>{const category=setHasElement(DAMAGE_CATEGORIES_UNIQUE,instance.category)?instance.category:null,terms=recursiveExtractTerms(instance.head,{category});return Object.values(groupBy$1(terms,t=>t.category??"")).map(terms2=>{const category2=instance.persistent?"persistent":terms2[0].category;return{damageType:instance.type,category:category2,terms:terms2.map(t=>omit(t,["category"]))}})})}__name(extractBaseDamage,"extractBaseDamage"),__name2(extractBaseDamage,"extractBaseDamage");function renderComponentDamage(term){if(!["precision","splash"].includes(term.flavor))throw ErrorPF2e("Unexpected error rendering damage roll");const span=document.createElement("span");span.className=term.flavor;const[title,faClass]=term.flavor==="precision"?[game.i18n.localize("PF2E.Damage.Precision"),"crosshairs"]:[game.i18n.localize("PF2E.TraitSplash"),"burst"];span.title=title;const icon=fontAwesomeIcon(faClass);return icon.classList.add("icon"),span.append(term.expression," ",icon),span}__name(renderComponentDamage,"renderComponentDamage"),__name2(renderComponentDamage,"renderComponentDamage");function isSystemDamageTerm(term){return term instanceof ArithmeticExpression||term instanceof Grouping}__name(isSystemDamageTerm,"isSystemDamageTerm"),__name2(isSystemDamageTerm,"isSystemDamageTerm");function deepFindTerms(term,{flavor}){const childTerms=term instanceof Grouping?[term.term]:term instanceof ArithmeticExpression?term.operands:[];return[term.flavor.split(",").includes(flavor)?[term]:[],childTerms.map(t=>deepFindTerms(t,{flavor})).flat()].flat()}__name(deepFindTerms,"deepFindTerms"),__name2(deepFindTerms,"deepFindTerms");function simplifyTerm(term){if(term instanceof IntermediateDie)return term.die??term;const shouldPreserve=__name2(t=>!t.isDeterministic||t instanceof NumericTerm||isFlavoredArithmetic(t),"shouldPreserve");if(shouldPreserve(term)||term instanceof Grouping&&shouldPreserve(term.term))return term;try{const total=term.total??Roll.defaultImplementation.safeEval(term.expression);if(typeof total!="number"||Number.isNaN(total))throw Error(`Unable to evaluate deterministic term: ${term.expression}`);return NumericTerm.fromData({class:"NumericTerm",number:total,evaluated:term._evaluated,options:term.options})}catch{return term}}__name(simplifyTerm,"simplifyTerm"),__name2(simplifyTerm,"simplifyTerm");function isFlavoredArithmetic(term){return term instanceof ArithmeticExpression&&term.operands.some(o=>o.options.flavor)}__name(isFlavoredArithmetic,"isFlavoredArithmetic"),__name2(isFlavoredArithmetic,"isFlavoredArithmetic");function looksLikeDamageRoll(roll){const{dice}=roll;return dice.length===0||dice.some(d=>[4,6,8,10,12].includes(d.faces??20))&&!dice.some(d=>[2,20].includes(d.faces??20))}__name(looksLikeDamageRoll,"looksLikeDamageRoll"),__name2(looksLikeDamageRoll,"looksLikeDamageRoll");function damageDiceIcon(roll,{fixedWidth=!1}={}){const firstTerm=roll instanceof DamageRoll&&roll.instances[0]?.head instanceof IntermediateDie?roll.instances[0]?.head:null;if(firstTerm?.faces instanceof NumericTerm&&[4,8,6,10,12].includes(firstTerm.faces.number))return fontAwesomeIcon(`dice-d${firstTerm.faces.number}`,{fixedWidth});const firstDice=roll.dice.at(0),glyph=firstDice instanceof Die&&[4,8,6,10,12].includes(firstDice.faces)?`dice-d${firstDice.faces}`:firstDice?"dice-d20":"calculator";return fontAwesomeIcon(glyph,{fixedWidth})}__name(damageDiceIcon,"damageDiceIcon"),__name2(damageDiceIcon,"damageDiceIcon");function markAsCrit(term,multiplier){term.options.crit=multiplier,term instanceof ArithmeticExpression?(markAsCrit(term.operands[0],multiplier),markAsCrit(term.operands[1],multiplier)):term instanceof Grouping&&markAsCrit(term.term,multiplier)}__name(markAsCrit,"markAsCrit"),__name2(markAsCrit,"markAsCrit");const _AbstractDamageRoll=class extends Roll{static{__name(this,"_AbstractDamageRoll")}constructor(formula,data={},options={}){options.critRule=(()=>tupleHasValue(["double-damage","double-dice"],options.critRule)?options.critRule:game.settings.get("pf2e","critRule")==="doubledamage"?"double-damage":"double-dice")(),super(formula,data,options)}static replaceFormulaData(formula,data,options={}){return super.replaceFormulaData(formula.trim(),data,options).replace(/(?{AbstractDamageRoll.parser=function(){function createNumericTerm(number,{flavor=null,truncate=!1}={}){number=truncate?Math.trunc(number):number;const formula=flavor?`${number}[${flavor}]`:number.toString(),obj={class:"NumericTerm",number,formula,evaluated:!1};return flavor&&(obj.options={flavor}),obj}__name(createNumericTerm,"createNumericTerm"),__name2(createNumericTerm,"createNumericTerm");function peg$subclass(child,parent){function C(){this.constructor=child}__name(C,"C"),__name2(C,"C"),C.prototype=parent.prototype,child.prototype=new C}__name(peg$subclass,"peg$subclass"),__name2(peg$subclass,"peg$subclass");function peg$SyntaxError(message,expected,found,location){var self=Error.call(this,message);return Object.setPrototypeOf&&Object.setPrototypeOf(self,peg$SyntaxError.prototype),self.expected=expected,self.found=found,self.location=location,self.name="SyntaxError",self}__name(peg$SyntaxError,"peg$SyntaxError"),__name2(peg$SyntaxError,"peg$SyntaxError"),peg$subclass(peg$SyntaxError,Error);function peg$padEnd(str,targetLength,padString){return padString=padString||" ",str.length>targetLength?str:(targetLength-=str.length,padString+=padString.repeat(targetLength),str+padString.slice(0,targetLength))}__name(peg$padEnd,"peg$padEnd"),__name2(peg$padEnd,"peg$padEnd"),peg$SyntaxError.prototype.format=function(sources){var str="Error: "+this.message;if(this.location){var src=null,k;for(k=0;k `+loc+` +`+filler+` | +`+offset_s.line+" | "+line+` +`+filler+" | "+peg$padEnd("",s.column-1," ")+peg$padEnd("",hatLen,"^")}else str+=` + at `+loc}return str},peg$SyntaxError.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch){return ch.charCodeAt(0).toString(16).toUpperCase()}__name(hex,"hex"),__name2(hex,"hex");function literalEscape(s){return s.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch){return"\\x0"+hex(ch)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return"\\x"+hex(ch)})}__name(literalEscape,"literalEscape"),__name2(literalEscape,"literalEscape");function classEscape(s){return s.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch){return"\\x0"+hex(ch)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return"\\x"+hex(ch)})}__name(classEscape,"classEscape"),__name2(classEscape,"classEscape");function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}__name(describeExpectation,"describeExpectation"),__name2(describeExpectation,"describeExpectation");function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i,j;if(descriptions.sort(),descriptions.length>0){for(i=1,j=1;i{const operator=elements[1],operands=[result,elements.find(e=>typeof e=="number"||e instanceof Object&&e.class)].map(e=>typeof e=="number"?createNumericTerm(e,{truncate:!0}):e);return{class:"ArithmeticExpression",formula:text(),operator,operands,evaluated:!1}},head)},"peg$f0"),peg$f1=__name2(function(head,tail){return tail.reduce((result,elements)=>{const operator=elements[1],operands=[result,elements.find(e=>typeof e=="number"||e instanceof Object&&e.class)].map(e=>typeof e=="number"?createNumericTerm(e):e);return{class:"ArithmeticExpression",formula:text(),operator,operands,evaluated:!1}},head)},"peg$f1"),peg$f2=__name2(function(fn,head,tail){const terms=head!==null?[head,...tail].map(t=>typeof t=="number"?t.toString():t.formula):[];return{class:"MathTerm",formula:text(),fn,terms,evaluated:!1}},"peg$f2"),peg$f3=__name2(function(number,faces,modifiers,flavor){const obj=number instanceof Object||faces instanceof Object?{class:"IntermediateDie",formula:text(),number:typeof number=="number"?createNumericTerm(number):number,faces:typeof faces=="number"?createNumericTerm(faces):faces,evaluated:!1}:{class:"DiceTerm",formula:text(),number:number??1,faces,evaluated:!1};return modifiers&&(obj.modifiers=modifiers),flavor&&(obj.options={flavor}),obj},"peg$f3"),peg$f4=__name2(function(expression,flavor){const obj={class:"Grouping",formula:text(),term:typeof expression=="number"?createNumericTerm(expression):expression,evaluated:!1};return flavor&&(obj.options={flavor}),obj},"peg$f4"),peg$f5=__name2(function(head,tail,modifiers,flavor){const headTerm=typeof head=="number"?createNumericTerm(head):head,tailTerms=tail.map(t=>typeof t=="number"?createNumericTerm(t):t),terms=[headTerm.formula,...tailTerms.map(t=>t.formula)],firstRoll={class:"DamageInstance",formula:headTerm.formula,terms:[headTerm],evaluated:!1};headTerm.options?.flavor&&(firstRoll.options={flavor:headTerm.options.flavor});const rolls=[firstRoll,...tailTerms.map(term=>{const obj2={class:"DamageInstance",formula:term.formula,terms:[term],evaluated:!1};return term.options?.flavor&&(obj2.options={flavor:term.options.flavor}),obj2})],obj={class:"InstancePool",formula:text(),terms,rolls,evaluated:!1};return flavor&&(obj.options={flavor}),modifiers&&(obj.modifiers=modifiers),obj},"peg$f5"),peg$f6=__name2(function(string){return string},"peg$f6"),peg$f7=__name2(function(){const numified=Number(text());return input===text()?createNumericTerm(numified):numified},"peg$f7"),peg$f8=__name2(function(number,flavor){return createNumericTerm(number,{flavor})},"peg$f8"),peg$f9=__name2(function(){return Array.from(text().matchAll(/([A-z]+)([^A-z\s()+\-*\/]+)?/g)).map(m=>m[0])},"peg$f9"),peg$currPos=0,peg$savedPos=0,peg$posDetailsCache=[{line:1,column:1}],peg$maxFailPos=0,peg$maxFailExpected=[],peg$silentFails=0,peg$result;if("startRule"in options){if(!(options.startRule in peg$startRuleFunctions))throw new Error(`Can't start parsing from rule "`+options.startRule+'".');peg$startRuleFunction=peg$startRuleFunctions[options.startRule]}function text(){return input.substring(peg$savedPos,peg$currPos)}__name(text,"text"),__name2(text,"text");function peg$literalExpectation(text2,ignoreCase){return{type:"literal",text:text2,ignoreCase}}__name(peg$literalExpectation,"peg$literalExpectation"),__name2(peg$literalExpectation,"peg$literalExpectation");function peg$classExpectation(parts,inverted,ignoreCase){return{type:"class",parts,inverted,ignoreCase}}__name(peg$classExpectation,"peg$classExpectation"),__name2(peg$classExpectation,"peg$classExpectation");function peg$endExpectation(){return{type:"end"}}__name(peg$endExpectation,"peg$endExpectation"),__name2(peg$endExpectation,"peg$endExpectation");function peg$otherExpectation(description){return{type:"other",description}}__name(peg$otherExpectation,"peg$otherExpectation"),__name2(peg$otherExpectation,"peg$otherExpectation");function peg$computePosDetails(pos){var details=peg$posDetailsCache[pos],p;if(details)return details;for(p=pos-1;!peg$posDetailsCache[p];)p--;for(details=peg$posDetailsCache[p],details={line:details.line,column:details.column};ppeg$maxFailPos&&(peg$maxFailPos=peg$currPos,peg$maxFailExpected=[]),peg$maxFailExpected.push(expected))}__name(peg$fail,"peg$fail"),__name2(peg$fail,"peg$fail");function peg$buildStructuredError(expected,found,location){return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected,found),expected,found,location)}__name(peg$buildStructuredError,"peg$buildStructuredError"),__name2(peg$buildStructuredError,"peg$buildStructuredError");function peg$parseExpression(){var s0,s1,s2,s3,s4,s5,s6,s7;if(s0=peg$currPos,s1=peg$parsePool(),s1===peg$FAILED&&(s1=peg$parseTerm()),s1!==peg$FAILED){for(s2=[],s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===43?(s5=peg$c0,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e0)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===45?(s5=peg$c1,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e1))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parsePool(),s7===peg$FAILED&&(s7=peg$parseTerm()),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);s3!==peg$FAILED;)s2.push(s3),s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===43?(s5=peg$c0,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e0)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===45?(s5=peg$c1,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e1))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parsePool(),s7===peg$FAILED&&(s7=peg$parseTerm()),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);peg$savedPos=s0,s0=peg$f0(s1,s2)}else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseExpression,"peg$parseExpression"),__name2(peg$parseExpression,"peg$parseExpression");function peg$parseTerm(){var s0,s1,s2,s3,s4,s5,s6,s7;if(s0=peg$currPos,s1=peg$parseTermOperand(),s1!==peg$FAILED){for(s2=[],s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===42?(s5=peg$c2,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e2)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===47?(s5=peg$c3,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e3))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parseTermOperand(),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);s3!==peg$FAILED;)s2.push(s3),s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===42?(s5=peg$c2,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e2)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===47?(s5=peg$c3,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e3))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parseTermOperand(),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);peg$savedPos=s0,s0=peg$f1(s1,s2)}else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseTerm,"peg$parseTerm"),__name2(peg$parseTerm,"peg$parseTerm");function peg$parseTermOperand(){var s0;return s0=peg$parseDiceTerm(),s0===peg$FAILED&&(s0=peg$parseMathTerm(),s0===peg$FAILED&&(s0=peg$parseGrouping(),s0===peg$FAILED&&(s0=peg$parseFlavoredNumber(),s0===peg$FAILED&&(s0=peg$parseNumber())))),s0}__name(peg$parseTermOperand,"peg$parseTermOperand"),__name2(peg$parseTermOperand,"peg$parseTermOperand");function peg$parseMathTerm(){var s0,s1,s2,s4,s6,s7,s8,s9,s11;if(s0=peg$currPos,s1=peg$parseIdentifier(),s1!==peg$FAILED)if(input.charCodeAt(peg$currPos)===40?(s2=peg$c4,peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e4)),s2!==peg$FAILED){for(peg$parse_(),s4=peg$parseExpression(),s4===peg$FAILED&&(s4=null),peg$parse_(),s6=[],s7=peg$currPos,s8=peg$parse_(),input.charCodeAt(peg$currPos)===44?(s9=peg$c5,peg$currPos++):(s9=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s9!==peg$FAILED?(peg$parse_(),s11=peg$parseExpression(),s11!==peg$FAILED?s7=s11:(peg$currPos=s7,s7=peg$FAILED)):(peg$currPos=s7,s7=peg$FAILED);s7!==peg$FAILED;)s6.push(s7),s7=peg$currPos,s8=peg$parse_(),input.charCodeAt(peg$currPos)===44?(s9=peg$c5,peg$currPos++):(s9=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s9!==peg$FAILED?(peg$parse_(),s11=peg$parseExpression(),s11!==peg$FAILED?s7=s11:(peg$currPos=s7,s7=peg$FAILED)):(peg$currPos=s7,s7=peg$FAILED);s7=peg$parse_(),input.charCodeAt(peg$currPos)===41?(s8=peg$c6,peg$currPos++):(s8=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e6)),s8!==peg$FAILED?(peg$savedPos=s0,s0=peg$f2(s1,s4,s6)):(peg$currPos=s0,s0=peg$FAILED)}else peg$currPos=s0,s0=peg$FAILED;else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseMathTerm,"peg$parseMathTerm"),__name2(peg$parseMathTerm,"peg$parseMathTerm");function peg$parseDiceTerm(){var s0,s1,s2,s3,s4,s5;return s0=peg$currPos,s1=peg$parseGrouping(),s1===peg$FAILED&&(s1=peg$parseMathTerm(),s1===peg$FAILED&&(s1=peg$parseNumber())),s1===peg$FAILED&&(s1=null),peg$r0.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e7)),s2!==peg$FAILED?(s3=peg$parseGrouping(),s3===peg$FAILED&&(s3=peg$parseMathTerm(),s3===peg$FAILED&&(s3=peg$parseNumber(),s3===peg$FAILED&&(s3=peg$parseIdentifier()))),s3!==peg$FAILED?(s4=peg$parseModifiers(),s4===peg$FAILED&&(s4=null),s5=peg$parseFlavor(),s5===peg$FAILED&&(s5=null),peg$savedPos=s0,s0=peg$f3(s1,s3,s4,s5)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseDiceTerm,"peg$parseDiceTerm"),__name2(peg$parseDiceTerm,"peg$parseDiceTerm");function peg$parseGrouping(){var s0,s1,s3,s5,s6;return s0=peg$currPos,input.charCodeAt(peg$currPos)===40?(s1=peg$c4,peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e4)),s1!==peg$FAILED?(peg$parse_(),s3=peg$parseExpression(),s3!==peg$FAILED?(peg$parse_(),input.charCodeAt(peg$currPos)===41?(s5=peg$c6,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e6)),s5!==peg$FAILED?(s6=peg$parseFlavor(),s6===peg$FAILED&&(s6=null),peg$savedPos=s0,s0=peg$f4(s3,s6)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseGrouping,"peg$parseGrouping"),__name2(peg$parseGrouping,"peg$parseGrouping");function peg$parsePool(){var s0,s1,s3,s4,s5,s6,s7,s8;if(s0=peg$currPos,input.charCodeAt(peg$currPos)===123?(s1=peg$c7,peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e8)),s1!==peg$FAILED)if(peg$parse_(),s3=peg$parseExpression(),s3!==peg$FAILED){for(s4=[],s5=peg$currPos,input.charCodeAt(peg$currPos)===44?(s6=peg$c5,peg$currPos++):(s6=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s6!==peg$FAILED?(s7=peg$parse_(),s8=peg$parseExpression(),s8!==peg$FAILED?s5=s8:(peg$currPos=s5,s5=peg$FAILED)):(peg$currPos=s5,s5=peg$FAILED);s5!==peg$FAILED;)s4.push(s5),s5=peg$currPos,input.charCodeAt(peg$currPos)===44?(s6=peg$c5,peg$currPos++):(s6=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s6!==peg$FAILED?(s7=peg$parse_(),s8=peg$parseExpression(),s8!==peg$FAILED?s5=s8:(peg$currPos=s5,s5=peg$FAILED)):(peg$currPos=s5,s5=peg$FAILED);input.charCodeAt(peg$currPos)===125?(s5=peg$c8,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e9)),s5!==peg$FAILED?(s6=peg$parseModifiers(),s6===peg$FAILED&&(s6=null),s7=peg$parseFlavor(),s7===peg$FAILED&&(s7=null),peg$savedPos=s0,s0=peg$f5(s3,s4,s6,s7)):(peg$currPos=s0,s0=peg$FAILED)}else peg$currPos=s0,s0=peg$FAILED;else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parsePool,"peg$parsePool"),__name2(peg$parsePool,"peg$parsePool");function peg$parseFlavor(){var s0,s1,s2,s3;return s0=peg$currPos,input.charCodeAt(peg$currPos)===91?(s1=peg$c9,peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e10)),s1!==peg$FAILED?(s2=peg$currPos,s3=peg$parseFlavorString(),s3!==peg$FAILED?s2=input.substring(s2,peg$currPos):s2=s3,s2!==peg$FAILED?(input.charCodeAt(peg$currPos)===93?(s3=peg$c10,peg$currPos++):(s3=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e11)),s3!==peg$FAILED?(peg$savedPos=s0,s0=peg$f6(s2)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseFlavor,"peg$parseFlavor"),__name2(peg$parseFlavor,"peg$parseFlavor");function peg$parseNumber(){var s0,s3,s4,s5,s6,s7;if(s0=peg$currPos,peg$parse_(),peg$r1.test(input.charAt(peg$currPos))?(input.charAt(peg$currPos),peg$currPos++):peg$silentFails===0&&peg$fail(peg$e12),s3=[],peg$r2.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13)),s4!==peg$FAILED)for(;s4!==peg$FAILED;)s3.push(s4),peg$r2.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13));else s3=peg$FAILED;if(s3!==peg$FAILED){if(s4=peg$currPos,input.charCodeAt(peg$currPos)===46?(s5=peg$c11,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e14)),s5!==peg$FAILED){if(s6=[],peg$r2.test(input.charAt(peg$currPos))?(s7=input.charAt(peg$currPos),peg$currPos++):(s7=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13)),s7!==peg$FAILED)for(;s7!==peg$FAILED;)s6.push(s7),peg$r2.test(input.charAt(peg$currPos))?(s7=input.charAt(peg$currPos),peg$currPos++):(s7=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13));else s6=peg$FAILED;s6!==peg$FAILED?(s5=[s5,s6],s4=s5):(peg$currPos=s4,s4=peg$FAILED)}else peg$currPos=s4,s4=peg$FAILED;s4===peg$FAILED&&(s4=null),peg$savedPos=s0,s0=peg$f7()}else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseNumber,"peg$parseNumber"),__name2(peg$parseNumber,"peg$parseNumber");function peg$parseFlavoredNumber(){var s0,s1,s2;return s0=peg$currPos,s1=peg$parseNumber(),s1!==peg$FAILED?(s2=peg$parseFlavor(),s2!==peg$FAILED?(peg$savedPos=s0,s0=peg$f8(s1,s2)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseFlavoredNumber,"peg$parseFlavoredNumber"),__name2(peg$parseFlavoredNumber,"peg$parseFlavoredNumber");function peg$parseIdentifier(){var s0,s1,s2,s3,s4;if(s0=peg$currPos,s1=peg$currPos,peg$r3.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e15)),s2!==peg$FAILED){for(s3=[],peg$r4.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e16));s4!==peg$FAILED;)s3.push(s4),peg$r4.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e16));s2=[s2,s3],s1=s2}else peg$currPos=s1,s1=peg$FAILED;return s1!==peg$FAILED?s0=input.substring(s0,peg$currPos):s0=s1,s0}__name(peg$parseIdentifier,"peg$parseIdentifier"),__name2(peg$parseIdentifier,"peg$parseIdentifier");function peg$parseModifiers(){var s0,s1,s2;if(s0=peg$currPos,s1=[],peg$r5.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e17)),s2!==peg$FAILED)for(;s2!==peg$FAILED;)s1.push(s2),peg$r5.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e17));else s1=peg$FAILED;return s1!==peg$FAILED&&(peg$savedPos=s0,s1=peg$f9()),s0=s1,s0}__name(peg$parseModifiers,"peg$parseModifiers"),__name2(peg$parseModifiers,"peg$parseModifiers");function peg$parseFlavorString(){var s0,s1;if(peg$silentFails++,s0=[],peg$r6.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e19)),s1!==peg$FAILED)for(;s1!==peg$FAILED;)s0.push(s1),peg$r6.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e19));else s0=peg$FAILED;return peg$silentFails--,s0===peg$FAILED&&(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e18)),s0}__name(peg$parseFlavorString,"peg$parseFlavorString"),__name2(peg$parseFlavorString,"peg$parseFlavorString");function peg$parse_(){var s0,s1;for(peg$silentFails++,s0=[],peg$r7.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e21));s1!==peg$FAILED;)s0.push(s1),peg$r7.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e21));return peg$silentFails--,s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e20),s0}if(__name(peg$parse_,"peg$parse_"),__name2(peg$parse_,"peg$parse_"),peg$result=peg$startRuleFunction(),peg$result!==peg$FAILED&&peg$currPos===input.length)return peg$result;throw peg$result!==peg$FAILED&&peg$currPos{try{return this.parser.parse(replaced)}catch{return console.error(`Failed to parse damage formula "${formula}"`),null}})();if(poolData){if(!["PoolTerm","InstancePool"].includes(poolData.class??""))throw ErrorPF2e("A damage roll must consist of a single InstancePool")}else return[];return this.classifyDice(poolData),[InstancePool.fromData(poolData)]}static validate(formula){formula=formula.trim();const wrapped=this.replaceFormulaData(formula.startsWith("{")?formula:`{${formula}}`,{});try{const result=this.parser.parse(wrapped.replace(/@([a-z.0-9_-]+)/gi,"1"));return isObject(result)&&"class"in result&&["PoolTerm","InstancePool"].includes(String(result.class))}catch{return!1}}static classifyDice(data){const isDiceTerm=__name2(v=>isObject(v)&&v.class==="DiceTerm","isDiceTerm"),deepFindDice=__name2(value=>{const accumulated=[];if(isDiceTerm(value))accumulated.push(value);else if(value instanceof Object){const objects=Object.values(value).filter(v=>v instanceof Object);accumulated.push(...objects.flatMap(o=>deepFindDice(o)))}return accumulated},"deepFindDice"),diceTerms=deepFindDice(data);for(const term of diceTerms)if(typeof term.faces=="number"||term.faces instanceof Object)term.class="Die";else if(typeof term.faces=="string"){const termClassName=CONFIG.Dice.terms[term.faces]?.name;if(!termClassName)throw ErrorPF2e(`No matching DiceTerm class for "${term.faces}"`);term.class=termClassName}}get pool(){const firstTerm=this.terms.at(0);return firstTerm instanceof InstancePool?firstTerm:null}get formula(){const{instances}=this,firstInstance=instances.at(0);if(firstInstance){if(instances.length===1&&firstInstance.head instanceof Grouping){const instanceFormula=firstInstance.formula;return instanceFormula.startsWith("(")?instanceFormula.slice(1).replace(/\)([^)]*)$/i,"$1"):instanceFormula}}else return super.formula;return instances.map(i=>i.formula).join(" + ")}get instances(){return this.pool?.rolls.filter(r=>r instanceof DamageInstance)??[]}get kinds(){return new Set(this.instances.flatMap(i=>Array.from(i.kinds)))}get materials(){return new Set(this.instances.flatMap(i=>Array.from(i.materials)))}get dice(){const{instances}=this;return instances.length>0?instances.flatMap(i=>i.dice):super.dice}get minimumValue(){return this.instances.reduce((sum2,i)=>sum2+i.minimumValue,0)}get expectedValue(){return this.instances.reduce((sum2,i)=>sum2+i.expectedValue,0)}get maximumValue(){return this.instances.reduce((sum2,i)=>sum2+i.maximumValue,0)}static fromData(data){for(const term of data.terms)this.classifyDice(term);return super.fromData(data)}_evaluateTotal(){const total=super._evaluateTotal();return this.instances.some(i=>!i.persistent)&&total<=0?(this.options.increasedFrom=total,Promise.resolve().then(()=>{this.alter(1,1-total)}),1):total}async getTooltip(){const instances=this.instances.filter(i=>i.dice.length>0&&(!i.persistent||i.options.evaluatePersistent)).map(i=>({type:i.type,typeLabel:i.typeLabel,iconClass:i.iconClass,dice:i.dice.map(d=>({...d.getTooltipData()}))}));return renderTemplate(this.constructor.TOOLTIP_TEMPLATE,{instances})}async render({flavor,template=this.constructor.CHAT_TEMPLATE,isPrivate=!1}={}){const{instances}=this;if(!instances.at(-1))return super.render({flavor,template,isPrivate});this._evaluated||await this.evaluate({async:!0});const chatData={formula:isPrivate?"???":(await Promise.all(instances.map(i=>i.render()))).join(" + "),user:game.user.id,tooltip:isPrivate||this.dice.length===0?"":await this.getTooltip(),instances:isPrivate?[]:instances,total:isPrivate?"?":Math.floor(this.total*100/100),increasedFrom:this.options.increasedFrom,splashOnly:!!this.options.splashOnly,healingOnly:!this.kinds.has("damage"),allPersistent:this.instances.every(i=>i.persistent&&!i.options.evaluatePersistent),showTripleDamage:game.settings.get("pf2e","critFumbleButtons")};return renderTemplate(template,chatData)}alter(multiplier,addend,{multiplyNumeric=!0}={}){const{instances}=this;if(!this._evaluated||instances.length===0)return super.alter(multiplier,addend,{multiplyNumeric});if(multiplier===1&&addend===0)return this;const instanceClones=multiplier===1?this.instances.map(i=>DamageInstance.fromData(i.toJSON())):instances.map(instance=>{const{head}=instance,rightOperand=head instanceof ArithmeticExpression&&["+","-"].includes(head.operator)?{class:"Grouping",term:head.toJSON()}:head.toJSON(),multiplierTerm={class:"NumericTerm",number:multiplier},expression=ArithmeticExpression.fromData({operator:"*",operands:[deepClone(multiplierTerm),rightOperand]});return[2,3].includes(multiplier)&&(expression.options.crit=multiplier),DamageInstance.fromTerms([expression],deepClone(instance.options))});if(addend!==0){const firstInstance=instanceClones[0],term=firstInstance.head.toJSON(),options=term.options??{};delete term.options;const termClone={class:"Grouping",term,options},addendTerm={class:"NumericTerm",number:Math.abs(addend)},expression=ArithmeticExpression.fromData({operator:addend>0?"+":"-",operands:[termClone,addendTerm],evaluated:!0});instanceClones[0]=DamageInstance.fromTerms([expression],deepClone(firstInstance.options))}return _DamageRoll2.fromTerms([InstancePool.fromRolls(instanceClones)])}};__name2(_DamageRoll,"DamageRoll"),__publicField(_DamageRoll,"CHAT_TEMPLATE","systems/pf2e/templates/dice/damage-roll.hbs"),__publicField(_DamageRoll,"TOOLTIP_TEMPLATE","systems/pf2e/templates/dice/damage-tooltip.hbs");let DamageRoll=_DamageRoll;const _DamageInstance=class _DamageInstance2 extends AbstractDamageRoll{static{__name(this,"_DamageInstance")}constructor(formula,data={},options={}){super(formula.trim(),data,options),__privateAdd(this,_renderFormula),__publicField(this,"kinds"),__publicField(this,"type"),__publicField(this,"persistent"),__publicField(this,"materials");const flavorIdentifiers=options.flavor?.replace(/[^a-z,_-]/g,"").split(",")??[];this.type=flavorIdentifiers.find(t=>objectHasKey(CONFIG.PF2E.damageTypes,t))??"untyped",this.persistent=flavorIdentifiers.includes("persistent")||flavorIdentifiers.includes("bleed"),this.materials=new Set(flavorIdentifiers.filter(i=>objectHasKey(CONFIG.PF2E.materialDamageEffects,i))),!this.persistent&&this.materials.size===0&&["vitality","void","untyped"].includes(this.type)&&flavorIdentifiers.includes("healing")?flavorIdentifiers.includes("damage")?this.kinds=new Set(["damage","healing"]):this.kinds=new Set(["healing"]):this.kinds=new Set(["damage"])}static parse(formula,data){const replaced=this.replaceFormulaData(formula,data,{missing:"0"}),syntaxTree2=(()=>{try{return this.parser.parse(replaced)}catch{return console.error(`Failed to parse damage formula "${formula}"`),null}})();return syntaxTree2?(DamageRoll.classifyDice(syntaxTree2),[RollTerm.fromData(syntaxTree2)]):[]}static fromData(data){for(const term of data.terms)DamageRoll.classifyDice(term);const roll=super.fromData(data);return roll.terms=roll.terms.map(t=>simplifyTerm(t)),roll}static getValue(term,type="expected"){if(term instanceof NumericTerm)return term.number;if(term instanceof MathTerm)try{return Roll.safeEval(term.formula)}catch{return 0}switch(type){case"minimum":if(term instanceof Die)return term.number;if(term instanceof ArithmeticExpression||term instanceof Grouping||term instanceof IntermediateDie)return term.minimumValue;break;case"maximum":if(term instanceof Die)return term.number*term.faces;if(term instanceof ArithmeticExpression||term instanceof Grouping||term instanceof IntermediateDie)return term.maximumValue;break;default:{if(term instanceof Die)return term.number*((term.faces+1)/2);if(term instanceof ArithmeticExpression||term instanceof Grouping||term instanceof IntermediateDie)return term.expectedValue}}return 0}get formula(){const typeFlavor=game.i18n.localize(CONFIG.PF2E.damageRollFlavors[this.type]??this.type),damageType=this.persistent&&this.type!=="bleed"?game.i18n.format("PF2E.Damage.RollFlavor.persistent",{damageType:typeFlavor}):this.type!=="untyped"?typeFlavor:"";return[this.head.expression,damageType].join(" ").trim()}get total(){const maybeNumber=this.persistent&&!this.options.evaluatePersistent?0:super.total;return typeof maybeNumber=="number"?Math.floor(maybeNumber):maybeNumber}get minimumValue(){return _DamageInstance2.getValue(this.head,"minimum")}get expectedValue(){return _DamageInstance2.getValue(this.head)}get maximumValue(){return _DamageInstance2.getValue(this.head,"maximum")}get formalDescription(){const typeCategory=DamageCategorization.fromDamageType(this.type);return new Set(["damage",`damage:type:${this.type}`,typeCategory?`damage:category:${typeCategory}`:[],this.persistent?"damage:category:persistent":[],Array.from(this.materials).map(m=>`damage:material:${m}`)].flat())}get iconClass(){return DAMAGE_TYPE_ICONS[this.type]}_evaluateTotal(){return this.persistent&&!this.options.evaluatePersistent?0:super._evaluateTotal()}async render({tooltips=!0}={}){const span=document.createElement("span");if(span.classList.add(this.type,"damage","instance","color"),tooltips&&(span.dataset.tooltip=this.typeLabel),span.append(__privateMethod(this,_renderFormula,renderFormula_fn).call(this)),this.persistent&&this.type!=="bleed"){const icon=fontAwesomeIcon("hourglass",{style:"duotone"});icon.classList.add("icon"),span.append(" ",icon)}const{iconClass}=this;if(iconClass){(!this.persistent||this.type==="bleed")&&span.append(" ");const icon=fontAwesomeIcon(iconClass);icon.classList.add("icon"),span.append(icon)}return span.outerHTML}get dice(){return this._dice.concat(this.terms.reduce((dice,t)=>t instanceof DiceTerm?[...dice,t]:t instanceof Grouping||t instanceof ArithmeticExpression||t instanceof IntermediateDie?[...dice,...t.dice]:[],this._dice).flat())}get head(){return this.terms[0]}get category(){return DamageCategorization.fromDamageType(this.type)}get typeLabel(){const damageType=game.i18n.localize(CONFIG.PF2E.damageTypes[this.type]);return this.persistent&&this.type!=="bleed"?game.i18n.format("PF2E.Damage.PersistentTooltip",{damageType}):damageType}get critImmuneTotal(){if(!this._evaluated)return;const{head}=this,undoubledTotal=head instanceof ArithmeticExpression||head instanceof Grouping?head.critImmuneTotal:this.total;if(this.options.critRule==="double-damage")return undoubledTotal;{const secondHalf=this.dice.filter(d=>/\bdoubled\b/.test(d.flavor)).flatMap(d=>d.results.slice(Math.ceil(d.results.length/2)));return undoubledTotal-secondHalf.reduce((sum2,r)=>sum2+r.result,0)}}componentTotal(component){if(!this._evaluated)throw ErrorPF2e("Component totals may only be accessed from an evaluated damage instance");return deepFindTerms(this.head,{flavor:component}).reduce((total,t)=>total+(Number(t.total)||0)*Number(t.options.crit||1),0)}async _evaluate(params){if(await super._evaluate(params),this.persistent&&!this.options.evaluatePersistent){const results=this.dice.flatMap(d=>d.results);for(const result of results)result.hidden=!0}return this}};_renderFormula=new WeakSet,renderFormula_fn=__name2(function(){const head=this.head instanceof Grouping?this.head.term:this.head;return head instanceof ArithmeticExpression?head.render():["precision","splash"].includes(head.flavor)?renderComponentDamage(head):head.expression},"#renderFormula"),__name2(_DamageInstance,"DamageInstance");let DamageInstance=_DamageInstance;const{fields:fields$1,validation}=foundry.data,_ItemAlterationValidator=class extends fields$1.SchemaField{static{__name(this,"_ItemAlterationValidator")}constructor(fields2,options={}){super(fields2,options),__privateAdd(this,_validateForItem,void 0),__publicField(this,"operableOnInstances"),__publicField(this,"operableOnSource"),options.validateForItem&&__privateSet(this,_validateForItem,options.validateForItem),this.operableOnInstances=options.operableOnInstances??!0,this.operableOnSource=options.operableOnSource??!0}isValid(data){var _a;const{item,alteration}=data,failure=this.validate(alteration);if(failure)throw new validation.DataModelValidationError(failure);if(item.type!==alteration.itemType)return!1;const forItemFailure=(_a=__privateGet(this,_validateForItem))==null?void 0:_a.call(this,item);if(forItemFailure)throw new validation.DataModelValidationError(forItemFailure);if(!this.operableOnInstances&&item instanceof ItemPF2e)throw new validation.DataModelValidationError("may only be applied to source data");if(!this.operableOnSource&&!(item instanceof ItemPF2e))throw new validation.DataModelValidationError("may only be applied to existing items");return!0}};_validateForItem=new WeakMap,__name2(_ItemAlterationValidator,"ItemAlterationValidator");let ItemAlterationValidator=_ItemAlterationValidator;const itemHasCounterBadge=__name2(item=>{if(!(itemIsOfType(item,"condition")?typeof item.system.value.value=="number":itemIsOfType(item,"effect")?item.system.badge?.type==="counter":!1))throw new foundry.data.validation.DataModelValidationError("effect lacks a badge")},"itemHasCounterBadge"),ITEM_ALTERATION_VALIDATORS={"ac-bonus":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})}),"badge-max":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["effect"]}),mode:new fields$1.StringField({required:!0,choices:["downgrade","override"]}),value:new fields$1.NumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})},{validateForItem:itemHasCounterBadge}),"badge-value":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["condition","effect"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0,initial:void 0})},{validateForItem:itemHasCounterBadge}),"bulk-held-or-stowed":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:BULK_VALUES,initial:void 0})}),"bulk-worn":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor","backpack"]}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:BULK_VALUES,initial:void 0})}),category:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:["light","heavy","medium"],initial:void 0})}),"dex-cap":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,initial:void 0})}),"check-penalty":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,initial:void 0})}),hardness:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0})}),"hp-max":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,nullable:!1,positive:!0,initial:void 0})}),"material-type":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:Array.from(PRECIOUS_MATERIAL_TYPES),initial:void 0})}),"pd-recovery-dc":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["condition"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0,initial:void 0})},{validateForItem(item){if(item.system.slug!=="persistent-damage")return new foundry.data.validation.DataModelValidationFailure({message:"item must be a persistent damage condition"})}}),"persistent-damage":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["condition"]}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.SchemaField({formula:new fields$1.StringField({required:!0,blank:!1,validate:value=>DamageRoll.validate(String(value))}),damageType:new fields$1.StringField({required:!0,choices:()=>CONFIG.PF2E.damageTypes}),dc:new fields$1.NumberField({required:!0,integer:!0,positive:!0,nullable:!1,initial:15})},{nullable:!1})},{validateForItem(item){if(item.system.slug!=="persistent-damage")return new foundry.data.validation.DataModelValidationFailure({message:"item must be a persistent damage condition"})}}),rarity:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:RARITIES})}),"frequency-max":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["action","feat"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0})}),"frequency-per":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["action","feat"]}),mode:new fields$1.StringField({required:!0,choices:["downgrade","override","upgrade"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:()=>Object.keys(CONFIG.PF2E.frequencies),initial:void 0})}),"other-tags":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:()=>keys.strict(CONFIG.PF2E.Item.documentClasses)}),mode:new fields$1.StringField({required:!0,choices:["add","subtract","remove"]}),value:new SlugField({required:!0,nullable:!1,blank:!1,initial:void 0})}),"speed-penalty":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,initial:void 0})}),strength:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})}),traits:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","remove","subtract"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:()=>CONFIG.PF2E.armorTraits,initial:void 0})})},_ItemAlteration=class extends foundry.abstract.DataModel{static{__name(this,"_ItemAlteration")}constructor(){super(...arguments),__privateAdd(this,_adjustCreatureShieldData),__privateAdd(this,_getNewInterval)}static defineSchema(){const{fields:fields2}=foundry.data;return{mode:new fields2.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"],initial:void 0}),property:new fields2.StringField({required:!0,choices:this.VALID_PROPERTIES,initial:void 0}),value:new ResolvableValueField}}get actor(){return this.parent.actor}resolveValue(...args){return this.parent.resolveValue(...args)}applyTo(item){const data={item,alteration:{mode:this.mode,itemType:item.type,value:this.value=this.parent.resolveValue(this.value)}},{DataModelValidationFailure}=foundry.data.validation;switch(this.property){case"ac-bonus":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const armor=data.item,newValue=AELikeRuleElement.getNewValue(this.mode,armor.system.acBonus,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();armor.system.acBonus=Math.max(newValue,0),__privateMethod(this,_adjustCreatureShieldData,adjustCreatureShieldData_fn).call(this,armor);return}case"badge-max":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const effect=data.item,{badge}=effect.system;if(badge?.type!=="counter"||typeof badge.value!="number"||typeof badge.max!="number")return;const newValue=AELikeRuleElement.getNewValue(this.mode,badge.max,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();const hardMax=badge.labels?.length??newValue,min=badge.min??0;badge.max=Math.clamped(newValue,min,hardMax),badge.value=Math.clamped(badge.value,min,badge.max)||0;return}case"badge-value":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const effect=data.item,badge=itemIsOfType(effect,"condition")?effect.system.value:effect.system.badge??{value:0};if(typeof badge.value!="number")return;const newValue=AELikeRuleElement.getNewValue(this.mode,badge.value,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();const max="max"in badge?badge.max??1/0:1/0,min="min"in badge?badge.min??0:0;badge.value=Math.clamped(newValue,min,max)||0;return}case"bulk-held-or-stowed":{const validator=ITEM_ALTERATION_VALIDATORS[this.property];if(data.alteration.value=String(data.alteration.value),!validator.isValid(data))return;data.item.system.weight.value=data.alteration.value,data.item instanceof foundry.abstract.DataModel&&(data.item.system.bulk=organizeBulkData(data.item));return}case"bulk-worn":{const validator=ITEM_ALTERATION_VALIDATORS[this.property];if(data.alteration.value=String(data.alteration.value),!validator.isValid(data))return;data.item.system.equippedBulk.value=data.alteration.value,data.item instanceof foundry.abstract.DataModel&&(data.item.system.bulk=organizeBulkData(data.item));return}case"category":{ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)&&(data.item.system.category=data.alteration.value);return}case"check-penalty":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.checkPenalty,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.checkPenalty=newValue===null?null:Math.min(newValue,0);return}case"dex-cap":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.dexCap,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.dexCap=Math.max(newValue,0);return}case"hardness":{if(ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)){const{system}=data.item,{value}=data.alteration,newValue=AELikeRuleElement.getNewValue(this.mode,system.hardness,value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();system.hardness=Math.max(newValue,0),__privateMethod(this,_adjustCreatureShieldData,adjustCreatureShieldData_fn).call(this,data.item)}return}case"hp-max":{if(ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)){const{hp}=data.item.system,{value}=data.alteration,newValue=AELikeRuleElement.getNewValue(this.mode,hp.max,value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();hp.max=Math.max(Math.trunc(newValue),1),"brokenThreshold"in hp&&(hp.brokenThreshold=Math.floor(hp.max/2)),__privateMethod(this,_adjustCreatureShieldData,adjustCreatureShieldData_fn).call(this,data.item)}return}case"persistent-damage":{const pdObject=isObject(data.alteration.value)?data.alteration.value:{dc:NaN},dc=Math.trunc(Math.abs(Number(pdObject?.dc)||15));data.alteration.value={...pdObject,dc};const validator=ITEM_ALTERATION_VALIDATORS[this.property];validator.isValid(data)&&(data.item.system.persistent=validator.initialize(data.alteration).value);return}case"material-type":{ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)&&(data.item.system.material.type=data.alteration.value,data.item.system.material.grade="standard","_source"in data.item&&(data.item.name=game.pf2e.system.generateItemName(data.item)));return}case"rarity":{ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)&&(data.item.system.traits.rarity=data.alteration.value);return}case"pd-recovery-dc":{const validator=ITEM_ALTERATION_VALIDATORS[this.property];if(data.alteration.value=this.resolveValue(data.alteration.value)||15,validator.isValid(data)&&data.item.system.persistent){const{persistent}=data.item.system,newValue=AELikeRuleElement.getNewValue(this.mode,persistent.dc,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();persistent.dc=Math.max(newValue,0)}return}case"frequency-max":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)||!data.item.system.frequency)return;const frequency=data.item.system.frequency,newValue=AELikeRuleElement.getNewValue(this.mode,frequency.max,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();frequency.max=newValue,frequency.value=Math.clamped(frequency.value??newValue,0,newValue);return}case"frequency-per":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)||!data.item.system.frequency)return;const newValue=__privateMethod(this,_getNewInterval,getNewInterval_fn).call(this,this.mode,data.item.system.frequency.per,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.frequency.per=newValue;return}case"other-tags":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const otherTags=data.item.system.traits.otherTags,newValue=AELikeRuleElement.getNewValue(this.mode,otherTags,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();this.mode==="add"?otherTags.includes(newValue)||otherTags.push(newValue):["subtract","remove"].includes(this.mode)&&otherTags.splice(otherTags.indexOf(newValue),1);return}case"speed-penalty":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.speedPenalty,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.speedPenalty=newValue===null?null:Math.min(newValue,0);return}case"strength":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.strength,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.strength=newValue===null?null:Math.max(newValue,0);return}case"traits":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.traits.value,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();const traits=data.item.system.traits.value;this.mode==="add"?traits.includes(newValue)||traits.push(newValue):["subtract","remove"].includes(this.mode)&&traits.splice(traits.indexOf(newValue),1);return}}}};_adjustCreatureShieldData=new WeakSet,adjustCreatureShieldData_fn=__name2(function(item){if("actor"in item&&item.actor?.isOfType("character","npc")&&item.isOfType("armor")&&item.isShield){const{heldShield}=item.actor;if(item===heldShield){const shieldData=item.actor.attributes.shield;shieldData.ac=item.system.acBonus,shieldData.hardness=item.system.hardness,shieldData.hp.max=item.system.hp.max,shieldData.brokenThreshold=Math.floor(item.system.hp.max/2)}}},"#adjustCreatureShieldData"),_getNewInterval=new WeakSet,getNewInterval_fn=__name2(function(mode,current,newValue){const{DataModelValidationFailure}=foundry.data.validation;if(!objectHasKey(CONFIG.PF2E.frequencies,newValue))return new DataModelValidationFailure({invalidValue:current,fallback:!1});if(mode==="override")return newValue;function getDuration(key){return key==="turn"||key==="round"?Duration.fromISO("PT6S"):key==="day"?Duration.fromISO("PT24H"):Duration.fromISO(key)}__name(getDuration,"getDuration"),__name2(getDuration,"getDuration");const newIsLonger=newValue==="round"&¤t==="turn"||newValue==="PT24H"&¤t==="day"||getDuration(newValue)>getDuration(current);return mode==="upgrade"&&newIsLonger||mode==="downgrade"&&!newIsLonger?newValue:current},"#getNewInterval"),__name2(_ItemAlteration,"ItemAlteration"),__publicField(_ItemAlteration,"VALID_PROPERTIES",["ac-bonus","badge-max","badge-value","bulk-held-or-stowed","bulk-worn","category","check-penalty","dex-cap","hardness","hp-max","material-type","pd-recovery-dc","persistent-damage","rarity","frequency-max","frequency-per","other-tags","speed-penalty","strength","traits"]);let ItemAlteration=_ItemAlteration;const _AuraRuleElement=class extends RuleElementPF2e{static{__name(this,"_AuraRuleElement")}constructor(source,options){super(source,options),__privateAdd(this,_processEffects),__privateAdd(this,_processAppearanceData),this.slug??=this.item.slug??sluggify(this.item.name);for(const effect of this.effects)effect.removeOnExit??=Array.isArray(effect.events)?effect.events.includes("enter"):!1}static defineSchema(){const{fields:fields2}=foundry.data,auraTraitField=new StrictStringField({required:!0,nullable:!1,initial:void 0,choices:{...CONFIG.PF2E.spellTraits,...CONFIG.PF2E.actionTraits}}),effectSchemaField=new fields2.SchemaField({uuid:new StrictStringField({required:!0,blank:!1,nullable:!1,initial:void 0}),affects:new StrictStringField({required:!0,nullable:!1,blank:!1,initial:"all",choices:["allies","enemies","all"],label:"PF2E.RuleEditor.Aura.Effects.Affects"}),events:new StrictArrayField(new StrictStringField({required:!0,blank:!1,nullable:!1,initial:void 0,choices:["enter","turn-start","turn-end"]}),{required:!0,nullable:!1,initial:["enter"],label:"PF2E.RuleEditor.Aura.Effects.Events"}),save:new fields2.SchemaField({type:new StrictStringField({required:!0,nullable:!1,blank:!1,initial:void 0,choices:SAVE_TYPES,label:"PF2E.RuleEditor.Aura.Effects.Type"}),dc:new ResolvableValueField({required:!0,nullable:!1,initial:void 0,label:"PF2E.Check.DC.Unspecific"})},{required:!0,nullable:!0,initial:null,label:"PF2E.SavesHeader"}),predicate:new PredicateField({required:!1,nullable:!1}),removeOnExit:new StrictBooleanField({required:!0,nullable:!1,initial:!0,label:"PF2E.RuleEditor.Aura.Effects.RemoveOnExit"}),includesSelf:new StrictBooleanField({required:!1,nullable:!1,initial:d=>d.affects!=="enemies",label:"PF2E.RuleEditor.Aura.Effects.IncludesSelf"}),alterations:new StrictArrayField(new fields2.EmbeddedDataField(ItemAlteration))}),xyPairSchema=__name2(({integer})=>({x:new StrictNumberField({required:!0,integer,nullable:!1,initial:void 0,label:"PF2E.RuleEditor.Aura.Appearance.Translation.X"}),y:new StrictNumberField({required:!0,integer,nullable:!1,initial:void 0,label:"PF2E.RuleEditor.Aura.Appearance.Translation.Y"})}),"xyPairSchema"),appearanceSchema={border:new fields2.SchemaField({color:new DataUnionField([new StrictStringField({required:!0,choices:["user-color"],initial:void 0}),new fields2.ColorField({required:!0,nullable:!1,initial:void 0})],{required:!0,nullable:!1,initial:"#000000",label:"PF2E.RuleEditor.Aura.Appearance.Color"}),alpha:new fields2.AlphaField({required:!0,nullable:!1,initial:.75,label:"PF2E.RuleEditor.General.Opacity"})},{required:!1,nullable:!0,initial:()=>({color:"#000000",alpha:.75}),label:"PF2E.RuleEditor.Aura.Appearance.Border"}),highlight:new fields2.SchemaField({color:new DataUnionField([new StrictStringField({required:!0,nullable:!1,choices:["user-color"],initial:void 0}),new fields2.ColorField({required:!0,nullable:!1,initial:void 0})],{required:!0,nullable:!1,initial:"user-color",label:"PF2E.RuleEditor.Aura.Appearance.Color"}),alpha:new fields2.AlphaField({required:!1,nullable:!1,initial:.25,label:"PF2E.RuleEditor.General.Opacity"})},{required:!1,nullable:!1,initial:()=>({color:"user-color",alpha:.25}),label:"PF2E.RuleEditor.Aura.Appearance.Highlight"}),texture:new fields2.SchemaField({src:new StrictStringField({required:!0,nullable:!1,initial:void 0,label:"TOKEN.ImagePath"}),alpha:new fields2.AlphaField({required:!0,nullable:!1,initial:1,label:"PF2E.RuleEditor.General.Opacity"}),scale:new StrictNumberField({required:!0,nullable:!1,positive:!0,initial:1,label:"Scale"}),translation:new fields2.SchemaField(xyPairSchema({integer:!0}),{required:!1,nullable:!0,initial:null,label:"PF2E.RuleEditor.Aura.Appearance.Translation.Label",hint:"PF2E.RuleEditor.Aura.Appearance.Translation.Hint"}),loop:new StrictBooleanField({required:!1,nullable:!1,initial:!0,label:"PF2E.RuleEditor.Aura.Appearance.Loop.Label",hint:"PF2E.RuleEditor.Aura.Appearance.Loop.Hint"}),playbackRate:new StrictNumberField({required:!1,nullable:!1,positive:!0,max:4,initial:1,label:"PF2E.RuleEditor.Aura.Appearance.PlaybackRate.Label",hint:"PF2E.RuleEditor.Aura.Appearance.PlaybackRate.Hint"})},{required:!1,nullable:!0,initial:null,label:"PF2E.RuleEditor.Aura.Appearance.Texture"})};return{...super.defineSchema(),radius:new ResolvableValueField({required:!0,nullable:!1,initial:5,label:"PF2E.RuleEditor.Aura.Basic.Radius"}),level:new ResolvableValueField({required:!1,nullable:!0,initial:null,label:"PF2E.RuleEditor.Aura.Basic.Level.Label",hint:"PF2E.RuleEditor.Aura.Basic.Level.Hint"}),traits:new StrictArrayField(auraTraitField,{required:!0,nullable:!1,label:"PF2E.TraitsLabel"}),effects:new StrictArrayField(effectSchemaField,{required:!0,nullable:!1,label:"PF2E.RuleEditor.Aura.Effects.Label"}),appearance:new fields2.SchemaField(appearanceSchema,{required:!0,nullable:!1,initial:()=>({border:{color:"#000000",alpha:.75},highlight:{color:"user-color",alpha:.25},texture:null}),label:"PF2E.RuleEditor.Aura.Appearance.Label"}),mergeExisting:new StrictBooleanField({required:!0,nullable:!1,initial:!0,label:"PF2E.RuleEditor.Aura.Basic.MergeExisting.Label",hint:"PF2E.RuleEditor.Aura.Basic.MergeExisting.Hint"})}}afterPrepareData(){if(!this.test())return;const radius=Math.clamped(Math.ceil(Number(this.resolveValue(this.radius))/5)*5,5,240);if(Number.isInteger(radius)&&radius>0){const level=this.resolveValue(this.level,null),data={slug:this.slug,radius,level:typeof level=="number"?Math.trunc(level):this.item.isOfType("effect")?this.item.level:null,effects:__privateMethod(this,_processEffects,processEffects_fn).call(this),traits:uniq(this.traits.filter(t=>t!=="aura")).sort(),appearance:__privateMethod(this,_processAppearanceData,processAppearanceData_fn).call(this)};for(const effect of data.effects){const indexEntry=fromUuidSync(effect.uuid);if(!(indexEntry&&"type"in indexEntry&&typeof indexEntry.type=="string")){this.failValidation(`Unable to resolve effect uuid: ${effect.uuid}`);return}["effect","affliction"].includes(indexEntry.type)||this.failValidation('effects transmitted by auras must be of type "effect" or "affliction"')}const existing=this.actor.auras.get(this.slug);if(existing&&this.mergeExisting){existing.radius=data.radius,existing.traits=uniq([...existing.traits,...data.traits]).sort(),existing.appearance=data.appearance;for(const effect of data.effects){const existingIndex=existing.effects.findIndex(e=>e.uuid===effect.uuid);existingIndex!==-1?existing.effects.splice(existingIndex,1,effect):existing.effects.push(effect)}}else this.actor.auras.set(this.slug,data)}}};_processEffects=new WeakSet,processEffects_fn=__name2(function(){return this.effects.map(e=>({...e,uuid:this.resolveInjectedProperties(e.uuid),save:null}))},"#processEffects"),_processAppearanceData=new WeakSet,processAppearanceData_fn=__name2(function(){const appearance=deepClone(this.appearance),{border,highlight,texture}=appearance,textureSrc=(()=>{if(!texture)return null;const maybeTextureSrc=this.resolveInjectedProperties(texture.src);return isImageOrVideoPath(maybeTextureSrc)?maybeTextureSrc:"icons/svg/hazard.svg"})();return border&&(border.color=border.color==="user-color"?userColorForActor(this.actor):border.color),highlight.color=highlight.color==="user-color"?userColorForActor(this.actor):highlight.color,{border:border&&{color:Number(Color.fromString(border.color)),alpha:border.alpha},highlight:{color:Number(Color.fromString(highlight.color)),alpha:highlight.alpha},texture:texture?.alpha&&textureSrc?{...texture,src:textureSrc}:null}},"#processAppearanceData"),__name2(_AuraRuleElement,"AuraRuleElement");let AuraRuleElement=_AuraRuleElement;const _BaseSpeedRuleElement=class extends RuleElementPF2e{static{__name(this,"_BaseSpeedRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_createMovementType),this.selector=this.selector?.trim().replace(/-speed$/,""),typeof this.value=="string"||typeof this.value=="number"||this.isBracketedValue(this.value)||this.failValidation("A value must be a number, string, or bracketed value")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1,initial:void 0}),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0})}}beforePrepareData(){if(this.ignored)return;const speedType=this.resolveInjectedProperties(this.selector);if(!tupleHasValue(MOVEMENT_TYPES,speedType))return this.failValidation("Unrecognized or missing selector");const speed=__privateMethod(this,_createMovementType,createMovementType_fn).call(this,speedType);(this.actor.synthetics.movementTypes[speedType]??=[]).push(speed)}};_createMovementType=new WeakSet,createMovementType_fn=__name2(function(type){return()=>{if(!this.test())return null;const value=Math.trunc(Number(this.resolveValue(this.value)));if(!Number.isInteger(value))return this.failValidation("Failed to resolve value"),null;const derivedFromLand=type!=="land"&&typeof this.value=="string"&&/attributes\.speed\.(?:value|total)/.test(this.value);return value>0?{type,value,source:this.item.name,derivedFromLand}:null}},"#createMovementType"),__name2(_BaseSpeedRuleElement,"BaseSpeedRuleElement"),__publicField(_BaseSpeedRuleElement,"validActorTypes",["character","familiar","npc"]);let BaseSpeedRuleElement=_BaseSpeedRuleElement;const ALIGNMENTS=new Set(["LG","NG","CG","LN","N","CN","LE","NE","CE"]),ALIGNMENT_TRAITS=new Set(["chaotic","evil","good","lawful"]),ALLIANCES=new Set(["party","opposition",null]),SAVING_THROW_DEFAULT_ATTRIBUTES={fortitude:"con",reflex:"dex",will:"wis"},SIZE_TO_REACH={tiny:0,sm:5,med:5,lg:5,huge:10,grg:15},SENSES_WITH_MANDATORY_ACUITIES={darkvision:"precise",heatsight:"precise",greaterDarkvision:"precise",lowLightVision:"precise",seeInvisibility:"precise"},_CreatureSensePF2e=class{static{__name(this,"_CreatureSensePF2e")}type;acuity;value;source;get range(){return Number(this.value)||1/0}constructor(data){this.type=data.type,this.acuity=objectHasKey(SENSES_WITH_MANDATORY_ACUITIES,this.type)?SENSES_WITH_MANDATORY_ACUITIES[this.type]:data.acuity??"precise",this.value=data.value??"",this.source=data.source||void 0}get label(){const buildLabel=__name2((type,acuity,range2)=>{const senses2=CONFIG.PF2E.senses,sense=game.i18n.localize(senses2[type]??"")||type,acuityLabel=acuity?game.i18n.localize(CONFIG.PF2E.senseAcuity[acuity]):null;return acuity&&range2?game.i18n.format("PF2E.Actor.Creature.Sense.WithAcuityAndRange",{sense,acuity:acuityLabel,range:range2}):acuity?game.i18n.format("PF2E.Actor.Creature.Sense.WithAcuity",{sense,acuity:acuityLabel}):sense},"buildLabel"),range=this.range<1/0?this.range:void 0;switch(this.type){case"darkvision":case"greaterDarkvision":case"lowLightVision":case"seeInvisibility":return buildLabel(this.type);case"scent":return this.acuity==="vague"?null:buildLabel(this.type,this.acuity,range);default:return buildLabel(this.type,this.acuity,range)}}isMoreAcuteThan(sense){return this.acuity==="precise"&&["imprecise","vague"].includes(sense.acuity??"precise")||this.acuity==="imprecise"&&sense.acuity==="vague"}hasLongerRangeThan(sense){return this.range>Number(sense.value)}};__name2(_CreatureSensePF2e,"CreatureSensePF2e");let CreatureSensePF2e=_CreatureSensePF2e;const SENSE_ACUITIES=["precise","imprecise","vague"],SENSE_TYPES=new Set(["darkvision","echolocation","greaterDarkvision","heatsight","lifesense","lowLightVision","motionsense","scent","seeInvisibility","spiritsense","thoughtsense","tremorsense","wavesense"]),CONDITION_SLUGS=new Set(["blinded","broken","clumsy","concealed","confused","controlled","dazzled","deafened","doomed","drained","dying","encumbered","enfeebled","fascinated","fatigued","fleeing","friendly","frightened","grabbed","helpful","hidden","hostile","immobilized","indifferent","invisible","malevolence","observed","off-guard","paralyzed","persistent-damage","petrified","prone","quickened","restrained","sickened","slowed","stunned","stupefied","unconscious","undetected","unfriendly","unnoticed","wounded"]),_IWR=class{static{__name(this,"_IWR")}constructor(data){__publicField(this,"type"),__publicField(this,"exceptions"),__publicField(this,"definition"),__publicField(this,"source"),__privateAdd(this,_customLabel,void 0),this.type=data.type,this.exceptions=deepClone(data.exceptions??[]),this.definition=data.definition??null,this.source=data.source??null,__privateSet(this,_customLabel,this.type==="custom"?data.customLabel??null:null)}get applicationLabel(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),key=`Exceptions${this.exceptions.length}DoubleVs0`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,...exceptions,value:""}).replace(/\s+/g," ").trim()}get typeLabel(){return game.i18n.localize(__privateGet(this,_customLabel)??this.typeLabels[this.type])}describe(iwrType){if(setHasElement(CONDITION_SLUGS,iwrType))return["item:type:condition",`item:slug:${iwrType}`];if(isObject(iwrType))return iwrType.definition;switch(iwrType){case"air":case"earth":case"metal":case"radiation":case"visual":case"water":case"wood":return[`item:trait:${iwrType}`];case"all-damage":return["damage"];case"area-damage":return["area-damage"];case"arrow-vulnerability":return["item:group:bow",{not:"item:tag:crossbow"}];case"auditory":return["item:trait:auditory"];case"axe-vulnerability":return["item:group:axe"];case"critical-hits":return["damage:component:critical"];case"custom":return this.definition??[];case"damage-from-spells":return["damage","item:type:spell","impulse"];case"disease":return["item:trait:disease"];case"emotion":return["item:type:effect","item:trait:emotion"];case"energy":case"physical":return[`damage:category:${iwrType}`];case"fear-effects":return["item:type:effect","item:trait:fear"];case"ghost-touch":return["item:rune:property:ghost-touch"];case"magical":return["item:magical"];case"mental":return[{or:["damage:type:mental",{and:["item:type:effect","item:trait:mental"]}]}];case"non-magical":return[{not:"item:magical"}];case"object-immunities":return[{or:["damage:type:bleed","damage:type:mental","damage:type:poison","damage:type:spirit",{and:["item:type:condition",{or:["item:slug:doomed","item:slug:drained","item:slug:fatigued","item:slug:paralyzed","item:slug:sickened","item:slug:unconscious"]}]}]}];case"precision":case"splash-damage":return[`damage:component:${iwrType==="splash-damage"?"splash":"precision"}`];case"spells":return["damage",{or:["item:type:spell","item:from-spell","impulse"]}];case"unarmed-attacks":return["item:category:unarmed"];default:{if(iwrType in CONFIG.PF2E.damageTypes)return[`damage:type:${iwrType}`];if(objectHasKey(CONFIG.PF2E.materialDamageEffects,iwrType))switch(iwrType){case"adamantine":return[{or:["damage:material:adamantine","damage:material:keep-stone"]}];case"cold-iron":return[{or:["damage:material:cold-iron","damage:material:sovereign-steel"]}];case"darkwood":return[{or:["damage:material:darkwood",{and:["self:mode:undead","damage:material:peachwood"]}]}];case"silver":return[{or:["damage:material:silver","damage:material:mithral"]}];default:return[`damage:material:${iwrType}`]}return setHasElement(MAGIC_SCHOOLS,iwrType)?["item:type:effect",`item:trait:${iwrType}`]:[`unhandled:${iwrType}`]}}}get predicate(){const typeStatements=this.describe(this.type),exceptions=this.exceptions.flatMap(exception=>{const described=this.describe(exception).filter(s=>s!=="damage");return described.length===1?described:{and:described}}),statements=[typeStatements,exceptions.length===0?[]:exceptions.length===1?{not:exceptions[0]}:{nor:exceptions}].flat();return new PredicatePF2e(statements)}toObject(){return{type:this.type,exceptions:deepClone(this.exceptions),source:this.source,label:this.label}}createFormatData({list,prefix}){return list.slice(0,4).map((exception,index)=>{const label=typeof exception=="string"?this.typeLabels[exception]:exception.label;return{[`${prefix}${index+1}`]:game.i18n.localize(label)}}).reduce((accum,obj)=>({...accum,...obj}),{})}test(statements){return this.predicate.test(statements)}};_customLabel=new WeakMap,__name2(_IWR,"IWR");let IWR=_IWR;const _Immunity=class extends IWR{static{__name(this,"_Immunity")}typeLabels=CONFIG.PF2E.immunityTypes;get label(){return this.applicationLabel}};__name2(_Immunity,"Immunity");let Immunity=_Immunity;const _Weakness=class extends IWR{static{__name(this,"_Weakness")}typeLabels=CONFIG.PF2E.weaknessTypes;value;constructor(data){super(data),this.value=data.value}get label(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),key=`Exceptions${this.exceptions.length}DoubleVs0`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,value:this.value,...exceptions})}toObject(){return{...super.toObject(),value:this.value}}};__name2(_Weakness,"Weakness");let Weakness=_Weakness;const _Resistance=class extends IWR{static{__name(this,"_Resistance")}typeLabels=CONFIG.PF2E.resistanceTypes;value;doubleVs;constructor(data){super(data),this.value=data.value,this.doubleVs=deepClone(data.doubleVs??[])}get label(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),doubleVs=this.createFormatData({list:this.doubleVs,prefix:"doubleVs"}),key=`Exceptions${this.exceptions.length}DoubleVs${this.doubleVs.length}`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,value:this.value,...exceptions,...doubleVs})}get applicationLabel(){const type=this.typeLabel,exceptions=this.createFormatData({list:this.exceptions,prefix:"exception"}),doubleVs=this.createFormatData({list:this.doubleVs,prefix:"doubleVs"}),key=`Exceptions${this.exceptions.length}DoubleVs${this.doubleVs.length}`;return game.i18n.format(`PF2E.Damage.IWR.CompositeLabel.${key}`,{type,value:"",...exceptions,...doubleVs}).replace(/\s+/g," ").trim()}toObject(){return{...super.toObject(),value:this.value,doubleVs:deepClone(this.doubleVs)}}getDoubledValue(damageDescription){return this.doubleVs.length===0?this.value:new PredicatePF2e(this.doubleVs.flatMap(d=>this.describe(d))).test(damageDescription)?this.value*2:this.value}};__name2(_Resistance,"Resistance");let Resistance=_Resistance;const NON_DAMAGE_WEAKNESSES=new Set(["air","earth","ghost-touch","metal","plant","radiation","salt","salt-water","spells","water","wood"]),_AttackTraitHelpers=class{static{__name(this,"_AttackTraitHelpers")}static getLabel(traitOrTag){const traits=CONFIG.PF2E.weaponTraits,tags=CONFIG.PF2E.otherWeaponTags;return traits[traitOrTag]??tags[traitOrTag]??traitOrTag}static getUnannotatedTrait(trait){return trait.replace(/-d?\d{1,3}$/,"")}static createAttackModifiers({item}){const{actor}=item;if(!actor)throw ErrorPF2e("The weapon must be embedded");return item.system.traits.value.flatMap(trait=>{const unannotatedTrait=this.getUnannotatedTrait(trait);switch(unannotatedTrait){case"volley":{if(!item.range?.increment)return[];const penaltyRange=Number(/-(\d+)$/.exec(trait)[1]);return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:-2,type:"untyped",ignored:!0,predicate:new PredicatePF2e({lte:["target:distance",penaltyRange]},{not:"self:ignore-volley-penalty"})})}case"sweep":return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:1,type:"circumstance",predicate:new PredicatePF2e("sweep-bonus")});case"backswing":return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:1,type:"circumstance",predicate:new PredicatePF2e("backswing-bonus")});default:return[]}})}};__name2(_AttackTraitHelpers,"AttackTraitHelpers");let AttackTraitHelpers=_AttackTraitHelpers;function setImmunitiesFromTraits(actor){if(actor.isOfType("character"))return;const{traits}=actor,{immunities}=actor.attributes;if(traits.has("construct")&&!traits.has("eidolon")){const constructImmunities=["bleed","death-effects","disease","doomed","drained","fatigued","healing","necromancy","nonlethal-attacks","paralyzed","poison","sickened","spirit","unconscious"];for(const immunityType of constructImmunities)immunities.some(i=>i.type===immunityType)||immunities.push(new Immunity({type:immunityType,source:game.i18n.localize("PF2E.TraitConstruct")}))}traits.has("mindless")&&!immunities.some(i=>i.type==="mental")&&immunities.push(new Immunity({type:"mental",source:game.i18n.localize("PF2E.TraitMindless")}))}__name(setImmunitiesFromTraits,"setImmunitiesFromTraits"),__name2(setImmunitiesFromTraits,"setImmunitiesFromTraits");function imposeEncumberedCondition(actor){if(game.settings.get("pf2e","automation.encumbrance")&&actor.inventory.bulk.isEncumbered&&actor.conditions.bySlug("encumbered").length===0){const source=game.pf2e.ConditionManager.getCondition("encumbered").toObject(),encumbered=new ConditionPF2e(mergeObject(source,{_id:"xxxENCUMBEREDxxx"}),{parent:actor});encumbered.prepareSiblingData(),encumbered.prepareActorData();for(const rule of encumbered.prepareRuleElements())rule.beforePrepareData?.();actor.conditions.set(encumbered.id,encumbered)}}__name(imposeEncumberedCondition,"imposeEncumberedCondition"),__name2(imposeEncumberedCondition,"imposeEncumberedCondition");const _WeaponTraitToggles=class{static{__name(this,"_WeaponTraitToggles")}constructor(weapon){__privateAdd(this,_resolveOptions),__privateAdd(this,_weapon,void 0),__privateSet(this,_weapon,weapon)}get modular(){const options=__privateMethod(this,_resolveOptions,resolveOptions_fn).call(this,"modular"),sourceSelection=__privateGet(this,_weapon)._source.system.traits.toggles?.modular?.selection,selection=tupleHasValue(options,sourceSelection)?sourceSelection:options.includes(__privateGet(this,_weapon).system.damage.damageType)?__privateGet(this,_weapon).system.damage.damageType:null;return{options,selection}}get versatile(){const options=__privateMethod(this,_resolveOptions,resolveOptions_fn).call(this,"versatile"),sourceSelection=__privateGet(this,_weapon)._source.system.traits.toggles?.versatile?.selection??null,selection=tupleHasValue(options,sourceSelection)?sourceSelection:null;return{options,selection}}};_weapon=new WeakMap,_resolveOptions=new WeakSet,resolveOptions_fn=__name2(function(toggle){const types=__privateGet(this,_weapon).system.traits.value.filter(t=>t.startsWith(toggle)).flatMap(trait=>{if(trait==="modular")return["bludgeoning","piercing","slashing"];const damageType=/^versatile-(\w+)$/.exec(trait)?.at(1);switch(damageType){case"b":return"bludgeoning";case"p":return"piercing";case"s":return"slashing";default:return objectHasKey(CONFIG.PF2E.damageTypes,damageType)?damageType:[]}}),allOptions=Array.from(new Set(types));return toggle==="modular"?allOptions:allOptions.filter(t=>__privateGet(this,_weapon).system.damage.damageType!==t)},"#resolveOptions"),__name2(_WeaponTraitToggles,"WeaponTraitToggles");let WeaponTraitToggles=_WeaponTraitToggles;async function toggleWeaponTrait({weapon,trait,selection}){if(weapon.system.traits.toggles[trait].selection===selection)return!1;const item=weapon.actor?.items.get(weapon.id);return item?.isOfType("weapon")&&item===weapon?await item.update({[`system.traits.toggles.${trait}.selection`]:selection}):item?.isOfType("weapon")&&weapon.altUsageType==="melee"?item.update({[`system.meleeUsage.traitToggles.${trait}`]:selection}):await item?.rules.find(r=>r.key==="Strike"&&!r.ignored&&r.slug===weapon.slug)?.toggleTrait({trait,selection}),!0}__name(toggleWeaponTrait,"toggleWeaponTrait"),__name2(toggleWeaponTrait,"toggleWeaponTrait");function createSheetOptions(options,selections=[],{selected=!1}={}){const sheetOptions=Object.entries(options).reduce((compiledOptions,[stringKey,label])=>{const selectionList=Array.isArray(selections)?selections:selections.value,key=typeof selectionList[0]=="number"?Number(stringKey):stringKey,isSelected=selectionList.includes(key);return(isSelected||!selected)&&(compiledOptions[key]={label:game.i18n.localize(label),value:stringKey,selected:isSelected}),compiledOptions},{});return sortLabeledRecord(sheetOptions)}__name(createSheetOptions,"createSheetOptions"),__name2(createSheetOptions,"createSheetOptions");function createSheetTags(options,selections){return createSheetOptions(options,selections,{selected:!0})}__name(createSheetTags,"createSheetTags"),__name2(createSheetTags,"createSheetTags");function createTagifyTraits(traits,{sourceTraits,record}){const sourceSet=new Set(sourceTraits??traits),traitSlugs=[...traits],readonlyTraits=traitSlugs.filter(t=>!sourceSet.has(t));return traitSlugs.map(slug=>{const label=game.i18n.localize(record?.[slug]??slug);return{id:slug,value:label,readonly:readonlyTraits.includes(slug)}}).sort((t1,t2)=>t1.value.localeCompare(t2.value))}__name(createTagifyTraits,"createTagifyTraits"),__name2(createTagifyTraits,"createTagifyTraits");function processTagifyInSubmitData(form,data){const tagifyInputElements=form.querySelectorAll("tags.tagify ~ input");for(const inputEl of tagifyInputElements.values()){const path=inputEl.name,inputValue=data[path],selections=inputValue&&typeof inputValue=="string"?JSON.parse(inputValue):inputValue;Array.isArray(selections)&&(data[path]=selections.filter(s=>!s.readonly).map(s=>s.id??s.value))}}__name(processTagifyInSubmitData,"processTagifyInSubmitData"),__name2(processTagifyInSubmitData,"processTagifyInSubmitData");function getAdjustment(value,reference){const adjustedHigher=value>reference,adjustedLower=value{const unannotatedTrait=this.getUnannotatedTrait(trait);switch(unannotatedTrait){case"kickback":return new ModifierPF2e({slug:unannotatedTrait,label:CONFIG.PF2E.weaponTraits.kickback,modifier:-2,type:"circumstance",predicate:new PredicatePF2e({lt:["attribute:str:mod",2]}),adjustments:extractModifierAdjustments(synthetics,domains,unannotatedTrait)});case"improvised":return new ModifierPF2e({slug:unannotatedTrait,label:this.getLabel(trait),modifier:-2,type:"item",predicate:new PredicatePF2e({not:"self:ignore-improvised-penalty"}),adjustments:extractModifierAdjustments(synthetics,domains,unannotatedTrait)});default:return[]}});return[...super.createAttackModifiers({item}),...pcSpecificModifiers]}};__name2(_PCAttackTraitHelpers,"PCAttackTraitHelpers");let PCAttackTraitHelpers=_PCAttackTraitHelpers;const _WeaponAuxiliaryAction=class{static{__name(this,"_WeaponAuxiliaryAction")}weapon;action;actions;carryType;hands;purpose;fullPurpose;constructor({weapon,action:action2,purpose,hands}){this.weapon=weapon,this.action=action2,this.purpose=purpose,this.hands=hands??null;const[actions,carryType,fullPurpose]=(()=>{switch(purpose){case"Draw":return[1,"held",`${purpose}${hands}H`];case"PickUp":return[1,"held",`${purpose}${hands}H`];case"Retrieve":{const{container}=weapon;return[container?.system.usage.type==="worn"&&container.isWorn?1:container?.isHeld?2:3,"held",`${purpose}${hands}H`]}case"Grip":return[action2==="Interact"?1:0,"held",purpose];case"Sheathe":return[1,"worn",purpose];case"Modular":return[1,null,purpose];case"Drop":return[0,"dropped",purpose]}})();this.actions=actions,this.carryType=carryType,this.fullPurpose=fullPurpose}get actor(){return this.weapon.parent}get label(){return game.i18n.localize(`PF2E.Actions.${this.action}.${this.fullPurpose}.Title`)}get glyph(){return getActionGlyph(this.actions)}get options(){return this.purpose==="Modular"?createSheetOptions(pick(CONFIG.PF2E.damageTypes,this.weapon.system.traits.toggles.modular.options),[this.weapon.system.traits.toggles.modular.selection??[]].flat()):null}async execute({selection=null}={}){const{actor,weapon}=this;if(typeof this.carryType=="string")await actor.adjustCarryType(this.weapon,{carryType:this.carryType,handsHeld:this.hands??0});else if(selection&&tupleHasValue(weapon.system.traits.toggles.modular.options,selection)&&!await toggleWeaponTrait({weapon,trait:"modular",selection}))return;if(!game.combat)return;const templates={flavor:"./systems/pf2e/templates/chat/action/flavor.hbs",content:"./systems/pf2e/templates/chat/action/content.hbs"},flavorAction={title:`PF2E.Actions.${this.action}.Title`,subtitle:`PF2E.Actions.${this.action}.${this.fullPurpose}.Title`,glyph:this.glyph},flavor=await renderTemplate(templates.flavor,{action:flavorAction,traits:[traitSlugToObject("manipulate",CONFIG.PF2E.actionTraits)]}),content=await renderTemplate(templates.content,{imgPath:weapon.img,message:game.i18n.format(`PF2E.Actions.${this.action}.${this.fullPurpose}.Description`,{actor:actor.name,weapon:weapon.name,damageType:game.i18n.localize(`PF2E.Damage.RollFlavor.${selection}`)})}),token=actor.getActiveTokens(!1,!0).shift();await ChatMessagePF2e.create({content,speaker:ChatMessagePF2e.getSpeaker({actor,token}),flavor,type:CONST.CHAT_MESSAGE_TYPES.EMOTE})}};__name2(_WeaponAuxiliaryAction,"WeaponAuxiliaryAction");let WeaponAuxiliaryAction=_WeaponAuxiliaryAction;function imposeOversizedWeaponCondition(actor){const wieldedOversizedWeapon=actor.itemTypes.weapon.find(w=>w.isEquipped&&w.isOversized&&w.category!=="unarmed"),compendiumCondition=game.pf2e.ConditionManager.getCondition("clumsy"),conditionSource=wieldedOversizedWeapon&&actor.conditions.bySlug("clumsy").length===0?mergeObject(compendiumCondition.toObject(),{_id:"xxxxOVERSIZExxxx",system:{slug:"clumsy",references:{parent:{id:wieldedOversizedWeapon.id}}}}):null;if(!conditionSource)return;const clumsyOne=new ConditionPF2e(conditionSource,{parent:actor});clumsyOne.prepareSiblingData(),clumsyOne.prepareActorData();for(const rule of clumsyOne.prepareRuleElements())rule.beforePrepareData?.()}__name(imposeOversizedWeaponCondition,"imposeOversizedWeaponCondition"),__name2(imposeOversizedWeaponCondition,"imposeOversizedWeaponCondition");function createForceOpenPenalty(actor,domains){const slug="no-crowbar",{modifierAdjustments}=actor.synthetics;return new ModifierPF2e({slug,label:"PF2E.Actions.ForceOpen.NoCrowbarPenalty",type:"item",modifier:-2,predicate:["action:force-open","action:force-open:prying"],hideIfDisabled:!0,adjustments:extractModifierAdjustments(modifierAdjustments,domains,slug)})}__name(createForceOpenPenalty,"createForceOpenPenalty"),__name2(createForceOpenPenalty,"createForceOpenPenalty");function createShoddyPenalty(actor,item,domains){if(!actor.isOfType("character")||!item?.isShoddy)return null;const slug="shoddy";return new ModifierPF2e({label:"PF2E.Item.Physical.OtherTag.Shoddy",type:"item",slug,modifier:-2,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,slug)})}__name(createShoddyPenalty,"createShoddyPenalty"),__name2(createShoddyPenalty,"createShoddyPenalty");function createHinderingPenalty(actor){const slug="hindering";return actor.wornArmor?.traits.has(slug)?new ModifierPF2e({label:"PF2E.TraitHindering",type:"untyped",slug,modifier:-5,adjustments:[]}):null}__name(createHinderingPenalty,"createHinderingPenalty"),__name2(createHinderingPenalty,"createHinderingPenalty");function createPonderousPenalty(actor){const armor=actor.wornArmor,slug="ponderous";if(!armor?.traits.has(slug))return null;const penaltyValue=actor.abilities.str.mod>=(armor.strength??-1/0)?-1:armor.checkPenalty||-1;return new ModifierPF2e({label:"PF2E.TraitPonderous",type:"untyped",slug,modifier:penaltyValue,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,["all","initiative"],slug)})}__name(createPonderousPenalty,"createPonderousPenalty"),__name2(createPonderousPenalty,"createPonderousPenalty");const adjustmentScale=["incredibly-easy","very-easy","easy","normal","hard","very-hard","incredibly-hard"],dcAdjustments=new Map([["incredibly-easy",-10],["very-easy",-5],["easy",-2],["normal",0],["hard",2],["very-hard",5],["incredibly-hard",10]]),dcByLevel=new Map([[-1,13],[0,14],[1,15],[2,16],[3,18],[4,19],[5,20],[6,22],[7,23],[8,24],[9,26],[10,27],[11,28],[12,30],[13,31],[14,32],[15,34],[16,35],[17,36],[18,38],[19,39],[20,40],[21,42],[22,44],[23,46],[24,48],[25,50]]),simpleDCs=new Map([["untrained",10],["trained",15],["expert",20],["master",30],["legendary",40]]),simpleDCsWithoutLevel=new Map([["untrained",10],["trained",15],["expert",20],["master",25],["legendary",30]]);function rarityToDCAdjustment(rarity="common"){switch(rarity){case"uncommon":return"hard";case"rare":return"very-hard";case"unique":return"incredibly-hard";default:return"normal"}}__name(rarityToDCAdjustment,"rarityToDCAdjustment"),__name2(rarityToDCAdjustment,"rarityToDCAdjustment");function adjustDC(dc,adjustment="normal"){return dc+(dcAdjustments.get(adjustment)??0)}__name(adjustDC,"adjustDC"),__name2(adjustDC,"adjustDC");function adjustDCByRarity(dc,rarity="common"){return adjustDC(dc,rarityToDCAdjustment(rarity))}__name(adjustDCByRarity,"adjustDCByRarity"),__name2(adjustDCByRarity,"adjustDCByRarity");function calculateDC(level,{proficiencyWithoutLevel,rarity="common"}={}){proficiencyWithoutLevel??=game.settings.get("pf2e","proficiencyVariant");const dc=dcByLevel.get(level)??14;return adjustDCByRarity(proficiencyWithoutLevel?dc-Math.max(level,0):dc,rarity)}__name(calculateDC,"calculateDC"),__name2(calculateDC,"calculateDC");function calculateSimpleDC(rank,{proficiencyWithoutLevel=!1}={}){return proficiencyWithoutLevel?simpleDCsWithoutLevel.get(rank)??10:simpleDCs.get(rank)??10}__name(calculateSimpleDC,"calculateSimpleDC"),__name2(calculateSimpleDC,"calculateSimpleDC");function combineDCAdjustments(first,second){const startingIndex=adjustmentScale.indexOf(first),lowerByIndex=adjustmentScale.indexOf(second),resultIndex=Math.min(Math.max(startingIndex+lowerByIndex-3,0),6);return adjustmentScale[resultIndex]}__name(combineDCAdjustments,"combineDCAdjustments"),__name2(combineDCAdjustments,"combineDCAdjustments");function createDifficultyScale(dc,startAt){const beginAtIndex=adjustmentScale.indexOf(startAt);return adjustmentScale.filter((_value2,index)=>index>=beginAtIndex).map(value=>adjustDC(dc,value))}__name(createDifficultyScale,"createDifficultyScale"),__name2(createDifficultyScale,"createDifficultyScale");function loreSkillsFromActors(actors){const characters=(Array.isArray(actors)?actors:[actors]).filter(a=>a?.type==="character");return Object.fromEntries(characters.flatMap(m=>Object.values(m.skills)).filter(s=>!!s?.lore).map(s=>[s.slug,s.label]))}__name(loreSkillsFromActors,"loreSkillsFromActors"),__name2(loreSkillsFromActors,"loreSkillsFromActors");async function getActions(){const indexFields=["system.slug"],pack=game.packs.get("pf2e.actionspf2e");if(pack){const actions=(await pack.getIndex({fields:indexFields})).map(a=>[a.system.slug,a.name]);return Object.fromEntries(actions)}else return{}}__name(getActions,"getActions"),__name2(getActions,"getActions");const _CheckPromptDialog=class extends Application{static{__name(this,"_CheckPromptDialog")}constructor(){super(...arguments),__privateAdd(this,_prepareProficiencyRanks),__privateAdd(this,_prepareDCAdjustments),__privateAdd(this,_generatePrompt),__privateAdd(this,_htmlQueryTags),__privateAdd(this,_formatLoreType),__privateAdd(this,_formatActionType),__privateAdd(this,_getDC),__privateAdd(this,_constructCheck),__privateAdd(this,_actions,void 0),__privateAdd(this,_lores,void 0)}static get defaultOptions(){return{...super.defaultOptions,classes:["dialog"],id:"generate-check-prompt",tabs:[{navSelector:".skill-save-navigation",contentSelector:".check-prompt-content",initial:"skills"},{navSelector:".dc-navigation",contentSelector:".dc-content",initial:"set-dc"}],template:"systems/pf2e/templates/gm/check-prompt.hbs",title:game.i18n.localize("PF2E.Actor.Party.CheckPrompt.Title"),width:400,height:"auto"}}async getData(){return __privateSet(this,_actions,await getActions()),__privateSet(this,_lores,loreSkillsFromActors(this.options.actors??game.actors.party?.members??[])),{proficiencyRanks:__privateMethod(this,_prepareProficiencyRanks,prepareProficiencyRanks_fn).call(this),dcAdjustments:__privateMethod(this,_prepareDCAdjustments,prepareDCAdjustments_fn).call(this)}}activateListeners($html){const html=$html[0],skillEl=html.querySelector("input#check-prompt-skills"),skills={...omit(CONFIG.PF2E.skillList,["lore"]),perception:"PF2E.PerceptionLabel"};tagify$1(skillEl,{whitelist:skills});const saveEl=html.querySelector("input#check-prompt-saves");tagify$1(saveEl,{whitelist:CONFIG.PF2E.saves});const loreEl=html.querySelector("input#check-prompt-lores"),loreOptions=isEmpty(__privateGet(this,_lores)||{})?{}:{whitelist:__privateGet(this,_lores)};tagify$1(loreEl,loreOptions);const actionEl=html.querySelector("input#check-prompt-actions"),actionOptions=isEmpty(__privateGet(this,_actions)||{})?{}:{whitelist:__privateGet(this,_actions),enforceWhitelist:!1};tagify$1(actionEl,actionOptions);const traitEl=html.querySelector("input#check-prompt-traits");tagify$1(traitEl,{whitelist:CONFIG.PF2E.actionTraits,enforceWhitelist:!1}),html.querySelector("div.form-group a.add-roll-options")?.addEventListener("click",()=>{const sectionEl=html.querySelector("section.check-prompt-content");sectionEl&§ionEl.classList.toggle("show-roll-options")}),htmlQuery(html,"[data-action=post]")?.addEventListener("click",async()=>{__privateMethod(this,_generatePrompt,generatePrompt_fn).call(this)}),htmlQuery(html,"[data-action=cancel]")?.addEventListener("click",async()=>{this.close()})}};_actions=new WeakMap,_lores=new WeakMap,_prepareProficiencyRanks=new WeakSet,prepareProficiencyRanks_fn=__name2(function(){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant");return PROFICIENCY_RANKS.map(value=>({value,label:`${value} (${calculateSimpleDC(value,{proficiencyWithoutLevel})})`}))},"#prepareProficiencyRanks"),_prepareDCAdjustments=new WeakSet,prepareDCAdjustments_fn=__name2(function(){return Object.entries(CONFIG.PF2E.dcAdjustments).filter(([value,_])=>value!=="normal").map(([value,name2])=>({value,label:`${game.i18n.localize(name2)} (${signedInteger(adjustDC(0,value))})`}))},"#prepareDCAdjustments"),_generatePrompt=new WeakSet,generatePrompt_fn=__name2(function(){const html=this.element[0],types=[],traits=[],extras=[],activeSkillSaveTab=htmlQuery(html,"section.check-prompt-content section.tab.active");if(activeSkillSaveTab?.dataset.tab==="skills"?(types.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-skills")),types.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-lores").map(t=>__privateMethod(this,_formatLoreType,formatLoreType_fn).call(this,t))),traits.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-traits")),traits.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-actions").map(a=>__privateMethod(this,_formatActionType,formatActionType_fn).call(this,a))),html.querySelector("input#check-prompt-secret:checked")&&!traits.includes("secret")&&traits.push("secret")):activeSkillSaveTab?.dataset.tab==="saves"&&(types.push(...__privateMethod(this,_htmlQueryTags,htmlQueryTags_fn).call(this,html,"input#check-prompt-saves")),htmlQuery(html,"input#check-prompt-basic-save:checked")&&extras.push("basic:true")),types.length>0){const titleEl=htmlQuery(html,"input#check-prompt-title"),flavor=titleEl?.value?`

${titleEl.value}


`:"",dc=__privateMethod(this,_getDC,getDC_fn).call(this,html),content=types.map(type=>__privateMethod(this,_constructCheck,constructCheck_fn).call(this,type,dc,traits,extras)).join("");ChatMessagePF2e.create({user:game.user.id,flavor,content})}},"#generatePrompt"),_htmlQueryTags=new WeakSet,htmlQueryTags_fn=__name2(function(html,selector){const el=htmlQuery(html,selector);return(el instanceof HTMLInputElement&&el.value?JSON.parse(el.value):[]).map(tag=>tag.id||tag.value)},"#htmlQueryTags"),_formatLoreType=new WeakSet,formatLoreType_fn=__name2(function(type){let loreType=type.toLowerCase().replaceAll(" ","-").trim();return loreType.includes("lore")||(loreType=loreType.concat("-lore")),loreType},"#formatLoreType"),_formatActionType=new WeakSet,formatActionType_fn=__name2(function(type){return`action:${type.toLowerCase().replace("action:","").trim()}`},"#formatActionType"),_getDC=new WeakSet,getDC_fn=__name2(function(html){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),dc=(()=>{const activeDCTab=htmlQuery(html,"section.dc-content section.tab.active");if(activeDCTab?.dataset.tab==="set-dc")return Number(htmlQuery(html,"input#check-prompt-dc")?.value||NaN);if(activeDCTab?.dataset.tab==="simple-dc"){const profRank=htmlQuery(html,"select#check-prompt-simple-dc")?.value;if(tupleHasValue(PROFICIENCY_RANKS,profRank))return calculateSimpleDC(profRank,{proficiencyWithoutLevel})}else if(activeDCTab?.dataset.tab==="level-dc"){const level=Number(htmlQuery(html,"input#check-prompt-level-dc")?.value||NaN);if(Number.isInteger(level))return calculateDC(+level,{proficiencyWithoutLevel})}return NaN})();if(Number.isInteger(dc)){const dcAdjustment=htmlQuery(html,"select#check-prompt-adjust-difficulty")?.value;return dcAdjustment?adjustDC(dc,dcAdjustment):dc}return null},"#getDC"),_constructCheck=new WeakSet,constructCheck_fn=__name2(function(type,dc,traits,extras){return`

@Check[${[type,Number.isInteger(dc)?`dc:${dc}`:null,traits.length?`traits:${traits.join(",")}`:null].concat(...extras).filter(p=>p).join("|")}]

`},"#constructCheck"),__name2(_CheckPromptDialog,"CheckPromptDialog");let CheckPromptDialog=_CheckPromptDialog;async function checkPrompt(options={}){new CheckPromptDialog(options.actors?{actors:options.actors}:{}).render(!0)}__name(checkPrompt,"checkPrompt"),__name2(checkPrompt,"checkPrompt");function buildRewards(...rewards){const[trained,expert,master,legendary]=rewards;return{1:new CoinsPF2e(trained),2:new CoinsPF2e(expert??trained),3:new CoinsPF2e(master??expert??trained),4:new CoinsPF2e(legendary??master??expert??trained)}}__name(buildRewards,"buildRewards"),__name2(buildRewards,"buildRewards");const earnIncomeTable={0:{failure:{cp:1},rewards:buildRewards({cp:5})},1:{failure:{cp:2},rewards:buildRewards({sp:2})},2:{failure:{cp:4},rewards:buildRewards({sp:3})},3:{failure:{cp:8},rewards:buildRewards({sp:5})},4:{failure:{sp:1},rewards:buildRewards({sp:7},{sp:8})},5:{failure:{sp:2},rewards:buildRewards({sp:9},{gp:1})},6:{failure:{sp:3},rewards:buildRewards({gp:1,sp:5},{gp:2})},7:{failure:{sp:4},rewards:buildRewards({gp:2},{gp:2,sp:5})},8:{failure:{sp:5},rewards:buildRewards({gp:2,sp:5},{gp:3})},9:{failure:{sp:6},rewards:buildRewards({gp:3},{gp:4})},10:{failure:{sp:7},rewards:buildRewards({gp:4},{gp:5},{gp:6})},11:{failure:{sp:8},rewards:buildRewards({gp:5},{gp:6},{gp:8})},12:{failure:{sp:9},rewards:buildRewards({gp:6},{gp:8},{gp:10})},13:{failure:{gp:1},rewards:buildRewards({gp:7},{gp:10},{gp:15})},14:{failure:{gp:1,sp:5},rewards:buildRewards({gp:8},{gp:15},{gp:20})},15:{failure:{gp:2},rewards:buildRewards({gp:10},{gp:20},{gp:28})},16:{failure:{gp:2,sp:5},rewards:buildRewards({gp:13},{gp:25},{gp:36},{gp:40})},17:{failure:{gp:3},rewards:buildRewards({gp:15},{gp:30},{gp:45},{gp:55})},18:{failure:{gp:4},rewards:buildRewards({gp:20},{gp:45},{gp:70},{gp:90})},19:{failure:{gp:6},rewards:buildRewards({gp:30},{gp:60},{gp:100},{gp:130})},20:{failure:{gp:8},rewards:buildRewards({gp:40},{gp:75},{gp:150},{gp:200})},21:{failure:{cp:0},rewards:buildRewards({gp:50},{gp:90},{gp:175},{gp:300})}};function getIncomeForLevel(level){const income=earnIncomeTable[Math.clamped(level,0,21)];return{failure:new CoinsPF2e(income.failure),rewards:income.rewards}}__name(getIncomeForLevel,"getIncomeForLevel"),__name2(getIncomeForLevel,"getIncomeForLevel");function applyIncomeOptions({result,options,level,proficiency}){options.useLoreAsExperiencedProfessional&&(result.degreeOfSuccess===DegreeOfSuccess.CRITICAL_FAILURE?(result.degreeOfSuccess=DegreeOfSuccess.FAILURE,result.rewards=new CoinsPF2e(getIncomeForLevel(level).failure)):result.degreeOfSuccess===DegreeOfSuccess.FAILURE&&proficiency!==1&&(result.rewards=new CoinsPF2e(result.rewards).scale(2)))}__name(applyIncomeOptions,"applyIncomeOptions"),__name2(applyIncomeOptions,"applyIncomeOptions");function earnIncome({level,days,rollBrief,proficiency,options,dc}){const degree=new DegreeOfSuccess(rollBrief,dc),result={rewards:new CoinsPF2e,degreeOfSuccess:degree.value};return degree.value===DegreeOfSuccess.CRITICAL_SUCCESS?result.rewards=getIncomeForLevel(level+1).rewards[proficiency]:degree.value===DegreeOfSuccess.SUCCESS?result.rewards=getIncomeForLevel(level).rewards[proficiency]:degree.value===DegreeOfSuccess.FAILURE&&(result.rewards=getIncomeForLevel(level).failure),applyIncomeOptions({result,options,level,proficiency}),{rewards:{perDay:result.rewards,combined:new CoinsPF2e(result.rewards).scale(days)},degreeOfSuccess:result.degreeOfSuccess,daysSpentWorking:days,level,dc,roll:degree.rollTotal}}__name(earnIncome,"earnIncome"),__name2(earnIncome,"earnIncome");function escapeHtml(text){const p=document.createElement("p");return p.innerText=text,p.innerHTML}__name(escapeHtml,"escapeHtml"),__name2(escapeHtml,"escapeHtml");function isExperiencedProfessional(actor){return actor.itemTypes.feat.some(i=>i.slug==="experienced-professional")}__name(isExperiencedProfessional,"isExperiencedProfessional"),__name2(isExperiencedProfessional,"isExperiencedProfessional");function degreeOfSuccessLabel(degreeIndex){const degreeSlug=DEGREE_OF_SUCCESS_STRINGS[degreeIndex];return game.i18n.localize(`PF2E.Check.Result.Degree.Check.${degreeSlug}`)}__name(degreeOfSuccessLabel,"degreeOfSuccessLabel"),__name2(degreeOfSuccessLabel,"degreeOfSuccessLabel");function coinsToString(coins,degreeOfSuccess){return degreeOfSuccess===0?"none":coins.toString()}__name(coinsToString,"coinsToString"),__name2(coinsToString,"coinsToString");function chatTemplate(skillName,earnIncomeResult){const degreeOfSuccess=degreeOfSuccessLabel(earnIncomeResult.degreeOfSuccess),payPerDay=escapeHtml(coinsToString(earnIncomeResult.rewards.perDay,earnIncomeResult.degreeOfSuccess)),combinedPay=escapeHtml(coinsToString(earnIncomeResult.rewards.combined,earnIncomeResult.degreeOfSuccess)),level=earnIncomeResult.level,daysSpentWorking=earnIncomeResult.daysSpentWorking,forDays=daysSpentWorking>1?`

Salary for ${daysSpentWorking} days ${combinedPay}

`:"",successColor=earnIncomeResult.degreeOfSuccess>1?"darkgreen":"darkred",dc=earnIncomeResult.dc,roll=earnIncomeResult.roll;return`
@@ -30,12 +35,7 @@ var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,
- `}__name(askSkillPopupTemplate,"askSkillPopupTemplate"),__name2(askSkillPopupTemplate,"askSkillPopupTemplate");function showEarnIncomePopup(actor){if(!actor?.isOfType("character")){ui.notifications.error("You must select at least one PC");return}const skills=Object.values(actor.skills).filter(s=>!!s?.proficient);new Dialog({title:"Earn Income",content:askSkillPopupTemplate(skills),buttons:{no:{icon:fontAwesomeIcon("times").outerHTML,label:"Cancel"},yes:{icon:fontAwesomeIcon("coins").outerHTML,label:"Earn Income",callback:($html,event)=>{const html=$html[0],level=Number(html.querySelector("[name=level]")?.value)||0,days=Number(html.querySelector("[name=days]")?.value)||1,skillAcronym=html.querySelector("[name=skillAcronym]")?.value??"soc",skill=skills.find(s=>s.slug===skillAcronym);if(!skill)throw ErrorPF2e("Skill not found");localStorage.setItem("earnIncomeLevel",level.toString()),localStorage.setItem("earnIncomeDays",days.toString()),localStorage.setItem("earnIncomeSkillAcronym",skillAcronym),runEarnIncome({actor,event,skill,level,days})}}},default:"yes"}).render(!0)}__name(showEarnIncomePopup,"showEarnIncomePopup"),__name2(showEarnIncomePopup,"showEarnIncomePopup");function createDamageFormula(damage,degree=DEGREE_OF_SUCCESS.SUCCESS){if(damage=deepClone(damage),degree===DEGREE_OF_SUCCESS.CRITICAL_FAILURE)return null;degree===DEGREE_OF_SUCCESS.FAILURE&&(damage.dice=damage.dice.filter(d=>d.category==="splash"),damage.modifiers=damage.modifiers.filter(m=>m.damageCategory==="splash"));const critical=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS;if(!damage.base.length)return null;const typeMap=new Map;for(const baseEntry of damage.base){const list=typeMap.get(baseEntry.damageType)??[];if(typeMap.set(baseEntry.damageType,list),baseEntry.terms)list.push(...baseEntry.terms.map(t=>({...baseEntry,...t,label:null,critical:null})));else if(baseEntry.diceNumber&&baseEntry.dieSize||baseEntry.modifier){const{diceNumber,dieSize,damageType}=baseEntry,modifier=baseEntry.modifier??0,label=(()=>{const diceSection=diceNumber?`${diceNumber}${dieSize}`:null;if(!diceSection)return String(modifier);const displayedModifier=modifier?Math.abs(modifier):null,operator=modifier<0?" - ":" + ";return[diceSection,displayedModifier].filter(p=>p!==null).join(operator)})();list.push({label,dice:diceNumber&&dieSize?{number:diceNumber,faces:Number(dieSize.replace("d",""))}:null,modifier,critical:null,damageType,category:baseEntry.category,materials:baseEntry.materials??[]})}}const BONUS_BASE_LABELS=["PF2E.ConditionTypePersistent"].map(l=>game.i18n.localize(l)),outcomeMatches=__name2(m=>critical||m.critical!==!0,"outcomeMatches");for(const dice of damage.dice.filter(d=>d.enabled&&outcomeMatches(d))){const matchingBase=damage.base.find(b=>b.damageType===dice.damageType)??damage.base[0],baseDieSize=Number(matchingBase.dieSize?.replace("d",""))||matchingBase.terms?.[0].dice?.faces,faces=Number(dice.dieSize?.replace("d",""))||baseDieSize||null,damageType=dice.damageType??matchingBase.damageType;if(dice.diceNumber>0&&faces){const list=typeMap.get(damageType)??[];list.push({label:BONUS_BASE_LABELS.includes(dice.label)?null:`${dice.label} +${dice.diceNumber}d${faces}`,dice:{number:dice.diceNumber,faces},modifier:0,damageType,category:dice.category,critical:dice.critical}),typeMap.set(damageType,list)}}for(const modifier of damage.modifiers.filter(m=>m.enabled&&outcomeMatches(m))){const bonusableDamage=[...damage.base,...damage.dice,...damage.modifiers.filter(m=>m.value>0&&m.type==="untyped")],matchingDamage=modifier.kind==="modifier"?bonusableDamage.find(b=>b.damageType===(modifier.damageType??b.damageType))??damage.base.at(0):bonusableDamage.find(b=>b.damageType===(modifier.damageType??b.damageType)&&b.category===modifier.category);if(!matchingDamage)continue;const damageType=modifier.damageType??matchingDamage.damageType??"untyped",list=typeMap.get(damageType)??[];list.push({label:BONUS_BASE_LABELS.includes(modifier.label)?null:`${modifier.label} ${signedInteger(modifier.value)}`,dice:null,modifier:modifier.value,damageType,category:modifier.damageCategory,critical:modifier.critical}),typeMap.set(damageType,list)}const instances=[instancesFromTypeMap(typeMap,{degree}),instancesFromTypeMap(typeMap,{degree,persistent:!0})].flat(),commaSeparated=instances.map(i=>i.formula).join(","),breakdown=instances.flatMap(i=>i.breakdown);return{formula:`{${commaSeparated}}`,breakdown}}__name(createDamageFormula,"createDamageFormula"),__name2(createDamageFormula,"createDamageFormula");function instancesFromTypeMap(typeMap,{degree,persistent=!1}){return Array.from(typeMap.entries()).flatMap(([damageType,typePartials])=>{const partials=typePartials.filter(p=>p.category==="persistent"===persistent);if(partials.length===0)return[];const groups=groupBy(partials,partial=>partial.category),nonCriticalDamage=(()=>{const criticalInclusion=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS?[CRITICAL_INCLUSION.DOUBLE_ON_CRIT]:[CRITICAL_INCLUSION.DOUBLE_ON_CRIT,CRITICAL_INCLUSION.DONT_DOUBLE_ON_CRIT],doubleDice=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&criticalInclusion.includes(null)&&game.settings.get("pf2e","critRule")==="doubledice",double=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&!doubleDice;return sumExpression(createPartialFormulas(groups,{criticalInclusion,doubleDice}),{double})})(),criticalDamage=(()=>{if(degree!==DEGREE_OF_SUCCESS.CRITICAL_SUCCESS)return null;const criticalInclusion=[CRITICAL_INCLUSION.CRITICAL_ONLY,CRITICAL_INCLUSION.DONT_DOUBLE_ON_CRIT];return sumExpression(createPartialFormulas(groups,{criticalInclusion}))})(),summedDamage=sumExpression(degree?[nonCriticalDamage,criticalDamage]:[nonCriticalDamage]),enclosed=ensureValidFormulaHead(summedDamage)||"0";if(enclosed==="0"&&persistent)return[];const flavor=(()=>{const typeFlavor=damageType==="untyped"&&!persistent?[]:[damageType],persistentFlavor=persistent?["persistent"]:[],materialFlavor=typePartials.flatMap(p=>p.materials??[]),allFlavor=[typeFlavor,persistentFlavor,materialFlavor].flat().join(",");return allFlavor.length>0?`[${allFlavor}]`:""})(),breakdown=(()=>{const flattenedDamage=[null,"persistent","precision","splash"].flatMap(c=>{const partials2=groups.get(c)??[],breakdownDamage2=partials2.filter(e=>e.label!==null),leadingTerms=partials2.filter(p=>p.label===null&&(p.modifier||p.dice?.number||partials2.every(pp=>pp.label===null)));if(leadingTerms.length){const append=c==="splash"?` ${game.i18n.localize("PF2E.Damage.RollFlavor.splash")}`:"",label=createSimpleFormula(leadingTerms)+append;breakdownDamage2.unshift({...leadingTerms[0],label})}return breakdownDamage2}),breakdownDamage=flattenedDamage.filter(d=>d.critical!==!0);if(degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&breakdownDamage.push(...flattenedDamage.filter(d=>d.critical===!0)),!breakdownDamage.length)return[];const damageTypeLabel=breakdownDamage[0].category==="persistent"?game.i18n.format("PF2E.Damage.PersistentTooltip",{damageType:game.i18n.localize(CONFIG.PF2E.damageTypes[damageType]??damageType)}):game.i18n.localize(CONFIG.PF2E.damageTypes[damageType]??damageType),labelParts=breakdownDamage.map(d=>d.label);return labelParts[0]=`${labelParts[0].replace(/^\s+\+/,"")} ${damageTypeLabel}`,labelParts})(),formula=enclosed&&flavor?`${enclosed}${flavor}`:enclosed;return formula?{formula,breakdown}:[]})}__name(instancesFromTypeMap,"instancesFromTypeMap"),__name2(instancesFromTypeMap,"instancesFromTypeMap");function createPartialFormulas(partials,{criticalInclusion,doubleDice=!1}){return[null,"persistent","precision","splash"].flatMap(category=>{const requestedPartials=(partials.get(category)??[]).filter(p=>criticalInclusion.includes(p.critical)),term=(()=>{const expression=createSimpleFormula(requestedPartials,{doubleDice});return expression==="0"?"":["precision","splash"].includes(category??"")&&hasOperators(expression)?`(${expression})`:expression})();return(term&&category&&category!=="persistent"?term.endsWith("]")?`(${term})[${category}]`:`${term}[${category}]`:term)||[]})}__name(createPartialFormulas,"createPartialFormulas"),__name2(createPartialFormulas,"createPartialFormulas");function combinePartialTerms(terms){const modifier=terms.reduce((total,p)=>total+p.modifier,0),constantTerm=modifier?{dice:null,modifier}:null,dice=terms.filter(p=>!!p.dice&&p.dice.number>0).sort(sortBy(t=>-t.dice.faces)),combinedDice=[...groupBy(dice,t=>t.dice.faces).values()].map(terms2=>({modifier:0,dice:{...terms2[0].dice,number:sum(terms2.map(d=>d.dice.number))}})),combined=compact([...combinedDice,constantTerm]);return combined.length?combined:[{dice:null,modifier:0}]}__name(combinePartialTerms,"combinePartialTerms"),__name2(combinePartialTerms,"combinePartialTerms");function createSimpleFormula(terms,{doubleDice}={}){terms=combinePartialTerms(terms);const constant=terms.find(t=>!!t.modifier)?.modifier??0;return[terms.filter(t=>!!t.dice&&t.dice.number>0).map(term=>{const number=doubleDice?term.dice.number*2:term.dice.number,faces=term.dice.faces;return doubleDice?`${number}d${faces}[doubled]`:`${number}d${faces}`}).join(" + "),Math.abs(constant)].filter(e=>!!e).map(e=>typeof e=="number"&&doubleDice?`2 * ${e}`:e).join(constant>0?" + ":" - ")||"0"}__name(createSimpleFormula,"createSimpleFormula"),__name2(createSimpleFormula,"createSimpleFormula");function parseTermsFromSimpleFormula(formula,options){return(formula instanceof Roll?formula:new Roll(formula,options?.rollData)).terms.reduceRight((result,term)=>{if(term.expression===" + ")return result;if(term.expression===" - "){const termToModify=result[0];return termToModify&&(termToModify.modifier&&(termToModify.modifier*=-1),termToModify.dice&&(termToModify.dice.number*=-1)),result}return result.unshift({modifier:term instanceof NumericTerm?term.number:0,dice:term instanceof Die?{faces:term.faces,number:term.number}:null}),result},[])}__name(parseTermsFromSimpleFormula,"parseTermsFromSimpleFormula"),__name2(parseTermsFromSimpleFormula,"parseTermsFromSimpleFormula");function sumExpression(terms,{double=!1}={}){if(terms.every(t=>!t))return null;const summed=terms.filter(p=>!!p).join(" + ")||null,enclosed=double&&hasOperators(summed)?`(${summed})`:summed;return double?`2 * ${enclosed}`:enclosed}__name(sumExpression,"sumExpression"),__name2(sumExpression,"sumExpression");function hasOperators(formula){return/[-+*/]/.test(formula??"")}__name(hasOperators,"hasOperators"),__name2(hasOperators,"hasOperators");function ensureValidFormulaHead(formula){if(!formula)return null;const isWrapped=/^\(.*\)$/.test(formula),isSimple=/^\d+(d\d+)?$/.test(formula);return isWrapped||isSimple?formula:`(${formula})`}__name(ensureValidFormulaHead,"ensureValidFormulaHead"),__name2(ensureValidFormulaHead,"ensureValidFormulaHead");const _ArithmeticExpression=class _ArithmeticExpression2 extends RollTerm{static{__name(this,"_ArithmeticExpression")}operator;operands;constructor(termData){super(termData),this.operator=termData.operator,this.operands=termData.operands.slice(0,2).map(datum=>{if(datum instanceof RollTerm)return datum;const TermCls=CONFIG.Dice.termTypes[datum.class??""]??Object.values(CONFIG.Dice.terms).find(t=>t.name===datum.class)??Die;return simplifyTerm(TermCls.fromData(datum))}),this.operator==="*"&&this.operands[0]instanceof NumericTerm&&tupleHasValue([2,3],this.operands[0].number)&&markAsCrit(this.operands[1],this.operands[0].number)}static fromData(data){return super.fromData({...data,class:"ArithmeticExpression"})}static totalOf(operator,left,right){if(!(left===void 0||right===void 0))switch(operator){case"+":return left+right;case"-":return left-right;case"*":return left*right;case"/":return left/right;case"%":return left%right}}get dice(){return this.operands.flatMap(o=>o instanceof DiceTerm?o:o instanceof Grouping||o instanceof _ArithmeticExpression2||o instanceof IntermediateDie?o.dice:[])}get expression(){if(this.isDeterministic&&typeof this.total=="number"&&!Number.isNaN(this.total)&&!isFlavoredArithmetic(this))return this.total.toString();const{operator,operands}=this;return`${operands[0].expression} ${operator} ${operands[1].expression}`}get formula(){const{operator,operands}=this;return`${operands[0].formula} ${operator} ${operands[1].formula}`}get total(){if(!this._evaluated&&!this.isDeterministic)return;const operands=[Number(this.operands[0].total),Number(this.operands[1].total)];return _ArithmeticExpression2.totalOf(this.operator,...operands)}get critImmuneTotal(){if(!this._evaluated)return;const[left,right]=this.operands;if(left instanceof NumericTerm&&left.number===2&&this.operator==="*")return typeof right.total=="string"?Number(right.total):right.total;const undoubledLeft=(()=>left instanceof _ArithmeticExpression2||left instanceof Grouping?Number(left.critImmuneTotal):Number(left.total))(),undoubledRight=right instanceof _ArithmeticExpression2||right instanceof Grouping?Number(right.critImmuneTotal):Number(right.total);return _ArithmeticExpression2.totalOf(this.operator,undoubledLeft,undoubledRight)}get isDeterministic(){return this.operands.every(o=>o.isDeterministic)}get minimumValue(){const left=DamageInstance.getValue(this.operands[0],"minimum"),right=DamageInstance.getValue(this.operands[1],"minimum");return _ArithmeticExpression2.totalOf(this.operator,left,right)}get expectedValue(){const left=DamageInstance.getValue(this.operands[0]),right=DamageInstance.getValue(this.operands[1]);return _ArithmeticExpression2.totalOf(this.operator,left,right)}get maximumValue(){const left=DamageInstance.getValue(this.operands[0],"maximum"),right=DamageInstance.getValue(this.operands[1],"maximum");return _ArithmeticExpression2.totalOf(this.operator,left,right)}render(){const fragment=new DocumentFragment,{operator,operands}=this;if(operator==="*"&&operands[0]instanceof NumericTerm&&operands[1]instanceof NumericTerm)return fragment.append((operands[0].total*operands[1].total).toString()),fragment;const[left,right]=operands.map(o=>["precision","splash"].includes(o.flavor)?renderComponentDamage(o):isSystemDamageTerm(o)?o.render():o.expression);return fragment.append(left,` ${this.operator} `,right),fragment}async _evaluate(options={}){for(const operand of this.operands)operand._evaluated||await operand.evaluate({async:!0,...options});return this._evaluated=!0,this}toJSON(){return{...super.toJSON(),operands:[this.operands[0].toJSON(),this.operands[1].toJSON()]}}};__name2(_ArithmeticExpression,"ArithmeticExpression"),__publicField(_ArithmeticExpression,"SERIALIZE_ATTRIBUTES",["operator","operands"]);let ArithmeticExpression=_ArithmeticExpression;const _Grouping=class _Grouping2 extends RollTerm{static{__name(this,"_Grouping")}term;constructor(termData){const TermCls=CONFIG.Dice.termTypes[termData.term.class??""]??Object.values(CONFIG.Dice.terms).find(t=>t.name===termData.term.class)??NumericTerm,childTerm=simplifyTerm(TermCls.fromData(termData.term));childTerm instanceof _Grouping2?(super(childTerm.toJSON()),this.term=childTerm.term):(super(termData),this.term=childTerm),this._evaluated=termData.evaluated??this.term._evaluated??!0}static fromData(data){return super.fromData({...data,class:"Grouping"})}get dice(){if(this.term instanceof DiceTerm)return[this.term];if(isObject(this.term)&&"dice"in this.term){const{dice}=this.term;if(Array.isArray(dice)&&dice.every(d=>d instanceof DiceTerm))return dice}return[]}get expression(){return this.isDeterministic&&typeof this.total=="number"&&!Number.isNaN(this.total)&&!isFlavoredArithmetic(this.term)?this.total.toString():this.term instanceof DiceTerm||this.term instanceof MathTerm?this.term.expression:`(${this.term.expression})`}get formula(){const termFormula=this.term.formula,flavor=this.flavor?`[${this.flavor}]`:"";return`(${termFormula})${flavor}`}get total(){return this._evaluated||this.isDeterministic?Number(this.term.total):void 0}get critImmuneTotal(){return this.term instanceof ArithmeticExpression||this.term instanceof _Grouping2?this.term.critImmuneTotal:this.total}get isDeterministic(){return this.term.isDeterministic}get minimumValue(){return DamageInstance.getValue(this.term,"minimum")}get expectedValue(){return DamageInstance.getValue(this.term)}get maximumValue(){return DamageInstance.getValue(this.term,"maximum")}async _evaluate(options={}){return this.term._evaluated||await this.term.evaluate({async:!0,...options}),this._evaluated=!0,this}toJSON(){return{...super.toJSON(),term:this.term.toJSON()}}render(){const expression=["precision","splash"].includes(this.flavor)?renderComponentDamage(this.term):isSystemDamageTerm(this.term)?this.term.render():this.expression,fragment=new DocumentFragment,nodes=this.term instanceof NumericTerm||this.term instanceof Die?[expression]:["(",expression,")"];return fragment.append(...nodes),fragment}};__name2(_Grouping,"Grouping"),__publicField(_Grouping,"SERIALIZE_ATTRIBUTES",["term"]);let Grouping=_Grouping;const _IntermediateDie=class extends RollTerm{static{__name(this,"_IntermediateDie")}number;faces;die;constructor(data){super(data);const setTerm=__name2(termData=>{if(typeof termData=="number")return termData;const TermCls=CONFIG.Dice.termTypes[termData.class??"NumericTerm"],term=simplifyTerm(TermCls.fromData(termData));return term instanceof NumericTerm?term.number:term.isDeterministic?Roll.safeEval(term.formula):term instanceof Grouping?(term.isIntermediate=!0,term):(term instanceof MathTerm||console.warn(`Unexpected term type: ${term.constructor.name}`),term)},"setTerm");this.number=setTerm(data.number),this.faces=setTerm(data.faces),this.die=(()=>data.die?Die.fromData({...data.die,class:"Die"}):typeof this.number=="number"&&typeof this.faces=="number"?Die.fromData({number:this.number,faces:this.faces,evaluated:this._evaluated,options:this.options}):null)()}get expression(){return this.die?.expression??`${this.number}d${this.faces}`}get total(){return this.isDeterministic?Number(this.number)*Number(this.faces):this.die?.total}get dice(){return this.die?[this.die]:[]}get isDeterministic(){return this.number===0||this.faces===0||this.faces===1}get minimumValue(){return DamageInstance.getValue(this.die??new Die({number:Number(this.number),faces:Number(this.faces)}),"minimum")}get expectedValue(){return DamageInstance.getValue(this.die??new Die({number:Number(this.number),faces:Number(this.faces)}))}get maximumValue(){return DamageInstance.getValue(this.die??new Die({number:Number(this.number),faces:Number(this.faces)}),"maximum")}async _evaluate(){return typeof this.number!="number"&&(this.number=(await this.number.evaluate({async:!0})).total),typeof this.faces!="number"&&(this.faces=(await this.faces.evaluate({async:!0})).total),this.die=await new Die({number:this.number,faces:this.faces,options:this.options}).evaluate({async:!0}),this._evaluated=!0,this}toJSON(){return this.die?this.die.toJSON():typeof this.number=="number"&&typeof this.faces=="number"?Die.fromData({class:"Die",number:this.number,faces:this.faces,evaluated:this._evaluated,options:this.options}):{...super.toJSON(),number:typeof this.number=="number"?this.number:this.number.toJSON(),faces:typeof this.faces=="number"?this.faces:this.faces.toJSON()}}};__name2(_IntermediateDie,"IntermediateDie"),__publicField(_IntermediateDie,"SERIALIZE_ATTRIBUTES",["number","faces","die"]);let IntermediateDie=_IntermediateDie;const _InstancePool=class extends PoolTerm{static{__name(this,"_InstancePool")}static fromRolls(rolls=[]){const allEvaluated=rolls.every(r=>r._evaluated),noneEvaluated=!rolls.some(r=>r._evaluated);if(!(allEvaluated||noneEvaluated))return super.fromRolls(rolls);const pool=new this({terms:rolls.map(r=>r._formula),modifiers:[],rolls,results:allEvaluated?rolls.map(r=>({result:r.total,active:!0})):[]});return pool._evaluated=allEvaluated,pool}};__name2(_InstancePool,"InstancePool");let InstancePool=_InstancePool;const _AbstractDamageRoll=class extends Roll{static{__name(this,"_AbstractDamageRoll")}constructor(formula,data={},options={}){options.critRule=(()=>tupleHasValue(["double-damage","double-dice"],options.critRule)?options.critRule:game.settings.get("pf2e","critRule")==="doubledamage"?"double-damage":"double-dice")(),super(formula,data,options)}static replaceFormulaData(formula,data,options={}){return super.replaceFormulaData(formula.trim(),data,options).replace(/(?{AbstractDamageRoll.parser=function(){function createNumericTerm(number,{flavor=null,truncate=!1}={}){number=truncate?Math.trunc(number):number;const formula=flavor?`${number}[${flavor}]`:number.toString(),obj={class:"NumericTerm",number,formula,evaluated:!1};return flavor&&(obj.options={flavor}),obj}__name(createNumericTerm,"createNumericTerm"),__name2(createNumericTerm,"createNumericTerm");function peg$subclass(child,parent){function C(){this.constructor=child}__name(C,"C"),__name2(C,"C"),C.prototype=parent.prototype,child.prototype=new C}__name(peg$subclass,"peg$subclass"),__name2(peg$subclass,"peg$subclass");function peg$SyntaxError(message,expected,found,location){var self=Error.call(this,message);return Object.setPrototypeOf&&Object.setPrototypeOf(self,peg$SyntaxError.prototype),self.expected=expected,self.found=found,self.location=location,self.name="SyntaxError",self}__name(peg$SyntaxError,"peg$SyntaxError"),__name2(peg$SyntaxError,"peg$SyntaxError"),peg$subclass(peg$SyntaxError,Error);function peg$padEnd(str,targetLength,padString){return padString=padString||" ",str.length>targetLength?str:(targetLength-=str.length,padString+=padString.repeat(targetLength),str+padString.slice(0,targetLength))}__name(peg$padEnd,"peg$padEnd"),__name2(peg$padEnd,"peg$padEnd"),peg$SyntaxError.prototype.format=function(sources){var str="Error: "+this.message;if(this.location){var src=null,k;for(k=0;k `+loc+` -`+filler+` | -`+offset_s.line+" | "+line+` -`+filler+" | "+peg$padEnd("",s.column-1," ")+peg$padEnd("",hatLen,"^")}else str+=` - at `+loc}return str},peg$SyntaxError.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch){return ch.charCodeAt(0).toString(16).toUpperCase()}__name(hex,"hex"),__name2(hex,"hex");function literalEscape(s){return s.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch){return"\\x0"+hex(ch)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return"\\x"+hex(ch)})}__name(literalEscape,"literalEscape"),__name2(literalEscape,"literalEscape");function classEscape(s){return s.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch){return"\\x0"+hex(ch)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return"\\x"+hex(ch)})}__name(classEscape,"classEscape"),__name2(classEscape,"classEscape");function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}__name(describeExpectation,"describeExpectation"),__name2(describeExpectation,"describeExpectation");function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i,j;if(descriptions.sort(),descriptions.length>0){for(i=1,j=1;i{const operator=elements[1],operands=[result,elements.find(e=>typeof e=="number"||e instanceof Object&&e.class)].map(e=>typeof e=="number"?createNumericTerm(e,{truncate:!0}):e);return{class:"ArithmeticExpression",formula:text(),operator,operands,evaluated:!1}},head)},"peg$f0"),peg$f1=__name2(function(head,tail){return tail.reduce((result,elements)=>{const operator=elements[1],operands=[result,elements.find(e=>typeof e=="number"||e instanceof Object&&e.class)].map(e=>typeof e=="number"?createNumericTerm(e):e);return{class:"ArithmeticExpression",formula:text(),operator,operands,evaluated:!1}},head)},"peg$f1"),peg$f2=__name2(function(fn,head,tail){const terms=head!==null?[head,...tail].map(t=>typeof t=="number"?t.toString():t.formula):[];return{class:"MathTerm",formula:text(),fn,terms,evaluated:!1}},"peg$f2"),peg$f3=__name2(function(number,faces,modifiers,flavor){const obj=number instanceof Object||faces instanceof Object?{class:"IntermediateDie",formula:text(),number:typeof number=="number"?createNumericTerm(number):number,faces:typeof faces=="number"?createNumericTerm(faces):faces,evaluated:!1}:{class:"DiceTerm",formula:text(),number:number??1,faces,evaluated:!1};return modifiers&&(obj.modifiers=modifiers),flavor&&(obj.options={flavor}),obj},"peg$f3"),peg$f4=__name2(function(expression,flavor){const obj={class:"Grouping",formula:text(),term:typeof expression=="number"?createNumericTerm(expression):expression,evaluated:!1};return flavor&&(obj.options={flavor}),obj},"peg$f4"),peg$f5=__name2(function(head,tail,modifiers,flavor){const headTerm=typeof head=="number"?createNumericTerm(head):head,tailTerms=tail.map(t=>typeof t=="number"?createNumericTerm(t):t),terms=[headTerm.formula,...tailTerms.map(t=>t.formula)],firstRoll={class:"DamageInstance",formula:headTerm.formula,terms:[headTerm],evaluated:!1};headTerm.options?.flavor&&(firstRoll.options={flavor:headTerm.options.flavor});const rolls=[firstRoll,...tailTerms.map(term=>{const obj2={class:"DamageInstance",formula:term.formula,terms:[term],evaluated:!1};return term.options?.flavor&&(obj2.options={flavor:term.options.flavor}),obj2})],obj={class:"InstancePool",formula:text(),terms,rolls,evaluated:!1};return flavor&&(obj.options={flavor}),modifiers&&(obj.modifiers=modifiers),obj},"peg$f5"),peg$f6=__name2(function(string){return string},"peg$f6"),peg$f7=__name2(function(){const numified=Number(text());return input===text()?createNumericTerm(numified):numified},"peg$f7"),peg$f8=__name2(function(number,flavor){return createNumericTerm(number,{flavor})},"peg$f8"),peg$f9=__name2(function(){return Array.from(text().matchAll(/([A-z]+)([^A-z\s()+\-*\/]+)?/g)).map(m=>m[0])},"peg$f9"),peg$currPos=0,peg$savedPos=0,peg$posDetailsCache=[{line:1,column:1}],peg$maxFailPos=0,peg$maxFailExpected=[],peg$silentFails=0,peg$result;if("startRule"in options){if(!(options.startRule in peg$startRuleFunctions))throw new Error(`Can't start parsing from rule "`+options.startRule+'".');peg$startRuleFunction=peg$startRuleFunctions[options.startRule]}function text(){return input.substring(peg$savedPos,peg$currPos)}__name(text,"text"),__name2(text,"text");function peg$literalExpectation(text2,ignoreCase){return{type:"literal",text:text2,ignoreCase}}__name(peg$literalExpectation,"peg$literalExpectation"),__name2(peg$literalExpectation,"peg$literalExpectation");function peg$classExpectation(parts,inverted,ignoreCase){return{type:"class",parts,inverted,ignoreCase}}__name(peg$classExpectation,"peg$classExpectation"),__name2(peg$classExpectation,"peg$classExpectation");function peg$endExpectation(){return{type:"end"}}__name(peg$endExpectation,"peg$endExpectation"),__name2(peg$endExpectation,"peg$endExpectation");function peg$otherExpectation(description){return{type:"other",description}}__name(peg$otherExpectation,"peg$otherExpectation"),__name2(peg$otherExpectation,"peg$otherExpectation");function peg$computePosDetails(pos){var details=peg$posDetailsCache[pos],p;if(details)return details;for(p=pos-1;!peg$posDetailsCache[p];)p--;for(details=peg$posDetailsCache[p],details={line:details.line,column:details.column};ppeg$maxFailPos&&(peg$maxFailPos=peg$currPos,peg$maxFailExpected=[]),peg$maxFailExpected.push(expected))}__name(peg$fail,"peg$fail"),__name2(peg$fail,"peg$fail");function peg$buildStructuredError(expected,found,location){return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected,found),expected,found,location)}__name(peg$buildStructuredError,"peg$buildStructuredError"),__name2(peg$buildStructuredError,"peg$buildStructuredError");function peg$parseExpression(){var s0,s1,s2,s3,s4,s5,s6,s7;if(s0=peg$currPos,s1=peg$parsePool(),s1===peg$FAILED&&(s1=peg$parseTerm()),s1!==peg$FAILED){for(s2=[],s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===43?(s5=peg$c0,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e0)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===45?(s5=peg$c1,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e1))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parsePool(),s7===peg$FAILED&&(s7=peg$parseTerm()),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);s3!==peg$FAILED;)s2.push(s3),s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===43?(s5=peg$c0,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e0)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===45?(s5=peg$c1,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e1))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parsePool(),s7===peg$FAILED&&(s7=peg$parseTerm()),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);peg$savedPos=s0,s0=peg$f0(s1,s2)}else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseExpression,"peg$parseExpression"),__name2(peg$parseExpression,"peg$parseExpression");function peg$parseTerm(){var s0,s1,s2,s3,s4,s5,s6,s7;if(s0=peg$currPos,s1=peg$parseTermOperand(),s1!==peg$FAILED){for(s2=[],s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===42?(s5=peg$c2,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e2)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===47?(s5=peg$c3,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e3))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parseTermOperand(),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);s3!==peg$FAILED;)s2.push(s3),s3=peg$currPos,s4=peg$parse_(),input.charCodeAt(peg$currPos)===42?(s5=peg$c2,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e2)),s5===peg$FAILED&&(input.charCodeAt(peg$currPos)===47?(s5=peg$c3,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e3))),s5!==peg$FAILED?(s6=peg$parse_(),s7=peg$parseTermOperand(),s7!==peg$FAILED?(s4=[s4,s5,s6,s7],s3=s4):(peg$currPos=s3,s3=peg$FAILED)):(peg$currPos=s3,s3=peg$FAILED);peg$savedPos=s0,s0=peg$f1(s1,s2)}else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseTerm,"peg$parseTerm"),__name2(peg$parseTerm,"peg$parseTerm");function peg$parseTermOperand(){var s0;return s0=peg$parseDiceTerm(),s0===peg$FAILED&&(s0=peg$parseMathTerm(),s0===peg$FAILED&&(s0=peg$parseGrouping(),s0===peg$FAILED&&(s0=peg$parseFlavoredNumber(),s0===peg$FAILED&&(s0=peg$parseNumber())))),s0}__name(peg$parseTermOperand,"peg$parseTermOperand"),__name2(peg$parseTermOperand,"peg$parseTermOperand");function peg$parseMathTerm(){var s0,s1,s2,s4,s6,s7,s8,s9,s11;if(s0=peg$currPos,s1=peg$parseIdentifier(),s1!==peg$FAILED)if(input.charCodeAt(peg$currPos)===40?(s2=peg$c4,peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e4)),s2!==peg$FAILED){for(peg$parse_(),s4=peg$parseExpression(),s4===peg$FAILED&&(s4=null),peg$parse_(),s6=[],s7=peg$currPos,s8=peg$parse_(),input.charCodeAt(peg$currPos)===44?(s9=peg$c5,peg$currPos++):(s9=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s9!==peg$FAILED?(peg$parse_(),s11=peg$parseExpression(),s11!==peg$FAILED?s7=s11:(peg$currPos=s7,s7=peg$FAILED)):(peg$currPos=s7,s7=peg$FAILED);s7!==peg$FAILED;)s6.push(s7),s7=peg$currPos,s8=peg$parse_(),input.charCodeAt(peg$currPos)===44?(s9=peg$c5,peg$currPos++):(s9=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s9!==peg$FAILED?(peg$parse_(),s11=peg$parseExpression(),s11!==peg$FAILED?s7=s11:(peg$currPos=s7,s7=peg$FAILED)):(peg$currPos=s7,s7=peg$FAILED);s7=peg$parse_(),input.charCodeAt(peg$currPos)===41?(s8=peg$c6,peg$currPos++):(s8=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e6)),s8!==peg$FAILED?(peg$savedPos=s0,s0=peg$f2(s1,s4,s6)):(peg$currPos=s0,s0=peg$FAILED)}else peg$currPos=s0,s0=peg$FAILED;else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseMathTerm,"peg$parseMathTerm"),__name2(peg$parseMathTerm,"peg$parseMathTerm");function peg$parseDiceTerm(){var s0,s1,s2,s3,s4,s5;return s0=peg$currPos,s1=peg$parseGrouping(),s1===peg$FAILED&&(s1=peg$parseMathTerm(),s1===peg$FAILED&&(s1=peg$parseNumber())),s1===peg$FAILED&&(s1=null),peg$r0.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e7)),s2!==peg$FAILED?(s3=peg$parseGrouping(),s3===peg$FAILED&&(s3=peg$parseMathTerm(),s3===peg$FAILED&&(s3=peg$parseNumber(),s3===peg$FAILED&&(s3=peg$parseIdentifier()))),s3!==peg$FAILED?(s4=peg$parseModifiers(),s4===peg$FAILED&&(s4=null),s5=peg$parseFlavor(),s5===peg$FAILED&&(s5=null),peg$savedPos=s0,s0=peg$f3(s1,s3,s4,s5)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseDiceTerm,"peg$parseDiceTerm"),__name2(peg$parseDiceTerm,"peg$parseDiceTerm");function peg$parseGrouping(){var s0,s1,s3,s5,s6;return s0=peg$currPos,input.charCodeAt(peg$currPos)===40?(s1=peg$c4,peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e4)),s1!==peg$FAILED?(peg$parse_(),s3=peg$parseExpression(),s3!==peg$FAILED?(peg$parse_(),input.charCodeAt(peg$currPos)===41?(s5=peg$c6,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e6)),s5!==peg$FAILED?(s6=peg$parseFlavor(),s6===peg$FAILED&&(s6=null),peg$savedPos=s0,s0=peg$f4(s3,s6)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseGrouping,"peg$parseGrouping"),__name2(peg$parseGrouping,"peg$parseGrouping");function peg$parsePool(){var s0,s1,s3,s4,s5,s6,s7,s8;if(s0=peg$currPos,input.charCodeAt(peg$currPos)===123?(s1=peg$c7,peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e8)),s1!==peg$FAILED)if(peg$parse_(),s3=peg$parseExpression(),s3!==peg$FAILED){for(s4=[],s5=peg$currPos,input.charCodeAt(peg$currPos)===44?(s6=peg$c5,peg$currPos++):(s6=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s6!==peg$FAILED?(s7=peg$parse_(),s8=peg$parseExpression(),s8!==peg$FAILED?s5=s8:(peg$currPos=s5,s5=peg$FAILED)):(peg$currPos=s5,s5=peg$FAILED);s5!==peg$FAILED;)s4.push(s5),s5=peg$currPos,input.charCodeAt(peg$currPos)===44?(s6=peg$c5,peg$currPos++):(s6=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e5)),s6!==peg$FAILED?(s7=peg$parse_(),s8=peg$parseExpression(),s8!==peg$FAILED?s5=s8:(peg$currPos=s5,s5=peg$FAILED)):(peg$currPos=s5,s5=peg$FAILED);input.charCodeAt(peg$currPos)===125?(s5=peg$c8,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e9)),s5!==peg$FAILED?(s6=peg$parseModifiers(),s6===peg$FAILED&&(s6=null),s7=peg$parseFlavor(),s7===peg$FAILED&&(s7=null),peg$savedPos=s0,s0=peg$f5(s3,s4,s6,s7)):(peg$currPos=s0,s0=peg$FAILED)}else peg$currPos=s0,s0=peg$FAILED;else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parsePool,"peg$parsePool"),__name2(peg$parsePool,"peg$parsePool");function peg$parseFlavor(){var s0,s1,s2,s3;return s0=peg$currPos,input.charCodeAt(peg$currPos)===91?(s1=peg$c9,peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e10)),s1!==peg$FAILED?(s2=peg$currPos,s3=peg$parseFlavorString(),s3!==peg$FAILED?s2=input.substring(s2,peg$currPos):s2=s3,s2!==peg$FAILED?(input.charCodeAt(peg$currPos)===93?(s3=peg$c10,peg$currPos++):(s3=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e11)),s3!==peg$FAILED?(peg$savedPos=s0,s0=peg$f6(s2)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseFlavor,"peg$parseFlavor"),__name2(peg$parseFlavor,"peg$parseFlavor");function peg$parseNumber(){var s0,s3,s4,s5,s6,s7;if(s0=peg$currPos,peg$parse_(),peg$r1.test(input.charAt(peg$currPos))?(input.charAt(peg$currPos),peg$currPos++):peg$silentFails===0&&peg$fail(peg$e12),s3=[],peg$r2.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13)),s4!==peg$FAILED)for(;s4!==peg$FAILED;)s3.push(s4),peg$r2.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13));else s3=peg$FAILED;if(s3!==peg$FAILED){if(s4=peg$currPos,input.charCodeAt(peg$currPos)===46?(s5=peg$c11,peg$currPos++):(s5=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e14)),s5!==peg$FAILED){if(s6=[],peg$r2.test(input.charAt(peg$currPos))?(s7=input.charAt(peg$currPos),peg$currPos++):(s7=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13)),s7!==peg$FAILED)for(;s7!==peg$FAILED;)s6.push(s7),peg$r2.test(input.charAt(peg$currPos))?(s7=input.charAt(peg$currPos),peg$currPos++):(s7=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e13));else s6=peg$FAILED;s6!==peg$FAILED?(s5=[s5,s6],s4=s5):(peg$currPos=s4,s4=peg$FAILED)}else peg$currPos=s4,s4=peg$FAILED;s4===peg$FAILED&&(s4=null),peg$savedPos=s0,s0=peg$f7()}else peg$currPos=s0,s0=peg$FAILED;return s0}__name(peg$parseNumber,"peg$parseNumber"),__name2(peg$parseNumber,"peg$parseNumber");function peg$parseFlavoredNumber(){var s0,s1,s2;return s0=peg$currPos,s1=peg$parseNumber(),s1!==peg$FAILED?(s2=peg$parseFlavor(),s2!==peg$FAILED?(peg$savedPos=s0,s0=peg$f8(s1,s2)):(peg$currPos=s0,s0=peg$FAILED)):(peg$currPos=s0,s0=peg$FAILED),s0}__name(peg$parseFlavoredNumber,"peg$parseFlavoredNumber"),__name2(peg$parseFlavoredNumber,"peg$parseFlavoredNumber");function peg$parseIdentifier(){var s0,s1,s2,s3,s4;if(s0=peg$currPos,s1=peg$currPos,peg$r3.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e15)),s2!==peg$FAILED){for(s3=[],peg$r4.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e16));s4!==peg$FAILED;)s3.push(s4),peg$r4.test(input.charAt(peg$currPos))?(s4=input.charAt(peg$currPos),peg$currPos++):(s4=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e16));s2=[s2,s3],s1=s2}else peg$currPos=s1,s1=peg$FAILED;return s1!==peg$FAILED?s0=input.substring(s0,peg$currPos):s0=s1,s0}__name(peg$parseIdentifier,"peg$parseIdentifier"),__name2(peg$parseIdentifier,"peg$parseIdentifier");function peg$parseModifiers(){var s0,s1,s2;if(s0=peg$currPos,s1=[],peg$r5.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e17)),s2!==peg$FAILED)for(;s2!==peg$FAILED;)s1.push(s2),peg$r5.test(input.charAt(peg$currPos))?(s2=input.charAt(peg$currPos),peg$currPos++):(s2=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e17));else s1=peg$FAILED;return s1!==peg$FAILED&&(peg$savedPos=s0,s1=peg$f9()),s0=s1,s0}__name(peg$parseModifiers,"peg$parseModifiers"),__name2(peg$parseModifiers,"peg$parseModifiers");function peg$parseFlavorString(){var s0,s1;if(peg$silentFails++,s0=[],peg$r6.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e19)),s1!==peg$FAILED)for(;s1!==peg$FAILED;)s0.push(s1),peg$r6.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e19));else s0=peg$FAILED;return peg$silentFails--,s0===peg$FAILED&&(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e18)),s0}__name(peg$parseFlavorString,"peg$parseFlavorString"),__name2(peg$parseFlavorString,"peg$parseFlavorString");function peg$parse_(){var s0,s1;for(peg$silentFails++,s0=[],peg$r7.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e21));s1!==peg$FAILED;)s0.push(s1),peg$r7.test(input.charAt(peg$currPos))?(s1=input.charAt(peg$currPos),peg$currPos++):(s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e21));return peg$silentFails--,s1=peg$FAILED,peg$silentFails===0&&peg$fail(peg$e20),s0}if(__name(peg$parse_,"peg$parse_"),__name2(peg$parse_,"peg$parse_"),peg$result=peg$startRuleFunction(),peg$result!==peg$FAILED&&peg$currPos===input.length)return peg$result;throw peg$result!==peg$FAILED&&peg$currPos{try{return this.parser.parse(replaced)}catch{return console.error(`Failed to parse damage formula "${formula}"`),null}})();if(poolData){if(!["PoolTerm","InstancePool"].includes(poolData.class??""))throw ErrorPF2e("A damage roll must consist of a single InstancePool")}else return[];return this.classifyDice(poolData),[InstancePool.fromData(poolData)]}static validate(formula){formula=formula.trim();const wrapped=this.replaceFormulaData(formula.startsWith("{")?formula:`{${formula}}`,{});try{const result=this.parser.parse(wrapped.replace(/@([a-z.0-9_-]+)/gi,"1"));return isObject(result)&&"class"in result&&["PoolTerm","InstancePool"].includes(String(result.class))}catch{return!1}}static classifyDice(data){const isDiceTerm=__name2(v=>isObject(v)&&v.class==="DiceTerm","isDiceTerm"),deepFindDice=__name2(value=>{const accumulated=[];if(isDiceTerm(value))accumulated.push(value);else if(value instanceof Object){const objects=Object.values(value).filter(v=>v instanceof Object);accumulated.push(...objects.flatMap(o=>deepFindDice(o)))}return accumulated},"deepFindDice"),diceTerms=deepFindDice(data);for(const term of diceTerms)if(typeof term.faces=="number"||term.faces instanceof Object)term.class="Die";else if(typeof term.faces=="string"){const termClassName=CONFIG.Dice.terms[term.faces]?.name;if(!termClassName)throw ErrorPF2e(`No matching DiceTerm class for "${term.faces}"`);term.class=termClassName}}get formula(){const{instances}=this,firstInstance=instances.at(0);if(firstInstance){if(instances.length===1&&firstInstance.head instanceof Grouping){const instanceFormula=firstInstance.formula;return instanceFormula.startsWith("(")?instanceFormula.slice(1).replace(/\)([^)]*)$/i,"$1"):instanceFormula}}else return super.formula;return instances.map(i=>i.formula).join(" + ")}get instances(){const pool=this.terms[0];return pool instanceof PoolTerm?pool.rolls.filter(r=>r instanceof DamageInstance):[]}get materials(){return[...new Set(this.instances.flatMap(i=>i.materials))]}get dice(){const{instances}=this;return instances.length>0?instances.flatMap(i=>i.dice):super.dice}get minimumValue(){return this.instances.reduce((sum2,i)=>sum2+i.minimumValue,0)}get expectedValue(){return this.instances.reduce((sum2,i)=>sum2+i.expectedValue,0)}get maximumValue(){return this.instances.reduce((sum2,i)=>sum2+i.maximumValue,0)}static fromData(data){for(const term of data.terms)this.classifyDice(term);return super.fromData(data)}_evaluateTotal(){const total=super._evaluateTotal();return this.instances.some(i=>!i.persistent)&&total<=0?(this.options.increasedFrom=total,Promise.resolve().then(()=>{this.alter(1,1-total)}),1):total}async getTooltip(){const instances=this.instances.filter(i=>i.dice.length>0&&(!i.persistent||i.options.evaluatePersistent)).map(i=>({type:i.type,typeLabel:i.typeLabel,iconClass:i.iconClass,dice:i.dice.map(d=>({...d.getTooltipData()}))}));return renderTemplate(this.constructor.TOOLTIP_TEMPLATE,{instances})}async render({flavor,template=this.constructor.CHAT_TEMPLATE,isPrivate=!1}={}){const{instances}=this;if(!instances.at(-1))return super.render({flavor,template,isPrivate});this._evaluated||await this.evaluate({async:!0});const chatData={formula:isPrivate?"???":(await Promise.all(instances.map(i=>i.render()))).join(" + "),user:game.user.id,tooltip:isPrivate||this.dice.length===0?"":await this.getTooltip(),instances:isPrivate?[]:instances,total:isPrivate?"?":Math.floor(this.total*100/100),increasedFrom:this.options.increasedFrom,splashOnly:!!this.options.splashOnly,allPersistent:this.instances.every(i=>i.persistent&&!i.options.evaluatePersistent),showTripleDamage:game.settings.get("pf2e","critFumbleButtons")};return renderTemplate(template,chatData)}alter(multiplier,addend,{multiplyNumeric=!0}={}){const{instances}=this;if(!this._evaluated||instances.length===0)return super.alter(multiplier,addend,{multiplyNumeric});if(multiplier===1&&addend===0)return this;const instanceClones=multiplier===1?this.instances.map(i=>DamageInstance.fromData(i.toJSON())):instances.map(instance=>{const{head}=instance,rightOperand=head instanceof ArithmeticExpression&&["+","-"].includes(head.operator)?{class:"Grouping",term:head.toJSON()}:head.toJSON(),multiplierTerm={class:"NumericTerm",number:multiplier},expression=ArithmeticExpression.fromData({operator:"*",operands:[deepClone(multiplierTerm),rightOperand]});return[2,3].includes(multiplier)&&(expression.options.crit=multiplier),DamageInstance.fromTerms([expression],deepClone(instance.options))});if(addend!==0){const firstInstance=instanceClones[0],term=firstInstance.head.toJSON(),options=term.options??{};delete term.options;const termClone={class:"Grouping",term,options},addendTerm={class:"NumericTerm",number:Math.abs(addend)},expression=ArithmeticExpression.fromData({operator:addend>0?"+":"-",operands:[termClone,addendTerm],evaluated:!0});instanceClones[0]=DamageInstance.fromTerms([expression],deepClone(firstInstance.options))}return _DamageRoll2.fromTerms([InstancePool.fromRolls(instanceClones)])}};__name2(_DamageRoll,"DamageRoll"),__publicField(_DamageRoll,"CHAT_TEMPLATE","systems/pf2e/templates/dice/damage-roll.hbs"),__publicField(_DamageRoll,"TOOLTIP_TEMPLATE","systems/pf2e/templates/dice/damage-tooltip.hbs");let DamageRoll=_DamageRoll;const _DamageInstance=class _DamageInstance2 extends AbstractDamageRoll{static{__name(this,"_DamageInstance")}constructor(formula,data={},options={}){super(formula.trim(),data,options),__privateAdd(this,_renderFormula),__publicField(this,"type"),__publicField(this,"persistent"),__publicField(this,"materials");const flavorIdentifiers=options.flavor?.replace(/[^a-z,_-]/g,"").split(",")??[];this.type=flavorIdentifiers.find(t=>objectHasKey(CONFIG.PF2E.damageTypes,t))??"untyped",this.persistent=flavorIdentifiers.includes("persistent")||flavorIdentifiers.includes("bleed"),this.materials=flavorIdentifiers.filter(i=>objectHasKey(CONFIG.PF2E.materialDamageEffects,i))}static parse(formula,data){const replaced=this.replaceFormulaData(formula,data,{missing:"0"}),syntaxTree2=(()=>{try{return this.parser.parse(replaced)}catch{return console.error(`Failed to parse damage formula "${formula}"`),null}})();return syntaxTree2?(DamageRoll.classifyDice(syntaxTree2),[RollTerm.fromData(syntaxTree2)]):[]}static fromData(data){for(const term of data.terms)DamageRoll.classifyDice(term);const roll=super.fromData(data);return roll.terms=roll.terms.map(t=>simplifyTerm(t)),roll}static getValue(term,type="expected"){if(term instanceof NumericTerm)return term.number;if(term instanceof MathTerm)try{return Roll.safeEval(term.formula)}catch{return 0}switch(type){case"minimum":if(term instanceof Die)return term.number;if(term instanceof ArithmeticExpression||term instanceof Grouping||term instanceof IntermediateDie)return term.minimumValue;break;case"maximum":if(term instanceof Die)return term.number*term.faces;if(term instanceof ArithmeticExpression||term instanceof Grouping||term instanceof IntermediateDie)return term.maximumValue;break;default:{if(term instanceof Die)return term.number*((term.faces+1)/2);if(term instanceof ArithmeticExpression||term instanceof Grouping||term instanceof IntermediateDie)return term.expectedValue}}return 0}get formula(){const typeFlavor=game.i18n.localize(CONFIG.PF2E.damageRollFlavors[this.type]??this.type),damageType=this.persistent&&this.type!=="bleed"?game.i18n.format("PF2E.Damage.RollFlavor.persistent",{damageType:typeFlavor}):this.type!=="untyped"?typeFlavor:"";return[this.head.expression,damageType].join(" ").trim()}get total(){const maybeNumber=this.persistent&&!this.options.evaluatePersistent?0:super.total;return typeof maybeNumber=="number"?Math.floor(maybeNumber):maybeNumber}get minimumValue(){return _DamageInstance2.getValue(this.head,"minimum")}get expectedValue(){return _DamageInstance2.getValue(this.head)}get maximumValue(){return _DamageInstance2.getValue(this.head,"maximum")}get formalDescription(){const typeCategory=DamageCategorization.fromDamageType(this.type);return new Set(["damage",`damage:type:${this.type}`,typeCategory?`damage:category:${typeCategory}`:[],this.persistent?"damage:category:persistent":[],this.materials.map(m=>`damage:material:${m}`)].flat())}get iconClass(){return DAMAGE_TYPE_ICONS[this.type]}_evaluateTotal(){return this.persistent&&!this.options.evaluatePersistent?0:super._evaluateTotal()}async render(){const span=document.createElement("span");if(span.classList.add(this.type,"damage","instance","color"),span.title=this.typeLabel,span.append(__privateMethod(this,_renderFormula,renderFormula_fn).call(this)),this.persistent&&this.type!=="bleed"){const icon=fontAwesomeIcon("hourglass",{style:"duotone"});icon.classList.add("icon"),span.append(" ",icon)}const{iconClass}=this;if(iconClass){(!this.persistent||this.type==="bleed")&&span.append(" ");const icon=fontAwesomeIcon(iconClass);icon.classList.add("icon"),span.append(icon)}return span.outerHTML}get dice(){return this._dice.concat(this.terms.reduce((dice,t)=>t instanceof DiceTerm?[...dice,t]:t instanceof Grouping||t instanceof ArithmeticExpression||t instanceof IntermediateDie?[...dice,...t.dice]:[],this._dice).flat())}get head(){return this.terms[0]}get category(){return DamageCategorization.fromDamageType(this.type)}get typeLabel(){const damageType=game.i18n.localize(CONFIG.PF2E.damageTypes[this.type]);return this.persistent&&this.type!=="bleed"?game.i18n.format("PF2E.Damage.PersistentTooltip",{damageType}):damageType}get critImmuneTotal(){if(!this._evaluated)return;const{head}=this,undoubledTotal=head instanceof ArithmeticExpression||head instanceof Grouping?head.critImmuneTotal:this.total;if(this.options.critRule==="double-damage")return undoubledTotal;{const secondHalf=this.dice.filter(d=>/\bdoubled\b/.test(d.flavor)).flatMap(d=>d.results.slice(Math.ceil(d.results.length/2)));return undoubledTotal-secondHalf.reduce((sum2,r)=>sum2+r.result,0)}}componentTotal(component){if(!this._evaluated)throw ErrorPF2e("Component totals may only be accessed from an evaluated damage instance");return deepFindTerms(this.head,{flavor:component}).reduce((total,t)=>total+(Number(t.total)||0)*Number(t.options.crit||1),0)}async _evaluate(params){if(await super._evaluate(params),this.persistent&&!this.options.evaluatePersistent){const results=this.dice.flatMap(d=>d.results);for(const result of results)result.hidden=!0}return this}};_renderFormula=new WeakSet,renderFormula_fn=__name2(function(){const head=this.head instanceof Grouping?this.head.term:this.head;return head instanceof ArithmeticExpression?head.render():["precision","splash"].includes(head.flavor)?renderComponentDamage(head):head.expression},"#renderFormula"),__name2(_DamageInstance,"DamageInstance");let DamageInstance=_DamageInstance;function nextDamageDieSize(next){const[faces,direction]="upgrade"in next?[next.upgrade,1]:[next.downgrade,-1];return DAMAGE_DIE_FACES_TUPLE[DAMAGE_DIE_FACES_TUPLE.indexOf(faces)+direction]??faces}__name(nextDamageDieSize,"nextDamageDieSize"),__name2(nextDamageDieSize,"nextDamageDieSize");const DamageCategorization={fromDamageType:damageType=>BASE_DAMAGE_TYPES_TO_CATEGORIES[damageType],allCategories:()=>new Set(Object.values(BASE_DAMAGE_TYPES_TO_CATEGORIES)),baseCategories:()=>new Set(Object.values(BASE_DAMAGE_TYPES_TO_CATEGORIES)),toDamageTypes:category=>{const types=Object.entries(BASE_DAMAGE_TYPES_TO_CATEGORIES).filter(([_key,value])=>value===category).map(([key])=>key);return new Set(types)}},FACES=[4,6,8,10,12];function applyDamageDiceOverrides(base,dice){const overrideDice=dice.filter(d=>!d.ignored&&!!d.override);if(overrideDice.length)for(const data of base)for(const adjustment of overrideDice){const die=data.terms?.find(t=>!!t.dice);if(!(!die||adjustment.damageType&&adjustment.damageType!==data.damageType)){if(die.dice.number=adjustment.override.diceNumber??die.dice.number,adjustment.override.dieSize){const faces=Number(/\d{1,2}/.exec(adjustment.override.dieSize)?.shift());Number.isInteger(faces)&&(die.dice.faces=faces)}else if(adjustment.override.upgrade||adjustment.override.downgrade){const direction=adjustment.override.upgrade?1:-1;die.dice.faces=FACES[FACES.indexOf(die.dice.faces)+direction]??die.dice.faces}adjustment.override.damageType&&(data.damageType=adjustment.override.damageType)}}}__name(applyDamageDiceOverrides,"applyDamageDiceOverrides"),__name2(applyDamageDiceOverrides,"applyDamageDiceOverrides");function extractBaseDamage(roll){function recursiveExtractTerms(expression,{category=null}={}){if(category=setHasElement(DAMAGE_CATEGORIES_UNIQUE,expression.options.flavor)?expression.options.flavor:category,expression instanceof Grouping)return recursiveExtractTerms(expression.term,{category});if(expression instanceof Die)return[{dice:pick$1(expression,["number","faces"]),modifier:0,category}];if(expression instanceof IntermediateDie){if(typeof expression.number!="number"||typeof expression.faces!="number")throw ErrorPF2e("Unable to parse DamageRoll with non-deterministic intermediate expressions.");return[{dice:{number:expression.number,faces:expression.faces},modifier:0,category}]}if(expression.isDeterministic)return[{dice:null,modifier:DamageInstance.getValue(expression,"expected"),category}];if(expression instanceof ArithmeticExpression){const operator=expression.operator;if(operator==="*"||operator==="/")throw ErrorPF2e(`Cannot use ${operator} on non-deterministic artithmetic terms`);const leftTerms=recursiveExtractTerms(expression.operands[0],{category}),rightTerms=recursiveExtractTerms(expression.operands[1],{category});if(operator==="-")for(const term of rightTerms)term.dice&&(term.dice.number*=-1),term.modifier*=-1;const groups=groupBy$1([...leftTerms,...rightTerms],t=>t.category??"");return Object.values(groups).flatMap(terms=>{const category2=terms[0].category;return combinePartialTerms(terms).map(t=>({...t,category:category2}))})}throw expression.isDeterministic?ErrorPF2e("Unrecognized roll term type "+expression.constructor.name):ErrorPF2e(`Unable to parse DamageRoll with non-deterministic ${expression.constructor.name}.`)}return __name(recursiveExtractTerms,"recursiveExtractTerms"),__name2(recursiveExtractTerms,"recursiveExtractTerms"),roll.instances.flatMap(instance=>{const category=setHasElement(DAMAGE_CATEGORIES_UNIQUE,instance.category)?instance.category:null,terms=recursiveExtractTerms(instance.head,{category});return Object.values(groupBy$1(terms,t=>t.category??"")).map(terms2=>{const category2=instance.persistent?"persistent":terms2[0].category;return{damageType:instance.type,category:category2,terms:terms2.map(t=>omit(t,["category"]))}})})}__name(extractBaseDamage,"extractBaseDamage"),__name2(extractBaseDamage,"extractBaseDamage");function renderComponentDamage(term){if(!["precision","splash"].includes(term.flavor))throw ErrorPF2e("Unexpected error rendering damage roll");const span=document.createElement("span");span.className=term.flavor;const[title,faClass]=term.flavor==="precision"?[game.i18n.localize("PF2E.Damage.Precision"),"crosshairs"]:[game.i18n.localize("PF2E.TraitSplash"),"burst"];span.title=title;const icon=fontAwesomeIcon(faClass);return icon.classList.add("icon"),span.append(term.expression," ",icon),span}__name(renderComponentDamage,"renderComponentDamage"),__name2(renderComponentDamage,"renderComponentDamage");function isSystemDamageTerm(term){return term instanceof ArithmeticExpression||term instanceof Grouping}__name(isSystemDamageTerm,"isSystemDamageTerm"),__name2(isSystemDamageTerm,"isSystemDamageTerm");function deepFindTerms(term,{flavor}){const childTerms=term instanceof Grouping?[term.term]:term instanceof ArithmeticExpression?term.operands:[];return[term.flavor.split(",").includes(flavor)?[term]:[],childTerms.map(t=>deepFindTerms(t,{flavor})).flat()].flat()}__name(deepFindTerms,"deepFindTerms"),__name2(deepFindTerms,"deepFindTerms");function simplifyTerm(term){if(term instanceof IntermediateDie)return term.die??term;const shouldPreserve=__name2(t=>!t.isDeterministic||t instanceof NumericTerm||isFlavoredArithmetic(t),"shouldPreserve");if(shouldPreserve(term)||term instanceof Grouping&&shouldPreserve(term.term))return term;try{const total=term.total??Roll.defaultImplementation.safeEval(term.expression);if(typeof total!="number"||Number.isNaN(total))throw Error(`Unable to evaluate deterministic term: ${term.expression}`);return NumericTerm.fromData({class:"NumericTerm",number:total,evaluated:term._evaluated,options:term.options})}catch{return term}}__name(simplifyTerm,"simplifyTerm"),__name2(simplifyTerm,"simplifyTerm");function isFlavoredArithmetic(term){return term instanceof ArithmeticExpression&&term.operands.some(o=>o.options.flavor)}__name(isFlavoredArithmetic,"isFlavoredArithmetic"),__name2(isFlavoredArithmetic,"isFlavoredArithmetic");function looksLikeDamageRoll(roll){const{dice}=roll;return dice.length===0||dice.some(d=>[4,6,8,10,12].includes(d.faces??20))&&!dice.some(d=>[2,20].includes(d.faces??20))}__name(looksLikeDamageRoll,"looksLikeDamageRoll"),__name2(looksLikeDamageRoll,"looksLikeDamageRoll");function damageDiceIcon(roll,{fixedWidth=!1}={}){const firstTerm=roll instanceof DamageRoll&&roll.instances[0]?.head instanceof IntermediateDie?roll.instances[0]?.head:null;if(firstTerm?.faces instanceof NumericTerm&&[4,8,6,10,12].includes(firstTerm.faces.number))return fontAwesomeIcon(`dice-d${firstTerm.faces.number}`,{fixedWidth});const firstDice=roll.dice.at(0),glyph=firstDice instanceof Die&&[4,8,6,10,12].includes(firstDice.faces)?`dice-d${firstDice.faces}`:firstDice?"dice-d20":"calculator";return fontAwesomeIcon(glyph,{fixedWidth})}__name(damageDiceIcon,"damageDiceIcon"),__name2(damageDiceIcon,"damageDiceIcon");function markAsCrit(term,multiplier){term.options.crit=multiplier,term instanceof ArithmeticExpression?(markAsCrit(term.operands[0],multiplier),markAsCrit(term.operands[1],multiplier)):term instanceof Grouping&&markAsCrit(term.term,multiplier)}__name(markAsCrit,"markAsCrit"),__name2(markAsCrit,"markAsCrit");const _PersistentDamageDialog=class extends Application{static{__name(this,"_PersistentDamageDialog")}constructor(actor,options={}){super(options),__privateAdd(this,_prepareDamageTypes),__privateAdd(this,_getInputElements),this.actor=actor,actor.apps[this.appId]=this}static get defaultOptions(){return{...super.defaultOptions,classes:["persistent-damage-dialog"],template:"systems/pf2e/templates/items/persistent-damage-dialog.hbs",width:380,height:"auto"}}get id(){return`persistent-damage-${this.actor.id}`}get title(){return game.i18n.format("PF2E.Item.Condition.PersistentDamage.Dialog.Title",{actor:this.actor.name})}async getData(){return{existing:this.actor.itemTypes.condition.filter(c=>c.slug==="persistent-damage").map(c=>({id:c.id,bullet:damageDiceIcon(c.system.persistent.damage).outerHTML,active:c.active,...pick(c.system.persistent,["formula","damageType","dc"])})),damageTypes:__privateMethod(this,_prepareDamageTypes,prepareDamageTypes_fn).call(this)}}activateListeners($html){const html=$html[0];for(const section of htmlQueryAll(html,".persistent-entry[data-id")){const id=section.dataset.id,existing=this.actor.items.get(id,{strict:!0}),elements=__privateMethod(this,_getInputElements,getInputElements_fn).call(this,section);for(const element of Object.values(elements))element?.addEventListener("change",()=>{const formula=elements.formula?.value.trim()??"",damageType=elements.damageType?.value,dc=Number(elements.dc?.value)||15;formula===""||!DamageRoll.validate(`(${formula})[${damageType}]`)?elements.formula?.classList.add("invalid"):existing.update({system:{persistent:{formula,damageType,dc}}})});htmlQuery(section,"[data-action=delete")?.addEventListener("click",()=>{existing.delete()})}html.querySelector("[data-action=add]")?.addEventListener("click",event=>{const section=htmlClosest(event.target,".persistent-entry");if(!section)return;const elements=__privateMethod(this,_getInputElements,getInputElements_fn).call(this,section),formula=elements.formula?.value.trim()||"1d6",damageType=elements.damageType?.value,dc=Number(elements.dc?.value)||15;if(!DamageRoll.validate(`(${formula})[${damageType}]`))elements.formula?.classList.add("invalid");else{const baseConditionSource=game.pf2e.ConditionManager.getCondition("persistent-damage").toObject(),persistentSource=mergeObject(baseConditionSource,{system:{persistent:{formula,damageType,dc}}});this.actor.createEmbeddedDocuments("Item",[persistentSource])}}),html.querySelector("[data-action=roll-persistent]")?.addEventListener("click",()=>{const existing=this.actor.itemTypes.condition.filter(c=>c.slug==="persistent-damage");for(const condition of existing)condition.onEndTurn()})}_injectHTML($html){super._injectHTML($html);const html=$html[0];((this.options.editing?htmlQuery(html,`[data-id=${this.options.editing}] .formula`):null)??htmlQuery(html,".new .formula"))?.focus()}};_prepareDamageTypes=new WeakSet,prepareDamageTypes_fn=__name2(function(){return Object.keys(CONFIG.PF2E.damageTypes).map(type=>{const labels=CONFIG.PF2E.damageTypes,faGlyph=DAMAGE_TYPE_ICONS[type]??"question";return{type,iconClass:`fa-${faGlyph}`,label:game.i18n.localize(labels[type]??type)}}).sort(sortBy(type=>type.label))},"#prepareDamageTypes"),_getInputElements=new WeakSet,getInputElements_fn=__name2(function(section){return{formula:htmlQuery(section,".formula"),damageType:htmlQuery(section,".damageType"),dc:htmlQuery(section,".dc")}},"#getInputElements"),__name2(_PersistentDamageDialog,"PersistentDamageDialog");let PersistentDamageDialog=_PersistentDamageDialog;async function editPersistent(options){const actors=Array.isArray(options.actors)?options.actors:[options.actors];if(!actors?.length){ui.notifications.error(game.i18n.localize("PF2E.ErrorMessage.NoTokenSelected"));return}for(const actor of actors)actor&&new PersistentDamageDialog(actor).render(!0)}__name(editPersistent,"editPersistent"),__name2(editPersistent,"editPersistent");function encouragingWords(options){const localize=localizer("PF2E.Actions.EncouragingWords"),actors=Array.isArray(options.actors)?options.actors:[options.actors],actor=actors[0];if(actors.length>1||!(actor instanceof CharacterPF2e)){ui.notifications.error(localize("BadArgs"));return}const encouragingWordsMacro=__name2(async(DC,bonus,diplomacy)=>{diplomacy.roll({dc:{value:DC},extraRollOptions:["action:encouraging-words"],callback:async roll=>{let healFormula,successLabel;const degreeOfSuccess=Number(roll.options.degreeOfSuccess)||0,bonusString=bonus>0?`+ ${bonus}`:"";if(degreeOfSuccess===3?(healFormula=`2d8${bonusString}`,successLabel=localize("CritSuccess")):degreeOfSuccess===2?(healFormula=`1d8${bonusString}`,successLabel=localize("Success")):degreeOfSuccess===1?successLabel=localize("Failure"):degreeOfSuccess===0&&(healFormula="1d8",successLabel=localize("CritFailure")),healFormula){const healRoll=await new Roll(healFormula).roll({async:!0}),rollType=degreeOfSuccess>1?localize("Recovery"):localize("Damage"),token=actor.getActiveTokens().shift()?.document??null;ChatMessagePF2e.create({speaker:ChatMessagePF2e.getSpeaker({actor,token}),type:CONST.CHAT_MESSAGE_TYPES.ROLL,flavor:`${rollType} ${localize("Title")} (${successLabel})`,rolls:[healRoll.toJSON()]})}}})},"encouragingWordsMacro"),applyChanges=__name2($html=>{const{diplomacy}=actor.skills,mod=Number($html.find("[name=modifier]").val())||0,requestedProf=Number($html.find("[name=dc-type]").val())||1,rank=diplomacy.rank??0,usedProf=requestedProf<=rank?requestedProf:rank,roll=[()=>ui.notifications.warn(localize("NotTrained",{name:actor.name})),()=>encouragingWordsMacro(15+mod,0,diplomacy),()=>encouragingWordsMacro(20+mod,5,diplomacy),()=>encouragingWordsMacro(30+mod,15,diplomacy),()=>encouragingWordsMacro(40+mod,25,diplomacy)][usedProf];roll()},"applyChanges");new Dialog({title:localize("Title"),content:` + `}__name(askSkillPopupTemplate,"askSkillPopupTemplate"),__name2(askSkillPopupTemplate,"askSkillPopupTemplate");function showEarnIncomePopup(actor){if(!actor?.isOfType("character")){ui.notifications.error("You must select at least one PC");return}const skills=Object.values(actor.skills).filter(s=>!!s?.proficient);new Dialog({title:"Earn Income",content:askSkillPopupTemplate(skills),buttons:{no:{icon:fontAwesomeIcon("times").outerHTML,label:"Cancel"},yes:{icon:fontAwesomeIcon("coins").outerHTML,label:"Earn Income",callback:($html,event)=>{const html=$html[0],level=Number(html.querySelector("[name=level]")?.value)||0,days=Number(html.querySelector("[name=days]")?.value)||1,skillAcronym=html.querySelector("[name=skillAcronym]")?.value??"soc",skill=skills.find(s=>s.slug===skillAcronym);if(!skill)throw ErrorPF2e("Skill not found");localStorage.setItem("earnIncomeLevel",level.toString()),localStorage.setItem("earnIncomeDays",days.toString()),localStorage.setItem("earnIncomeSkillAcronym",skillAcronym),runEarnIncome({actor,event,skill,level,days})}}},default:"yes"}).render(!0)}__name(showEarnIncomePopup,"showEarnIncomePopup"),__name2(showEarnIncomePopup,"showEarnIncomePopup");const _PersistentDamageDialog=class extends Application{static{__name(this,"_PersistentDamageDialog")}constructor(actor,options={}){super(options),__privateAdd(this,_prepareDamageTypes),__privateAdd(this,_getInputElements),this.actor=actor,actor.apps[this.appId]=this}static get defaultOptions(){return{...super.defaultOptions,classes:["persistent-damage-dialog"],template:"systems/pf2e/templates/items/persistent-damage-dialog.hbs",width:380,height:"auto"}}get id(){return`persistent-damage-${this.actor.id}`}get title(){return game.i18n.format("PF2E.Item.Condition.PersistentDamage.Dialog.Title",{actor:this.actor.name})}async getData(){return{existing:this.actor.itemTypes.condition.filter(c=>c.slug==="persistent-damage").map(c=>({id:c.id,bullet:damageDiceIcon(c.system.persistent.damage).outerHTML,active:c.active,...pick(c.system.persistent,["formula","damageType","dc"])})),damageTypes:__privateMethod(this,_prepareDamageTypes,prepareDamageTypes_fn).call(this)}}activateListeners($html){const html=$html[0];for(const section of htmlQueryAll(html,".persistent-entry[data-id")){const id=section.dataset.id,existing=this.actor.items.get(id,{strict:!0}),elements=__privateMethod(this,_getInputElements,getInputElements_fn).call(this,section);for(const element of Object.values(elements))element?.addEventListener("change",()=>{const formula=elements.formula?.value.trim()??"",damageType=elements.damageType?.value,dc=Number(elements.dc?.value)||15;formula===""||!DamageRoll.validate(`(${formula})[${damageType}]`)?elements.formula?.classList.add("invalid"):existing.update({system:{persistent:{formula,damageType,dc}}})});htmlQuery(section,"[data-action=delete")?.addEventListener("click",()=>{existing.delete()})}html.querySelector("[data-action=add]")?.addEventListener("click",event=>{const section=htmlClosest(event.target,".persistent-entry");if(!section)return;const elements=__privateMethod(this,_getInputElements,getInputElements_fn).call(this,section),formula=elements.formula?.value.trim()||"1d6",damageType=elements.damageType?.value,dc=Number(elements.dc?.value)||15;if(!DamageRoll.validate(`(${formula})[${damageType}]`))elements.formula?.classList.add("invalid");else{const baseConditionSource=game.pf2e.ConditionManager.getCondition("persistent-damage").toObject(),persistentSource=mergeObject(baseConditionSource,{system:{persistent:{formula,damageType,dc}}});this.actor.createEmbeddedDocuments("Item",[persistentSource])}}),html.querySelector("[data-action=roll-persistent]")?.addEventListener("click",()=>{const existing=this.actor.itemTypes.condition.filter(c=>c.slug==="persistent-damage");for(const condition of existing)condition.onEndTurn()})}_injectHTML($html){super._injectHTML($html);const html=$html[0];((this.options.editing?htmlQuery(html,`[data-id=${this.options.editing}] .formula`):null)??htmlQuery(html,".new .formula"))?.focus()}};_prepareDamageTypes=new WeakSet,prepareDamageTypes_fn=__name2(function(){return Object.keys(CONFIG.PF2E.damageTypes).map(type=>{const labels=CONFIG.PF2E.damageTypes,faGlyph=DAMAGE_TYPE_ICONS[type]??"question";return{type,iconClass:`fa-${faGlyph}`,label:game.i18n.localize(labels[type]??type)}}).sort(sortBy(type=>type.label))},"#prepareDamageTypes"),_getInputElements=new WeakSet,getInputElements_fn=__name2(function(section){return{formula:htmlQuery(section,".formula"),damageType:htmlQuery(section,".damageType"),dc:htmlQuery(section,".dc")}},"#getInputElements"),__name2(_PersistentDamageDialog,"PersistentDamageDialog");let PersistentDamageDialog=_PersistentDamageDialog;async function editPersistent(options){const actors=Array.isArray(options.actors)?options.actors:[options.actors];if(!actors?.length){ui.notifications.error(game.i18n.localize("PF2E.ErrorMessage.NoTokenSelected"));return}for(const actor of actors)actor&&new PersistentDamageDialog(actor).render(!0)}__name(editPersistent,"editPersistent"),__name2(editPersistent,"editPersistent");function encouragingWords(options){const localize=localizer("PF2E.Actions.EncouragingWords"),actors=Array.isArray(options.actors)?options.actors:[options.actors],actor=actors[0];if(actors.length>1||!(actor instanceof CharacterPF2e)){ui.notifications.error(localize("BadArgs"));return}const encouragingWordsMacro=__name2(async(DC,bonus,diplomacy)=>{diplomacy.roll({dc:{value:DC},extraRollOptions:["action:encouraging-words"],callback:async roll=>{let healFormula,successLabel;const degreeOfSuccess=Number(roll.options.degreeOfSuccess)||0,bonusString=bonus>0?`+ ${bonus}`:"";if(degreeOfSuccess===3?(healFormula=`2d8${bonusString}`,successLabel=localize("CritSuccess")):degreeOfSuccess===2?(healFormula=`1d8${bonusString}`,successLabel=localize("Success")):degreeOfSuccess===1?successLabel=localize("Failure"):degreeOfSuccess===0&&(healFormula="1d8",successLabel=localize("CritFailure")),healFormula){const healRoll=await new Roll(healFormula).roll({async:!0}),rollType=degreeOfSuccess>1?localize("Recovery"):localize("Damage"),token=actor.getActiveTokens().shift()?.document??null;ChatMessagePF2e.create({speaker:ChatMessagePF2e.getSpeaker({actor,token}),type:CONST.CHAT_MESSAGE_TYPES.ROLL,flavor:`${rollType} ${localize("Title")} (${successLabel})`,rolls:[healRoll.toJSON()]})}}})},"encouragingWordsMacro"),applyChanges=__name2($html=>{const{diplomacy}=actor.skills,mod=Number($html.find("[name=modifier]").val())||0,requestedProf=Number($html.find("[name=dc-type]").val())||1,rank=diplomacy.rank??0,usedProf=requestedProf<=rank?requestedProf:rank,roll=[()=>ui.notifications.warn(localize("NotTrained",{name:actor.name})),()=>encouragingWordsMacro(15+mod,0,diplomacy),()=>encouragingWordsMacro(20+mod,5,diplomacy),()=>encouragingWordsMacro(30+mod,15,diplomacy),()=>encouragingWordsMacro(40+mod,25,diplomacy)][usedProf];roll()},"applyChanges");new Dialog({title:localize("Title"),content:`
${localize("ContentMain")}

@@ -55,11 +55,11 @@ var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,
- `,buttons:{yes:{icon:fontAwesomeIcon("hand-holding-medical").outerHTML,label:localize("Title"),callback:applyChanges},no:{icon:fontAwesomeIcon("times").outerHTML,label:localize("Cancel")}},default:"yes"}).render(!0)}__name(encouragingWords,"encouragingWords"),__name2(encouragingWords,"encouragingWords");const CANTRIP_DECK_ID="tLa4bewBhyqzi6Ow",scrollCompendiumIds={1:"RjuupS9xyXDLgyIr",2:"Y7UD64foDbDMV9sx",3:"ZmefGBXGJF3CFDbn",4:"QSQZJ5BC3DeHv153",5:"tjLvRWklAylFhBHQ",6:"4sGIy77COooxhQuC",7:"fomEZZ4MxVVK3uVu",8:"iPki3yuoucnj7bIt",9:"cFHomF3tty8Wi1e5",10:"o1XIHJ4MJyroAHfF"},SPELL_CONSUMABLE_NAME_TEMPLATES={cantripDeck5:"PF2E.Item.Physical.FromSpell.CantripDeck5",scroll:"PF2E.Item.Physical.FromSpell.Scroll",wand:"PF2E.Item.Physical.FromSpell.Wand"},wandCompendiumIds={1:"UJWiN0K3jqVjxvKk",2:"vJZ49cgi8szuQXAD",3:"wrDmWkGxmwzYtfiA",4:"Sn7v9SsbEDMUIwrO",5:"5BF7zMnrPYzyigCs",6:"kiXh4SUWKr166ZeM",7:"nmXPj9zuMRQBNT60",8:"Qs8RgNH6thRPv2jt",9:"Fgv722039TVM5JTc"};function getIdForSpellConsumable(type,heightenedLevel){switch(type){case"cantripDeck5":return CANTRIP_DECK_ID;case"scroll":return scrollCompendiumIds[heightenedLevel]??null;default:return wandCompendiumIds[heightenedLevel]??null}}__name(getIdForSpellConsumable,"getIdForSpellConsumable"),__name2(getIdForSpellConsumable,"getIdForSpellConsumable");function getNameForSpellConsumable(type,spellName,heightenedLevel){const templateId=SPELL_CONSUMABLE_NAME_TEMPLATES[type]||`${type} of {name} (Level {level})`;return game.i18n.format(templateId,{name:spellName,level:heightenedLevel})}__name(getNameForSpellConsumable,"getNameForSpellConsumable"),__name2(getNameForSpellConsumable,"getNameForSpellConsumable");function isSpellConsumable(itemId){return itemId===CANTRIP_DECK_ID||Object.values(scrollCompendiumIds).includes(itemId)||Object.values(wandCompendiumIds).includes(itemId)}__name(isSpellConsumable,"isSpellConsumable"),__name2(isSpellConsumable,"isSpellConsumable");async function createConsumableFromSpell(spell,{type,heightenedLevel=spell.baseRank,mystified=!1}){const pack=game.packs.find(p=>p.collection==="pf2e.equipment-srd"),itemId=getIdForSpellConsumable(type,heightenedLevel),consumable=await pack?.getDocument(itemId??"");if(!(consumable instanceof ConsumablePF2e))throw ErrorPF2e("Failed to retrieve consumable item");const consumableSource=consumable.toObject();consumableSource.system.traits.value.push(...spell.traditions),consumableSource.name=getNameForSpellConsumable(type,spell.name,heightenedLevel);const description=consumableSource.system.description.value;return consumableSource.system.description.value=(()=>{const paragraphElement=document.createElement("p"),linkElement=document.createElement("em");linkElement.append(spell.sourceId?`@UUID[${spell.sourceId}]{${spell.name}}`:spell.description),paragraphElement.append(linkElement);const containerElement=document.createElement("div"),hrElement=document.createElement("hr");return containerElement.append(paragraphElement,hrElement),hrElement.insertAdjacentHTML("afterend",description),containerElement.innerHTML})(),type!=="cantripDeck5"&&(consumableSource.system.spell=spell.clone({"system.location.heightenedLevel":heightenedLevel}).toObject()),mystified&&(consumableSource.system.identification.status="unidentified"),consumableSource}__name(createConsumableFromSpell,"createConsumableFromSpell"),__name2(createConsumableFromSpell,"createConsumableFromSpell");function calculateTrickMagicItemCheckDC(item,options={proficiencyWithoutLevel:!1}){const level=Number(item.level),saveDC=calculateDC(level,options),skills=item.system.traits.value.filter(t=>setHasElement(MAGIC_TRADITIONS,t)).map(tradition=>[traditionSkills[tradition],saveDC]);return Object.fromEntries(skills)}__name(calculateTrickMagicItemCheckDC,"calculateTrickMagicItemCheckDC"),__name2(calculateTrickMagicItemCheckDC,"calculateTrickMagicItemCheckDC");const WEAPON_CATEGORIES=new Set(["unarmed","simple","martial","advanced"]),MELEE_OR_RANGED_GROUPS=new Set(["dart","knife"]),MELEE_WEAPON_GROUPS=new Set([...MELEE_OR_RANGED_GROUPS,"axe","brawling","club","flail","hammer","pick","polearm","shield","spear","sword"]),MANDATORY_RANGED_GROUPS=new Set(["bomb","bow","firearm","sling"]);[...MELEE_WEAPON_GROUPS,...MANDATORY_RANGED_GROUPS];const THROWN_RANGES=new Set([10,15,20,30,40,60,80,100]),WEAPON_RANGES=new Set([...THROWN_RANGES,50,70,90,110,120,140,150,180,200,240,300]),CROSSBOW_WEAPONS=new Set(["arbalest","alchemical-crossbow","crossbow","hand-crossbow","heavy-crossbow","repeating-crossbow","repeating-hand-crossbow","repeating-heavy-crossbow","taw-launcher"]);function isRelevantEvent(event){return!!event&&"ctrlKey"in event&&"metaKey"in event&&"shiftKey"in event}__name(isRelevantEvent,"isRelevantEvent"),__name2(isRelevantEvent,"isRelevantEvent");function eventToRollParams(event){const skipDefault=!game.user.settings.showRollDialogs;if(!isRelevantEvent(event))return{skipDialog:skipDefault};const params={skipDialog:event.shiftKey?!skipDefault:skipDefault};return(event.ctrlKey||event.metaKey)&&(params.rollMode=game.user.isGM?"gmroll":"blindroll"),params}__name(eventToRollParams,"eventToRollParams"),__name2(eventToRollParams,"eventToRollParams");function calculateDaysToNoCost(costs){return Math.ceil((costs.itemPrice.copperValue-costs.materials.copperValue)/costs.reductionPerDay.copperValue)}__name(calculateDaysToNoCost,"calculateDaysToNoCost"),__name2(calculateDaysToNoCost,"calculateDaysToNoCost");async function prepStrings(costs,item){const rollData=item.getRollData();return{reductionPerDay:costs.reductionPerDay.toString(),materialCost:game.i18n.format("PF2E.Actions.Craft.Details.PayMaterials",{cost:costs.materials.toString()}),itemCost:game.i18n.format("PF2E.Actions.Craft.Details.PayFull",{cost:costs.itemPrice.toString()}),lostMaterials:game.i18n.format("PF2E.Actions.Craft.Details.LostMaterials",{cost:costs.lostMaterials.toString()}),itemLink:await TextEditor.enrichHTML(item.link,{rollData,async:!0})}}__name(prepStrings,"prepStrings"),__name2(prepStrings,"prepStrings");function calculateCosts(item,quantity,actor,degreeOfSuccess){const itemPrice=CoinsPF2e.fromPrice(item.price,quantity),materialCosts=itemPrice.scale(.5),lostMaterials=new CoinsPF2e,reductionPerDay=new CoinsPF2e,proficiency=actor.skills.crafting.rank;return proficiency?(degreeOfSuccess===DegreeOfSuccess.CRITICAL_SUCCESS?Object.assign(reductionPerDay,getIncomeForLevel(actor.level+1).rewards[proficiency]):degreeOfSuccess===DegreeOfSuccess.SUCCESS?Object.assign(reductionPerDay,getIncomeForLevel(actor.level).rewards[proficiency]):degreeOfSuccess===DegreeOfSuccess.CRITICAL_FAILURE&&Object.assign(lostMaterials,materialCosts.scale(.1)),{itemPrice,materials:materialCosts,lostMaterials,reductionPerDay}):null}__name(calculateCosts,"calculateCosts"),__name2(calculateCosts,"calculateCosts");async function craftItem(item,itemQuantity,actor,infused){const itemSource=item.toObject();itemSource.system.quantity=itemQuantity,itemSource.system.size=actor.size==="tiny"?"tiny":"med";const itemTraits=item.traits;if(infused&&itemTraits.has("alchemical")&&itemTraits.has("consumable")&&(itemSource.system.traits.value.push("infused"),itemSource.system.temporary=!0),!await actor.addToInventory(itemSource)){ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.CantAddItem"));return}await ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.ReceiveItem",{actorName:actor.name,quantity:itemQuantity,itemName:item.name}),speaker:{alias:actor.name}})}__name(craftItem,"craftItem"),__name2(craftItem,"craftItem");async function craftSpellConsumable(item,itemQuantity,actor){const consumableType=item.category;if(!(consumableType==="scroll"||consumableType==="wand"))return;const spellLevel=consumableType==="wand"?Math.ceil(item.level/2)-1:Math.ceil(item.level/2),validSpells=actor.itemTypes.spell.filter(s=>s.baseRank<=spellLevel&&!s.isCantrip&&!s.isFocusSpell&&!s.isRitual).reduce((result,spell)=>(result[spell.baseRank]=[...result[spell.baseRank]||[],spell],result),{}),content=await renderTemplate("systems/pf2e/templates/actors/crafting-select-spell-dialog.hbs",{spells:validSpells});new Dialog({title:game.i18n.localize("PF2E.Actions.Craft.SelectSpellDialog.Title"),content,buttons:{cancel:{icon:'',label:game.i18n.localize("Cancel")},craft:{icon:'',label:game.i18n.localize("PF2E.Actions.Craft.SelectSpellDialog.CraftButtonLabel"),callback:async $dialog=>{const spellId=String($dialog.find("select[name=spell]").val()),spell=actor.items.get(spellId);if(!spell?.isOfType("spell"))return;const item2=await createConsumableFromSpell(spell,{type:consumableType,heightenedLevel:spellLevel});return craftItem(new ConsumablePF2e(item2),itemQuantity,actor)}}},default:"craft"}).render(!0)}__name(craftSpellConsumable,"craftSpellConsumable"),__name2(craftSpellConsumable,"craftSpellConsumable");async function renderCraftingInline(item,roll,quantity,actor,free){if(!actor.isOfType("character"))return null;const degreeOfSuccess=roll.options.degreeOfSuccess??0,costs=calculateCosts(item,quantity,actor,degreeOfSuccess);if(!costs)return null;const daysForZeroCost=degreeOfSuccess>1?calculateDaysToNoCost(costs):0;return await renderTemplate("systems/pf2e/templates/chat/crafting-result.hbs",{daysForZeroCost,strings:await prepStrings(costs,item),item,quantity,success:degreeOfSuccess>1,criticalFailure:degreeOfSuccess===0,free})}__name(renderCraftingInline,"renderCraftingInline"),__name2(renderCraftingInline,"renderCraftingInline");const _RollNotePF2e=class _RollNotePF2e2{static{__name(this,"_RollNotePF2e")}selector;title;text;predicate;outcome;visibility;rule;constructor(params){this.selector=params.selector,this.title=params.title??null,this.text=params.text,this.predicate=new PredicatePF2e(params.predicate??[]),this.outcome=[...params.outcome??[]],this.visibility=params.visibility??null,this.rule=params.rule??null}static notesToHTML(notes){return createHTMLElement("ul",{classes:["notes"],children:notes.flatMap(n=>[` -`,n.toHTML()]).slice(1)})}toHTML(){const element=createHTMLElement("li",{classes:["roll-note"],dataset:{itemId:this.rule?.item.id,visibility:this.visibility},innerHTML:game.i18n.localize(this.text)});if(element.childNodes.length===1&&element.firstChild instanceof HTMLElement&&(element.innerHTML=element.firstChild.innerHTML),this.title){const strong=createHTMLElement("strong",{innerHTML:game.i18n.localize(this.title)});element.prepend(strong," ")}return element}clone(){return new _RollNotePF2e2({...this.toObject(),rule:this.rule})}toObject(){return{selector:this.selector,title:this.title,text:this.text,predicate:this.predicate.toObject(),outcome:this.outcome,visibility:this.visibility}}};__name2(_RollNotePF2e,"RollNotePF2e");let RollNotePF2e=_RollNotePF2e;function normalizeActionChangeData(document2,changed){if(changed.system&&("actionType"in changed.system||"actions"in changed.system)){const actionType=changed.system?.actionType?.value??document2.system.actionType.value,actionCount=Number(changed.system?.actions?.value??document2.system.actions.value);changed.system=mergeObject(changed.system,{actionType:{value:actionType},actions:{value:actionType!=="action"?null:Math.clamped(actionCount,1,3)}})}}__name(normalizeActionChangeData,"normalizeActionChangeData"),__name2(normalizeActionChangeData,"normalizeActionChangeData");function activateActionSheetListeners(item,html){htmlQuery(html,"a[data-action=frequency-add]")?.addEventListener("click",()=>{const frequency={max:1,per:"day"};item.update({system:{frequency}})}),htmlQuery(html,"a[data-action=frequency-delete]")?.addEventListener("click",()=>{item.update({"system.-=frequency":null})}),item.isOfType("action","feat")&&htmlQuery(html,"a[data-action=delete-effect]")?.addEventListener("click",()=>{item._source.system.selfEffect&&item.update({"system.-=selfEffect":null})})}__name(activateActionSheetListeners,"activateActionSheetListeners"),__name2(activateActionSheetListeners,"activateActionSheetListeners");function createSelfEffectSheetData(data){if(!data)return null;const indexEntry=fromUuidSync(data.uuid);indexEntry?.name&&isImageFilePath(indexEntry.img)&&(data.name=indexEntry.name,data.img=indexEntry.img);const parsedUUID=foundry.utils.parseUuid(data.uuid),linkData={id:parsedUUID.documentId??null,type:parsedUUID.documentType??null,pack:parsedUUID.collection instanceof CompendiumCollection?parsedUUID.collection.metadata.id:null};return{...data,...linkData}}__name(createSelfEffectSheetData,"createSelfEffectSheetData"),__name2(createSelfEffectSheetData,"createSelfEffectSheetData");async function handleSelfEffectDrop(sheet,event){if(!sheet.isEditable||sheet.item.system.actionType.value==="passive")return;const item=await(async()=>{try{const dataString=event.dataTransfer?.getData("text/plain"),dropData=JSON.parse(dataString??"");return await ItemPF2e.fromDropData(dropData)??null}catch{return null}})();if(!(item instanceof EffectPF2e))throw ErrorPF2e("Invalid item drop");await sheet.item.update({"system.selfEffect":{uuid:item.uuid,name:item.name}})}__name(handleSelfEffectDrop,"handleSelfEffectDrop"),__name2(handleSelfEffectDrop,"handleSelfEffectDrop");function createActionRangeLabel(range){if(!range?.max)return null;const[key,value]=range.increment?["PF2E.Action.Range.IncrementN",range.increment]:["PF2E.Action.Range.MaxN",range.max];return game.i18n.format(key,{n:value})}__name(createActionRangeLabel,"createActionRangeLabel"),__name2(createActionRangeLabel,"createActionRangeLabel");var LightLevels=(LightLevels2=>(LightLevels2[LightLevels2.DARKNESS=.25]="DARKNESS",LightLevels2[LightLevels2.BRIGHT_LIGHT=.75]="BRIGHT_LIGHT",LightLevels2))(LightLevels||{});let auraCheckLock=Promise.resolve();const checkAuras=foundry.utils.debounce(async function(){if(!(canvas.ready&&this.isInFocus&&this.grid.type===CONST.GRID_TYPES.SQUARE))return;await auraCheckLock;const lock={release:()=>{}};auraCheckLock=new Promise(resolve=>{lock.release=resolve});try{const tokens=this.tokens.reduce((list,token)=>(token.isLinked&&list.some(t=>t.actor===token.actor)||list.push(token),list),[]);for(const token of tokens)await token.object?._animation;for(const aura of tokens.flatMap(t=>Array.from(t.auras.values())))await aura.notifyActors();const sceneActors=new Set(tokens.flatMap(t=>t.actor?.primaryUpdater===game.user?t.actor:[]));for(const actor of sceneActors)actor.checkAreaEffects()}finally{lock.release()}},100),_ScenePF2e=class extends Scene{static{__name(this,"_ScenePF2e")}get rulesBasedVision(){return this.tokenVision?this.flags.pf2e.rulesBasedVision??game.settings.get("pf2e","automation.rulesBasedVision"):!1}get hearingRange(){return this.flags.pf2e.hearingRange}get darknessSyncedToTime(){return this.flags.pf2e.syncDarkness==="enabled"||this.flags.pf2e.syncDarkness==="default"&&game.settings.get("pf2e","worldClock.syncDarkness")}get lightLevel(){return 1-this.darkness}get isBright(){return this.lightLevel>=LightLevels.BRIGHT_LIGHT}get isDimlyLit(){return!this.isBright&&!this.isDark}get isDark(){return this.lightLevel<=LightLevels.DARKNESS}get hasHexGrid(){return![CONST.GRID_TYPES.GRIDLESS,CONST.GRID_TYPES.SQUARE].includes(this.grid.type)}get isInFocus(){const soleUserIsGM=game.user.isGM&&game.users.filter(u=>u.active).length===1;return this.active&&!soleUserIsGM||this.isView&&soleUserIsGM}prepareData(){super.prepareData(),Promise.resolve().then(()=>{this.checkAuras()})}prepareBaseData(){super.prepareBaseData(),this.flags.pf2e=mergeObject({hearingRange:null,rulesBasedVision:null,syncDarkness:"default"},this.flags.pf2e??{}),this.rulesBasedVision&&(this.globalLight=!0,this.globalLightThreshold=1-(LightLevels.DARKNESS+.001))}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId);const flagChanges=changed.flags?.pf2e??{};if(this.isView&&["rulesBasedVision","hearingRange"].some(k=>flagChanges[k]!==void 0)&&canvas.perception.update({initializeLighting:!0,initializeVision:!0}),changed.active&&canvas.scene===this)for(const token of canvas.tokens.placeables)token.auras.reset()}_onDeleteDescendantDocuments(parent,collection,documents,ids,options,userId){super._onDeleteDescendantDocuments(parent,collection,documents,ids,options,userId),documents.some(d=>d instanceof TokenDocumentPF2e&&!(d._source.light.dim||d._source.light.bright)&&d.actor?.synthetics.tokenOverrides.light)&&canvas.perception.update({initializeLighting:!0,initializeVision:!0})}};__name2(_ScenePF2e,"ScenePF2e");let ScenePF2e=_ScenePF2e;Object.defineProperty(ScenePF2e.prototype,"checkAuras",{configurable:!1,enumerable:!1,writable:!1,value:checkAuras});const _AmbientLightDocumentPF2e=class extends AmbientLightDocument{static{__name(this,"_AmbientLightDocumentPF2e")}get isDarkness(){return this.object?.source.isDarkness??!1}};__name2(_AmbientLightDocumentPF2e,"AmbientLightDocumentPF2e");let AmbientLightDocumentPF2e=_AmbientLightDocumentPF2e;const _MeasuredTemplateDocumentPF2e=class extends MeasuredTemplateDocument{static{__name(this,"_MeasuredTemplateDocumentPF2e")}get item(){const origin=this.flags.pf2e?.origin,uuid=origin?.uuid;if(!uuid)return null;const item=fromUuidSync(uuid);if(!(item instanceof ItemPF2e))return null;if(item?.isOfType("spell")){const overlayIds=origin?.variant?.overlays,castRank=origin?.castLevel??item.rank;return item.loadVariant({overlayIds,castLevel:castRank})??item}return item}get message(){return game.messages.get(this.flags.pf2e?.messageId??"")??null}_onCreate(data,options,userId){super._onCreate(data,options,userId),toggleClearTemplatesButton(this.message)}_onDelete(options,userId){super._onDelete(options,userId),toggleClearTemplatesButton(this.message)}};__name2(_MeasuredTemplateDocumentPF2e,"MeasuredTemplateDocumentPF2e");let MeasuredTemplateDocumentPF2e=_MeasuredTemplateDocumentPF2e;const _TileDocumentPF2e=class extends TileDocument{static{__name(this,"_TileDocumentPF2e")}};__name2(_TileDocumentPF2e,"TileDocumentPF2e");let TileDocumentPF2e=_TileDocumentPF2e;const _TokenConfigPF2e=class extends TokenConfig{static{__name(this,"_TokenConfigPF2e")}constructor(){super(...arguments),__privateAdd(this,_disableScale),__privateAdd(this,_reestablishPrototype),__privateAdd(this,_disableVisionInputs)}static get defaultOptions(){return{...super.defaultOptions,template:"systems/pf2e/templates/scene/token/sheet.hbs",sheetConfig:!1}}get dimensionsFromActorSize(){const actorSize=this.actor?.size??"med";return{tiny:.5,sm:1,med:1,lg:2,huge:3,grg:4}[actorSize]}async getData(options){return{...await super.getData(options),sizeLinkable:!!this.actor&&SIZE_LINKABLE_ACTOR_TYPES.has(this.actor.type),linkToSizeTitle:this.token.flags.pf2e.linkToActorSize?"Unlink":"Link",autoscaleTitle:this.token.flags.pf2e.autoscale?"Unlink":"Link"}}_getFilePickerOptions(event){return{...super._getFilePickerOptions(event),redirectToRoot:this.actor?[ActorPF2e.getDefaultArtwork(this.actor.toObject()).texture.src]:[]}}activateListeners($html){super.activateListeners($html);const html=$html[0];__privateMethod(this,_disableVisionInputs,disableVisionInputs_fn).call(this,html),this.token.flags.pf2e.autoscale&&__privateMethod(this,_disableScale,disableScale_fn).call(this,html),htmlQuery(html,"a[data-action=toggle-link-to-size]")?.addEventListener("click",async()=>{await this.token.update({"flags.pf2e.linkToActorSize":!this.token.flags.pf2e.linkToActorSize}),__privateMethod(this,_reestablishPrototype,reestablishPrototype_fn).call(this),await this.render()}),htmlQuery(html,"a[data-action=toggle-autoscale]")?.addEventListener("click",async()=>{await this.token.update({"flags.pf2e.autoscale":!this.token.flags.pf2e.autoscale}),__privateMethod(this,_reestablishPrototype,reestablishPrototype_fn).call(this),await this.render()})}_getSubmitData(updateData={}){const changes=updateData??{};return this.form.querySelector("input[name=scale]")?.disabled&&(changes.scale=Math.abs(this.token._source.texture.scaleX)),super._getSubmitData(changes)}async _updateObject(event,formData){if(formData["flags.pf2e.linkToActorSize"]===!0)if(this.actor?.isOfType("vehicle")){const{dimensions}=this.actor,width=Math.max(Math.round(dimensions.width/5),1),length=Math.max(Math.round(dimensions.length/5),1);formData.width=width,formData.height=length}else formData.width=formData.height=this.dimensionsFromActorSize;return super._updateObject(event,formData)}};_disableScale=new WeakSet,disableScale_fn=__name2(function(html){if(!game.settings.get("pf2e","tokens.autoscale"))return;const scale=html.querySelector(".form-group.scale");if(!scale)throw ErrorPF2e("Scale form group missing");scale.classList.add("children-disabled");const constrainedScale=String(this.actor?.size==="sm"?.8:1),rangeInput=scale.querySelector("input[type=range]");if(rangeInput){rangeInput.disabled=!0,rangeInput.value=constrainedScale;const rangeDisplayValue=scale.querySelector(".range-value");rangeDisplayValue&&(rangeDisplayValue.innerHTML=constrainedScale)}},"#disableScale"),_reestablishPrototype=new WeakSet,reestablishPrototype_fn=__name2(function(){if(this.isPrototype&&this.actor){const realPrototype=this.actor.prototypeToken;this.object=this.token=realPrototype}},"#reestablishPrototype"),_disableVisionInputs=new WeakSet,disableVisionInputs_fn=__name2(function(html){if(!(["character","familiar"].includes(this.actor?.type??"")&&(this.token.rulesBasedVision||this.isPrototype&&game.settings.get("pf2e","automation.rulesBasedVision"))))return;const sightInputNames=["angle","brightness","range","saturation","visionMode"].map(n=>`sight.${n}`),sightInputs=Array.from(html.querySelectorAll(sightInputNames.map(n=>`[name="${n}"]`).join(", "))),sightEnabledInput=html.querySelector('input[name="sight.enabled"]');if(!sightEnabledInput)throw ErrorPF2e("sight.enabled input not found");sightEnabledInput.addEventListener("change",()=>{for(const input of sightInputs)if(input.disabled=!sightEnabledInput.checked,input.type==="range")sightEnabledInput.checked?input.closest(".form-group")?.classList.remove("children-disabled"):input.closest(".form-group")?.classList.add("children-disabled");else if(input.name==="sight.color"){const colorInput=input.parentElement?.querySelector("input[type=color]");colorInput&&(colorInput.disabled=!sightEnabledInput.checked)}});for(const input of sightInputs)input.disabled=!0,input.type==="range"&&input.closest(".form-group")?.classList.add("children-disabled");html.querySelector("a.item[data-tab=detection]")?.classList.add("disabled");const managedBy=document.createElement("a");managedBy.className="managed-by-rbv",managedBy.append(fontAwesomeIcon("robot")),managedBy.title=game.i18n.localize("PF2E.SETTINGS.Automation.RulesBasedVision.ManagedBy").replace(/<\/?rbv>/g,"");for(const sightInput of sightInputs){const anchor=managedBy.cloneNode(!0);anchor.addEventListener("click",()=>{const menu=game.settings.menus.get("pf2e.automation");if(!menu)throw ErrorPF2e("Automation Settings application not found");new menu.type().render(!0)}),sightInput.closest(".form-group")?.querySelector("label")?.append(anchor)}},"#disableVisionInputs"),__name2(_TokenConfigPF2e,"TokenConfigPF2e");let TokenConfigPF2e=_TokenConfigPF2e;const _AmbientLightPF2e=class extends AmbientLight{static{__name(this,"_AmbientLightPF2e")}get isDarkness(){return this.source.isDarkness}};__name2(_AmbientLightPF2e,"AmbientLightPF2e");let AmbientLightPF2e=_AmbientLightPF2e;const _EffectsCanvasGroupPF2e=class extends EffectsCanvasGroup{static{__name(this,"_EffectsCanvasGroupPF2e")}get rulesBasedVision(){return game.settings.get("pf2e","automation.rulesBasedVision")&&canvas.ready&&!!canvas.scene?.tokenVision}};__name2(_EffectsCanvasGroupPF2e,"EffectsCanvasGroupPF2e");let EffectsCanvasGroupPF2e=_EffectsCanvasGroupPF2e;const _LightingLayerPF2e=class extends LightingLayer{static{__name(this,"_LightingLayerPF2e")}get lightingLevel(){return 1-canvas.darknessLevel}};__name2(_LightingLayerPF2e,"LightingLayerPF2e");let LightingLayerPF2e=_LightingLayerPF2e;const _TemplateLayerPF2e=class extends TemplateLayer{static{__name(this,"_TemplateLayerPF2e")}_onDragLeftMove(event){if(!canvas.scene||!canvas.dimensions)return;const interaction=event.interactionData,{destination,layerDragState,preview:template,origin}=interaction;if(!template||template.destroyed)return;if(template.parent===null&&this.preview.addChild(template),(layerDragState??0)>=1){const{x,y}=canvas.grid.getSnappedPosition(destination.x,destination.y,2);if(destination.x=x,destination.y=y,!template)return;const ray=new Ray(origin,destination),ratio=canvas.dimensions.size/canvas.dimensions.distance;if(["cone","circle"].includes(template.type)){const direction=ray.angle,snapAngle=Math.PI/(canvas.scene.hasHexGrid?6:4);template.document.direction=Math.toDegrees(Math.floor((direction+Math.PI*.125)/snapAngle)*snapAngle);const distance=Math.max(ray.distance/ratio,canvas.dimensions.distance);template.document.distance=Math.floor(distance/canvas.dimensions.distance)*canvas.dimensions.distance}else template.document.direction=Math.toDegrees(ray.angle),template.document.distance=ray.distance/ratio;template.refresh(),event.interactionData.layerDragState=2}}_onMouseWheel(event){const template=this.hover;if(!(template&&canvas.scene))return;const increment=event.shiftKey?15:5,coneMultiplier=template.type==="cone"?canvas.scene.hasHexGrid?2:3:1,snap=increment*coneMultiplier,delta=snap*Math.sign(event.deltaY);return template.rotate(template.document.direction+delta,snap)}};__name2(_TemplateLayerPF2e,"TemplateLayerPF2e");let TemplateLayerPF2e=_TemplateLayerPF2e;const _TokenLayerPF2e=class extends TokenLayer{static{__name(this,"_TokenLayerPF2e")}cycleStack(){const hovered=this.hover;if(!hovered)return!1;const stack=this.placeables.filter(t=>hovered.distanceTo(t)===0&&hovered.document.elevation===t.document.elevation).sort((a,b)=>a.mesh.sort-b.mesh.sort);if(stack.length<2)return!1;const first=stack.shift();stack.push(first);for(let sort=stack.length-1;sort>=0;sort--){const token=stack[sort];token.document.sort=sort,token.mesh.initialize({sort}),sort===stack.length-1&&(token.emitHoverIn(new PointerEvent("pointerenter")),this.hover=token)}return!0}};__name2(_TokenLayerPF2e,"TokenLayerPF2e");let TokenLayerPF2e=_TokenLayerPF2e;const _HearingSource=class extends SoundSource{static{__name(this,"_HearingSource")}_initialize(data){super._initialize(data),this.data.x=this.object.center.x,this.data.y=this.object.center.y,this.data.elevation=this.object.document.elevation,this.data.radius=canvas.dimensions?.maxR??1e3,this.data.walls=!0}};__name2(_HearingSource,"HearingSource");let HearingSource=_HearingSource;const _EffectAreaSquare=class extends PIXI.Rectangle{static{__name(this,"_EffectAreaSquare")}active;constructor(x,y,width,height,active=!0){super(x,y,width,height),this.active=active}get center(){return{x:this.x+this.width/2,y:this.y+this.height/2}}highlight(layer,{border,highlight}){this.x<0||this.y<0||(this.active?canvas.grid.grid.highlightGridPosition(layer,{x:this.x,y:this.y,border:border?.color,color:highlight.color,alpha:highlight.alpha}):(canvas.grid.grid.highlightGridPosition(layer,{x:this.x,y:this.y,border:0,color:0}),layer.beginFill(0,.5).moveTo(this.x,this.y).lineTo(this.x+this.width,this.y+this.height).endFill()))}};__name2(_EffectAreaSquare,"EffectAreaSquare");let EffectAreaSquare=_EffectAreaSquare;function getAreaSquares(data){if(!canvas.dimensions)return[];const squareWidth=canvas.dimensions.size,rowCount=Math.ceil(data.bounds.width/squareWidth),emptyVector=Array(rowCount-1).fill(null),genColumn=__name2(square=>emptyVector.reduce(colSquares=>{const squareAbove=colSquares.at(-1),squareBelow=new EffectAreaSquare(square.x,squareAbove.y+squareWidth,squareWidth,squareWidth);return colSquares.push(squareBelow),colSquares},[square]),"genColumn"),topLeftSquare=new EffectAreaSquare(data.bounds.x,data.bounds.y,squareWidth,squareWidth),collisionType=data.traits?.includes("visual")&&!data.traits.includes("auditory")?"sight":data.traits?.includes("auditory")&&!data.traits.includes("visual")?"sound":"move",tokenBounds=data.token.mechanicalBounds,tokenCenter=data.token.center,tokenCenters=[tokenCenter,...[{x:0,y:1},{x:1,y:0},{x:0,y:-1},{x:-1,y:0}].map(c=>({x:tokenCenter.x+c.x*Math.round(tokenBounds.width/8),y:tokenCenter.y+c.y*Math.round(tokenBounds.height/8)}))];return emptyVector.reduce(squares=>{const lastSquare=squares.at(-1).at(-1),column=genColumn(new EffectAreaSquare(lastSquare.x+squareWidth,topLeftSquare.y,squareWidth,squareWidth));return squares.push(column),squares},[genColumn(topLeftSquare)]).flat().filter(s=>measureDistanceCuboid(tokenBounds,s)<=data.radius).map(square=>(square.active=tokenCenters.some(c=>!CONFIG.Canvas.polygonBackends[collisionType].testCollision(c,square.center,{type:collisionType,mode:"any"})),square))}__name(getAreaSquares,"getAreaSquares"),__name2(getAreaSquares,"getAreaSquares");const _AuraRenderer=class extends PIXI.Graphics{static{__name(this,"_AuraRenderer")}constructor(params){super(),__privateAdd(this,_drawBorder),__privateAdd(this,_drawTexture),__privateAdd(this,_drawLabel),__publicField(this,"slug"),__publicField(this,"token"),__publicField(this,"radius"),__publicField(this,"radiusPixels"),__publicField(this,"traits"),__publicField(this,"appearance"),__publicField(this,"border",new PIXI.Graphics),__publicField(this,"texture",null),this.slug=params.slug,this.token=params.token,this.appearance=params.appearance,this.radius=params.radius,this.radiusPixels=.5*this.token.mechanicalBounds.width+this.radius/(canvas.dimensions?.distance??0)*canvas.grid.size,this.traits=params.traits,this.addChild(this.border)}get bounds(){const{token,radiusPixels}=this,bounds=token.mechanicalBounds;return new PIXI.Rectangle(bounds.x-(radiusPixels-bounds.width/2),bounds.y-(radiusPixels-bounds.width/2),radiusPixels*2,radiusPixels*2)}get highlightLayer(){return canvas.grid?.getHighlightLayer(this.token.highlightId)??null}get squares(){return getAreaSquares(this)}async draw(showBorder){const{mechanicalBounds}=this.token;return this.x=mechanicalBounds.width/2,this.y=mechanicalBounds.height/2,this.token.document.width<1&&(this.x+=mechanicalBounds.x-this.token.x,this.y+=mechanicalBounds.y-this.token.y),__privateMethod(this,_drawBorder,drawBorder_fn).call(this),this.border.visible=showBorder,__privateMethod(this,_drawTexture,drawTexture_fn).call(this)}highlight(){const{dimensions}=canvas;if(!dimensions)return;if(__privateMethod(this,_drawLabel,drawLabel_fn).call(this),!!(this.token.actor?.isOfType("familiar")?this.token.actor.master?.combatant?.encounter.active:this.token.combatant?.encounter.active)){const{highlightLayer}=this;if(!highlightLayer)return;for(const square of this.squares)square.highlight(highlightLayer,this.appearance)}}};_drawBorder=new WeakSet,drawBorder_fn=__name2(function(){const data=this.appearance.border;!data||this.border.geometry.graphicsData.length>0||this.border.lineStyle(_AuraRenderer.LINE_THICKNESS,data.color,data.alpha).drawCircle(0,0,this.radiusPixels)},"#drawBorder"),_drawTexture=new WeakSet,drawTexture_fn=__name2(async function(){const data=this.appearance.texture;if(!data||this.token.isPreview||this.texture)return;const maybeTexture=await loadTexture(data.src,{fallback:"icons/svg/hazard.svg"});if(this.texture=maybeTexture instanceof PIXI.Texture?maybeTexture:null,!this.texture)return;const globalVideo=isVideoFilePath(data.src)?game.video.getVideoSource(this.texture):null;if(globalVideo){this.texture.destroy(),this.texture=await game.video.cloneTexture(globalVideo);const video=game.video.getVideoSource(this.texture)??globalVideo;video.playbackRate=data.playbackRate;const offset=data.loop?Math.random()*video.duration:0;game.video.play(video,{volume:0,offset,loop:data.loop})}const radius=data.scale*this.radiusPixels,diameter=radius*2,scale={x:diameter/this.texture.width,y:diameter/this.texture.height},matrix=new PIXI.Matrix(scale.x,void 0,void 0,scale.y,radius,radius);this.beginTextureFill({texture:this.texture,alpha:data.alpha,matrix}).drawCircle(0,0,radius).endFill()},"#drawTexture"),_drawLabel=new WeakSet,drawLabel_fn=__name2(function(){const style=CONFIG.canvasTextStyle.clone(),gridSize=canvas.dimensions?.size??100;style.fontSize=Math.max(Math.round(gridSize*.36*12)/12,36),style.align="center";const bounds=this.token.mechanicalBounds,gridUnits=canvas.scene?.grid.units.trim()||game.system.gridUnits,label=[this.radius,gridUnits].join(""),text=new PreciseText(label,style),center={x:bounds.x+bounds.width/2,y:bounds.y+bounds.height/2},textOffset=Math.sqrt(style.fontSize);text.position.set(center.x+textOffset,center.y-this.radiusPixels-style.fontSize-textOffset),this.highlightLayer?.beginFill(0,.5).lineStyle(_AuraRenderer.LINE_THICKNESS,0).drawCircle(center.x,center.y-this.radiusPixels,6).endFill().addChild(text)},"#drawLabel"),__name2(_AuraRenderer,"AuraRenderer"),__publicField(_AuraRenderer,"LINE_THICKNESS",3);let AuraRenderer=_AuraRenderer;const _AuraRenderers=class extends Map{static{__name(this,"_AuraRenderers")}constructor(token){super(),__privateAdd(this,_showBordersHighlights),__publicField(this,"token"),this.token=token}get highlightId(){return this.token.highlightId}async reset(slugs){if(!slugs)this.clear();else for(const slug of slugs)this.delete(slug);if(!this.token.actor)return;const data=Array.from(this.token.document.auras.values()).filter(a=>slugs?.includes(a.slug)??!0);for(const datum of data){const renderer=new AuraRenderer({...datum,token:this.token});this.set(datum.slug,this.token.addChild(renderer))}return this.draw()}async draw(){if(this.size===0||(this.clearHighlights(),this.token.isAnimating))return;const showBordersHighlights=__privateGet(this,_showBordersHighlights,showBordersHighlights_get);for(const aura of this.values())await aura.draw(showBordersHighlights);if(showBordersHighlights&&(this.token.hover||this.token.layer.highlightObjects)){const{highlightId}=this;(canvas.grid.highlightLayers[highlightId]??canvas.grid.addHighlightLayer(highlightId)).clear();for(const aura of this.values())aura.highlight()}}delete(key){const aura=this.get(key);return aura?(aura.destroyed||aura.destroy(!0),this.token.removeChild(aura),super.delete(key)):!1}clear(){this.clearHighlights();for(const aura of this.values())aura.destroyed||aura.destroy(!0),this.token.removeChild(aura);return super.clear()}destroy(){this.clear()}clearHighlights(){canvas.grid.destroyHighlightLayer(this.highlightId)}};_showBordersHighlights=new WeakSet,showBordersHighlights_get=__name2(function(){const inEncounter=__name2(()=>!!(this.token.actor?.isOfType("familiar")?this.token.actor.master?.combatant?.encounter.active:this.token.combatant?.encounter.active),"inEncounter");return canvas.scene?.grid.type===CONST.GRID_TYPES.SQUARE&&canvas.scene.tokenVision&&canvas.scene.isInFocus&&(game.user.isGM||this.token.actor?.alliance==="party")&&(this.token.controlled||this.token.hover||this.token.layer.highlightObjects||inEncounter())},"#showBordersHighlights"),__name2(_AuraRenderers,"AuraRenderers");let AuraRenderers=_AuraRenderers;const _FlankingHighlightRenderer=class{static{__name(this,"_FlankingHighlightRenderer")}_layer;token;labelText;lineColor;constructor(token){this._layer=null,this.token=token,this.labelText=game.i18n.localize("PF2E.Token.Flanking"),this.lineColor=CONFIG.Canvas.dispositionColors.CONTROLLED}get layer(){return this._layer??this.addLayer()}get shouldRender(){return canvas.ready&&!!canvas.scene?.isInFocus&&this.tokenIsSelectedOrOwn&&this.tokenIsReady}get tokenIsSelectedOrOwn(){return this.token.controlled&&this.token.isOwner||!!this.token.actor&&this.token.actor?.id===game.user.character?.id}get tokenIsReady(){return!this.token.isPreview&&!this.token.isAnimating}draw(){this.clear(),canvas.tokens.highlightObjects&&game.user.targets.size&&this.shouldRender&&game.user.targets.forEach(target=>this.drawForTarget(target))}drawForTarget(target){const buddies=this.token.buddiesFlanking(target,{ignoreFlankable:!0});this.drawBuddyLines(buddies)}drawBuddyLines(buddies){buddies.forEach(b=>this.drawBuddyLine(b))}drawBuddyLine(buddy){const t=CONFIG.Canvas.objectBorderThickness,o=Math.round(t*1.5),c=Math.round(t*2);this.layer.lineStyle(o,0,.5).moveTo(this.token.center.x,this.token.center.y).lineTo(buddy.center.x,buddy.center.y),this.layer.lineStyle(t,this.lineColor,.5).moveTo(this.token.center.x,this.token.center.y).lineTo(buddy.center.x,buddy.center.y),this.layer.beginFill(this.lineColor).lineStyle(1,0).drawCircle(this.token.center.x,this.token.center.y,c),this.layer.beginFill(this.lineColor).lineStyle(1,0).drawCircle(buddy.center.x,buddy.center.y,c),this.drawLabel(buddy)}drawLabel(buddy){const mid_x=Math.round((this.token.center.x+buddy.center.x)/2),mid_y=Math.round((this.token.center.y+buddy.center.y)/2),vect_x=buddy.center.x-this.token.center.x,vect_y=buddy.center.y-this.token.center.y,perp_vect_x=vect_x<=-vect_x?-vect_y:vect_y,perp_vect_y=vect_x<=-vect_x?vect_x:-vect_x,offsetScale=20/Math.sqrt(perp_vect_x**2+perp_vect_y**2),perp_x=mid_x+Math.round(perp_vect_x*offsetScale),perp_y=mid_y+Math.round(perp_vect_y*offsetScale),style=CONFIG.canvasTextStyle.clone();style.fontSize=24,canvas.dimensions?.size&&canvas.dimensions.size>=200?style.fontSize=28:canvas.dimensions?.size&&canvas.dimensions.size<50&&(style.fontSize=20),style.fill=this.lineColor,style.stroke=0;const text=new PreciseText(this.labelText,style);text.anchor.set(.5,.5);let rotation=Math.atan2(vect_y,vect_x);rotation>Math.PI/2?rotation=rotation-Math.PI:rotation<-Math.PI/2&&(rotation=rotation+Math.PI),text.rotation=rotation,text.position.set(perp_x,perp_y),this.layer.addChild(text)}clear(){this._layer?.destroy({children:!0}),this._layer=null}destroy(){this.clear()}addLayer(){return this._layer=new PIXI.Graphics,this.token.layer.addChild(this._layer)}};__name2(_FlankingHighlightRenderer,"FlankingHighlightRenderer");let FlankingHighlightRenderer=_FlankingHighlightRenderer;const _TokenPF2e=class extends Token{static{__name(this,"_TokenPF2e")}auras;flankingHighlight;hearing;constructor(document2){super(document2),this.hearing=new HearingSource({object:this}),this.auras=new AuraRenderers(this),Object.defineProperty(this,"auras",{configurable:!1,writable:!1}),this.flankingHighlight=new FlankingHighlightRenderer(this),Object.defineProperty(this,"flankingHighlight",{configurable:!1,writable:!1})}get isVisible(){if(this.detectionFilter=null,this.document.hidden&&!game.user.isGM)return!1;if(!canvas.effects.visibility.tokenVision||this.controlled||canvas.effects.visionSources.get(this.sourceId)?.active)return!0;const tolerance=Math.floor(.35*Math.min(this.w,this.h));return canvas.effects.visibility.testVisibility(this.center,{tolerance,object:this})}get isAnimating(){return!!this._animation}get emitsDarkness(){return this.document.emitsDarkness}get hasLowLightVision(){return this.document.hasLowLightVision}get hasDarkvision(){return this.document.hasDarkvision}get linkToActorSize(){return this.document.linkToActorSize}get highlightId(){return`Token.${this.id}`}get mechanicalBounds(){const bounds=super.bounds;if(this.document.width<1){const position=canvas.grid.getTopLeft(bounds.x+bounds.width/2,bounds.y+bounds.height/2);return new PIXI.Rectangle(position[0],position[1],Math.max(canvas.grid.size,bounds.width),Math.max(canvas.grid.size,bounds.height))}return bounds}get sightRange(){return this.document.sight.range>=canvas.dimensions.maxR?canvas.dimensions.maxR:super.sightRange}isAdjacentTo(token){return this.distanceTo(token)===5}canFlank(flankee,context={}){if(this===flankee||!game.settings.get("pf2e","automation.flankingDetection"))return!1;const flankable=context.ignoreFlankable||flankee.actor?.attributes.flanking.flankable;if(!(this.actor?.attributes.flanking.canFlank&&flankable)||!this.actor.isOfType("character","npc")||!flankee.actor?.isOfType("creature")||this.actor.isAllyOf(flankee.actor))return!1;const reach=context.reach??this.actor.getReach({action:"attack"});return this.actor.canAttack&&reach>=this.distanceTo(flankee,{reach})}onOppositeSides(flankerA,flankerB,flankee){const{lineSegmentIntersects}=foundry.utils,[centerA,centerB]=[flankerA.center,flankerB.center],{bounds}=flankee,left=new Ray({x:bounds.left,y:bounds.top},{x:bounds.left,y:bounds.bottom}),right=new Ray({x:bounds.right,y:bounds.top},{x:bounds.right,y:bounds.bottom}),top=new Ray({x:bounds.left,y:bounds.top},{x:bounds.right,y:bounds.top}),bottom=new Ray({x:bounds.left,y:bounds.bottom},{x:bounds.right,y:bounds.bottom}),intersectsSide=__name2(side=>lineSegmentIntersects(centerA,centerB,side.A,side.B),"intersectsSide");return intersectsSide(left)&&intersectsSide(right)||intersectsSide(top)&&intersectsSide(bottom)}isFlanking(flankee,context={}){if(!(this.actor&&this.canFlank(flankee,context)))return!1;const{flanking}=this.actor.attributes,flankingBuddies=canvas.tokens.placeables.filter(t=>t!==this&&t.canFlank(flankee,pick$1(context,["ignoreFlankable"])));return flankingBuddies.length===0?!1:flanking.canGangUp.some(g=>typeof g=="number"&&g<=flankingBuddies.length)||this.isAdjacentTo(flankee)&&flanking.canGangUp.includes("animal-companion")&&flankingBuddies.some(b=>{if(!b.actor?.isOfType("character"))return!1;const traits=b.actor.traits;return traits.has("minion")&&!traits.has("construct")&&b.isAdjacentTo(flankee)})?!0:flankingBuddies.some(b=>this.onOppositeSides(this,b,flankee))}buddiesFlanking(flankee,context={}){return!this.actor||!this.canFlank(flankee,context)?[]:canvas.tokens.placeables.filter(t=>t!==this&&t.canFlank(flankee,pick$1(context,["ignoreFlankable"]))).filter(b=>this.onOppositeSides(this,b,flankee))}_refreshVisibility(){super._refreshVisibility(),this.auras.draw(),this.flankingHighlight.draw()}_getBorderColor(options){const isHovered=options?.hover??(this.hover||this.layer.highlightObjects),isControlled=this.controlled||!game.user.isGM&&this.isOwner,isFriendly=this.document.disposition===CONST.TOKEN_DISPOSITIONS.FRIENDLY;if(!isHovered||isControlled||isFriendly||!this.actor?.hasPlayerOwner)return super._getBorderColor();const colors=CONFIG.Canvas.dispositionColors;switch(this.document.disposition){case CONST.TOKEN_DISPOSITIONS.NEUTRAL:return colors.NEUTRAL;case CONST.TOKEN_DISPOSITIONS.HOSTILE:return colors.HOSTILE;case CONST.TOKEN_DISPOSITIONS.SECRET:return this.isOwner?colors.SECRET:null;default:return super._getBorderColor(options)}}_drawBar(number,bar,data){if(!canvas.dimensions)return;const actor=this.document.actor;if(!(data.attribute==="attributes.hp"&&actor?.attributes.hp))return super._drawBar(number,bar,data);const{value,max,temp}=actor.attributes.hp??{},healthPercent=Math.clamped(value,0,max)/max,black=0,color=Number(number?Color.fromRGB([.5*healthPercent,.7*healthPercent,.5+healthPercent/2]):Color.fromRGB([1-healthPercent/2,healthPercent,0]));let h=Math.max(canvas.dimensions.size/12,8);const bs=Math.clamped(h/8,1,2);this.document.height>=2&&(h*=1.6);const numBars=temp>0?2:1,barHeight=h/numBars;if(bar.clear(),bar.lineStyle(0).beginFill(black,.5).drawRoundedRect(0,0,this.w,h,3),bar.lineStyle(bs/2,black,1),temp>0){const tempWidth=Math.clamped(temp,0,max)/max*this.w-2*(bs-1);bar.beginFill(6737151,1).drawRoundedRect(0,0,tempWidth,barHeight,2)}const healthBarY=(numBars-1)*barHeight;bar.beginFill(color,1).drawRoundedRect(0,healthBarY,healthPercent*this.w,barHeight,2),bar.beginFill(black,0).lineStyle(bs,black,1).drawRoundedRect(0,0,this.w,h,3),bar.position.set(0,number===0?this.h-h:0)}async drawEffects(){if(await super.drawEffects(),await this._animation,this.auras.size===0)return this.auras.reset();const changedAndDeletedAuraSlugs=Array.from(this.auras.entries()).filter(([slug,aura])=>{const properties=["radius","appearance"],sceneData=pick$1(this.document.auras.get(slug)??{radius:null,appearance:null},properties),canvasData=pick$1(aura,properties);return sceneData.radius===null?!0:Object.keys(diffObject(canvasData,sceneData)).length+Object.keys(diffObject(sceneData,canvasData)).length>0}).map(([slug])=>slug),newAuraSlugs=Array.from(this.document.auras.keys()).filter(s=>!this.auras.has(s));return this.auras.reset([changedAndDeletedAuraSlugs,newAuraSlugs].flat())}emitHoverIn(nativeEvent){const event=new PIXI.FederatedPointerEvent(new PIXI.EventBoundary(this));event.type="pointerover",event.nativeEvent=nativeEvent,this._onHoverIn(event,{hoverOutOthers:!0})}emitHoverOut(nativeEvent){const event=new PIXI.FederatedPointerEvent(new PIXI.EventBoundary(this));event.type="pointerout",event.nativeEvent=nativeEvent,this._onHoverOut(event)}_isVisionSource(){return!!this.actor?.hasPlayerOwner&&!game.user.isGM&&game.settings.get("pf2e","metagame_partyVision")||super._isVisionSource()}clone(){const clone=super.clone();return clone.isPreview&&(clone.document.height=this.document.height,clone.document.width=this.document.width,clone.document.texture.scaleX=this.document.texture.scaleX,clone.document.texture.scaleY=this.document.texture.scaleY,clone.document.texture.src=this.document.texture.src),clone}async showFloatyText(params){if(!this.isVisible)return;if(!game.user.isGM&&typeof params!="number"){const[_,document2]=Object.entries(params)[0];if(document2 instanceof EffectPF2e&&document2.system.unidentified)return}const scrollingTextArgs=(()=>{if(typeof params=="number"){const quantity=params,maxHP=this.actor?.hitPoints?.max;if(!(quantity&&typeof maxHP=="number"))return null;const percent=Math.clamped(Math.abs(quantity)/maxHP,0,1),textColors={damage:16711680,healing:65280};return[this.center,params.signedString(),{anchor:CONST.TEXT_ANCHOR_POINTS.TOP,jitter:.25,fill:textColors[quantity<0?"damage":"healing"],fontSize:16+32*percent,stroke:0,strokeThickness:4}]}else{const[change,details]=Object.entries(params)[0],isAdded=change==="create",sign=isAdded?"+ ":"- ",appendedNumber=!/ \d+$/.test(details.name)&&details.value?` ${details.value}`:"",content=`${sign}${details.name}${appendedNumber}`,anchorDirection=isAdded?CONST.TEXT_ANCHOR_POINTS.TOP:CONST.TEXT_ANCHOR_POINTS.BOTTOM,textStyle=pick$1(this._getTextStyle(),["fill","fontSize","stroke","strokeThickness"]);return[this.center,content,{...textStyle,anchor:anchorDirection,direction:anchorDirection,jitter:.25}]}})();scrollingTextArgs&&(await this._animation,await canvas.interface?.createScrollingText(...scrollingTextArgs))}distanceTo(target,{reach=null}={}){if(!canvas.dimensions)return NaN;if(this===target)return 0;if(canvas.grid.type!==CONST.GRID_TYPES.SQUARE)return canvas.grid.measureDistance(this.position,target.position);const selfElevation=this.document.elevation,targetElevation=target.document.elevation;return selfElevation===targetElevation||!this.actor||!target.actor?measureDistanceCuboid(this.bounds,target.bounds,{reach}):measureDistanceCuboid(this.bounds,target.bounds,{reach,token:this,target})}async animate(updateData,options){if(options?.spin){let attributeAdded=!1;const currentRotation=this.document.rotation,rotationAngle=this.x<=this.document.x?360:-360;options.ontick=(_frame,data)=>{if(this.document.lockRotation=!1,!attributeAdded&&data.attributes.length>0){const duration=(data.duration??1e3)/1e3;data.attributes.push({attribute:"rotation",parent:data.attributes[0].parent,from:currentRotation,to:currentRotation+duration*rotationAngle,delta:data.attributes[0].delta}),attributeAdded=!0}}}await super.animate(updateData,options),this.document.lockRotation=this.document._source.lockRotation}updateVisionSource({defer=!1,deleted=!1}={}){super.updateVisionSource({defer,deleted}),this._isVisionSource()&&!deleted&&this.hearing.initialize()}render(renderer){if(super.render(renderer),!this.mesh)return;const configuredTint=this.document.texture.tint??"#FFFFFF";this.mesh.tint!==0&&this.detectionFilter instanceof OutlineOverlayFilter?this.mesh.tint=0:this.mesh.tint===0&&configuredTint!=="#000000"&&!this.detectionFilter&&(this.mesh.tint=Number(Color.fromString(configuredTint)))}_destroy(){super._destroy(),this.auras.destroy(),this.hearing.destroy(),this.flankingHighlight.destroy()}_canView(user,event){return super._canView(user,event)||!!(this.actor?.isOfType("npc")&&this.actor.isLootable)}_onControl(options={}){return game.ready&&game.pf2e.effectPanel.refresh(),super._onControl(options)}_onRelease(options){return game.pf2e.effectPanel.refresh(),super._onRelease(options)}_onApplyStatusEffect(statusId,active){super._onApplyStatusEffect(statusId,active),["undetected","unnoticed"].includes(statusId)&&(canvas.perception.update({refreshVision:!0,refreshLighting:!0},!0),this.mesh.refresh())}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId),changed.width&&(this._animation?this._animation.then(()=>{this.auras.reset()}):this.auras.reset())}};__name2(_TokenPF2e,"TokenPF2e");let TokenPF2e=_TokenPF2e;function measureDistanceCuboid(r0,r1,{reach=null,token=null,target=null}={}){if(!canvas.dimensions)return NaN;if(canvas.grid.type!==CONST.GRID_TYPES.SQUARE)return canvas.grid.measureDistance(r0,r1);const gridWidth=canvas.grid.grid.w,distance={dx:0,dy:0,dz:0};if([[r0,r1],[r1,r0]].some(([rA,rB])=>rB.right>rA.left&&rB.leftrA.top&&rB.top{const roundLeft=rectangle.leftrB.bottom>rA.top&&rB.top{const roundLeft=rectangle.lefta-b),squares={doubleDiagonal:sortedDistance[0],diagonal:sortedDistance[1]-sortedDistance[0],straight:sortedDistance[2]-sortedDistance[1]},reduction=squares.diagonal+squares.doubleDiagonal>1&&reach===10?1:0;return(Math.floor(squares.doubleDiagonal*1.75+squares.diagonal*1.5+squares.straight)-reduction)*gridDistance}__name(measureDistanceOnGrid,"measureDistanceOnGrid"),__name2(measureDistanceOnGrid,"measureDistanceOnGrid");function highlightGrid({areaType,object,colors,document:document2,collisionType="move",preview=!1}){if(!object.id&&!preview)return;const{grid,dimensions}=canvas;if(!(grid&&dimensions))return;const angle=document2.angle??0,direction=document2.direction??45,highlightLayer=grid.getHighlightLayer(object.highlightId)?.clear();if(!highlightLayer)return;const[cx,cy]=grid.getCenter(document2.x,document2.y),[col0,row0]=grid.grid.getGridPositionFromPixels(cx,cy),minAngle=(360+(direction-angle*.5)%360)%360,maxAngle=(360+(direction+angle*.5)%360)%360,snappedOrigin=canvas.grid.getSnappedPosition(document2.x,document2.y,object.layer.gridPrecision),withinAngle=__name2((min,max,value)=>(min=(360+min%360)%360,max=(360+max%360)%360,value=(360+value%360)%360,min=min&&value<=max:value>=min||value<=max),"withinAngle"),coneOriginOffset=(()=>{if(areaType!=="cone")return{x:0,y:0};const dir=(direction>=0?360-direction:-direction)%360,xOffset=snappedOrigin.x%dimensions.size!==0?Math.sign(1*Math.round(Math.cos(Math.toRadians(dir))*100)/100)/2:0,yOffset=snappedOrigin.y%dimensions.size!==0?-Math.sign(1*Math.round(Math.sin(Math.toRadians(dir))*100)/100)/2:0;return{x:xOffset*dimensions.size,y:yOffset*dimensions.size}})(),padding=Math.clamped(document2.width??0,1.5,2),docDistance=document2.distance??0,padded=docDistance*padding/dimensions.distance,rowCount=Math.ceil(padded/(dimensions.size/grid.h)),columnCount=Math.ceil(padded/(dimensions.size/grid.w)),offsetEmanationOrigin=__name2(destination=>{if(!(areaType==="emanation"&&object instanceof TokenPF2e))return{x:0,y:0};if(object.w<=dimensions.size)return{x:0,y:0};const offset=(object.w-dimensions.size)/2,getCoordinate=__name2((centerCoord,destCoord)=>destCoord===centerCoord?0:destCoord>centerCoord?offset:-offset,"getCoordinate");return{x:getCoordinate(object.center.x,destination.x),y:getCoordinate(object.center.y,destination.y)}},"offsetEmanationOrigin");for(let a=-columnCount;a0&&!withinAngle(minAngle,maxAngle,rayAngle))continue}if(measureDistance(destination,origin)>docDistance)continue;canvas.ready&&CONFIG.Canvas.polygonBackends[collisionType].testCollision(origin,destination,{type:collisionType,mode:"any"})?(grid.grid.highlightGridPosition(highlightLayer,{x:gx,y:gy,border:1,color:0}),highlightLayer.beginFill(0,.5).moveTo(gx,gy).lineTo(gx+dimensions.size,gy+dimensions.size).endFill()):grid.grid.highlightGridPosition(highlightLayer,{x:gx,y:gy,border:colors.border,color:colors.fill})}}__name(highlightGrid,"highlightGrid"),__name2(highlightGrid,"highlightGrid");const _MeasuredTemplatePF2e=class _MeasuredTemplatePF2e2 extends MeasuredTemplate{static{__name(this,"_MeasuredTemplatePF2e")}constructor(){super(...arguments),__privateAdd(this,_moveTime,0),__privateAdd(this,_wheelListenerOptions,{passive:!1}),__privateAdd(this,_onPreviewMouseMove,__name2(event=>{event.stopPropagation();const now=Date.now();if(now-__privateGet(this,_moveTime)<=20)return;const center=event.getLocalPosition(this.layer),snapped=canvas.grid.getSnappedPosition(center.x,center.y,2),hexTypes=[CONST.GRID_TYPES.HEXODDR,CONST.GRID_TYPES.HEXEVENR],direction=__privateGet(this,_moveTime)===0&&hexTypes.includes(canvas.grid.type)?this.document.direction+30:this.document.direction;this.document.updateSource({...snapped,direction}),this.refresh(),__privateSet(this,_moveTime,now)},"#onPreviewMouseMove")),__privateAdd(this,_onPreviewLeftClick,__name2(()=>{canvas.scene&&canvas.scene.createEmbeddedDocuments("MeasuredTemplate",[this.document.toObject()]).then(()=>{_MeasuredTemplatePF2e2.currentPreview&&(_MeasuredTemplatePF2e2.currentPreview.placed=!0)}),canvas.tokens.activate(),this.destroy()},"#onPreviewLeftClick")),__privateAdd(this,_onPreviewRightClick,__name2(()=>{canvas.tokens.activate(),this.destroy(),_MeasuredTemplatePF2e2.currentPreview?.resolve(null)},"#onPreviewRightClick")),__privateAdd(this,_onPreviewMouseWheel,__name2(event=>{if(event instanceof WheelEvent){if(event.ctrlKey){event.preventDefault(),event.stopPropagation();const snap=event.shiftKey?15:5;this.document.updateSource({direction:this.document.direction+snap*Math.sign(event.deltaY)}),this.refresh()}else if(event.shiftKey){event.stopPropagation();const snap=canvas.grid.type>=CONST.GRID_TYPES.HEXODDR&&canvas.grid.type<=CONST.GRID_TYPES.HEXEVENQ?60:45;this.document.updateSource({direction:this.document.direction+snap*Math.sign(event.deltaY)}),this.refresh()}}},"#onPreviewMouseWheel"))}get type(){return this.document.t}highlightGrid(){if(!["circle","cone"].includes(this.type)||canvas.grid.type!==CONST.GRID_TYPES.SQUARE)return super.highlightGrid();if(!this.isVisible){canvas.grid.getHighlightLayer(this.highlightId)?.clear();return}highlightGrid({areaType:this.type==="circle"?"burst":"cone",object:this,document:this.document,colors:{border:this.borderColor,fill:this.fillColor},preview:!0})}async drawPreview(){return this.layer.activate(),await this.draw(),this.layer.preview.addChild(this),canvas.stage.on("mousemove",__privateGet(this,_onPreviewMouseMove)),canvas.stage.on("mousedown",__privateGet(this,_onPreviewLeftClick)),canvas.stage.on("rightdown",__privateGet(this,_onPreviewRightClick)),canvas.app.view.addEventListener?.("wheel",__privateGet(this,_onPreviewMouseWheel),__privateGet(this,_wheelListenerOptions)),_MeasuredTemplatePF2e2.currentPreview?.resolve(null),new Promise(res=>{_MeasuredTemplatePF2e2.currentPreview={resolve:value=>{res(value),_MeasuredTemplatePF2e2.currentPreview=null},placed:!1}})}destroy(options){canvas.stage.off("mousemove",__privateGet(this,_onPreviewMouseMove)),canvas.stage.off("mousedown",__privateGet(this,_onPreviewLeftClick)),canvas.stage.off("rightdown",__privateGet(this,_onPreviewRightClick)),canvas.app.view.removeEventListener?.("wheel",__privateGet(this,_onPreviewMouseWheel),__privateGet(this,_wheelListenerOptions)),super.destroy(options)}applyRenderFlags(){super.applyRenderFlags(),_MeasuredTemplatePF2e2.currentPreview?.placed&&_MeasuredTemplatePF2e2.currentPreview.resolve(this)}get item(){return this.document.item}};_moveTime=new WeakMap,_wheelListenerOptions=new WeakMap,_onPreviewMouseMove=new WeakMap,_onPreviewLeftClick=new WeakMap,_onPreviewRightClick=new WeakMap,_onPreviewMouseWheel=new WeakMap,__name2(_MeasuredTemplatePF2e,"MeasuredTemplatePF2e"),__publicField(_MeasuredTemplatePF2e,"currentPreview",null);let MeasuredTemplatePF2e=_MeasuredTemplatePF2e;const _TokenAura=class{static{__name(this,"_TokenAura")}constructor(params){__publicField(this,"slug"),__publicField(this,"token"),__publicField(this,"level"),__publicField(this,"radius"),__publicField(this,"traits"),__publicField(this,"effects"),__publicField(this,"appearance"),__privateAdd(this,_squares,void 0),this.slug=params.slug,this.token=params.token,this.level=params.level,this.radius=params.radius,this.traits=params.traits,this.effects=params.effects,this.appearance=params.appearance}get radiusPixels(){const gridSize=this.scene.grid.distance,gridSizePixels=this.scene.grid.size;return .5*this.token.mechanicalBounds.width+this.radius/gridSize*gridSizePixels}get scene(){return this.token.scene}get bounds(){const{token,radiusPixels}=this,bounds=token.mechanicalBounds;return new PIXI.Rectangle(bounds.x-(radiusPixels-bounds.width/2),bounds.y-(radiusPixels-bounds.width/2),radiusPixels*2,radiusPixels*2)}get center(){return this.token.center}get squares(){return __privateGet(this,_squares)??__privateSet(this,_squares,getAreaSquares(this))}containsToken(token){return token===this.token?!0:!this.token.object||!token.object||this.token.object.distanceTo(token.object)>this.radius?!1:this.squares.some(s=>s.active&&measureDistanceCuboid(s,token.mechanicalBounds)===0)}async notifyActors(){if(!this.scene.isInFocus)return;const auraActor=this.token.actor,auraData=auraActor?.auras.get(this.slug);if(!(auraActor&&auraData))return;const auradTokens=this.scene.tokens.filter(t=>t.actor?.primaryUpdater===game.user&&this.containsToken(t)),affectedActors=new Set(auradTokens.flatMap(t=>t.actor??[])),origin={actor:auraActor,token:this.token};for(const actor of affectedActors)await actor.applyAreaEffects(auraData,origin)}};_squares=new WeakMap,__name2(_TokenAura,"TokenAura");let TokenAura=_TokenAura;const _TokenDocumentPF2e=class _TokenDocumentPF2e2 extends TokenDocument{static{__name(this,"_TokenDocumentPF2e")}constructor(){super(...arguments),__privateAdd(this,_prepareDerivedPerception),__publicField(this,"constructed",!0)}get inCombat(){return this.actor?.isOfType("party")?this.actor.members.every(a=>game.combat?.getCombatantByActor(a.id)):super.inCombat}hasStatusEffect(statusId){if(statusId==="dead")return this.overlayEffect===CONFIG.controlIcons.defeated;const{actor}=this;return!actor||!game.settings.get("pf2e","automation.rulesBasedVision")?!1:objectHasKey(CONFIG.PF2E.conditionTypes,statusId)&&actor.hasCondition(statusId)||__name2(()=>actor.itemTypes.effect.some(e=>(e.slug??sluggify(e.name))===statusId),"hasEffect")()}static getTrackedAttributes(data={},_path=[]){if(_path.length===0&&Object.keys(data).length===0)for(const[type,model]of Object.entries(game.system.model.Actor))["character","npc"].includes(type)&&foundry.utils.mergeObject(data,model);if(_path.length>0)return super.getTrackedAttributes(data,_path);const patterns={positive:/^(?:attributes|resources)\./,negative:/\b(?:rank|_?modifiers|item|classdc|dexcap|familiar|\w+hp\b)|bonus/i},prunedData=expandObject(Object.fromEntries(Object.entries(flattenObject(data)).filter(([k,v])=>patterns.positive.test(k)&&!patterns.negative.test(k)&&!["boolean","string"].includes(typeof v))));return super.getTrackedAttributes(prunedData,_path)}get scene(){return this.parent}get emitsDarkness(){return this.light.bright<0}get rulesBasedVision(){return!!(this.sight.enabled&&this.actor?.isOfType("character","familiar")&&this.scene?.rulesBasedVision)}get hasLowLightVision(){return!!(this.rulesBasedVision&&this.actor?.isOfType("creature")&&this.actor.hasLowLightVision)}get hasDarkvision(){return!!(this.rulesBasedVision&&this.actor?.isOfType("creature")&&this.actor.hasDarkvision)}get linkToActorSize(){return this.flags.pf2e.linkToActorSize}get autoscale(){return this.flags.pf2e.autoscale}get playersCanSeeName(){const anyoneCanSee=[CONST.TOKEN_DISPLAY_MODES.ALWAYS,CONST.TOKEN_DISPLAY_MODES.HOVER],nameDisplayMode=this.displayName;return anyoneCanSee.includes(nameDisplayMode)||this.actor?.alliance==="party"}get bounds(){const gridSize=this.scene?.grid.size??100;return new PIXI.Rectangle(this._source.x,this._source.y,this.width*gridSize,this.height*gridSize)}get mechanicalBounds(){const bounds=this.bounds;if(this.width<1){const position=canvas.grid.getTopLeft(bounds.x+bounds.width/2,bounds.y+bounds.height/2);return new PIXI.Rectangle(position[0],position[1],Math.max(canvas.grid.size,bounds.width),Math.max(canvas.grid.size,bounds.height))}return bounds}get center(){const{bounds}=this;return{x:bounds.x+bounds.width/2,y:bounds.y+bounds.height/2}}_initialize(options){this.constructed??=!1,this.auras=new Map,super._initialize(options)}prepareData(){this.parent&&!this.parent.flags?.pf2e||super.prepareData()}prepareBaseData(){if(super.prepareBaseData(),this.flags=mergeObject(this.flags,{pf2e:{}}),this.auras.clear(),!this.actor||!this.isEmbedded)return;_TokenDocumentPF2e2.assignDefaultImage(this);for(const[key,data]of this.actor.auras.entries())this.auras.set(key,new TokenAura({token:this,...deepClone(data)}));if(!this.constructed)return;const linkDefault=SIZE_LINKABLE_ACTOR_TYPES.has(this.actor.type),linkToActorSize=this.flags.pf2e?.linkToActorSize??linkDefault,autoscaleDefault=game.settings.get("pf2e","tokens.autoscale"),autoscale=linkToActorSize?this.flags.pf2e.autoscale??autoscaleDefault:!1;this.flags.pf2e=mergeObject(this.flags.pf2e??{},{linkToActorSize,autoscale});const{alliance}=this.actor.system.details;this.disposition=this.disposition===CONST.TOKEN_DISPOSITIONS.SECRET?CONST.TOKEN_DISPOSITIONS.SECRET:alliance?{party:CONST.TOKEN_DISPOSITIONS.FRIENDLY,opposition:CONST.TOKEN_DISPOSITIONS.HOSTILE}[alliance]:CONST.TOKEN_DISPOSITIONS.NEUTRAL}_prepareDetectionModes(){if(!(this.constructed&&this.actor&&this.rulesBasedVision))return super._prepareDetectionModes();this.detectionModes=[{id:"basicSight",enabled:!0,range:0}],["character","familiar"].includes(this.actor.type)&&(this.sight.attenuation=.1,this.sight.brightness=0,this.sight.contrast=0,this.sight.range=0,this.sight.saturation=0,this.sight.visionMode="basic")}prepareDerivedData(){if(super.prepareDerivedData(),!(this.constructed&&this.actor&&this.scene))return;const{tokenOverrides}=this.actor.synthetics;this.name=tokenOverrides.name??this.name,tokenOverrides.texture&&(this.texture.src=tokenOverrides.texture.src,"scaleX"in tokenOverrides.texture&&(this.texture.scaleX=tokenOverrides.texture.scaleX,this.texture.scaleY=tokenOverrides.texture.scaleY,this.flags.pf2e.autoscale=!1),this.texture.tint=tokenOverrides.texture.tint??this.texture.tint),this.alpha=tokenOverrides.alpha??this.alpha,tokenOverrides.light&&(this.light=new foundry.data.LightData(tokenOverrides.light,{parent:this})),_TokenDocumentPF2e2.prepareSize(this),__privateMethod(this,_prepareDerivedPerception,prepareDerivedPerception_fn).call(this)}static assignDefaultImage(token){const{actor}=token;if(!actor)return;const defaultIcons=[ActorPF2e.DEFAULT_ICON,`systems/pf2e/icons/default-icons/${actor.type}.svg`];game.settings.get("pf2e","nathMode")&&defaultIcons.includes(token.texture.src)?token.texture.src=(()=>{switch(actor.alliance){case"party":return"systems/pf2e/icons/default-icons/alternatives/nath/ally.webp";case"opposition":return"systems/pf2e/icons/default-icons/alternatives/nath/enemy.webp";default:return token.texture.src}})():defaultIcons.some(path=>token.texture.src?.endsWith(path))&&(token.texture.src=actor._source.img)}static prepareSize(token){const{actor}=token;if(!(actor&&token.flags.pf2e.linkToActorSize))return;const size={tiny:.5,sm:1,med:1,lg:2,huge:3,grg:Math.max(token.width,4)}[actor.size];if(actor.isOfType("vehicle")){const{width,height}=actor.getTokenDimensions();token.width=width,token.height=height}else if(token.width=size,token.height=size,game.settings.get("pf2e","tokens.autoscale")&&token.flags.pf2e.autoscale!==!1){const absoluteScale=actor.size==="sm"?.8:1,mirrorX=token.texture.scaleX<0?-1:1;token.texture.scaleX=mirrorX*absoluteScale;const mirrorY=token.texture.scaleY<0?-1:1;token.texture.scaleY=mirrorY*absoluteScale}}async setInitiative({initiative,sendMessage=!0}){if(!game.combat){ui.notifications.error("PF2E.Encounter.NoActiveEncounter");return}const currentId=game.combat.combatant?.id;this.combatant&&game.combat.combatants.has(this.combatant.id)?await game.combat.setInitiative(this.combatant.id,initiative):await game.combat.createEmbeddedDocuments("Combatant",[{tokenId:this.id,initiative}]),await this.update({turn:game.combat.turns.findIndex(c=>c.id===currentId)}),sendMessage&&await ChatMessagePF2e.createDocuments([{speaker:{scene:this.scene?.id,token:this.id},whisper:this.actor?.hasPlayerOwner?[]:game.users.contents.flatMap(user=>user.isGM?user.id:[]),content:game.i18n.format("PF2E.InitiativeIsNow",{name:this.name,value:initiative})}])}_onCreate(data,options,userId){super._onCreate(data,options,userId),game.user.id===userId&&this.actor?.isOfType("loot")&&this.actor.toggleTokenHiding()}_onUpdate(changed,options,userId){const tokenSetsNameVisibility=game.settings.get("pf2e","metagame_tokenSetsNameVisibility");return"displayName"in changed&&tokenSetsNameVisibility&&this.combatant&&ui.combat.render(),changed.actorLink===!1&&this.rendered&&this.object?.controlled&&this.object.release(),super._onUpdate(changed,options,userId)}_onRelatedUpdate(update={},options={}){super._onRelatedUpdate(update,options);const initializeVision=!!this.scene?.isView&&this.sight.enabled&&Object.keys(flattenObject(update)).some(k=>k.startsWith("system.traits.senses"));initializeVision&&canvas.perception.update({initializeVision},!0);const preUpdate=this.toObject(!1),preUpdateAuras=Array.from(this.auras.values()).map(a=>omit(a,["appearance","token"]));this.reset();const postUpdate=this.toObject(!1),postUpdateAuras=Array.from(this.auras.values()).map(a=>omit(a,["appearance","token"])),tokenChanges=diffObject(preUpdate,postUpdate);this.scene?.isView&&Object.keys(tokenChanges).length>0&&this.object?._onUpdate(tokenChanges,{},game.user.id);const aurasChanged=__name2(()=>!!this.scene?.isInFocus&&!equals(preUpdateAuras,postUpdateAuras),"aurasChanged");("disposition"in tokenChanges||"width"in tokenChanges||"height"in tokenChanges||aurasChanged())&&this.scene?.checkAuras?.()}_onDelete(options,userId){if(super._onDelete(options,userId),!!this.actor)if(this.isLinked)this.scene?.tokens.some(t=>t.actor===this.actor)||this.actor.checkAreaEffects();else for(const effect of this.actor.itemTypes.effect)game.pf2e.effectTracker.unregister(effect)}};_prepareDerivedPerception=new WeakSet,prepareDerivedPerception_fn=__name2(function(){if(!(this.rulesBasedVision&&this.actor&&this.scene&&this.sight.enabled))return;const visionMode=this.hasDarkvision?"darkvision":"basic";this.sight.visionMode=visionMode;const{defaults}=CONFIG.Canvas.visionModes[visionMode].vision;if(this.sight.brightness=defaults.brightness??0,this.sight.saturation=defaults.saturation??0,visionMode==="darkvision"||this.scene.lightLevel>LightLevels.DARKNESS){const basicDetection=this.detectionModes.at(0);if(!basicDetection)return;this.sight.range=basicDetection.range=defaults.range??0,this.actor.isOfType("character")&&this.actor.flags.pf2e.colorDarkvision?this.sight.saturation=1:game.user.settings.monochromeDarkvision||(this.sight.saturation=0)}this.actor.isOfType("character","familiar")&&this.actor.system.traits.senses.some(s=>s.type==="seeInvisibility")&&this.detectionModes.push({id:"seeInvisibility",enabled:!0,range:1e3});const tremorsense=this.actor.isOfType("character")?this.actor.system.traits.senses.find(s=>s.type==="tremorsense"&&s.acuity!=="vague"):null;if(tremorsense&&this.detectionModes.push({id:"feelTremor",enabled:!0,range:tremorsense.range}),!this.actor.hasCondition("deafened")){const range=this.scene.flags.pf2e.hearingRange??canvas.dimensions?.maxR??1/0;this.detectionModes.push({id:"hearing",enabled:!0,range})}},"#prepareDerivedPerception"),__name2(_TokenDocumentPF2e,"TokenDocumentPF2e");let TokenDocumentPF2e=_TokenDocumentPF2e;const _BaseTagSelector=class extends DocumentSheet{static{__name(this,"_BaseTagSelector")}constructor(document2,options={}){super(document2,options),__privateAdd(this,_getChoices),__publicField(this,"choices"),__publicField(this,"flat"),this.flat=options.flat??!1,this.choices=__privateMethod(this,_getChoices,getChoices_fn).call(this)}static get defaultOptions(){return mergeObject(super.defaultOptions,{id:"tag-selector",classes:["pf2e","tag-selector"],width:"auto"})}get id(){return`${this.options.id}-${this.document.uuid}`}get title(){return game.i18n.localize(this.options.title||"PF2E.TraitsLabel")}async getData(options){return{...await super.getData(options),documentType:this.document.constructor.metadata.label}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const input of htmlQueryAll(html,"input:not([type=checkbox])"))input.addEventListener("focusin",()=>{input.select()})}sortChoices(choices){return Object.entries(choices).map(([key,value])=>[key,game.i18n.localize(value)]).sort(([_keyA,valueA],[_keyB,valueB])=>valueA.localeCompare(valueB)).reduce((accumulated,[key,value])=>mergeObject(accumulated,{[key]:value}),{})}};_getChoices=new WeakSet,getChoices_fn=__name2(function(){const choices=this.configTypes.reduce((types,key)=>mergeObject(types,CONFIG.PF2E[key]),{});return this.sortChoices(choices)},"#getChoices"),__name2(_BaseTagSelector,"BaseTagSelector");let BaseTagSelector=_BaseTagSelector;function isValuesList(value){return!!(value&&typeof value=="object"&&"value"in value)}__name(isValuesList,"isValuesList"),__name2(isValuesList,"isValuesList");const _TagSelectorBasic=class extends BaseTagSelector{static{__name(this,"_TagSelectorBasic")}constructor(document2,options){super(document2,options),__privateAdd(this,_getUpdateData),__privateAdd(this,_search),__privateAdd(this,_onFilterResults),__publicField(this,"allowCustom"),__privateAdd(this,_filterTimeout,null),__publicField(this,"objectProperty"),this.objectProperty=options.objectProperty,this.allowCustom=options.allowCustom??!0,options.customChoices&&(mergeObject(this.choices,options.customChoices),this.choices=this.sortChoices(this.choices))}static get defaultOptions(){return mergeObject(super.defaultOptions,{template:"systems/pf2e/templates/system/tag-selector/basic.hbs"})}get configTypes(){return this.options.configTypes??[]}async getData(options){const{chosen,custom,flat,disabled}=(()=>{const document2=this.document,sourceProperty=getProperty(document2.toObject(),this.objectProperty),preparedProperty=getProperty(document2,this.objectProperty);if(Array.isArray(preparedProperty)){const manuallyChosen=Array.isArray(sourceProperty)?sourceProperty.map(prop=>String(prop)):[],automaticallyChosen=preparedProperty.filter(tag=>!manuallyChosen.includes(tag));return{chosen:Array.from(new Set([...manuallyChosen,...automaticallyChosen])),custom:null,flat:!0,disabled:automaticallyChosen}}else if(isValuesList(preparedProperty)&&isValuesList(sourceProperty)){const manuallyChosen=sourceProperty.value.map(prop=>prop.toString()),custom2=this.allowCustom?sourceProperty.custom:null,automaticallyChosen=preparedProperty.value.filter(tag=>!manuallyChosen.includes(tag));return{chosen:Array.from(new Set([...manuallyChosen,...automaticallyChosen])),custom:custom2,flat:!1,disabled:automaticallyChosen}}else return{chosen:[],custom:null,flat:this.flat,disabled:[]}})(),choices=Object.keys(this.choices).reduce((accumulated,type)=>(accumulated[type]={label:this.choices[type],selected:chosen.includes(type),disabled:disabled.includes(type)},accumulated),{});return{...await super.getData(options),choices,allowCustom:this.allowCustom&&!flat,custom,flat}}activateListeners($html){super.activateListeners($html);const html=$html[0],searchInput=htmlQuery(html,"input[type=search]");searchInput?.addEventListener("input",()=>{__privateMethod(this,_onFilterResults,onFilterResults_fn).call(this,searchInput)})}async _updateObject(event,formData){const{flat}=event.target?$(event.target).data():{flat:!1},value=__privateMethod(this,_getUpdateData,getUpdateData_fn).call(this,formData);return this.allowCustom&&typeof formData.custom=="string"?super._updateObject(event,{[this.objectProperty]:{value,custom:formData.custom}}):flat?super._updateObject(event,{[this.objectProperty]:value}):super._updateObject(event,{[`${this.objectProperty}.value`]:value})}};_filterTimeout=new WeakMap,_getUpdateData=new WeakSet,getUpdateData_fn=__name2(function(formData){const optionsAreNumeric=Object.keys(formData).every(tag=>Number.isInteger(Number(tag))),selections=Object.entries(formData).flatMap(([tag,selected])=>selected?tag:[]).filter(tag=>tag!=="custom");return optionsAreNumeric?selections.map(tag=>Number(tag)):selections},"#getUpdateData"),_search=new WeakSet,search_fn=__name2(function(searchString){const query=new RegExp(RegExp.escape(searchString),"i"),html=this.element[0];for(const row of htmlQueryAll(html,"li.trait-item")){const name2=row.getElementsByClassName("trait-label")[0]?.textContent??"";row.style.display=query.test(name2)?"flex":"none"}},"#search"),_onFilterResults=new WeakSet,onFilterResults_fn=__name2(function(input){__privateGet(this,_filterTimeout)&&(clearTimeout(__privateGet(this,_filterTimeout)),__privateSet(this,_filterTimeout,null)),__privateSet(this,_filterTimeout,window.setTimeout(()=>__privateMethod(this,_search,search_fn).call(this,input.value),100))},"#onFilterResults"),__name2(_TagSelectorBasic,"TagSelectorBasic");let TagSelectorBasic=_TagSelectorBasic;const _SenseSelector=class extends BaseTagSelector{static{__name(this,"_SenseSelector")}objectProperty="system.traits.senses";static get defaultOptions(){return mergeObject(super.defaultOptions,{height:"auto",template:"systems/pf2e/templates/system/tag-selector/senses.hbs",id:"sense-selector",title:"PF2E.Actor.Creature.Sense.Label"})}get configTypes(){return["senses"]}async getData(options){if(!this.document.isOfType("character"))throw ErrorPF2e("The Sense selector is usable only with PCs");const senses2=this.document.system.traits.senses,choices=Object.entries(this.choices).reduce((accum,[type,label])=>{const sense=senses2.find(sense2=>sense2.type===type),mandatoryAcuity=objectHasKey(SENSES_WITH_MANDATORY_ACUITIES,type),acuity=mandatoryAcuity?SENSES_WITH_MANDATORY_ACUITIES[type]:sense?.acuity??"precise";return{...accum,[type]:{acuity,mandatoryAcuity,disabled:!!sense?.source,label,selected:!!sense,value:sense?.value??""}}},{});return{...await super.getData(options),hasExceptions:!1,choices,senseAcuity:CONFIG.PF2E.senseAcuity}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const input of htmlQueryAll(html,"input[type=number]")){const checkbox=htmlQuery(htmlClosest(input,"tr"),"input[type=checkbox]");checkbox&&input.addEventListener("input",()=>{checkbox.checked=!!Number(input.value)})}}_onSubmit(event,options){for(const input of htmlQueryAll(this.element[0],"input[type=number]")){const checkbox=htmlQuery(htmlClosest(input,"tr"),"input[type=checkbox]");checkbox&&!Number(input.value)&&(checkbox.checked=!1)}return super._onSubmit(event,options)}async _updateObject(event,formData){const update=Object.entries(formData).filter(e=>e[1]===!0||Array.isArray(e[1])&&e[1][0]).map(([type,values])=>{if(values===!0)return{type};if(Number(values[2])){const acuity=values[1],range=Number(values[2]);return{type,acuity,value:range}}else{const acuity=values[1];return{type,acuity}}});return super._updateObject(event,{[this.objectProperty]:update})}};__name2(_SenseSelector,"SenseSelector");let SenseSelector=_SenseSelector;const _SpeedSelector=class extends BaseTagSelector{static{__name(this,"_SpeedSelector")}objectProperty="system.attributes.speed.otherSpeeds";static get defaultOptions(){return mergeObject(super.defaultOptions,{id:"speed-selector",template:"systems/pf2e/templates/system/tag-selector/speeds.hbs",title:"PF2E.SpeedTypes"})}get configTypes(){return["speedTypes"]}async getData(options){if(!this.document.isOfType("creature"))throw ErrorPF2e("The Speed selector is usable only with creature-type actors");const speeds=this.document.system.attributes.speed.otherSpeeds,speedLabels=CONFIG.PF2E.speedTypes,choices=Object.keys(this.choices).reduce((accum,type)=>{const speed=speeds.find(s=>s.type===type);return{...accum,[type]:{selected:!!speed,disabled:!!speed?.source,label:game.i18n.localize(speedLabels[type]),value:Number(speed?.value)||""}}},{});return{...await super.getData(options),hasExceptions:this.document.isOfType("npc"),choices}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const input of htmlQueryAll(html,"input[type=number]"))input.addEventListener("input",()=>{const checkbox=input.closest("li")?.querySelector("input[type=checkbox]");checkbox&&(checkbox.checked=!!Number(input.value))})}async _updateObject(event,formData){const update=Object.entries(formData).flatMap(([key,value])=>{if(!(Array.isArray(value)&&value.length===2))return[];const selected=!!value[0],distance=Math.trunc(Math.abs(value[1]));return selected&&distance?{type:key,value:Math.max(distance,5)}:[]});return super._updateObject(event,{[this.objectProperty]:update})}};__name2(_SpeedSelector,"SpeedSelector");let SpeedSelector=_SpeedSelector;const TAG_SELECTOR_TYPES=["basic","senses","speed-types"],SELECTABLE_TAG_FIELDS=["abilities","actionTraits","attackEffects","creatureTraits","damageCategories","languages","levels","materialDamageEffects","otherArmorTags","otherConsumableTags","otherWeaponTags","senses","skills","speedTypes","vehicleTraits","weaponTraits"],_UUIDUtils=class{static{__name(this,"_UUIDUtils")}static async fromUUIDs(uuids,options){const resolvedUUIDs=uniq(uuids).flatMap(u=>foundry.utils.parseUuid(u,options).uuid??[]),packEmbeddedLinks=resolvedUUIDs.filter(u=>{const parsed=foundry.utils.parseUuid(u,options);return parsed.collection instanceof CompendiumCollection&&parsed.embedded.length>0}),packEmbeddedDocs=compact(await Promise.all(packEmbeddedLinks.map(u=>fromUuid(u)))),documentsAndIndexData=compact(resolvedUUIDs.filter(u=>!packEmbeddedLinks.includes(u)).map(u=>fromUuidSync(u))),worldDocsAndCacheHits=documentsAndIndexData.filter(d=>d instanceof foundry.abstract.Document),indexEntries=documentsAndIndexData.filter(d=>!(d instanceof foundry.abstract.Document)),packs=uniq(indexEntries.flatMap(e=>game.packs.get(e.pack??"")??[])),packDocs=(await Promise.all(packs.map(async pack=>{const ids=indexEntries.filter(e=>e.pack===pack.metadata.id).map(e=>e._id);return pack.getDocuments({_id__in:ids})}))).flat();return sortBy$1([...packEmbeddedDocs,...worldDocsAndCacheHits,...packDocs],d=>uuids.indexOf(d.uuid))}static isItemUUID(uuid){return typeof uuid=="string"&&foundry.utils.parseUuid(uuid).documentType==="Item"}static isCompendiumUUID(uuid){return typeof uuid=="string"&&foundry.utils.parseUuid(uuid).collection instanceof CompendiumCollection}static isTokenUUID(uuid){if(typeof uuid!="string")return!1;const parsed=foundry.utils.parseUuid(uuid);return parsed.documentType==="Scene"&&parsed.embedded[0]==="Token"}};__name2(_UUIDUtils,"UUIDUtils");let UUIDUtils=_UUIDUtils;const _ActorSizePF2e=class _ActorSizePF2e2{static{__name(this,"_ActorSizePF2e")}value;length;width;constructor(params){(typeof params.value!="string"||params.smallIsMedium&¶ms.value==="sm")&&(params.value="med"),this.value=params.value;const spaces=_ActorSizePF2e2.defaultSpaces[params.value]??_ActorSizePF2e2.defaultSpaces.med;this.length=params.length??spaces.length,this.width=params.width??spaces.width}equals(size,{smallIsMedium=!1}={}){const thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(size.value,{smallIsMedium});return thisSize===otherSize}isLargerThan(size,{smallIsMedium=!1}={}){const other=size instanceof _ActorSizePF2e2?size:new _ActorSizePF2e2({value:size}),thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(other.value,{smallIsMedium});return _ActorSizePF2e2.sizeRanks[thisSize]>_ActorSizePF2e2.sizeRanks[otherSize]}isSmallerThan(size,{smallIsMedium=!1}={}){const other=size instanceof _ActorSizePF2e2?size:new _ActorSizePF2e2({value:size}),thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(other.value,{smallIsMedium});return _ActorSizePF2e2.sizeRanks[thisSize]<_ActorSizePF2e2.sizeRanks[otherSize]}difference(size,{smallIsMedium=!1}={}){const thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(size.value,{smallIsMedium});return _ActorSizePF2e2.sizeRanks[thisSize]-_ActorSizePF2e2.sizeRanks[otherSize]}getEffectiveSize(size,{smallIsMedium}){return smallIsMedium&&size==="sm"?"med":size}increment({skipSmall=!1}={}){this.value=this.value==="tiny"&&skipSmall?"med":this.value==="sm"&&skipSmall?"lg":this.value==="grg"?"grg":SIZES[SIZES.indexOf(this.value)+1];const newSpace=_ActorSizePF2e2.defaultSpaces[this.value];this.length=newSpace.length,this.width=newSpace.width}decrement({skipSmall=!1}={}){const toTiny=this.value==="med"&&skipSmall||this.value==="tiny";this.value=toTiny?"tiny":SIZES[SIZES.indexOf(this.value)-1];const newSpace=_ActorSizePF2e2.defaultSpaces[this.value];this.length=newSpace.length,this.width=newSpace.width}toString(){return game.i18n.localize(CONFIG.PF2E.actorSizes[this.value])}};__name2(_ActorSizePF2e,"ActorSizePF2e"),__publicField(_ActorSizePF2e,"defaultSpaces",{tiny:{length:2.5,width:2.5},sm:{length:5,width:5},med:{length:5,width:5},lg:{length:10,width:10},huge:{length:15,width:15},grg:{length:20,width:20}}),__publicField(_ActorSizePF2e,"sizeRanks",{grg:5,huge:4,lg:3,med:2,sm:1,tiny:0});let ActorSizePF2e=_ActorSizePF2e;function onClickCreateSpell(actor,data){if(!data.location)throw ErrorPF2e("Unexpected missing spellcasting-entry location");const rank=Number(data.level??1),newLabel=game.i18n.localize("PF2E.NewLabel"),[rankLabel,spellLabel]=rank>0?[game.i18n.localize(`PF2E.SpellLevel${rank}`),game.i18n.localize(data.location==="rituals"?"PF2E.SpellCategoryRitual":"PF2E.SpellLabel")]:[null,game.i18n.localize("PF2E.TraitCantrip")],source={type:"spell",name:compact([newLabel,rankLabel,spellLabel]).join(" "),system:{level:{value:rank||1},location:{value:String(data.location)},traits:{value:rank===0?["cantrip"]:[]}}};data.location==="rituals"&&(source.system=mergeObject(source.system,{category:{value:"ritual"}})),actor.createEmbeddedDocuments("Item",[source])}__name(onClickCreateSpell,"onClickCreateSpell"),__name2(onClickCreateSpell,"onClickCreateSpell");function getSelectedOrOwnActors(types,useOwnCharacter=!0){const actors=canvas.tokens.controlled.flatMap(token=>token.actor?token.actor:[]).filter(actor=>actor.isOwner).filter(actor=>!types||actor.isOfType(...types));return actors.length===0&&game.user.character&&useOwnCharacter&&actors.push(game.user.character),actors}__name(getSelectedOrOwnActors,"getSelectedOrOwnActors"),__name2(getSelectedOrOwnActors,"getSelectedOrOwnActors");const inlineSelector=["action","check","effect-area"].map(keyword=>`[data-pf2-${keyword}]`).join(","),InlineRollLinks={injectRepostElement:(links,foundryDoc)=>{for(const link of links){(!foundryDoc||foundryDoc.isOwner)&&link.classList.add("with-repost");const repostButtons=htmlQueryAll(link,"i[data-pf2-repost]");if(repostButtons.length>0){if(foundryDoc&&!foundryDoc.isOwner){for(const button of repostButtons)button.remove();link.classList.remove("with-repost")}continue}if(foundryDoc&&!foundryDoc.isOwner)continue;const newButton=document.createElement("i"),icon=link.parentElement?.dataset?.pf2Checkgroup!==void 0?"fa-comment-alt-dots":"fa-comment-alt";newButton.classList.add("fa-solid",icon),newButton.dataset.pf2Repost="",newButton.title=game.i18n.localize("PF2E.Repost"),link.appendChild(newButton),newButton.addEventListener("click",event=>{event.stopPropagation();const target=event.target;if(!(target instanceof HTMLElement))return;const parent=target?.parentElement;if(!parent)return;const document2=resolveDocument(target,foundryDoc);InlineRollLinks.repostAction(parent,document2)})}},listen:(html,foundryDoc=null)=>{foundryDoc??=resolveDocument(html,foundryDoc);const links=htmlQueryAll(html,inlineSelector).filter(l=>["A","SPAN"].includes(l.nodeName));InlineRollLinks.injectRepostElement(links,foundryDoc),InlineRollLinks.flavorDamageRolls(html,foundryDoc instanceof ActorPF2e?foundryDoc:null);for(const link of links.filter(l=>l.dataset.pf2Action)){const{pf2Action,pf2Glyph,pf2Variant,pf2Dc,pf2ShowDc,pf2Skill}=link.dataset;link.addEventListener("click",event=>{const action2=game.pf2e.actions[pf2Action?sluggify(pf2Action,{camel:"dromedary"}):""],visibility=pf2ShowDc??"all";pf2Action&&action2?action2({event,glyph:pf2Glyph,variant:pf2Variant,difficultyClass:pf2Dc?{scope:"check",value:Number(pf2Dc)||0,visibility}:void 0,skill:pf2Skill}):console.warn(`PF2e System | Skip executing unknown action '${pf2Action}'`)})}for(const link of links.filter(l=>l.dataset.pf2Check&&!l.dataset.invalid)){const{pf2Check,pf2Dc,pf2Traits,pf2Label,pf2Defense,pf2Adjustment,pf2Roller,pf2RollOptions}=link.dataset;if(!pf2Check)return;link.addEventListener("click",async event=>{const parent=resolveActor(foundryDoc,link),actors=(()=>{switch(pf2Roller){case"self":return parent?.canUserModify(game.user,"update")?[parent]:[];case"party":return parent?.isOfType("party")?[parent]:compact([game.actors.party])}const actors2=getSelectedOrOwnActors(),isSave=tupleHasValue(SAVE_TYPES,pf2Check);return parent?.isOfType("party")||actors2.length===0&&parent&&!isSave?[parent]:actors2})();if(actors.length===0){ui.notifications.warn(game.i18n.localize("PF2E.UI.errorTargetToken"));return}const extraRollOptions=[...pf2Traits?.split(",").map(o=>o.trim())??[],...pf2RollOptions?.split(",").map(o=>o.trim())??[]],eventRollParams=eventToRollParams(event);switch(pf2Check){case"flat":{for(const actor of actors){const flatCheck=new Statistic(actor,{label:"",slug:"flat",modifiers:[],check:{type:"flat-check"}}),dc=Number.isInteger(Number(pf2Dc))?{label:pf2Label,value:Number(pf2Dc)}:null;flatCheck.roll({...eventRollParams,extraRollOptions,dc})}break}default:{const isSavingThrow=tupleHasValue(SAVE_TYPES,pf2Check),traits=isSavingThrow?[]:extraRollOptions.filter(t=>t in CONFIG.PF2E.actionTraits)??[];for(const actor of actors){const statistic=(()=>{if(pf2Check in CONFIG.PF2E.magicTraditions){const bestSpellcasting=actor.spellcasting.filter(c=>c.tradition===pf2Check).flatMap(s=>s.statistic??[]).sort((a,b)=>b.check.mod-a.check.mod).shift()??null;if(bestSpellcasting)return bestSpellcasting}return actor.getStatistic(pf2Check)})();if(!statistic){console.warn(ErrorPF2e(`Skip rolling unknown statistic ${pf2Check}`).message);continue}const targetActor=pf2Defense?game.user.targets.first()?.actor:null,dcValue=(()=>{const adjustment=Number(pf2Adjustment)||0;return pf2Dc==="@self.level"?calculateDC(actor.level)+adjustment:Number(pf2Dc??"NaN")+adjustment})(),dc=(()=>{if(Number.isInteger(dcValue))return{label:pf2Label,value:dcValue};if(pf2Defense){const defenseStat=targetActor?.getStatistic(pf2Defense);return defenseStat?{statistic:defenseStat.dc,scope:"check",value:defenseStat.dc.value}:null}return null})(),item=(()=>{const itemFromDoc=foundryDoc instanceof ItemPF2e?foundryDoc:foundryDoc instanceof ChatMessagePF2e?foundryDoc.item:null;return itemFromDoc?.isOfType("action","feat","campaignFeature")||isSavingThrow&&!itemFromDoc?.isOfType("weapon")?itemFromDoc:null})(),args={...eventRollParams,extraRollOptions,origin:isSavingThrow&&parent instanceof ActorPF2e?parent:null,dc,target:!isSavingThrow&&dc?.statistic?targetActor:null,item,traits};if(!!(item?.isOfType("action","feat")&&item.actionCost)&&pf2Defense){const subtitleLocKey=pf2Check in CONFIG.PF2E.magicTraditions?"PF2E.ActionsCheck.spell":statistic.check.type==="attack-roll"?"PF2E.ActionsCheck.x-attack-roll":"PF2E.ActionsCheck.x";args.label=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{glyph:getActionGlyph(item.actionCost),subtitle:game.i18n.format(subtitleLocKey,{type:statistic.label}),title:item.name})}statistic.roll(args)}}}})}const templateConversion={burst:"circle",cone:"cone",cube:"rect",emanation:"circle",line:"ray",rect:"rect",square:"rect"};for(const link of links.filter(l=>l.hasAttribute("data-pf2-effect-area"))){const{pf2EffectArea,pf2Distance,pf2TemplateData,pf2Traits,pf2Width}=link.dataset;link.addEventListener("click",()=>{if(typeof pf2EffectArea!="string"){console.warn("PF2e System | Could not create template'");return}const templateData=JSON.parse(pf2TemplateData??"{}");switch(templateData.distance||=Number(pf2Distance),templateData.fillColor||=game.user.color,templateData.t=templateConversion[pf2EffectArea],templateData.t){case"ray":templateData.width=Number(pf2Width)||CONFIG.MeasuredTemplate.defaults.width*(canvas.dimensions?.distance??1);break;case"cone":templateData.angle=CONFIG.MeasuredTemplate.defaults.angle;break;case"rect":{const distance=templateData.distance??0;templateData.distance=Math.hypot(distance,distance),templateData.width=distance,templateData.direction=45;break}}pf2Traits&&(templateData.flags={pf2e:{origin:{traits:pf2Traits.split(",")}}});const templateDoc=new MeasuredTemplateDocumentPF2e(templateData,{parent:canvas.scene});new MeasuredTemplatePF2e(templateDoc).drawPreview()})}},makeRepostHtml:(target,defaultVisibility)=>{const flavor=target.attributes.getNamedItem("data-pf2-repost-flavor")?.value??"";return`${flavor} ${target.outerHTML}`.trim()},repostAction:(target,foundryDoc=null)=>{if(!["pf2Action","pf2Check","pf2EffectArea"].some(d=>d in target.dataset))return;const actor=resolveActor(foundryDoc,target),defaultVisibility=(actor??foundryDoc)?.hasPlayerOwner?"all":"gm",content=(()=>target.parentElement?.dataset?.pf2Checkgroup!==void 0?`
${htmlQueryAll(target.parentElement,inlineSelector).map(target2=>InlineRollLinks.makeRepostHtml(target2,defaultVisibility)).join("
")}
`:InlineRollLinks.makeRepostHtml(target,defaultVisibility))(),speaker=actor?ChatMessagePF2e.getSpeaker({actor,token:actor.getActiveTokens(!1,!0).shift()}):ChatMessagePF2e.getSpeaker(),message=game.messages.get(htmlClosest(target,"[data-message-id]")?.dataset.messageId??""),flags=foundryDoc instanceof JournalEntry?{pf2e:{journalEntry:foundryDoc.uuid}}:message?.flags.pf2e.origin?{pf2e:{origin:deepClone(message.flags.pf2e.origin)}}:{};ChatMessagePF2e.create({speaker,content,flags})},flavorDamageRolls(html,actor=null){for(const rollLink of htmlQueryAll(html,"a.inline-roll[data-damage-roll]")){const itemId=htmlClosest(rollLink,"[data-item-id]")?.dataset.itemId,item=actor?.items.get(itemId??"");item&&(rollLink.dataset.flavor||=item.name)}}};function resolveDocument(html,foundryDoc){if(foundryDoc)return foundryDoc;const document2=(ui.windows[Number(html.closest(".app.sheet")?.dataset.appid)]??null)?.document;return document2 instanceof ActorPF2e||document2 instanceof JournalEntry?document2:null}__name(resolveDocument,"resolveDocument"),__name2(resolveDocument,"resolveDocument");function resolveActor(foundryDoc,anchor){if(foundryDoc instanceof ActorPF2e)return foundryDoc;if(foundryDoc instanceof ItemPF2e||foundryDoc instanceof ChatMessagePF2e)return foundryDoc.actor;const itemUuid=anchor.dataset.itemUuid,itemByUUID=itemUuid&&!itemUuid.startsWith("Compendium.")?fromUuidSync(itemUuid):null;return itemByUUID instanceof ItemPF2e?itemByUUID.actor:null}__name(resolveActor,"resolveActor"),__name2(resolveActor,"resolveActor");const _UserVisibilityPF2e=class{static{__name(this,"_UserVisibilityPF2e")}static process(html,options={}){const visibilityElements=htmlQueryAll(html,"[data-visibility]");for(const element of visibilityElements.filter(e=>e.dataset.visibility==="none"))element.remove();const{message}=options,document2=options.document??message?.actor??message?.journalEntry??message??null;if(document2){const ownerElements=visibilityElements.filter(e=>e.dataset.visibility==="owner");for(const element of ownerElements){if(element.dataset.action){document2.isOwner||element.remove(),delete element.dataset.visibility;continue}const whoseData=element.dataset.whose??"self";if(whoseData==="self"){element.dataset.visibility=document2.hasPlayerOwner?"all":"gm";continue}message?.target&&whoseData==="target"&&(element.dataset.visibility=message.target.actor.hasPlayerOwner?"all":"gm")}}const hasOwnership=document2?.isOwner??game.user.isGM,dcSetting=game.settings.get("pf2e","metagame_showDC"),saveButtons=htmlQueryAll(html,"button[data-action=save]");if(!document2?.hasPlayerOwner&&!hasOwnership&&!dcSetting)for(const button of saveButtons){const saveType=button.dataset.save;if(objectHasKey(CONFIG.PF2E.saves,saveType)){const saveName=game.i18n.localize(CONFIG.PF2E.saves[saveType]);button.innerText=game.i18n.format("PF2E.SavingThrowWithName",{saveName})}}else if(!document2?.hasPlayerOwner&&!dcSetting)for(const button of saveButtons)button.classList.add("hidden-to-others");for(const element of htmlQueryAll(html,"[data-owner-title]"))if(hasOwnership){const value=element.dataset.ownerTitle??"";element.title=value}else element.removeAttribute("data-owner-title");if(!game.user.isGM)for(const element of visibilityElements.filter(e=>e.dataset.visibility==="gm"))element.remove()}static processMessageSender(message,html){if(!game.settings.get("pf2e","metagame_tokenSetsNameVisibility"))return;const token=message.token??(message.actor?new TokenDocumentPF2e(message.actor.prototypeToken.toObject()):null);if(token){const sender=html.querySelector("h4.message-sender"),nameToHide=token.name.trim(),shouldHideName=!token.playersCanSeeName&&sender?.innerText.trim()===nameToHide;sender&&shouldHideName&&(game.user.isGM?sender.dataset.visibility="gm":sender.innerText=message.user?.name??"Gamemaster")}}};__name2(_UserVisibilityPF2e,"UserVisibilityPF2e");let UserVisibilityPF2e=_UserVisibilityPF2e;const USER_VISIBILITIES=new Set(["all","owner","gm","none"]),_ItemSummaryRenderer=class{static{__name(this,"_ItemSummaryRenderer")}constructor(sheet){this.sheet=sheet}activateListeners(html){const selectors=[".item .item-name h4",".item .melee-name h4",".item .action-name h4","a[data-action=toggle-summary]"].join(",");for(const link of htmlQueryAll(html,selectors))link.addEventListener("click",async()=>{const element=htmlClosest(link,"[data-item-id], .expandable");element&&await this.toggleSummary(element)})}async toggleSummary(element,options={}){const actor=this.sheet.actor,{itemId,itemType,actionIndex}=element.dataset,isFormula=!!element.dataset.isFormula,duration=.4;if(itemType==="spellSlot")return;const item=isFormula?await fromUuid(itemId??""):itemType==="condition"?actor.conditions.get(itemId,{strict:!0}):actionIndex?actor.system.actions?.[Number(actionIndex)].item??null:actor.items.get(itemId??"")??null,summary=await(async()=>{const existing=htmlQuery(element,":scope > .item-summary");if(existing?.hasChildNodes()||options.visible)return existing;if(item instanceof ItemPF2e&&!item.isOfType("spellcastingEntry")){const insertLocation=htmlQueryAll(element,":scope > .item-name, :scope > .item-controls, :scope > .action-header").at(-1)?.parentNode?.lastChild;if(!insertLocation&&!existing)return null;const summary2=existing??createHTMLElement("div",{classes:["item-summary"]});summary2.hidden=!0,insertLocation?.after(summary2);const chatData=await item.getChatData({secrets:actor.isOwner},element.dataset);return await this.renderItemSummary(summary2,item,chatData),InlineRollLinks.listen(summary2,item),summary2}return null})();if(!summary)return;const showSummary=typeof options.visible=="boolean"?options.visible:!element.classList.contains("expanded")||summary.hidden;options.instant?(summary.hidden=!showSummary,element.classList.toggle("expanded",showSummary)):showSummary?(element.classList.add("expanded"),await gsap.fromTo(summary,{height:0,opacity:0,hidden:!1},{height:"auto",opacity:1,duration})):await gsap.to(summary,{height:0,duration,opacity:0,paddingTop:0,paddingBottom:0,margin:0,clearProps:"all",onComplete:()=>{summary.hidden=!0,element.classList.remove("expanded")}})}async renderItemSummary(div,item,chatData){const description=isItemSystemData(chatData)?chatData.description.value:await TextEditor.enrichHTML(item.description,{rollData:item.getRollData(),async:!0}),rarity=item.system.traits?.rarity,isEffect=item instanceof AbstractEffectPF2e,selfEffect=item.isOfType("action","feat")&&item.system.selfEffect?await TextEditor.enrichHTML(`@UUID[${item.system.selfEffect.uuid}]{${item.system.selfEffect.name}}`,{async:!0}):null,summary=await renderTemplate("systems/pf2e/templates/actors/partials/item-summary.hbs",{item,description,identified:game.user.isGM||!(item.isOfType("physical")||isEffect)||item.isIdentified,rarityLabel:rarity&&item.isOfType("physical")?CONFIG.PF2E.rarityTraits[rarity]:null,isCreature:item.actor?.isOfType("creature"),chatData,selfEffect});if(div.innerHTML=summary,UserVisibilityPF2e.process(div,{document:item}),item.actor?.isOfType("creature"))for(const button of htmlQueryAll(div,"button"))button.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation();const spell=item.isOfType("spell")?item:item.isOfType("consumable")?item.embeddedSpell:null;switch(button.dataset.action){case"spellAttack":spell?.rollAttack(event);break;case"spellDamage":spell?.rollDamage(event);break;case"consume":item.isOfType("consumable")&&item.consume();break}})}async saveAndRestoreState(callback){const element=this.sheet.element[0],expandedSummaryElements=htmlQueryAll(element,".item.expanded[data-item-summary-id]"),expandedItemElements=htmlQueryAll(element,".item.expanded[data-item-id]:not([data-item-summary-id])"),expandedActionElements=htmlQueryAll(element,".item.expanded[data-action-index]"),openActionIdxs=new Set(expandedActionElements.map(el=>el.dataset.actionIndex)),openItemsIds=expandedItemElements.map(el=>el.dataset.itemId),openSummaryIds=expandedSummaryElements.map(el=>el.dataset.itemSummaryId),$result=await callback.apply(null),result=$result[0];InlineRollLinks.listen(result,this.sheet.actor);for(const itemId of openItemsIds){const item=htmlQuery(result,`.item[data-item-id="${itemId}"]:not([data-item-summary-id])`);item&&await this.toggleSummary(item,{instant:!0})}for(const summaryId of openSummaryIds){const item=htmlQuery(result,`.item[data-item-summary-id="${summaryId}"]`);item&&await this.toggleSummary(item,{instant:!0})}for(const elementIdx of openActionIdxs)$result.find(`.item[data-action-index=${elementIdx}]`).toggleClass("expanded");return $result}};__name2(_ItemSummaryRenderer,"ItemSummaryRenderer");let ItemSummaryRenderer=_ItemSummaryRenderer;const _MoveLootPopup=class extends FormApplication{static{__name(this,"_MoveLootPopup")}onSubmitCallback;constructor(object,options,callback){super(object,options),this.onSubmitCallback=callback}async getData(){const[prompt,buttonLabel]=this.options.isPurchase?["PF2E.loot.PurchaseLootMessage","PF2E.loot.PurchaseLoot"]:["PF2E.loot.MoveLootMessage","PF2E.loot.MoveLoot"];return{...await super.getData(),quantity:{default:this.options.quantity.default,max:this.options.quantity.max},newStack:this.options.newStack,lockStack:this.options.lockStack,prompt,buttonLabel}}static get defaultOptions(){return{...super.defaultOptions,id:"MoveLootPopup",classes:[],title:game.i18n.localize("PF2E.loot.MoveLootPopupTitle"),template:"systems/pf2e/templates/popups/loot/move-loot-popup.hbs",width:"auto",quantity:{default:1,max:1},newStack:!1,lockStack:!1,isPurchase:!1}}async _updateObject(_event,formData){this.onSubmitCallback(formData.quantity,formData.newStack)}};__name2(_MoveLootPopup,"MoveLootPopup");let MoveLootPopup=_MoveLootPopup;const _AddCoinsPopup=class extends FormApplication{static{__name(this,"_AddCoinsPopup")}static get defaultOptions(){return{...super.defaultOptions,id:"add-coins",title:"PF2E.AddCoinsTitle",template:"systems/pf2e/templates/actors/add-coins.hbs"}}async _updateObject(_event,formData){const combineStacks=!!formData.combineStacks,coins={pp:Number(formData.pp)||0,gp:Number(formData.gp)||0,sp:Number(formData.sp)||0,cp:Number(formData.cp)||0};return this.object.inventory.addCoins(coins,{combineStacks})}};__name2(_AddCoinsPopup,"AddCoinsPopup");let AddCoinsPopup=_AddCoinsPopup;const itemTypeOptions=Object.fromEntries(new Map([["scroll","PF2E.CastingItemCreateDialog.scroll"],["wand","PF2E.CastingItemCreateDialog.wand"],["cantripDeck5","PF2E.CastingItemCreateDialog.cantripDeck5"]])),_CastingItemCreateDialog=class extends FormApplication{static{__name(this,"_CastingItemCreateDialog")}onSubmitCallback;spell;formDataCache;constructor(object,options,callback,spell){super(object,options),this.spell=spell,this.formDataCache={itemType:this.spell.isCantrip?"cantripDeck5":"scroll",level:spell.baseRank},this.onSubmitCallback=callback}static get defaultOptions(){const options=super.defaultOptions;return options.classes=[],options.title=game.i18n.localize("PF2E.CastingItemCreateDialog.title"),options.template="systems/pf2e/templates/popups/casting-item-create-dialog.hbs",options.width="auto",options.submitOnChange=!0,options.closeOnSubmit=!1,options}async getData(){if(!this.spell)throw ErrorPF2e("CastingItemCreateDialog | Could not read spelldata");const{cantripDeck5,...nonCantripOptions}=itemTypeOptions,minimumRank=this.spell.baseRank,ranks=Array.from(Array(11-minimumRank).keys()).map(index=>minimumRank+index);return{...await super.getData(),validLevels:ranks,itemTypeOptions:this.spell.isCantrip?{cantripDeck5}:nonCantripOptions,itemType:this.formDataCache.itemType,level:this.formDataCache.level}}async _updateObject(event,formData){if(Object.assign(this.formDataCache,formData),event.type!=="submit"){await this.render();return}this.formDataCache.itemType==="wand"&&this.formDataCache.level===10?ui.notifications.warn(game.i18n.localize("PF2E.CastingItemCreateDialog.10thLevelWand")):this.onSubmitCallback&&this.spell&&this.onSubmitCallback(this.formDataCache.level,this.formDataCache.itemType,this.spell),this.close()}};__name2(_CastingItemCreateDialog,"CastingItemCreateDialog");let CastingItemCreateDialog=_CastingItemCreateDialog;function getMagicTraditions(item){const traits=item.system.traits.value;return new Set(traits.filter(t=>setHasElement(MAGIC_TRADITIONS,t)))}__name(getMagicTraditions,"getMagicTraditions"),__name2(getMagicTraditions,"getMagicTraditions");function getDcRarity(item){return item.traits.has("cursed")?"unique":item.rarity}__name(getDcRarity,"getDcRarity"),__name2(getDcRarity,"getDcRarity");function getIdentifyMagicDCs(item,baseDC,notMatchingTraditionModifier){const result={occult:baseDC,primal:baseDC,divine:baseDC,arcane:baseDC},traditions=getMagicTraditions(item);for(const key of MAGIC_TRADITIONS)traditions.size>0&&!traditions.has(key)&&(result[key]=baseDC+notMatchingTraditionModifier);return{arcana:result.arcane,nature:result.primal,religion:result.divine,occultism:result.occult}}__name(getIdentifyMagicDCs,"getIdentifyMagicDCs"),__name2(getIdentifyMagicDCs,"getIdentifyMagicDCs");function getItemIdentificationDCs(item,{proficiencyWithoutLevel=!1,notMatchingTraditionModifier}){const baseDC=calculateDC(item.level,{proficiencyWithoutLevel}),rarity=getDcRarity(item),dc=adjustDCByRarity(baseDC,rarity);return item.isMagical?getIdentifyMagicDCs(item,dc,notMatchingTraditionModifier):item.isAlchemical?{crafting:dc}:{dc}}__name(getItemIdentificationDCs,"getItemIdentificationDCs"),__name2(getItemIdentificationDCs,"getItemIdentificationDCs");function getUnidentifiedPlaceholderImage(item){return`systems/pf2e/icons/unidentified_item_icons/${(()=>{if(item.isOfType("weapon")){const{traits}=item;return traits.has("bomb")?"alchemical_bomb":traits.has("staff")?"staves":traits.has("artifact")?"artifact":"weapon"}else{if(item.isOfType("armor"))return item.category==="shield"?"shields":"armor";if(item.isOfType("consumable"))switch(item.category){case"ammo":return"ammunition";case"oil":return"oils";case"scroll":return"infernal-contracts";case"talisman":return"talisman";case"elixir":case"mutagen":return"alchemical_elixir";case"poison":return"alchemical_poison";case"tool":return"alchemical_tool";case"wand":return"wands";case"potion":return"potions";case"snare":case"other":default:return item.traits.has("drug")?"drugs":"other-consumables"}else if(item.isOfType("equipment")&&item.traits.has("precious"))return"material-chunk"}return"adventuring_gear"})()}.webp`}__name(getUnidentifiedPlaceholderImage,"getUnidentifiedPlaceholderImage"),__name2(getUnidentifiedPlaceholderImage,"getUnidentifiedPlaceholderImage");const _IdentifyItemPopup=class extends FormApplication{static{__name(this,"_IdentifyItemPopup")}static get defaultOptions(){return{...super.defaultOptions,id:"identify-item",title:game.i18n.localize("PF2E.identification.Identify"),template:"systems/pf2e/templates/actors/identify-item.hbs",width:"auto",classes:["identify-popup"]}}get item(){return this.object}async getData(){const item=this.object,notMatchingTraditionModifier=game.settings.get("pf2e","identifyMagicNotMatchingTraditionModifier"),proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),dcs=getItemIdentificationDCs(item,{proficiencyWithoutLevel,notMatchingTraditionModifier});return{...await super.getData(),isMagic:item.isMagical,isAlchemical:item.isAlchemical,dcs}}activateListeners($form){$form.find("button.update-identification").on("click",event=>{const $button=$(event.delegateTarget);this.submit({updateData:{status:$button.val()}})}),$form.find("button.post-skill-checks").on("click",async()=>{const item=this.item,itemImg=item.system.identification.unidentified.img,itemName=item.system.identification.unidentified.name,identifiedName=item.system.identification.identified.name,skills=$("div#identify-item").find("tr").toArray().flatMap(row=>{const slug=row.dataset.skill,dc=Number(row.dataset.dc);if(!(Number.isInteger(dc)&&objectHasKey(CONFIG.PF2E.skillList,slug)))return[];const name2=game.i18n.localize(CONFIG.PF2E.skillList[slug]);return{slug,name:name2,dc}}),actionOption=item.isMagical?"action:identify-magic":item.isAlchemical?"action:identify-alchemy":null,content=await renderTemplate("systems/pf2e/templates/actors/identify-item-chat-skill-checks.hbs",{itemImg,itemName,identifiedName,rollOptions:compact(["concentrate","exploration","secret",actionOption]),skills});await ChatMessagePF2e.create({user:game.user.id,content})})}async _updateObject(_event,formData){const status=formData.status;status==="identified"&&await this.item.setIdentificationStatus(status)}};__name2(_IdentifyItemPopup,"IdentifyItemPopup");let IdentifyItemPopup=_IdentifyItemPopup;const _IWREditor=class extends DocumentSheet{static{__name(this,"_IWREditor")}constructor(actor,options){if(super(actor,options),__privateAdd(this,_updateIWR),__publicField(this,"category"),__publicField(this,"types"),this.actor.isOfType("familiar","loot"))throw ErrorPF2e(`Actor ${this.actor.name} (${this.actor.uuid}) may not have stored IWR data`);this.category=options.category,this.types={immunities:omit(CONFIG.PF2E.immunityTypes,["custom"]),weaknesses:omit(CONFIG.PF2E.weaknessTypes,["custom"]),resistances:omit(CONFIG.PF2E.resistanceTypes,["custom"])}[this.category]}static get defaultOptions(){return{...super.defaultOptions,closeOnSubmit:!1,classes:["iwr-editor"],template:"systems/pf2e/templates/actors/iwr-editor.hbs",sheetConfig:!1,width:500,height:"auto"}}get id(){return`${this.category}-editor-${this.actor.uuid}`}get title(){return game.i18n.format("PF2E.Actor.IWREditor.Title",{actor:this.actor.name,category:game.i18n.localize(this.categoryLabel)})}get actor(){return this.document}get categoryLabel(){return{immunities:"PF2E.ImmunitiesLabel",weaknesses:"PF2E.WeaknessesLabel",resistances:"PF2E.ResistancesLabel"}[this.category]}async getData(options={}){return this.options.id=this.id,{...await super.getData(options),category:this.category,header:this.categoryLabel,list:this.actor.attributes[this.category],sourceData:this.actor._source.system.attributes?.[this.category]??[],types:this.types}}getUpdatedData({includeNew=!1}={}){const entryElems=htmlQueryAll(this.element[0],".entry:not(.new,[data-synthetic])");return includeNew&&entryElems.push(...htmlQueryAll(this.element[0],".entry.new")),entryElems.flatMap(entryElem=>{const iwrType=htmlQuery(entryElem,"select")?.value;if(!iwrType)return[];const value=Math.trunc(Math.abs(Number(htmlQuery(entryElem,"input[data-property=value]")?.value??"NaN")))||5,exceptionsData=JSON.parse(htmlQuery(entryElem,"input[data-property=exceptions]")?.value||"[]");if(!(Array.isArray(exceptionsData)&&exceptionsData.every(o=>isObject(o))))throw ErrorPF2e("Unexpected data encountered while submitting form");const exceptions=exceptionsData.map(e=>e.id),doubleVsData=JSON.parse(htmlQuery(entryElem,"input[data-property=doubleVs]")?.value||"[]"),doubleVs=Array.isArray(doubleVsData)&&doubleVsData.every(o=>isObject(o)&&typeof o.id=="string"&&o.id in this.types)&&this.category==="resistances"?doubleVsData.map(d=>d.id):void 0;return exceptions.every(e=>typeof e=="string")?{type:iwrType,value:this.category==="immunities"?void 0:value||1,exceptions,doubleVs}:[]})}_getHeaderButtons(){return super._getHeaderButtons().filter(b=>b.class==="close")}activateListeners($html){const html=$html[0];for(const input of htmlQueryAll(html,"input[type=text]"))tagify$1(input,{whitelist:this.types,maxTags:4});htmlQuery(html,"a[data-action=add]")?.addEventListener("click",event=>{const entryElem=htmlClosest(event.target,".entry.new");htmlQuery(entryElem,"select[data-property=type]")?.value&&__privateMethod(this,_updateIWR,updateIWR_fn).call(this,{includeNew:!0})});for(const inputOrSelect of htmlQueryAll(html,"select, input")){const entryElem=htmlClosest(inputOrSelect,".entry");entryElem&&!entryElem.classList.contains("new")&&inputOrSelect.addEventListener("change",()=>{__privateMethod(this,_updateIWR,updateIWR_fn).call(this)})}for(const removeButton of htmlQueryAll(html,"a[data-action=remove]"))removeButton.addEventListener("click",async event=>{htmlClosest(event.target,".entry")?.remove(),__privateMethod(this,_updateIWR,updateIWR_fn).call(this)})}};_updateIWR=new WeakSet,updateIWR_fn=__name2(async function({includeNew=!1}={}){const data=this.getUpdatedData({includeNew}),formInput=htmlQuery(this.element[0],"input[name]");if(!formInput)throw ErrorPF2e("Unexpected error getting for input element");formInput.value=JSON.stringify(data),await this.submit({preventRender:!1})},"#updateIWR"),__name2(_IWREditor,"IWREditor");let IWREditor=_IWREditor;const _RemoveCoinsPopup=class extends FormApplication{static{__name(this,"_RemoveCoinsPopup")}static get defaultOptions(){return{...super.defaultOptions,id:"remove-coins",title:"PF2E.RemoveCoinsTitle",template:"systems/pf2e/templates/actors/remove-coins.hbs"}}async _updateObject(_event,formData){const actor=this.object,coinsToRemove={pp:Number(formData.pp)||0,gp:Number(formData.gp)||0,sp:Number(formData.sp)||0,cp:Number(formData.cp)||0};await actor.inventory.removeCoins(coinsToRemove,{byValue:!!formData.removeByValue})||ui.notifications.warn("PF2E.ErrorMessage.NotEnoughCoins",{localize:!0})}};__name2(_RemoveCoinsPopup,"RemoveCoinsPopup");let RemoveCoinsPopup=_RemoveCoinsPopup;const _ActorSheetPF2e=class _ActorSheetPF2e2 extends ActorSheet{static{__name(this,"_ActorSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_activateInventoryDragDrop),__privateAdd(this,_sortableOnMove),__privateAdd(this,_sortableOnEnd),__privateAdd(this,_onClickDeleteItem),__privateAdd(this,_onClickBrowseEquipment),__privateAdd(this,_onClickCreateItem),__privateAdd(this,_onClickSellAllTreasure),__publicField(this,"itemRenderer",new ItemSummaryRenderer(this)),__privateAdd(this,_sortableOnMoveData,{})}static get defaultOptions(){const options=super.defaultOptions;return options.dragDrop=[{dragSelector:"[data-foundry-list] .drag-handle"},{dragSelector:".item[draggable=true]"},{dragSelector:".item-list .item:not(.inventory-list *)"}],mergeObject(options,{classes:["default","sheet","actor"],scrollY:[".sheet-sidebar",".tab.active",".inventory-list"]})}get isLootSheet(){return!1}async getData(options=this.options){options.id||=this.id,options.editable=this.isEditable,options.sheetConfig&&=Object.values(CONFIG.Actor.sheetClasses[this.actor.type]).filter(c=>c.canConfigure).length>1;for(const item of[...this.actor.itemTypes.action,...this.actor.itemTypes.feat])item.system.selfEffect&&(item.system.selfEffect.img??=fromUuidSync(item.system.selfEffect.uuid)?.img??null);const actorData=this.actor.toObject(!1),iwrKeys=["immunities","weaknesses","resistances"],attributes=actorData.system.attributes;for(const key of iwrKeys)attributes[key]=[...attributes[key]].sort((a,b)=>a.label.localeCompare(b.label));const coins=this.actor.inventory.coins,totalCoinage=_ActorSheetPF2e2.coinsToSheetData(coins),totalCoinageGold=(coins.copperValue/100).toFixed(2),totalWealth=this.actor.inventory.totalWealth,totalWealthGold=(totalWealth.copperValue/100).toFixed(2),traitsMap=(()=>{switch(this.actor.type){case"hazard":return CONFIG.PF2E.hazardTraits;case"vehicle":return CONFIG.PF2E.vehicleTraits;default:return CONFIG.PF2E.creatureTraits}})(),sheetData={cssClass:this.actor.isOwner?"editable":"locked",editable:this.isEditable,document:this.actor,limited:this.actor.limited,options,owner:this.actor.isOwner,title:this.title,actor:actorData,data:actorData.system,effects:[],items:actorData.items,user:{isGM:game.user.isGM},traits:createSheetTags(traitsMap,{value:Array.from(this.actor.traits)}),toggles:this.actor.synthetics.toggles,isTargetFlatFooted:!!this.actor.rollOptions.all["target:condition:off-guard"],totalCoinage,totalCoinageGold,totalWealth,totalWealthGold,inventory:this.prepareInventory(),enrichedContent:{}};return await this.prepareItems?.(sheetData),sheetData}prepareInventory(){const sections={weapon:{label:game.i18n.localize("PF2E.InventoryWeaponsHeader"),type:"weapon",items:[]},armor:{label:game.i18n.localize("PF2E.InventoryArmorHeader"),type:"armor",items:[]},equipment:{label:game.i18n.localize("PF2E.InventoryEquipmentHeader"),type:"equipment",items:[]},consumable:{label:game.i18n.localize("PF2E.InventoryConsumablesHeader"),type:"consumable",items:[]},treasure:{label:game.i18n.localize("PF2E.InventoryTreasureHeader"),type:"treasure",items:[]},backpack:{label:game.i18n.localize("PF2E.InventoryBackpackHeader"),type:"backpack",items:[]}};for(const item of this.actor.inventory.contents.sort((a,b)=>(a.sort||0)-(b.sort||0))){if(!objectHasKey(sections,item.type)||item.isInContainer)continue;(item.isOfType("book")?sections.equipment:sections[item.type]).items.push(this.prepareInventoryItem(item))}return{sections,bulk:this.actor.inventory.bulk,showValueAlways:this.actor.isOfType("npc","loot","party"),showIndividualPricing:this.actor.isOfType("loot"),hasStowingContainers:this.actor.itemTypes.backpack.some(c=>c.system.stowing&&!c.isInContainer),invested:this.actor.inventory.invested}}prepareInventoryItem(item){const editable=game.user.isGM||item.isIdentified,heldItems=item.isOfType("backpack")?item.contents.map(i=>this.prepareInventoryItem(i)):void 0;heldItems?.sort((a,b)=>(a.item.sort||0)-(b.item.sort||0));const actorSize=new ActorSizePF2e({value:this.actor.size}),itemSize=new ActorSizePF2e({value:item.size}),sizeDifference=itemSize.difference(actorSize,{smallIsMedium:!0}),canBeEquipped=!item.isInContainer;return{item,itemSize:sizeDifference!==0?itemSize:null,editable,isContainer:item.isOfType("backpack"),canBeEquipped,isInvestable:!1,isSellable:editable&&item.isOfType("treasure")&&!item.isCoinage,hasCharges:item.isOfType("consumable")&&item.uses.max>0,heldItems}}static coinsToSheetData(coins){return DENOMINATIONS.reduce((accumulated,d)=>({...accumulated,[d]:{value:coins[d],label:CONFIG.PF2E.currencies[d]}}),{})}getStrikeFromDOM(button){const actionIndex=Number(htmlClosest(button,"[data-action-index]")?.dataset.actionIndex??"NaN"),rootAction=this.actor.system.actions?.at(actionIndex)??null,altUsage=tupleHasValue(["thrown","melee"],button?.dataset.altUsage)?button?.dataset.altUsage:null;return altUsage?rootAction?.altUsages?.find(s=>altUsage==="thrown"?s.item.isThrown:s.item.isMelee)??null:rootAction}activateListeners($html){super.activateListeners($html);const html=$html[0];this.itemRenderer.activateListeners(html),htmlQuery(html,"a[data-action=show-image]")?.addEventListener("click",()=>{const actor=this.actor,title=actor.token?.name??actor.prototypeToken?.name??actor.name;new ImagePopout(actor.img,{title,uuid:actor.uuid}).render(!0)});const inventoryPanel=(()=>{const selector=this.actor.isOfType("loot")?".sheet-body":".tab[data-tab=inventory]";return htmlQuery(html,selector)})();this.activateInventoryListeners(inventoryPanel);for(const element of htmlQueryAll(html,".item[data-item-id] .item-image, .item[data-item-id] .item-chat"))element.addEventListener("click",async event=>{const itemId=htmlClosest(element,"[data-item-id]")?.dataset.itemId??"",[item,fromFormula]=(()=>{if(UUIDUtils.isItemUUID(itemId)){if("knownFormulas"in this&&isObject(this.knownFormulas)){const formula=this.knownFormulas[itemId];if(formula)return[new ItemProxyPF2e(formula.item.toObject(),{parent:this.actor}),!0]}throw ErrorPF2e(`Invalid UUID [${itemId}]!`)}return[this.actor.items.get(itemId,{strict:!0}),!1]})();(!item.isOfType("physical")||item.isIdentified)&&await item.toMessage(event,{create:!0,data:{fromFormula}})});if(!this.options.editable)return;const manualPropertyInputs=htmlQueryAll(html,"select[data-property],input[data-property]");for(const input of manualPropertyInputs)input.addEventListener("focus",()=>{const propertyPath=input.dataset.property??"";if(input.name=propertyPath,input instanceof HTMLInputElement){const baseValue=Math.trunc(Number(getProperty(this.actor._source,propertyPath))||0);input.value=baseValue.toString(),input.type==="text"&&input.dataset.dtype==="Number"&&(input.type="number")}}),input.addEventListener("blur",()=>{input.removeAttribute("name");const propertyPath=input.dataset.property??"",preparedValue=Number(getProperty(this.actor,propertyPath))||0,baseValue=Math.trunc(Number(getProperty(this.actor._source,propertyPath))||0),newValue=Math.trunc(Number(input.value));input instanceof HTMLInputElement&&(input.type==="number"&&input.dataset.dtype==="Number"&&(input.type="text"),baseValue===newValue&&(input.value=input.classList.contains("modifier")?signedInteger(preparedValue):String(preparedValue)))});for(const link of htmlQueryAll(html,".item-delete"))link.addEventListener("click",event=>__privateMethod(this,_onClickDeleteItem,onClickDeleteItem_fn).call(this,event));for(const link of htmlQueryAll(html,".inventory-browse"))link.addEventListener("click",()=>__privateMethod(this,_onClickBrowseEquipment,onClickBrowseEquipment_fn).call(this,link));for(const link of htmlQueryAll(html,".save-name"))link.addEventListener("click",event=>{const saveType=htmlClosest(link,"[data-save]")?.dataset.save;if(!tupleHasValue(SAVE_TYPES,saveType))throw ErrorPF2e(`"${saveType}" is not a recognized save type`);this.actor.saves?.[saveType]?.check.roll(eventToRollParams(event))});const rollInitElem=htmlQuery(html,".roll-init");rollInitElem?.addEventListener("click",event=>{!rollInitElem.classList.contains("disabled")&&this.actor.initiative&&this.actor.initiative.roll(eventToRollParams(event))}),htmlQuery(html,".actions-options")?.addEventListener("change",event=>{const toggleRow=htmlClosest(event.target,"[data-item-id][data-domain][data-option]"),checkbox=htmlQuery(toggleRow,"input[data-action=toggle-roll-option]"),suboptionsSelect=htmlQuery(toggleRow,"select[data-action=set-suboption"),{domain,option,itemId}=toggleRow?.dataset??{},suboption=suboptionsSelect?.value??null;checkbox&&domain&&option&&this.actor.toggleRollOption(domain,option,itemId??null,checkbox.checked,suboption)});for(const listName of["immunities","weaknesses","resistances"])htmlQuery(html,`a[data-action=edit-${listName}]`)?.addEventListener("click",()=>{new IWREditor(this.actor,{category:listName}).render(!0)});for(const strikeElem of htmlQueryAll(html,"ol.strikes-list > li[data-strike]")){const attackSelectors=".item-image[data-action=strike-attack], button[data-action=strike-attack]";for(const button of htmlQueryAll(strikeElem,attackSelectors))button.addEventListener("click",async event=>{if(!Array.isArray(this.actor.system.actions))throw ErrorPF2e("Strikes are not supported on this actor");const altUsage=tupleHasValue(["thrown","melee"],button.dataset.altUsage)?button.dataset.altUsage:null,strike=this.getStrikeFromDOM(button),variantIndex=Number(button.dataset.variantIndex);await strike?.variants[variantIndex]?.roll({event,altUsage})});const damageSelectors="button[data-action=strike-damage], button[data-action=strike-critical]";for(const button of htmlQueryAll(strikeElem,damageSelectors)){const strike=this.getStrikeFromDOM(button),method=button.dataset.action==="strike-damage"?"damage":"critical";button.addEventListener("click",async event=>{await strike?.[method]?.({event})});const altUsage=tupleHasValue(["thrown","melee"],button.dataset.altUsage)?button.dataset.altUsage:null;strike?.[method]?.({getFormula:!0,altUsage}).then(formula=>{formula&&(button.title=formula.toString(),$(button).tooltipster({position:"top",theme:"crb-hover"}))})}}for(const button of htmlQueryAll(html,"button[data-action=use-action]"))button.addEventListener("click",()=>{const itemId=htmlClosest(button,"[data-item-id]")?.dataset.itemId,item=this.actor.items.get(itemId,{strict:!0});item.isOfType("action","feat")&&createSelfEffectMessage(item)});for(const anchor of htmlQueryAll(html,".item-unprepare"))anchor.addEventListener("click",()=>{const row=htmlClosest(anchor,".item"),slotLevel=Number(row?.dataset.slotLevel)||0,slotId=Number(row?.dataset.slotId)||0,entryId=row?.dataset.entryId??"";this.actor.spellcasting.collections.get(entryId)?.unprepareSpell(slotLevel,slotId)});for(const anchor of htmlQueryAll(html,".item-toggle-prepare"))anchor.addEventListener("click",()=>{const row=htmlClosest(anchor,".item"),slotLevel=Number(row?.dataset.slotLevel)||0,slotId=Number(row?.dataset.slotId)||0,entryId=row?.dataset.entryId??"",expendedState=row?.dataset.expendedState!=="true";this.actor.spellcasting.collections.get(entryId)?.setSlotExpendedState(slotLevel,slotId,expendedState)});for(const link of htmlQueryAll(html,".tag-selector"))link.addEventListener("click",()=>this.openTagSelector(link));for(const link of htmlQueryAll(html,".item-create, .item-control.spell-create"))link.addEventListener("click",()=>__privateMethod(this,_onClickCreateItem,onClickCreateItem_fn).call(this,link));for(const anchor of htmlQueryAll(html,".item-edit"))anchor.addEventListener("click",()=>{const itemId=htmlClosest(anchor,"[data-item-id]")?.dataset.itemId;this.actor.items.get(itemId??"")?.sheet.render(!0,{focus:!0})});for(const effectDecrement of htmlQueryAll(html,".effects-list .decrement"))effectDecrement.addEventListener("click",event=>{const parent=htmlClosest(event.currentTarget,".item"),effect=this.actor.items.get(parent?.dataset.itemId??"");effect instanceof AbstractEffectPF2e&&effect.decrease()});for(const effectIncrement of htmlQueryAll(html,".effects-list .increment"))effectIncrement.addEventListener("click",event=>{const parent=htmlClosest(event.currentTarget,".item"),effect=this.actor?.items.get(parent?.dataset.itemId??"");effect instanceof AbstractEffectPF2e&&effect.increase()});for(const element of htmlQueryAll(html,".effects-list [data-action=effect-toggle-unidentified]")??[])element.addEventListener("click",async event=>{const effectId=htmlClosest(event.currentTarget,"[data-item-id]")?.dataset.itemId,effect=this.actor.items.get(effectId,{strict:!0});if(effect.isOfType("effect")){const isUnidentified=effect.system.unidentified;await effect.update({"system.unidentified":!isUnidentified})}});for(const inputElem of htmlQueryAll(html,"input[type=text], input[type=number]"))inputElem.addEventListener("focus",()=>{inputElem.select()});for(const deltaInput of htmlQueryAll(html,"input[data-allow-delta]"))deltaInput.addEventListener("input",()=>{const match=/[+-]?\d*/.exec(deltaInput.value)?.at(0);deltaInput.value=match??deltaInput.value})}activateInventoryListeners(panel){if(this._canDragDrop(".item-list")&&__privateMethod(this,_activateInventoryDragDrop,activateInventoryDragDrop_fn).call(this,panel),!!this.isEditable){panel?.addEventListener("click",event=>{const link=htmlClosest(event.target,"a[data-action], button[data-action]");if(!link)return;const getItem=__name2(()=>{const itemId=htmlClosest(link,".item")?.dataset.itemId??"",item=this.actor.items.get(itemId);if(!item?.isOfType("physical"))throw ErrorPF2e("Item not found or isn't physical");return item},"getItem");switch(link.dataset.action){case"add-coins":{new AddCoinsPopup(this.actor).render(!0);return}case"remove-coins":{new RemoveCoinsPopup(this.actor).render(!0);return}case"increase-quantity":{const item=getItem(),addend=event.ctrlKey?10:event.shiftKey?5:1;item.update({"system.quantity":item.quantity+addend});return}case"decrease-quantity":{const item=getItem();if(item.quantity>0){const subtrahend=Math.min(item.quantity,event.ctrlKey?10:event.shiftKey?5:1);item.update({"system.quantity":item.quantity-subtrahend})}return}case"repair":{const item=getItem();game.pf2e.actions.repair({event,item});return}case"toggle-identified":{const item=getItem();item.isIdentified?item.setIdentificationStatus("unidentified"):new IdentifyItemPopup(item).render(!0);return}case"toggle-container":{const item=getItem();if(!item.isOfType("backpack"))return;const isCollapsed=item.system.collapsed??!1;item.update({"system.collapsed":!isCollapsed});return}case"sell-treasure":{const item=getItem(),sellItem=__name2(async()=>{item?.isOfType("treasure")&&!item.isCoinage&&(await item.delete(),await this.actor.inventory.addCoins(item.assetValue))},"sellItem");if(event.ctrlKey){sellItem();return}const content=document.createElement("p");content.innerText=game.i18n.format("PF2E.SellItemQuestion",{item:item.name}),new Dialog({title:game.i18n.localize("PF2E.SellItemConfirmHeader"),content:content.outerHTML,buttons:{Yes:{icon:fontAwesomeIcon("check").outerHTML,label:game.i18n.localize("Yes"),callback:sellItem},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:game.i18n.localize("Cancel")}},default:"Yes"}).render(!0);return}case"sell-all-treasure":__privateMethod(this,_onClickSellAllTreasure,onClickSellAllTreasure_fn).call(this)}});for(const anchor of htmlQueryAll(panel,".carry-type-hover"))$(anchor).tooltipster({animation:"fade",delay:200,animationDuration:10,trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["bottom"],theme:"crb-hover",minWidth:120})}}async deleteItem(element,item,event){(event?.ctrlKey||await Dialog.confirm({title:game.i18n.localize("PF2E.DeleteItemTitle"),content:`

${game.i18n.format("PF2E.DeleteQuestion",{name:`"${item.name}"`})}

`}))&&(await item.delete(),$(element).slideUp(200,()=>this.render(!1)))}_canDragStart(selector){return this.isLootSheet?!0:super._canDragStart(selector)}_canDragDrop(selector){return this.isLootSheet?!0:super._canDragDrop(selector)}_onDragStart(event){if(!(event.target instanceof HTMLElement)||!event.dataTransfer)return;const isContentLink=event.target.classList.contains("content-link"),isPersistent="persistent"in event.target.dataset;if(event.target!==event.currentTarget&&(isContentLink||isPersistent))return;const targetElement=event.currentTarget,previewElement=htmlClosest(targetElement,".item");if(previewElement&&targetElement&&targetElement!==previewElement){const{x,y}=previewElement.getBoundingClientRect();event.dataTransfer.setDragImage(previewElement,event.pageX-x,event.pageY-y)}const itemId=previewElement?.dataset.itemId,item=this.actor.items.get(itemId??""),baseDragData={actorId:this.actor.id,actorUUID:this.actor.uuid,sceneId:canvas.scene?.id??null,tokenId:this.actor.token?.id??null,...item?.toDragData()};previewElement?.dataset.isFormula&&(baseDragData.isFormula=!0,baseDragData.entrySelector=previewElement.dataset.entrySelector);const supplementalData=(()=>{const actionIndex=previewElement?.dataset.actionIndex;if(actionIndex)return"itemType"in baseDragData&&baseDragData.itemType==="melee"?{index:Number(actionIndex)}:{type:"Action",index:Number(actionIndex)};const elementTrait=previewElement?.dataset.element;if(elementTrait)return{type:"Action",elementTrait};const label=previewElement?.innerText.trim(),rollOptionData=previewElement?.dataset??{};return item&&label&&rollOptionData.domain&&rollOptionData.option?{type:"RollOption",label,...rollOptionData}:baseDragData.isFormula?{pf2e:{type:"CraftingFormula",itemUuid:itemId}}:null})();event.dataTransfer.setData("text/plain",JSON.stringify({...baseDragData,...supplementalData}))}async emulateItemDrop(data){const event=new DragEvent("drop",{altKey:game.keyboard.isModifierActive("Alt")});return this._onDropItem(event,data)}async _onDropItem(event,data){event.preventDefault();const item=await ItemPF2e.fromDropData(data);return item?item.actor?.uuid===this.actor.uuid?data.fromInventory?[]:this._onSortItem(event,item.toObject()):item.actor&&item.isOfType("physical")?(await this.moveItemBetweenActors(event,item.actor.id,item.actor?.token?.id??null,this.actor.id,this.actor.token?.id??null,item.id),[item]):this._handleDroppedItem(event,item,data):[]}async _handleDroppedItem(event,item,data){const{actor}=this,itemSource=item.toObject(),mystified=game.user.isGM&&event.altKey;mystified&&itemSource.type==="effect"&&(itemSource.system.unidentified=!0),mystified&&item.isOfType("physical")&&isPhysicalData(itemSource)&&(itemSource.system.identification.unidentified=item.getMystifiedData("unidentified"),itemSource.system.identification.status="unidentified");const containerAttribute=htmlClosest(event.target,".item-container")?.dataset.containerType,dropContainerType=this._tabs[0]?.active==="inventory"&&!containerAttribute?"actorInventory":containerAttribute,craftingTab=this._tabs[0]?.active==="crafting";if(item.isOfType("spell")&&itemSource.type==="spell")return item.isRitual?this._onDropItemCreate(item.clone().toObject()):dropContainerType==="actorInventory"&&itemSource.system.level.value>0?(new CastingItemCreateDialog(actor,{},async(heightenedLevel,itemType,spell)=>{const createdItem=await createConsumableFromSpell(spell,{type:itemType,heightenedLevel,mystified});await this._onDropItemCreate(createdItem)},item).render(!0),[item]):[];if(itemSource.type==="spellcastingEntry")return[];if(itemSource.type==="condition"){const value=data.value;return typeof value=="number"&&itemSource.system.value.isValued&&(itemSource.system.value.value=value),actor.canUserModify(game.user,"update")?[await actor.increaseCondition(itemSource.system.slug,{value})??[]].flat():(ui.notifications.error("PF2E.ErrorMessage.NoUpdatePermission",{localize:!0}),[])}else if(itemIsOfType(itemSource,"affliction","effect")){const{level,value,context}=data;typeof level=="number"&&level>=0&&(itemSource.system.level.value=Math.floor(level)),itemSource.type==="effect"&&itemSource.system.badge?.type==="counter"&&typeof value=="number"&&(itemSource.system.badge.value=value),itemSource.system.context=context??null;const originItem=fromUuidSync(context?.origin.item??"");itemSource.system.traits?.value.length===0&&originItem instanceof SpellPF2e&&itemSource.system.traits.value.push(...originItem.traits)}else if(item.isOfType("physical")&&actor.isOfType("character")&&craftingTab){const actorFormulas=deepClone(actor.system.crafting.formulas);return actorFormulas.some(f=>f.uuid===item.uuid)||(actorFormulas.push({uuid:item.uuid}),await actor.update({"system.crafting.formulas":actorFormulas})),[item]}if(isPhysicalData(itemSource)){const containerId=htmlClosest(event.target,"[data-item-is-container=true]")?.dataset.itemId?.trim()||null;this.actor.itemTypes.backpack.find(container2=>container2.id===containerId)?(itemSource.system.containerId=containerId,itemSource.system.equipped.carryType="stowed"):itemSource.system.equipped.carryType="worn",data?.uuid?.startsWith("Compendium")&&itemSource.type!=="treasure"&&!["med","sm"].includes(actor.size)&&actor.isOfType("creature")&&(itemSource.system.size=actor.size)}return this._onDropItemCreate(new ItemProxyPF2e(itemSource).clone().toObject())}async _onDropFolder(_event,data){if(!(this.actor.isOwner&&data.documentName==="Item"))return[];const folder=await Folder.fromDropData(data);if(!folder)return[];const itemSources=[folder,...folder.getSubfolders()].flatMap(f=>f.contents).map(i=>i.toObject());return this._onDropItemCreate(itemSources)}async moveItemBetweenActors(event,sourceActorId,sourceTokenId,targetActorId,targetTokenId,itemId){const sourceActor=canvas.scene?.tokens.get(sourceTokenId??"")?.actor??game.actors.get(sourceActorId),targetActor=canvas.scene?.tokens.get(targetTokenId??"")?.actor??game.actors.get(targetActorId),item=sourceActor?.items.get(itemId);if(!sourceActor||!targetActor)throw ErrorPF2e("Unexpected missing actor(s)");if(!item?.isOfType("physical"))throw ErrorPF2e("Missing or invalid item");const containerId=htmlClosest(event.target,"[data-item-is-container=true]")?.dataset.containerId?.trim(),sourceItemQuantity=item.quantity,stackable=!!targetActor.inventory.findStackableItem(item._source),isPurchase=sourceActor.isOfType("loot")&&sourceActor.isMerchant&&!sourceActor.isOwner,isAmmunition=item.isOfType("consumable")&&item.isAmmunition;if(sourceItemQuantity>1){const defaultQuantity=isPurchase?isAmmunition?Math.min(10,sourceItemQuantity):1:sourceItemQuantity;new MoveLootPopup(sourceActor,{quantity:{max:sourceItemQuantity,default:defaultQuantity},lockStack:!stackable,isPurchase},(quantity,newStack)=>{sourceActor.transferItemToActor(targetActor,item,quantity,containerId,newStack)}).render(!0)}else sourceActor.transferItemToActor(targetActor,item,1,containerId)}openTagSelector(anchor,options={}){const selectorType=anchor.dataset.tagSelector;if(!tupleHasValue(TAG_SELECTOR_TYPES,selectorType))throw ErrorPF2e(`Unrecognized tag selector type "${selectorType}"`);if(selectorType==="basic"){const objectProperty=anchor.dataset.property??"",title=anchor.dataset.title??"",configTypes=(anchor.dataset.configTypes??"").split(",").map(type=>type.trim()).filter(tag=>tupleHasValue(SELECTABLE_TAG_FIELDS,tag));this.tagSelector("basic",{...options,objectProperty,configTypes,title})}else this.tagSelector(selectorType,options)}tagSelector(selectorType,options){if(selectorType==="basic"&&options&&"objectProperty"in options)new TagSelectorBasic(this.object,options).render(!0);else{if(selectorType==="basic")throw ErrorPF2e("Insufficient options provided to render basic tag selector");{const TagSelector={senses:SenseSelector,"speed-types":SpeedSelector}[selectorType];new TagSelector(this.object,options).render(!0)}}}openTab(name2){this._tabs[0].activate(name2)}async _renderInner(data,options){return this.itemRenderer.saveAndRestoreState(()=>super._renderInner(data,options))}async _render(force,options){await maintainFocusInRender(this,()=>super._render(force,options)),options?.tab&&this.openTab(options.tab)}async _onSubmit(event,{updateData=null,preventClose=!1,preventRender=!1}={}){for(const input of htmlQueryAll(this.form,"tags ~ input"))input.value===""&&(input.value="[]");return super._onSubmit(event,{updateData,preventClose,preventRender})}_getSubmitData(updateData){const data=super._getSubmitData(updateData);processTagifyInSubmitData(this.form,data);for(const el of this.form.elements)if(el instanceof HTMLInputElement&&el.dataset.allowDelta!==void 0){const strValue=el.value.trim(),value=Number(strValue);(strValue.startsWith("+")||strValue.startsWith("-"))&&!Number.isNaN(value)&&(data[el.name]=Number(getProperty(this.actor,el.name))+value)}return data}};_sortableOnMoveData=new WeakMap,_activateInventoryDragDrop=new WeakSet,activateInventoryDragDrop_fn=__name2(function(panel){const inventoryList=htmlQuery(panel,"section.inventory-list, ol[data-container-type=actorInventory]");if(!inventoryList)return;const sortableOptions={...SORTABLE_DEFAULTS,filter:"div.item-summary",preventOnFilter:!1,scroll:inventoryList,setData:(dataTransfer,dragEl)=>{const item=this.actor.inventory.get(htmlQuery(dragEl,"div[data-item-id]")?.dataset.itemId,{strict:!0});dataTransfer.setData("text/plain",JSON.stringify({...item.toDragData(),fromInventory:!0}))},onStart:()=>{__privateSet(this,_sortableOnMoveData,{})},onClone:event=>{for(const link of htmlQueryAll(htmlQuery(event.item,"div.item-summary"),"a.content-link"))link.draggable=!0},onMove:(event,originalEvent)=>__privateMethod(this,_sortableOnMove,sortableOnMove_fn).call(this,event,originalEvent),onEnd:event=>__privateMethod(this,_sortableOnEnd,sortableOnEnd_fn).call(this,event)};for(const list of htmlQueryAll(inventoryList,"ol.inventory-items, ol.item-list")){const itemType=list.dataset.itemType;if(!(list.dataset.containerId||!itemType)){if(itemType==="backpack"){Sortable.create(list,{...sortableOptions,group:{name:"container",put:(_to,_from,dragEl)=>dragEl.dataset.itemType==="backpack"},swapThreshold:.2});for(const subList of htmlQueryAll(list,"ol.container-held-items"))Sortable.create(subList,{...sortableOptions,group:{name:"nested-item",put:!0},swapThreshold:.2});continue}Sortable.create(list,{...sortableOptions,group:{name:itemType,put:(to,from,dragEl)=>from===to?!0:dragEl.dataset.itemType===to.el.dataset.itemType}})}}},"#activateInventoryDragDrop"),_sortableOnMove=new WeakSet,sortableOnMove_fn=__name2(function(event,originalEvent){if(!this.isEditable)return!1;__privateSet(this,_sortableOnMoveData,{related:event.related,willInsertAfter:event.willInsertAfter});const sourceItem=this.actor.inventory.get(htmlQuery(event.dragged,"div[data-item-id]")?.dataset.itemId??""),targetItem=this.actor.inventory.get(htmlClosest(originalEvent.target,"div[data-item-id]")?.dataset.itemId??"");if(sourceItem&&targetItem)return sourceItem.isOfType("backpack")&&targetItem.isOfType("backpack")&&targetItem.isCollapsed?!1:!sourceItem.isStackableWith(targetItem)},"#sortableOnMove"),_sortableOnEnd=new WeakSet,sortableOnEnd_fn=__name2(async function(event){const itemId=htmlQuery(event.item,"div[data-item-id]")?.dataset.itemId,sourceItem=this.actor.inventory.get(itemId,{strict:!0}),targetElement=event.originalEvent?.target instanceof HTMLElement?event.originalEvent.target:null,targetItemId=htmlClosest(targetElement,"div[data-item-id]")?.dataset.itemId??"",targetItem=this.actor.inventory.get(targetItemId);if(!targetItem&&!event.from.contains(targetElement)&&!event.to.contains(targetElement)){if(this.isEditable&&sourceItem.isInContainer&&htmlClosest(targetElement,".inventory-header"))return sourceItem.move({toContainer:null});const itemIsOnlyOneOfType=this.actor.itemTypes[sourceItem.type].length===1;(event.newIndex!==event.oldIndex||itemIsOnlyOneOfType)&&this.render();return}if(!this.isEditable)return;if(targetItem?.isOfType("backpack")&&(!!!htmlClosest(targetElement,"ol[data-container-id]")||targetItem.contents.size===0))return sourceItem.move({toContainer:targetItem});const{related,willInsertAfter}=__privateGet(this,_sortableOnMoveData),relativeItemId=htmlQuery(related,"div[data-item-id]")?.dataset.itemId??"",relativeItem=this.actor.inventory.get(relativeItemId);if(relativeItem||targetItem)return targetItem&&!targetItem.isOfType("backpack")?sourceItem.move({toStack:targetItem}):sourceItem.move({relativeTo:relativeItem,sortBefore:!willInsertAfter})},"#sortableOnEnd"),_onClickDeleteItem=new WeakSet,onClickDeleteItem_fn=__name2(async function(event){const row=htmlClosest(event.currentTarget,"[data-item-id]"),itemId=row?.dataset.itemId,item=this.actor.items.get(itemId??"");if(item?.isOfType("condition")){const references=htmlQuery(row,".condition-references"),deleteCondition=__name2(async()=>{this.actor.decreaseCondition(item,{forceRemove:!0})},"deleteCondition");if(event.ctrlKey){deleteCondition();return}const content=await renderTemplate("systems/pf2e/templates/actors/delete-condition-dialog.hbs",{question:game.i18n.format("PF2E.DeleteQuestion",{name:item.name}),ref:references?.innerHTML});new Dialog({title:game.i18n.localize("PF2E.DeleteConditionTitle"),content,buttons:{Yes:{icon:'',label:"Yes",callback:deleteCondition},cancel:{icon:'',label:"Cancel"}},default:"Yes"}).render(!0)}else if(row&&item)this.deleteItem(row,item,event);else throw ErrorPF2e("Item not found")},"#onClickDeleteItem"),_onClickBrowseEquipment=new WeakSet,onClickBrowseEquipment_fn=__name2(async function(element){const checkboxesFilterCodes=(element.dataset.filter??"").split(",").filter(s=>!!s).map(s=>s.trim()),tab=game.pf2e.compendiumBrowser.tabs.equipment,filter2=await tab.getFilterData(),{checkboxes}=filter2;for(const filterCode of checkboxesFilterCodes){const splitValues=filterCode.split("-");if(splitValues.length!==2)throw ErrorPF2e(`Invalid filter value for opening the compendium browser: "${filterCode}"`);const[filterType,value]=splitValues;if(objectHasKey(checkboxes,filterType)){const checkbox=checkboxes[filterType];objectHasKey(checkbox.options,value)&&(checkbox.options[value].selected=!0,checkbox.selected.push(value),checkbox.isExpanded=!0)}}tab.open(filter2)},"#onClickBrowseEquipment"),_onClickCreateItem=new WeakSet,onClickCreateItem_fn=__name2(function(link){const data=link.dataset;if(!objectHasKey(CONFIG.PF2E.Item.documentClasses,data.type))throw ErrorPF2e(`Unrecognized item type: "${data.type}"`);if(data.type==="spell")return onClickCreateSpell(this.actor,data);const img=`systems/pf2e/icons/default-icons/${data.type}.svg`,type=data.type,itemSource=(()=>{switch(type){case"action":{const name2=game.i18n.localize(`PF2E.ActionType${String(data.actionType).capitalize()}`),actionType=data.actionType;return{type,img,name:name2,system:{actionType:{value:actionType}}}}case"melee":{const name2=game.i18n.localize(`PF2E.NewPlaceholders.${type.capitalize()}`),weaponType=data.actionType;return{type,img,name:name2,system:{weaponType:{value:weaponType}}}}case"lore":{const name2=this.actor.type==="npc"?game.i18n.localize("PF2E.SkillLabel"):game.i18n.localize("PF2E.NewPlaceholders.Lore");return{type,img,name:name2}}default:{if(!setHasElement(PHYSICAL_ITEM_TYPES,type))throw ErrorPF2e(`Unsupported item type: ${type}`);return{name:game.i18n.localize(`PF2E.NewPlaceholders.${data.type.capitalize()}`),type}}}})();if(itemSource){if(data.traits){const traits=String(data.traits).split(",");itemSource.system=mergeObject(itemSource.system??{},{traits:{value:traits}})}this.actor.createEmbeddedDocuments("Item",[itemSource])}},"#onClickCreateItem"),_onClickSellAllTreasure=new WeakSet,onClickSellAllTreasure_fn=__name2(async function(){const content=await renderTemplate("systems/pf2e/templates/actors/sell-all-treasure-dialog.hbs");new Dialog({title:game.i18n.localize("PF2E.SellAllTreasureTitle"),content,buttons:{yes:{icon:fontAwesomeIcon("check").outerHTML,label:"Yes",callback:async()=>this.actor.inventory.sellAllTreasure()},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:"Cancel"}},default:"cancel"}).render(!0)},"#onClickSellAllTreasure"),__name2(_ActorSheetPF2e,"ActorSheetPF2e");let ActorSheetPF2e=_ActorSheetPF2e;const _DamagePF2e=class{static{__name(this,"_DamagePF2e")}static async roll(data,context,callback){const outcome=context.outcome??null;context.rollMode??=(context.secret?"blindroll":void 0)??game.settings.get("core","rollMode"),context.createMessage??=!0,context.options.has("secret")&&(context.secret=!0);const subtitle=outcome?context.sourceType==="attack"?game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${outcome}`):game.i18n.localize(`PF2E.Check.Result.Degree.Check.${outcome}`):null;let flavor=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{title:data.name,subtitle});if(data.traits){const toTags=__name2((slugs,{labels={},descriptions={},cssClass,dataAttr})=>slugs.map(s=>({value:s,label:game.i18n.localize(labels[s]??"")})).sort((a,b)=>a.label.localeCompare(b.label)).map(tag=>{const description=descriptions[tag.value]??"",span=document.createElement("span");return span.className="tag",cssClass&&span.classList.add(cssClass),span.dataset[dataAttr]=tag.value,description&&(span.dataset.tooltip=description),span.innerText=tag.label,span.outerHTML}).join(""),"toTags"),traits=toTags(data.traits,{labels:CONFIG.PF2E.actionTraits,descriptions:CONFIG.PF2E.traitsDescriptions,cssClass:null,dataAttr:"trait"}),item2=context.self?.item,itemTraits=item2?.isOfType("weapon","melee","spell")?toTags(Array.from(item2.traits).filter(t=>!(t in CONFIG.PF2E.materialDamageEffects)),{labels:item2.isOfType("spell")?CONFIG.PF2E.spellTraits:CONFIG.PF2E.npcAttackTraits,descriptions:CONFIG.PF2E.traitsDescriptions,cssClass:"tag_alt",dataAttr:"trait"}):"",properties=(()=>{const range=item2?.isOfType("action","melee","weapon")?item2.range:null,label=createActionRangeLabel(range);if(label&&(range?.increment||range?.max)){const slug=range.increment?`range-increment-${range.increment}`:`range-${range.max}`;return toTags([slug],{labels:{[slug]:label},descriptions:{[slug]:"PF2E.Item.Weapon.RangeIncrementN.Hint"},cssClass:"tag_secondary",dataAttr:"slug"})}else return""})(),materialEffects=toTags(data.materials,{labels:CONFIG.PF2E.preciousMaterials,descriptions:CONFIG.PF2E.traitsDescriptions,cssClass:"tag_material",dataAttr:"material"}),otherTags=[itemTraits,properties,materialEffects].join(""),tagsElem=createHTMLElement("div",{classes:["tags"],dataset:{tooltipClass:"pf2e"}});tagsElem.innerHTML=otherTags.length>0?`${traits}
${otherTags}`:traits,flavor+=tagsElem.outerHTML,flavor+=` -
`}const breakdownTags=(Array.isArray(data.damage.breakdown)?data.damage.breakdown:data.damage.breakdown[outcome??"success"]).map(b=>`${b}`);flavor+=`
${breakdownTags.join("")}
`;const roll=await(()=>{const damage=data.damage;if("roll"in damage)return damage.roll.evaluate({async:!0});const formula=deepClone(damage.formula[outcome??"success"]);if(!formula)return ui.notifications.error(game.i18n.format("PF2E.UI.noDamageInfoForOutcome",{outcome})),null;const rollerId=game.userId,degreeOfSuccess=outcome?DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome):null,critRule=game.settings.get("pf2e","critRule")==="doubledamage"?"double-damage":"double-dice",options={rollerId,damage:data,degreeOfSuccess,ignoredResistances:damage.ignoredResistances,critRule};return new DamageRoll(formula,{},options).evaluate({async:!0})})();if(roll===null)return null;const syntheticNotes=context.self?.actor?extractNotes(context.self?.actor.synthetics.rollNotes,context.domains??[]):[],contextNotes=context.notes?.map(n=>n instanceof RollNotePF2e?n:new RollNotePF2e(n))??[],notes=[...syntheticNotes,...contextNotes].filter(n=>(n.outcome.length===0||outcome&&n.outcome.includes(outcome))&&n.predicate.test(context.options)),notesList=RollNotePF2e.notesToHTML(notes);flavor+=notesList.outerHTML;const{self,target}=context,item=self?.item??null,targetFlag=target?{actor:target.actor.uuid,token:target.token.uuid}:null,strike=(()=>{if(item?.isOfType("melee","weapon")&&item&&self?.actor?.isOfType("character","npc")){const strikes=self.actor.system.actions,strike2=strikes.find(a=>a.item?.id===item.id&&a.item.slug===item.slug);if(strike2)return{actor:self.actor.uuid,index:strikes.indexOf(strike2),damaging:!0,name:strike2.item.name,altUsage:item.isOfType("weapon")?item.altUsageType:null}}return null})(),rollMode=context.rollMode??"roll",contextFlag={type:context.type,sourceType:context.sourceType,actor:context.self?.actor.id??null,token:context.self?.token?.id??null,target:targetFlag,domains:context.domains??[],options:Array.from(context.options).sort(),mapIncreases:context.mapIncreases,notes:notes.map(n=>n.toObject()),secret:context.secret??!1,rollMode,traits:context.traits??[],skipDialog:context.skipDialog??!game.user.settings.showRollDialogs,outcome,unadjustedOutcome:context.unadjustedOutcome??null},messageData=await roll.toMessage({speaker:ChatMessagePF2e.getSpeaker({actor:self?.actor,token:self?.token}),flavor,flags:{pf2e:{context:contextFlag,target:targetFlag,modifiers:data.modifiers?.map(m=>m.toObject())??[],origin:item?.getOriginData(),strike,preformatted:"both"}}},{create:!1}),splashRolls=await(async()=>{const splashInstances=roll.instances.map(i=>({damageType:i.type,total:i.componentTotal("splash")})).filter(s=>s.total>0),rolls=[];for(const splash of splashInstances){const formula=`(${splash.total}[splash])[${splash.damageType}]`,roll2=await new DamageRoll(formula).evaluate({async:!0});roll2.options.splashOnly=!0,rolls.push(roll2.toJSON())}return rolls})();return context.createMessage&&(messageData.rolls.push(...splashRolls),await ChatMessagePF2e.create(messageData,{rollMode})),Hooks.callAll("pf2e.damageRoll",roll),callback&&callback(roll),roll}};__name2(_DamagePF2e,"DamagePF2e");let DamagePF2e=_DamagePF2e;const _DamageModifierDialog=class extends Application{static{__name(this,"_DamageModifierDialog")}constructor(params){super(),__privateAdd(this,_getModifierIcon),__privateAdd(this,_getTypeLabel),__privateAdd(this,_applyStackingRules),__publicField(this,"formulaData"),__publicField(this,"context"),__publicField(this,"baseDamageType"),__publicField(this,"isCritical"),__privateAdd(this,_resolve,void 0),__publicField(this,"isRolled",!1),__privateAdd(this,_originallyEnabled,void 0),this.formulaData=params.formulaData,this.context=params.context,this.baseDamageType=params.formulaData.base.at(0)?.damageType??"untyped",this.isCritical=this.context.outcome==="criticalSuccess",__privateSet(this,_originallyEnabled,new Set(this.formulaData.modifiers.filter(m=>m.enabled)))}static get defaultOptions(){return{...super.defaultOptions,template:"systems/pf2e/templates/chat/damage/damage-modifier-dialog.hbs",classes:["roll-modifiers-dialog","damage-dialog","dialog"],popOut:!0,width:440,height:"auto"}}get title(){return this.isCritical?game.i18n.localize("PF2E.Damage.Dialog.CriticalDamageRoll"):game.i18n.localize("PF2E.Damage.Dialog.DamageRoll")}async getData(){const modifiers=this.formulaData.modifiers.map(m=>({label:m.label,category:m.category,type:m.type,modifier:m.modifier,hideIfDisabled:!__privateGet(this,_originallyEnabled).has(m)&&m.hideIfDisabled,damageType:m.damageType,typeLabel:__privateMethod(this,_getTypeLabel,getTypeLabel_fn).call(this,m.damageType,m.damageCategory),enabled:m.enabled,ignored:m.ignored,critical:m.critical,show:this.isCritical||!m.critical,icon:__privateMethod(this,_getModifierIcon,getModifierIcon_fn).call(this,m)})),dice=this.formulaData.dice.map(d=>({label:d.label,category:d.category,damageType:d.damageType,typeLabel:__privateMethod(this,_getTypeLabel,getTypeLabel_fn).call(this,d.damageType,d.category),diceLabel:d.diceNumber&&d.dieSize?`${d.diceNumber}${d.dieSize}`:d.diceNumber?game.i18n.format("PF2E.Damage.Dialog.BonusDice",{dice:addSign(d.diceNumber)}):"",enabled:d.enabled,ignored:d.ignored,critical:d.critical,show:!d.override&&(this.isCritical||!d.critical),icon:__privateMethod(this,_getModifierIcon,getModifierIcon_fn).call(this,d)})),hasVisibleModifiers=modifiers.filter(m=>m.show).length>0,hasVisibleDice=dice.filter(d=>d.show).length>0,baseResult=createDamageFormula({base:this.formulaData.base,modifiers:[],dice:[],ignoredResistances:[]}),baseRoll=new DamageRoll(baseResult.formula),baseFormulaTemplate=(await Promise.all(baseRoll.instances.map(i=>i.render()))).join(" + "),result=createDamageFormula(this.formulaData),roll=new DamageRoll(result.formula),formulaTemplate=(await Promise.all(roll.instances.map(i=>i.render()))).join(" + ");return{appId:this.id,baseFormula:baseFormulaTemplate,modifiers,dice,isCritical:this.isCritical,hasVisibleDice,hasVisibleModifiers,damageTypes:sortStringRecord(CONFIG.PF2E.damageTypes),damageSubtypes:sortStringRecord(pick(CONFIG.PF2E.damageCategories,DAMAGE_CATEGORIES_UNIQUE)),rollModes:CONFIG.Dice.rollModes,rollMode:this.context?.rollMode,showRollDialogs:game.user.settings.showRollDialogs,formula:formulaTemplate}}activateListeners($html){const html=$html[0];htmlQuery(html,"button.roll")?.addEventListener("click",()=>{this.isRolled=!0,this.close()});for(const checkbox of htmlQueryAll(html,".modifier-container input[type=checkbox]"))checkbox.addEventListener("click",()=>{const{dice,modifiers}=this.formulaData,modIndex=Number(checkbox.dataset.modifierIndex),dieIndex=Number(checkbox.dataset.diceIndex);Number.isNaN(modIndex)?Number.isNaN(dieIndex)||(dice[dieIndex].ignored=!checkbox.checked,dice[dieIndex].enabled=checkbox.checked):(modifiers[modIndex].ignored=!checkbox.checked,__privateMethod(this,_applyStackingRules,applyStackingRules_fn).call(this)),this.render()});const categorySelect=htmlQuery(html,"select.add-dice-category"),damageTypeSelect=htmlQuery(html,"select.add-dice-type");categorySelect?.addEventListener("change",()=>{damageTypeSelect&&(categorySelect.value==="precision"?(damageTypeSelect.value="",damageTypeSelect.disabled=!0):(damageTypeSelect.disabled=!1,damageTypeSelect.value=damageTypeSelect.firstElementChild?.value??"acid"))});const addModifierButton=htmlQuery(html,"button.add-modifier");addModifierButton?.addEventListener("click",()=>{const parent=addModifierButton.parentElement,value=Number(parent.querySelector(".add-modifier-value")?.value||1),type=String(parent.querySelector(".add-modifier-type")?.value),damageType=parent.querySelector(".add-modifier-damage-type")?.value??null,category=parent.querySelector(".add-modifier-category")?.value||null,errors=[];if(Number.isNaN(value)?errors.push("Modifier value must be a number."):value===0&&errors.push("Modifier value must not be zero."),!setHasElement(MODIFIER_TYPES,type))throw ErrorPF2e("Unexpected invalid modifier type");const label=String(parent.querySelector(".add-modifier-name")?.value).trim()||game.i18n.localize(value<0?`PF2E.PenaltyLabel.${type}`:`PF2E.BonusLabel.${type}`);errors.length>0?ui.notifications.error(errors.join(" ")):(this.formulaData.modifiers.push(new ModifierPF2e({label,modifier:value,type,damageType,damageCategory:category})),__privateMethod(this,_applyStackingRules,applyStackingRules_fn).call(this),this.render())});const addDiceButton=htmlQuery(html,"button.add-dice");addDiceButton?.addEventListener("click",()=>{const parent=addDiceButton.parentElement,count=Number(parent.querySelector(".add-dice-count")?.value||1),faces=parent.querySelector(".add-dice-faces")?.value??"d4",category=parent.querySelector(".add-dice-category")?.value||null,type=parent.querySelector(".add-dice-type")?.value||null;if(Number.isNaN(count)){ui.notifications.error("Damage dice count must be a number.");return}else if(count<1){ui.notifications.error("Damage dice count must be greater than zero.");return}if(!tupleHasValue(["persistent","precision","splash",null],category)){ui.notifications.error(`Unkown damage category: ${category}.`);return}const faceLabel=game.i18n.localize(`PF2E.DamageDie${faces.toUpperCase()}`),label=game.i18n.format("PF2E.Damage.Dialog.Bonus",{dice:`+${count}${faceLabel}`}),slug=sluggify(`${label}-${type}`);this.formulaData.dice.push(new DamageDicePF2e({label,category,diceNumber:count,dieSize:faces,damageType:type,slug,selector:"damage"})),this.render()});const rollModeInput=htmlQuery(html,"select[name=rollmode]");rollModeInput?.addEventListener("change",()=>{const rollMode=rollModeInput.value;if(!tupleHasValue(Object.values(CONST.DICE_ROLL_MODES),rollMode))throw ErrorPF2e("Unexpected roll mode");this.context.rollMode=rollMode});const settingsButton=htmlQuery(htmlClosest(html,".app"),"a.header-button.settings");if(settingsButton&&!settingsButton?.dataset.tooltipContent){settingsButton.dataset.tooltipContent=`#${this.id}-settings`;const $tooltip=$(settingsButton).tooltipster({animation:"fade",trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["top"],theme:"crb-hover",minWidth:165}),toggle=htmlQuery(html,".settings-list input.quick-rolls-submit");toggle?.addEventListener("click",async()=>{await game.user.setFlag("pf2e","settings.showRollDialogs",toggle.checked),$tooltip.tooltipster("close")})}}async resolve(){return this.render(!0),new Promise(resolve=>{__privateSet(this,_resolve,resolve)})}async close(options){var _a;(_a=__privateGet(this,_resolve))==null||_a.call(this,this.isRolled),super.close(options)}_getHeaderButtons(){const buttons=super._getHeaderButtons();return[{label:game.i18n.localize("PF2E.SETTINGS.Settings"),class:"settings",icon:"fa-solid fa-cog",onclick:()=>null},...buttons]}_injectHTML($html){super._injectHTML($html),$html[0]?.querySelector("button.roll")?.focus()}};_resolve=new WeakMap,_originallyEnabled=new WeakMap,_getModifierIcon=new WeakSet,getModifierIcon_fn=__name2(function(object){const damageTypeIconClass=object.damageType?DAMAGE_TYPE_ICONS[object.damageType]:null,damageTypeIcon=damageTypeIconClass?fontAwesomeIcon(damageTypeIconClass):null;return(()=>{switch(object.category){case"splash":return compact([fontAwesomeIcon("fa-burst"),damageTypeIcon]);case"persistent":return object.damageType!=="bleed"?[damageTypeIcon,fontAwesomeIcon("fa-hourglass",{style:"duotone"})]:[damageTypeIcon];case"precision":return[damageTypeIcon,fontAwesomeIcon("fa-crosshairs")];default:return[damageTypeIcon]}})().map(i=>i?.outerHTML??"").join("")},"#getModifierIcon"),_getTypeLabel=new WeakSet,getTypeLabel_fn=__name2(function(damageType,category){if(category==="precision")return game.i18n.localize("PF2E.Damage.Precision");if(!damageType)return null;const typeLabel=game.i18n.localize(CONFIG.PF2E.damageTypes[damageType]);switch(category){case"persistent":return game.i18n.format("PF2E.Damage.PersistentTooltip",{damageType:typeLabel});case"splash":return game.i18n.format("PF2E.Damage.Dialog.Splash",{damageType:typeLabel});default:return typeLabel}},"#getTypeLabel"),_applyStackingRules=new WeakSet,applyStackingRules_fn=__name2(function(){applyStackingRules(this.formulaData.modifiers.filter(m=>m.category!=="persistent")),applyStackingRules(this.formulaData.modifiers.filter(m=>m.category==="persistent"))},"#applyStackingRules"),__name2(_DamageModifierDialog,"DamageModifierDialog");let DamageModifierDialog=_DamageModifierDialog;const superEnrichHTML=TextEditor.enrichHTML,superEnrichContentLinks=TextEditor._enrichContentLinks,superCreateInlineRoll=TextEditor._createInlineRoll,superOnClickInlineRoll=TextEditor._onClickInlineRoll,_TextEditorPF2e=class _TextEditorPF2e2 extends TextEditor{static{__name(this,"_TextEditorPF2e")}static enrichHTML(content,options={}){content?.startsWith("

@Localize")&&(content=content.substring(3,content.length-4));const enriched=superEnrichHTML.apply(this,[content,options]);return typeof enriched=="string"&&(options.processVisibility??!0)?_TextEditorPF2e2.processUserVisibility(enriched,options):Promise.resolve().then(async()=>_TextEditorPF2e2.processUserVisibility(await enriched,options))}static _enrichContentLinks(text,options){if(options?.async){const documentTypes=[...CONST.DOCUMENT_LINK_TYPES,"Compendium","UUID"],pattern=new RegExp(`@(${documentTypes.join("|")})\\[([^#\\]]+)(?:#([^\\]]+))?](?:{([^}]+)})?`,"g"),uuids=text.map(t=>Array.from((t.textContent??"").matchAll(pattern))).flat(2).filter(m=>UUIDUtils.isCompendiumUUID(m));return UUIDUtils.fromUUIDs(uuids).then(()=>superEnrichContentLinks.apply(this,[text,options]))}return superEnrichContentLinks.apply(this,[text,options])}static async _createInlineRoll(match,rollData,options={}){const anchor=await superCreateInlineRoll.apply(this,[match,rollData,options]),formula=anchor?.dataset.formula;if(formula){const roll=(()=>{try{return new DamageRoll(formula)}catch{return null}})();if(!roll||!looksLikeDamageRoll(roll))return anchor;const icon=damageDiceIcon(roll),label=match[4]&&match[4].length>0?match[4]:roll.formula;anchor.innerHTML=`${icon.outerHTML}${label}`,anchor.dataset.tooltip=roll.formula,anchor.dataset.damageRoll="",roll.instances.length>0&&roll.instances.every(i=>i.persistent)&&(anchor.draggable=!0,anchor.dataset.persistent="")}return anchor}static async _onClickInlineRoll(event){const anchor=event.currentTarget??null;if(!(anchor instanceof HTMLAnchorElement&&anchor.dataset.formula&&"damageRoll"in anchor.dataset))return superOnClickInlineRoll.apply(this,[event]);const sheetElem=htmlClosest(anchor,".sheet"),messageElem=htmlClosest(anchor,"li.chat-message"),app=ui.windows[Number(sheetElem?.dataset.appid)],message=game.messages.get(messageElem?.dataset.messageId??""),[actor,rollData]=(()=>{if(message?.actor)return[message.actor,message.getRollData()];if(app instanceof ActorSheetPF2e){const itemId=anchor.dataset.pf2ItemId;return[app.actor,app.actor.items.get(itemId)?.getRollData()??app.actor.getRollData()]}if(app instanceof ItemSheetPF2e)return[app.actor,app.item.getRollData()];const itemUuid=anchor.dataset.itemUuid,itemByUUID=itemUuid&&!itemUuid.startsWith("Compendium.")?fromUuidSync(itemUuid):null;return itemByUUID instanceof ItemPF2e?[itemByUUID.actor,itemByUUID.getRollData()]:[null,{}]})(),options=anchor.dataset.flavor?{flavor:anchor.dataset.flavor}:{},speaker=ChatMessagePF2e.getSpeaker({actor}),rollMode=objectHasKey(CONFIG.Dice.rollModes,anchor.dataset.mode)?anchor.dataset.mode:"roll",baseFormula=anchor.dataset.pf2BaseFormula;if(baseFormula){const item=rollData.item instanceof ItemPF2e?rollData.item:null,traits=anchor.dataset.pf2Traits?.split(",")??[],domains=anchor.dataset.pf2Domains?.split(","),extraRollOptions=anchor.dataset.pf2RollOptions?.split(",")??[],result=await augmentInlineDamageRoll(baseFormula,{...eventToRollParams(event),actor,item,domains,traits,extraRollOptions});result&&await DamagePF2e.roll(result.template,result.context);return}const roll=new DamageRoll(anchor.dataset.formula,rollData,options);return roll.toMessage({speaker,flavor:roll.options.flavor},{rollMode})}static processUserVisibility(content,options){const html=createHTMLElement("div",{innerHTML:content}),document2=options.rollData?.actor??null;return UserVisibilityPF2e.process(html,{document:document2}),html.innerHTML}static async enrichString(data,options={}){if(data.length<4)return null;const item=options.rollData?.item??null,[_match,inlineType,paramString,inlineLabel]=data;switch(inlineType){case"Check":{const actor=options.rollData?.actor??item?.actor??null;return __privateMethod(this,_createCheck,createCheck_fn).call(this,{paramString,inlineLabel,item,actor})}case"Damage":return __privateMethod(this,_createDamageRoll,createDamageRoll_fn).call(this,{paramString,rollData:options.rollData,inlineLabel});case"Localize":return __privateMethod(this,_localize,localize_fn).call(this,paramString,options);case"Template":return __privateMethod(this,_createTemplate,createTemplate_fn).call(this,paramString,inlineLabel,item?.system);default:return null}}static convertXMLNode(html,name2,{visible,visibility,whose,tooltip,classes}){const node=html.querySelector(name2);if(!node)return null;const span=document.createElement("span"),{dataset,classList}=span;if(typeof visible=="boolean"&&(visibility=visible?"all":"gm"),visibility&&(dataset.visibility=visibility),whose&&(dataset.whose=whose),tooltip&&(dataset.tooltip=tooltip.trim()),classes)for(const cssClass of classes)classList.add(cssClass);return span.append(...Array.from(node.childNodes)),node.replaceWith(span),span}};_localize=new WeakSet,localize_fn=__name2(async function(paramString,options){const content=game.i18n.localize(paramString);if(content===paramString)return ui.notifications.error(`Failed to localize ${paramString}!`),null;const result=document.createElement("span");return result.innerHTML=await TextEditor.enrichHTML(content,{...options,async:!0}),result},"#localize"),_createTemplate=new WeakSet,createTemplate_fn=__name2(function(paramString,label,itemData){const params=__privateMethod(this,_parseInlineParams,parseInlineParams_fn).call(this,paramString,{first:"type"});if(!params)return null;if(!params.type)ui.notifications.error(game.i18n.localize("PF2E.InlineTemplateErrors.TypeMissing"));else if(params.distance)if(objectHasKey(CONFIG.PF2E.areaTypes,params.type)){if(isNaN(+params.distance))return ui.notifications.error(game.i18n.format("PF2E.InlineTemplateErrors.DistanceNoNumber",{distance:params.distance})),null;if(params.width&&isNaN(+params.width))return ui.notifications.error(game.i18n.format("PF2E.InlineTemplateErrors.WidthNoNumber",{width:params.width})),null;{params.traits||=itemData?.traits?.value?.toString()??"",label||(label=game.i18n.format("PF2E.TemplateLabel",{size:params.distance,unit:game.i18n.localize("PF2E.Foot"),shape:game.i18n.localize(CONFIG.PF2E.areaTypes[params.type])}));const html=document.createElement("span");return html.innerHTML=label,html.setAttribute("data-pf2-effect-area",params.type),html.setAttribute("data-pf2-distance",params.distance),params.traits!==""&&html.setAttribute("data-pf2-traits",params.traits),params.type==="line"&&html.setAttribute("data-pf2-width",params.width??"5"),html}}else return ui.notifications.error(game.i18n.format("PF2E.InlineTemplateErrors.TypeUnsupported",{type:params.type})),null;else return ui.notifications.error(game.i18n.localize("PF2E.InlineTemplateErrors.DistanceMissing")),null;return null},"#createTemplate"),_parseInlineParams=new WeakSet,parseInlineParams_fn=__name2(function(paramString,options={}){return paramString.split("|").reduce((result2,part,idx)=>{if(idx===0&&options.first&&!part.includes(":"))return result2[options.first]=part.trim(),result2;const colonIdx=part.indexOf(":"),portions=colonIdx>=0?[part.slice(0,colonIdx),part.slice(colonIdx+1)]:[part,""];return result2[portions[0]]=portions[1],result2},{})},"#parseInlineParams"),_createCheck=new WeakSet,createCheck_fn=__name2(function({paramString,inlineLabel,item=null,actor=item?.actor??null}){const rawParams=__privateMethod(this,_parseInlineParams,parseInlineParams_fn).call(this,paramString,{first:"type"});if(!rawParams)return null;if(!rawParams.type)return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.TypeMissing")),null;const showDC=setHasElement(USER_VISIBILITIES,rawParams.showDC)?rawParams.showDC:actor?.hasPlayerOwner||actor?.isOfType("party")||game.settings.get("pf2e","metagame_showDC")?"all":"gm",params={...rawParams,type:rawParams.type,basic:rawParams.basic!==void 0&&["true",""].includes(rawParams.basic),showDC,traits:(()=>{const traits=[],itemTraits=item?.system.traits?.value??[];return rawParams.overrideTraits!=="true"&&traits.push(...itemTraits),rawParams.traits&&traits.push(...rawParams.traits.split(",").map(trait=>trait.trim())),Array.from(new Set(traits))})(),extraRollOptions:compact([...__privateMethod(this,_createActionOptions,createActionOptions_fn).call(this,item),...rawParams.basic==="true"?["damaging-effect"]:[],...rawParams.options?.split(",").map(t=>t.trim())??[]]).sort()};rawParams.dc&&(params.dc=rawParams.dc),rawParams.defense&&(params.defense=rawParams.defense);const types=params.type.split(",");let adjustments=params.adjustment?.split(",")??["0"];if(types.length!==adjustments.length&&adjustments.length>1)return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.AdjustmentLengthMismatch")),null;if(types.length>adjustments.length&&(adjustments=new Array(types.length).fill(adjustments[0])),adjustments.some(adj=>adj!==""&&isNaN(parseInt(adj))))return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.NonIntegerAdjustment")),null;const buttons=types.map((type,i)=>__privateMethod(this,_createSingleCheck,createSingleCheck_fn).call(this,{actor,item,inlineLabel,params:{...params,type,adjustment:adjustments[i]}}));if(buttons.length===1)return buttons[0];{const checkGroup=document.createElement("div");checkGroup.setAttribute("data-pf2-checkgroup","");for(const button of buttons){if(button===null)return null;checkGroup.hasChildNodes()&&checkGroup.appendChild(document.createElement("br")),checkGroup.appendChild(button)}return checkGroup}},"#createCheck"),_createSingleCheck=new WeakSet,createSingleCheck_fn=__name2(function({params,item,actor,inlineLabel}){const icon=(()=>{switch(params.type){case"fortitude":return fontAwesomeIcon("heart-pulse");case"reflex":return fontAwesomeIcon("person-running");case"will":return fontAwesomeIcon("brain");case"perception":return fontAwesomeIcon("eye");default:return fontAwesomeIcon("dice-d20")}})();icon.classList.add("icon");const name2=params.name??item?.name??params.type,localize=localizer("PF2E.InlineCheck"),label=(()=>{if(inlineLabel)return inlineLabel;if(tupleHasValue(SAVE_TYPES,params.type)){const saveName=game.i18n.localize(CONFIG.PF2E.saves[params.type]);return params.basic?localize("BasicWithSave",{save:saveName}):saveName}switch(params.type){case"flat":return game.i18n.localize("PF2E.FlatCheck");case"perception":return game.i18n.localize("PF2E.PerceptionLabel");default:{const shortForm=(()=>{if(objectHasKey(SKILL_EXPANDED,params.type))return SKILL_EXPANDED[params.type].shortForm;if(objectHasKey(SKILL_DICTIONARY,params.type))return params.type})();return shortForm?game.i18n.localize(CONFIG.PF2E.skills[shortForm]):params.type.split("-").map(word=>word.slice(0,1).toUpperCase()+word.slice(1)).join(" ")}}})(),createLabel=__name2(content=>createHTMLElement("span",{classes:["label"],innerHTML:content}),"createLabel"),anchor=createHTMLElement("a",{classes:["inline-check"],children:[icon,createLabel(label)],dataset:{pf2Traits:params.traits.toString()||null,pf2RollOptions:params.extraRollOptions.toString()||null,pf2RepostFlavor:name2,pf2ShowDc:params.showDC==="all"?null:params.showDC,pf2Label:localize("DCWithName",{name:name2}),pf2Adjustment:Number(params.adjustment)||null,pf2Roller:params.roller||null,pf2Check:sluggify(params.type)}});if(params.defense&¶ms.dc&&(anchor.dataset.tooltip=localize("Invalid",{message:localize("Errors.DCAndDefense")}),anchor.dataset.invalid="true"),!["flat","fortitude","reflex","will"].includes(params.type)&¶ms.defense&&(anchor.dataset.pf2Defense=params.defense),params.type&¶ms.dc){const checkDC=params.dc==="@self.level"?params.dc:getCheckDC({name:name2,params,item,actor});if(anchor.dataset.pf2Dc=checkDC,checkDC!=="@self.level"){const dc=params.dc===""?NaN:Number(checkDC),displayedDC=isNaN(dc)?checkDC:`${dc+Number(params.adjustment)}`,text=anchor.innerText;anchor.querySelector("span.label")?.replaceWith(createLabel(game.i18n.format("PF2E.DCWithValueAndVisibility",{role:params.showDC,dc:displayedDC,text})))}}return params.roller==="self"&&actor&&!actor.canUserModify(game.user,"update")?createHTMLElement("span",{children:[anchor.innerText]}):anchor},"#createSingleCheck"),_createDamageRoll=new WeakSet,createDamageRoll_fn=__name2(async function(args){const params=__privateMethod(this,_parseInlineParams,parseInlineParams_fn).call(this,args.paramString,{first:"formula"});if(!params||!params.formula)return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.TypeMissing")),null;const item=args.rollData?.item instanceof ItemPF2e?args.rollData?.item:null,actor=(args.rollData?.actor instanceof ActorPF2e?args.rollData?.actor:null)??item?.actor??null,domains=params.domains?.split(",");if(domains?.some(d=>!/^[a-z][-a-z0-9]+-damage$/.test(d)))return ui.notifications.warn(game.i18n.format("PF2E.InlineCheck.Errors.InvalidDomains",{type:"@Damage"})),null;const traits=(()=>{const fromParams=params.traits?.split(",").flatMap(t=>t.trim()||[])??[],fromItem=item?.system.traits?.value??[];return params.overrideTraits==="true"?fromParams:uniq([...fromParams,...fromItem])})().sort(),extraRollOptions=compact([...params.options?.split(",").map(t=>t.trim())??[],...__privateMethod(this,_createActionOptions,createActionOptions_fn).call(this,item)]).sort(),result=await augmentInlineDamageRoll(params.formula,{skipDialog:!0,actor,item,domains,traits,extraRollOptions}),baseFormula=(()=>{const baseRollData={...item?.getRollData()??{},actor:{level:(item&&"level"in item?item.level:null)??1}};return new DamageRoll(params.formula,baseRollData).formula})(),roll=result?.template.damage.roll??new DamageRoll(params.formula,args.rollData),formula=roll.formula;return createHTMLElement("a",{classes:compact(["inline-roll","roll",baseFormula!==formula?"altered":null]),children:[damageDiceIcon(roll),args.inlineLabel??formula],dataset:{formula:roll._formula,tooltip:args.inlineLabel?formula:baseFormula!==formula?game.i18n.format("PF2E.InlineDamage.Base",{formula:baseFormula}):null,damageRoll:params.formula,pf2Domains:domains?.join(",")||null,pf2BaseFormula:result?params.formula:null,pf2Traits:traits.toString()||null,pf2RollOptions:extraRollOptions.toString()||null,pf2ItemId:item?.id}})},"#createDamageRoll"),_createActionOptions=new WeakSet,createActionOptions_fn=__name2(function(item){return!item?.isOfType("action","feat")||!item.actionCost?[]:compact([`action:${item.slug??sluggify(item.name)}`,item.actionCost.value?`action:cost:${item.actionCost.value}`:null])},"#createActionOptions"),__privateAdd(_TextEditorPF2e,_localize),__privateAdd(_TextEditorPF2e,_createTemplate),__privateAdd(_TextEditorPF2e,_parseInlineParams),__privateAdd(_TextEditorPF2e,_createCheck),__privateAdd(_TextEditorPF2e,_createSingleCheck),__privateAdd(_TextEditorPF2e,_createDamageRoll),__privateAdd(_TextEditorPF2e,_createActionOptions),__name2(_TextEditorPF2e,"TextEditorPF2e");let TextEditorPF2e=_TextEditorPF2e;function getCheckDC({name:name2,params,item=null,actor=item?.actor??null}){const{type}=params,dc=params.dc,base=(()=>{if(dc?.startsWith("resolve")&&actor){params.immutable||="true";const resolve=dc.match(/resolve\((.+?)\)$/),value=resolve&&resolve?.length>0?resolve[1]:"";return Number(__name2(resolveString=>{try{const rollData=item?.getRollData()??actor?.getRollData();return Roll.safeEval(Roll.replaceFormulaData(resolveString,rollData))}catch{return 0}},"saferEval")(value))}return Number(dc)||void 0})();if(base){const getStatisticValue=__name2(selectors=>{if(item?.actor&¶ms.immutable!=="true"){const{actor:actor2}=item,{synthetics}=actor2,modifier=new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:base-10,adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,selectors,"base")}),stat=new Statistic(actor2,{slug:type,label:name2,domains:selectors,modifiers:[modifier]});return String(stat.dc.value)}return base.toString()},"getStatisticValue"),slugName=sluggify(name2);if(type==="flat")return params.immutable==="false"?getStatisticValue(["inline-dc",`${slugName}-inline-dc`]):base.toString();{const selectors=["all","inline-dc",`${slugName}-inline-dc`];return getStatisticValue(selectors)}}return"0"}__name(getCheckDC,"getCheckDC"),__name2(getCheckDC,"getCheckDC");async function augmentInlineDamageRoll(baseFormula,args){const{name:name2,actor,item,traits,extraRollOptions}=args;try{const rollData=item?.getRollData()??actor?.getRollData()??{};rollData.actor??={level:(item&&"level"in item?item.level:null)??1};const base=extractBaseDamage(new DamageRoll(baseFormula,rollData)),domains=compact(["damage","inline-damage",item?`${item.id}-inline-damage`:null,item?`${sluggify(item.slug??item.name)}-inline-damage`:null,args.domains]).flat(),options=new Set([...actor?.getRollOptions(domains)??[],...item?.getRollOptions("item")??[],...traits??[],...extraRollOptions??[]]),firstBase=base.at(0);if(firstBase&&actor?.isOfType("npc")&&(actor.isElite||actor.isWeak)){const value=options.has("item:frequency:limited")?4:2;firstBase.terms?.push({dice:null,modifier:actor.isElite?value:-value})}const{modifiers,dice}=(()=>{if(!(actor instanceof ActorPF2e))return{modifiers:[],dice:[]};const extractOptions={resolvables:rollData??{},test:options};return processDamageCategoryStacking(base,{modifiers:extractModifiers(actor.synthetics,domains,extractOptions),dice:extractDamageDice(actor.synthetics.damageDice,domains,extractOptions),test:options})})(),formulaData={base,modifiers,dice,ignoredResistances:[]},isAttack=!!traits?.includes("attack"),context={type:"damage-roll",sourceType:isAttack?"attack":"save",outcome:isAttack?"success":null,domains,options,self:(()=>actor?{actor,token:actor.token,item:item||null,statistic:null,modifiers}:null)()};applyDamageDiceOverrides(base,dice);const{formula,breakdown}=createDamageFormula(formulaData),roll=new DamageRoll(formula);return{template:{name:name2??item?.name??actor?.name??"",damage:{roll,breakdown},modifiers:[...modifiers,...dice],traits:traits?.filter(t=>t in CONFIG.PF2E.actionTraits)??[],materials:[]},context}}catch(ex){return console.error(`Failed to parse inline @Damage ${baseFormula}:`,ex),null}}__name(augmentInlineDamageRoll,"augmentInlineDamageRoll"),__name2(augmentInlineDamageRoll,"augmentInlineDamageRoll");const _CheckModifiersDialog=class extends Application{static{__name(this,"_CheckModifiersDialog")}constructor(check,resolve,context={options:new Set}){const title=(()=>{const maybeWithHTML=context.title?.trim()||check.slug;if(!maybeWithHTML.includes("<"))return maybeWithHTML.trim();const div=document.createElement("div");return div.innerHTML=maybeWithHTML,div.querySelector(".action-glyph, .pf2-icon")?.remove(),div.innerText.trim()})();super({title}),__privateAdd(this,_resolveSubstitutions),__publicField(this,"check"),__publicField(this,"context"),__publicField(this,"resolve"),__publicField(this,"isResolved",!1),__privateAdd(this,_originallyEnabled2,void 0),this.check=check,this.resolve=resolve,this.context=context,__privateSet(this,_originallyEnabled2,new Set(check.modifiers.filter(m=>m.enabled)))}static get defaultOptions(){return{...super.defaultOptions,template:"systems/pf2e/templates/chat/check-modifiers-dialog.hbs",classes:["roll-modifiers-dialog","dice-checks","dialog"],popOut:!0,width:380,height:"auto"}}async getData(){const fortune=this.context.rollTwice==="keep-higher",misfortune=this.context.rollTwice==="keep-lower",none=fortune===misfortune,rollMode=this.context.rollMode==="roll"?game.settings.get("core","rollMode"):this.context.rollMode;return{appId:this.id,modifiers:this.check.modifiers.map(m=>({...m,hideIfDisabled:!__privateGet(this,_originallyEnabled2).has(m)&&m.hideIfDisabled})),totalModifier:this.check.totalModifier,rollModes:CONFIG.Dice.rollModes,rollMode,showRollDialogs:game.user.settings.showRollDialogs,substitutions:__privateMethod(this,_resolveSubstitutions,resolveSubstitutions_fn).call(this),fortune,none,misfortune}}activateListeners($html){const html=$html[0];htmlQuery(html,"button.roll")?.addEventListener("click",()=>{this.resolve(!0),this.isResolved=!0,this.close()});for(const checkbox of htmlQueryAll(html,".substitutions input[type=checkbox]"))checkbox.addEventListener("click",()=>{const substitutions=this.context.substitutions??[],index=Number(checkbox.dataset.subIndex),toggledSub=substitutions.at(index);if(!toggledSub)return;toggledSub.selected=toggledSub.required||checkbox.checked;const options=this.context.options??=new Set;for(const substitution of substitutions){const option=`substitute:${substitution.slug}`;substitution.selected?options.add(option):options.delete(option)}this.context.substitutions=__privateMethod(this,_resolveSubstitutions,resolveSubstitutions_fn).call(this).map(s=>omit(s,["toggleable"])),this.check.calculateTotal(this.context.options),this.render()});for(const checkbox of htmlQueryAll(html,".modifier-container input[type=checkbox]"))checkbox.addEventListener("click",()=>{const index=Number(checkbox.dataset.modifierIndex);this.check.modifiers[index].ignored=!checkbox.checked,this.check.calculateTotal(),this.render()});const addModifierButton=htmlQuery(html,"button.add-modifier");addModifierButton?.addEventListener("click",()=>{const parent=addModifierButton.parentElement,value=Number(parent.querySelector(".add-modifier-value")?.value||1),type=String(parent.querySelector(".add-modifier-type")?.value);let name2=String(parent.querySelector(".add-modifier-name")?.value);const errors=[];if(Number.isNaN(value)?errors.push("Modifier value must be a number."):value===0&&errors.push("Modifier value must not be zero."),!setHasElement(MODIFIER_TYPES,type))throw ErrorPF2e("Unexpected invalid modifier type");(!name2||!name2.trim())&&(name2=game.i18n.localize(value<0?`PF2E.PenaltyLabel.${type}`:`PF2E.BonusLabel.${type}`)),errors.length>0?ui.notifications.error(errors.join(" ")):(this.check.push(new ModifierPF2e(name2,value,type)),this.render())});for(const rollTwice of htmlQueryAll(html,".fate input[type=radio]"))rollTwice.addEventListener("click",()=>{this.context.rollTwice=rollTwice.value||!1});const rollModeInput=htmlQuery(html,"select[name=rollmode]");rollModeInput?.addEventListener("change",()=>{const rollMode=rollModeInput.value;if(!tupleHasValue(Object.values(CONST.DICE_ROLL_MODES),rollMode))throw ErrorPF2e("Unexpected roll mode");this.context.rollMode=rollMode});const settingsButton=htmlQuery(htmlClosest(html,".app"),"a.header-button.settings");if(settingsButton&&!settingsButton?.dataset.tooltipContent){settingsButton.dataset.tooltipContent=`#${this.id}-settings`;const $tooltip=$(settingsButton).tooltipster({animation:"fade",trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["top"],theme:"crb-hover",minWidth:165}),toggle=htmlQuery(html,".settings-list input.quick-rolls-submit");toggle?.addEventListener("click",async()=>{await game.user.setFlag("pf2e","settings.showRollDialogs",toggle.checked),$tooltip.tooltipster("close")})}}async close(options){this.isResolved||this.resolve(!1),super.close(options)}_getHeaderButtons(){const buttons=super._getHeaderButtons();return[{label:game.i18n.localize("PF2E.SETTINGS.Settings"),class:"settings",icon:"fa-solid fa-cog",onclick:()=>null},...buttons]}_injectHTML($html){super._injectHTML($html),$html[0]?.querySelector("button.roll")?.focus()}};_originallyEnabled2=new WeakMap,_resolveSubstitutions=new WeakSet,resolveSubstitutions_fn=__name2(function(){this.context.substitutions??=[];const hasRequired={fortune:this.context.substitutions.some(s=>s.required&&s.effectType==="fortune"),misfortune:this.context.substitutions.some(s=>s.required&&s.effectType==="misfortune")};return this.context.substitutions.map(substitution=>{const toggleable=!hasRequired[substitution.effectType],selected=substitution.required?!0:substitution.selected&&toggleable;return{...substitution,selected,toggleable}})},"#resolveSubstitutions"),__name2(_CheckModifiersDialog,"CheckModifiersDialog");let CheckModifiersDialog=_CheckModifiersDialog;const _CheckRoll=class _CheckRoll2 extends Roll{static{__name(this,"_CheckRoll")}get roller(){return game.users.get(this.options.rollerId??"")??null}get type(){return this.options.type??"check"}get degreeOfSuccess(){return this.options.degreeOfSuccess??null}get isReroll(){return this.options.isReroll??!1}get isRerollable(){return!this.isReroll&&!this.dice.some(d=>d.modifiers.includes("kh")||d.modifiers.includes("kl"))}async render(options={}){this._evaluated||await this.evaluate({async:!0});const{isPrivate,flavor,template}=options,{type,identifier,action:action2,damaging}=this.options,canRollDamage=!!(damaging&&identifier&&(this.roller===game.user||game.user.isGM)),limitCueVisibility=!game.settings.get("pf2e","metagame_showResults"),chatData={formula:isPrivate?"???":this._formula,flavor:isPrivate?null:flavor,user:game.user.id,tooltip:isPrivate?"":await this.getTooltip(),total:isPrivate?"?":Math.round(this.total*100)/100,type,identifier,action:action2,degree:this.degreeOfSuccess,canRollDamage,limitCueVisibility};return renderTemplate(template??_CheckRoll2.CHAT_TEMPLATE,chatData)}};__name2(_CheckRoll,"CheckRoll"),__publicField(_CheckRoll,"CHAT_TEMPLATE","systems/pf2e/templates/chat/check/roll.hbs");let CheckRoll=_CheckRoll;const _StrikeAttackRoll=class extends CheckRoll{static{__name(this,"_StrikeAttackRoll")}};__name2(_StrikeAttackRoll,"StrikeAttackRoll");let StrikeAttackRoll=_StrikeAttackRoll;const _CheckPF2e=class _CheckPF2e2{static{__name(this,"_CheckPF2e")}static async roll(check,context={},event=null,callback){event&&mergeObject(context,eventToRollParams(event)),context.skipDialog??=!game.user.settings.showRollDialogs,context.createMessage??=!0,Array.isArray(context.options)&&(context.options=new Set(context.options));const rollOptions=context.options??new Set;typeof context.mapIncreases=="number"&&rollOptions.add(`map:increases:${context.mapIncreases}`),rollOptions.has("secret")&&(context.rollMode??=game.user.isGM?"gmroll":"blindroll"),context.rollMode??="roll",rollOptions.size>0&&!context.isReroll&&check.calculateTotal(rollOptions);const substitutions=context.substitutions??=[],requiredSubstitution=context.substitutions.find(s=>s.required&&s.selected);if(requiredSubstitution)for(const substitution of context.substitutions)substitution.required=substitution===requiredSubstitution,substitution.selected=substitution===requiredSubstitution;if(!context.skipDialog&&context.type!=="flat-check"&&!await new Promise(resolve=>{new CheckModifiersDialog(check,resolve,context).render(!0)}))return null;const extraTags=[],isReroll=context.isReroll??!1;isReroll&&(context.rollTwice=!1);const[dice,tagsFromDice]=(()=>{const substitution=substitutions.find(s=>s.selected),rollTwice=context.rollTwice??!1,fortuneMisfortune=new Set(compact([substitution?.effectType,rollTwice==="keep-higher"?"fortune":rollTwice==="keep-lower"?"misfortune":null]));for(const trait of fortuneMisfortune)rollOptions.add(trait);if(rollOptions.has("fortune")&&rollOptions.has("misfortune")){for(const sub of substitutions)rollOptions.delete(`substitute:${sub.slug}`),check.calculateTotal(rollOptions);return["1d20",["PF2E.TraitFortune","PF2E.TraitMisfortune"]]}else if(substitution){const effectType={fortune:"PF2E.TraitFortune",misfortune:"PF2E.TraitMisfortune"}[substitution.effectType],extraTag=game.i18n.format("PF2E.SpecificRule.SubstituteRoll.EffectType",{type:game.i18n.localize(effectType),substitution:reduceItemName(game.i18n.localize(substitution.label))});return[substitution.value.toString(),[extraTag]]}else return context.rollTwice==="keep-lower"?["2d20kl",["PF2E.TraitMisfortune"]]:context.rollTwice==="keep-higher"?["2d20kh",["PF2E.TraitFortune"]]:["1d20",[]]})();extraTags.push(...tagsFromDice);const options={type:context.type,identifier:context.identifier,action:context.action&&sluggify(context.action)||null,rollerId:game.userId,isReroll,totalModifier:check.totalModifier,damaging:!!context.damaging,domains:context.domains},totalModifierPart=signedInteger(check.totalModifier,{emptyStringZero:!0}),roll=await new CheckRoll(`${dice}${totalModifierPart}`,{},options).evaluate({async:!0}),dosAdjustments=context.dosAdjustments?.filter(a=>a.predicate?.test(rollOptions)??!0).reduce((record,data)=>{for(const outcome of["all",...DEGREE_OF_SUCCESS_STRINGS])data.adjustments[outcome]&&(record[outcome]=deepClone(data.adjustments[outcome]));return record},{})??{},degree=context.dc?new DegreeOfSuccess(roll,context.dc,dosAdjustments):null;degree&&(context.outcome=DEGREE_OF_SUCCESS_STRINGS[degree.value],context.unadjustedOutcome=DEGREE_OF_SUCCESS_STRINGS[degree.unadjusted],roll.options.degreeOfSuccess=degree.value);const notes=context.notes?.map(n=>n instanceof RollNotePF2e?n:new RollNotePF2e(n)).filter(note=>{if(!note.predicate.test([...rollOptions,...note.rule?.item.getRollOptions("parent")??[]]))return!1;if(!context.dc||note.outcome.length===0)return!0;const outcome=context.outcome??context.unadjustedOutcome;return!!(outcome&¬e.outcome.includes(outcome))})??[],notesList=RollNotePF2e.notesToHTML(notes),item=context.item??null,flavor=await(async()=>{const result=await __privateMethod(this,_createResultFlavor,createResultFlavor_fn).call(this,{degree,target:context.target??null}),tags=__privateMethod(this,_createTagFlavor,createTagFlavor_fn).call(this,{check,context,extraTags}),title=(context.title??check.slug).trim();return[title.startsWith("{const strong=document.createElement("strong");return strong.innerHTML=title,createHTMLElement("h4",{classes:["action"],children:[strong]})})(),result??[],tags,notesList].flat().map(e=>typeof e=="string"?e:e.outerHTML).join("")})(),contextFlag={...context,type:context.type??"check",identifier:context.identifier??null,item:void 0,dosAdjustments,actor:context.actor?.id??null,token:context.token?.id??null,domains:context.domains??[],target:context.target?{actor:context.target.actor.uuid,token:context.target.token.uuid}:null,options:Array.from(rollOptions).sort(),notes:notes.map(n=>n.toObject()),rollMode:context.rollMode,rollTwice:context.rollTwice??!1,title:context.title??"PF2E.Check.Label",traits:context.traits??[],substitutions,dc:context.dc?omit(context.dc,["statistic"]):null,skipDialog:context.skipDialog,isReroll:context.isReroll??!1,outcome:context.outcome??null,unadjustedOutcome:context.unadjustedOutcome??null};delete contextFlag.item;const message=await(()=>{const flags={core:context.type==="initiative"?{initiativeRoll:!0}:{},pf2e:{context:contextFlag,modifierName:check.slug,modifiers:check.modifiers.map(m=>m.toObject()),origin:item?.getOriginData()}},speaker=ChatMessagePF2e.getSpeaker({actor:context.actor,token:context.token}),{rollMode}=contextFlag,create=context.createMessage;return roll.toMessage({speaker,flavor,flags},{rollMode,create})})();if(callback){const msg=message instanceof ChatMessagePF2e?message:new ChatMessagePF2e(message),evt=event&&event instanceof Event?event:event?.originalEvent??null;await callback(roll,context.outcome,msg,evt)}return item?.isOfType("weapon")&&item.traits.has("consumable")&&item.actor.items.has(item.id)&&item.quantity>0&&await item.update({system:{quantity:item.quantity-1}}),roll}static async rerollFromMessage(message,{heroPoint=!1,keep="new"}={}){if(!(message.isAuthor||game.user.isGM)){ui.notifications.error(game.i18n.localize("PF2E.RerollMenu.ErrorCantDelete"));return}const actor=game.actors.get(message.speaker.actor??"");let rerollFlavor=game.i18n.localize(`PF2E.RerollMenu.MessageKeep.${keep}`);if(heroPoint)if(actor?.isOfType("character")){const heroPointCount=actor.heroPoints.value;if(heroPointCount)await actor.update({"system.resources.heroPoints.value":Math.clamped(heroPointCount-1,0,actor.heroPoints.max)}),rerollFlavor=game.i18n.format("PF2E.RerollMenu.MessageHeroPoint",{name:actor.name});else{ui.notifications.warn(game.i18n.format("PF2E.RerollMenu.WarnNoHeroPoint",{name:actor.name}));return}}else{ui.notifications.error("PF2E.RerollMenu.ErrorNoActor",{localize:!0});return}const systemFlags=deepClone(message.flags.pf2e),context=systemFlags.context;if(!isCheckContextFlag(context))return;context.skipDialog=!0,context.isReroll=!0;const oldRoll=message.rolls.at(0);if(!(oldRoll instanceof CheckRoll))throw ErrorPF2e("Unexpected error retrieving prior roll");const unevaluatedNewRoll=oldRoll.clone();unevaluatedNewRoll.options.isReroll=!0,Hooks.callAll("pf2e.preReroll",Roll.fromJSON(JSON.stringify(oldRoll.toJSON())),unevaluatedNewRoll,heroPoint,keep);const newRoll=await unevaluatedNewRoll.evaluate({async:!0});Hooks.callAll("pf2e.reroll",Roll.fromJSON(JSON.stringify(oldRoll.toJSON())),newRoll,heroPoint,keep);let keptRoll=newRoll,[oldRollClass,newRollClass]=["pf2e-reroll-discard",""];(keep==="higher"&&oldRoll.total>newRoll.total||keep==="lower"&&oldRoll.total{const{dc}=context;if(!dc)return null;if(dc.slug==="armor"){const targetActor=(()=>{const{target}=context;if(!target?.actor)return null;const maybeActor=fromUuidSync(target.actor);return maybeActor instanceof ActorPF2e?maybeActor:maybeActor instanceof TokenDocumentPF2e?maybeActor.actor:null})();dc.statistic=targetActor?.armorClass}return new DegreeOfSuccess(newRoll,dc,context.dosAdjustments)})(),useNewRoll=keptRoll===newRoll&&!!degree;useNewRoll&°ree&&(newRoll.options.degreeOfSuccess=degree.value);const renders={old:await _CheckPF2e2.renderReroll(oldRoll,{isOld:!0}),new:await _CheckPF2e2.renderReroll(newRoll,{isOld:!1})},rerollIcon=fontAwesomeIcon(heroPoint?"hospital-symbol":"dice");rerollIcon.classList.add("pf2e-reroll-indicator"),rerollIcon.setAttribute("title",rerollFlavor);const oldFlavor=message.flavor??"";context.outcome=useNewRoll?DEGREE_OF_SUCCESS_STRINGS[degree.value]:context.outcome;const newFlavor=useNewRoll?await(async()=>{const parsedFlavor=document.createElement("div");parsedFlavor.innerHTML=oldFlavor;const target=context.target??null,targetFlavor=await __privateMethod(this,_createResultFlavor,createResultFlavor_fn).call(this,{degree,target});targetFlavor&&htmlQuery(parsedFlavor,".target-dc-result")?.replaceWith(targetFlavor);for(const element of htmlQueryAll(parsedFlavor,".roll-note"))element.remove();const notesText=(context.notes?.map(n=>new RollNotePF2e(n))??[]).filter(note=>{if(!context.dc||note.outcome.length===0)return!0;const outcome=context.outcome??context.unadjustedOutcome;return!!(outcome&¬e.outcome.includes(outcome))}).map(n=>n.text).join(` -`)??"";return parsedFlavor.innerHTML+notesText})():oldFlavor,{initiativeRoll}=message.flags.core;if(initiativeRoll){const combatant=message.token?.combatant;await combatant?.parent.setInitiative(combatant.id,newRoll.total)}await message.delete({render:!1}),await keptRoll.toMessage({content:`

${renders.old}
${renders.new}
`,flavor:`${rerollIcon.outerHTML}${newFlavor}`,speaker:message.speaker,flags:{core:{initiativeRoll},pf2e:systemFlags}},{rollMode:context.rollMode})}static async renderReroll(roll,{isOld}){const die=roll.dice.find(d=>d instanceof Die&&d.faces===20);if(typeof die?.total!="number")throw ErrorPF2e("Unexpected error inspecting d20 term");const html=await roll.render(),element=parseHTML(`
${html}
`);return isOld&&element.querySelector(".message-buttons")?.remove(),[1,20].includes(die.total)&&element.querySelector(".dice-total")?.classList.add(die.total===20?"success":"failure"),element.innerHTML}};_createTagFlavor=new WeakSet,createTagFlavor_fn=__name2(function({check,context,extraTags}){const toTagElement=__name2((tag,cssClass=null)=>{const span=document.createElement("span");return span.classList.add("tag"),cssClass&&span.classList.add(`tag_${cssClass}`),span.innerText=tag.label,tag.name&&(span.dataset.slug=tag.name),tag.description&&(span.dataset.tooltip=tag.description),span},"toTagElement"),traits=uniqBy(context.traits?.map(trait=>(trait.label=game.i18n.localize(trait.label),trait))??[],t=>t.name).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang)).map(t=>toTagElement(t))??[],{item}=context,itemTraits=item?.isOfType("weapon","melee")&&context.type!=="saving-throw"?Array.from(item.traits).map(t=>{const obj=traitSlugToObject(t,CONFIG.PF2E.npcAttackTraits);return obj.label=game.i18n.localize(obj.label),obj}).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang)).map(t=>toTagElement(t,"alt")):[],properties=(()=>{const range=item?.isOfType("action","weapon")?item.range:null,label=createActionRangeLabel(range);if(label&&(range?.increment||range?.max)){const slug=range.increment?`range-increment-${range.increment}`:`range-${range.max}`;return[toTagElement({name:slug,label,description:"PF2E.Item.Weapon.RangeIncrementN.Hint"},"secondary")]}else return[]})(),traitsAndProperties=createHTMLElement("div",{classes:["tags","traits"],dataset:{tooltipClass:"pf2e"}});if(itemTraits.length===0&&properties.length===0)traitsAndProperties.append(...traits);else{const verticalBar=document.createElement("hr");verticalBar.className="vr",traitsAndProperties.append(...[traits,verticalBar,itemTraits,properties].flat())}const modifiers=check.modifiers.filter(m=>m.enabled).map(modifier=>{const sign=modifier.modifier<0?"":"+",label=`${modifier.label} ${sign}${modifier.modifier}`;return toTagElement({name:modifier.slug,label},"transparent")}),tagsFromOptions=extraTags.map(t=>toTagElement({label:game.i18n.localize(t)},"transparent")),modifiersAndExtras=createHTMLElement("div",{classes:["tags","modifiers"],children:[...modifiers,...tagsFromOptions]});return compact([traitsAndProperties.childElementCount>0?traitsAndProperties:null,document.createElement("hr"),modifiersAndExtras])},"#createTagFlavor"),_createResultFlavor=new WeakSet,createResultFlavor_fn=__name2(async function({degree,target}){if(!degree)return null;const{dc}=degree,customLabel=!!dc.label&&Number.isInteger(dc.value)&&!dc.label.includes("{dc}")&&dc.label?`${game.i18n.localize(dc.label)}: {dc}`:dc.label??null,targetActor=await(async()=>{if(!target?.actor)return null;if(target.actor instanceof ActorPF2e)return target.actor;const maybeActor=await fromUuid(target.actor);return maybeActor instanceof ActorPF2e?maybeActor:maybeActor instanceof TokenDocumentPF2e?maybeActor.actor:null})(),targetData=await(async()=>{if(!target)return null;const token=await(async()=>target.token?target.token instanceof TokenDocumentPF2e?target.token:targetActor?.token?targetActor.token:fromUuid(target.token):null)(),canSeeName=(token??new TokenDocumentPF2e(targetActor?.prototypeToken.toObject()??{})).playersCanSeeName||!game.settings.get("pf2e","metagame_tokenSetsNameVisibility");return{name:token?.name??targetActor?.name??"",visible:!!canSeeName}})(),{checkDCs}=CONFIG.PF2E,dcData=(()=>{const dcSlug=dc.slug??(dc.statistic instanceof StatisticDifficultyClass?dc.statistic.parent.slug:null),dcType=game.i18n.localize(dc.label?.trim()||game.i18n.localize(objectHasKey(checkDCs.Specific,dcSlug)?checkDCs.Specific[dcSlug]:checkDCs.Unspecific)),circumstances=dc.statistic instanceof StatisticDifficultyClass?dc.statistic.modifiers.filter(m=>m.enabled&&m.type==="circumstance"):[],preadjustedDC=circumstances.length>0&&dc.statistic?dc.value-circumstances.reduce((total,c)=>total+c.modifier,0):dc.value??null,visible=targetActor?.hasPlayerOwner||dc.visible||game.settings.get("pf2e","metagame_showDC");if(typeof preadjustedDC!="number"||circumstances.length===0){const labelKey=game.i18n.localize(targetData?checkDCs.Label.WithTarget:customLabel??checkDCs.Label.NoTarget);return{markup:game.i18n.format(labelKey,{dcType,dc:dc.value,target:targetData?.name??null}),visible}}const adjustment={preadjusted:preadjustedDC,direction:preadjustedDCdc.value?"decreased":"no-change",circumstances:circumstances.map(c=>({label:c.label,value:c.modifier}))},translation=adjustment.direction==="no-change"?checkDCs.Label.NoChangeTarget:checkDCs.Label.AdjustedTarget;return{markup:game.i18n.format(translation,{target:targetData?.name??game.user.name,dcType,preadjusted:preadjustedDC,adjusted:dc.value}),visible,adjustment}})(),resultData=(()=>{const offset={value:new Intl.NumberFormat(game.i18n.lang,{maximumFractionDigits:0,signDisplay:"always",useGrouping:!1}).format(degree.rollTotal-dc.value),visible:dc.visible},checkOrAttack=sluggify(dc.scope??"Check",{camel:"bactrian"}),locPath=__name2((checkOrAttack2,dosKey)=>`PF2E.Check.Result.Degree.${checkOrAttack2}.${dosKey}`,"locPath"),unadjusted=game.i18n.localize(locPath(checkOrAttack,DEGREE_OF_SUCCESS_STRINGS[degree.unadjusted])),[adjusted,locKey]=degree.adjustment?[game.i18n.localize(locPath(checkOrAttack,DEGREE_OF_SUCCESS_STRINGS[degree.value])),"AdjustedLabel"]:[unadjusted,"Label"],markup=game.i18n.format(`PF2E.Check.Result.${locKey}`,{adjusted,unadjusted,offset:offset.value}),visible=game.settings.get("pf2e","metagame_showResults");return{markup,visible}})(),rendered=await renderTemplate("systems/pf2e/templates/chat/check/target-dc-result.hbs",{dc:dcData,result:resultData}),html=parseHTML(rendered),{convertXMLNode}=TextEditorPF2e;if(targetData&&convertXMLNode(html,"target",{visible:targetData.visible,whose:"target"}),convertXMLNode(html,"dc",{visible:dcData.visible,whose:"target"}),dcData.adjustment){const{adjustment}=dcData;convertXMLNode(html,"preadjusted",{classes:["unadjusted"]});const adjustedNode=convertXMLNode(html,"adjusted",{classes:["adjusted",adjustment.direction]});if(!adjustedNode)throw ErrorPF2e("Unexpected error processing roll template");adjustment.circumstances.length>0&&(adjustedNode.dataset.tooltip=adjustment.circumstances.map(a=>createHTMLElement("div",{children:[`${a.label}: ${signedInteger(a.value)}`]}).outerHTML).join(` -`))}if(convertXMLNode(html,"unadjusted",{visible:resultData.visible,classes:degree.adjustment?["unadjusted"]:[DEGREE_OF_SUCCESS_STRINGS[degree.value]]}),degree.adjustment){const adjustedNode=convertXMLNode(html,"adjusted",{visible:resultData.visible,classes:[DEGREE_OF_SUCCESS_STRINGS[degree.value],"adjusted"]});if(!adjustedNode)throw ErrorPF2e("Unexpected error processing roll template");adjustedNode.dataset.tooltip=degree.adjustment.label}if(convertXMLNode(html,"offset",{visible:dcData.visible,whose:"target"}),!targetData?.visible&&!dcData.visible){const targetDC=html.querySelector(".target-dc");targetDC&&(targetDC.dataset.visibility="gm"),resultData.visible||(html.dataset.visibility="gm")}return html},"#createResultFlavor"),__privateAdd(_CheckPF2e,_createTagFlavor),__privateAdd(_CheckPF2e,_createResultFlavor),__name2(_CheckPF2e,"CheckPF2e");let CheckPF2e=_CheckPF2e;const _CheckContextError=class extends Error{static{__name(this,"_CheckContextError")}constructor(message,actor,slug){super(message),this.actor=actor,this.slug=slug}};__name2(_CheckContextError,"CheckContextError");let CheckContextError=_CheckContextError;const _ActionMacroHelpers=class{static{__name(this,"_ActionMacroHelpers")}static resolveStat(stat){switch(stat){case"perception":return{checkType:"perception-check",property:"perception",stat,subtitle:"PF2E.ActionsCheck.perception"};case"unarmed":return{checkType:"attack-roll",property:"unarmed",stat,subtitle:"PF2E.ActionsCheck.unarmed"};default:return{checkType:"skill-check",property:`skills.${sluggify(stat)}`,stat,subtitle:`PF2E.ActionsCheck.${stat}`}}}static defaultCheckContext(options,data){const{checkType:type,property,stat:slug,subtitle}=this.resolveStat(data.slug),statistic=options.actor.getStatistic(data.slug)??getProperty(options.actor,property);if(!statistic){const{actor}=options,message=`Actor ${actor.name} (${actor.id}) does not have a statistic for ${slug}.`;throw new CheckContextError(message,actor,slug)}const{item,rollOptions:contextualRollOptions}=options.buildContext({actor:options.actor,item:data.item,rollOptions:[...data.rollOptions],target:options.target});return{item,modifiers:data.modifiers??[],rollOptions:contextualRollOptions,slug,statistic,subtitle,type}}static note(selector,translationPrefix,outcome,translationKey){const outcomes=game.settings.get("pf2e","metagame_showResults")?[outcome]:[];return new RollNotePF2e({selector,text:game.i18n.localize(translationKey??`${translationPrefix}.Notes.${outcome}`),outcome:outcomes})}static outcomesNote(selector,translationKey,outcomes){const visibleOutcomes=game.settings.get("pf2e","metagame_showResults")?outcomes:[];return new RollNotePF2e({selector,text:game.i18n.localize(translationKey),outcome:visibleOutcomes})}static async simpleRollActionCheck(options){const rollers=[];if(Array.isArray(options.actors)?rollers.push(...options.actors):options.actors?rollers.push(options.actors):rollers.push(...getSelectedOrOwnActors()),rollers.length===0)throw new Error(game.i18n.localize("PF2E.ActionsWarning.NoActor"));const targetData=options.target?.()??this.target();for(const actor of rollers)try{const selfToken=actor.getActiveTokens(!1,!0).shift(),{item:weapon,modifiers=[],rollOptions:combinedOptions,statistic,subtitle,type}=await options.checkContext({actor,buildContext:args=>{const combinedOptions2=compact([args.rollOptions,options.traits].flat());return combinedOptions2.push(...args.item?.getRollOptions("item")??[]),{item:args.item,rollOptions:combinedOptions2.sort(),target:args.target}},target:targetData.actor}),header=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{glyph:options.actionGlyph,subtitle,title:options.title}),actionTraits2=CONFIG.PF2E.actionTraits,traitDescriptions2=CONFIG.PF2E.traitsDescriptions,traitObjects=options.traits.map(trait=>({description:traitDescriptions2[trait],name:trait,label:actionTraits2[trait]??trait})),notes=options.extraNotes?.(statistic.slug)??[],label=await options.content?.(header)??header,title=`${game.i18n.localize(options.title)} - ${game.i18n.localize(subtitle)}`;if(statistic instanceof Statistic){const dc=__privateMethod(this,_resolveCheckDC,resolveCheckDC_fn).call(this,{unresolvedDC:options.difficultyClass});await statistic.roll({...eventToRollParams(options.event),token:selfToken,label,title,dc,extraRollNotes:notes,extraRollOptions:combinedOptions,modifiers,target:targetData.actor,traits:traitObjects,createMessage:options.createMessage,callback:(roll,outcome,message)=>{options.callback?.({actor,message,outcome,roll})}})}else{const check=new CheckModifier(label,statistic,modifiers),dc=__privateMethod(this,_resolveCheckDC,resolveCheckDC_fn).call(this,{target:targetData.actor,unresolvedDC:options.difficultyClass,fully:!0}),finalOptions=new Set(combinedOptions);ensureProficiencyOption(finalOptions,statistic.rank??-1),check.calculateTotal(finalOptions);const selfActor=actor.getContextualClone(combinedOptions.filter(o=>o.startsWith("self:"))),distance=(()=>{const reach=selfActor.isOfType("creature")&&weapon?.isOfType("weapon")?selfActor.getReach({action:"attack",weapon})??null:null;return selfToken?.object&&targetData?.token?.object?selfToken.object.distanceTo(targetData.token.object,{reach}):null})(),rangeIncrement=weapon?.isOfType("weapon")&&typeof distance=="number"?getRangeIncrement(weapon,distance):null,domains=["all",type,statistic.slug],targetInfo=targetData.token&&targetData.actor&&typeof distance=="number"?{token:targetData.token,actor:targetData.actor,distance,rangeIncrement}:null,substitutions=extractRollSubstitutions(actor.synthetics.rollSubstitutions,domains,finalOptions),dosAdjustments=extractDegreeOfSuccessAdjustments(actor.synthetics,domains);await CheckPF2e.roll(check,{actor:selfActor,token:selfToken,item:weapon,createMessage:options.createMessage,target:targetInfo,dc,type,options:finalOptions,notes:[...notes,...statistic.notes??[]],dosAdjustments,substitutions,traits:traitObjects,title},options.event,(roll,outcome,message)=>{options.callback?.({actor,message,outcome,roll})})}}catch(cce){if(cce instanceof CheckContextError){const message=game.i18n.format("PF2E.ActionsWarning.NoStatistic",{id:cce.actor.id,name:cce.actor.name,statistic:cce.slug});ui.notifications.error(message);continue}throw cce}}static target(){const target=Array.from(game.user.targets).filter(t=>t.actor?.isOfType("creature")).shift()?.document??null,targetActor=target?.actor??null;return{token:target,actor:targetActor}}static getWeaponPotencyModifier(item,selector){const slug="potency";return AutomaticBonusProgression.isEnabled(item.actor)?new ModifierPF2e({slug,type:"potency",label:"PF2E.AutomaticBonusProgression.attackPotency",modifier:item.actor.synthetics.weaponPotency["strike-attack-roll"]?.[0]?.bonus??0,adjustments:extractModifierAdjustments(item.actor.synthetics.modifierAdjustments,[selector],slug)}):item.system.runes.potency>0?new ModifierPF2e({slug,type:"item",label:"PF2E.Item.Weapon.Rune.Potency",modifier:item.system.runes.potency,adjustments:extractModifierAdjustments(item.actor.synthetics.modifierAdjustments,[selector],slug)}):null}static getApplicableEquippedWeapons(actor,trait){return actor.isOfType("character")?actor.system.actions.flatMap(s=>s.ready&&s.item.traits.has(trait)?s.item:[]):actor.itemTypes.weapon.filter(w=>w.isEquipped&&w.traits.has(trait))}};_resolveCheckDC=new WeakSet,resolveCheckDC_fn=__name2(function({unresolvedDC=null,target=null,fully=!1}){return typeof unresolvedDC=="string"?fully?target?.getStatistic(unresolvedDC)?.dc??null:{slug:unresolvedDC}:typeof unresolvedDC=="function"?unresolvedDC(target):unresolvedDC},"#resolveCheckDC"),__privateAdd(_ActionMacroHelpers,_resolveCheckDC),__name2(_ActionMacroHelpers,"ActionMacroHelpers");let ActionMacroHelpers=_ActionMacroHelpers;const _SelectItemDialog=class extends Application{static{__name(this,"_SelectItemDialog")}constructor(action2,resolve){super(),__privateAdd(this,_item,null),__privateAdd(this,_resolve2,void 0),__privateAdd(this,_action,void 0),__privateSet(this,_action,action2),__privateSet(this,_resolve2,resolve)}static get defaultOptions(){return{...super.defaultOptions,width:270}}get template(){return __privateGet(this,_action)==="craft"?"systems/pf2e/templates/system/actions/craft-target-item.hbs":"systems/pf2e/templates/system/actions/repair/select-item-dialog.hbs"}get title(){const key=sluggify(__privateGet(this,_action),{camel:"bactrian"});return game.i18n.localize(`PF2E.Actions.${key}.SelectItemDialog.Title`)}async getData(options={}){return options.classes=[`select-${__privateGet(this,_action)}-item-dialog`],{...await super.getData(options),item:__privateGet(this,_item)}}activateListeners($html){super.activateListeners($html);const html=$html[0];html.addEventListener("drop",async event=>{const json2=event.dataTransfer?.getData("text/plain");if(!json2?.startsWith("{")||!json2.endsWith("}"))return;const data=JSON.parse(json2),uuid=data.uuid??data.pf2e?.itemUuid,item=uuid?await fromUuid(uuid):null;if(__privateGet(this,_action)==="repair"&&item&&!(item?.isEmbedded&&item.isOwner))ui.notifications.error("DOCUMENT.UsePermissionWarn",{localize:!0});else if(item instanceof PhysicalItemPF2e)__privateSet(this,_item,item),this.render();else{const key=sluggify(__privateGet(this,_action),{camel:"bactrian"});ui.notifications.error(game.i18n.localize(`PF2E.Actions.${key}.Error.ItemReferenceMismatch`))}}),htmlQuery(html,`[data-event-handler=${__privateGet(this,_action)}]`)?.addEventListener("click",()=>{this.close()}),htmlQuery(html,"[data-event-handler=cancel]")?.addEventListener("click",()=>{__privateSet(this,_item,null),this.close()})}close(options){return __privateGet(this,_resolve2).call(this,__privateGet(this,_item)),super.close(options)}static async getItem(action2){return new Promise(resolve=>{new this(action2,resolve).render(!0)})}};_item=new WeakMap,_resolve2=new WeakMap,_action=new WeakMap,__name2(_SelectItemDialog,"SelectItemDialog");let SelectItemDialog=_SelectItemDialog;async function craft(options){const item=options.item??(options.uuid?await fromUuid(options.uuid):await SelectItemDialog.getItem("craft"));if(item){if(!(item instanceof PhysicalItemPF2e)){ui.notifications.warn(game.i18n.format("PF2E.Actions.Craft.Warning.NotPhysicalItem",{item:item.name??""}));return}}else{console.warn("PF2e System | No item selected to craft: aborting");return}const quantity=options.quantity??1,proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),dc=options.difficultyClass??{value:calculateDC(item.level,{proficiencyWithoutLevel}),visible:!0},free=!!options.free,slug=options?.skill??"crafting",rollOptions=["action:craft"],modifiers=options?.modifiers;ActionMacroHelpers.simpleRollActionCheck({actors:options.actors,actionGlyph:options.glyph,title:"PF2E.Actions.Craft.Title",checkContext:opts=>ActionMacroHelpers.defaultCheckContext(opts,{modifiers,rollOptions,slug}),traits:["downtime","manipulate"],event:options.event,difficultyClass:dc,extraNotes:selector=>[ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","criticalSuccess"),ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","success"),ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","failure"),ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","criticalFailure")],createMessage:!1,callback:async result=>{if(result.message instanceof ChatMessagePF2e){const message=result.message,flavor=await(async()=>["criticalSuccess","success","criticalFailure"].includes(result.outcome??"")?await renderCraftingInline(item,result.roll,quantity,result.actor,free):"")();flavor&&message.updateSource({flavor:message.flavor+flavor}),ChatMessage.create(message.toObject())}else console.error("PF2E | Unable to amend chat message with craft result.",result.message);options.callback?.(result)}}).catch(error=>{throw ui.notifications.error(error.message),error})}__name(craft,"craft"),__name2(craft,"craft");function createEmptySpellcastingEntry(actor){return new SpellcastingEntryPF2e({name:"Untitled",type:"spellcastingEntry",system:{ability:{value:"cha"},spelldc:{value:0,dc:0},tradition:{value:"arcane"},prepared:{value:"innate"}}},{actor})}__name(createEmptySpellcastingEntry,"createEmptySpellcastingEntry"),__name2(createEmptySpellcastingEntry,"createEmptySpellcastingEntry");const _SpellcastingCreateAndEditDialog=class extends FormApplication{static{__name(this,"_SpellcastingCreateAndEditDialog")}constructor(object,options){super(object instanceof ActorPF2e?createEmptySpellcastingEntry(object):object.clone({},{keepId:!0}),options),__privateAdd(this,_canSetAttribute),__publicField(this,"actor"),this.actor=object instanceof ActorPF2e?object:object.actor}static get defaultOptions(){const options=super.defaultOptions;return options.id="spellcasting-dialog",options.classes=[],options.title=game.i18n.localize("PF2E.SpellcastingSettings.Title"),options.template="systems/pf2e/templates/actors/spellcasting-dialog.hbs",options.width=350,options.submitOnChange=!0,options.closeOnSubmit=!1,options}async getData(){const{actor}=this,extraStatistics=actor.synthetics.statistics.values(),classDCs=actor.isOfType("character")?Object.values(actor.system.proficiencies.classDCs).filter(cdc=>cdc.rank>0):[],selectedStatistic=actor.getStatistic(this.object.system.proficiency.slug);return{...await super.getData(),actor,system:this.object.toObject().system,statistics:[...extraStatistics,...classDCs.map(c=>({slug:c.slug,label:game.i18n.format("PF2E.Actor.Character.ClassDC.LabelSpecific",{class:c.label})}))],magicTraditions:CONFIG.PF2E.magicTraditions,spellcastingTypes:omit(CONFIG.PF2E.preparationType,["ritual"]),attributes:CONFIG.PF2E.abilities,isAttributeConfigurable:__privateMethod(this,_canSetAttribute,canSetAttribute_fn).call(this),selectedAttribute:selectedStatistic?.attribute??this.object.attribute}}async _updateObject(event,formData){const wasInnate=this.object.isInnate,inputData=expandObject(formData),system=mergeObject(inputData.system??{},{prepared:{value:this.object.system.prepared.value},ability:{value:"cha"}},{overwrite:!1});if(inputData.system=system,system.prepared.value==="innate"&&!wasInnate&&(system.ability.value="cha"),system.proficiency?.slug&&(system.ability.value=""),system?.autoHeightenLevel&&(system.autoHeightenLevel.value||=null),this.object.updateSource(inputData),this.object.reset(),event.type!=="submit"){await this.render();return}return this.updateAndClose()}async updateAndClose(){const updateData=this.object.toObject();if(this.object.isRitual&&(updateData.system.tradition.value="",updateData.system.ability.value=""),this.object.isPrepared||delete updateData.system.prepared.flexible,this.object.id===null)updateData.name=(()=>{const preparationType=game.i18n.localize(CONFIG.PF2E.preparationType[updateData.system.prepared.value])??"",magicTraditions2=CONFIG.PF2E.magicTraditions,traditionSpells=game.i18n.localize(magicTraditions2[this.object.tradition??""]);return this.object.isRitual||!traditionSpells?preparationType:game.i18n.format("PF2E.SpellCastingFormat",{preparationType,traditionSpells})})(),await this.actor.createEmbeddedDocuments("Item",[updateData]);else{const actualEntry=this.actor.spellcasting.get(this.object.id);if(!(actualEntry instanceof SpellcastingEntryPF2e))return;const system=pick(updateData.system,["prepared","tradition","ability","proficiency","autoHeightenLevel"]);await actualEntry.update({system})}this.close()}};_canSetAttribute=new WeakSet,canSetAttribute_fn=__name2(function(){const slug=this.object._source.system.proficiency.slug,baseStat=this.actor.isOfType("character")?this.actor.getStatistic(slug):null;return!slug||!!baseStat&&!baseStat.attribute},"#canSetAttribute"),__name2(_SpellcastingCreateAndEditDialog,"SpellcastingCreateAndEditDialog");let SpellcastingCreateAndEditDialog=_SpellcastingCreateAndEditDialog;async function createSpellcastingDialog(event,object){return new SpellcastingCreateAndEditDialog(object,{top:event.clientY-80,left:window.innerWidth-710,height:"auto"}).render(!0)}__name(createSpellcastingDialog,"createSpellcastingDialog"),__name2(createSpellcastingDialog,"createSpellcastingDialog");const _SpellPreparationSheet=class extends ActorSheet{static{__name(this,"_SpellPreparationSheet")}constructor(item,options){super(item.actor,options),__privateAdd(this,_getSpellFromEvent),__publicField(this,"itemRenderer",new ItemSummaryRenderer(this)),__privateAdd(this,_searchEngine,new MiniSearch({fields:["name"],idField:"id",processTerm:t=>t.length>1?t.toLocaleLowerCase(game.i18n.lang):null,searchOptions:{combineWith:"AND",prefix:!0}})),this.item=item}static get defaultOptions(){return{...super.defaultOptions,classes:["default","sheet","spellcasting-entry","preparation"],width:480,height:600,template:"systems/pf2e/templates/actors/spellcasting-prep-sheet.hbs",scrollY:[".sheet-content"],filters:[{inputSelector:"input[type=search]",contentSelector:"ol.directory-list"}],sheetConfig:!1}}get id(){return`${super.id}-spellprep-${this.item.id}`}get title(){return game.i18n.format("PF2E.Actor.Creature.SpellPreparation.Title",{actor:this.actor.name})}_getHeaderButtons(){return super._getHeaderButtons().filter(b=>b.class==="close")}async getData(){__privateGet(this,_searchEngine).removeAll();const entry=await this.item.getSheetData(),spells=Object.values(entry.spellPrepList??{}).flat().map(s=>pick$1(s.spell,["id","name"]));return __privateGet(this,_searchEngine).addAll(spells),{...await super.getData(),owner:this.actor.isOwner,entry}}activateListeners($html){super.activateListeners($html);const html=$html[0];this.itemRenderer.activateListeners(html),html.addEventListener("click",event=>{const anchor=htmlClosest(event.target,"[data-action]"),action2=anchor?.dataset.action;if(anchor&&action2)switch(action2){case"edit-spell":{__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event).sheet.render(!0);return}case"delete-spell":{__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event).delete();return}case"spell-to-chat":{__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event).toMessage(event);return}case"toggle-flexible-collection":{const spell=__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event);spell.update({"system.location.signature":!spell.system.location.signature});return}case"create-spell":{onClickCreateSpell(this.actor,{...anchor?.dataset,location:this.item.id});return}case"browse-spells":{const level=Number(anchor.dataset.level)||0;game.pf2e.compendiumBrowser.openSpellTab(this.item,level)}}})}_onSearchFilter(_event,query,_rgx,html){const matches=query.length>1?new Set(__privateGet(this,_searchEngine).search(query).map(s=>s.id)):new Set;for(const row of htmlQueryAll(html,"li[data-item-id]"))row.hidden=query.length>1&&!matches.has(row.dataset.itemId??"")}async _onDropItemCreate(itemSource){const spellSources=(Array.isArray(itemSource)?itemSource:[itemSource]).filter(source=>source.type==="spell");for(const spellSource of spellSources)spellSource.system.location.value=this.item.id;return super._onDropItemCreate(spellSources)}async _onSortItem(event,itemData){if(itemData.type!=="spell")return[];const spell=this.actor.items.get(itemData._id);return itemData.system.location.value!==this.item.id&&spell?.isOfType("spell")?[await this.item.spells?.addSpell(spell)??[]].flat():super._onSortItem(event,itemData)}async _renderInner(data,options){return this.itemRenderer.saveAndRestoreState(()=>super._renderInner(data,options))}};_searchEngine=new WeakMap,_getSpellFromEvent=new WeakSet,getSpellFromEvent_fn=__name2(function(event){const itemId=htmlClosest(event.target,"li[data-item-id]")?.dataset.itemId,item=this.actor.items.get(itemId,{strict:!0});if(!item.isOfType("spell"))throw ErrorPF2e("Unexpected item type");return item},"#getSpellFromEvent"),__name2(_SpellPreparationSheet,"SpellPreparationSheet");let SpellPreparationSheet=_SpellPreparationSheet;const _CreatureSheetPF2e=class extends ActorSheetPF2e{static{__name(this,"_CreatureSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_onConfigureActor),__privateAdd(this,_onToggleSignatureSpell),__privateAdd(this,_onClickBrowseActions),__privateAdd(this,_onClickBrowseSpellCompendia)}async getData(options){const sheetData=await super.getData(options),{actor}=this;if(sheetData.data.saves)for(const key of["fortitude","reflex","will"]){const save=sheetData.data.saves[key];save.icon=this.getProficiencyIcon(save.rank),save.hover=CONFIG.PF2E.proficiencyLevels[save.rank],save.label=CONFIG.PF2E.saves[key]}if(sheetData.data.attributes!==void 0&&(sheetData.data.attributes.perception.icon=this.getProficiencyIcon(sheetData.data.attributes.perception.rank),sheetData.data.attributes.perception.hover=CONFIG.PF2E.proficiencyLevels[sheetData.data.attributes.perception.rank]),sheetData.data.abilities)for(const key of ATTRIBUTE_ABBREVIATIONS)sheetData.data.abilities[key].label=CONFIG.PF2E.abilities[key];if(sheetData.data.skills){const skills=sheetData.data.skills;for(const[key,skill]of Object.entries(skills)){const label=objectHasKey(CONFIG.PF2E.skills,key)?CONFIG.PF2E.skills[key]:null;skill.icon=this.getProficiencyIcon(skill.rank??0),skill.hover=CONFIG.PF2E.proficiencyLevels[skill.rank??0],skill.label=skill.label??label??""}}return{...sheetData,languages:createSheetTags(CONFIG.PF2E.languages,actor.system.traits.languages),abilities:CONFIG.PF2E.abilities,actorSizes:CONFIG.PF2E.actorSizes,alignments:deepClone(CONFIG.PF2E.alignments),rarity:CONFIG.PF2E.rarityTraits,frequencies:CONFIG.PF2E.frequencies,attitude:CONFIG.PF2E.attitude,pfsFactions:CONFIG.PF2E.pfsFactions,dying:{maxed:actor.attributes.dying.value>=actor.attributes.dying.max,remainingDying:Math.max(actor.attributes.dying.max-actor.attributes.dying.value),remainingWounded:Math.max(actor.attributes.wounded.max-actor.attributes.wounded.value)}}}openSpellPreparationSheet(entryId){const entry=this.actor.items.get(entryId);if(entry?.isOfType("spellcastingEntry")&&entry.isPrepared){const offset=this.element.find(`.item-container[data-container-id="${entry.id}"] .prepared-toggle`).offset()??{left:0,top:0};new SpellPreparationSheet(entry,{top:offset.top-60,left:offset.left+200}).render(!0)}}async prepareSpellcasting(){return(await Promise.all(this.actor.spellcasting.map(async entry=>entry.getSheetData()))).sort((a,b)=>a.sort-b.sort)}getProficiencyIcon(level){return[...Array(level)].map(()=>fontAwesomeIcon("check-circle").outerHTML).join("")}activateListeners($html){super.activateListeners($html);const html=$html[0],carryMenuListener=__name2(event=>{if(!(event.currentTarget instanceof HTMLElement))throw ErrorPF2e("Unexpected error retrieving carry-type link");const menu=event.currentTarget,toggle=menu.nextElementSibling;toggle?.classList.contains("carry-type-hover")&&$(toggle).tooltipster("close");const carryType=menu.dataset.carryType;if(!setHasElement(ITEM_CARRY_TYPES,carryType))throw ErrorPF2e("Unexpected error retrieving requested carry type");const itemId=htmlClosest(menu,"[data-item-id]")?.dataset.itemId,item=this.actor.inventory.get(itemId,{strict:!0}),handsHeld=Number(menu.dataset.handsHeld)||0,inSlot=menu.dataset.inSlot==="true",current=item.system.equipped;(carryType!==current.carryType||inSlot!==current.inSlot||carryType==="held"&&handsHeld!==current.handsHeld)&&this.actor.adjustCarryType(item,{carryType,handsHeld,inSlot})},"carryMenuListener");for(const carryTypeMenu of htmlQueryAll(html,".tab.inventory a[data-carry-type]"))carryTypeMenu.addEventListener("click",carryMenuListener);const selectors="input[data-item-id][data-item-property], select[data-item-id][data-item-property]";$html.find(selectors).on("change",event=>{const $target=$(event.target),{itemId,itemProperty}=event.target.dataset;if(!itemId||!itemProperty)return;const value=(()=>{const value2=$(event.target).val();if(typeof value2>"u"||value2===null)return value2;switch($target.attr("data-dtype")??($target.attr("type")==="checkbox"?"Boolean":["number","range"].includes($target.attr("type")??"")?"Number":"String")){case"Boolean":return typeof value2=="boolean"?value2:value2==="true";case"Number":return Number(value2);case"String":return String(value2);default:return value2}})();this.actor.updateEmbeddedDocuments("Item",[{_id:itemId,[itemProperty]:value}])}),$html.find(".dots.dying, .dots.wounded").on("click contextmenu",event=>{const condition=Array.from(event.delegateTarget.classList).find(className=>["dying","wounded"].includes(className));if(condition){const currentMax=this.actor.system.attributes[condition]?.max;event.type==="click"&¤tMax?this.actor.increaseCondition(condition,{max:currentMax}):event.type==="contextmenu"&&this.actor.decreaseCondition(condition)}}),$html.find("[data-action=recovery-check]").tooltipster({theme:"crb-hover"}).filter(":not(.disabled)").on("click",event=>{this.actor.rollRecovery(event)}),$html.find(".skill-name.rollable, .skill-score.rollable").on("click",event=>{const skill=event.currentTarget.closest("[data-skill]")?.dataset.skill??"",key=objectHasKey(SKILL_DICTIONARY,skill)?SKILL_DICTIONARY[skill]:skill,rollParams=eventToRollParams(event);this.actor.skills[key]?.check.roll(rollParams)});for(const element of htmlQueryAll(html,"a[data-action=perception-check]"))element.addEventListener("click",event=>{const extraRollOptions=element.dataset.secret?["secret"]:[];this.actor.perception.roll({...eventToRollParams(event),extraRollOptions})});for(const section of htmlQueryAll(html,".tab.spellcasting, .tab.spells")??[]){for(const element of htmlQueryAll(section,"[data-action=spellcasting-create]")??[])element.addEventListener("click",event=>{createSpellcastingDialog(event,this.actor)});for(const element of htmlQueryAll(section,"[data-action=spellcasting-edit]")??[])element.addEventListener("click",event=>{const containerId=htmlClosest(event.target,"[data-item-id]")?.dataset.itemId,entry=this.actor.items.get(containerId,{strict:!0});entry.isOfType("spellcastingEntry")&&createSpellcastingDialog(event,entry)});for(const element of htmlQueryAll(section,"[data-action=spellcasting-remove]")??[])element.addEventListener("click",async event=>{const itemId=htmlClosest(event.currentTarget,"[data-item-id]")?.dataset.itemId,item=this.actor.items.get(itemId,{strict:!0}),title=game.i18n.localize("PF2E.DeleteSpellcastEntryTitle"),content=await renderTemplate("systems/pf2e/templates/actors/delete-spellcasting-dialog.hbs");await Dialog.confirm({title,content})&&item.delete()})}$html.find(".prepared-toggle").on("click",async event=>{event.preventDefault();const itemId=$(event.currentTarget).parents(".item-container").attr("data-container-id")??"";this.openSpellPreparationSheet(itemId)});for(const toggle of htmlQueryAll(html,".slotless-level-toggle"))toggle.addEventListener("click",async()=>{const itemId=htmlClosest(toggle,".item-container")?.dataset.containerId??"",spellcastingEntry=this.actor.items.get(itemId);if(!spellcastingEntry?.isOfType("spellcastingEntry"))throw ErrorPF2e("Tried to toggle visibility of slotless levels on a non-spellcasting entry");await spellcastingEntry.update({"system.showSlotlessLevels.value":!spellcastingEntry.showSlotlessLevels})});for(const button of htmlQueryAll(html,"button[data-action=cast-spell]"))button.addEventListener("click",()=>{const spellEl=htmlClosest(button,".item"),{itemId,slotLevel,slotId,entryId}=spellEl?.dataset??{},collection=this.actor.spellcasting.collections.get(entryId,{strict:!0}),spell=collection.get(itemId,{strict:!0});collection.entry.cast(spell,{slot:Number(slotId??NaN),level:Number(slotLevel??NaN)})});$html.find(".spell-slots-increment-reset").on("click",event=>{const target=$(event.currentTarget),itemId=target.data().itemId,itemLevel=target.data().level,item=this.actor.items.get(itemId);if(item?.isOfType("spellcastingEntry")){const{system}=item.toObject();if(!system.slots)return;const slotLevel=goesToEleven(itemLevel)?`slot${itemLevel}`:"slot0";system.slots[slotLevel].value=system.slots[slotLevel].max,item.update({system})}else if(item?.isOfType("spell")){const max=item.system.location.uses?.max;if(!max)return;item.update({"system.location.uses.value":max})}}),$html.find(".focus-pool").on("change",event=>{this.actor.update({"system.resources.focus.max":$(event.target).val()})}),$html.find(".toggle-signature-spell").on("click",event=>{__privateMethod(this,_onToggleSignatureSpell,onToggleSignatureSpell_fn).call(this,event)});for(const button of htmlQueryAll(html,".action-browse"))button.addEventListener("click",()=>__privateMethod(this,_onClickBrowseActions,onClickBrowseActions_fn).call(this,button));for(const button of htmlQueryAll(html,".spell-browse"))button.addEventListener("click",()=>__privateMethod(this,_onClickBrowseSpellCompendia,onClickBrowseSpellCompendia_fn).call(this,button))}async _onSortItem(event,itemSource){const dropItemEl=htmlClosest(event.target,".item"),dropContainerEl=htmlClosest(event.target,".item-container"),dropSlotType=dropItemEl?.dataset.itemType,dropContainerType=dropContainerEl?.dataset.containerType,item=this.actor.items.get(itemSource._id);if(!item)return[];if(item.isOfType("spell")){if(!(dropItemEl&&dropContainerEl))return[];const entryId=dropContainerEl.dataset.containerId,collection=this.actor.spellcasting.collections.get(entryId,{strict:!0});if(dropSlotType==="spellLevel"){const{level}=dropItemEl.dataset,spell=await collection.addSpell(item,{slotLevel:Number(level)});return this.openSpellPreparationSheet(collection.id),[spell??[]].flat()}else if(dropItemEl.dataset.slotId){const dropId=Number(dropItemEl.dataset.slotId),slotRank=Number(dropItemEl.dataset.slotLevel);if(Number.isInteger(dropId)&&Number.isInteger(slotRank)){const allocated=await collection.prepareSpell(item,slotRank,dropId);if(allocated instanceof SpellcastingEntryPF2e)return[allocated]}}else if(dropSlotType==="spell"){const dropId=dropItemEl.dataset.itemId??"",target=this.actor.items.get(dropId);if(target?.isOfType("spell")&&item.id!==dropId){const sourceLocation=item.system.location.value,testSibling=__name2((item2,test)=>item2.isCantrip!==test.isCantrip?!1:!!(item2.isCantrip&&test.isCantrip||item2.isFocusSpell&&test.isFocusSpell||item2.rank===test.rank),"testSibling");if(sourceLocation===entryId&&testSibling(item,target)){const siblings=collection.filter(s=>testSibling(item,s));return await item.sortRelative({target,siblings}),[target]}else{const spell=await collection.addSpell(item,{slotLevel:target.rank});return this.openSpellPreparationSheet(collection.id),[spell??[]].flat()}}}else if(dropContainerType==="spellcastingEntry"){CONFIG.debug.hooks&&console.debug("PF2e System | ***** spell from same actor dropped on a spellcasting entry *****");const dropId=htmlClosest(event.target,".item-container")?.dataset.containerId;return dropId?[await item.update({"system.location.value":dropId})]:[]}}else if(item.isOfType("spellcastingEntry")&&dropContainerType==="spellcastingEntry"){const sourceId=item.id,dropId=dropContainerEl?.dataset.containerId??"",source=this.actor.items.get(sourceId),target=this.actor.items.get(dropId);if(source?.isOfType("spellcastingEntry")&&target?.isOfType("spellcastingEntry")&&source.id!==target.id){const siblings=this.actor.itemTypes.spellcastingEntry;return await source.sortRelative({target,siblings}),[source]}}return super._onSortItem(event,itemSource)}async _handleDroppedItem(event,item,data){const containerEl=htmlClosest(event.target,".item-container[data-container-type=spellcastingEntry]");if(containerEl&&item.isOfType("spell")&&!item.isRitual){const entryId=containerEl.dataset.containerId,collection=this.actor.spellcasting.collections.get(entryId,{strict:!0}),slotLevel=Number(htmlClosest(event.target,"[data-slot-level]")?.dataset.slotLevel??0);return this.openSpellPreparationSheet(collection.id),[await collection.addSpell(item,{slotLevel:Math.max(slotLevel,item.baseRank)})??[]].flat()}return super._handleDroppedItem(event,item,data)}_getHeaderButtons(){const buttons=super._getHeaderButtons();if(!this.actor.isOfType("character","npc"))return buttons;if(this.isEditable){const index=buttons.findIndex(b=>b.class==="close");buttons.splice(index,0,{label:"Configure",class:"configure-creature",icon:"fa-solid fa-user-gear",onclick:()=>__privateMethod(this,_onConfigureActor,onConfigureActor_fn).call(this)})}return buttons}async _updateObject(event,formData){const heldShield=this.actor.heldShield;return heldShield&&typeof formData["system.attributes.shield.hp.value"]=="number"&&await heldShield.update({"system.hp.value":formData["system.attributes.shield.hp.value"]}),delete formData["system.attributes.shield.hp.value"],super._updateObject(event,formData)}};_onConfigureActor=new WeakSet,onConfigureActor_fn=__name2(function(){this.actorConfigClass&&new this.actorConfigClass(this.actor).render(!0)},"#onConfigureActor"),_onToggleSignatureSpell=new WeakSet,onToggleSignatureSpell_fn=__name2(function(event){const{itemId}=event.target.closest(".item").dataset,spell=this.actor.items.get(itemId);spell instanceof SpellPF2e&&spell.update({"system.location.signature":!spell.system.location.signature})},"#onToggleSignatureSpell"),_onClickBrowseActions=new WeakSet,onClickBrowseActions_fn=__name2(function(button){const types=(button.dataset.actionType||"").split(","),traits=(button.dataset.actionTrait||"").split(","),categories=(button.dataset.actionCategory||"").split(",");game.pf2e.compendiumBrowser.openActionTab({types,traits,categories})},"#onClickBrowseActions"),_onClickBrowseSpellCompendia=new WeakSet,onClickBrowseSpellCompendia_fn=__name2(function(button){const level=Number(button.dataset.level??null),spellcastingIndex=htmlClosest(button,"[data-container-id]")?.dataset.containerId??"",entry=this.actor.spellcasting.get(spellcastingIndex);entry&&game.pf2e.compendiumBrowser.openSpellTab(entry,level)},"#onClickBrowseSpellCompendia"),__name2(_CreatureSheetPF2e,"CreatureSheetPF2e");let CreatureSheetPF2e=_CreatureSheetPF2e;async function add(actor,event){const weaponGroups2=CONFIG.PF2E.weaponGroups,baseWeapons=CONFIG.PF2E.baseWeaponTypes,template=await renderTemplate("systems/pf2e/templates/actors/add-combat-proficiency-dialog.hbs",{message:game.i18n.localize("PF2E.AddCombatProficiency.Message"),weaponGroups:weaponGroups2,baseWeapons});new Dialog({title:game.i18n.localize("PF2E.AddCombatProficiency.Title"),content:template,buttons:{add:{icon:fontAwesomeIcon("check").outerHTML,label:game.i18n.localize("PF2E.AddShortLabel"),callback:async $dialog=>{const selection=$dialog.find("select[name=proficiency]").val();if(typeof selection=="string"&&selection){const proficiencyKey=selection in weaponGroups2?`weapon-group-${selection}`:`weapon-base-${selection}`;await actor.addAttackProficiency(proficiencyKey);const tab=htmlClosest(event.currentTarget,".tab.skills");if(tab){const $tab=$(tab);$tab.animate({scrollTop:$tab.height()},"slow")}}}},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:game.i18n.localize("Cancel")}},default:"cancel"}).render(!0)}__name(add,"add"),__name2(add,"add");function remove(actor,event){const weaponGroups2=CONFIG.PF2E.weaponGroups,baseWeapons=CONFIG.PF2E.baseWeaponTypes,key=htmlClosest(event.currentTarget,"li.skill.custom")?.dataset.skill??"",translationKey=key?.replace(/^weapon-(?:base|group)-/,"")??"",name2=objectHasKey(weaponGroups2,translationKey)?game.i18n.localize(weaponGroups2[translationKey]):baseWeapons[translationKey],localize=localizer("PF2E.RemoveCombatProficiency"),message=localize("Message",{proficiency:name2});Dialog.confirm({title:localize("Title"),content:`

${message}

`,defaultYes:!1,yes:()=>{key in(actor._source.system.proficiencies?.attacks??{})&&actor.update({[`system.proficiencies.attacks.-=${key}`]:null})}})}__name(remove,"remove"),__name2(remove,"remove");const ManageAttackProficiencies={add,remove},_AttributeBuilder=class extends Application{static{__name(this,"_AttributeBuilder")}constructor(actor){super(),__privateAdd(this,_createButtons),__privateAdd(this,_calculateAncestryBoosts),__privateAdd(this,_calculateBackgroundBoosts),__privateAdd(this,_calculateLeveledBoosts),__privateAdd(this,_getBoostFlawLabels),__publicField(this,"actor"),__privateAdd(this,_abpEnabled,void 0),this.actor=actor,__privateSet(this,_abpEnabled,game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(actor)),actor.apps[this.appId]=this}static get defaultOptions(){return{...super.defaultOptions,classes:["attribute-builder"],title:game.i18n.localize("PF2E.Actor.Character.Attribute.Boosts"),template:"systems/pf2e/templates/actors/character/attribute-builder.hbs",width:"auto",height:"auto"}}get id(){return`attribute-builder-${this.actor.uuid}`}async getData(options={}){const{actor}=this,build=actor.system.build.attributes;return{...await super.getData(options),actor,attributes:CONFIG.PF2E.abilities,manual:build.manual,ancestry:actor.ancestry,background:actor.background,class:actor.class,attributeModifiers:mapValues$1(actor.abilities,(value,attribute)=>{const mod=build.manual?actor._source.system.abilities?.[attribute].mod??0:value.base;return{mod:addSign(Number(mod.toFixed(1))),label:CONFIG.PF2E.abilities[attribute]}}),manualKeyAttribute:actor.keyAttribute,keyOptions:build.keyOptions,...__privateMethod(this,_calculateAncestryBoosts,calculateAncestryBoosts_fn).call(this),backgroundBoosts:__privateMethod(this,_calculateBackgroundBoosts,calculateBackgroundBoosts_fn).call(this),legacyFlaws:actor.ancestry?.system.voluntary?.boost!==void 0,levelBoosts:__privateMethod(this,_calculateLeveledBoosts,calculateLeveledBoosts_fn).call(this)}}async _render(force,options){return maintainFocusInRender(this,()=>super._render(force,options))}async close(options={}){return delete this.actor.apps[this.appId],super.close(options)}activateListeners($html){super.activateListeners($html);const html=$html[0],{actor}=this;$html.find("[data-tooltip-content]").tooltipster({contentAsHTML:!0,arrow:!1,debug:!1,interactive:!0,maxWidth:350,side:["bottom"],theme:"crb-hover"});for(const input of htmlQueryAll(html,"input[type=text], input[type=number]"))input.addEventListener("focus",()=>{input.type==="text"&&input.dataset.dtype==="Number"&&(input.value=input.value.replace(/[^-.0-9]/g,""),input.type="number"),input.select()}),input.addEventListener("blur",()=>{if(input.type==="number"&&input.dataset.dtype==="Number"){input.type="text";const newValue=Math.clamped(Number(input.value)||0,-5,10);input.value=addSign(newValue);const propertyPath=input.dataset.property;if(!propertyPath)throw ErrorPF2e("Empty property path");actor.update({[propertyPath]:newValue})}});htmlQuery(html,"[data-action=toggle-alternate-ancestry-boosts]")?.addEventListener("click",()=>{actor.ancestry&&(actor.ancestry.system.alternateAncestryBoosts?actor.ancestry.update({"system.-=alternateAncestryBoosts":null}):actor.ancestry.update({"system.alternateAncestryBoosts":[]}))}),htmlQuery(html,"[data-action=toggle-legacy-voluntary-flaw]")?.addEventListener("click",async()=>{const ancestry=actor.ancestry;if(!ancestry)return;const voluntary=ancestry.system.voluntary;if(voluntary?.boost!==void 0){const flaws=uniq(voluntary.flaws);ancestry.update({system:{voluntary:{"-=boost":null,flaws}}})}else{const flaws=voluntary?.flaws.slice(0,2)??[];ancestry.update({system:{voluntary:{boost:null,flaws}}})}});for(const button of htmlQueryAll(html,"[data-section=ancestry] .boost"))button.addEventListener("click",async()=>{const ancestry=actor.ancestry,attribute=button.dataset.attribute;if(!ancestry||!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))return;if(ancestry.system.alternateAncestryBoosts){const existingBoosts=ancestry.system.alternateAncestryBoosts,boosts=existingBoosts.includes(attribute)?existingBoosts.filter(b=>b!==attribute):[...existingBoosts,attribute].slice(0,2);ancestry.update({"system.alternateAncestryBoosts":boosts});return}const boostToRemove=Object.entries(ancestry.system.boosts??{}).find(([,b])=>b.selected===attribute);if(boostToRemove){await ancestry.update({[`system.boosts.${boostToRemove[0]}.selected`]:null});return}const freeBoost=Object.entries(ancestry.system.boosts??{}).find(([,b])=>!b.selected&&b.value.length>0);freeBoost&&await ancestry.update({[`system.boosts.${freeBoost[0]}.selected`]:attribute})});for(const button of htmlQueryAll(html,"[data-section=voluntary] .boost-button"))button.addEventListener("click",()=>{const ancestry=actor.ancestry,attribute=button.dataset.attribute;if(!ancestry||!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))return;const removing=button.classList.contains("selected");if(button.dataset.action==="flaw"){const{flaws,boost}=ancestry.system.voluntary??{flaws:[]},alreadyHasFlaw=flaws.includes(attribute),isLegacy=boost!==void 0;if(removing&&alreadyHasFlaw&&!boost){flaws.splice(flaws.indexOf(attribute),1),ancestry.update({system:{voluntary:{flaws}}});return}const canDoubleFlaw=ancestry.lockedBoosts.includes(attribute)&&isLegacy,maxFlaws=isLegacy?2:6;flaws.length{const attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))return;const boostToRemove=Object.entries(actor.background?.system.boosts??{}).find(([,b])=>b.selected===attribute);if(boostToRemove){actor.background?.update({[`system.boosts.${boostToRemove[0]}.selected`]:null});return}const freeBoost=Object.entries(actor.background?.system.boosts??{}).find(([,b])=>!b.selected&&b.value.length>0);freeBoost&&actor.background?.update({[`system.boosts.${freeBoost[0]}.selected`]:attribute})});for(const button of htmlQueryAll(html,"button[data-action=class-key-attribute]"))button.addEventListener("click",()=>{const attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))throw ErrorPF2e(`Unrecognized attribute abbreviation: ${attribute}`);actor.system.build.attributes.manual?actor.update({"system.details.keyability.value":attribute}):actor.class?.update({"system.keyAbility.selected":attribute})});for(const button of htmlQueryAll(html,"[data-level] .boost"))button.addEventListener("click",()=>{const level=Number(htmlClosest(button,"[data-level]")?.dataset.level),attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute)||!tupleHasValue([1,5,10,15,20],level))return;const buildSource=mergeObject(actor.toObject().system.build??{},{attributes:{boosts:{}}}),boosts=buildSource.attributes.boosts[level]??=[];boosts.includes(attribute)?boosts.splice(boosts.indexOf(attribute),1):boosts.push(attribute),actor.update({"system.build":buildSource})});for(const button of htmlQueryAll(html,"button[data-action=apex]"))button.addEventListener("click",()=>{const attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))throw ErrorPF2e(`Unrecognized attribute abbreviation: ${attribute}`);const current=this.actor.system.build.attributes.apex;actor.update({"system.build.attributes.apex":__privateGet(this,_abpEnabled)&&attribute!==current?attribute:null})});htmlQuery(html,"input[name=toggle-manual-mode]")?.addEventListener("click",()=>{actor.toggleAttributeManagement()}),htmlQuery(html,"button[data-action=close]")?.addEventListener("click",()=>this.close())}};_abpEnabled=new WeakMap,_createButtons=new WeakSet,createButtons_fn=__name2(function(){return Array.from(ATTRIBUTE_ABBREVIATIONS).reduce((accumulated,attribute)=>(accumulated[attribute]={ability:attribute},accumulated),{})},"#createButtons"),_calculateAncestryBoosts=new WeakSet,calculateAncestryBoosts_fn=__name2(function(){const{actor}=this,ancestry=actor.ancestry;if(!ancestry)return{ancestryBoosts:null,voluntaryFlaws:null};const buttons=__privateMethod(this,_createButtons,createButtons_fn).call(this),[maxBoosts,selectedBoosts]=(()=>{const alternateAncestryBoosts=ancestry.system.alternateAncestryBoosts;if(alternateAncestryBoosts)return[2,alternateAncestryBoosts];const baseBoosts=Object.values(ancestry.system.boosts),selectedBoosts2=baseBoosts.map(b=>b.selected).filter(b=>!!b);return[baseBoosts.filter(b=>b.value.length>0||b.selected).length,selectedBoosts2]})(),build=actor.system.build.attributes,netBoosted=difference(build.boosts.ancestry,build.flaws.ancestry),remaining=maxBoosts-selectedBoosts.length,lockedBoosts=ancestry.system.alternateAncestryBoosts?null:ancestry.lockedBoosts,lockedFlaws=ancestry.system.alternateAncestryBoosts?null:ancestry.lockedFlaws;for(const attribute of ATTRIBUTE_ABBREVIATIONS){const state=buttons[attribute],selected=selectedBoosts.includes(attribute);state.boost={selected,locked:lockedBoosts?.includes(attribute),disabled:selected?!1:!remaining||netBoosted.includes(attribute)},lockedFlaws?.includes(attribute)&&(state.flaw={selected:!0,locked:!0})}const voluntaryFlaws=(()=>{const voluntary=ancestry.system.voluntary??{flaws:[]},legacyFlaws=voluntary.boost!==void 0,flawsComplete=legacyFlaws&&voluntary.flaws.length>=2,buttons2=__privateMethod(this,_createButtons,createButtons_fn).call(this);for(const attribute of ATTRIBUTE_ABBREVIATIONS){const state=buttons2[attribute],numFlaws=voluntary.flaws.filter(f=>f===attribute).length;if(state.flaw={selected:numFlaws>0,disabled:!numFlaws&&flawsComplete},legacyFlaws){lockedBoosts?.includes(attribute)&&(state.flaw.second={selected:numFlaws>1,disabled:!numFlaws||numFlaws<2&&flawsComplete});const boosted=voluntary.boost===attribute;state.boost={selected:boosted,disabled:boosted?!1:!flawsComplete||!!voluntary.boost||netBoosted.includes(attribute)}}}return{remaining:voluntary&&legacyFlaws&&!voluntary.boost?1:0,buttons:buttons2,voluntaryBoostsRemaining:0,labels:__privateMethod(this,_getBoostFlawLabels,getBoostFlawLabels_fn).call(this,ancestry.system.flaws)}})();return{ancestryBoosts:{buttons,remaining,labels:__privateMethod(this,_getBoostFlawLabels,getBoostFlawLabels_fn).call(this,ancestry.system.boosts),alternate:!!ancestry.system.alternateAncestryBoosts},voluntaryFlaws}},"#calculateAncestryBoosts"),_calculateBackgroundBoosts=new WeakSet,calculateBackgroundBoosts_fn=__name2(function(){const{actor}=this;if(!actor.background)return null;const buttons=__privateMethod(this,_createButtons,createButtons_fn).call(this),boosts=Object.values(actor.background.system.boosts).filter(b=>b.value.length>0),selectedBoosts=boosts.map(b=>b.selected).filter(b=>!!b),unselectedRestricted=boosts.filter(b=>b.value.length<6&&!b.selected).flatMap(b=>b.value),remaining=boosts.length-selectedBoosts.length;for(const attribute of ATTRIBUTE_ABBREVIATIONS){const selected=selectedBoosts.includes(attribute),mightBeForced=unselectedRestricted.includes(attribute);buttons[attribute].boost={selected,disabled:!(selected||remaining)||!!unselectedRestricted.length&&!mightBeForced}}const labels=__privateMethod(this,_getBoostFlawLabels,getBoostFlawLabels_fn).call(this,actor.background.system.boosts),tooltip=(()=>{const boosts2=actor.background?.system.boosts??{};if(Object.values(boosts2).length===2&&Object.values(boosts2)[0].value.length===2&&Object.values(boosts2)[1].value.length===6){const choices=Object.values(boosts2)[0].value.map(b=>game.i18n.localize(CONFIG.PF2E.abilities[b]));return game.i18n.format("PF2E.Actor.Character.AttributeBuilder.BackgroundBoostDescription",{a:choices[0],b:choices[1]})}else return null})();return{buttons,remaining,labels,tooltip}},"#calculateBackgroundBoosts"),_calculateLeveledBoosts=new WeakSet,calculateLeveledBoosts_fn=__name2(function(){const build=this.actor.system.build.attributes,isGradual=game.settings.get("pf2e","gradualBoostsVariant"),boostIsPartial=__name2((attribute,level,isApex)=>{if(level<5||build.manual||isApex)return!1;const boosts=compact([build.boosts.ancestry.find(a=>a===attribute),build.boosts.background.find(a=>a===attribute),build.boosts.class===attribute?attribute:null,build.boosts[1].find(a=>a===attribute),level===20?build.boosts[20].find(a=>a===attribute):null,level>=15?build.boosts[15].find(a=>a===attribute):null,level>=10?build.boosts[10].find(a=>a===attribute):null,level>=5?build.boosts[5].find(a=>a===attribute):null]).length,flaws=Number(build.flaws.ancestry.some(a=>a===attribute)),netBoosts=boosts-flaws,cssClasses={0:!1,1:!0};return netBoosts>=5?cssClasses[netBoosts%2]:!1},"boostIsPartial");return[1,5,10,15,17,20].flatMap(level=>{const isApex=level===17;if(isApex&&!__privateGet(this,_abpEnabled))return[];const remaining=isApex?+!build.apex:build.allowedBoosts[level]-build.boosts[level].length,buttons=__privateMethod(this,_createButtons,createButtons_fn).call(this);for(const attribute of ATTRIBUTE_ABBREVIATIONS){const selected=isApex?build.apex===attribute:build.boosts[level].includes(attribute),partial=selected&&boostIsPartial(attribute,level,isApex);buttons[attribute].boost={selected,partial,disabled:!remaining}}const eligible=isApex?this.actor.level>=17:build.allowedBoosts[level]>0,minLevel=isGradual&&!isApex?Math.max(1,level-3):level;return{buttons,remaining,level,eligible,minLevel,isApex}})},"#calculateLeveledBoosts"),_getBoostFlawLabels=new WeakSet,getBoostFlawLabels_fn=__name2(function(boostData){return Object.values(boostData).flatMap(boosts=>boosts.value.length===6?game.i18n.localize("PF2E.AbilityFree"):boosts.value.length>0?boosts.value.map(b=>game.i18n.localize(CONFIG.PF2E.abilities[b])).join(" or "):[])},"#getBoostFlawLabels"),__name2(_AttributeBuilder,"AttributeBuilder");let AttributeBuilder=_AttributeBuilder;const _CreatureConfig=class extends DocumentSheet{static{__name(this,"_CreatureConfig")}get title(){const namespace=this.actor.isOfType("character")?"Character":"NPC";return game.i18n.localize(`PF2E.Actor.${namespace}.Configure.Title`)}get template(){return`systems/pf2e/templates/actors/${this.actor.type}/config.hbs`}get actor(){return this.object}static get defaultOptions(){const options=super.defaultOptions;return options.width=450,options}async getData(options={}){const source=this.actor._source,alliance=source.system.details?.alliance===null?"neutral":source.system.details?.alliance??"default",defaultValue=game.i18n.localize(this.actor.hasPlayerOwner?"PF2E.Actor.Creature.Alliance.Party":"PF2E.Actor.Creature.Alliance.Opposition"),allianceOptions={default:game.i18n.format("PF2E.Actor.Creature.Alliance.Default",{alliance:defaultValue}),opposition:"PF2E.Actor.Creature.Alliance.Opposition",party:"PF2E.Actor.Creature.Alliance.Party",neutral:"PF2E.Actor.Creature.Alliance.Neutral"};return{...await super.getData(options),alliances:createSheetOptions(allianceOptions,{value:[alliance]})}}async _updateObject(event,formData){const key="system.details.alliance",alliance=formData[key];if(alliance==="default")delete formData[key],formData["system.details.-=alliance"]=null;else if(alliance==="neutral")formData[key]=null;else if(!setHasElement(ALLIANCES,alliance))throw ErrorPF2e("Unrecognized alliance");return super._updateObject(event,formData)}};__name2(_CreatureConfig,"CreatureConfig");let CreatureConfig=_CreatureConfig;const _CharacterConfig=class extends CreatureConfig{static{__name(this,"_CharacterConfig")}async getData(options={}){const{showBasicUnarmed}=this.actor.flags.pf2e;return{...await super.getData(options),showBasicUnarmed}}};__name2(_CharacterConfig,"CharacterConfig");let CharacterConfig=_CharacterConfig;const _CraftingFormula=class{static{__name(this,"_CraftingFormula")}constructor(item,{dc,batchSize,deletable=!1}={}){this.item=item,this.dc=dc??calculateDC(item.level,{rarity:item.rarity,proficiencyWithoutLevel:game.settings.get("pf2e","proficiencyVariant")}),this.batchSize=Math.max(batchSize??1,this.defaultBatchSize),this.deletable=deletable}dc;batchSize;deletable;get uuid(){return this.item.uuid}get img(){return this.item.img}get name(){return this.item.name}get level(){return this.item.level}get rarity(){return this.item.rarity}get price(){return this.item.price}get cost(){return CoinsPF2e.fromPrice(this.price,this.batchSize)}get minimumBatchSize(){return STACK_DEFINITIONS[this.item.system.stackGroup??""]?.size??1}get defaultBatchSize(){const{item}=this,isMundaneAmmo=item instanceof ConsumablePF2e&&item.isAmmunition&&!item.isMagical,isConsumable=item instanceof ConsumablePF2e&&item.category!=="wand"||item instanceof WeaponPF2e&&item.baseType==="alchemical-bomb";return Math.max(this.minimumBatchSize,isMundaneAmmo?10:isConsumable?4:1)}get description(){return this.item.description}};__name2(_CraftingFormula,"CraftingFormula");let CraftingFormula=_CraftingFormula;const _CraftingEntry=class{static{__name(this,"_CraftingEntry")}constructor(actor,knownFormulas,data){__privateAdd(this,_updateRE),__publicField(this,"preparedCraftingFormulas"),__publicField(this,"preparedFormulaData"),__publicField(this,"name"),__publicField(this,"selector"),__publicField(this,"isAlchemical"),__publicField(this,"isDailyPrep"),__publicField(this,"isPrepared"),__publicField(this,"craftableItems"),__publicField(this,"maxSlots"),__publicField(this,"fieldDiscovery"),__publicField(this,"batchSize"),__publicField(this,"fieldDiscoveryBatchSize"),__publicField(this,"maxItemLevel"),__publicField(this,"parentItem"),this.selector=data.selector,this.name=data.name,this.isAlchemical=!!data.isAlchemical,this.isDailyPrep=!!data.isDailyPrep,this.isPrepared=!!data.isPrepared,this.maxSlots=data.maxSlots??0,this.maxItemLevel=data.maxItemLevel||actor.level,this.fieldDiscovery=data.fieldDiscovery?new PredicatePF2e(data.fieldDiscovery):null,this.batchSize=data.batchSize,this.fieldDiscoveryBatchSize=data.fieldDiscoveryBatchSize,this.craftableItems=new PredicatePF2e(data.craftableItems),this.preparedFormulaData=(data.preparedFormulaData||[]).map(prepData=>knownFormulas.find(formula2=>formula2.uuid===prepData.itemUUID)?prepData:null).filter(prepData=>!!prepData),this.parentItem=actor.items.get(data.parentItem,{strict:!0}),this.preparedCraftingFormulas=this.preparedFormulaData.sort((prepDataA,prepDataB)=>(prepDataA.sort??0)-(prepDataB.sort??0)).map(prepData=>{const formula=knownFormulas.find(formula2=>formula2.uuid===prepData.itemUUID);return formula?Object.assign(new CraftingFormula(formula.item),{quantity:prepData.quantity||1,expended:!!prepData.expended,isSignatureItem:!!prepData.isSignatureItem,sort:prepData.sort??0}):null}).filter(prepData=>!!prepData)}get actor(){return this.parentItem.actor}get formulas(){const formulas=this.preparedCraftingFormulas.map(formula=>({uuid:formula.uuid,img:formula.img,name:formula.name,expended:formula.expended,quantity:formula.quantity,isSignatureItem:formula.isSignatureItem}));if(this.maxSlots>0){const fill=this.maxSlots-formulas.length;if(fill>0){const nulls=new Array(fill).fill(null);return formulas.concat(nulls)}}return formulas}get reagentCost(){if(!this.isAlchemical)return 0;const fieldDiscoveryQuantity=this.preparedCraftingFormulas.filter(f=>!!this.fieldDiscovery?.test(f.item.getRollOptions("item"))||f.isSignatureItem).reduce((sum2,current)=>sum2+current.quantity,0),otherQuantity=this.preparedCraftingFormulas.filter(f=>!this.fieldDiscovery?.test(f.item.getRollOptions("item"))&&!f.isSignatureItem).reduce((sum2,current)=>sum2+current.quantity,0),fieldDiscoveryBatchSize=this.fieldDiscoveryBatchSize||3,batchSize=this.batchSize||2;return Math.floor(fieldDiscoveryQuantity/fieldDiscoveryBatchSize)+Math.ceil((fieldDiscoveryQuantity%fieldDiscoveryBatchSize+otherQuantity)/batchSize)}static isValid(data){return!!data&&!!data.name&&!!data.selector}async prepareFormula(formula){this.checkEntryRequirements(formula);const index=this.preparedFormulaData.findIndex(f=>f.itemUUID===formula.uuid);if(this.isAlchemical&&index!==-1){const formula2=this.preparedFormulaData[index];formula2.quantity?formula2.quantity+=1:formula2.quantity=2}else this.preparedFormulaData.push({itemUUID:formula.uuid,quantity:1});return __privateMethod(this,_updateRE,updateRE_fn).call(this)}checkEntryRequirements(formula,{warn=!0}={}){return this.maxSlots&&this.formulas.filter(f=>f!==null).length>=this.maxSlots?(warn&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MaxSlots")),!1):this.actor.levelthis.maxItemLevel?(warn&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MaxItemLevel")),!1):this.craftableItems.test(formula.item.getRollOptions("item"))?!0:(warn&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.ItemMissingTraits")),!1)}async unprepareFormula(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return this.preparedFormulaData.splice(index,1),__privateMethod(this,_updateRE,updateRE_fn).call(this)}async increaseFormulaQuantity(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return formula.quantity?formula.quantity+=1:formula.quantity=2,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async decreaseFormulaQuantity(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID)){if(formula.quantity?formula.quantity-=1:formula.quantity=0,formula.quantity<=0){await this.unprepareFormula(index,itemUUID);return}return __privateMethod(this,_updateRE,updateRE_fn).call(this)}}async setFormulaQuantity(index,itemUUID,quantity){if(quantity<=0){await this.unprepareFormula(index,itemUUID);return}const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return formula.quantity=quantity,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async toggleFormulaExpended(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return formula.expended=!formula.expended,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async toggleSignatureItem(itemUUID){const formula=this.preparedFormulaData.find(f=>f.itemUUID===itemUUID);if(formula)return formula.isSignatureItem=!formula.isSignatureItem,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async updateFormulas(formulas){return this.preparedFormulaData=formulas,__privateMethod(this,_updateRE,updateRE_fn).call(this)}};_updateRE=new WeakSet,updateRE_fn=__name2(async function(){const rules=this.parentItem.toObject().system.rules,thisRule=rules.find(r=>r.key==="CraftingEntry"&&r.selector===this.selector);thisRule&&(thisRule.preparedFormulas=this.preparedFormulaData,await this.parentItem.update({"system.rules":rules}))},"#updateRE"),__name2(_CraftingEntry,"CraftingEntry");let CraftingEntry=_CraftingEntry;const _ElementalBlast=class{static{__name(this,"_ElementalBlast")}constructor(actor){if(__privateAdd(this,_prepareBlastConfigs),__privateAdd(this,_prepareBlastInfusion),__privateAdd(this,_getBlastConfig),__privateAdd(this,_createModifiedItem),__privateAdd(this,_strengthModToDamage),__publicField(this,"actor"),__publicField(this,"statistic"),__publicField(this,"item"),__publicField(this,"configs"),__publicField(this,"infusion"),!actor.isOfType("character"))throw ErrorPF2e("Must construct with a PC");this.actor=actor,this.statistic=this.actor.getStatistic("impulse"),this.item=this.actor.itemTypes.action.find(a=>a.slug==="elemental-blast")??null,this.infusion=__privateMethod(this,_prepareBlastInfusion,prepareBlastInfusion_fn).call(this),this.configs=__privateMethod(this,_prepareBlastConfigs,prepareBlastConfigs_fn).call(this)}get actionCost(){const cost=this.item?.flags.pf2e.rulesSelections.actionCost??1;if(cost!==1&&cost!==2)throw ErrorPF2e("Action cost must be 1 or 2");return cost}async attack(params){const{statistic,actionCost}=this;if(!(statistic&&this.item))throw ErrorPF2e("Unable to blast");if(!this.actor.rollOptions.all["self:effect:kinetic-aura"])throw ErrorPF2e("No kinetic gate");const{element,damageType}=params;if(!element)throw ErrorPF2e("No element provided");if(!objectHasKey(elementTraits,element))throw ErrorPF2e(`Unrecognized element: ${element}`);if(!damageType)throw ErrorPF2e("No damage type provided");if(!objectHasKey(CONFIG.PF2E.damageTypes,damageType))throw ErrorPF2e(`Unrecognized damage type: ${damageType}`);const blastConfig=__privateMethod(this,_getBlastConfig,getBlastConfig_fn).call(this,element,damageType),melee=!!(params.melee??=!0),item=__privateMethod(this,_createModifiedItem,createModifiedItem_fn).call(this,{config:blastConfig,damageType,melee});if(!item)return null;const thisToken=this.actor.getActiveTokens(!0,!1).shift()??null,targetToken=game.user.targets.first()??null;if(!params.melee&&thisToken&&targetToken&&thisToken.distanceTo(targetToken)>blastConfig.range.max)return ui.notifications.warn("PF2E.Action.Strike.OutOfRange",{localize:!0}),null;const actionSlug="elemental-blast",blastStatistic=statistic.extend({check:{domains:[`${actionSlug}-attack-roll`],modifiers:AttackTraitHelpers.createAttackModifiers({item})}}),label=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{title:item.name,glyph:actionCost.toString(),subtitle:game.i18n.format("PF2E.ActionsCheck.x-attack-roll",{type:statistic.label})}),meleeOrRanged=params.melee?"melee":"ranged",mapIncreases=Math.clamped(params.mapIncreases??0,0,2)||0;return blastStatistic.roll({identifier:`${blastConfig.element}.${params.damageType}.${meleeOrRanged}.${actionCost}`,action:actionSlug,attackNumber:mapIncreases+1,target:targetToken?.actor??null,token:thisToken?.document??null,item,label,traits:item.system.traits.value,melee,damaging:!0,dc:{slug:"ac"},extraRollOptions:[`action:${actionSlug}`,`action:cost:${actionCost}`],...eventToRollParams(params.event)})}async damage(params){if(!this.statistic)return null;const melee=!!(params.melee??=!0),blastConfig=__privateMethod(this,_getBlastConfig,getBlastConfig_fn).call(this,params.element,params.damageType);if(!blastConfig)return null;const item=__privateMethod(this,_createModifiedItem,createModifiedItem_fn).call(this,{config:blastConfig,damageType:params.damageType,melee});if(!item)return null;const outcome=params.outcome??"success",meleeOrRanged=melee?"melee":"ranged",actionCost=Math.clamped(Number(params.actionCost??this.actionCost),1,2)||1,actionSlug="elemental-blast",domains=["damage","attack-damage","impulse-damage",`${actionSlug}-damage`],targetToken=game.user.targets.first()??null;item.flags.pf2e.attackItemBonus=blastConfig.statistic.check.modifiers.find(m=>m.enabled&&["item","potency"].includes(m.type))?.value??0;const context=await this.actor.getDamageRollContext({viewOnly:params.getFormula??!1,statistic:this.statistic.check,item,target:{token:targetToken},domains,outcome,melee,checkContext:params.checkContext,options:new Set([`action:${actionSlug}`,`action:cost:${actionCost}`,meleeOrRanged,...item.traits])}),baseDamage={category:null,damageType:params.damageType,terms:[{dice:{number:1,faces:blastConfig.dieFaces},modifier:0}]},damageSynthetics=processDamageCategoryStacking([baseDamage],{modifiers:extractModifiers(this.actor.synthetics,domains,{test:context.options,resolvables:{blast:item}}),dice:extractDamageDice(this.actor.synthetics.damageDice,domains,{test:context.options,resolvables:{blast:item,target:context.target?.actor??null}}),test:context.options}),extraModifiers=compact([...damageSynthetics.modifiers,__privateMethod(this,_strengthModToDamage,strengthModToDamage_fn).call(this,item,domains)]),modifiers=new StatisticModifier("",extraModifiers).modifiers;applyDamageDiceOverrides([baseDamage],damageSynthetics.dice);const formulaData={dice:damageSynthetics.dice,modifiers,base:[baseDamage],ignoredResistances:[]},damageContext={type:"damage-roll",sourceType:"attack",self:context.self,target:context.target,outcome,options:context.options,domains,...eventToRollParams(params.event)},damageData=createDamageFormula(formulaData,outcome==="success"?DEGREE_OF_SUCCESS.SUCCESS:DEGREE_OF_SUCCESS.CRITICAL_SUCCESS),roll=new DamageRoll(damageData.formula);if(params.getFormula)return roll.formula;const damageTemplate={name:`${game.i18n.localize("PF2E.DamageRoll")}: ${item.name}`,traits:item.system.traits.value,materials:[],modifiers,damage:{roll,breakdown:damageData.breakdown}};return DamagePF2e.roll(damageTemplate,damageContext)}async setDamageType({element,damageType}){if(!this.configs.some(c=>c.element===element&&c.damageTypes.some(dt=>dt.value===damageType)))throw ErrorPF2e(`Damage type "${damageType}" not available for ${element}`);await this.item?.update({[`flags.pf2e.damageSelections.${element}`]:damageType})}};_blastConfigSchema=new WeakMap,_blastInfusionSchema=new WeakMap,_prepareBlastConfigs=new WeakSet,prepareBlastConfigs_fn=__name2(function(){const{item,statistic,actionCost,infusion}=this;if(!item||!statistic)return[];const{kineticist}=this.actor.flags.pf2e;if(!isObject(kineticist)||!("elementalBlast"in kineticist)||!isObject(kineticist.elementalBlast))return[];const schema=__privateGet(_ElementalBlast,_blastConfigSchema),damageTypeSelections=(()=>{const flag=item.flags.pf2e.damageSelections;return isObject(flag)?flag:{}})(),blasts=Object.values(kineticist.elementalBlast).filter(b=>isObject(b)&&"element"in b).map(b=>schema.clean(b)),validationFailures=blasts.flatMap(b=>schema.validate(b)??[]);for(const failure of validationFailures)throw failure.asError();item.flags.pf2e.attackItemBonus=statistic.check.modifiers.find(m=>m.enabled&&["item","potency"].includes(m.type))?.value??0;const maps=(()=>{const domains=[...statistic.check.domains,"elemental-blast-attack-roll"],options=this.actor.getRollOptions(domains),modifier=statistic.check.mod,mapsFor=__name2(melee=>{const penalties=calculateMAPs(__privateMethod(this,_createModifiedItem,createModifiedItem_fn).call(this,{melee})??item,{domains,options});return{map1:game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(modifier+penalties.map1),penalty:penalties.map1}),map2:game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(modifier+penalties.map2),penalty:penalties.map2})}},"mapsFor");return{melee:mapsFor(!0),ranged:mapsFor(!1)}})();return blasts.map(blast=>{const damageTypes2=uniq(compact([blast.damageTypes,this.infusion?.damageTypes].flat())).map(dt=>({value:dt,label:game.i18n.localize(CONFIG.PF2E.damageTypes[dt]),icon:DAMAGE_TYPE_ICONS[dt]??"",selected:damageTypeSelections[blast.element]===dt})).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang)),firstDamageType=damageTypes2.at(0);firstDamageType&&!damageTypes2.some(dt=>dt.selected)&&(firstDamageType.selected=!0);const maxRange=infusion?.range?.max??blast.range,range=infusion?.range?.increment?{increment:infusion.range.increment,max:infusion.range.increment*6,label:game.i18n.format("PF2E.Action.Range.IncrementN",{n:infusion.range.increment})}:{increment:null,max:maxRange,label:game.i18n.format("PF2E.Action.Range.MaxN",{n:maxRange})};return{...blast,statistic,maps,item,actionCost,damageTypes:damageTypes2,range}})},"#prepareBlastConfigs"),_prepareBlastInfusion=new WeakSet,prepareBlastInfusion_fn=__name2(function(){const schema=__privateGet(_ElementalBlast,_blastInfusionSchema),flag=this.actor.flags.pf2e.kineticist,infusionData=isObject(flag)&&isObject(flag.elementalBlast)?flag.elementalBlast.infusion:null;return isObject(infusionData)?schema.clean(infusionData):null},"#prepareBlastInfusion"),_getBlastConfig=new WeakSet,getBlastConfig_fn=__name2(function(element,damageType){const config=this.configs.find(c=>c.element===element&&c.damageTypes.some(t=>t.value===damageType));if(!config)throw ErrorPF2e(`Elemental blast configuration of element ${element} and damage type ${damageType} not found.`);return config},"#getBlastConfig"),_createModifiedItem=new WeakSet,createModifiedItem_fn=__name2(function({melee,config,damageType}){const{item}=this;if(!item)return null;const traits=(()=>{const baseTraits=this.item?.system.traits.value??[],infusionTraits=melee?this.infusion?.traits.melee:this.infusion?.traits.ranged;return uniq(compact([baseTraits,infusionTraits,config?.element,damageType].flat()).filter(t=>t in CONFIG.PF2E.actionTraits)).sort()})(),clone=item.clone({system:{traits:{value:traits}}},{keepId:!0});return clone.range=melee?null:config?.range??null,clone},"#createModifiedItem"),_strengthModToDamage=new WeakSet,strengthModToDamage_fn=__name2(function(item,domains){if(!item.range)return null;const strengthModValue=this.actor.abilities.str.mod,{traits}=item,modifierValue=traits.has("thrown")?strengthModValue:traits.has("propulsive")?strengthModValue<0?strengthModValue:Math.floor(strengthModValue/2):null;return typeof modifierValue=="number"?new ModifierPF2e({slug:"str",label:CONFIG.PF2E.abilities.str,ability:"str",modifier:modifierValue,type:"ability",adjustments:extractModifierAdjustments(this.actor.synthetics.modifierAdjustments,domains,"str")}):null},"#strengthModToDamage"),__name2(_ElementalBlast,"ElementalBlast"),__privateAdd(_ElementalBlast,_blastConfigSchema,(()=>{const{fields:fields2}=foundry.data;return new fields2.SchemaField({element:new fields2.StringField({required:!0,choices:()=>CONFIG.PF2E.elementTraits,initial:void 0}),label:new fields2.StringField({required:!0,blank:!1,initial:void 0}),img:new fields2.FilePathField({required:!0,categories:["IMAGE"],nullable:!1,initial:"systems/pf2e/icons/default-icons/spell.svg"}),damageTypes:new fields2.ArrayField(new fields2.StringField({required:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:void 0})),dieFaces:new fields2.NumberField({required:!0,nullable:!1,integer:!0,choices:[6,8],initial:void 0}),range:new fields2.NumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})})})()),__privateAdd(_ElementalBlast,_blastInfusionSchema,(()=>{const{fields:fields2}=foundry.data;return new fields2.SchemaField({damageTypes:new fields2.ArrayField(new fields2.StringField({required:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:void 0})),range:new fields2.SchemaField({increment:new fields2.NumberField({required:!0,integer:!0,positive:!0,nullable:!1}),max:new fields2.NumberField({required:!0,integer:!0,positive:!0,nullable:!1})},{required:!1,nullable:!0,initial:null}),traits:new fields2.SchemaField({melee:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,choices:()=>CONFIG.PF2E.weaponTraits,initial:void 0})),ranged:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,choices:()=>CONFIG.PF2E.weaponTraits,initial:void 0}))})})})());let ElementalBlast=_ElementalBlast;const _PCSheetTabManager=class{static{__name(this,"_PCSheetTabManager")}constructor(actor,link){this.actor=actor,this.link=link,renderTemplate("systems/pf2e/templates/actors/character/manage-tabs.hbs").then(template=>{$(this.link).tooltipster({content:template,contentAsHTML:!0,delay:250,interactive:!0,theme:"crb-hover",title:game.i18n.localize("PF2E.TabManageTabsLabel"),trigger:"custom",triggerOpen:{click:!0},triggerClose:{originClick:!0,mouseleave:!0},functionReady:(_origin,helper)=>this.onReady(helper.tooltip),functionAfter:()=>this.onClose()})})}static initialize(actor,link){new this(actor,link)}onReady(tooltip){const tabVisibility=this.actor.flags.pf2e.sheetTabs,tabs=this.link.closest("nav")?.querySelectorAll("a.item[data-tab]")??[];for(const tab of Array.from(tabs)){const tabName=tab.dataset.tab??"",selector=`input[data-tab-name="${tabName}"]`;tooltip.querySelector(selector).checked=tabVisibility[tabName],tab.classList.contains("hidden")&&(tab.classList.remove("hidden"),tab.classList.add("to-hide"))}const checkboxes=Array.from(tooltip.querySelectorAll('input[type="checkbox"]'));for(const checkbox of checkboxes)this.handleOnChange(checkbox,checkboxes)}handleOnChange(checkbox,checkboxes){checkbox.addEventListener("change",async()=>{const nav=this.link.closest("nav"),tabName=checkbox?.dataset.tabName??"",tab=nav?.querySelector(`a.item[data-tab="${tabName}"]`);for(const c of checkboxes)c.readOnly=!0;checkbox.checked?(tab?.classList.remove("to-hide"),await this.actor.update({[`flags.pf2e.sheetTabs.-=${tabName}`]:null},{render:!1})):(tab?.classList.add("to-hide"),await this.actor.update({[`flags.pf2e.sheetTabs.${tabName}`]:!1},{render:!1}));for(const c of checkboxes)c.readOnly=!1})}onClose(){const tabs=Array.from(this.link.closest("nav")?.querySelectorAll("a.item[data-tab]")??[]);for(const tab of tabs)tab.classList.contains("to-hide")&&(tab.classList.remove("to-hide"),tab.classList.add("hidden"))}};__name2(_PCSheetTabManager,"PCSheetTabManager");let PCSheetTabManager=_PCSheetTabManager;const _CharacterSheetPF2e=class extends CreatureSheetPF2e{static{__name(this,"_CharacterSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_prepareAbilities),__privateAdd(this,_prepareCraftingEntries),__privateAdd(this,_getBlastData),__privateAdd(this,_activateBlastListeners),__privateAdd(this,_onClickBrowseFeats),__privateAdd(this,_onChangeAdjustStat),__privateAdd(this,_onChangeAdjustItemStat),__privateAdd(this,_onClickAdjustItemStat),__privateAdd(this,_getFeatSlotData),__privateAdd(this,_sortFormulas),__publicField(this,"actorConfigClass",CharacterConfig),__privateAdd(this,_knownFormulas,{}),__privateAdd(this,_formulaQuantities,{})}static get defaultOptions(){const options=super.defaultOptions;return options.classes=[...options.classes,"character"],options.width=750,options.height=800,options.scrollY.push(".tab.active .tab-content"),options.tabs=[{navSelector:".sheet-navigation",contentSelector:".sheet-content",initial:"character"},{navSelector:".actions-nav",contentSelector:".actions-panels",initial:"encounter"}],options}get template(){return`systems/pf2e/templates/actors/character/${this.actor.limited&&!game.user.isGM?"limited":"sheet"}.hbs`}async getData(options){const sheetData=await super.getData(options),{actor}=this;if(this.actor.limited){const tab=options?.tabs.find(t=>t.navSelector===".sheet-navigation");tab&&(tab.initial="biography")}sheetData.martialProficiencies={attacks:sortLabeledRecord(mapValues$1(sheetData.data.proficiencies.attacks,(data,key)=>{const groupMatch=/^weapon-group-([-\w]+)$/.exec(key),baseWeaponMatch=/^weapon-base-([-\w]+)$/.exec(key);if(objectHasKey(CONFIG.PF2E.weaponCategories,key)){const locKey=sluggify(key,{camel:"bactrian"});data.label=setHasElement(WEAPON_CATEGORIES,key)?`PF2E.Actor.Character.Proficiency.Attack.${locKey}`:CONFIG.PF2E.weaponCategories[key]}else if(Array.isArray(groupMatch)){const weaponGroup=groupMatch[1];data.label=CONFIG.PF2E.weaponGroups[weaponGroup]??weaponGroup}else if(Array.isArray(baseWeaponMatch)){const baseWeapon=baseWeaponMatch[1];data.label=CONFIG.PF2E.baseWeaponTypes[baseWeapon]??baseWeapon}else data.label??=key;const rank=data.rank??0;return data.value=createProficiencyModifier({actor,rank,domains:[]}).value,data})),defenses:sortLabeledRecord(mapValues$1(sheetData.data.proficiencies.defenses,(data,key)=>{if(key in CONFIG.PF2E.armorCategories){const locKey=sluggify(key,{camel:"bactrian"});data.label=`PF2E.Actor.Character.Proficiency.Defense.${locKey}`}const rank=data.rank??0;return data.value=createProficiencyModifier({actor,rank,domains:[]}).value,data}))};for(const key of["light-barding","heavy-barding"])sheetData.martialProficiencies.defenses[key]?.rank===0&&delete sheetData.martialProficiencies.defenses[key];sheetData.ancestry=actor.ancestry,sheetData.heritage=actor.heritage,sheetData.background=actor.background,sheetData.class=actor.class,sheetData.deity=actor.deity,sheetData.data.resources.heroPoints.hover=game.i18n.format(actor.heroPoints.value===1?"PF2E.HeroPointRatio.One":"PF2E.HeroPointRatio.Many",actor.heroPoints),sheetData.attributeBoostsAllocated=(()=>{const{build}=sheetData.data;if(build.attributes.manual||!isReallyPC(actor))return!0;const keyAttributeSelected=!sheetData.class||build.attributes.keyOptions.includes(sheetData.data.details.keyability.value),ancestryBoostsSelected=(sheetData.ancestry?.system.alternateAncestryBoosts?.length===2||Object.values(sheetData.ancestry?.system.boosts??{}).every(b=>b.value.length===0||!!b.selected))&&sheetData.ancestry?.system.voluntary?.boost!==null,backgroundBoostsSelected=Object.values(sheetData.background?.system.boosts??{}).every(b=>b.value.length===0||!!b.selected);return ancestryBoostsSelected&&backgroundBoostsSelected&&keyAttributeSelected&&[1,5,10,15,20].filter(l=>build.attributes.allowedBoosts[l]>build.attributes.boosts[l].length).length===0})();const allClassDCs=Object.values(sheetData.data.proficiencies.classDCs),classDCs=allClassDCs.filter(cdc=>cdc.rank>0||allClassDCs.length>1).map(classDC=>({...classDC,icon:this.getProficiencyIcon(classDC.rank),hover:CONFIG.PF2E.proficiencyLevels[classDC.rank],rankSlug:PROFICIENCY_RANKS[classDC.rank],rankName:game.i18n.format(`PF2E.ProficiencyLevel${classDC.rank}`)})).sort((a,b)=>a.primary?-1:b.primary?1:a.slug.localeCompare(b.slug)),primaryClassDC=sheetData.data.attributes.classDC?.slug??null;sheetData.classDCs={dcs:classDCs,primary:primaryClassDC,perDCDetails:classDCs.length>1||!primaryClassDC};const abpEnabled=game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(actor);sheetData.apexAttributeOptions=abpEnabled?[]:this.actor.itemTypes.equipment.flatMap(e=>e.system.apex?.selected===!1&&e.isInvested&&e.system.apex.attribute!==actor.system.build.attributes.apex?e.system.apex.attribute:[]),sheetData.magicTraditions=CONFIG.PF2E.magicTraditions,sheetData.preparationType=CONFIG.PF2E.preparationType,sheetData.data.attributes.perception.rankName=game.i18n.format(`PF2E.ProficiencyLevel${sheetData.data.attributes.perception.rank}`),sheetData.data.saves={fortitude:sheetData.data.saves.fortitude,reflex:sheetData.data.saves.reflex,will:sheetData.data.saves.will};for(const save of Object.values(sheetData.data.saves))save.rankName=game.i18n.format(`PF2E.ProficiencyLevel${save.rank}`);for(const save of Object.values(sheetData.data.saves))save.short=game.i18n.format(`PF2E.Saves${save.label}Short`);sheetData.data.details.keyability.singleOption=actor.class?.system.keyAbility.value.length===1,sheetData.hasStamina=game.settings.get("pf2e","staminaVariant"),sheetData.spellcastingEntries=await this.prepareSpellcasting(),sheetData.actions=__privateMethod(this,_prepareAbilities,prepareAbilities_fn).call(this),sheetData.feats=[...actor.feats,actor.feats.bonus];const craftingFormulas=await actor.getCraftingFormulas(),formulasByLevel=groupBy$1(craftingFormulas,f=>f.level),flags=actor.flags.pf2e,hasQuickAlchemy=!!(actor.rollOptions.all["feature:quick-alchemy"]||actor.rollOptions.all["feat:quick-alchemy"]);sheetData.crafting={noCost:flags.freeCrafting,hasQuickAlchemy,knownFormulas:formulasByLevel,entries:await __privateMethod(this,_prepareCraftingEntries,prepareCraftingEntries_fn).call(this,craftingFormulas)},__privateSet(this,_knownFormulas,Object.values(formulasByLevel).flat().reduce((result,entry)=>(entry.batchSize=__privateGet(this,_formulaQuantities)[entry.uuid]??entry.batchSize,result[entry.uuid]=entry,result),{})),sheetData.abpEnabled=AutomaticBonusProgression.isEnabled(actor),sheetData.data.skills=Object.fromEntries(Object.entries(sheetData.data.skills).sort(([_keyA,skillA],[_keyB,skillB])=>game.i18n.localize(skillA.label??"").localeCompare(game.i18n.localize(skillB.label??""),game.i18n.lang))),sheetData.tabVisibility=deepClone(actor.flags.pf2e.sheetTabs);const rollData=actor.getRollData(),biography=sheetData.biography=actor.system.details.biography,enrichPromises={appearance:TextEditor.enrichHTML(biography.appearance,{rollData,async:!0}),backstory:TextEditor.enrichHTML(biography.backstory,{rollData,async:!0}),campaignNotes:TextEditor.enrichHTML(biography.campaignNotes,{rollData,async:!0}),allies:TextEditor.enrichHTML(biography.allies,{rollData,async:!0}),enemies:TextEditor.enrichHTML(biography.enemies,{rollData,async:!0}),organizations:TextEditor.enrichHTML(biography.organizations,{rollData,async:!0})};await Promise.all(Object.values(enrichPromises));for(const[key,content]of Object.entries(enrichPromises))sheetData.enrichedContent[key]=await content;try{const action2=new ElementalBlast(this.actor),blastData=(await Promise.all(action2.configs.map(c=>__privateMethod(this,_getBlastData,getBlastData_fn).call(this,action2,c)))).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang));sheetData.elementalBlasts=blastData}catch{sheetData.elementalBlasts=[]}return sheetData}async prepareItems(sheetData){const actorData=sheetData.actor,lores=[];for(const itemData of sheetData.items)if(itemData.type==="lore"){itemData.system.icon=this.getProficiencyIcon((itemData.system.proficient||{}).value),itemData.system.hover=CONFIG.PF2E.proficiencyLevels[(itemData.system.proficient||{}).value];const rank=itemData.system.proficient?.value||0,proficiency=createProficiencyModifier({actor:this.actor,rank,domains:[]}).modifier,modifier=actorData.system.abilities.int.mod,itemBonus=Number((itemData.system.item||{}).value||0);itemData.system.itemBonus=itemBonus,itemData.system.value=modifier+proficiency+itemBonus,itemData.system.breakdown=`int modifier(${modifier}) + proficiency(${proficiency}) + item bonus(${itemBonus})`,lores.push(itemData)}actorData.pfsBoons=this.actor.pfsBoons,actorData.deityBoonsCurses=this.actor.deityBoonsCurses,actorData.lores=lores}prepareInventoryItem(item){const data=super.prepareInventoryItem(item);data.isInvestable=!item.isInContainer&&item.isIdentified&&item.isInvested!==null;const invested=this.actor.inventory.invested,canInvest=invested&&invested.value{this.toggleInitiativeLink()});const heroPointsPips=htmlQuery(html,"[data-action=adjust-hero-points]");heroPointsPips?.addEventListener("click",async()=>{const newValue=Math.min(this.actor.heroPoints.value+1,this.actor.heroPoints.max);await this.actor.update({"system.resources.heroPoints.value":newValue})}),heroPointsPips?.addEventListener("contextmenu",async event=>{event.preventDefault();const newValue=Math.max(this.actor.heroPoints.value-1,0);await this.actor.update({"system.resources.heroPoints.value":newValue})});for(const selectElem of htmlQueryAll(html,"select.adjust-stat-select"))selectElem.addEventListener("change",()=>__privateMethod(this,_onChangeAdjustStat,onChangeAdjustStat_fn).call(this,selectElem));$html.find(".adjust-item-stat").on("click contextmenu",event=>__privateMethod(this,_onClickAdjustItemStat,onClickAdjustItemStat_fn).call(this,event)),$html.find(".adjust-item-stat-select").on("change",event=>__privateMethod(this,_onChangeAdjustItemStat,onChangeAdjustItemStat_fn).call(this,event));{const title=$(".sheet-navigation .active").attr("title");title&&$html.find(".navigation-title").text(title)}$html.find(".sheet-navigation").on("mouseover",".item,.manage-tabs",event=>{const title=event.currentTarget.title;title&&$(event.currentTarget).parents(".sheet-navigation").find(".navigation-title").text(title)}),$html.find(".sheet-navigation").on("mouseout",".item,.manage-tabs",event=>{const parent=$(event.currentTarget).parents(".sheet-navigation"),title=parent.find(".item.active").attr("title");title&&parent.find(".navigation-title").text(title)}),$html.find(".open-compendium").on("click",event=>{if(event.currentTarget.dataset.compendium){const compendium=game.packs.get(event.currentTarget.dataset.compendium);compendium&&compendium.render(!0)}});const mainPanel=htmlQuery(html,".tab[data-tab=character]");if(mainPanel&&this.isEditable){new ContextMenu(mainPanel,".detail-item-control",[{name:"PF2E.EditItemTitle",icon:fontAwesomeIcon("edit").outerHTML,callback:target=>{const itemId=$(target).closest("[data-item-id]").attr("data-item-id");this.actor.items.get(itemId??"")?.sheet.render(!0,{focus:!0})}},{name:"PF2E.DeleteItemTitle",icon:fontAwesomeIcon("trash").outerHTML,callback:target=>{const row=htmlClosest(target[0],"[data-item-id]"),itemId=row?.dataset.itemId,item=this.actor.items.get(itemId??"");if(row&&item)this.deleteItem(row,item);else throw ErrorPF2e("Item not found")}}],{eventName:"click"});for(const link of htmlQueryAll(html,".crb-tag-selector"))link.addEventListener("click",()=>this.openTagSelector(link,{allowCustom:!1}));htmlQuery(mainPanel,"button[data-action=edit-attribute-boosts]")?.addEventListener("click",()=>{(Object.values(this.actor.apps).find(a=>a instanceof AttributeBuilder)??new AttributeBuilder(this.actor)).render(!0)});for(const link of htmlQueryAll(mainPanel,"a[data-action=apex-attribute]"))link.addEventListener("click",()=>{if(game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(this.actor))return;const attribute=htmlClosest(link,"[data-attribute]")?.dataset.attribute;if(setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute)){const apexItems=this.actor.itemTypes.equipment.filter(e=>e.system.apex),selection=apexItems.find(e=>e.isInvested&&e.system.apex?.attribute===attribute);this.actor.updateEmbeddedDocuments("Item",apexItems.map(e=>({_id:e.id,"system.apex.selected":e===selection})))}})}const actionsPanel=htmlQuery(html,".tab.actions");htmlQuery(actionsPanel,".toggle-unready-strikes")?.addEventListener("click",()=>{this.actor.setFlag("pf2e","showUnreadyStrikes",!this.actor.flags.pf2e.showUnreadyStrikes)});for(const strikeElem of htmlQueryAll(actionsPanel,".strikes-list li")){for(const tagElem of htmlQueryAll(strikeElem,".item-summary .item-properties.tags .tag"))tagElem.dataset.description&&$(tagElem).tooltipster({content:game.i18n.localize(tagElem.dataset.description),maxWidth:400,theme:"crb-hover"});const versatileToggleButtons=htmlQueryAll(strikeElem,"button[data-action=toggle-versatile]");for(const button of versatileToggleButtons)button.addEventListener("click",()=>{const weapon=this.getStrikeFromDOM(button)?.item,baseType=weapon?.system.damage.damageType??null,selection=button.classList.contains("selected")||button.value===baseType?null:button.value,selectionIsValid=objectHasKey(CONFIG.PF2E.damageTypes,selection)||selection===null;weapon&&selectionIsValid&&toggleWeaponTrait({trait:"versatile",weapon,selection})});const auxActionButtons=htmlQueryAll(strikeElem,"button[data-action=auxiliary-action]");for(const button of auxActionButtons){const modularSelect=htmlQuery(button,"select");button.addEventListener("click",()=>{const auxiliaryActionIndex=Number(button.dataset.auxiliaryActionIndex??NaN),strike=this.getStrikeFromDOM(button),selection=modularSelect?.value??null;strike?.auxiliaryActions?.at(auxiliaryActionIndex)?.execute({selection})});for(const eventType of["change","click","dragenter","input"])modularSelect?.addEventListener(eventType,event=>{event.stopImmediatePropagation()})}const meleeIcon=htmlQuery(strikeElem,".melee-icon");meleeIcon&&$(meleeIcon).tooltipster({content:game.i18n.localize("PF2E.Item.Weapon.MeleeUsage.Label"),position:"left",theme:"crb-hover"});const ammoSelect=htmlQuery(strikeElem,"select[data-action=link-ammo]");ammoSelect?.addEventListener("change",event=>{event.stopPropagation();const weapon=this.getStrikeFromDOM(ammoSelect)?.item,ammo=this.actor.items.get(ammoSelect.value);weapon?.update({system:{selectedAmmoId:ammo?.id??null}})})}for(const activeToggle of htmlQueryAll(actionsPanel,"[data-action=toggle-exploration]"))activeToggle.addEventListener("click",()=>{const actionId=htmlClosest(activeToggle,"[data-item-id]")?.dataset.itemId;if(!actionId)return;const exploration=this.actor.system.exploration.filter(id=>this.actor.items.has(id));exploration.findSplice(id=>id===actionId)||exploration.push(actionId),this.actor.update({"system.exploration":exploration})});htmlQuery(actionsPanel,"[data-action=clear-exploration]")?.addEventListener("click",()=>{this.actor.update({"system.exploration":[]})});for(const customModifierEl of htmlQueryAll(html,".modifiers-tooltip")){const stat=customModifierEl.dataset.stat;if(!stat)continue;for(const removeButton of htmlQueryAll(customModifierEl,"[data-action=remove-modifier]")){const slug=removeButton.dataset.slug??"";removeButton.addEventListener("click",()=>{this.actor.removeCustomModifier(stat,slug)})}const modifierValueEl=htmlQuery(customModifierEl,".add-modifier input[type=number]");htmlQuery(customModifierEl,"[data-action=increment]")?.addEventListener("click",()=>{modifierValueEl?.stepUp()}),htmlQuery(customModifierEl,"[data-action=decrement]")?.addEventListener("click",()=>{modifierValueEl?.stepDown()}),htmlQuery(customModifierEl,"[data-action=create-custom-modifier]")?.addEventListener("click",()=>{const modifier=modifierValueEl?.valueAsNumber||1,type=htmlQuery(customModifierEl,".add-modifier-type")?.value??"",label=htmlQuery(customModifierEl,".add-modifier-name")?.value?.trim()??game.i18n.localize(`PF2E.ModifierType.${type}`);if(!setHasElement(MODIFIER_TYPES,type)){ui.notifications.error("Type is required.");return}this.actor.addCustomModifier(stat,label,modifier,type)})}__privateMethod(this,_activateBlastListeners,activateBlastListeners_fn).call(this,actionsPanel);{const tab=html.querySelector(".tab.proficiencies");tab?.querySelector("h3.attacks-defenses")?.querySelector("button[data-action=add-attack-proficiency]")?.addEventListener("click",event=>{ManageAttackProficiencies.add(this.actor,event)});const list=tab?.querySelector("ol.combat-list")??null,links=htmlQueryAll(list,"li.custom a[data-action=remove-attack-proficiency]");for(const link of links)link.addEventListener("click",event=>{ManageAttackProficiencies.remove(this.actor,event)})}$html.find(".hover").tooltipster({trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["right","bottom"],theme:"crb-hover",minWidth:120}),$html.find("a[data-action=rest]").tooltipster({theme:"crb-hover"}).on("click",event=>{game.pf2e.actions.restForTheNight({event,actors:[this.actor]})}),$html.find("a[data-action=perception-check]").tooltipster({theme:"crb-hover"});const castingPanel=htmlQuery(html,".tab[data-tab=spellcasting]"),focusPips=htmlQueryAll(castingPanel,".focus-pool");if(focusPips.length>0){const listener=__name2(event=>{const change=event.type==="click"?1:-1,points=this.actor.system.resources.focus.value+change;this.actor.update({"system.resources.focus.value":points})},"listener");for(const pips of focusPips)pips.addEventListener("click",listener),pips.addEventListener("contextmenu",listener)}const craftingTab=htmlQuery(html,".tab.crafting");for(const element of htmlQueryAll(craftingTab,"li.formula-item")){const quantity=htmlQuery(element,"input[data-action=enter-quantity]");quantity?.addEventListener("change",async()=>{const itemUUID=element.dataset.itemId??"",formula=__privateGet(this,_knownFormulas)[itemUUID],minBatchSize=formula.minimumBatchSize,newValue=Number(quantity.value)||minBatchSize;if(newValue<1)return;const entrySelector=htmlClosest(element,"li.crafting-entry")?.dataset.entrySelector;if(entrySelector){const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");const index=element.dataset.itemIndex;await craftingEntry.setFormulaQuantity(Number(index),itemUUID??"",newValue);return}__privateGet(this,_formulaQuantities)[formula.uuid]=Math.max(newValue,minBatchSize),this.render()});for(const button of htmlQueryAll(element,"[data-action=increase-quantity], [data-action=decrease-quantity]"))button.addEventListener("click",async()=>{if(!quantity)return;const itemUUID=element.dataset.itemId??"",formula=__privateGet(this,_knownFormulas)[itemUUID],minBatchSize=formula.minimumBatchSize,step2=button.dataset.action==="increase-quantity"?minBatchSize:-minBatchSize,newValue=(Number(quantity.value)||step2)+step2;if(newValue<1)return;const entrySelector=htmlClosest(element,"li.crafting-entry")?.dataset.entrySelector;if(entrySelector){const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");const index=element.dataset.itemIndex;await craftingEntry.setFormulaQuantity(Number(index),itemUUID??"",newValue);return}__privateGet(this,_formulaQuantities)[formula.uuid]=Math.max(newValue,minBatchSize),this.render()});const craftButton=htmlQuery(element,"a[data-action=craft-item]");craftButton?.addEventListener("click",async event=>{const{itemUuid,free,prepared}=craftButton.dataset,itemQuantity=Number(quantity?.value)||1,formula=__privateGet(this,_knownFormulas)[itemUuid??""];if(!formula)return;if(prepared==="true"){if(element.dataset.expendedState==="true"){ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.FormulaExpended"));return}const index=element.dataset.itemIndex,entrySelector=htmlClosest(craftButton,"li.crafting-entry")?.dataset.entrySelector;if(!itemUuid||!index||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");await craftingEntry.toggleFormulaExpended(Number(index),itemUuid)}if(this.actor.flags.pf2e.quickAlchemy){const reagentValue=this.actor.system.resources.crafting.infusedReagents.value-1;if(reagentValue<0){ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MissingReagents"));return}return await this.actor.update({"system.resources.crafting.infusedReagents.value":reagentValue},{render:!1}),craftItem(formula.item,1,this.actor,!0)}if(this.actor.flags.pf2e.freeCrafting){const itemId=itemUuid?.split(".").pop()??"";return isSpellConsumable(itemId)&&formula.item.isOfType("consumable")?craftSpellConsumable(formula.item,itemQuantity,this.actor):craftItem(formula.item,itemQuantity,this.actor)}const difficultyClass={value:formula.dc,visible:!0,scope:"check"};craft({difficultyClass,item:formula.item,quantity:itemQuantity,actors:this.actor,event,free:free==="true"})}),htmlQuery(element,"a.formula-delete")?.addEventListener("click",async()=>{const itemUuid=element.dataset.itemId;if(!itemUuid)return;const name2=__privateGet(this,_knownFormulas)[itemUuid]?.name,content=`

${game.i18n.format("PF2E.CraftingTab.RemoveFormulaDialogQuestion",{name:name2})}

`,title=game.i18n.localize("PF2E.CraftingTab.RemoveFormulaDialogTitle");if(await Dialog.confirm({title,content})){const actorFormulas=this.actor.toObject().system.crafting?.formulas??[];actorFormulas.findSplice(f=>f.uuid===itemUuid),this.actor.update({"system.crafting.formulas":actorFormulas})}}),htmlQuery(element,"a.formula-unprepare")?.addEventListener("click",async()=>{const itemUuid=element.dataset.itemId,index=element.dataset.itemIndex,entrySelector=element.dataset.entrySelector;if(!itemUuid||!index||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");const name2=__privateGet(this,_knownFormulas)[itemUuid]?.name,content=`

${game.i18n.format("PF2E.CraftingTab.UnprepareFormulaDialogQuestion",{name:name2})}

`,title=game.i18n.localize("PF2E.CraftingTab.UnprepareFormulaDialogTitle");await Dialog.confirm({title,content})&&await craftingEntry.unprepareFormula(Number(index),itemUuid)})}const $craftingTab=$html.find(".tab.crafting"),$craftingOptions=$craftingTab.find(".crafting-options input:checkbox");$craftingOptions.on("click",async event=>{const flags=[];$craftingOptions.each((_index,element)=>{element!==event.target&&flags.push($(element).attr("flag"))}),flags.forEach(async flag=>{await this.actor.setFlag("pf2e",flag,!1)})}),$craftingTab.find("a[data-action=quick-add]").on("click",async event=>{const{itemUuid}=event.currentTarget.dataset,formula=(await this.actor.getCraftingFormulas()).find(f=>f.uuid===itemUuid);if(!formula)return;const entries=(await this.actor.getCraftingEntries()).filter(e=>!!e.selector&&e.checkEntryRequirements(formula,{warn:!1}));for(const entry of entries)await entry.prepareFormula(formula);entries.length===0&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.NoEligibleEntry"))});const $formulas=$craftingTab.find(".craftingEntry-list");$formulas.find(".toggle-formula-expended").on("click",async event=>{const $target=$(event.currentTarget),itemUUID=$target.closest("li.formula-item").attr("data-item-id"),index=$target.closest("li.formula-item").attr("data-item-index"),entrySelector=$target.closest("li.crafting-entry").attr("data-entry-selector");if(!itemUUID||!index||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");await craftingEntry.toggleFormulaExpended(Number(index),itemUUID)}),$formulas.find(".toggle-signature-item").on("click",async event=>{const $target=$(event.currentTarget),itemUUID=$target.closest("li.formula-item").attr("data-item-id"),entrySelector=$target.closest("li.crafting-entry").attr("data-entry-selector");if(!itemUUID||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");await craftingEntry.toggleSignatureItem(itemUUID)}),$formulas.find(".infused-reagents").on("change",event=>{const change=Number($(event.target).val()),infusedReagents=this.actor.system.resources.crafting.infusedReagents,value=Math.clamped(change,0,infusedReagents?.max??0);this.actor.update({"system.resources.crafting.infusedReagents.value":value})}),$formulas.find(".daily-crafting").on("click",async()=>await this.actor.performDailyCrafting());for(const spellcastingCollectionEl of htmlQueryAll(html,".spellcasting-entry[data-item-id]")){const entry=this.actor.spellcasting.get(spellcastingCollectionEl.dataset.itemId??"");htmlQuery(spellcastingCollectionEl,"[data-action=spell-attack]")?.addEventListener("click",event=>{entry?.statistic?.check.roll(eventToRollParams(event))})}PCSheetTabManager.initialize(this.actor,$html.find("a[data-action=manage-tabs]")[0]);for(const link of htmlQueryAll(html,"[data-action=browse-feats]"))link.addEventListener("click",()=>__privateMethod(this,_onClickBrowseFeats,onClickBrowseFeats_fn).call(this,link));htmlQuery(html,".tab[data-tab=biography]")?.addEventListener("click",event=>{const section=htmlClosest(event.target,"a[data-action=toggle-bio-visibility")?.dataset.section;if(tupleHasValue(["appearance","backstory","personality","campaign"],section)){event.stopPropagation();const{biography}=this.actor.system.details,path=`system.details.biography.visibility.${section}`;this.actor.update({[path]:!biography.visibility[section]})}})}activateInventoryListeners(panel){super.activateInventoryListeners(panel),(this.isEditable?htmlQuery(panel,".inventory-pane"):null)?.addEventListener("click",event=>{const link=htmlClosest(event.target,"a[data-action=toggle-invested]"),itemId=htmlClosest(link,".item")?.dataset.itemId;itemId&&this.actor.toggleInvested(itemId)})}toggleInitiativeLink(link){if(link??=htmlQuery(this.element.get(0),"aside a[data-action=roll-initiative]"),!link)return;const alreadyRolled=game.combat&&typeof game.combat.combatants.find(c=>c.actor===this.actor)?.initiative=="number";if(!!(this.isEditable&&game.combat&&!alreadyRolled))link.classList.remove("disabled"),link.removeAttribute("title");else{link.classList.add("disabled");const reason=game.combat?alreadyRolled?"AlreadyRolled":null:"NoActiveEncounter";reason&&(link.title=game.i18n.format(`PF2E.Encounter.${reason}`,{actor:this.actor.name}))}}async _onDropItem(event,data){const item=await ItemPF2e.fromDropData(data);if(!item)throw ErrorPF2e("Unable to create item from drop data!");if(this.actor.uuid===item.parent?.uuid)return super._onDropItem(event,data);if(item.isOfType("feat")){const slotData=__privateMethod(this,_getFeatSlotData,getFeatSlotData_fn).call(this,event);return this.actor.feats.insertFeat(item,slotData)}return super._onDropItem(event,data)}async _onDrop(event){const dataString=event.dataTransfer?.getData("text/plain"),dropData=(()=>{try{return JSON.parse(dataString??"")}catch{return null}})();if(dropData)if(isObject(dropData.pf2e)&&dropData.pf2e.type==="CraftingFormula"){const dropEntrySelector=typeof dropData.entrySelector=="string"?dropData.entrySelector:null;if(!dropEntrySelector){const containerEl=htmlClosest(event.target,".item-container");if(containerEl?.dataset.containerType==="craftingEntry"){const entrySelector=containerEl.dataset.entrySelector??"",craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)return;const craftingFormulas=await this.actor.getCraftingFormulas(),uuid2=dropData.pf2e.itemUuid,formula=craftingFormulas.find(f=>f.uuid===uuid2);formula&&craftingEntry.prepareFormula(formula);return}}const uuid=dropData.pf2e.itemUuid;if(typeof uuid=="string"){const formula=__privateGet(this,_knownFormulas)[uuid];if(formula){const targetUuid=htmlClosest(event.target,"li.formula-item")?.dataset.itemId??"";return __privateMethod(this,_sortFormulas,sortFormulas_fn).call(this,formula,targetUuid,dropEntrySelector)}}}else return super._onDrop(event)}async _onSortItem(event,itemSource){const item=this.actor.items.get(itemSource._id);if(item?.isOfType("feat")){const featSlot=__privateMethod(this,_getFeatSlotData,getFeatSlotData_fn).call(this,event);if(featSlot){const group=this.actor.feats.get(featSlot.groupId)??null,resorting=item.group===group&&!group?.slotted;if(group?.slotted&&!featSlot.slotId)return[];if(!resorting)return this.actor.feats.insertFeat(item,featSlot)}}return super._onSortItem(event,itemSource)}openTab(name2){["encounter","exploration","downtime"].includes(name2)?(super.openTab("actions"),this._tabs[1].activate(name2)):super.openTab(name2)}};_knownFormulas=new WeakMap,_formulaQuantities=new WeakMap,_prepareAbilities=new WeakSet,prepareAbilities_fn=__name2(function(){const{actor}=this,result={encounter:{action:{label:game.i18n.localize("PF2E.ActionsActionsHeader"),actions:[]},reaction:{label:game.i18n.localize("PF2E.ActionsReactionsHeader"),actions:[]},free:{label:game.i18n.localize("PF2E.ActionsFreeActionsHeader"),actions:[]}},exploration:{active:[],other:[]},downtime:[]};for(const item of actor.items){if(!item.isOfType("action")&&!(item.isOfType("feat")&&item.actionCost)||item.slug==="elemental-blast"&&this.actor.flags.pf2e.kineticist)continue;const img=(()=>{const actionIcon=getActionIcon(item.actionCost),defaultIcon=ItemPF2e.getDefaultArtwork(item._source).img;return item.isOfType("action")&&![actionIcon,defaultIcon].includes(item.img)?item.img:item.system.selfEffect?.img??actionIcon})(),traits=item.system.traits.value,traitDescriptions2=item.isOfType("feat")?CONFIG.PF2E.featTraits:CONFIG.PF2E.actionTraits,action2={...pick$1(item,["id","name","actionCost","frequency"]),img,glyph:getActionGlyph(item.actionCost),traits:createSheetTags(traitDescriptions2,traits),feat:item.isOfType("feat")?item:null,hasEffect:!!item.system.selfEffect};if(traits.includes("exploration")){const active=actor.system.exploration.includes(item.id);action2.exploration={active},(active?result.exploration.active:result.exploration.other).push(action2)}else traits.includes("downtime")?result.downtime.push(action2):result.encounter[item.actionCost?.type??"free"]?.actions.push(action2)}for(const list of["action","reaction","free"])result.encounter[list].actions.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang));return result.exploration.active.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang)),result.exploration.other.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang)),result.downtime.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang)),result},"#prepareAbilities"),_prepareCraftingEntries=new WeakSet,prepareCraftingEntries_fn=__name2(async function(formulas){const craftingEntries={dailyCrafting:!1,other:[],alchemical:{entries:[],totalReagentCost:0,infusedReagents:this.actor.system.resources.crafting.infusedReagents}};for(const entry of await this.actor.getCraftingEntries(formulas))entry.isAlchemical?(craftingEntries.alchemical.entries.push(entry),craftingEntries.alchemical.totalReagentCost+=entry.reagentCost||0,craftingEntries.dailyCrafting=!0):(craftingEntries.other.push(entry),entry.isDailyPrep&&(craftingEntries.dailyCrafting=!0));return craftingEntries},"#prepareCraftingEntries"),_getBlastData=new WeakSet,getBlastData_fn=__name2(async function(blast,config){const damageType=config.damageTypes.find(dt=>dt.selected)?.value??"untyped",formulaFor=__name2((outcome,melee=!0)=>blast.damage({element:config.element,damageType,melee,outcome,getFormula:!0}),"formulaFor");return{...config,damageType,formula:{melee:{damage:await formulaFor("success"),critical:await formulaFor("criticalSuccess")},ranged:{damage:await formulaFor("success",!1),critical:await formulaFor("criticalSuccess",!1)}}}},"#getBlastData"),_activateBlastListeners=new WeakSet,activateBlastListeners_fn=__name2(function(panel){const blastList=htmlQuery(panel,"ol.elemental-blasts"),{elementTraits:elementTraits2,damageTypes:damageTypes2}=CONFIG.PF2E,selectors=["roll-attack","roll-damage","set-damage-type"].map(s=>`button[data-action=${s}]`).join(",");blastList?.addEventListener("click",async event=>{const button=htmlClosest(event.target,selectors),blastRow=htmlClosest(button,"li");if(!(button&&blastRow))return;event.stopPropagation();const blast=new ElementalBlast(this.actor),{element}=blastRow.dataset,damageType=button.value||blastRow.dataset.damageType;if(!objectHasKey(elementTraits2,element))throw ErrorPF2e("Unexpected error retrieve element");if(!objectHasKey(damageTypes2,damageType))throw ErrorPF2e("Unexpected error retrieving damage type");const melee=button.dataset.melee==="true";switch(button.dataset.action){case"roll-attack":{const mapIncreases=Math.clamped(Number(button.dataset.mapIncreases)||0,0,2);await blast.attack({mapIncreases,element,damageType,melee,event});break}case"roll-damage":{const outcome=button.dataset.outcome==="success"?"success":"criticalSuccess";await blast.damage({element,damageType,melee,outcome,event});break}case"set-damage-type":blast.setDamageType({element,damageType})}});for(const damageButton of htmlQueryAll(blastList,"button[data-action=roll-damage]")){const formula=damageButton.dataset.formula??"";$(damageButton).tooltipster({position:"top",theme:"crb-hover",content:formula})}},"#activateBlastListeners"),_onClickBrowseFeats=new WeakSet,onClickBrowseFeats_fn=__name2(async function(element){const maxLevel=Number(element.dataset.level)||this.actor.level,checkboxesFilterCodes=(element.dataset.filter??"").split(",").filter(s=>!!s).map(s=>s.trim()),featTab=game.pf2e.compendiumBrowser.tabs.feat,filter2=await featTab.getFilterData(),level=filter2.sliders.level;level.values.max=Math.min(maxLevel,level.values.upperLimit),level.isExpanded=level.values.max!==level.values.upperLimit;const{category}=filter2.checkboxes,{traits}=filter2.multiselects;for(const filterCode of checkboxesFilterCodes){const[filterType,...rest]=filterCode.split("-"),value=rest.join("-");if(!(filterType&&value))throw ErrorPF2e(`Invalid filter value for opening the compendium browser: "${filterCode}"`);if(filterType==="category"&&value in category.options)category.isExpanded=!0,category.options[value].selected=!0,category.selected.push(value);else if(filterType==="traits"){const trait=traits.options.find(t=>t.value===value);trait&&traits.selected.push(deepClone(trait))}else filterType==="conjunction"&&(value==="and"||value==="or")&&(filter2.multiselects.traits.conjunction=value)}return featTab.open(filter2)},"#onClickBrowseFeats"),_onChangeAdjustStat=new WeakSet,onChangeAdjustStat_fn=__name2(function(selectElem){const propertyKey=selectElem.dataset.property??"",currentValue=getProperty(this.actor,propertyKey),selectedValue=Number(selectElem.value);if(typeof currentValue!="number"||Number.isNaN(selectedValue))throw ErrorPF2e("Actor property not found");const newValue=Math.clamped(selectedValue,0,4),clone=this.actor.clone({[propertyKey]:newValue},{keepId:!0});newValue!==getProperty(clone,propertyKey)&&(ui.notifications.warn("PF2E.ErrorMessage.MinimumProfLevelSetByFeatures",{localize:!0}),selectElem.value=currentValue.toString())},"#onChangeAdjustStat"),_onChangeAdjustItemStat=new WeakSet,onChangeAdjustItemStat_fn=__name2(async function(event){const $select=$(event.delegateTarget),propertyKey=$select.attr("data-item-property")??"",selectedValue=Number($select.val()),itemId=$select.closest(".item").attr("data-item-id")??"",item=this.actor.items.get(itemId);if(!item)throw ErrorPF2e("Item not found");const newValue=(()=>{if(item.isOfType("spellcastingEntry"))return{"system.proficiency.value":()=>Math.clamped(selectedValue,0,4)}[propertyKey]?.();if(item.isOfType("lore"))return Math.clamped(selectedValue,0,4);throw ErrorPF2e("Item not recognized")})();typeof newValue=="number"&&await item.update({[propertyKey]:newValue}),newValue!==getProperty(item,propertyKey)&&ui.notifications.warn(game.i18n.localize("PF2E.ErrorMessage.MinimumProfLevelSetByFeatures"))},"#onChangeAdjustItemStat"),_onClickAdjustItemStat=new WeakSet,onClickAdjustItemStat_fn=__name2(async function(event){const $button=$(event.delegateTarget),itemId=$button.closest(".item").attr("data-item-id")??"",item=this.actor.items.get(itemId);if(!item)throw ErrorPF2e("Item not found");const propertyKey=$button.attr("data-item-property")??"",change=event.type==="click"?1:-1,newValue=(()=>{if(item.isOfType("spellcastingEntry")){const proficiencyRank=item.system.proficiency.value;return{"system.proficiency.value":()=>Math.clamped(proficiencyRank+change,0,4)}[propertyKey]?.()}else if(item.isOfType("lore")){const currentRank=item.system.proficient.value;return Math.clamped(currentRank+change,0,4)}else throw ErrorPF2e("Item not recognized")})();typeof newValue=="number"&&await item.update({[propertyKey]:newValue})},"#onClickAdjustItemStat"),_getFeatSlotData=new WeakSet,getFeatSlotData_fn=__name2(function(event){const groupId=htmlClosest(event.target,"[data-group-id]")?.dataset.groupId,slotId=htmlClosest(event.target,"[data-slot-id]")?.dataset.slotId||null;return groupId?{groupId,slotId}:null},"#getFeatSlotData"),_sortFormulas=new WeakSet,sortFormulas_fn=__name2(async function(sourceFormula,targetUuid,entrySelector){if(!UUIDUtils.isItemUUID(targetUuid)||sourceFormula.uuid===targetUuid)return;const sourceLevel=sourceFormula.level,targetLevel=__privateGet(this,_knownFormulas)[targetUuid].level;if(!entrySelector&&sourceLevel!==targetLevel)return;const performSort=__name2(async(formulas2,source2,target2,siblings)=>{const results=SortingHelpers.performIntegerSort(source2,{target:target2,siblings});if(results.length){for(const result of results){const formula=formulas2.find(f=>f===result.target);formula&&(formula.sort=result.update.sort)}entrySelector?await(await this.actor.getCraftingEntry(entrySelector))?.updateFormulas(formulas2):await this.actor.update({"system.crafting.formulas":formulas2})}},"performSort");if(entrySelector){const entry=await this.actor.getCraftingEntry(entrySelector);if(!entry)throw ErrorPF2e(`Crafting entry "${entrySelector}" doesn't exist!`);const formulas2=deepClone(entry.preparedFormulaData),source2=formulas2.find(f=>f.itemUUID===sourceFormula.uuid),target2=formulas2.find(f=>f.itemUUID===targetUuid);if(source2&&target2){const siblings=formulas2.filter(f=>f.itemUUID!==source2.itemUUID);return performSort(formulas2,source2,target2,siblings)}}const formulas=this.actor.toObject().system.crafting?.formulas??[],source=formulas.find(f=>f.uuid===sourceFormula.uuid),target=formulas.find(f=>f.uuid===targetUuid);if(source&&target){const siblings=formulas.filter(f=>f.uuid!==source.uuid);return performSort(formulas,source,target,siblings)}},"#sortFormulas"),__name2(_CharacterSheetPF2e,"CharacterSheetPF2e");let CharacterSheetPF2e=_CharacterSheetPF2e;const _AttackPopout=class extends CharacterSheetPF2e{static{__name(this,"_AttackPopout")}constructor(object,options){if(super(object,options),__publicField(this,"type","strike"),__privateAdd(this,_strikeItemId,""),__privateAdd(this,_strikeSlug,""),__privateAdd(this,_strike,void 0),__privateAdd(this,_elementTrait,void 0),__privateAdd(this,_blasts,[]),!options.type)throw ErrorPF2e('AttackPopout is missing mandatory "type" option.');if(options.type==="blast"){if(!options.elementTrait)throw ErrorPF2e('AttackPopout of type "blast" is missing mandatory "elementalTrait" option.');__privateSet(this,_elementTrait,options.elementTrait)}else{if(!options.strikeSlug)throw ErrorPF2e('AttackPopout of type "strike" is missing mandatory "strikeSlug" option.');if(!options.strikeItemId)throw ErrorPF2e('AttackPopout of type "strike" is missing mandatory "strikeItemId" option.');__privateSet(this,_strikeSlug,options.strikeSlug),__privateSet(this,_strikeItemId,options.strikeItemId)}this.type=options.type}get template(){return"systems/pf2e/templates/actors/character/attack-popout.hbs"}get id(){const id=super.id;return this.type==="strike"?`${id}-strike-${__privateGet(this,_strikeItemId)}-${__privateGet(this,_strikeSlug)}`:`${id}-blast-${__privateGet(this,_elementTrait)}`}static get defaultOptions(){return{...super.defaultOptions,submitOnChange:!1,submitOnClose:!1,width:480,height:"auto",resizable:!1}}get label(){return this.type==="blast"?__privateGet(this,_blasts).at(0)?.label??null:__privateGet(this,_strike)?.label??null}async getData(options){const base=await super.getData(options);return this.type==="blast"?(base.elementalBlasts=__privateSet(this,_blasts,base.elementalBlasts.filter(b=>b.element===__privateGet(this,_elementTrait))),base.data.actions=[],base.toggles=base.toggles.filter(t=>t.domain==="elemental-blast")):(base.elementalBlasts=[],__privateGet(this,_strikeSlug)&&__privateGet(this,_strikeItemId)&&__privateSet(this,_strike,base.data.actions.find(a=>a.item.id===__privateGet(this,_strikeItemId)&&a.slug===__privateGet(this,_strikeSlug)))),{...base,strike:__privateGet(this,_strike),strikeIndex:base.data.actions.findIndex(a=>a===__privateGet(this,_strike)),popoutType:this.type}}activateListeners($html){super.activateListeners($html);const html=$html[0],{label}=this;if(label){const title=htmlQuery(htmlClosest(html,"div.window-app"),"h4.window-title");title&&(title.innerHTML=game.i18n.localize(label))}}_getHeaderButtons(){return super._getHeaderButtons().filter(b=>b.label==="Close")}};_strikeItemId=new WeakMap,_strikeSlug=new WeakMap,_strike=new WeakMap,_elementTrait=new WeakMap,_blasts=new WeakMap,__name2(_AttackPopout,"AttackPopout");let AttackPopout=_AttackPopout;const _MacroPF2e=class extends Macro{static{__name(this,"_MacroPF2e")}get visible(){return this.permission>=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER}};__name2(_MacroPF2e,"MacroPF2e");let MacroPF2e=_MacroPF2e;async function rollItemMacro(itemId){const speaker=ChatMessage.getSpeaker(),item=(canvas.tokens.get(speaker.token??"")?.actor??game.actors.get(speaker.actor??""))?.items?.get(itemId);if(!item){ui.notifications.warn(`Your controlled Actor does not have an item with ID ${itemId}`);return}return item.isOfType("action","feat")&&item.system.selfEffect?createSelfEffectMessage(item):item.toChat()}__name(rollItemMacro,"rollItemMacro"),__name2(rollItemMacro,"rollItemMacro");async function createActionMacro({actorUUID,actionIndex,elementTrait,slot}){const actor=resolveMacroActor(actorUUID);if(!actor?.isOfType("character","npc"))return;const data=(()=>{if(actor.isOfType("character")&&objectHasKey(CONFIG.PF2E.elementTraits,elementTrait)){const config=new ElementalBlast(actor).configs.find(c=>c.element===elementTrait);return config?{name:game.i18n.localize(config.label),command:`game.pf2e.rollActionMacro({ actorUUID: "${actorUUID}", type: "blast", elementTrait: "${elementTrait}" })`,img:config.img}:null}else if(actionIndex!==void 0){const action2=actor.system.actions[actionIndex];return action2?{name:`${game.i18n.localize("PF2E.WeaponStrikeLabel")}: ${action2.label}`,command:`game.pf2e.rollActionMacro({ actorUUID: "${actorUUID}", type: "strike", itemId: "${action2.item.id}", slug: "${action2.slug}" })`,img:action2.imageUrl}:null}return null})();if(!data)return;const actionMacro=game.macros.find(macro=>macro.name===data.name&¯o.command===data.command)??await MacroPF2e.create({command:data.command,name:data.name,type:"script",img:data.img,flags:{pf2e:{actionMacro:!0}}},{renderSheet:!1});game.user.assignHotbarMacro(actionMacro??null,slot)}__name(createActionMacro,"createActionMacro"),__name2(createActionMacro,"createActionMacro");async function rollActionMacro({actorUUID,itemId,elementTrait,slug,type}){const actor=resolveMacroActor(actorUUID);if(!actor?.isOfType("character","npc")){ui.notifications.error("PF2E.MacroActionNoActorError",{localize:!0});return}const strikes=actor.system.actions,strike=strikes.find(s=>s.item.id===itemId&&s.slug===slug)??strikes.find(s=>s.slug===slug);if(actor.isOfType("character")){const closedExisting=__name2(partialId=>{const appId=`AttackPopout-Actor-${actor.id}-${partialId}`,existing=Object.values(actor.apps).find(a=>a?.id===appId);return existing?(existing.close({force:!0}),!0):!1},"closedExisting");switch(type){case"blast":{if(closedExisting(`blast-${elementTrait}`))return;if(!actor.itemTypes.effect.find(e=>e.slug==="effect-kinetic-aura")){ui.notifications.error("PF2E.MacroActionNoActionError",{localize:!0});return}new AttackPopout(actor,{type,elementTrait}).render(!0);return}case"strike":{if(closedExisting(`strike-${itemId}-${slug}`))return;if(!strike){ui.notifications.error("PF2E.MacroActionNoActionError",{localize:!0});return}new AttackPopout(actor,{type,strikeItemId:itemId,strikeSlug:slug}).render(!0);return}}}if(!strike){ui.notifications.error("PF2E.MacroActionNoActionError",{localize:!0});return}const meleeOrRanged=strike.item.isMelee?"melee":"ranged",identifier=`${strike.item.id}.${strike.slug}.${meleeOrRanged}`,description=await TextEditor.enrichHTML(game.i18n.localize(strike.description),{async:!0}),templateData={actor,strike,identifier,description},content=await renderTemplate("systems/pf2e/templates/chat/strike-card.hbs",templateData),token=actor.token??actor.getActiveTokens(!0,!0).shift()??null,chatData={speaker:ChatMessagePF2e.getSpeaker({actor,token}),content,type:CONST.CHAT_MESSAGE_TYPES.OTHER},rollMode=game.settings.get("core","rollMode");return["gmroll","blindroll"].includes(rollMode)&&(chatData.whisper=ChatMessage.getWhisperRecipients("GM").map(u=>u.id)),rollMode==="blindroll"&&(chatData.blind=!0),ChatMessagePF2e.create(chatData)}__name(rollActionMacro,"rollActionMacro"),__name2(rollActionMacro,"rollActionMacro");async function createSkillMacro(skill,skillName,actorId,slot){const dictName=SKILL_DICTIONARY[skill]??skill,command=` + `,buttons:{yes:{icon:fontAwesomeIcon("hand-holding-medical").outerHTML,label:localize("Title"),callback:applyChanges},no:{icon:fontAwesomeIcon("times").outerHTML,label:localize("Cancel")}},default:"yes"}).render(!0)}__name(encouragingWords,"encouragingWords"),__name2(encouragingWords,"encouragingWords");const CANTRIP_DECK_ID="tLa4bewBhyqzi6Ow",scrollCompendiumIds={1:"RjuupS9xyXDLgyIr",2:"Y7UD64foDbDMV9sx",3:"ZmefGBXGJF3CFDbn",4:"QSQZJ5BC3DeHv153",5:"tjLvRWklAylFhBHQ",6:"4sGIy77COooxhQuC",7:"fomEZZ4MxVVK3uVu",8:"iPki3yuoucnj7bIt",9:"cFHomF3tty8Wi1e5",10:"o1XIHJ4MJyroAHfF"},SPELL_CONSUMABLE_NAME_TEMPLATES={cantripDeck5:"PF2E.Item.Physical.FromSpell.CantripDeck5",scroll:"PF2E.Item.Physical.FromSpell.Scroll",wand:"PF2E.Item.Physical.FromSpell.Wand"},wandCompendiumIds={1:"UJWiN0K3jqVjxvKk",2:"vJZ49cgi8szuQXAD",3:"wrDmWkGxmwzYtfiA",4:"Sn7v9SsbEDMUIwrO",5:"5BF7zMnrPYzyigCs",6:"kiXh4SUWKr166ZeM",7:"nmXPj9zuMRQBNT60",8:"Qs8RgNH6thRPv2jt",9:"Fgv722039TVM5JTc"};function getIdForSpellConsumable(type,heightenedLevel){switch(type){case"cantripDeck5":return CANTRIP_DECK_ID;case"scroll":return scrollCompendiumIds[heightenedLevel]??null;default:return wandCompendiumIds[heightenedLevel]??null}}__name(getIdForSpellConsumable,"getIdForSpellConsumable"),__name2(getIdForSpellConsumable,"getIdForSpellConsumable");function getNameForSpellConsumable(type,spellName,heightenedLevel){const templateId=SPELL_CONSUMABLE_NAME_TEMPLATES[type]||`${type} of {name} (Level {level})`;return game.i18n.format(templateId,{name:spellName,level:heightenedLevel})}__name(getNameForSpellConsumable,"getNameForSpellConsumable"),__name2(getNameForSpellConsumable,"getNameForSpellConsumable");function isSpellConsumable(itemId){return itemId===CANTRIP_DECK_ID||Object.values(scrollCompendiumIds).includes(itemId)||Object.values(wandCompendiumIds).includes(itemId)}__name(isSpellConsumable,"isSpellConsumable"),__name2(isSpellConsumable,"isSpellConsumable");async function createConsumableFromSpell(spell,{type,heightenedLevel=spell.baseRank,mystified=!1}){const pack=game.packs.find(p=>p.collection==="pf2e.equipment-srd"),itemId=getIdForSpellConsumable(type,heightenedLevel),consumable=await pack?.getDocument(itemId??"");if(!(consumable instanceof ConsumablePF2e))throw ErrorPF2e("Failed to retrieve consumable item");const consumableSource=consumable.toObject();consumableSource.system.traits.value.push(...spell.traditions),consumableSource.name=getNameForSpellConsumable(type,spell.name,heightenedLevel);const description=consumableSource.system.description.value;return consumableSource.system.description.value=(()=>{const paragraphElement=document.createElement("p"),linkElement=document.createElement("em");linkElement.append(spell.sourceId?`@UUID[${spell.sourceId}]{${spell.name}}`:spell.description),paragraphElement.append(linkElement);const containerElement=document.createElement("div"),hrElement=document.createElement("hr");return containerElement.append(paragraphElement,hrElement),hrElement.insertAdjacentHTML("afterend",description),containerElement.innerHTML})(),type!=="cantripDeck5"&&(consumableSource.system.spell=spell.clone({"system.location.heightenedLevel":heightenedLevel}).toObject()),mystified&&(consumableSource.system.identification.status="unidentified"),consumableSource}__name(createConsumableFromSpell,"createConsumableFromSpell"),__name2(createConsumableFromSpell,"createConsumableFromSpell");function calculateTrickMagicItemCheckDC(item,options={proficiencyWithoutLevel:!1}){const level=Number(item.level),saveDC=calculateDC(level,options),skills=item.system.traits.value.filter(t=>setHasElement(MAGIC_TRADITIONS,t)).map(tradition=>[traditionSkills[tradition],saveDC]);return Object.fromEntries(skills)}__name(calculateTrickMagicItemCheckDC,"calculateTrickMagicItemCheckDC"),__name2(calculateTrickMagicItemCheckDC,"calculateTrickMagicItemCheckDC");const WEAPON_CATEGORIES=new Set(["unarmed","simple","martial","advanced"]),MELEE_OR_RANGED_GROUPS=new Set(["dart","knife"]),MELEE_WEAPON_GROUPS=new Set([...MELEE_OR_RANGED_GROUPS,"axe","brawling","club","flail","hammer","pick","polearm","shield","spear","sword"]),MANDATORY_RANGED_GROUPS=new Set(["bomb","bow","firearm","sling"]);[...MELEE_WEAPON_GROUPS,...MANDATORY_RANGED_GROUPS];const THROWN_RANGES=new Set([10,15,20,30,40,60,80,100]),WEAPON_RANGES=new Set([...THROWN_RANGES,50,70,90,110,120,140,150,180,200,240,300]),CROSSBOW_WEAPONS=new Set(["arbalest","alchemical-crossbow","crossbow","hand-crossbow","heavy-crossbow","repeating-crossbow","repeating-hand-crossbow","repeating-heavy-crossbow","taw-launcher"]);function isRelevantEvent(event){return!!event&&"ctrlKey"in event&&"metaKey"in event&&"shiftKey"in event}__name(isRelevantEvent,"isRelevantEvent"),__name2(isRelevantEvent,"isRelevantEvent");function eventToRollParams(event,rollType){const key=rollType.type==="check"?"showCheckDialogs":"showDamageDialogs",skipDefault=!game.user.settings[key];if(!isRelevantEvent(event))return{skipDialog:skipDefault};const params={skipDialog:event.shiftKey?!skipDefault:skipDefault};return(event.ctrlKey||event.metaKey)&&(params.rollMode=game.user.isGM?"gmroll":"blindroll"),params}__name(eventToRollParams,"eventToRollParams"),__name2(eventToRollParams,"eventToRollParams");function calculateDaysToNoCost(costs){return Math.ceil((costs.itemPrice.copperValue-costs.materials.copperValue)/costs.reductionPerDay.copperValue)}__name(calculateDaysToNoCost,"calculateDaysToNoCost"),__name2(calculateDaysToNoCost,"calculateDaysToNoCost");async function prepStrings(costs,item){const rollData=item.getRollData();return{reductionPerDay:costs.reductionPerDay.toString(),materialCost:game.i18n.format("PF2E.Actions.Craft.Details.PayMaterials",{cost:costs.materials.toString()}),itemCost:game.i18n.format("PF2E.Actions.Craft.Details.PayFull",{cost:costs.itemPrice.toString()}),lostMaterials:game.i18n.format("PF2E.Actions.Craft.Details.LostMaterials",{cost:costs.lostMaterials.toString()}),itemLink:await TextEditor.enrichHTML(item.link,{rollData,async:!0})}}__name(prepStrings,"prepStrings"),__name2(prepStrings,"prepStrings");function calculateCosts(item,quantity,actor,degreeOfSuccess){const itemPrice=CoinsPF2e.fromPrice(item.price,quantity),materialCosts=itemPrice.scale(.5),lostMaterials=new CoinsPF2e,reductionPerDay=new CoinsPF2e,proficiency=actor.skills.crafting.rank;return proficiency?(degreeOfSuccess===DegreeOfSuccess.CRITICAL_SUCCESS?Object.assign(reductionPerDay,getIncomeForLevel(actor.level+1).rewards[proficiency]):degreeOfSuccess===DegreeOfSuccess.SUCCESS?Object.assign(reductionPerDay,getIncomeForLevel(actor.level).rewards[proficiency]):degreeOfSuccess===DegreeOfSuccess.CRITICAL_FAILURE&&Object.assign(lostMaterials,materialCosts.scale(.1)),{itemPrice,materials:materialCosts,lostMaterials,reductionPerDay}):null}__name(calculateCosts,"calculateCosts"),__name2(calculateCosts,"calculateCosts");async function craftItem(item,itemQuantity,actor,infused){const itemSource=item.toObject();itemSource.system.quantity=itemQuantity,itemSource.system.size=actor.size==="tiny"?"tiny":"med";const itemTraits=item.traits;if(infused&&itemTraits.has("alchemical")&&itemTraits.has("consumable")&&(itemSource.system.traits.value.push("infused"),itemSource.system.temporary=!0),!await actor.addToInventory(itemSource)){ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.CantAddItem"));return}await ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.ReceiveItem",{actorName:actor.name,quantity:itemQuantity,itemName:item.name}),speaker:{alias:actor.name}})}__name(craftItem,"craftItem"),__name2(craftItem,"craftItem");async function craftSpellConsumable(item,itemQuantity,actor){const consumableType=item.category;if(!(consumableType==="scroll"||consumableType==="wand"))return;const spellLevel=consumableType==="wand"?Math.ceil(item.level/2)-1:Math.ceil(item.level/2),validSpells=actor.itemTypes.spell.filter(s=>s.baseRank<=spellLevel&&!s.isCantrip&&!s.isFocusSpell&&!s.isRitual).reduce((result,spell)=>(result[spell.baseRank]=[...result[spell.baseRank]||[],spell],result),{}),content=await renderTemplate("systems/pf2e/templates/actors/crafting-select-spell-dialog.hbs",{spells:validSpells});new Dialog({title:game.i18n.localize("PF2E.Actions.Craft.SelectSpellDialog.Title"),content,buttons:{cancel:{icon:'',label:game.i18n.localize("Cancel")},craft:{icon:'',label:game.i18n.localize("PF2E.Actions.Craft.SelectSpellDialog.CraftButtonLabel"),callback:async $dialog=>{const spellId=String($dialog.find("select[name=spell]").val()),spell=actor.items.get(spellId);if(!spell?.isOfType("spell"))return;const item2=await createConsumableFromSpell(spell,{type:consumableType,heightenedLevel:spellLevel});return craftItem(new ConsumablePF2e(item2),itemQuantity,actor)}}},default:"craft"}).render(!0)}__name(craftSpellConsumable,"craftSpellConsumable"),__name2(craftSpellConsumable,"craftSpellConsumable");async function renderCraftingInline(item,roll,quantity,actor,free){if(!actor.isOfType("character"))return null;const degreeOfSuccess=roll.options.degreeOfSuccess??0,costs=calculateCosts(item,quantity,actor,degreeOfSuccess);if(!costs)return null;const daysForZeroCost=degreeOfSuccess>1?calculateDaysToNoCost(costs):0;return await renderTemplate("systems/pf2e/templates/chat/crafting-result.hbs",{daysForZeroCost,strings:await prepStrings(costs,item),item,quantity,success:degreeOfSuccess>1,criticalFailure:degreeOfSuccess===0,free})}__name(renderCraftingInline,"renderCraftingInline"),__name2(renderCraftingInline,"renderCraftingInline");const _RollNotePF2e=class _RollNotePF2e2{static{__name(this,"_RollNotePF2e")}selector;title;text;predicate;outcome;visibility;rule;constructor(params){this.selector=params.selector,this.title=params.title??null,this.text=params.text,this.predicate=new PredicatePF2e(params.predicate??[]),this.outcome=[...params.outcome??[]],this.visibility=params.visibility??null,this.rule=params.rule??null}static notesToHTML(notes){return createHTMLElement("ul",{classes:["notes"],children:notes.flatMap(n=>[` +`,n.toHTML()]).slice(1)})}toHTML(){const element=createHTMLElement("li",{classes:["roll-note"],dataset:{itemId:this.rule?.item.id,visibility:this.visibility},innerHTML:game.i18n.localize(this.text)});if(element.childNodes.length===1&&element.firstChild instanceof HTMLElement&&(element.innerHTML=element.firstChild.innerHTML),this.title){const strong=createHTMLElement("strong",{innerHTML:game.i18n.localize(this.title)});element.prepend(strong," ")}return element}clone(){return new _RollNotePF2e2({...this.toObject(),rule:this.rule})}toObject(){return{selector:this.selector,title:this.title,text:this.text,predicate:this.predicate.toObject(),outcome:this.outcome,visibility:this.visibility}}};__name2(_RollNotePF2e,"RollNotePF2e");let RollNotePF2e=_RollNotePF2e;function normalizeActionChangeData(document2,changed){if(changed.system&&("actionType"in changed.system||"actions"in changed.system)){const actionType=changed.system?.actionType?.value??document2.system.actionType.value,actionCount=Number(changed.system?.actions?.value??document2.system.actions.value);changed.system=mergeObject(changed.system,{actionType:{value:actionType},actions:{value:actionType!=="action"?null:Math.clamped(actionCount,1,3)}})}}__name(normalizeActionChangeData,"normalizeActionChangeData"),__name2(normalizeActionChangeData,"normalizeActionChangeData");function activateActionSheetListeners(item,html){htmlQuery(html,"a[data-action=frequency-add]")?.addEventListener("click",()=>{const frequency={max:1,per:"day"};item.update({system:{frequency}})}),htmlQuery(html,"a[data-action=frequency-delete]")?.addEventListener("click",()=>{item.update({"system.-=frequency":null})}),item.isOfType("action","feat")&&htmlQuery(html,"a[data-action=delete-effect]")?.addEventListener("click",()=>{item._source.system.selfEffect&&item.update({"system.-=selfEffect":null})})}__name(activateActionSheetListeners,"activateActionSheetListeners"),__name2(activateActionSheetListeners,"activateActionSheetListeners");function createSelfEffectSheetData(data){if(!data)return null;const indexEntry=fromUuidSync(data.uuid);indexEntry?.name&&isImageFilePath(indexEntry.img)&&(data.name=indexEntry.name,data.img=indexEntry.img);const parsedUUID=foundry.utils.parseUuid(data.uuid),linkData={id:parsedUUID.documentId??null,type:parsedUUID.documentType??null,pack:parsedUUID.collection instanceof CompendiumCollection?parsedUUID.collection.metadata.id:null};return{...data,...linkData}}__name(createSelfEffectSheetData,"createSelfEffectSheetData"),__name2(createSelfEffectSheetData,"createSelfEffectSheetData");async function handleSelfEffectDrop(sheet,event){if(!sheet.isEditable||sheet.item.system.actionType.value==="passive")return;const item=await(async()=>{try{const dataString=event.dataTransfer?.getData("text/plain"),dropData=JSON.parse(dataString??"");return await ItemPF2e.fromDropData(dropData)??null}catch{return null}})();if(!(item instanceof EffectPF2e))throw ErrorPF2e("Invalid item drop");await sheet.item.update({"system.selfEffect":{uuid:item.uuid,name:item.name}})}__name(handleSelfEffectDrop,"handleSelfEffectDrop"),__name2(handleSelfEffectDrop,"handleSelfEffectDrop");function createActionRangeLabel(range){if(!range?.max)return null;const[key,value]=range.increment?["PF2E.Action.Range.IncrementN",range.increment]:["PF2E.Action.Range.MaxN",range.max];return game.i18n.format(key,{n:value})}__name(createActionRangeLabel,"createActionRangeLabel"),__name2(createActionRangeLabel,"createActionRangeLabel");var LightLevels=(LightLevels2=>(LightLevels2[LightLevels2.DARKNESS=.25]="DARKNESS",LightLevels2[LightLevels2.BRIGHT_LIGHT=.75]="BRIGHT_LIGHT",LightLevels2))(LightLevels||{});let auraCheckLock=Promise.resolve();const checkAuras=foundry.utils.debounce(async function(){if(!(canvas.ready&&this.isInFocus&&this.grid.type===CONST.GRID_TYPES.SQUARE))return;await auraCheckLock;const lock={release:()=>{}};auraCheckLock=new Promise(resolve=>{lock.release=resolve});try{const tokens=this.tokens.reduce((list,token)=>(token.isLinked&&list.some(t=>t.actor===token.actor)||list.push(token),list),[]);for(const token of tokens)await token.object?._animation;for(const aura of tokens.flatMap(t=>Array.from(t.auras.values())))await aura.notifyActors();const sceneActors=new Set(tokens.flatMap(t=>t.actor?.primaryUpdater===game.user?t.actor:[]));for(const actor of sceneActors)actor.checkAreaEffects()}finally{lock.release()}},100),_ScenePF2e=class extends Scene{static{__name(this,"_ScenePF2e")}get rulesBasedVision(){return this.tokenVision?this.flags.pf2e.rulesBasedVision??game.settings.get("pf2e","automation.rulesBasedVision"):!1}get hearingRange(){return this.flags.pf2e.hearingRange}get darknessSyncedToTime(){return this.flags.pf2e.syncDarkness==="enabled"||this.flags.pf2e.syncDarkness==="default"&&game.settings.get("pf2e","worldClock.syncDarkness")}get lightLevel(){return 1-this.darkness}get isBright(){return this.lightLevel>=LightLevels.BRIGHT_LIGHT}get isDimlyLit(){return!this.isBright&&!this.isDark}get isDark(){return this.lightLevel<=LightLevels.DARKNESS}get hasHexGrid(){return![CONST.GRID_TYPES.GRIDLESS,CONST.GRID_TYPES.SQUARE].includes(this.grid.type)}get isInFocus(){const soleUserIsGM=game.user.isGM&&game.users.filter(u=>u.active).length===1;return this.active&&!soleUserIsGM||this.isView&&soleUserIsGM}prepareData(){super.prepareData(),Promise.resolve().then(()=>{this.checkAuras()})}prepareBaseData(){super.prepareBaseData(),this.flags.pf2e=mergeObject({hearingRange:null,rulesBasedVision:null,syncDarkness:"default"},this.flags.pf2e??{}),this.rulesBasedVision&&(this.globalLight=!0,this.globalLightThreshold=1-(LightLevels.DARKNESS+.001))}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId);const flagChanges=changed.flags?.pf2e??{};if(this.isView&&["rulesBasedVision","hearingRange"].some(k=>flagChanges[k]!==void 0)&&canvas.perception.update({initializeLighting:!0,initializeVision:!0}),changed.active&&canvas.scene===this)for(const token of canvas.tokens.placeables)token.auras.reset()}_onDeleteDescendantDocuments(parent,collection,documents,ids,options,userId){super._onDeleteDescendantDocuments(parent,collection,documents,ids,options,userId),documents.some(d=>d instanceof TokenDocumentPF2e&&!(d._source.light.dim||d._source.light.bright)&&d.actor?.synthetics.tokenOverrides.light)&&canvas.perception.update({initializeLighting:!0,initializeVision:!0})}};__name2(_ScenePF2e,"ScenePF2e");let ScenePF2e=_ScenePF2e;Object.defineProperty(ScenePF2e.prototype,"checkAuras",{configurable:!1,enumerable:!1,writable:!1,value:checkAuras});const _AmbientLightDocumentPF2e=class extends AmbientLightDocument{static{__name(this,"_AmbientLightDocumentPF2e")}get isDarkness(){return this.object?.source.isDarkness??!1}};__name2(_AmbientLightDocumentPF2e,"AmbientLightDocumentPF2e");let AmbientLightDocumentPF2e=_AmbientLightDocumentPF2e;const _MeasuredTemplateDocumentPF2e=class extends MeasuredTemplateDocument{static{__name(this,"_MeasuredTemplateDocumentPF2e")}get item(){const origin=this.flags.pf2e?.origin,uuid=origin?.uuid;if(!uuid)return null;const item=fromUuidSync(uuid);if(!(item instanceof ItemPF2e))return null;if(item?.isOfType("spell")){const overlayIds=origin?.variant?.overlays,castRank=origin?.castLevel??item.rank;return item.loadVariant({overlayIds,castLevel:castRank})??item}return item}get message(){return game.messages.get(this.flags.pf2e?.messageId??"")??null}_onCreate(data,options,userId){super._onCreate(data,options,userId),toggleClearTemplatesButton(this.message)}_onDelete(options,userId){super._onDelete(options,userId),toggleClearTemplatesButton(this.message)}};__name2(_MeasuredTemplateDocumentPF2e,"MeasuredTemplateDocumentPF2e");let MeasuredTemplateDocumentPF2e=_MeasuredTemplateDocumentPF2e;const _TileDocumentPF2e=class extends TileDocument{static{__name(this,"_TileDocumentPF2e")}};__name2(_TileDocumentPF2e,"TileDocumentPF2e");let TileDocumentPF2e=_TileDocumentPF2e;const _TokenConfigPF2e=class extends TokenConfig{static{__name(this,"_TokenConfigPF2e")}constructor(){super(...arguments),__privateAdd(this,_disableScale),__privateAdd(this,_reestablishPrototype),__privateAdd(this,_disableVisionInputs)}static get defaultOptions(){return{...super.defaultOptions,template:"systems/pf2e/templates/scene/token/sheet.hbs",sheetConfig:!1}}get dimensionsFromActorSize(){const actorSize=this.actor?.size??"med";return{tiny:.5,sm:1,med:1,lg:2,huge:3,grg:4}[actorSize]}async getData(options){return{...await super.getData(options),sizeLinkable:!!this.actor&&SIZE_LINKABLE_ACTOR_TYPES.has(this.actor.type),linkToSizeTitle:this.token.flags.pf2e.linkToActorSize?"Unlink":"Link",autoscaleTitle:this.token.flags.pf2e.autoscale?"Unlink":"Link"}}_getFilePickerOptions(event){return{...super._getFilePickerOptions(event),redirectToRoot:this.actor?[ActorPF2e.getDefaultArtwork(this.actor.toObject()).texture.src]:[]}}activateListeners($html){super.activateListeners($html);const html=$html[0];__privateMethod(this,_disableVisionInputs,disableVisionInputs_fn).call(this,html),this.token.flags.pf2e.autoscale&&__privateMethod(this,_disableScale,disableScale_fn).call(this,html),htmlQuery(html,"a[data-action=toggle-link-to-size]")?.addEventListener("click",async()=>{await this.token.update({"flags.pf2e.linkToActorSize":!this.token.flags.pf2e.linkToActorSize}),__privateMethod(this,_reestablishPrototype,reestablishPrototype_fn).call(this),await this.render()}),htmlQuery(html,"a[data-action=toggle-autoscale]")?.addEventListener("click",async()=>{await this.token.update({"flags.pf2e.autoscale":!this.token.flags.pf2e.autoscale}),__privateMethod(this,_reestablishPrototype,reestablishPrototype_fn).call(this),await this.render()})}_getSubmitData(updateData={}){const changes=updateData??{};return this.form.querySelector("input[name=scale]")?.disabled&&(changes.scale=Math.abs(this.token._source.texture.scaleX)),super._getSubmitData(changes)}async _updateObject(event,formData){if(formData["flags.pf2e.linkToActorSize"]===!0)if(this.actor?.isOfType("vehicle")){const{dimensions}=this.actor,width=Math.max(Math.round(dimensions.width/5),1),length=Math.max(Math.round(dimensions.length/5),1);formData.width=width,formData.height=length}else formData.width=formData.height=this.dimensionsFromActorSize;return super._updateObject(event,formData)}};_disableScale=new WeakSet,disableScale_fn=__name2(function(html){if(!game.settings.get("pf2e","tokens.autoscale"))return;const scale=html.querySelector(".form-group.scale");if(!scale)throw ErrorPF2e("Scale form group missing");scale.classList.add("children-disabled");const constrainedScale=String(this.actor?.size==="sm"?.8:1),rangeInput=scale.querySelector("input[type=range]");if(rangeInput){rangeInput.disabled=!0,rangeInput.value=constrainedScale;const rangeDisplayValue=scale.querySelector(".range-value");rangeDisplayValue&&(rangeDisplayValue.innerHTML=constrainedScale)}},"#disableScale"),_reestablishPrototype=new WeakSet,reestablishPrototype_fn=__name2(function(){if(this.isPrototype&&this.actor){const realPrototype=this.actor.prototypeToken;this.object=this.token=realPrototype}},"#reestablishPrototype"),_disableVisionInputs=new WeakSet,disableVisionInputs_fn=__name2(function(html){if(!(["character","familiar"].includes(this.actor?.type??"")&&(this.token.rulesBasedVision||this.isPrototype&&game.settings.get("pf2e","automation.rulesBasedVision"))))return;const sightInputNames=["angle","brightness","range","saturation","visionMode"].map(n=>`sight.${n}`),sightInputs=Array.from(html.querySelectorAll(sightInputNames.map(n=>`[name="${n}"]`).join(", "))),sightEnabledInput=html.querySelector('input[name="sight.enabled"]');if(!sightEnabledInput)throw ErrorPF2e("sight.enabled input not found");sightEnabledInput.addEventListener("change",()=>{for(const input of sightInputs)if(input.disabled=!sightEnabledInput.checked,input.type==="range")sightEnabledInput.checked?input.closest(".form-group")?.classList.remove("children-disabled"):input.closest(".form-group")?.classList.add("children-disabled");else if(input.name==="sight.color"){const colorInput=input.parentElement?.querySelector("input[type=color]");colorInput&&(colorInput.disabled=!sightEnabledInput.checked)}});for(const input of sightInputs)input.disabled=!0,input.type==="range"&&input.closest(".form-group")?.classList.add("children-disabled");html.querySelector("a.item[data-tab=detection]")?.classList.add("disabled");const managedBy=document.createElement("a");managedBy.className="managed-by-rbv",managedBy.append(fontAwesomeIcon("robot")),managedBy.title=game.i18n.localize("PF2E.SETTINGS.Automation.RulesBasedVision.ManagedBy").replace(/<\/?rbv>/g,"");for(const sightInput of sightInputs){const anchor=managedBy.cloneNode(!0);anchor.addEventListener("click",()=>{const menu=game.settings.menus.get("pf2e.automation");if(!menu)throw ErrorPF2e("Automation Settings application not found");new menu.type().render(!0)}),sightInput.closest(".form-group")?.querySelector("label")?.append(anchor)}},"#disableVisionInputs"),__name2(_TokenConfigPF2e,"TokenConfigPF2e");let TokenConfigPF2e=_TokenConfigPF2e;const _AmbientLightPF2e=class extends AmbientLight{static{__name(this,"_AmbientLightPF2e")}get isDarkness(){return this.source.isDarkness}};__name2(_AmbientLightPF2e,"AmbientLightPF2e");let AmbientLightPF2e=_AmbientLightPF2e;const _EffectsCanvasGroupPF2e=class extends EffectsCanvasGroup{static{__name(this,"_EffectsCanvasGroupPF2e")}get rulesBasedVision(){return game.settings.get("pf2e","automation.rulesBasedVision")&&canvas.ready&&!!canvas.scene?.tokenVision}};__name2(_EffectsCanvasGroupPF2e,"EffectsCanvasGroupPF2e");let EffectsCanvasGroupPF2e=_EffectsCanvasGroupPF2e;const _LightingLayerPF2e=class extends LightingLayer{static{__name(this,"_LightingLayerPF2e")}get lightingLevel(){return 1-canvas.darknessLevel}};__name2(_LightingLayerPF2e,"LightingLayerPF2e");let LightingLayerPF2e=_LightingLayerPF2e;const _TemplateLayerPF2e=class extends TemplateLayer{static{__name(this,"_TemplateLayerPF2e")}_onDragLeftMove(event){if(!canvas.scene||!canvas.dimensions)return;const interaction=event.interactionData,{destination,layerDragState,preview:template,origin}=interaction;if(!template||template.destroyed)return;if(template.parent===null&&this.preview.addChild(template),(layerDragState??0)>=1){const{x,y}=canvas.grid.getSnappedPosition(destination.x,destination.y,2);if(destination.x=x,destination.y=y,!template)return;const ray=new Ray(origin,destination),ratio=canvas.dimensions.size/canvas.dimensions.distance;if(["cone","circle"].includes(template.type)){const direction=ray.angle,snapAngle=Math.PI/(canvas.scene.hasHexGrid?6:4);template.document.direction=Math.toDegrees(Math.floor((direction+Math.PI*.125)/snapAngle)*snapAngle);const distance=Math.max(ray.distance/ratio,canvas.dimensions.distance);template.document.distance=Math.floor(distance/canvas.dimensions.distance)*canvas.dimensions.distance}else template.document.direction=Math.toDegrees(ray.angle),template.document.distance=ray.distance/ratio;template.refresh(),event.interactionData.layerDragState=2}}_onMouseWheel(event){const template=this.hover;if(!(template&&canvas.scene))return;const increment=event.shiftKey?15:5,coneMultiplier=template.type==="cone"?canvas.scene.hasHexGrid?2:3:1,snap=increment*coneMultiplier,delta=snap*Math.sign(event.deltaY);return template.rotate(template.document.direction+delta,snap)}};__name2(_TemplateLayerPF2e,"TemplateLayerPF2e");let TemplateLayerPF2e=_TemplateLayerPF2e;const _TokenLayerPF2e=class extends TokenLayer{static{__name(this,"_TokenLayerPF2e")}cycleStack(){const hovered=this.hover;if(!hovered)return!1;const stack=this.placeables.filter(t=>hovered.distanceTo(t)===0&&hovered.document.elevation===t.document.elevation).sort((a,b)=>a.mesh.sort-b.mesh.sort);if(stack.length<2)return!1;const first=stack.shift();stack.push(first);for(let sort=stack.length-1;sort>=0;sort--){const token=stack[sort];token.document.sort=sort,token.mesh.initialize({sort}),sort===stack.length-1&&(token.emitHoverIn(new PointerEvent("pointerenter")),this.hover=token)}return!0}};__name2(_TokenLayerPF2e,"TokenLayerPF2e");let TokenLayerPF2e=_TokenLayerPF2e;const _HearingSource=class extends SoundSource{static{__name(this,"_HearingSource")}_initialize(data){super._initialize(data),this.data.x=this.object.center.x,this.data.y=this.object.center.y,this.data.elevation=this.object.document.elevation,this.data.radius=canvas.dimensions?.maxR??1e3,this.data.walls=!0}};__name2(_HearingSource,"HearingSource");let HearingSource=_HearingSource;const _EffectAreaSquare=class extends PIXI.Rectangle{static{__name(this,"_EffectAreaSquare")}active;constructor(x,y,width,height,active=!0){super(x,y,width,height),this.active=active}get center(){return{x:this.x+this.width/2,y:this.y+this.height/2}}highlight(layer,{border,highlight}){this.x<0||this.y<0||(this.active?canvas.grid.grid.highlightGridPosition(layer,{x:this.x,y:this.y,border:border?.color,color:highlight.color,alpha:highlight.alpha}):(canvas.grid.grid.highlightGridPosition(layer,{x:this.x,y:this.y,border:0,color:0}),layer.beginFill(0,.5).moveTo(this.x,this.y).lineTo(this.x+this.width,this.y+this.height).endFill()))}};__name2(_EffectAreaSquare,"EffectAreaSquare");let EffectAreaSquare=_EffectAreaSquare;function getAreaSquares(data){if(!canvas.dimensions)return[];const squareWidth=canvas.dimensions.size,rowCount=Math.ceil(data.bounds.width/squareWidth),emptyVector=Array(rowCount-1).fill(null),genColumn=__name2(square=>emptyVector.reduce(colSquares=>{const squareAbove=colSquares.at(-1),squareBelow=new EffectAreaSquare(square.x,squareAbove.y+squareWidth,squareWidth,squareWidth);return colSquares.push(squareBelow),colSquares},[square]),"genColumn"),topLeftSquare=new EffectAreaSquare(data.bounds.x,data.bounds.y,squareWidth,squareWidth),collisionType=data.traits?.includes("visual")&&!data.traits.includes("auditory")?"sight":data.traits?.includes("auditory")&&!data.traits.includes("visual")?"sound":"move",tokenBounds=data.token.mechanicalBounds,tokenCenter=data.token.center,tokenCenters=[tokenCenter,...[{x:0,y:1},{x:1,y:0},{x:0,y:-1},{x:-1,y:0}].map(c=>({x:tokenCenter.x+c.x*Math.round(tokenBounds.width/8),y:tokenCenter.y+c.y*Math.round(tokenBounds.height/8)}))];return emptyVector.reduce(squares=>{const lastSquare=squares.at(-1).at(-1),column=genColumn(new EffectAreaSquare(lastSquare.x+squareWidth,topLeftSquare.y,squareWidth,squareWidth));return squares.push(column),squares},[genColumn(topLeftSquare)]).flat().filter(s=>measureDistanceCuboid(tokenBounds,s)<=data.radius).map(square=>(square.active=tokenCenters.some(c=>!CONFIG.Canvas.polygonBackends[collisionType].testCollision(c,square.center,{type:collisionType,mode:"any"})),square))}__name(getAreaSquares,"getAreaSquares"),__name2(getAreaSquares,"getAreaSquares");const _AuraRenderer=class extends PIXI.Graphics{static{__name(this,"_AuraRenderer")}constructor(params){super(),__privateAdd(this,_drawBorder),__privateAdd(this,_drawTexture),__privateAdd(this,_drawLabel),__publicField(this,"slug"),__publicField(this,"token"),__publicField(this,"radius"),__publicField(this,"radiusPixels"),__publicField(this,"traits"),__publicField(this,"appearance"),__publicField(this,"border",new PIXI.Graphics),__publicField(this,"textureContainer",null),this.slug=params.slug,this.token=params.token,this.appearance=params.appearance,this.radius=params.radius,this.radiusPixels=.5*this.token.mechanicalBounds.width+this.radius/(canvas.dimensions?.distance??0)*canvas.grid.size,this.traits=params.traits,this.addChild(this.border)}get bounds(){const{token,radiusPixels}=this,bounds=token.mechanicalBounds;return new PIXI.Rectangle(bounds.x-(radiusPixels-bounds.width/2),bounds.y-(radiusPixels-bounds.width/2),radiusPixels*2,radiusPixels*2)}get highlightLayer(){return canvas.grid?.getHighlightLayer(this.token.highlightId)??null}get squares(){return getAreaSquares(this)}async draw(showBorder){const{mechanicalBounds}=this.token;return this.x=mechanicalBounds.width/2,this.y=mechanicalBounds.height/2,this.token.document.width<1&&(this.x+=mechanicalBounds.x-this.token.x,this.y+=mechanicalBounds.y-this.token.y),__privateMethod(this,_drawBorder,drawBorder_fn).call(this),this.border.visible=showBorder,__privateMethod(this,_drawTexture,drawTexture_fn).call(this)}repositionTexture(){if(this.textureContainer){const{bounds,radiusPixels}=this;this.textureContainer.position.set(bounds.x+radiusPixels,bounds.y+radiusPixels)}}highlight(){const{dimensions}=canvas;if(!dimensions)return;if(__privateMethod(this,_drawLabel,drawLabel_fn).call(this),!!(this.token.actor?.isOfType("familiar")?this.token.actor.master?.combatant?.encounter.active:this.token.combatant?.encounter.active)){const{highlightLayer}=this;if(!highlightLayer)return;for(const square of this.squares)square.highlight(highlightLayer,this.appearance)}}destroy(options){super.destroy(options),this.textureContainer&&(canvas.grid.grid.removeChild(this.textureContainer),this.textureContainer.destroyed||this.textureContainer.destroy())}};_drawBorder=new WeakSet,drawBorder_fn=__name2(function(){const data=this.appearance.border;!data||this.border.geometry.graphicsData.length>0||this.border.lineStyle(_AuraRenderer.LINE_THICKNESS,data.color,data.alpha).drawCircle(0,0,this.radiusPixels)},"#drawBorder"),_drawTexture=new WeakSet,drawTexture_fn=__name2(async function(){const data=this.appearance.texture;if(!data||this.token.isPreview||this.textureContainer)return;const texture=await(async()=>{const maybeTexture=await loadTexture(data.src,{fallback:"icons/svg/hazard.svg"});if(!(maybeTexture instanceof PIXI.Texture))return null;const globalVideo=isVideoFilePath(data.src)?game.video.getVideoSource(maybeTexture):null;if(globalVideo){maybeTexture.destroy();const videoTexture=await game.video.cloneTexture(globalVideo),video=game.video.getVideoSource(videoTexture)??globalVideo;video.playbackRate=data.playbackRate;const offset=data.loop?Math.random()*video.duration:0;return game.video.play(video,{volume:0,offset,loop:data.loop}),videoTexture}else return maybeTexture})();if(!texture)return;const{bounds,radiusPixels}=this,radius=data.scale*radiusPixels,diameter=radius*2,scale={x:diameter/texture.width,y:diameter/texture.height},matrix=new PIXI.Matrix(scale.x,void 0,void 0,scale.y,radius,radius);this.textureContainer=new PIXI.Graphics().beginTextureFill({texture,alpha:data.alpha,matrix}).drawCircle(0,0,radius).endFill(),this.textureContainer.position.set(bounds.x+radiusPixels,bounds.y+radiusPixels),canvas.grid.grid.addChild(this.textureContainer)},"#drawTexture"),_drawLabel=new WeakSet,drawLabel_fn=__name2(function(){const style=CONFIG.canvasTextStyle.clone(),gridSize=canvas.dimensions?.size??100;style.fontSize=Math.max(Math.round(gridSize*.36*12)/12,36),style.align="center";const bounds=this.token.mechanicalBounds,gridUnits=canvas.scene?.grid.units.trim()||game.system.gridUnits,label=[this.radius,gridUnits].join(""),text=new PreciseText(label,style),center={x:bounds.x+bounds.width/2,y:bounds.y+bounds.height/2},textOffset=Math.sqrt(style.fontSize);text.position.set(center.x+textOffset,center.y-this.radiusPixels-style.fontSize-textOffset),this.highlightLayer?.beginFill(0,.5).lineStyle(_AuraRenderer.LINE_THICKNESS,0).drawCircle(center.x,center.y-this.radiusPixels,6).endFill().addChild(text)},"#drawLabel"),__name2(_AuraRenderer,"AuraRenderer"),__publicField(_AuraRenderer,"LINE_THICKNESS",3);let AuraRenderer=_AuraRenderer;const _AuraRenderers=class extends Map{static{__name(this,"_AuraRenderers")}constructor(token){super(),__privateAdd(this,_showBordersHighlights),__publicField(this,"token"),this.token=token}get highlightId(){return this.token.highlightId}async reset(slugs){if(!slugs)this.clear();else for(const slug of slugs)this.delete(slug);if(!this.token.actor)return;const data=Array.from(this.token.document.auras.values()).filter(a=>slugs?.includes(a.slug)??!0);for(const datum of data){const renderer=new AuraRenderer({...datum,token:this.token});this.set(datum.slug,this.token.addChild(renderer))}return this.draw()}refreshPositions(){for(const aura of this.values())aura.repositionTexture()}async draw(){if(this.size===0||(this.clearHighlights(),this.token.isAnimating))return;const showBordersHighlights=__privateGet(this,_showBordersHighlights,showBordersHighlights_get);for(const aura of this.values())await aura.draw(showBordersHighlights);if(showBordersHighlights&&(this.token.hover||this.token.layer.highlightObjects)){const{highlightId}=this;(canvas.grid.highlightLayers[highlightId]??canvas.grid.addHighlightLayer(highlightId)).clear();for(const aura of this.values())aura.highlight()}}delete(key){const aura=this.get(key);return aura?(aura.destroyed||aura.destroy(!0),this.token.removeChild(aura),super.delete(key)):!1}clear(){this.clearHighlights();for(const aura of this.values())aura.destroyed||aura.destroy(!0),this.token.removeChild(aura);return super.clear()}destroy(){this.clear()}clearHighlights(){canvas.grid.destroyHighlightLayer(this.highlightId)}};_showBordersHighlights=new WeakSet,showBordersHighlights_get=__name2(function(){const inEncounter=__name2(()=>!!(this.token.actor?.isOfType("familiar")?this.token.actor.master?.combatant?.encounter.active:this.token.combatant?.encounter.active),"inEncounter");return canvas.scene?.grid.type===CONST.GRID_TYPES.SQUARE&&canvas.scene.tokenVision&&canvas.scene.isInFocus&&(game.user.isGM||this.token.actor?.alliance==="party")&&(this.token.controlled||this.token.hover||this.token.layer.highlightObjects||inEncounter())},"#showBordersHighlights"),__name2(_AuraRenderers,"AuraRenderers");let AuraRenderers=_AuraRenderers;const _FlankingHighlightRenderer=class{static{__name(this,"_FlankingHighlightRenderer")}_layer;token;labelText;lineColor;constructor(token){this._layer=null,this.token=token,this.labelText=game.i18n.localize("PF2E.Token.Flanking"),this.lineColor=CONFIG.Canvas.dispositionColors.CONTROLLED}get layer(){return this._layer??this.addLayer()}get shouldRender(){return canvas.ready&&!!canvas.scene?.isInFocus&&this.tokenIsSelectedOrOwn&&this.tokenIsReady}get tokenIsSelectedOrOwn(){return this.token.controlled&&this.token.isOwner||!!this.token.actor&&this.token.actor?.id===game.user.character?.id}get tokenIsReady(){return!this.token.isPreview&&!this.token.isAnimating}draw(){this.clear(),canvas.tokens.highlightObjects&&game.user.targets.size&&this.shouldRender&&game.user.targets.forEach(target=>this.drawForTarget(target))}drawForTarget(target){const buddies=this.token.buddiesFlanking(target,{ignoreFlankable:!0});this.drawBuddyLines(buddies)}drawBuddyLines(buddies){buddies.forEach(b=>this.drawBuddyLine(b))}drawBuddyLine(buddy){const t=CONFIG.Canvas.objectBorderThickness,o=Math.round(t*1.5),c=Math.round(t*2);this.layer.lineStyle(o,0,.5).moveTo(this.token.center.x,this.token.center.y).lineTo(buddy.center.x,buddy.center.y),this.layer.lineStyle(t,this.lineColor,.5).moveTo(this.token.center.x,this.token.center.y).lineTo(buddy.center.x,buddy.center.y),this.layer.beginFill(this.lineColor).lineStyle(1,0).drawCircle(this.token.center.x,this.token.center.y,c),this.layer.beginFill(this.lineColor).lineStyle(1,0).drawCircle(buddy.center.x,buddy.center.y,c),this.drawLabel(buddy)}drawLabel(buddy){const mid_x=Math.round((this.token.center.x+buddy.center.x)/2),mid_y=Math.round((this.token.center.y+buddy.center.y)/2),vect_x=buddy.center.x-this.token.center.x,vect_y=buddy.center.y-this.token.center.y,perp_vect_x=vect_x<=-vect_x?-vect_y:vect_y,perp_vect_y=vect_x<=-vect_x?vect_x:-vect_x,offsetScale=20/Math.sqrt(perp_vect_x**2+perp_vect_y**2),perp_x=mid_x+Math.round(perp_vect_x*offsetScale),perp_y=mid_y+Math.round(perp_vect_y*offsetScale),style=CONFIG.canvasTextStyle.clone();style.fontSize=24,canvas.dimensions?.size&&canvas.dimensions.size>=200?style.fontSize=28:canvas.dimensions?.size&&canvas.dimensions.size<50&&(style.fontSize=20),style.fill=this.lineColor,style.stroke=0;const text=new PreciseText(this.labelText,style);text.anchor.set(.5,.5);let rotation=Math.atan2(vect_y,vect_x);rotation>Math.PI/2?rotation=rotation-Math.PI:rotation<-Math.PI/2&&(rotation=rotation+Math.PI),text.rotation=rotation,text.position.set(perp_x,perp_y),this.layer.addChild(text)}clear(){this._layer?.destroy({children:!0}),this._layer=null}destroy(){this.clear()}addLayer(){return this._layer=new PIXI.Graphics,this.token.layer.addChild(this._layer)}};__name2(_FlankingHighlightRenderer,"FlankingHighlightRenderer");let FlankingHighlightRenderer=_FlankingHighlightRenderer;const _TokenPF2e=class extends Token{static{__name(this,"_TokenPF2e")}auras;flankingHighlight;hearing;constructor(document2){super(document2),this.hearing=new HearingSource({object:this}),this.auras=new AuraRenderers(this),Object.defineProperty(this,"auras",{configurable:!1,writable:!1}),this.flankingHighlight=new FlankingHighlightRenderer(this),Object.defineProperty(this,"flankingHighlight",{configurable:!1,writable:!1})}get isVisible(){if(this.detectionFilter=null,this.document.hidden&&!game.user.isGM)return!1;if(!canvas.effects.visibility.tokenVision||this.controlled||canvas.effects.visionSources.get(this.sourceId)?.active)return!0;const tolerance=Math.floor(.35*Math.min(this.w,this.h));return canvas.effects.visibility.testVisibility(this.center,{tolerance,object:this})}get isAnimating(){return!!this._animation}get emitsDarkness(){return this.document.emitsDarkness}get hasLowLightVision(){return this.document.hasLowLightVision}get hasDarkvision(){return this.document.hasDarkvision}get linkToActorSize(){return this.document.linkToActorSize}get highlightId(){return`Token.${this.id}`}get mechanicalBounds(){const bounds=super.bounds;if(this.document.width<1){const position=canvas.grid.getTopLeft(bounds.x+bounds.width/2,bounds.y+bounds.height/2);return new PIXI.Rectangle(position[0],position[1],Math.max(canvas.grid.size,bounds.width),Math.max(canvas.grid.size,bounds.height))}return bounds}get sightRange(){return this.document.sight.range>=canvas.dimensions.maxR?canvas.dimensions.maxR:super.sightRange}isAdjacentTo(token){return this.distanceTo(token)===5}canFlank(flankee,context={}){if(this===flankee||!game.settings.get("pf2e","automation.flankingDetection"))return!1;const flankable=context.ignoreFlankable||flankee.actor?.attributes.flanking.flankable;if(!(this.actor?.attributes.flanking.canFlank&&flankable)||!this.actor.isOfType("character","npc")||!flankee.actor?.isOfType("creature")||this.actor.isAllyOf(flankee.actor))return!1;const reach=context.reach??this.actor.getReach({action:"attack"});return this.actor.canAttack&&reach>=this.distanceTo(flankee,{reach})}onOppositeSides(flankerA,flankerB,flankee){const{lineSegmentIntersects}=foundry.utils,[centerA,centerB]=[flankerA.center,flankerB.center],{bounds}=flankee,left=new Ray({x:bounds.left,y:bounds.top},{x:bounds.left,y:bounds.bottom}),right=new Ray({x:bounds.right,y:bounds.top},{x:bounds.right,y:bounds.bottom}),top=new Ray({x:bounds.left,y:bounds.top},{x:bounds.right,y:bounds.top}),bottom=new Ray({x:bounds.left,y:bounds.bottom},{x:bounds.right,y:bounds.bottom}),intersectsSide=__name2(side=>lineSegmentIntersects(centerA,centerB,side.A,side.B),"intersectsSide");return intersectsSide(left)&&intersectsSide(right)||intersectsSide(top)&&intersectsSide(bottom)}isFlanking(flankee,context={}){if(!(this.actor&&this.canFlank(flankee,context)))return!1;const{flanking}=this.actor.attributes,flankingBuddies=canvas.tokens.placeables.filter(t=>t!==this&&t.canFlank(flankee,pick$1(context,["ignoreFlankable"])));return flankingBuddies.length===0?!1:flanking.canGangUp.some(g=>typeof g=="number"&&g<=flankingBuddies.length)||this.isAdjacentTo(flankee)&&flanking.canGangUp.includes("animal-companion")&&flankingBuddies.some(b=>{if(!b.actor?.isOfType("character"))return!1;const traits=b.actor.traits;return traits.has("minion")&&!traits.has("construct")&&b.isAdjacentTo(flankee)})?!0:flankingBuddies.some(b=>this.onOppositeSides(this,b,flankee))}buddiesFlanking(flankee,context={}){return!this.actor||!this.canFlank(flankee,context)?[]:canvas.tokens.placeables.filter(t=>t!==this&&t.canFlank(flankee,pick$1(context,["ignoreFlankable"]))).filter(b=>this.onOppositeSides(this,b,flankee))}_applyRenderFlags(flags){super._applyRenderFlags(flags),flags.refreshPosition&&this.auras.refreshPositions()}_refreshVisibility(){super._refreshVisibility(),this.auras.draw(),this.flankingHighlight.draw()}_getBorderColor(options){const isHovered=options?.hover??(this.hover||this.layer.highlightObjects),isControlled=this.controlled||!game.user.isGM&&this.isOwner,isFriendly=this.document.disposition===CONST.TOKEN_DISPOSITIONS.FRIENDLY;if(!isHovered||isControlled||isFriendly||!this.actor?.hasPlayerOwner)return super._getBorderColor();const colors=CONFIG.Canvas.dispositionColors;switch(this.document.disposition){case CONST.TOKEN_DISPOSITIONS.NEUTRAL:return colors.NEUTRAL;case CONST.TOKEN_DISPOSITIONS.HOSTILE:return colors.HOSTILE;case CONST.TOKEN_DISPOSITIONS.SECRET:return this.isOwner?colors.SECRET:null;default:return super._getBorderColor(options)}}_drawBar(number,bar,data){if(!canvas.dimensions)return;const actor=this.document.actor;if(!(data.attribute==="attributes.hp"&&actor?.attributes.hp))return super._drawBar(number,bar,data);const{value,max,temp}=actor.attributes.hp??{},healthPercent=Math.clamped(value,0,max)/max,black=0,color=Number(number?Color.fromRGB([.5*healthPercent,.7*healthPercent,.5+healthPercent/2]):Color.fromRGB([1-healthPercent/2,healthPercent,0]));let h=Math.max(canvas.dimensions.size/12,8);const bs=Math.clamped(h/8,1,2);this.document.height>=2&&(h*=1.6);const numBars=temp>0?2:1,barHeight=h/numBars;if(bar.clear(),bar.lineStyle(0).beginFill(black,.5).drawRoundedRect(0,0,this.w,h,3),bar.lineStyle(bs/2,black,1),temp>0){const tempWidth=Math.clamped(temp,0,max)/max*this.w-2*(bs-1);bar.beginFill(6737151,1).drawRoundedRect(0,0,tempWidth,barHeight,2)}const healthBarY=(numBars-1)*barHeight;bar.beginFill(color,1).drawRoundedRect(0,healthBarY,healthPercent*this.w,barHeight,2),bar.beginFill(black,0).lineStyle(bs,black,1).drawRoundedRect(0,0,this.w,h,3),bar.position.set(0,number===0?this.h-h:0)}async drawEffects(){if(await super.drawEffects(),await this._animation,this.auras.size===0)return this.auras.reset();const changedAndDeletedAuraSlugs=Array.from(this.auras.entries()).filter(([slug,aura])=>{const properties=["radius","appearance"],sceneData=pick$1(this.document.auras.get(slug)??{radius:null,appearance:null},properties),canvasData=pick$1(aura,properties);return sceneData.radius===null?!0:Object.keys(diffObject(canvasData,sceneData)).length+Object.keys(diffObject(sceneData,canvasData)).length>0}).map(([slug])=>slug),newAuraSlugs=Array.from(this.document.auras.keys()).filter(s=>!this.auras.has(s));return this.auras.reset([changedAndDeletedAuraSlugs,newAuraSlugs].flat())}emitHoverIn(nativeEvent){const event=new PIXI.FederatedPointerEvent(new PIXI.EventBoundary(this));event.type="pointerover",event.nativeEvent=nativeEvent,this._onHoverIn(event,{hoverOutOthers:!0})}emitHoverOut(nativeEvent){const event=new PIXI.FederatedPointerEvent(new PIXI.EventBoundary(this));event.type="pointerout",event.nativeEvent=nativeEvent,this._onHoverOut(event)}_isVisionSource(){return!!this.actor?.hasPlayerOwner&&!game.user.isGM&&game.settings.get("pf2e","metagame_partyVision")||super._isVisionSource()}clone(){const clone=super.clone();return clone.isPreview&&(clone.document.height=this.document.height,clone.document.width=this.document.width,clone.document.texture.scaleX=this.document.texture.scaleX,clone.document.texture.scaleY=this.document.texture.scaleY,clone.document.texture.src=this.document.texture.src),clone}async showFloatyText(params){if(!this.isVisible)return;if(!game.user.isGM&&typeof params!="number"){const[_,document2]=Object.entries(params)[0];if(document2 instanceof EffectPF2e&&document2.system.unidentified)return}const scrollingTextArgs=(()=>{if(typeof params=="number"){const quantity=params,maxHP=this.actor?.hitPoints?.max;if(!(quantity&&typeof maxHP=="number"))return null;const percent=Math.clamped(Math.abs(quantity)/maxHP,0,1),textColors={damage:16711680,healing:65280};return[this.center,params.signedString(),{anchor:CONST.TEXT_ANCHOR_POINTS.TOP,jitter:.25,fill:textColors[quantity<0?"damage":"healing"],fontSize:16+32*percent,stroke:0,strokeThickness:4}]}else{const[change,details]=Object.entries(params)[0],isAdded=change==="create",sign=isAdded?"+ ":"- ",appendedNumber=!/ \d+$/.test(details.name)&&details.value?` ${details.value}`:"",content=`${sign}${details.name}${appendedNumber}`,anchorDirection=isAdded?CONST.TEXT_ANCHOR_POINTS.TOP:CONST.TEXT_ANCHOR_POINTS.BOTTOM,textStyle=pick$1(this._getTextStyle(),["fill","fontSize","stroke","strokeThickness"]);return[this.center,content,{...textStyle,anchor:anchorDirection,direction:anchorDirection,jitter:.25}]}})();scrollingTextArgs&&(await this._animation,await canvas.interface?.createScrollingText(...scrollingTextArgs))}distanceTo(target,{reach=null}={}){if(!canvas.dimensions)return NaN;if(this===target)return 0;if(canvas.grid.type!==CONST.GRID_TYPES.SQUARE)return canvas.grid.measureDistance(this.position,target.position);const selfElevation=this.document.elevation,targetElevation=target.document.elevation;return selfElevation===targetElevation||!this.actor||!target.actor?measureDistanceCuboid(this.bounds,target.bounds,{reach}):measureDistanceCuboid(this.bounds,target.bounds,{reach,token:this,target})}async animate(updateData,options){if(options?.spin){let attributeAdded=!1;const currentRotation=this.document.rotation,rotationAngle=this.x<=this.document.x?360:-360;options.ontick=(_frame,data)=>{if(this.document.lockRotation=!1,!attributeAdded&&data.attributes.length>0){const duration=(data.duration??1e3)/1e3;data.attributes.push({attribute:"rotation",parent:data.attributes[0].parent,from:currentRotation,to:currentRotation+duration*rotationAngle,delta:data.attributes[0].delta}),attributeAdded=!0}}}await super.animate(updateData,options),this.document.lockRotation=this.document._source.lockRotation}updateVisionSource({defer=!1,deleted=!1}={}){super.updateVisionSource({defer,deleted}),this._isVisionSource()&&!deleted&&this.hearing.initialize()}render(renderer){if(super.render(renderer),!this.mesh)return;const configuredTint=this.document.texture.tint??"#FFFFFF";this.mesh.tint!==0&&this.detectionFilter instanceof OutlineOverlayFilter?this.mesh.tint=0:this.mesh.tint===0&&configuredTint!=="#000000"&&!this.detectionFilter&&(this.mesh.tint=Number(Color.fromString(configuredTint)))}_destroy(){super._destroy(),this.auras.destroy(),this.hearing.destroy(),this.flankingHighlight.destroy()}_canView(user,event){return super._canView(user,event)||!!(this.actor?.isOfType("npc")&&this.actor.isLootable)}_onControl(options={}){return game.ready&&game.pf2e.effectPanel.refresh(),super._onControl(options)}_onRelease(options){return game.pf2e.effectPanel.refresh(),super._onRelease(options)}_onApplyStatusEffect(statusId,active){super._onApplyStatusEffect(statusId,active),["undetected","unnoticed"].includes(statusId)&&(canvas.perception.update({refreshVision:!0,refreshLighting:!0},!0),this.mesh.refresh())}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId),changed.width&&(this._animation?this._animation.then(()=>{this.auras.reset()}):this.auras.reset())}};__name2(_TokenPF2e,"TokenPF2e");let TokenPF2e=_TokenPF2e;function measureDistanceCuboid(r0,r1,{reach=null,token=null,target=null}={}){if(!canvas.dimensions)return NaN;if(canvas.grid.type!==CONST.GRID_TYPES.SQUARE)return canvas.grid.measureDistance(r0,r1);const gridWidth=canvas.grid.grid.w,distance={dx:0,dy:0,dz:0};if([[r0,r1],[r1,r0]].some(([rA,rB])=>rB.right>rA.left&&rB.leftrA.top&&rB.top{const roundLeft=rectangle.leftrB.bottom>rA.top&&rB.top{const roundLeft=rectangle.lefta-b),squares={doubleDiagonal:sortedDistance[0],diagonal:sortedDistance[1]-sortedDistance[0],straight:sortedDistance[2]-sortedDistance[1]},reduction=squares.diagonal+squares.doubleDiagonal>1&&reach===10?1:0;return(Math.floor(squares.doubleDiagonal*1.75+squares.diagonal*1.5+squares.straight)-reduction)*gridDistance}__name(measureDistanceOnGrid,"measureDistanceOnGrid"),__name2(measureDistanceOnGrid,"measureDistanceOnGrid");function highlightGrid({areaType,object,colors,document:document2,collisionType="move",preview=!1}){if(!object.id&&!preview)return;const{grid,dimensions}=canvas;if(!(grid&&dimensions))return;const angle=document2.angle??0,direction=document2.direction??45,highlightLayer=grid.getHighlightLayer(object.highlightId)?.clear();if(!highlightLayer)return;const[cx,cy]=grid.getCenter(document2.x,document2.y),[col0,row0]=grid.grid.getGridPositionFromPixels(cx,cy),minAngle=(360+(direction-angle*.5)%360)%360,maxAngle=(360+(direction+angle*.5)%360)%360,snappedOrigin=canvas.grid.getSnappedPosition(document2.x,document2.y,object.layer.gridPrecision),withinAngle=__name2((min,max,value)=>(min=(360+min%360)%360,max=(360+max%360)%360,value=(360+value%360)%360,min=min&&value<=max:value>=min||value<=max),"withinAngle"),coneOriginOffset=(()=>{if(areaType!=="cone")return{x:0,y:0};const dir=(direction>=0?360-direction:-direction)%360,xOffset=snappedOrigin.x%dimensions.size!==0?Math.sign(1*Math.round(Math.cos(Math.toRadians(dir))*100)/100)/2:0,yOffset=snappedOrigin.y%dimensions.size!==0?-Math.sign(1*Math.round(Math.sin(Math.toRadians(dir))*100)/100)/2:0;return{x:xOffset*dimensions.size,y:yOffset*dimensions.size}})(),padding=Math.clamped(document2.width??0,1.5,2),docDistance=document2.distance??0,padded=docDistance*padding/dimensions.distance,rowCount=Math.ceil(padded/(dimensions.size/grid.h)),columnCount=Math.ceil(padded/(dimensions.size/grid.w)),offsetEmanationOrigin=__name2(destination=>{if(!(areaType==="emanation"&&object instanceof TokenPF2e))return{x:0,y:0};if(object.w<=dimensions.size)return{x:0,y:0};const offset=(object.w-dimensions.size)/2,getCoordinate=__name2((centerCoord,destCoord)=>destCoord===centerCoord?0:destCoord>centerCoord?offset:-offset,"getCoordinate");return{x:getCoordinate(object.center.x,destination.x),y:getCoordinate(object.center.y,destination.y)}},"offsetEmanationOrigin");for(let a=-columnCount;a0&&!withinAngle(minAngle,maxAngle,rayAngle))continue}if(measureDistance(destination,origin)>docDistance)continue;canvas.ready&&CONFIG.Canvas.polygonBackends[collisionType].testCollision(origin,destination,{type:collisionType,mode:"any"})?(grid.grid.highlightGridPosition(highlightLayer,{x:gx,y:gy,border:1,color:0}),highlightLayer.beginFill(0,.5).moveTo(gx,gy).lineTo(gx+dimensions.size,gy+dimensions.size).endFill()):grid.grid.highlightGridPosition(highlightLayer,{x:gx,y:gy,border:colors.border,color:colors.fill})}}__name(highlightGrid,"highlightGrid"),__name2(highlightGrid,"highlightGrid");const _MeasuredTemplatePF2e=class _MeasuredTemplatePF2e2 extends MeasuredTemplate{static{__name(this,"_MeasuredTemplatePF2e")}constructor(){super(...arguments),__privateAdd(this,_moveTime,0),__privateAdd(this,_wheelListenerOptions,{passive:!1}),__privateAdd(this,_onPreviewMouseMove,__name2(event=>{event.stopPropagation();const now=Date.now();if(now-__privateGet(this,_moveTime)<=20)return;const center=event.getLocalPosition(this.layer),snapped=canvas.grid.getSnappedPosition(center.x,center.y,2),hexTypes=[CONST.GRID_TYPES.HEXODDR,CONST.GRID_TYPES.HEXEVENR],direction=__privateGet(this,_moveTime)===0&&hexTypes.includes(canvas.grid.type)?this.document.direction+30:this.document.direction;this.document.updateSource({...snapped,direction}),this.refresh(),__privateSet(this,_moveTime,now)},"#onPreviewMouseMove")),__privateAdd(this,_onPreviewLeftClick,__name2(()=>{canvas.scene&&canvas.scene.createEmbeddedDocuments("MeasuredTemplate",[this.document.toObject()]).then(()=>{_MeasuredTemplatePF2e2.currentPreview&&(_MeasuredTemplatePF2e2.currentPreview.placed=!0)}),canvas.tokens.activate(),this.destroy()},"#onPreviewLeftClick")),__privateAdd(this,_onPreviewRightClick,__name2(()=>{canvas.tokens.activate(),this.destroy(),_MeasuredTemplatePF2e2.currentPreview?.resolve(null)},"#onPreviewRightClick")),__privateAdd(this,_onPreviewMouseWheel,__name2(event=>{if(event instanceof WheelEvent){if(event.ctrlKey){event.preventDefault(),event.stopPropagation();const snap=event.shiftKey?15:5;this.document.updateSource({direction:this.document.direction+snap*Math.sign(event.deltaY)}),this.refresh()}else if(event.shiftKey){event.stopPropagation();const snap=canvas.grid.type>=CONST.GRID_TYPES.HEXODDR&&canvas.grid.type<=CONST.GRID_TYPES.HEXEVENQ?60:45;this.document.updateSource({direction:this.document.direction+snap*Math.sign(event.deltaY)}),this.refresh()}}},"#onPreviewMouseWheel"))}get type(){return this.document.t}highlightGrid(){if(!["circle","cone"].includes(this.type)||canvas.grid.type!==CONST.GRID_TYPES.SQUARE)return super.highlightGrid();if(!this.isVisible){canvas.grid.getHighlightLayer(this.highlightId)?.clear();return}highlightGrid({areaType:this.type==="circle"?"burst":"cone",object:this,document:this.document,colors:{border:this.borderColor,fill:this.fillColor},preview:!0})}async drawPreview(){return this.layer.activate(),await this.draw(),this.layer.preview.addChild(this),canvas.stage.on("mousemove",__privateGet(this,_onPreviewMouseMove)),canvas.stage.on("mousedown",__privateGet(this,_onPreviewLeftClick)),canvas.stage.on("rightdown",__privateGet(this,_onPreviewRightClick)),canvas.app.view.addEventListener?.("wheel",__privateGet(this,_onPreviewMouseWheel),__privateGet(this,_wheelListenerOptions)),_MeasuredTemplatePF2e2.currentPreview?.resolve(null),new Promise(res=>{_MeasuredTemplatePF2e2.currentPreview={resolve:value=>{res(value),_MeasuredTemplatePF2e2.currentPreview=null},placed:!1}})}destroy(options){canvas.stage.off("mousemove",__privateGet(this,_onPreviewMouseMove)),canvas.stage.off("mousedown",__privateGet(this,_onPreviewLeftClick)),canvas.stage.off("rightdown",__privateGet(this,_onPreviewRightClick)),canvas.app.view.removeEventListener?.("wheel",__privateGet(this,_onPreviewMouseWheel),__privateGet(this,_wheelListenerOptions)),super.destroy(options)}applyRenderFlags(){super.applyRenderFlags(),_MeasuredTemplatePF2e2.currentPreview?.placed&&_MeasuredTemplatePF2e2.currentPreview.resolve(this)}get item(){return this.document.item}};_moveTime=new WeakMap,_wheelListenerOptions=new WeakMap,_onPreviewMouseMove=new WeakMap,_onPreviewLeftClick=new WeakMap,_onPreviewRightClick=new WeakMap,_onPreviewMouseWheel=new WeakMap,__name2(_MeasuredTemplatePF2e,"MeasuredTemplatePF2e"),__publicField(_MeasuredTemplatePF2e,"currentPreview",null);let MeasuredTemplatePF2e=_MeasuredTemplatePF2e;const _TokenAura=class{static{__name(this,"_TokenAura")}constructor(params){__publicField(this,"slug"),__publicField(this,"token"),__publicField(this,"level"),__publicField(this,"radius"),__publicField(this,"traits"),__publicField(this,"effects"),__publicField(this,"appearance"),__privateAdd(this,_squares,void 0),this.slug=params.slug,this.token=params.token,this.level=params.level,this.radius=params.radius,this.traits=params.traits,this.effects=params.effects,this.appearance=params.appearance}get radiusPixels(){const gridSize=this.scene.grid.distance,gridSizePixels=this.scene.grid.size;return .5*this.token.mechanicalBounds.width+this.radius/gridSize*gridSizePixels}get scene(){return this.token.scene}get bounds(){const{token,radiusPixels}=this,bounds=token.mechanicalBounds;return new PIXI.Rectangle(bounds.x-(radiusPixels-bounds.width/2),bounds.y-(radiusPixels-bounds.width/2),radiusPixels*2,radiusPixels*2)}get center(){return this.token.center}get squares(){return __privateGet(this,_squares)??__privateSet(this,_squares,getAreaSquares(this))}containsToken(token){return this.token.hidden||token.hidden||!this.token.object||!token.object?!1:token===this.token?!0:this.token.object.distanceTo(token.object)>this.radius?!1:this.squares.some(s=>s.active&&measureDistanceCuboid(s,token.mechanicalBounds)===0)}async notifyActors(){if(!this.scene.isInFocus)return;const auraActor=this.token.actor,auraData=auraActor?.auras.get(this.slug);if(!(auraActor&&auraData?.effects.length))return;const auradTokens=this.scene.tokens.filter(t=>t.actor?.primaryUpdater===game.user&&this.containsToken(t)),affectedActors=new Set(auradTokens.flatMap(t=>t.actor??[])),origin={actor:auraActor,token:this.token};for(const actor of affectedActors)await actor.applyAreaEffects(auraData,origin)}};_squares=new WeakMap,__name2(_TokenAura,"TokenAura");let TokenAura=_TokenAura;const _TokenDocumentPF2e=class _TokenDocumentPF2e2 extends TokenDocument{static{__name(this,"_TokenDocumentPF2e")}constructor(){super(...arguments),__privateAdd(this,_prepareDerivedPerception),__publicField(this,"constructed",!0)}get inCombat(){return this.actor?.isOfType("party")?this.actor.members.every(a=>game.combat?.getCombatantByActor(a.id)):super.inCombat}hasStatusEffect(statusId){if(statusId==="dead")return this.overlayEffect===CONFIG.controlIcons.defeated;const{actor}=this;return!actor||!game.settings.get("pf2e","automation.rulesBasedVision")?!1:objectHasKey(CONFIG.PF2E.conditionTypes,statusId)&&actor.hasCondition(statusId)||__name2(()=>actor.itemTypes.effect.some(e=>(e.slug??sluggify(e.name))===statusId),"hasEffect")()}static getTrackedAttributes(data={},_path=[]){if(_path.length===0&&Object.keys(data).length===0)for(const[type,model]of Object.entries(game.system.model.Actor))["character","npc"].includes(type)&&foundry.utils.mergeObject(data,model);if(_path.length>0)return super.getTrackedAttributes(data,_path);const patterns={positive:/^(?:attributes|resources)\./,negative:/\b(?:rank|_?modifiers|item|classdc|dexcap|familiar|\w+hp\b)|bonus/i},prunedData=expandObject(Object.fromEntries(Object.entries(flattenObject(data)).filter(([k,v])=>patterns.positive.test(k)&&!patterns.negative.test(k)&&!["boolean","string"].includes(typeof v))));return super.getTrackedAttributes(prunedData,_path)}static getTrackedAttributeChoices(attributes){return game.settings.get("pf2e","staminaVariant")&&attributes.bar.push(["attributes","hp","sp"]),super.getTrackedAttributeChoices(attributes)}getBarAttribute(barName,options){const attribute=super.getBarAttribute(barName,options);return attribute&&["attributes.hp.sp","resources.resolve"].includes(attribute.attribute)&&(attribute.editable=!0),attribute}get scene(){return this.parent}get emitsDarkness(){return this.light.bright<0}get rulesBasedVision(){return!!(this.sight.enabled&&this.actor?.isOfType("character","familiar")&&this.scene?.rulesBasedVision)}get hasLowLightVision(){return!!(this.rulesBasedVision&&this.actor?.isOfType("creature")&&this.actor.hasLowLightVision)}get hasDarkvision(){return!!(this.rulesBasedVision&&this.actor?.isOfType("creature")&&this.actor.hasDarkvision)}get linkToActorSize(){return this.flags.pf2e.linkToActorSize}get autoscale(){return this.flags.pf2e.autoscale}get playersCanSeeName(){const anyoneCanSee=[CONST.TOKEN_DISPLAY_MODES.ALWAYS,CONST.TOKEN_DISPLAY_MODES.HOVER],nameDisplayMode=this.displayName;return anyoneCanSee.includes(nameDisplayMode)||this.actor?.alliance==="party"}get bounds(){const gridSize=this.scene?.grid.size??100;return new PIXI.Rectangle(this._source.x,this._source.y,this.width*gridSize,this.height*gridSize)}get mechanicalBounds(){const bounds=this.bounds;if(this.width<1){const position=canvas.grid.getTopLeft(bounds.x+bounds.width/2,bounds.y+bounds.height/2);return new PIXI.Rectangle(position[0],position[1],Math.max(canvas.grid.size,bounds.width),Math.max(canvas.grid.size,bounds.height))}return bounds}get center(){const{bounds}=this;return{x:bounds.x+bounds.width/2,y:bounds.y+bounds.height/2}}_initialize(options){this.constructed??=!1,this.auras=new Map,super._initialize(options)}prepareData(){this.parent&&!this.parent.flags?.pf2e||super.prepareData()}prepareBaseData(){if(super.prepareBaseData(),this.flags=mergeObject(this.flags,{pf2e:{}}),this.auras.clear(),!this.actor||!this.isEmbedded)return;_TokenDocumentPF2e2.assignDefaultImage(this);for(const[key,data]of this.actor.auras.entries())this.auras.set(key,new TokenAura({token:this,...deepClone(data)}));if(!this.constructed)return;const linkDefault=SIZE_LINKABLE_ACTOR_TYPES.has(this.actor.type),linkToActorSize=this.flags.pf2e?.linkToActorSize??linkDefault,autoscaleDefault=game.settings.get("pf2e","tokens.autoscale"),autoscale=linkToActorSize?this.flags.pf2e.autoscale??autoscaleDefault:!1;this.flags.pf2e=mergeObject(this.flags.pf2e??{},{linkToActorSize,autoscale});const{alliance}=this.actor.system.details;this.disposition=this.disposition===CONST.TOKEN_DISPOSITIONS.SECRET?CONST.TOKEN_DISPOSITIONS.SECRET:alliance?{party:CONST.TOKEN_DISPOSITIONS.FRIENDLY,opposition:CONST.TOKEN_DISPOSITIONS.HOSTILE}[alliance]:CONST.TOKEN_DISPOSITIONS.NEUTRAL}_prepareDetectionModes(){if(!(this.constructed&&this.actor&&this.rulesBasedVision))return super._prepareDetectionModes();this.detectionModes=[{id:"basicSight",enabled:!0,range:0}],["character","familiar"].includes(this.actor.type)&&(this.sight.attenuation=.1,this.sight.brightness=0,this.sight.contrast=0,this.sight.range=0,this.sight.saturation=0,this.sight.visionMode="basic")}prepareDerivedData(){if(super.prepareDerivedData(),!(this.constructed&&this.actor&&this.scene))return;const{tokenOverrides}=this.actor.synthetics;this.name=tokenOverrides.name??this.name,tokenOverrides.texture&&(this.texture.src=tokenOverrides.texture.src,"scaleX"in tokenOverrides.texture&&(this.texture.scaleX=tokenOverrides.texture.scaleX,this.texture.scaleY=tokenOverrides.texture.scaleY,this.flags.pf2e.autoscale=!1),this.texture.tint=tokenOverrides.texture.tint??this.texture.tint),this.alpha=tokenOverrides.alpha??this.alpha,tokenOverrides.light&&(this.light=new foundry.data.LightData(tokenOverrides.light,{parent:this})),_TokenDocumentPF2e2.prepareSize(this),__privateMethod(this,_prepareDerivedPerception,prepareDerivedPerception_fn).call(this)}static assignDefaultImage(token){const{actor}=token;if(!actor)return;const defaultIcons=[ActorPF2e.DEFAULT_ICON,`systems/pf2e/icons/default-icons/${actor.type}.svg`];game.settings.get("pf2e","nathMode")&&defaultIcons.includes(token.texture.src)?token.texture.src=(()=>{switch(actor.alliance){case"party":return"systems/pf2e/icons/default-icons/alternatives/nath/ally.webp";case"opposition":return"systems/pf2e/icons/default-icons/alternatives/nath/enemy.webp";default:return token.texture.src}})():defaultIcons.some(path=>token.texture.src?.endsWith(path))&&(token.texture.src=actor._source.img)}static prepareSize(token){const{actor}=token;if(!(actor&&token.flags.pf2e.linkToActorSize))return;const size={tiny:.5,sm:1,med:1,lg:2,huge:3,grg:Math.max(token.width,4)}[actor.size];if(actor.isOfType("vehicle")){const{width,height}=actor.getTokenDimensions();token.width=width,token.height=height}else if(token.width=size,token.height=size,game.settings.get("pf2e","tokens.autoscale")&&token.flags.pf2e.autoscale!==!1){const absoluteScale=actor.size==="sm"?.8:1,mirrorX=token.texture.scaleX<0?-1:1;token.texture.scaleX=mirrorX*absoluteScale;const mirrorY=token.texture.scaleY<0?-1:1;token.texture.scaleY=mirrorY*absoluteScale}}async setInitiative({initiative,sendMessage=!0}){if(!game.combat){ui.notifications.error("PF2E.Encounter.NoActiveEncounter");return}const currentId=game.combat.combatant?.id;this.combatant&&game.combat.combatants.has(this.combatant.id)?await game.combat.setInitiative(this.combatant.id,initiative):await game.combat.createEmbeddedDocuments("Combatant",[{tokenId:this.id,initiative}]),await this.update({turn:game.combat.turns.findIndex(c=>c.id===currentId)}),sendMessage&&await ChatMessagePF2e.createDocuments([{speaker:{scene:this.scene?.id,token:this.id},whisper:this.actor?.hasPlayerOwner?[]:game.users.contents.flatMap(user=>user.isGM?user.id:[]),content:game.i18n.format("PF2E.InitiativeIsNow",{name:this.name,value:initiative})}])}_onCreate(data,options,userId){super._onCreate(data,options,userId),game.user.id===userId&&this.actor?.isOfType("loot")&&this.actor.toggleTokenHiding()}_onUpdate(changed,options,userId){const tokenSetsNameVisibility=game.settings.get("pf2e","metagame_tokenSetsNameVisibility");return"displayName"in changed&&tokenSetsNameVisibility&&this.combatant&&ui.combat.render(),changed.actorLink===!1&&this.rendered&&this.object?.controlled&&this.object.release(),super._onUpdate(changed,options,userId)}_onRelatedUpdate(update={},options={}){super._onRelatedUpdate(update,options);const initializeVision=!!this.scene?.isView&&this.sight.enabled&&Object.keys(flattenObject(update)).some(k=>k.startsWith("system.traits.senses"));initializeVision&&canvas.perception.update({initializeVision},!0);const preUpdate=this.toObject(!1),preUpdateAuras=Array.from(this.auras.values()).map(a=>omit(a,["appearance","token"]));this.reset();const postUpdate=this.toObject(!1),postUpdateAuras=Array.from(this.auras.values()).map(a=>omit(a,["appearance","token"])),tokenChanges=diffObject(preUpdate,postUpdate);this.scene?.isView&&Object.keys(tokenChanges).length>0&&this.object?._onUpdate(tokenChanges,{},game.user.id);const aurasChanged=__name2(()=>!!this.scene?.isInFocus&&!equals(preUpdateAuras,postUpdateAuras),"aurasChanged");("disposition"in tokenChanges||"width"in tokenChanges||"height"in tokenChanges||aurasChanged())&&this.scene?.checkAuras?.()}_onDelete(options,userId){if(super._onDelete(options,userId),!!this.actor)if(this.isLinked)this.scene?.tokens.some(t=>t.actor===this.actor)||this.actor.checkAreaEffects();else for(const effect of this.actor.itemTypes.effect)game.pf2e.effectTracker.unregister(effect)}};_prepareDerivedPerception=new WeakSet,prepareDerivedPerception_fn=__name2(function(){if(!(this.rulesBasedVision&&this.actor&&this.scene&&this.sight.enabled))return;const visionMode=this.hasDarkvision?"darkvision":"basic";this.sight.visionMode=visionMode;const{defaults}=CONFIG.Canvas.visionModes[visionMode].vision;if(this.sight.brightness=defaults.brightness??0,this.sight.saturation=defaults.saturation??0,visionMode==="darkvision"||this.scene.lightLevel>LightLevels.DARKNESS){const basicDetection=this.detectionModes.at(0);if(!basicDetection)return;this.sight.range=basicDetection.range=defaults.range??0,this.actor.isOfType("character")&&this.actor.flags.pf2e.colorDarkvision?this.sight.saturation=1:game.user.settings.monochromeDarkvision||(this.sight.saturation=0)}this.actor.isOfType("character","familiar")&&this.actor.system.traits.senses.some(s=>s.type==="seeInvisibility")&&this.detectionModes.push({id:"seeInvisibility",enabled:!0,range:1e3});const tremorsense=this.actor.isOfType("character")?this.actor.system.traits.senses.find(s=>s.type==="tremorsense"&&s.acuity!=="vague"):null;if(tremorsense&&this.detectionModes.push({id:"feelTremor",enabled:!0,range:tremorsense.range}),!this.actor.hasCondition("deafened")){const range=this.scene.flags.pf2e.hearingRange??canvas.dimensions?.maxR??1/0;this.detectionModes.push({id:"hearing",enabled:!0,range})}},"#prepareDerivedPerception"),__name2(_TokenDocumentPF2e,"TokenDocumentPF2e");let TokenDocumentPF2e=_TokenDocumentPF2e;const _BaseTagSelector=class extends DocumentSheet{static{__name(this,"_BaseTagSelector")}constructor(document2,options={}){super(document2,options),__privateAdd(this,_getChoices),__publicField(this,"choices"),__publicField(this,"flat"),this.flat=options.flat??!1,this.choices=__privateMethod(this,_getChoices,getChoices_fn).call(this)}static get defaultOptions(){return mergeObject(super.defaultOptions,{id:"tag-selector",classes:["pf2e","tag-selector"],width:"auto"})}get id(){return`${this.options.id}-${this.document.uuid}`}get title(){return game.i18n.localize(this.options.title||"PF2E.TraitsLabel")}async getData(options){return{...await super.getData(options),documentType:this.document.constructor.metadata.label}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const input of htmlQueryAll(html,"input:not([type=checkbox])"))input.addEventListener("focusin",()=>{input.select()})}sortChoices(choices){return Object.entries(choices).map(([key,value])=>[key,game.i18n.localize(value)]).sort(([_keyA,valueA],[_keyB,valueB])=>valueA.localeCompare(valueB)).reduce((accumulated,[key,value])=>mergeObject(accumulated,{[key]:value}),{})}};_getChoices=new WeakSet,getChoices_fn=__name2(function(){const choices=this.configTypes.reduce((types,key)=>mergeObject(types,CONFIG.PF2E[key]),{});return this.sortChoices(choices)},"#getChoices"),__name2(_BaseTagSelector,"BaseTagSelector");let BaseTagSelector=_BaseTagSelector;function isValuesList(value){return!!(value&&typeof value=="object"&&"value"in value)}__name(isValuesList,"isValuesList"),__name2(isValuesList,"isValuesList");const _TagSelectorBasic=class extends BaseTagSelector{static{__name(this,"_TagSelectorBasic")}constructor(document2,options){super(document2,options),__privateAdd(this,_getUpdateData),__privateAdd(this,_search),__privateAdd(this,_onFilterResults),__publicField(this,"allowCustom"),__privateAdd(this,_filterTimeout,null),__publicField(this,"objectProperty"),this.objectProperty=options.objectProperty,this.allowCustom=options.allowCustom??!0,options.customChoices&&(mergeObject(this.choices,options.customChoices),this.choices=this.sortChoices(this.choices))}static get defaultOptions(){return mergeObject(super.defaultOptions,{template:"systems/pf2e/templates/system/tag-selector/basic.hbs"})}get configTypes(){return this.options.configTypes??[]}async getData(options){const{chosen,custom,flat,disabled}=(()=>{const document2=this.document,sourceProperty=getProperty(document2.toObject(),this.objectProperty),preparedProperty=getProperty(document2,this.objectProperty);if(Array.isArray(preparedProperty)){const manuallyChosen=Array.isArray(sourceProperty)?sourceProperty.map(prop=>String(prop)):[],automaticallyChosen=preparedProperty.filter(tag=>!manuallyChosen.includes(tag));return{chosen:Array.from(new Set([...manuallyChosen,...automaticallyChosen])),custom:null,flat:!0,disabled:automaticallyChosen}}else if(isValuesList(preparedProperty)&&isValuesList(sourceProperty)){const manuallyChosen=sourceProperty.value.map(prop=>prop.toString()),custom2=this.allowCustom?sourceProperty.custom:null,automaticallyChosen=preparedProperty.value.filter(tag=>!manuallyChosen.includes(tag));return{chosen:Array.from(new Set([...manuallyChosen,...automaticallyChosen])),custom:custom2,flat:!1,disabled:automaticallyChosen}}else return{chosen:[],custom:null,flat:this.flat,disabled:[]}})(),choices=Object.keys(this.choices).reduce((accumulated,type)=>(accumulated[type]={label:this.choices[type],selected:chosen.includes(type),disabled:disabled.includes(type)},accumulated),{});return{...await super.getData(options),choices,allowCustom:this.allowCustom&&!flat,custom,flat}}activateListeners($html){super.activateListeners($html);const html=$html[0],searchInput=htmlQuery(html,"input[type=search]");searchInput?.addEventListener("input",()=>{__privateMethod(this,_onFilterResults,onFilterResults_fn).call(this,searchInput)})}async _updateObject(event,formData){const flat=event.target instanceof HTMLElement?event.target.dataset.flat:!1,value=__privateMethod(this,_getUpdateData,getUpdateData_fn).call(this,formData);return this.allowCustom&&typeof formData.custom=="string"?super._updateObject(event,{[this.objectProperty]:{value,custom:formData.custom}}):flat?super._updateObject(event,{[this.objectProperty]:value}):super._updateObject(event,{[`${this.objectProperty}.value`]:value})}};_filterTimeout=new WeakMap,_getUpdateData=new WeakSet,getUpdateData_fn=__name2(function(formData){const optionsAreNumeric=Object.keys(formData).every(tag=>Number.isInteger(Number(tag))),selections=Object.entries(formData).flatMap(([tag,selected])=>selected?tag:[]).filter(tag=>tag!=="custom");return optionsAreNumeric?selections.map(tag=>Number(tag)):selections},"#getUpdateData"),_search=new WeakSet,search_fn=__name2(function(searchString){const query=new RegExp(RegExp.escape(searchString),"i"),html=this.element[0];for(const row of htmlQueryAll(html,"li.trait-item")){const name2=row.getElementsByClassName("trait-label")[0]?.textContent??"";row.style.display=query.test(name2)?"flex":"none"}},"#search"),_onFilterResults=new WeakSet,onFilterResults_fn=__name2(function(input){__privateGet(this,_filterTimeout)&&(clearTimeout(__privateGet(this,_filterTimeout)),__privateSet(this,_filterTimeout,null)),__privateSet(this,_filterTimeout,window.setTimeout(()=>__privateMethod(this,_search,search_fn).call(this,input.value),100))},"#onFilterResults"),__name2(_TagSelectorBasic,"TagSelectorBasic");let TagSelectorBasic=_TagSelectorBasic;const _SenseSelector=class extends BaseTagSelector{static{__name(this,"_SenseSelector")}objectProperty="system.traits.senses";static get defaultOptions(){return mergeObject(super.defaultOptions,{height:"auto",template:"systems/pf2e/templates/system/tag-selector/senses.hbs",id:"sense-selector",title:"PF2E.Actor.Creature.Sense.Label"})}get configTypes(){return["senses"]}async getData(options){if(!this.document.isOfType("character"))throw ErrorPF2e("The Sense selector is usable only with PCs");const senses2=this.document.system.traits.senses,choices=Object.entries(this.choices).reduce((accum,[type,label])=>{const sense=senses2.find(sense2=>sense2.type===type),mandatoryAcuity=objectHasKey(SENSES_WITH_MANDATORY_ACUITIES,type),acuity=mandatoryAcuity?SENSES_WITH_MANDATORY_ACUITIES[type]:sense?.acuity??"precise";return{...accum,[type]:{acuity,mandatoryAcuity,disabled:!!sense?.source,label,selected:!!sense,value:sense?.value??""}}},{});return{...await super.getData(options),hasExceptions:!1,choices,senseAcuity:CONFIG.PF2E.senseAcuity}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const input of htmlQueryAll(html,"input[type=number]")){const checkbox=htmlQuery(htmlClosest(input,"tr"),"input[type=checkbox]");checkbox&&input.addEventListener("input",()=>{checkbox.checked=!!Number(input.value)})}}_onSubmit(event,options){for(const input of htmlQueryAll(this.element[0],"input[type=number]")){const checkbox=htmlQuery(htmlClosest(input,"tr"),"input[type=checkbox]");checkbox&&!Number(input.value)&&(checkbox.checked=!1)}return super._onSubmit(event,options)}async _updateObject(event,formData){const update=Object.entries(formData).filter(e=>e[1]===!0||Array.isArray(e[1])&&e[1][0]).map(([type,values])=>{if(values===!0)return{type};if(Number(values[2])){const acuity=values[1],range=Number(values[2]);return{type,acuity,value:range}}else{const acuity=values[1];return{type,acuity}}});return super._updateObject(event,{[this.objectProperty]:update})}};__name2(_SenseSelector,"SenseSelector");let SenseSelector=_SenseSelector;const _SpeedSelector=class extends BaseTagSelector{static{__name(this,"_SpeedSelector")}objectProperty="system.attributes.speed.otherSpeeds";static get defaultOptions(){return mergeObject(super.defaultOptions,{id:"speed-selector",template:"systems/pf2e/templates/system/tag-selector/speeds.hbs",title:"PF2E.SpeedTypes"})}get configTypes(){return["speedTypes"]}async getData(options){if(!this.document.isOfType("creature"))throw ErrorPF2e("The Speed selector is usable only with creature-type actors");const speeds=this.document.system.attributes.speed.otherSpeeds,speedLabels=CONFIG.PF2E.speedTypes,choices=Object.keys(this.choices).reduce((accum,type)=>{const speed=speeds.find(s=>s.type===type);return{...accum,[type]:{selected:!!speed,disabled:!!speed?.source,label:game.i18n.localize(speedLabels[type]),value:Number(speed?.value)||""}}},{});return{...await super.getData(options),hasExceptions:this.document.isOfType("npc"),choices}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const input of htmlQueryAll(html,"input[type=number]"))input.addEventListener("input",()=>{const checkbox=input.closest("li")?.querySelector("input[type=checkbox]");checkbox&&(checkbox.checked=!!Number(input.value))})}async _updateObject(event,formData){const update=Object.entries(formData).flatMap(([key,value])=>{if(!(Array.isArray(value)&&value.length===2))return[];const selected=!!value[0],distance=Math.trunc(Math.abs(value[1]));return selected&&distance?{type:key,value:Math.max(distance,5)}:[]});return super._updateObject(event,{[this.objectProperty]:update})}};__name2(_SpeedSelector,"SpeedSelector");let SpeedSelector=_SpeedSelector;const TAG_SELECTOR_TYPES=["basic","senses","speed-types"],SELECTABLE_TAG_FIELDS=["abilities","actionTraits","attackEffects","creatureTraits","damageCategories","languages","levels","materialDamageEffects","otherArmorTags","otherConsumableTags","otherWeaponTags","senses","skills","speedTypes","vehicleTraits","weaponTraits"],_UUIDUtils=class{static{__name(this,"_UUIDUtils")}static async fromUUIDs(uuids,options){const resolvedUUIDs=uniq(uuids).flatMap(u=>foundry.utils.parseUuid(u,options).uuid??[]),packEmbeddedLinks=resolvedUUIDs.filter(u=>{const parsed=foundry.utils.parseUuid(u,options);return parsed.collection instanceof CompendiumCollection&&parsed.embedded.length>0}),packEmbeddedDocs=compact(await Promise.all(packEmbeddedLinks.map(u=>fromUuid(u)))),documentsAndIndexData=compact(resolvedUUIDs.filter(u=>!packEmbeddedLinks.includes(u)).map(u=>fromUuidSync(u))),worldDocsAndCacheHits=documentsAndIndexData.filter(d=>d instanceof foundry.abstract.Document),indexEntries=documentsAndIndexData.filter(d=>!(d instanceof foundry.abstract.Document)),packs=uniq(indexEntries.flatMap(e=>game.packs.get(e.pack??"")??[])),packDocs=(await Promise.all(packs.map(async pack=>{const ids=indexEntries.filter(e=>e.pack===pack.metadata.id).map(e=>e._id);return pack.getDocuments({_id__in:ids})}))).flat();return sortBy$1([...packEmbeddedDocs,...worldDocsAndCacheHits,...packDocs],d=>uuids.indexOf(d.uuid))}static isItemUUID(uuid){return typeof uuid=="string"&&foundry.utils.parseUuid(uuid).documentType==="Item"}static isCompendiumUUID(uuid){return typeof uuid=="string"&&foundry.utils.parseUuid(uuid).collection instanceof CompendiumCollection}static isTokenUUID(uuid){if(typeof uuid!="string")return!1;const parsed=foundry.utils.parseUuid(uuid);return parsed.documentType==="Scene"&&parsed.embedded[0]==="Token"}};__name2(_UUIDUtils,"UUIDUtils");let UUIDUtils=_UUIDUtils;const _ActorSizePF2e=class _ActorSizePF2e2{static{__name(this,"_ActorSizePF2e")}value;length;width;constructor(params){(typeof params.value!="string"||params.smallIsMedium&¶ms.value==="sm")&&(params.value="med"),this.value=params.value;const spaces=_ActorSizePF2e2.defaultSpaces[params.value]??_ActorSizePF2e2.defaultSpaces.med;this.length=params.length??spaces.length,this.width=params.width??spaces.width}equals(size,{smallIsMedium=!1}={}){const thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(size.value,{smallIsMedium});return thisSize===otherSize}isLargerThan(size,{smallIsMedium=!1}={}){const other=size instanceof _ActorSizePF2e2?size:new _ActorSizePF2e2({value:size}),thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(other.value,{smallIsMedium});return _ActorSizePF2e2.sizeRanks[thisSize]>_ActorSizePF2e2.sizeRanks[otherSize]}isSmallerThan(size,{smallIsMedium=!1}={}){const other=size instanceof _ActorSizePF2e2?size:new _ActorSizePF2e2({value:size}),thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(other.value,{smallIsMedium});return _ActorSizePF2e2.sizeRanks[thisSize]<_ActorSizePF2e2.sizeRanks[otherSize]}difference(size,{smallIsMedium=!1}={}){const thisSize=this.getEffectiveSize(this.value,{smallIsMedium}),otherSize=this.getEffectiveSize(size.value,{smallIsMedium});return _ActorSizePF2e2.sizeRanks[thisSize]-_ActorSizePF2e2.sizeRanks[otherSize]}getEffectiveSize(size,{smallIsMedium}){return smallIsMedium&&size==="sm"?"med":size}increment({skipSmall=!1}={}){this.value=this.value==="tiny"&&skipSmall?"med":this.value==="sm"&&skipSmall?"lg":this.value==="grg"?"grg":SIZES[SIZES.indexOf(this.value)+1];const newSpace=_ActorSizePF2e2.defaultSpaces[this.value];this.length=newSpace.length,this.width=newSpace.width}decrement({skipSmall=!1}={}){const toTiny=this.value==="med"&&skipSmall||this.value==="tiny";this.value=toTiny?"tiny":SIZES[SIZES.indexOf(this.value)-1];const newSpace=_ActorSizePF2e2.defaultSpaces[this.value];this.length=newSpace.length,this.width=newSpace.width}toString(){return game.i18n.localize(CONFIG.PF2E.actorSizes[this.value])}};__name2(_ActorSizePF2e,"ActorSizePF2e"),__publicField(_ActorSizePF2e,"defaultSpaces",{tiny:{length:2.5,width:2.5},sm:{length:5,width:5},med:{length:5,width:5},lg:{length:10,width:10},huge:{length:15,width:15},grg:{length:20,width:20}}),__publicField(_ActorSizePF2e,"sizeRanks",{grg:5,huge:4,lg:3,med:2,sm:1,tiny:0});let ActorSizePF2e=_ActorSizePF2e;function onClickCreateSpell(actor,data){if(!data.location)throw ErrorPF2e("Unexpected missing spellcasting-entry location");const rank=Number(data.level??1),newLabel=game.i18n.localize("PF2E.NewLabel"),[rankLabel,spellLabel]=rank>0?[game.i18n.format("PF2E.Item.Spell.Rank.Ordinal",{rank:ordinalString(rank)}),game.i18n.localize(data.location==="rituals"?"PF2E.SpellCategoryRitual":"PF2E.SpellLabel")]:[null,game.i18n.localize("PF2E.TraitCantrip")],source={type:"spell",name:compact([newLabel,rankLabel,spellLabel]).join(" "),system:{level:{value:rank||1},location:{value:String(data.location)},traits:{value:rank===0?["cantrip"]:[]}}};data.location==="rituals"&&(source.system=mergeObject(source.system,{category:{value:"ritual"}})),actor.createEmbeddedDocuments("Item",[source])}__name(onClickCreateSpell,"onClickCreateSpell"),__name2(onClickCreateSpell,"onClickCreateSpell");function getSelectedOrOwnActors(types,useOwnCharacter=!0){const actors=canvas.tokens.controlled.flatMap(token=>token.actor?token.actor:[]).filter(actor=>actor.isOwner).filter(actor=>!types||actor.isOfType(...types));return actors.length===0&&game.user.character&&useOwnCharacter&&actors.push(game.user.character),actors}__name(getSelectedOrOwnActors,"getSelectedOrOwnActors"),__name2(getSelectedOrOwnActors,"getSelectedOrOwnActors");const inlineSelector=["action","check","effect-area"].map(keyword=>`[data-pf2-${keyword}]`).join(","),InlineRollLinks={injectRepostElement:(links,foundryDoc)=>{for(const link of links){(!foundryDoc||foundryDoc.isOwner)&&link.classList.add("with-repost");const repostButtons=htmlQueryAll(link,"i[data-pf2-repost]");if(repostButtons.length>0){if(foundryDoc&&!foundryDoc.isOwner){for(const button of repostButtons)button.remove();link.classList.remove("with-repost")}continue}if(foundryDoc&&!foundryDoc.isOwner)continue;const newButton=document.createElement("i"),icon=link.parentElement?.dataset?.pf2Checkgroup!==void 0?"fa-comment-alt-dots":"fa-comment-alt";newButton.classList.add("fa-solid",icon),newButton.dataset.pf2Repost="",newButton.title=game.i18n.localize("PF2E.Repost"),link.appendChild(newButton),newButton.addEventListener("click",event=>{event.stopPropagation();const target=event.target;if(!(target instanceof HTMLElement))return;const parent=target?.parentElement;if(!parent)return;const document2=resolveDocument(target,foundryDoc);InlineRollLinks.repostAction(parent,document2)})}},listen:(html,foundryDoc=null)=>{foundryDoc??=resolveDocument(html,foundryDoc);const links=htmlQueryAll(html,inlineSelector).filter(l=>["A","SPAN"].includes(l.nodeName));InlineRollLinks.injectRepostElement(links,foundryDoc),InlineRollLinks.flavorDamageRolls(html,foundryDoc instanceof ActorPF2e?foundryDoc:null);for(const link of links.filter(l=>l.dataset.pf2Action)){const{pf2Action,pf2Glyph,pf2Variant,pf2Dc,pf2ShowDc,pf2Skill}=link.dataset;link.addEventListener("click",event=>{const action2=game.pf2e.actions[pf2Action?sluggify(pf2Action,{camel:"dromedary"}):""],visibility=pf2ShowDc??"all";pf2Action&&action2?action2({event,glyph:pf2Glyph,variant:pf2Variant,difficultyClass:pf2Dc?{scope:"check",value:Number(pf2Dc)||0,visibility}:void 0,skill:pf2Skill}):console.warn(`PF2e System | Skip executing unknown action '${pf2Action}'`)})}for(const link of links.filter(l=>l.dataset.pf2Check&&!l.dataset.invalid)){const{pf2Check,pf2Dc,pf2Traits,pf2Label,pf2Defense,pf2Adjustment,pf2Roller,pf2RollOptions}=link.dataset;if(!pf2Check)return;link.addEventListener("click",async event=>{const parent=resolveActor(foundryDoc,link),actors=(()=>{switch(pf2Roller){case"self":return parent?.canUserModify(game.user,"update")?[parent]:[];case"party":return parent?.isOfType("party")?[parent]:compact([game.actors.party])}const actors2=getSelectedOrOwnActors(),isSave=tupleHasValue(SAVE_TYPES,pf2Check);return parent?.isOfType("party")||actors2.length===0&&parent&&!isSave?[parent]:actors2})();if(actors.length===0){ui.notifications.warn(game.i18n.localize("PF2E.UI.errorTargetToken"));return}const extraRollOptions=[...pf2Traits?.split(",").map(o=>o.trim())??[],...pf2RollOptions?.split(",").map(o=>o.trim())??[]],eventRollParams=eventToRollParams(event,{type:"check"});switch(pf2Check){case"flat":{for(const actor of actors){const flatCheck=new Statistic(actor,{label:"",slug:"flat",modifiers:[],check:{type:"flat-check"}}),dc=Number.isInteger(Number(pf2Dc))?{label:pf2Label,value:Number(pf2Dc)}:null;flatCheck.roll({...eventRollParams,extraRollOptions,dc})}break}default:{const isSavingThrow=tupleHasValue(SAVE_TYPES,pf2Check),traits=isSavingThrow?[]:extraRollOptions.filter(t=>t in CONFIG.PF2E.actionTraits)??[];for(const actor of actors){const statistic=(()=>{if(pf2Check in CONFIG.PF2E.magicTraditions){const bestSpellcasting=actor.spellcasting.filter(c=>c.tradition===pf2Check).flatMap(s=>s.statistic??[]).sort((a,b)=>b.check.mod-a.check.mod).shift()??null;if(bestSpellcasting)return bestSpellcasting}return actor.getStatistic(pf2Check)})();if(!statistic){console.warn(ErrorPF2e(`Skip rolling unknown statistic ${pf2Check}`).message);continue}const targetActor=pf2Defense?game.user.targets.first()?.actor:null,dcValue=(()=>{const adjustment=Number(pf2Adjustment)||0;return pf2Dc==="@self.level"?calculateDC(actor.level)+adjustment:Number(pf2Dc??"NaN")+adjustment})(),dc=(()=>{if(Number.isInteger(dcValue))return{label:pf2Label,value:dcValue};if(pf2Defense){const defenseStat=targetActor?.getStatistic(pf2Defense);return defenseStat?{statistic:defenseStat.dc,scope:"check",value:defenseStat.dc.value}:null}return null})(),item=(()=>{const itemFromDoc=foundryDoc instanceof ItemPF2e?foundryDoc:foundryDoc instanceof ChatMessagePF2e?foundryDoc.item:null;return itemFromDoc?.isOfType("action","feat","campaignFeature")||isSavingThrow&&!itemFromDoc?.isOfType("weapon")?itemFromDoc:null})(),args={...eventRollParams,extraRollOptions,origin:isSavingThrow&&parent instanceof ActorPF2e?parent:null,dc,target:!isSavingThrow&&dc?.statistic?targetActor:null,item,traits};if(!!(item?.isOfType("action","feat")&&item.actionCost)&&pf2Defense){const subtitleLocKey=pf2Check in CONFIG.PF2E.magicTraditions?"PF2E.ActionsCheck.spell":statistic.check.type==="attack-roll"?"PF2E.ActionsCheck.x-attack-roll":"PF2E.ActionsCheck.x";args.label=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{glyph:getActionGlyph(item.actionCost),subtitle:game.i18n.format(subtitleLocKey,{type:statistic.label}),title:item.name})}statistic.roll(args)}}}})}const templateConversion={burst:"circle",cone:"cone",cube:"rect",emanation:"circle",line:"ray",rect:"rect",square:"rect"};for(const link of links.filter(l=>l.hasAttribute("data-pf2-effect-area"))){const{pf2EffectArea,pf2Distance,pf2TemplateData,pf2Traits,pf2Width}=link.dataset;link.addEventListener("click",()=>{if(typeof pf2EffectArea!="string"){console.warn("PF2e System | Could not create template'");return}const templateData=JSON.parse(pf2TemplateData??"{}");switch(templateData.distance||=Number(pf2Distance),templateData.fillColor||=game.user.color,templateData.t=templateConversion[pf2EffectArea],templateData.t){case"ray":templateData.width=Number(pf2Width)||CONFIG.MeasuredTemplate.defaults.width*(canvas.dimensions?.distance??1);break;case"cone":templateData.angle=CONFIG.MeasuredTemplate.defaults.angle;break;case"rect":{const distance=templateData.distance??0;templateData.distance=Math.hypot(distance,distance),templateData.width=distance,templateData.direction=45;break}}pf2Traits&&(templateData.flags={pf2e:{origin:{traits:pf2Traits.split(",")}}});const templateDoc=new MeasuredTemplateDocumentPF2e(templateData,{parent:canvas.scene});new MeasuredTemplatePF2e(templateDoc).drawPreview()})}},makeRepostHtml:(target,defaultVisibility)=>{const flavor=target.attributes.getNamedItem("data-pf2-repost-flavor")?.value??"";return`${flavor} ${target.outerHTML}`.trim()},repostAction:(target,foundryDoc=null)=>{if(!["pf2Action","pf2Check","pf2EffectArea"].some(d=>d in target.dataset))return;const actor=resolveActor(foundryDoc,target),defaultVisibility=(actor??foundryDoc)?.hasPlayerOwner?"all":"gm",content=(()=>target.parentElement?.dataset?.pf2Checkgroup!==void 0?`
${htmlQueryAll(target.parentElement,inlineSelector).map(target2=>InlineRollLinks.makeRepostHtml(target2,defaultVisibility)).join("
")}
`:InlineRollLinks.makeRepostHtml(target,defaultVisibility))(),speaker=actor?ChatMessagePF2e.getSpeaker({actor,token:actor.getActiveTokens(!1,!0).shift()}):ChatMessagePF2e.getSpeaker(),message=game.messages.get(htmlClosest(target,"[data-message-id]")?.dataset.messageId??""),flags=foundryDoc instanceof JournalEntry?{pf2e:{journalEntry:foundryDoc.uuid}}:message?.flags.pf2e.origin?{pf2e:{origin:deepClone(message.flags.pf2e.origin)}}:{};ChatMessagePF2e.create({speaker,content,flags})},flavorDamageRolls(html,actor=null){for(const rollLink of htmlQueryAll(html,"a.inline-roll[data-damage-roll]")){const itemId=htmlClosest(rollLink,"[data-item-id]")?.dataset.itemId,item=actor?.items.get(itemId??"");item&&(rollLink.dataset.flavor||=item.name)}}};function resolveDocument(html,foundryDoc){if(foundryDoc)return foundryDoc;const document2=(ui.windows[Number(html.closest(".app.sheet")?.dataset.appid)]??null)?.document;return document2 instanceof ActorPF2e||document2 instanceof JournalEntry?document2:null}__name(resolveDocument,"resolveDocument"),__name2(resolveDocument,"resolveDocument");function resolveActor(foundryDoc,anchor){if(foundryDoc instanceof ActorPF2e)return foundryDoc;if(foundryDoc instanceof ItemPF2e||foundryDoc instanceof ChatMessagePF2e)return foundryDoc.actor;const itemUuid=anchor.dataset.itemUuid,itemByUUID=itemUuid&&!itemUuid.startsWith("Compendium.")?fromUuidSync(itemUuid):null;return itemByUUID instanceof ItemPF2e?itemByUUID.actor:null}__name(resolveActor,"resolveActor"),__name2(resolveActor,"resolveActor");const _UserVisibilityPF2e=class{static{__name(this,"_UserVisibilityPF2e")}static process(html,options={}){const visibilityElements=htmlQueryAll(html,"[data-visibility]");for(const element of visibilityElements.filter(e=>e.dataset.visibility==="none"))element.remove();const{message}=options,document2=options.document??message?.actor??message?.journalEntry??message??null;if(document2){const ownerElements=visibilityElements.filter(e=>e.dataset.visibility==="owner");for(const element of ownerElements){if(element.dataset.action){document2.isOwner||element.remove(),delete element.dataset.visibility;continue}const whoseData=element.dataset.whose??"self";if(whoseData==="self"){element.dataset.visibility=document2.hasPlayerOwner?"all":"gm";continue}message?.target&&whoseData==="target"&&(element.dataset.visibility=message.target.actor.hasPlayerOwner?"all":"gm")}}const hasOwnership=document2?.isOwner??game.user.isGM,dcSetting=game.settings.get("pf2e","metagame_showDC"),saveButtons=htmlQueryAll(html,"button[data-action=save]");if(!document2?.hasPlayerOwner&&!hasOwnership&&!dcSetting)for(const button of saveButtons){const saveType=button.dataset.save;if(objectHasKey(CONFIG.PF2E.saves,saveType)){const saveName=game.i18n.localize(CONFIG.PF2E.saves[saveType]);button.innerText=game.i18n.format("PF2E.SavingThrowWithName",{saveName})}}else if(!document2?.hasPlayerOwner&&!dcSetting)for(const button of saveButtons)button.classList.add("hidden-to-others");for(const element of htmlQueryAll(html,"[data-owner-title]"))if(hasOwnership){const value=element.dataset.ownerTitle??"";element.title=value}else element.removeAttribute("data-owner-title");if(!game.user.isGM)for(const element of visibilityElements.filter(e=>e.dataset.visibility==="gm"))element.remove()}static processMessageSender(message,html){if(!game.settings.get("pf2e","metagame_tokenSetsNameVisibility"))return;const token=message.token??(message.actor?new TokenDocumentPF2e(message.actor.prototypeToken.toObject()):null);if(token){const sender=html.querySelector("h4.message-sender"),nameToHide=token.name.trim(),shouldHideName=!token.playersCanSeeName&&sender?.innerText.trim()===nameToHide;sender&&shouldHideName&&(game.user.isGM?sender.dataset.visibility="gm":sender.innerText=message.user?.name??"Gamemaster")}}};__name2(_UserVisibilityPF2e,"UserVisibilityPF2e");let UserVisibilityPF2e=_UserVisibilityPF2e;const USER_VISIBILITIES=new Set(["all","owner","gm","none"]),_ItemSummaryRenderer=class{static{__name(this,"_ItemSummaryRenderer")}constructor(sheet){this.sheet=sheet}activateListeners(html){const selectors=[".item .item-name h4",".item .melee-name h4",".item .action-name h4","a[data-action=toggle-summary]"].join(",");for(const link of htmlQueryAll(html,selectors))link.addEventListener("click",async()=>{const element=htmlClosest(link,"[data-item-id], .expandable");element&&await this.toggleSummary(element)})}async toggleSummary(element,options={}){const actor=this.sheet.actor,{itemId,itemType,actionIndex}=element.dataset,isFormula=!!element.dataset.isFormula,duration=.4;if(itemType==="spellSlot")return;const item=isFormula?await fromUuid(itemId??""):itemType==="condition"?actor.conditions.get(itemId,{strict:!0}):actionIndex?actor.system.actions?.[Number(actionIndex)].item??null:actor.items.get(itemId??"")??null,summary=await(async()=>{const existing=htmlQuery(element,":scope > .item-summary");if(existing?.hasChildNodes()||options.visible)return existing;if(item instanceof ItemPF2e&&!item.isOfType("spellcastingEntry")){const insertLocation=htmlQueryAll(element,":scope > .item-name, :scope > .item-controls, :scope > .action-header").at(-1)?.parentNode?.lastChild;if(!insertLocation&&!existing)return null;const summary2=existing??createHTMLElement("div",{classes:["item-summary"]});summary2.hidden=!0,insertLocation?.after(summary2);const chatData=await item.getChatData({secrets:actor.isOwner},element.dataset);return await this.renderItemSummary(summary2,item,chatData),InlineRollLinks.listen(summary2,item),summary2}return null})();if(!summary)return;const showSummary=typeof options.visible=="boolean"?options.visible:!element.classList.contains("expanded")||summary.hidden;options.instant?(summary.hidden=!showSummary,element.classList.toggle("expanded",showSummary)):showSummary?(element.classList.add("expanded"),await gsap.fromTo(summary,{height:0,opacity:0,hidden:!1},{height:"auto",opacity:1,duration})):await gsap.to(summary,{height:0,duration,opacity:0,paddingTop:0,paddingBottom:0,margin:0,clearProps:"all",onComplete:()=>{summary.hidden=!0,element.classList.remove("expanded")}})}async renderItemSummary(div,item,chatData){const description=isItemSystemData(chatData)?chatData.description.value:await TextEditor.enrichHTML(item.description,{rollData:item.getRollData(),async:!0}),rarity=item.system.traits?.rarity,isEffect=item instanceof AbstractEffectPF2e,selfEffect=item.isOfType("action","feat")&&item.system.selfEffect?await TextEditor.enrichHTML(`@UUID[${item.system.selfEffect.uuid}]{${item.system.selfEffect.name}}`,{async:!0}):null,summary=await renderTemplate("systems/pf2e/templates/actors/partials/item-summary.hbs",{item,description,identified:game.user.isGM||!(item.isOfType("physical")||isEffect)||item.isIdentified,rarityLabel:rarity&&item.isOfType("physical")?CONFIG.PF2E.rarityTraits[rarity]:null,isCreature:item.actor?.isOfType("creature"),chatData,selfEffect});if(div.innerHTML=summary,UserVisibilityPF2e.process(div,{document:item}),item.actor?.isOfType("creature"))for(const button of htmlQueryAll(div,"button"))button.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation();const spell=item.isOfType("spell")?item:item.isOfType("consumable")?item.embeddedSpell:null;switch(button.dataset.action){case"spellAttack":spell?.rollAttack(event);break;case"spellDamage":spell?.rollDamage(event);break;case"spellTemplate":spell?.placeTemplate();break;case"consume":item.isOfType("consumable")&&item.consume();break}})}async saveAndRestoreState(callback){const element=this.sheet.element[0],expandedSummaryElements=htmlQueryAll(element,".item.expanded[data-item-summary-id]"),expandedItemElements=htmlQueryAll(element,".item.expanded[data-item-id]:not([data-item-summary-id])"),expandedActionElements=htmlQueryAll(element,".item.expanded[data-action-index]"),openActionIdxs=new Set(expandedActionElements.map(el=>el.dataset.actionIndex)),openItemsIds=expandedItemElements.map(el=>el.dataset.itemId),openSummaryIds=expandedSummaryElements.map(el=>el.dataset.itemSummaryId),$result=await callback.apply(null),result=$result[0];InlineRollLinks.listen(result,this.sheet.actor);for(const itemId of openItemsIds){const item=htmlQuery(result,`.item[data-item-id="${itemId}"]:not([data-item-summary-id])`);item&&await this.toggleSummary(item,{instant:!0})}for(const summaryId of openSummaryIds){const item=htmlQuery(result,`.item[data-item-summary-id="${summaryId}"]`);item&&await this.toggleSummary(item,{instant:!0})}for(const elementIdx of openActionIdxs)$result.find(`.item[data-action-index=${elementIdx}]`).toggleClass("expanded");return $result}};__name2(_ItemSummaryRenderer,"ItemSummaryRenderer");let ItemSummaryRenderer=_ItemSummaryRenderer;const _MoveLootPopup=class extends FormApplication{static{__name(this,"_MoveLootPopup")}onSubmitCallback;constructor(object,options,callback){super(object,options),this.onSubmitCallback=callback}async getData(){const[prompt,buttonLabel]=this.options.isPurchase?["PF2E.loot.PurchaseLootMessage","PF2E.loot.PurchaseLoot"]:["PF2E.loot.MoveLootMessage","PF2E.loot.MoveLoot"];return{...await super.getData(),quantity:{default:this.options.quantity.default,max:this.options.quantity.max},newStack:this.options.newStack,lockStack:this.options.lockStack,prompt,buttonLabel}}static get defaultOptions(){return{...super.defaultOptions,id:"MoveLootPopup",classes:[],title:game.i18n.localize("PF2E.loot.MoveLootPopupTitle"),template:"systems/pf2e/templates/popups/loot/move-loot-popup.hbs",width:"auto",quantity:{default:1,max:1},newStack:!1,lockStack:!1,isPurchase:!1}}async _updateObject(_event,formData){this.onSubmitCallback(formData.quantity,formData.newStack)}};__name2(_MoveLootPopup,"MoveLootPopup");let MoveLootPopup=_MoveLootPopup;const _AddCoinsPopup=class extends FormApplication{static{__name(this,"_AddCoinsPopup")}static get defaultOptions(){return{...super.defaultOptions,id:"add-coins",title:"PF2E.AddCoinsTitle",template:"systems/pf2e/templates/actors/add-coins.hbs"}}async _updateObject(_event,formData){const combineStacks=!!formData.combineStacks,coins={pp:Number(formData.pp)||0,gp:Number(formData.gp)||0,sp:Number(formData.sp)||0,cp:Number(formData.cp)||0};return this.object.inventory.addCoins(coins,{combineStacks})}};__name2(_AddCoinsPopup,"AddCoinsPopup");let AddCoinsPopup=_AddCoinsPopup;const itemTypeOptions=Object.fromEntries(new Map([["scroll","PF2E.CastingItemCreateDialog.scroll"],["wand","PF2E.CastingItemCreateDialog.wand"],["cantripDeck5","PF2E.CastingItemCreateDialog.cantripDeck5"]])),_CastingItemCreateDialog=class extends FormApplication{static{__name(this,"_CastingItemCreateDialog")}onSubmitCallback;spell;formDataCache;constructor(object,options,callback,spell){super(object,options),this.spell=spell,this.formDataCache={itemType:this.spell.isCantrip?"cantripDeck5":"scroll",level:spell.baseRank},this.onSubmitCallback=callback}static get defaultOptions(){const options=super.defaultOptions;return options.classes=[],options.title=game.i18n.localize("PF2E.CastingItemCreateDialog.title"),options.template="systems/pf2e/templates/popups/casting-item-create-dialog.hbs",options.width="auto",options.submitOnChange=!0,options.closeOnSubmit=!1,options}async getData(){if(!this.spell)throw ErrorPF2e("CastingItemCreateDialog | Could not read spelldata");const{cantripDeck5,...nonCantripOptions}=itemTypeOptions,minimumRank=this.spell.baseRank,ranks=Array.from(Array(11-minimumRank).keys()).map(index=>minimumRank+index);return{...await super.getData(),validLevels:ranks,itemTypeOptions:this.spell.isCantrip?{cantripDeck5}:nonCantripOptions,itemType:this.formDataCache.itemType,level:this.formDataCache.level}}async _updateObject(event,formData){if(Object.assign(this.formDataCache,formData),event.type!=="submit"){await this.render();return}this.formDataCache.itemType==="wand"&&this.formDataCache.level===10?ui.notifications.warn(game.i18n.localize("PF2E.CastingItemCreateDialog.10thLevelWand")):this.onSubmitCallback&&this.spell&&this.onSubmitCallback(this.formDataCache.level,this.formDataCache.itemType,this.spell),this.close()}};__name2(_CastingItemCreateDialog,"CastingItemCreateDialog");let CastingItemCreateDialog=_CastingItemCreateDialog;function getMagicTraditions(item){const traits=item.system.traits.value;return new Set(traits.filter(t=>setHasElement(MAGIC_TRADITIONS,t)))}__name(getMagicTraditions,"getMagicTraditions"),__name2(getMagicTraditions,"getMagicTraditions");function getDcRarity(item){return item.traits.has("cursed")?"unique":item.rarity}__name(getDcRarity,"getDcRarity"),__name2(getDcRarity,"getDcRarity");function getIdentifyMagicDCs(item,baseDC,notMatchingTraditionModifier){const result={occult:baseDC,primal:baseDC,divine:baseDC,arcane:baseDC},traditions=getMagicTraditions(item);for(const key of MAGIC_TRADITIONS)traditions.size>0&&!traditions.has(key)&&(result[key]=baseDC+notMatchingTraditionModifier);return{arcana:result.arcane,nature:result.primal,religion:result.divine,occultism:result.occult}}__name(getIdentifyMagicDCs,"getIdentifyMagicDCs"),__name2(getIdentifyMagicDCs,"getIdentifyMagicDCs");function getItemIdentificationDCs(item,{proficiencyWithoutLevel=!1,notMatchingTraditionModifier}){const baseDC=calculateDC(item.level,{proficiencyWithoutLevel}),rarity=getDcRarity(item),dc=adjustDCByRarity(baseDC,rarity);return item.isMagical?getIdentifyMagicDCs(item,dc,notMatchingTraditionModifier):item.isAlchemical?{crafting:dc}:{dc}}__name(getItemIdentificationDCs,"getItemIdentificationDCs"),__name2(getItemIdentificationDCs,"getItemIdentificationDCs");function getUnidentifiedPlaceholderImage(item){return`systems/pf2e/icons/unidentified_item_icons/${(()=>{if(item.isOfType("weapon")){const{traits}=item;return traits.has("bomb")?"alchemical_bomb":traits.has("staff")?"staves":traits.has("artifact")?"artifact":"weapon"}else{if(item.isOfType("armor"))return item.category==="shield"?"shields":"armor";if(item.isOfType("consumable"))switch(item.category){case"ammo":return"ammunition";case"oil":return"oils";case"scroll":return"infernal-contracts";case"talisman":return"talisman";case"elixir":case"mutagen":return"alchemical_elixir";case"poison":return"alchemical_poison";case"tool":return"alchemical_tool";case"wand":return"wands";case"potion":return"potions";case"snare":case"other":default:return item.traits.has("drug")?"drugs":"other-consumables"}else if(item.isOfType("equipment")&&item.traits.has("precious"))return"material-chunk"}return"adventuring_gear"})()}.webp`}__name(getUnidentifiedPlaceholderImage,"getUnidentifiedPlaceholderImage"),__name2(getUnidentifiedPlaceholderImage,"getUnidentifiedPlaceholderImage");const _IdentifyItemPopup=class extends FormApplication{static{__name(this,"_IdentifyItemPopup")}static get defaultOptions(){return{...super.defaultOptions,id:"identify-item",title:game.i18n.localize("PF2E.identification.Identify"),template:"systems/pf2e/templates/actors/identify-item.hbs",width:"auto",classes:["identify-popup"]}}get item(){return this.object}async getData(){const item=this.object,notMatchingTraditionModifier=game.settings.get("pf2e","identifyMagicNotMatchingTraditionModifier"),proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),dcs=getItemIdentificationDCs(item,{proficiencyWithoutLevel,notMatchingTraditionModifier});return{...await super.getData(),isMagic:item.isMagical,isAlchemical:item.isAlchemical,dcs}}activateListeners($form){$form.find("button.update-identification").on("click",event=>{const $button=$(event.delegateTarget);this.submit({updateData:{status:$button.val()}})}),$form.find("button.post-skill-checks").on("click",async()=>{const item=this.item,itemImg=item.system.identification.unidentified.img,itemName=item.system.identification.unidentified.name,identifiedName=item.system.identification.identified.name,skills=$("div#identify-item").find("tr").toArray().flatMap(row=>{const slug=row.dataset.skill,dc=Number(row.dataset.dc);if(!(Number.isInteger(dc)&&objectHasKey(CONFIG.PF2E.skillList,slug)))return[];const name2=game.i18n.localize(CONFIG.PF2E.skillList[slug]);return{slug,name:name2,dc}}),actionOption=item.isMagical?"action:identify-magic":item.isAlchemical?"action:identify-alchemy":null,content=await renderTemplate("systems/pf2e/templates/actors/identify-item-chat-skill-checks.hbs",{itemImg,itemName,identifiedName,rollOptions:compact(["concentrate","exploration","secret",actionOption]),skills});await ChatMessagePF2e.create({user:game.user.id,content})})}async _updateObject(_event,formData){const status=formData.status;status==="identified"&&await this.item.setIdentificationStatus(status)}};__name2(_IdentifyItemPopup,"IdentifyItemPopup");let IdentifyItemPopup=_IdentifyItemPopup;const _IWREditor=class extends DocumentSheet{static{__name(this,"_IWREditor")}constructor(actor,options){if(super(actor,options),__privateAdd(this,_updateIWR),__publicField(this,"category"),__publicField(this,"types"),this.actor.isOfType("familiar","loot"))throw ErrorPF2e(`Actor ${this.actor.name} (${this.actor.uuid}) may not have stored IWR data`);this.category=options.category,this.types={immunities:omit(CONFIG.PF2E.immunityTypes,["custom"]),weaknesses:omit(CONFIG.PF2E.weaknessTypes,["custom"]),resistances:omit(CONFIG.PF2E.resistanceTypes,["custom"])}[this.category]}static get defaultOptions(){return{...super.defaultOptions,closeOnSubmit:!1,classes:["iwr-editor"],template:"systems/pf2e/templates/actors/iwr-editor.hbs",sheetConfig:!1,width:500,height:"auto"}}get id(){return`${this.category}-editor-${this.actor.uuid}`}get title(){return game.i18n.format("PF2E.Actor.IWREditor.Title",{actor:this.actor.name,category:game.i18n.localize(this.categoryLabel)})}get actor(){return this.document}get categoryLabel(){return{immunities:"PF2E.ImmunitiesLabel",weaknesses:"PF2E.WeaknessesLabel",resistances:"PF2E.ResistancesLabel"}[this.category]}async getData(options={}){return this.options.id=this.id,{...await super.getData(options),category:this.category,header:this.categoryLabel,list:this.actor.attributes[this.category],sourceData:this.actor._source.system.attributes?.[this.category]??[],types:this.types}}getUpdatedData({includeNew=!1}={}){const entryElems=htmlQueryAll(this.element[0],".entry:not(.new,[data-synthetic])");return includeNew&&entryElems.push(...htmlQueryAll(this.element[0],".entry.new")),entryElems.flatMap(entryElem=>{const iwrType=htmlQuery(entryElem,"select")?.value;if(!iwrType)return[];const value=Math.trunc(Math.abs(Number(htmlQuery(entryElem,"input[data-property=value]")?.value??"NaN")))||5,exceptionsData=JSON.parse(htmlQuery(entryElem,"input[data-property=exceptions]")?.value||"[]");if(!(Array.isArray(exceptionsData)&&exceptionsData.every(o=>isObject(o))))throw ErrorPF2e("Unexpected data encountered while submitting form");const exceptions=exceptionsData.map(e=>e.id),doubleVsData=JSON.parse(htmlQuery(entryElem,"input[data-property=doubleVs]")?.value||"[]"),doubleVs=Array.isArray(doubleVsData)&&doubleVsData.every(o=>isObject(o)&&typeof o.id=="string"&&o.id in this.types)&&this.category==="resistances"?doubleVsData.map(d=>d.id):void 0;return exceptions.every(e=>typeof e=="string")?{type:iwrType,value:this.category==="immunities"?void 0:value||1,exceptions,doubleVs}:[]})}_getHeaderButtons(){return super._getHeaderButtons().filter(b=>b.class==="close")}activateListeners($html){const html=$html[0];for(const input of htmlQueryAll(html,"input[type=text]"))tagify$1(input,{whitelist:this.types,maxTags:4});htmlQuery(html,"a[data-action=add]")?.addEventListener("click",event=>{const entryElem=htmlClosest(event.target,".entry.new");htmlQuery(entryElem,"select[data-property=type]")?.value&&__privateMethod(this,_updateIWR,updateIWR_fn).call(this,{includeNew:!0})});for(const inputOrSelect of htmlQueryAll(html,"select, input")){const entryElem=htmlClosest(inputOrSelect,".entry");entryElem&&!entryElem.classList.contains("new")&&inputOrSelect.addEventListener("change",()=>{__privateMethod(this,_updateIWR,updateIWR_fn).call(this)})}for(const removeButton of htmlQueryAll(html,"a[data-action=remove]"))removeButton.addEventListener("click",async event=>{htmlClosest(event.target,".entry")?.remove(),__privateMethod(this,_updateIWR,updateIWR_fn).call(this)})}};_updateIWR=new WeakSet,updateIWR_fn=__name2(async function({includeNew=!1}={}){const data=this.getUpdatedData({includeNew}),formInput=htmlQuery(this.element[0],"input[name]");if(!formInput)throw ErrorPF2e("Unexpected error getting for input element");formInput.value=JSON.stringify(data),await this.submit({preventRender:!1})},"#updateIWR"),__name2(_IWREditor,"IWREditor");let IWREditor=_IWREditor;const _RemoveCoinsPopup=class extends FormApplication{static{__name(this,"_RemoveCoinsPopup")}static get defaultOptions(){return{...super.defaultOptions,id:"remove-coins",title:"PF2E.RemoveCoinsTitle",template:"systems/pf2e/templates/actors/remove-coins.hbs"}}async _updateObject(_event,formData){const actor=this.object,coinsToRemove={pp:Number(formData.pp)||0,gp:Number(formData.gp)||0,sp:Number(formData.sp)||0,cp:Number(formData.cp)||0};await actor.inventory.removeCoins(coinsToRemove,{byValue:!!formData.removeByValue})||ui.notifications.warn("PF2E.ErrorMessage.NotEnoughCoins",{localize:!0})}};__name2(_RemoveCoinsPopup,"RemoveCoinsPopup");let RemoveCoinsPopup=_RemoveCoinsPopup;const _ActorSheetPF2e=class _ActorSheetPF2e2 extends ActorSheet{static{__name(this,"_ActorSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_activateInventoryDragDrop),__privateAdd(this,_sortableOnMove),__privateAdd(this,_sortableOnEnd),__privateAdd(this,_onClickDeleteItem),__privateAdd(this,_onClickBrowseEquipment),__privateAdd(this,_onClickCreateItem),__privateAdd(this,_onClickSellAllTreasure),__publicField(this,"itemRenderer",new ItemSummaryRenderer(this)),__privateAdd(this,_sortableOnMoveData,{})}static get defaultOptions(){const options=super.defaultOptions;return options.dragDrop=[{dragSelector:"[data-foundry-list] .drag-handle"},{dragSelector:".item[draggable=true]"},{dragSelector:".item-list .item:not(.inventory-list *)"}],mergeObject(options,{classes:["default","sheet","actor"],scrollY:[".sheet-sidebar",".tab.active",".inventory-list"]})}get isLootSheet(){return!1}async getData(options=this.options){options.id||=this.id,options.editable=this.isEditable,options.sheetConfig&&=Object.values(CONFIG.Actor.sheetClasses[this.actor.type]).filter(c=>c.canConfigure).length>1;for(const item of[...this.actor.itemTypes.action,...this.actor.itemTypes.feat])item.system.selfEffect&&(item.system.selfEffect.img??=fromUuidSync(item.system.selfEffect.uuid)?.img??null);const actorData=this.actor.toObject(!1),iwrKeys=["immunities","weaknesses","resistances"],attributes=actorData.system.attributes;for(const key of iwrKeys)attributes[key]=[...attributes[key]].sort((a,b)=>a.label.localeCompare(b.label));const coins=this.actor.inventory.coins,totalCoinage=_ActorSheetPF2e2.coinsToSheetData(coins),totalCoinageGold=(coins.copperValue/100).toFixed(2),totalWealth=this.actor.inventory.totalWealth,totalWealthGold=(totalWealth.copperValue/100).toFixed(2),traitsMap=(()=>{switch(this.actor.type){case"hazard":return CONFIG.PF2E.hazardTraits;case"vehicle":return CONFIG.PF2E.vehicleTraits;default:return CONFIG.PF2E.creatureTraits}})(),sheetData={cssClass:this.actor.isOwner?"editable":"locked",editable:this.isEditable,document:this.actor,limited:this.actor.limited,options,owner:this.actor.isOwner,title:this.title,actor:actorData,data:actorData.system,effects:[],items:actorData.items,user:{isGM:game.user.isGM},traits:createSheetTags(traitsMap,{value:Array.from(this.actor.traits)}),toggles:this.actor.synthetics.toggles,isTargetFlatFooted:!!this.actor.rollOptions.all["target:condition:off-guard"],totalCoinage,totalCoinageGold,totalWealth,totalWealthGold,inventory:this.prepareInventory(),enrichedContent:{}};return await this.prepareItems?.(sheetData),sheetData}prepareInventory(){const sections={weapon:{label:game.i18n.localize("PF2E.InventoryWeaponsHeader"),type:"weapon",items:[]},armor:{label:game.i18n.localize("PF2E.InventoryArmorHeader"),type:"armor",items:[]},equipment:{label:game.i18n.localize("PF2E.InventoryEquipmentHeader"),type:"equipment",items:[]},consumable:{label:game.i18n.localize("PF2E.InventoryConsumablesHeader"),type:"consumable",items:[]},treasure:{label:game.i18n.localize("PF2E.InventoryTreasureHeader"),type:"treasure",items:[]},backpack:{label:game.i18n.localize("PF2E.InventoryBackpackHeader"),type:"backpack",items:[]}};for(const item of this.actor.inventory.contents.sort((a,b)=>(a.sort||0)-(b.sort||0))){if(!objectHasKey(sections,item.type)||item.isInContainer)continue;(item.isOfType("book")?sections.equipment:sections[item.type]).items.push(this.prepareInventoryItem(item))}return{sections,bulk:this.actor.inventory.bulk,showValueAlways:this.actor.isOfType("npc","loot","party"),showIndividualPricing:this.actor.isOfType("loot"),hasStowingContainers:this.actor.itemTypes.backpack.some(c=>c.system.stowing&&!c.isInContainer),invested:this.actor.inventory.invested}}prepareInventoryItem(item){const editable=game.user.isGM||item.isIdentified,heldItems=item.isOfType("backpack")?item.contents.map(i=>this.prepareInventoryItem(i)):void 0;heldItems?.sort((a,b)=>(a.item.sort||0)-(b.item.sort||0));const actorSize=new ActorSizePF2e({value:this.actor.size}),itemSize=new ActorSizePF2e({value:item.size}),sizeDifference=itemSize.difference(actorSize,{smallIsMedium:!0}),canBeEquipped=!item.isInContainer;return{item,itemSize:sizeDifference!==0?itemSize:null,editable,isContainer:item.isOfType("backpack"),canBeEquipped,isInvestable:!1,isSellable:editable&&item.isOfType("treasure")&&!item.isCoinage,hasCharges:item.isOfType("consumable")&&item.uses.max>0,heldItems}}static coinsToSheetData(coins){return DENOMINATIONS.reduce((accumulated,d)=>({...accumulated,[d]:{value:coins[d],label:CONFIG.PF2E.currencies[d]}}),{})}getStrikeFromDOM(button,readyOnly=!1){const actionIndex=Number(htmlClosest(button,"[data-action-index]")?.dataset.actionIndex??"NaN"),rootAction=this.actor.system.actions?.at(actionIndex)??null,altUsage=tupleHasValue(["thrown","melee"],button?.dataset.altUsage)?button?.dataset.altUsage:null,strike=altUsage?rootAction?.altUsages?.find(s=>altUsage==="thrown"?s.item.isThrown:s.item.isMelee)??null:rootAction;return strike?.ready||!readyOnly?strike:null}activateListeners($html){super.activateListeners($html);const html=$html[0];this.itemRenderer.activateListeners(html),htmlQuery(html,"a[data-action=show-image]")?.addEventListener("click",()=>{const actor=this.actor,title=actor.token?.name??actor.prototypeToken?.name??actor.name;new ImagePopout(actor.img,{title,uuid:actor.uuid}).render(!0)});const inventoryPanel=(()=>{const selector=this.actor.isOfType("loot")?".sheet-body":".tab[data-tab=inventory]";return htmlQuery(html,selector)})();this.activateInventoryListeners(inventoryPanel);for(const element of htmlQueryAll(html,".item[data-item-id] .item-image, .item[data-item-id] .item-chat"))element.addEventListener("click",async event=>{const itemId=htmlClosest(element,"[data-item-id]")?.dataset.itemId??"",[item,fromFormula]=(()=>{if(UUIDUtils.isItemUUID(itemId)){if("knownFormulas"in this&&isObject(this.knownFormulas)){const formula=this.knownFormulas[itemId];if(formula)return[new ItemProxyPF2e(formula.item.toObject(),{parent:this.actor}),!0]}throw ErrorPF2e(`Invalid UUID [${itemId}]!`)}return[this.actor.items.get(itemId,{strict:!0}),!1]})();(!item.isOfType("physical")||item.isIdentified)&&await item.toMessage(event,{create:!0,data:{fromFormula}})});if(!this.options.editable)return;const manualPropertyInputs=htmlQueryAll(html,"select[data-property],input[data-property]");for(const input of manualPropertyInputs)input.addEventListener("focus",()=>{const propertyPath=input.dataset.property??"";if(input.name=propertyPath,input instanceof HTMLInputElement){const baseValue=Math.trunc(Number(getProperty(this.actor._source,propertyPath))||0);input.value=baseValue.toString(),input.type==="text"&&input.dataset.dtype==="Number"&&(input.type="number")}}),input.addEventListener("blur",()=>{input.removeAttribute("name");const propertyPath=input.dataset.property??"",preparedValue=Number(getProperty(this.actor,propertyPath))||0,baseValue=Math.trunc(Number(getProperty(this.actor._source,propertyPath))||0),newValue=Math.trunc(Number(input.value));input instanceof HTMLInputElement&&(input.type==="number"&&input.dataset.dtype==="Number"&&(input.type="text"),baseValue===newValue&&(input.value=input.classList.contains("modifier")?signedInteger(preparedValue):String(preparedValue)))});for(const link of htmlQueryAll(html,".item-delete"))link.addEventListener("click",event=>__privateMethod(this,_onClickDeleteItem,onClickDeleteItem_fn).call(this,event));for(const link of htmlQueryAll(html,".inventory-browse"))link.addEventListener("click",()=>__privateMethod(this,_onClickBrowseEquipment,onClickBrowseEquipment_fn).call(this,link));for(const link of htmlQueryAll(html,".save-name"))link.addEventListener("click",event=>{const saveType=htmlClosest(link,"[data-save]")?.dataset.save;if(!tupleHasValue(SAVE_TYPES,saveType))throw ErrorPF2e(`"${saveType}" is not a recognized save type`);this.actor.saves?.[saveType]?.check.roll(eventToRollParams(event,{type:"check"}))});const rollInitElem=htmlQuery(html,"a[data-action=roll-initiative]");rollInitElem?.addEventListener("click",event=>{!rollInitElem.classList.contains("disabled")&&this.actor.initiative&&this.actor.initiative.roll(eventToRollParams(event,{type:"check"}))}),htmlQuery(html,".actions-options")?.addEventListener("change",event=>{const toggleRow=htmlClosest(event.target,"[data-item-id][data-domain][data-option]"),checkbox=htmlQuery(toggleRow,"input[data-action=toggle-roll-option]"),suboptionsSelect=htmlQuery(toggleRow,"select[data-action=set-suboption"),{domain,option,itemId}=toggleRow?.dataset??{},suboption=suboptionsSelect?.value??null;checkbox&&domain&&option&&this.actor.toggleRollOption(domain,option,itemId??null,checkbox.checked,suboption)});for(const listName of["immunities","weaknesses","resistances"])htmlQuery(html,`a[data-action=edit-${listName}]`)?.addEventListener("click",()=>{new IWREditor(this.actor,{category:listName}).render(!0)});for(const strikeElem of htmlQueryAll(html,"ol.strikes-list > li[data-strike]")){const attackSelectors=".item-image[data-action=strike-attack], button[data-action=strike-attack]";for(const button of htmlQueryAll(strikeElem,attackSelectors))button.addEventListener("click",async event=>{if(!Array.isArray(this.actor.system.actions))throw ErrorPF2e("Strikes are not supported on this actor");const altUsage=tupleHasValue(["thrown","melee"],button.dataset.altUsage)?button.dataset.altUsage:null,strike=this.getStrikeFromDOM(button,!0),variantIndex=Number(button.dataset.variantIndex);await strike?.variants[variantIndex]?.roll({event,altUsage})});const damageSelectors="button[data-action=strike-damage], button[data-action=strike-critical]";for(const button of htmlQueryAll(strikeElem,damageSelectors)){const strike=this.getStrikeFromDOM(button),method=button.dataset.action==="strike-damage"?"damage":"critical";button.addEventListener("click",async event=>{await strike?.[method]?.({event})});const altUsage=tupleHasValue(["thrown","melee"],button.dataset.altUsage)?button.dataset.altUsage:null;strike?.[method]?.({getFormula:!0,altUsage}).then(formula=>{formula&&(button.dataset.tooltip=formula.toString())})}}for(const button of htmlQueryAll(html,"button[data-action=use-action]"))button.addEventListener("click",()=>{const itemId=htmlClosest(button,"[data-item-id]")?.dataset.itemId,item=this.actor.items.get(itemId,{strict:!0});item.isOfType("action","feat")&&createSelfEffectMessage(item)});for(const anchor of htmlQueryAll(html,".item-unprepare"))anchor.addEventListener("click",()=>{const row=htmlClosest(anchor,".item"),slotLevel=Number(row?.dataset.slotLevel)||0,slotId=Number(row?.dataset.slotId)||0,entryId=row?.dataset.entryId??"";this.actor.spellcasting.collections.get(entryId)?.unprepareSpell(slotLevel,slotId)});for(const anchor of htmlQueryAll(html,".item-toggle-prepare"))anchor.addEventListener("click",()=>{const row=htmlClosest(anchor,".item"),slotLevel=Number(row?.dataset.slotLevel)||0,slotId=Number(row?.dataset.slotId)||0,entryId=row?.dataset.entryId??"",expendedState=row?.dataset.expendedState!=="true";this.actor.spellcasting.collections.get(entryId)?.setSlotExpendedState(slotLevel,slotId,expendedState)});for(const link of htmlQueryAll(html,".tag-selector"))link.addEventListener("click",()=>this.openTagSelector(link));for(const link of htmlQueryAll(html,".item-create, .item-control.spell-create"))link.addEventListener("click",()=>__privateMethod(this,_onClickCreateItem,onClickCreateItem_fn).call(this,link));for(const anchor of htmlQueryAll(html,".item-edit"))anchor.addEventListener("click",()=>{const itemId=htmlClosest(anchor,"[data-item-id]")?.dataset.itemId;this.actor.items.get(itemId??"")?.sheet.render(!0,{focus:!0})});for(const effectDecrement of htmlQueryAll(html,".effects-list .decrement"))effectDecrement.addEventListener("click",event=>{const parent=htmlClosest(event.currentTarget,".item"),effect=this.actor.items.get(parent?.dataset.itemId??"");effect instanceof AbstractEffectPF2e&&effect.decrease()});for(const effectIncrement of htmlQueryAll(html,".effects-list .increment"))effectIncrement.addEventListener("click",event=>{const parent=htmlClosest(event.currentTarget,".item"),effect=this.actor?.items.get(parent?.dataset.itemId??"");effect instanceof AbstractEffectPF2e&&effect.increase()});for(const element of htmlQueryAll(html,".effects-list [data-action=effect-toggle-unidentified]")??[])element.addEventListener("click",async event=>{const effectId=htmlClosest(event.currentTarget,"[data-item-id]")?.dataset.itemId,effect=this.actor.items.get(effectId,{strict:!0});if(effect.isOfType("effect")){const isUnidentified=effect.system.unidentified;await effect.update({"system.unidentified":!isUnidentified})}});for(const inputElem of htmlQueryAll(html,"input[type=text], input[type=number]"))inputElem.addEventListener("focus",()=>{inputElem.select()});for(const deltaInput of htmlQueryAll(html,"input[data-allow-delta]"))deltaInput.addEventListener("input",()=>{const match=/[+-]?\d*/.exec(deltaInput.value)?.at(0);deltaInput.value=match??deltaInput.value})}activateInventoryListeners(panel){if(this._canDragDrop(".item-list")&&__privateMethod(this,_activateInventoryDragDrop,activateInventoryDragDrop_fn).call(this,panel),!!this.isEditable){panel?.addEventListener("click",event=>{const link=htmlClosest(event.target,"a[data-action], button[data-action]");if(!link)return;const getItem=__name2(()=>{const itemId=htmlClosest(link,".item")?.dataset.itemId??"",item=this.actor.items.get(itemId);if(!item?.isOfType("physical"))throw ErrorPF2e("Item not found or isn't physical");return item},"getItem");switch(link.dataset.action){case"add-coins":{new AddCoinsPopup(this.actor).render(!0);return}case"remove-coins":{new RemoveCoinsPopup(this.actor).render(!0);return}case"increase-quantity":{const item=getItem(),addend=event.ctrlKey?10:event.shiftKey?5:1;item.update({"system.quantity":item.quantity+addend});return}case"decrease-quantity":{const item=getItem();if(item.quantity>0){const subtrahend=Math.min(item.quantity,event.ctrlKey?10:event.shiftKey?5:1);item.update({"system.quantity":item.quantity-subtrahend})}return}case"repair":{const item=getItem();game.pf2e.actions.repair({event,item});return}case"toggle-identified":{const item=getItem();item.isIdentified?item.setIdentificationStatus("unidentified"):new IdentifyItemPopup(item).render(!0);return}case"toggle-container":{const item=getItem();if(!item.isOfType("backpack"))return;const isCollapsed=item.system.collapsed??!1;item.update({"system.collapsed":!isCollapsed});return}case"sell-treasure":{const item=getItem(),sellItem=__name2(async()=>{item?.isOfType("treasure")&&!item.isCoinage&&(await item.delete(),await this.actor.inventory.addCoins(item.assetValue))},"sellItem");if(event.ctrlKey){sellItem();return}const content=document.createElement("p");content.innerText=game.i18n.format("PF2E.SellItemQuestion",{item:item.name}),new Dialog({title:game.i18n.localize("PF2E.SellItemConfirmHeader"),content:content.outerHTML,buttons:{Yes:{icon:fontAwesomeIcon("check").outerHTML,label:game.i18n.localize("Yes"),callback:sellItem},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:game.i18n.localize("Cancel")}},default:"Yes"}).render(!0);return}case"sell-all-treasure":__privateMethod(this,_onClickSellAllTreasure,onClickSellAllTreasure_fn).call(this)}});for(const anchor of htmlQueryAll(panel,".carry-type-hover"))$(anchor).tooltipster({animation:"fade",delay:200,animationDuration:10,trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["bottom"],theme:"crb-hover",minWidth:120})}}async deleteItem(element,item,event){(event?.ctrlKey||await Dialog.confirm({title:game.i18n.localize("PF2E.DeleteItemTitle"),content:`

${game.i18n.format("PF2E.DeleteQuestion",{name:`"${item.name}"`})}

`}))&&(await item.delete(),$(element).slideUp(200,()=>this.render(!1)))}_canDragStart(selector){return this.isLootSheet?!0:super._canDragStart(selector)}_canDragDrop(selector){return this.isLootSheet?!0:super._canDragDrop(selector)}_onDragStart(event){if(!(event.target instanceof HTMLElement)||!event.dataTransfer)return;const isContentLink=event.target.classList.contains("content-link"),isPersistent="persistent"in event.target.dataset;if(event.target!==event.currentTarget&&(isContentLink||isPersistent))return;const targetElement=event.currentTarget,previewElement=htmlClosest(targetElement,".item");if(previewElement&&targetElement&&targetElement!==previewElement){const{x,y}=previewElement.getBoundingClientRect();event.dataTransfer.setDragImage(previewElement,event.pageX-x,event.pageY-y)}const itemId=previewElement?.dataset.itemId,item=this.actor.items.get(itemId??""),baseDragData={actorId:this.actor.id,actorUUID:this.actor.uuid,sceneId:canvas.scene?.id??null,tokenId:this.actor.token?.id??null,...item?.toDragData()};previewElement?.dataset.isFormula&&(baseDragData.isFormula=!0,baseDragData.entrySelector=previewElement.dataset.entrySelector);const supplementalData=(()=>{const actionIndex=previewElement?.dataset.actionIndex;if(actionIndex)return"itemType"in baseDragData&&baseDragData.itemType==="melee"?{index:Number(actionIndex)}:{type:"Action",index:Number(actionIndex)};const elementTrait=previewElement?.dataset.element;if(elementTrait)return{type:"Action",elementTrait};const label=previewElement?.innerText.trim(),rollOptionData=previewElement?.dataset??{};return item&&label&&rollOptionData.domain&&rollOptionData.option?{type:"RollOption",label,...rollOptionData}:baseDragData.isFormula?{pf2e:{type:"CraftingFormula",itemUuid:itemId}}:null})();event.dataTransfer.setData("text/plain",JSON.stringify({...baseDragData,...supplementalData}))}async emulateItemDrop(data){const event=new DragEvent("drop",{altKey:game.keyboard.isModifierActive("Alt")});return this._onDropItem(event,data)}async _onDropItem(event,data){event.preventDefault();const item=await ItemPF2e.fromDropData(data);return item?item.actor?.uuid===this.actor.uuid?data.fromInventory?[]:this._onSortItem(event,item.toObject()):item.actor&&item.isOfType("physical")?(await this.moveItemBetweenActors(event,item.actor.id,item.actor?.token?.id??null,this.actor.id,this.actor.token?.id??null,item.id),[item]):this._handleDroppedItem(event,item,data):[]}async _handleDroppedItem(event,item,data){const{actor}=this,itemSource=item.toObject(),mystified=game.user.isGM&&event.altKey;mystified&&itemSource.type==="effect"&&(itemSource.system.unidentified=!0),mystified&&item.isOfType("physical")&&isPhysicalData(itemSource)&&(itemSource.system.identification.unidentified=item.getMystifiedData("unidentified"),itemSource.system.identification.status="unidentified");const containerAttribute=htmlClosest(event.target,".item-container")?.dataset.containerType,dropContainerType=this._tabs[0]?.active==="inventory"&&!containerAttribute?"actorInventory":containerAttribute,craftingTab=this._tabs[0]?.active==="crafting";if(item.isOfType("spell")&&itemSource.type==="spell")return item.isRitual?this._onDropItemCreate(item.clone().toObject()):dropContainerType==="actorInventory"&&itemSource.system.level.value>0?(new CastingItemCreateDialog(actor,{},async(heightenedLevel,itemType,spell)=>{const createdItem=await createConsumableFromSpell(spell,{type:itemType,heightenedLevel,mystified});await this._onDropItemCreate(createdItem)},item).render(!0),[item]):[];if(itemSource.type==="spellcastingEntry")return[];if(itemSource.type==="condition"){const value=data.value;return typeof value=="number"&&itemSource.system.value.isValued&&(itemSource.system.value.value=value),actor.canUserModify(game.user,"update")?[await actor.increaseCondition(itemSource.system.slug,{value})??[]].flat():(ui.notifications.error("PF2E.ErrorMessage.NoUpdatePermission",{localize:!0}),[])}else if(itemIsOfType(itemSource,"affliction","effect")){const{level,value,context}=data;typeof level=="number"&&level>=0&&(itemSource.system.level.value=Math.floor(level)),itemSource.type==="effect"&&itemSource.system.badge?.type==="counter"&&typeof value=="number"&&(itemSource.system.badge.value=value),itemSource.system.context=context??null;const originItem=fromUuidSync(context?.origin.item??"");itemSource.system.traits?.value.length===0&&originItem instanceof SpellPF2e&&itemSource.system.traits.value.push(...originItem.traits)}else if(item.isOfType("physical")&&actor.isOfType("character")&&craftingTab){const actorFormulas=deepClone(actor.system.crafting.formulas);return actorFormulas.some(f=>f.uuid===item.uuid)||(actorFormulas.push({uuid:item.uuid}),await actor.update({"system.crafting.formulas":actorFormulas})),[item]}if(isPhysicalData(itemSource)){const containerId=htmlClosest(event.target,"[data-item-is-container=true]")?.dataset.itemId?.trim()||null;this.actor.itemTypes.backpack.find(container2=>container2.id===containerId)?(itemSource.system.containerId=containerId,itemSource.system.equipped.carryType="stowed"):itemSource.system.equipped.carryType="worn",data?.uuid?.startsWith("Compendium")&&itemSource.type!=="treasure"&&!["med","sm"].includes(actor.size)&&actor.isOfType("creature")&&(itemSource.system.size=actor.size)}return this._onDropItemCreate(new ItemProxyPF2e(itemSource).clone().toObject())}async _onDropFolder(_event,data){if(!(this.actor.isOwner&&data.documentName==="Item"))return[];const folder=await Folder.fromDropData(data);if(!folder)return[];const itemSources=[folder,...folder.getSubfolders()].flatMap(f=>f.contents).map(i=>i.toObject());return this._onDropItemCreate(itemSources)}async moveItemBetweenActors(event,sourceActorId,sourceTokenId,targetActorId,targetTokenId,itemId){const sourceActor=canvas.scene?.tokens.get(sourceTokenId??"")?.actor??game.actors.get(sourceActorId),targetActor=canvas.scene?.tokens.get(targetTokenId??"")?.actor??game.actors.get(targetActorId),item=sourceActor?.items.get(itemId);if(!sourceActor||!targetActor)throw ErrorPF2e("Unexpected missing actor(s)");if(!item?.isOfType("physical"))throw ErrorPF2e("Missing or invalid item");const containerId=htmlClosest(event.target,"[data-item-is-container=true]")?.dataset.containerId?.trim(),sourceItemQuantity=item.quantity,stackable=!!targetActor.inventory.findStackableItem(item._source),isPurchase=sourceActor.isOfType("loot")&&sourceActor.isMerchant&&!sourceActor.isOwner,isAmmunition=item.isOfType("consumable")&&item.isAmmunition;if(sourceItemQuantity>1){const defaultQuantity=isPurchase?isAmmunition?Math.min(10,sourceItemQuantity):1:sourceItemQuantity;new MoveLootPopup(sourceActor,{quantity:{max:sourceItemQuantity,default:defaultQuantity},lockStack:!stackable,isPurchase},(quantity,newStack)=>{sourceActor.transferItemToActor(targetActor,item,quantity,containerId,newStack)}).render(!0)}else sourceActor.transferItemToActor(targetActor,item,1,containerId)}openTagSelector(anchor,options={}){const selectorType=anchor.dataset.tagSelector;if(!tupleHasValue(TAG_SELECTOR_TYPES,selectorType))throw ErrorPF2e(`Unrecognized tag selector type "${selectorType}"`);if(selectorType==="basic"){const objectProperty=anchor.dataset.property??"",title=anchor.dataset.title??"",configTypes=(anchor.dataset.configTypes??"").split(",").map(type=>type.trim()).filter(tag=>tupleHasValue(SELECTABLE_TAG_FIELDS,tag));this.tagSelector("basic",{...options,objectProperty,configTypes,title})}else this.tagSelector(selectorType,options)}tagSelector(selectorType,options){if(selectorType==="basic"&&options&&"objectProperty"in options)new TagSelectorBasic(this.object,options).render(!0);else{if(selectorType==="basic")throw ErrorPF2e("Insufficient options provided to render basic tag selector");{const TagSelector={senses:SenseSelector,"speed-types":SpeedSelector}[selectorType];new TagSelector(this.object,options).render(!0)}}}openTab(name2){this._tabs[0].activate(name2)}async _renderInner(data,options){return this.itemRenderer.saveAndRestoreState(()=>super._renderInner(data,options))}async _render(force,options){await maintainFocusInRender(this,()=>super._render(force,options)),options?.tab&&this.openTab(options.tab)}async _onSubmit(event,{updateData=null,preventClose=!1,preventRender=!1}={}){for(const input of htmlQueryAll(this.form,"tags ~ input"))input.value===""&&(input.value="[]");return super._onSubmit(event,{updateData,preventClose,preventRender})}_getSubmitData(updateData){const data=super._getSubmitData(updateData);processTagifyInSubmitData(this.form,data);for(const el of this.form.elements)if(el instanceof HTMLInputElement&&el.dataset.allowDelta!==void 0){const strValue=el.value.trim(),value=Number(strValue);(strValue.startsWith("+")||strValue.startsWith("-"))&&!Number.isNaN(value)&&(data[el.name]=Number(getProperty(this.actor,el.name))+value)}return data}};_sortableOnMoveData=new WeakMap,_activateInventoryDragDrop=new WeakSet,activateInventoryDragDrop_fn=__name2(function(panel){const inventoryList=htmlQuery(panel,"section.inventory-list, ol[data-container-type=actorInventory]");if(!inventoryList)return;const sortableOptions={...SORTABLE_DEFAULTS,filter:"div.item-summary",preventOnFilter:!1,scroll:inventoryList,setData:(dataTransfer,dragEl)=>{const item=this.actor.inventory.get(htmlQuery(dragEl,"div[data-item-id]")?.dataset.itemId,{strict:!0});dataTransfer.setData("text/plain",JSON.stringify({...item.toDragData(),fromInventory:!0}))},onStart:()=>{__privateSet(this,_sortableOnMoveData,{})},onClone:event=>{for(const link of htmlQueryAll(htmlQuery(event.item,"div.item-summary"),"a.content-link"))link.draggable=!0},onMove:(event,originalEvent)=>__privateMethod(this,_sortableOnMove,sortableOnMove_fn).call(this,event,originalEvent),onEnd:event=>__privateMethod(this,_sortableOnEnd,sortableOnEnd_fn).call(this,event)};for(const list of htmlQueryAll(inventoryList,"ol.inventory-items, ol.item-list")){const itemType=list.dataset.itemType;if(!(list.dataset.containerId||!itemType)){if(itemType==="backpack"){Sortable.create(list,{...sortableOptions,group:{name:"container",put:(_to,_from,dragEl)=>dragEl.dataset.itemType==="backpack"},swapThreshold:.2});for(const subList of htmlQueryAll(list,"ol.container-held-items"))Sortable.create(subList,{...sortableOptions,group:{name:"nested-item",put:!0},swapThreshold:.2});continue}Sortable.create(list,{...sortableOptions,group:{name:itemType,put:(to,from,dragEl)=>from===to?!0:dragEl.dataset.itemType===to.el.dataset.itemType}})}}},"#activateInventoryDragDrop"),_sortableOnMove=new WeakSet,sortableOnMove_fn=__name2(function(event,originalEvent){if(!this.isEditable)return!1;__privateSet(this,_sortableOnMoveData,{related:event.related,willInsertAfter:event.willInsertAfter});const sourceItem=this.actor.inventory.get(htmlQuery(event.dragged,"div[data-item-id]")?.dataset.itemId??""),targetItem=this.actor.inventory.get(htmlClosest(originalEvent.target,"div[data-item-id]")?.dataset.itemId??"");if(sourceItem&&targetItem)return sourceItem.isOfType("backpack")&&targetItem.isOfType("backpack")&&targetItem.isCollapsed?!1:!sourceItem.isStackableWith(targetItem)},"#sortableOnMove"),_sortableOnEnd=new WeakSet,sortableOnEnd_fn=__name2(async function(event){const itemId=htmlQuery(event.item,"div[data-item-id]")?.dataset.itemId,sourceItem=this.actor.inventory.get(itemId,{strict:!0}),targetElement=event.originalEvent?.target instanceof HTMLElement?event.originalEvent.target:null,targetItemId=htmlClosest(targetElement,"div[data-item-id]")?.dataset.itemId??"",targetItem=this.actor.inventory.get(targetItemId);if(!targetItem&&!event.from.contains(targetElement)&&!event.to.contains(targetElement)){if(this.isEditable&&sourceItem.isInContainer&&htmlClosest(targetElement,".inventory-header"))return sourceItem.move({toContainer:null});const itemIsOnlyOneOfType=this.actor.itemTypes[sourceItem.type].length===1;(event.newIndex!==event.oldIndex||itemIsOnlyOneOfType)&&this.render();return}if(!this.isEditable)return;if(targetItem?.isOfType("backpack")&&(!!!htmlClosest(targetElement,"ol[data-container-id]")||targetItem.contents.size===0))return sourceItem.move({toContainer:targetItem});const{related,willInsertAfter}=__privateGet(this,_sortableOnMoveData),relativeItemId=htmlQuery(related,"div[data-item-id]")?.dataset.itemId??"",relativeItem=this.actor.inventory.get(relativeItemId);if(relativeItem||targetItem)return targetItem&&!targetItem.isOfType("backpack")?sourceItem.move({toStack:targetItem}):sourceItem.move({relativeTo:relativeItem,sortBefore:!willInsertAfter})},"#sortableOnEnd"),_onClickDeleteItem=new WeakSet,onClickDeleteItem_fn=__name2(async function(event){const row=htmlClosest(event.currentTarget,"[data-item-id]"),itemId=row?.dataset.itemId,item=this.actor.items.get(itemId??"");if(item?.isOfType("condition")){const references=htmlQuery(row,".condition-references"),deleteCondition=__name2(async()=>{this.actor.decreaseCondition(item,{forceRemove:!0})},"deleteCondition");if(event.ctrlKey){deleteCondition();return}const content=await renderTemplate("systems/pf2e/templates/actors/delete-condition-dialog.hbs",{question:game.i18n.format("PF2E.DeleteQuestion",{name:item.name}),ref:references?.innerHTML});new Dialog({title:game.i18n.localize("PF2E.DeleteConditionTitle"),content,buttons:{Yes:{icon:'',label:"Yes",callback:deleteCondition},cancel:{icon:'',label:"Cancel"}},default:"Yes"}).render(!0)}else if(row&&item)this.deleteItem(row,item,event);else throw ErrorPF2e("Item not found")},"#onClickDeleteItem"),_onClickBrowseEquipment=new WeakSet,onClickBrowseEquipment_fn=__name2(async function(element){const checkboxesFilterCodes=(element.dataset.filter??"").split(",").filter(s=>!!s).map(s=>s.trim()),tab=game.pf2e.compendiumBrowser.tabs.equipment,filter2=await tab.getFilterData(),{checkboxes}=filter2;for(const filterCode of checkboxesFilterCodes){const splitValues=filterCode.split("-");if(splitValues.length!==2)throw ErrorPF2e(`Invalid filter value for opening the compendium browser: "${filterCode}"`);const[filterType,value]=splitValues;if(objectHasKey(checkboxes,filterType)){const checkbox=checkboxes[filterType];objectHasKey(checkbox.options,value)&&(checkbox.options[value].selected=!0,checkbox.selected.push(value),checkbox.isExpanded=!0)}}tab.open(filter2)},"#onClickBrowseEquipment"),_onClickCreateItem=new WeakSet,onClickCreateItem_fn=__name2(function(link){const data=link.dataset;if(!objectHasKey(CONFIG.PF2E.Item.documentClasses,data.type))throw ErrorPF2e(`Unrecognized item type: "${data.type}"`);if(data.type==="spell")return onClickCreateSpell(this.actor,data);const img=`systems/pf2e/icons/default-icons/${data.type}.svg`,type=data.type,itemSource=(()=>{switch(type){case"action":{const name2=game.i18n.localize(`PF2E.ActionType${String(data.actionType).capitalize()}`),actionType=data.actionType;return{type,img,name:name2,system:{actionType:{value:actionType}}}}case"melee":{const name2=game.i18n.localize(`PF2E.NewPlaceholders.${type.capitalize()}`),weaponType=data.actionType;return{type,img,name:name2,system:{weaponType:{value:weaponType}}}}case"lore":{const name2=this.actor.type==="npc"?game.i18n.localize("PF2E.SkillLabel"):game.i18n.localize("PF2E.NewPlaceholders.Lore");return{type,img,name:name2}}default:{if(!setHasElement(PHYSICAL_ITEM_TYPES,type))throw ErrorPF2e(`Unsupported item type: ${type}`);return{name:game.i18n.localize(`PF2E.NewPlaceholders.${data.type.capitalize()}`),type}}}})();if(itemSource){if(data.traits){const traits=String(data.traits).split(",");itemSource.system=mergeObject(itemSource.system??{},{traits:{value:traits}})}this.actor.createEmbeddedDocuments("Item",[itemSource])}},"#onClickCreateItem"),_onClickSellAllTreasure=new WeakSet,onClickSellAllTreasure_fn=__name2(async function(){const content=await renderTemplate("systems/pf2e/templates/actors/sell-all-treasure-dialog.hbs");new Dialog({title:game.i18n.localize("PF2E.SellAllTreasureTitle"),content,buttons:{yes:{icon:fontAwesomeIcon("check").outerHTML,label:"Yes",callback:async()=>this.actor.inventory.sellAllTreasure()},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:"Cancel"}},default:"cancel"}).render(!0)},"#onClickSellAllTreasure"),__name2(_ActorSheetPF2e,"ActorSheetPF2e");let ActorSheetPF2e=_ActorSheetPF2e;const _DamagePF2e=class{static{__name(this,"_DamagePF2e")}static async roll(data,context,callback){const outcome=context.outcome??null;context.rollMode??=(context.secret?"blindroll":void 0)??game.settings.get("core","rollMode"),context.createMessage??=!0,context.options.has("secret")&&(context.secret=!0);const subtitle=outcome?context.sourceType==="attack"?game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${outcome}`):game.i18n.localize(`PF2E.Check.Result.Degree.Check.${outcome}`):null;let flavor=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{title:data.name,subtitle});if(data.traits){const toTags=__name2((slugs,{labels={},descriptions={},cssClass,dataAttr})=>slugs.map(s=>({value:s,label:game.i18n.localize(labels[s]??"")})).sort((a,b)=>a.label.localeCompare(b.label)).map(tag=>{const description=descriptions[tag.value]??"",span=document.createElement("span");return span.className="tag",cssClass&&span.classList.add(cssClass),span.dataset[dataAttr]=tag.value,description&&(span.dataset.tooltip=description),span.innerText=tag.label,span.outerHTML}).join(""),"toTags"),traits=toTags(data.traits,{labels:CONFIG.PF2E.actionTraits,descriptions:CONFIG.PF2E.traitsDescriptions,cssClass:null,dataAttr:"trait"}),item2=context.self?.item,itemTraits=item2?.isOfType("weapon","melee","spell")?toTags(Array.from(item2.traits).filter(t=>!(t in CONFIG.PF2E.materialDamageEffects)),{labels:item2.isOfType("spell")?CONFIG.PF2E.spellTraits:CONFIG.PF2E.npcAttackTraits,descriptions:CONFIG.PF2E.traitsDescriptions,cssClass:"tag_alt",dataAttr:"trait"}):"",runeTags=context.options.has("item:rune:property:ghost-touch")&&context.options.has("target:trait:incorporeal")?toTags(["ghost-touch"],{labels:{"ghost-touch":"PF2E.WeaponPropertyRune.ghostTouch.Name"},descriptions:{"ghost-touch":"PF2E.WeaponPropertyRune.ghostTouch.Note"},cssClass:"ghost-touch",dataAttr:"slug"}):"",properties=(()=>{const range=item2?.isOfType("action","melee","weapon")?item2.range:null,label=createActionRangeLabel(range);if(label&&(range?.increment||range?.max)){const slug=range.increment?`range-increment-${range.increment}`:`range-${range.max}`;return toTags([slug],{labels:{[slug]:label},descriptions:{[slug]:"PF2E.Item.Weapon.RangeIncrementN.Hint"},cssClass:"tag_secondary",dataAttr:"slug"})}else return""})(),materialEffects=toTags(data.materials,{labels:CONFIG.PF2E.preciousMaterials,descriptions:CONFIG.PF2E.traitsDescriptions,cssClass:"tag_material",dataAttr:"material"}),otherTags=[itemTraits,properties,materialEffects,runeTags].join(""),tagsElem=createHTMLElement("div",{classes:["tags"],dataset:{tooltipClass:"pf2e"}});tagsElem.innerHTML=otherTags.length>0?`${traits}
${otherTags}`:traits,flavor+=tagsElem.outerHTML,flavor+=` +
`}const breakdownTags=(Array.isArray(data.damage.breakdown)?data.damage.breakdown:data.damage.breakdown[outcome??"success"]).map(b=>`${b}`);flavor+=`
${breakdownTags.join("")}
`;const roll=await(()=>{const damage=data.damage;if("roll"in damage)return damage.roll.evaluate({async:!0});const formula=deepClone(damage.formula[outcome??"success"]);if(!formula)return ui.notifications.error(game.i18n.format("PF2E.UI.noDamageInfoForOutcome",{outcome})),null;const rollerId=game.userId,degreeOfSuccess=outcome?DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome):null,critRule=game.settings.get("pf2e","critRule")==="doubledamage"?"double-damage":"double-dice",options={rollerId,damage:data,degreeOfSuccess,ignoredResistances:damage.ignoredResistances,critRule};return new DamageRoll(formula,{},options).evaluate({async:!0})})();if(roll===null)return null;const syntheticNotes=context.self?.actor?extractNotes(context.self?.actor.synthetics.rollNotes,context.domains??[]):[],contextNotes=context.notes?.map(n=>n instanceof RollNotePF2e?n:new RollNotePF2e(n))??[],notes=[...syntheticNotes,...contextNotes].filter(n=>(n.outcome.length===0||outcome&&n.outcome.includes(outcome))&&n.predicate.test(context.options)),notesList=RollNotePF2e.notesToHTML(notes);flavor+=notesList.outerHTML;const{self,target}=context,item=self?.item??null,targetFlag=target?{actor:target.actor.uuid,token:target.token.uuid}:null,strike=(()=>{if(item?.isOfType("melee","weapon")&&item&&self?.actor?.isOfType("character","npc")){const strikes=self.actor.system.actions,strike2=strikes.find(a=>a.item?.id===item.id&&a.item.slug===item.slug);if(strike2)return{actor:self.actor.uuid,index:strikes.indexOf(strike2),damaging:!0,name:strike2.item.name,altUsage:item.isOfType("weapon")?item.altUsageType:null}}return null})(),rollMode=context.rollMode??"roll",contextFlag={type:context.type,sourceType:context.sourceType,actor:context.self?.actor.id??null,token:context.self?.token?.id??null,target:targetFlag,domains:context.domains??[],options:Array.from(context.options).sort(),mapIncreases:context.mapIncreases,notes:notes.map(n=>n.toObject()),secret:context.secret??!1,rollMode,traits:context.traits??[],skipDialog:context.skipDialog??!game.user.settings.showDamageDialogs,outcome,unadjustedOutcome:context.unadjustedOutcome??null},messageData=await roll.toMessage({speaker:ChatMessagePF2e.getSpeaker({actor:self?.actor,token:self?.token}),flavor,flags:{pf2e:{context:contextFlag,target:targetFlag,modifiers:data.modifiers?.map(m=>m.toObject())??[],origin:item?.getOriginData(),strike,preformatted:"both"}}},{create:!1}),splashRolls=await(async()=>{const splashInstances=roll.instances.map(i=>({damageType:i.type,total:i.componentTotal("splash")})).filter(s=>s.total>0),rolls=[];for(const splash of splashInstances){const formula=`(${splash.total}[splash])[${splash.damageType}]`,roll2=await new DamageRoll(formula).evaluate({async:!0});roll2.options.splashOnly=!0,rolls.push(roll2.toJSON())}return rolls})();return context.createMessage&&(messageData.rolls.push(...splashRolls),await ChatMessagePF2e.create(messageData,{rollMode})),Hooks.callAll("pf2e.damageRoll",roll),callback&&callback(roll),roll}};__name2(_DamagePF2e,"DamagePF2e");let DamagePF2e=_DamagePF2e;const _DamageModifierDialog=class extends Application{static{__name(this,"_DamageModifierDialog")}constructor(params){super(),__privateAdd(this,_getModifierIcon),__privateAdd(this,_getTypeLabel),__privateAdd(this,_applyStackingRules),__publicField(this,"formulaData"),__publicField(this,"context"),__publicField(this,"baseDamageType"),__publicField(this,"degree"),__privateAdd(this,_resolve,void 0),__publicField(this,"isRolled",!1),__privateAdd(this,_originallyEnabled,void 0),this.formulaData=params.formulaData,this.context=params.context,this.baseDamageType=params.formulaData.base.at(0)?.damageType??"untyped",this.degree=DEGREE_OF_SUCCESS_STRINGS.indexOf(this.context.outcome??"success"),__privateSet(this,_originallyEnabled,new Set(this.formulaData.modifiers.filter(m=>m.enabled)))}static get defaultOptions(){return{...super.defaultOptions,template:"systems/pf2e/templates/chat/damage/damage-modifier-dialog.hbs",classes:["roll-modifiers-dialog","damage-dialog","dialog"],popOut:!0,width:440,height:"auto"}}get title(){return this.isCritical?game.i18n.localize("PF2E.Roll.Dialog.Damage.TitleCritical"):game.i18n.localize("PF2E.Roll.Dialog.Damage.Title")}get isCritical(){return this.degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS}async getData(){const visibleModifiers=[...this.formulaData.modifiers.entries()].filter(([_,m])=>this.isCritical||!m.critical),visibleDiceAll=[...this.formulaData.dice.entries()].filter(([_,d])=>this.isCritical||!d.critical),visibleDice=visibleDiceAll.filter(([_,d])=>!d.override||d.dieSize||d.diceNumber),baseResult=createDamageFormula({base:this.formulaData.base,modifiers:[],dice:[],ignoredResistances:[]}),baseRoll=new DamageRoll(baseResult.formula),baseFormulaTemplate=(await Promise.all(baseRoll.instances.map(i=>i.render()))).join(" + "),result=createDamageFormula(this.formulaData,this.degree),roll=new DamageRoll(result?.formula??"0"),formulaTemplate=(await Promise.all(roll.instances.map(i=>i.render({tooltips:!1})))).join(" + ");return{appId:this.id,baseFormula:baseFormulaTemplate,modifiers:visibleModifiers.map(([idx,m])=>({idx,label:m.label,category:m.category,type:m.type,modifier:m.modifier,hideIfDisabled:!__privateGet(this,_originallyEnabled).has(m)&&m.hideIfDisabled,damageType:m.damageType,typeLabel:__privateMethod(this,_getTypeLabel,getTypeLabel_fn).call(this,m.damageType,m.damageCategory),enabled:m.enabled,ignored:m.ignored,critical:m.critical,icon:__privateMethod(this,_getModifierIcon,getModifierIcon_fn).call(this,m)})),dice:visibleDice.map(([idx,d])=>({idx,label:d.label,category:d.category,damageType:d.damageType,typeLabel:__privateMethod(this,_getTypeLabel,getTypeLabel_fn).call(this,d.damageType,d.category),diceLabel:d.diceNumber&&d.dieSize?`${d.diceNumber}${d.dieSize}`:d.diceNumber?game.i18n.format("PF2E.Roll.Dialog.Damage.Dice",{dice:addSign(d.diceNumber)}):"",enabled:d.enabled,ignored:d.ignored,critical:d.critical,icon:__privateMethod(this,_getModifierIcon,getModifierIcon_fn).call(this,d)})),overrides:pipe(visibleDiceAll,filter(args=>!!args[1].override),sortBy$1(([_,d])=>d.override.diceNumber&&!d.override.dieSize?1:d.override.upgrade?2:3),map(([idx,d])=>({idx,label:d.label,category:d.category,damageType:d.override.damageType??d.damageType,typeLabel:__privateMethod(this,_getTypeLabel,getTypeLabel_fn).call(this,d.override.damageType??d.damageType,d.category),diceLabel:compact([d.override.upgrade?game.i18n.localize("PF2E.Roll.Dialog.Damage.DieSizeUpgrade"):null,d.override.diceNumber||d.override.dieSize?game.i18n.format("PF2E.Roll.Dialog.Damage.Override",{value:d.override.diceNumber&&d.override.dieSize?`${d.override.diceNumber}${d.override.dieSize}`:d.override.diceNumber?game.i18n.format("PF2E.Roll.Dialog.Damage.Dice",{dice:d.override.diceNumber}):d.override.dieSize??""}):null]).join(" + "),enabled:d.enabled,ignored:d.ignored,critical:d.critical,icon:__privateMethod(this,_getModifierIcon,getModifierIcon_fn).call(this,d)}))),isCritical:this.isCritical,damageTypes:sortStringRecord(CONFIG.PF2E.damageTypes),damageSubtypes:sortStringRecord(pick(CONFIG.PF2E.damageCategories,DAMAGE_CATEGORIES_UNIQUE)),rollModes:CONFIG.Dice.rollModes,rollMode:this.context?.rollMode,showDamageDialogs:game.user.settings.showDamageDialogs,formula:formulaTemplate}}activateListeners($html){const html=$html[0];htmlQuery(html,"button.roll")?.addEventListener("click",()=>{this.isRolled=!0,this.close()});for(const checkbox of htmlQueryAll(html,".modifier-container input[type=checkbox]"))checkbox.addEventListener("click",()=>{const{dice,modifiers}=this.formulaData,modIndex=Number(checkbox.dataset.modifierIndex),dieIndex=Number(checkbox.dataset.diceIndex);Number.isNaN(modIndex)?Number.isNaN(dieIndex)||(dice[dieIndex].ignored=!checkbox.checked,dice[dieIndex].enabled=checkbox.checked):(modifiers[modIndex].ignored=!checkbox.checked,__privateMethod(this,_applyStackingRules,applyStackingRules_fn).call(this)),this.render()});const categorySelect=htmlQuery(html,"select.add-dice-category"),damageTypeSelect=htmlQuery(html,"select.add-dice-type");categorySelect?.addEventListener("change",()=>{damageTypeSelect&&(categorySelect.value==="precision"?(damageTypeSelect.value="",damageTypeSelect.disabled=!0):(damageTypeSelect.disabled=!1,damageTypeSelect.value=damageTypeSelect.firstElementChild?.value??"acid"))});const addModifierButton=htmlQuery(html,"button.add-modifier");addModifierButton?.addEventListener("click",()=>{const parent=addModifierButton.parentElement,value=Number(parent.querySelector(".add-modifier-value")?.value||1),type=String(parent.querySelector(".add-modifier-type")?.value),damageType=parent.querySelector(".add-modifier-damage-type")?.value??null,category=parent.querySelector(".add-modifier-category")?.value||null,errors=[];if(Number.isNaN(value)?errors.push("Modifier value must be a number."):value===0&&errors.push("Modifier value must not be zero."),!setHasElement(MODIFIER_TYPES,type))throw ErrorPF2e("Unexpected invalid modifier type");const label=String(parent.querySelector(".add-modifier-name")?.value).trim()||game.i18n.localize(value<0?`PF2E.PenaltyLabel.${type}`:`PF2E.BonusLabel.${type}`);errors.length>0?ui.notifications.error(errors.join(" ")):(this.formulaData.modifiers.push(new ModifierPF2e({label,modifier:value,type,damageType,damageCategory:category})),__privateMethod(this,_applyStackingRules,applyStackingRules_fn).call(this),this.render())});const addDiceButton=htmlQuery(html,"button.add-dice");addDiceButton?.addEventListener("click",()=>{const parent=addDiceButton.parentElement,count=Number(parent.querySelector(".add-dice-count")?.value||1),faces=parent.querySelector(".add-dice-faces")?.value??"d4",category=parent.querySelector(".add-dice-category")?.value||null,type=parent.querySelector(".add-dice-type")?.value||null;if(Number.isNaN(count)){ui.notifications.error("Damage dice count must be a number.");return}else if(count<1){ui.notifications.error("Damage dice count must be greater than zero.");return}if(!tupleHasValue(["persistent","precision","splash",null],category)){ui.notifications.error(`Unkown damage category: ${category}.`);return}const faceLabel=game.i18n.localize(`PF2E.DamageDie${faces.toUpperCase()}`),label=game.i18n.format("PF2E.Roll.Dialog.Damage.ExtraDice",{dice:`+${count}${faceLabel}`}),slug=sluggify(`${label}-${type}`);this.formulaData.dice.push(new DamageDicePF2e({label,category,diceNumber:count,dieSize:faces,damageType:type,slug,selector:"damage"})),this.render()});const rollModeInput=htmlQuery(html,"select[name=rollmode]");rollModeInput?.addEventListener("change",()=>{const rollMode=rollModeInput.value;if(!tupleHasValue(Object.values(CONST.DICE_ROLL_MODES),rollMode))throw ErrorPF2e("Unexpected roll mode");this.context.rollMode=rollMode});const toggle=htmlQuery(html,"input[data-action=change-show-default]");toggle?.addEventListener("click",async()=>{await game.user.setFlag("pf2e","settings.showDamageDialogs",toggle.checked)})}async resolve(){return this.render(!0),new Promise(resolve=>{__privateSet(this,_resolve,resolve)})}async close(options){var _a;(_a=__privateGet(this,_resolve))==null||_a.call(this,this.isRolled),super.close(options)}_injectHTML($html){super._injectHTML($html),$html[0]?.querySelector("button.roll")?.focus()}};_resolve=new WeakMap,_originallyEnabled=new WeakMap,_getModifierIcon=new WeakSet,getModifierIcon_fn=__name2(function(object){const damageTypeIconClass=object.damageType?DAMAGE_TYPE_ICONS[object.damageType]:null,damageTypeIcon=damageTypeIconClass?fontAwesomeIcon(damageTypeIconClass):null;return(()=>{switch(object.category){case"splash":return compact([fontAwesomeIcon("fa-burst"),damageTypeIcon]);case"persistent":return object.damageType!=="bleed"?[damageTypeIcon,fontAwesomeIcon("fa-hourglass",{style:"duotone"})]:[damageTypeIcon];case"precision":return[damageTypeIcon,fontAwesomeIcon("fa-crosshairs")];default:return[damageTypeIcon]}})().map(i=>i?.outerHTML??"").join("")},"#getModifierIcon"),_getTypeLabel=new WeakSet,getTypeLabel_fn=__name2(function(damageType,category){if(category==="precision")return game.i18n.localize("PF2E.Damage.Precision");if(!damageType)return null;const typeLabel=game.i18n.localize(CONFIG.PF2E.damageTypes[damageType]);switch(category){case"persistent":return game.i18n.format("PF2E.Damage.PersistentTooltip",{damageType:typeLabel});case"splash":return game.i18n.format("PF2E.Roll.Dialog.Damage.Splash",{damageType:typeLabel});default:return typeLabel}},"#getTypeLabel"),_applyStackingRules=new WeakSet,applyStackingRules_fn=__name2(function(){applyStackingRules(this.formulaData.modifiers.filter(m=>m.category!=="persistent")),applyStackingRules(this.formulaData.modifiers.filter(m=>m.category==="persistent"))},"#applyStackingRules"),__name2(_DamageModifierDialog,"DamageModifierDialog");let DamageModifierDialog=_DamageModifierDialog;const superEnrichHTML=TextEditor.enrichHTML,superEnrichContentLinks=TextEditor._enrichContentLinks,superCreateInlineRoll=TextEditor._createInlineRoll,superOnClickInlineRoll=TextEditor._onClickInlineRoll,_TextEditorPF2e=class _TextEditorPF2e2 extends TextEditor{static{__name(this,"_TextEditorPF2e")}static enrichHTML(content,options={}){content?.startsWith("

@Localize")&&(content=content.substring(3,content.length-4));const enriched=superEnrichHTML.apply(this,[content,options]);return typeof enriched=="string"&&(options.processVisibility??!0)?_TextEditorPF2e2.processUserVisibility(enriched,options):Promise.resolve().then(async()=>_TextEditorPF2e2.processUserVisibility(await enriched,options))}static _enrichContentLinks(text,options){if(options?.async){const documentTypes=[...CONST.DOCUMENT_LINK_TYPES,"Compendium","UUID"],pattern=new RegExp(`@(${documentTypes.join("|")})\\[([^#\\]]+)(?:#([^\\]]+))?](?:{([^}]+)})?`,"g"),uuids=text.map(t=>Array.from((t.textContent??"").matchAll(pattern))).flat(2).filter(m=>UUIDUtils.isCompendiumUUID(m));return UUIDUtils.fromUUIDs(uuids).then(()=>superEnrichContentLinks.apply(this,[text,options]))}return superEnrichContentLinks.apply(this,[text,options])}static async _createInlineRoll(match,rollData,options={}){const anchor=await superCreateInlineRoll.apply(this,[match,rollData,options]),formula=anchor?.dataset.formula;if(formula){const roll=(()=>{try{return new DamageRoll(formula)}catch{return null}})();if(!roll||!looksLikeDamageRoll(roll))return anchor;const icon=damageDiceIcon(roll),label=match[4]&&match[4].length>0?match[4]:roll.formula;anchor.innerHTML=`${icon.outerHTML}${label}`,anchor.dataset.tooltip=roll.formula,anchor.dataset.damageRoll="",roll.instances.length>0&&roll.instances.every(i=>i.persistent)&&(anchor.draggable=!0,anchor.dataset.persistent="")}return anchor}static async _onClickInlineRoll(event){const anchor=event.currentTarget??null;if(!(anchor instanceof HTMLAnchorElement&&anchor.dataset.formula&&"damageRoll"in anchor.dataset))return superOnClickInlineRoll.apply(this,[event]);const sheetElem=htmlClosest(anchor,".sheet"),messageElem=htmlClosest(anchor,"li.chat-message"),app=ui.windows[Number(sheetElem?.dataset.appid)],message=game.messages.get(messageElem?.dataset.messageId??""),[actor,rollData]=(()=>{if(message?.actor)return[message.actor,message.getRollData()];if(app instanceof ActorSheetPF2e){const itemId=anchor.dataset.pf2ItemId;return[app.actor,app.actor.items.get(itemId)?.getRollData()??app.actor.getRollData()]}if(app instanceof ItemSheetPF2e)return[app.actor,app.item.getRollData()];const itemUuid=anchor.dataset.itemUuid,itemByUUID=itemUuid&&!itemUuid.startsWith("Compendium.")?fromUuidSync(itemUuid):null;return itemByUUID instanceof ItemPF2e?[itemByUUID.actor,itemByUUID.getRollData()]:[null,{}]})(),options=anchor.dataset.flavor?{flavor:anchor.dataset.flavor}:{},speaker=ChatMessagePF2e.getSpeaker({actor}),rollMode=objectHasKey(CONFIG.Dice.rollModes,anchor.dataset.mode)?anchor.dataset.mode:"roll",baseFormula=anchor.dataset.pf2BaseFormula;if(baseFormula){const item=rollData.item instanceof ItemPF2e?rollData.item:null,traits=anchor.dataset.pf2Traits?.split(",")??[],domains=anchor.dataset.pf2Domains?.split(","),extraRollOptions=anchor.dataset.pf2RollOptions?.split(",")??[],result=await augmentInlineDamageRoll(baseFormula,{...eventToRollParams(event,{type:"damage"}),actor,item,domains,traits,extraRollOptions});result&&await DamagePF2e.roll(result.template,result.context);return}const roll=new DamageRoll(anchor.dataset.formula,rollData,options);return roll.toMessage({speaker,flavor:roll.options.flavor},{rollMode})}static processUserVisibility(content,options){const html=createHTMLElement("div",{innerHTML:content}),document2=options.rollData?.actor??null;return UserVisibilityPF2e.process(html,{document:document2}),html.innerHTML}static async enrichString(data,options={}){if(data.length<4)return null;const item=options.rollData?.item??null,[_match,inlineType,paramString,inlineLabel]=data;switch(inlineType){case"Check":{const actor=options.rollData?.actor??item?.actor??null;return __privateMethod(this,_createCheck,createCheck_fn).call(this,{paramString,inlineLabel,item,actor})}case"Damage":return __privateMethod(this,_createDamageRoll,createDamageRoll_fn).call(this,{paramString,rollData:options.rollData,inlineLabel});case"Localize":return __privateMethod(this,_localize,localize_fn).call(this,paramString,options);case"Template":return __privateMethod(this,_createTemplate,createTemplate_fn).call(this,paramString,inlineLabel,item?.system);default:return null}}static convertXMLNode(html,name2,{visible,visibility,whose,tooltip,classes}){const node=html.querySelector(name2);if(!node)return null;const span=document.createElement("span"),{dataset,classList}=span;if(typeof visible=="boolean"&&(visibility=visible?"all":"gm"),visibility&&(dataset.visibility=visibility),whose&&(dataset.whose=whose),tooltip&&(dataset.tooltip=tooltip.trim()),classes)for(const cssClass of classes)classList.add(cssClass);return span.append(...Array.from(node.childNodes)),node.replaceWith(span),span}};_localize=new WeakSet,localize_fn=__name2(async function(paramString,options){const content=game.i18n.localize(paramString);if(content===paramString)return ui.notifications.error(`Failed to localize ${paramString}!`),null;const result=document.createElement("span");return result.innerHTML=await TextEditor.enrichHTML(content,{...options,async:!0}),result},"#localize"),_createTemplate=new WeakSet,createTemplate_fn=__name2(function(paramString,label,itemData){const params=__privateMethod(this,_parseInlineParams,parseInlineParams_fn).call(this,paramString,{first:"type"});if(!params)return null;if(!params.type)ui.notifications.error(game.i18n.localize("PF2E.InlineTemplateErrors.TypeMissing"));else if(params.distance)if(objectHasKey(CONFIG.PF2E.areaTypes,params.type)){if(isNaN(+params.distance))return ui.notifications.error(game.i18n.format("PF2E.InlineTemplateErrors.DistanceNoNumber",{distance:params.distance})),null;if(params.width&&isNaN(+params.width))return ui.notifications.error(game.i18n.format("PF2E.InlineTemplateErrors.WidthNoNumber",{width:params.width})),null;{params.traits||=itemData?.traits?.value?.toString()??"",label||(label=game.i18n.format("PF2E.TemplateLabel",{size:params.distance,unit:game.i18n.localize("PF2E.Foot"),shape:game.i18n.localize(CONFIG.PF2E.areaTypes[params.type])}));const html=document.createElement("span");return html.innerHTML=label,html.setAttribute("data-pf2-effect-area",params.type),html.setAttribute("data-pf2-distance",params.distance),params.traits!==""&&html.setAttribute("data-pf2-traits",params.traits),params.type==="line"&&html.setAttribute("data-pf2-width",params.width??"5"),html}}else return ui.notifications.error(game.i18n.format("PF2E.InlineTemplateErrors.TypeUnsupported",{type:params.type})),null;else return ui.notifications.error(game.i18n.localize("PF2E.InlineTemplateErrors.DistanceMissing")),null;return null},"#createTemplate"),_parseInlineParams=new WeakSet,parseInlineParams_fn=__name2(function(paramString,options={}){return paramString.split("|").reduce((result2,part,idx)=>{if(idx===0&&options.first&&!part.includes(":"))return result2[options.first]=part.trim(),result2;const colonIdx=part.indexOf(":"),portions=colonIdx>=0?[part.slice(0,colonIdx),part.slice(colonIdx+1)]:[part,""];return result2[portions[0]]=portions[1],result2},{})},"#parseInlineParams"),_createCheck=new WeakSet,createCheck_fn=__name2(function({paramString,inlineLabel,item=null,actor=item?.actor??null}){const rawParams=__privateMethod(this,_parseInlineParams,parseInlineParams_fn).call(this,paramString,{first:"type"});if(!rawParams)return null;if(!rawParams.type)return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.TypeMissing")),null;const showDC=setHasElement(USER_VISIBILITIES,rawParams.showDC)?rawParams.showDC:actor?.hasPlayerOwner||actor?.isOfType("party")||game.settings.get("pf2e","metagame_showDC")?"all":"gm",params={...rawParams,type:rawParams.type,basic:rawParams.basic!==void 0&&["true",""].includes(rawParams.basic),showDC,traits:(()=>{const traits=[],itemTraits=item?.system.traits?.value??[];return rawParams.overrideTraits!=="true"&&traits.push(...itemTraits),rawParams.traits&&traits.push(...rawParams.traits.split(",").map(trait=>trait.trim())),Array.from(new Set(traits))})(),extraRollOptions:compact([...__privateMethod(this,_createActionOptions,createActionOptions_fn).call(this,item),...rawParams.basic==="true"?["damaging-effect"]:[],...rawParams.options?.split(",").map(t=>t.trim())??[]]).sort()};rawParams.dc&&(params.dc=rawParams.dc),rawParams.defense&&(params.defense=rawParams.defense);const types=params.type.split(",");let adjustments=params.adjustment?.split(",")??["0"];if(types.length!==adjustments.length&&adjustments.length>1)return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.AdjustmentLengthMismatch")),null;if(types.length>adjustments.length&&(adjustments=new Array(types.length).fill(adjustments[0])),adjustments.some(adj=>adj!==""&&isNaN(parseInt(adj))))return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.NonIntegerAdjustment")),null;const buttons=types.map((type,i)=>__privateMethod(this,_createSingleCheck,createSingleCheck_fn).call(this,{actor,item,inlineLabel,params:{...params,type,adjustment:adjustments[i]}}));if(buttons.length===1)return buttons[0];{const checkGroup=document.createElement("div");checkGroup.setAttribute("data-pf2-checkgroup","");for(const button of buttons){if(button===null)return null;checkGroup.hasChildNodes()&&checkGroup.appendChild(document.createElement("br")),checkGroup.appendChild(button)}return checkGroup}},"#createCheck"),_createSingleCheck=new WeakSet,createSingleCheck_fn=__name2(function({params,item,actor,inlineLabel}){const icon=(()=>{switch(params.type){case"fortitude":return fontAwesomeIcon("heart-pulse");case"reflex":return fontAwesomeIcon("person-running");case"will":return fontAwesomeIcon("brain");case"perception":return fontAwesomeIcon("eye");default:return fontAwesomeIcon("dice-d20")}})();icon.classList.add("icon");const name2=params.name??item?.name??params.type,localize=localizer("PF2E.InlineCheck"),label=(()=>{if(inlineLabel)return inlineLabel;if(tupleHasValue(SAVE_TYPES,params.type)){const saveName=game.i18n.localize(CONFIG.PF2E.saves[params.type]);return params.basic?localize("BasicWithSave",{save:saveName}):saveName}switch(params.type){case"flat":return game.i18n.localize("PF2E.FlatCheck");case"perception":return game.i18n.localize("PF2E.PerceptionLabel");default:{const shortForm=(()=>{if(objectHasKey(SKILL_EXPANDED,params.type))return SKILL_EXPANDED[params.type].shortForm;if(objectHasKey(SKILL_DICTIONARY,params.type))return params.type})();return shortForm?game.i18n.localize(CONFIG.PF2E.skills[shortForm]):params.type.split("-").map(word=>word.slice(0,1).toUpperCase()+word.slice(1)).join(" ")}}})(),createLabel=__name2(content=>createHTMLElement("span",{classes:["label"],innerHTML:content}),"createLabel"),anchor=createHTMLElement("a",{classes:["inline-check"],children:[icon,createLabel(label)],dataset:{pf2Traits:params.traits.toString()||null,pf2RollOptions:params.extraRollOptions.toString()||null,pf2RepostFlavor:name2,pf2ShowDc:params.showDC==="all"?null:params.showDC,pf2Label:localize("DCWithName",{name:name2}),pf2Adjustment:Number(params.adjustment)||null,pf2Roller:params.roller||null,pf2Check:sluggify(params.type)}});if(params.defense&¶ms.dc&&(anchor.dataset.tooltip=localize("Invalid",{message:localize("Errors.DCAndDefense")}),anchor.dataset.invalid="true"),!["flat","fortitude","reflex","will"].includes(params.type)&¶ms.defense&&(anchor.dataset.pf2Defense=params.defense),params.type&¶ms.dc){const checkDC=params.dc==="@self.level"?params.dc:getCheckDC({name:name2,params,item,actor});if(anchor.dataset.pf2Dc=checkDC,checkDC!=="@self.level"){const dc=params.dc===""?NaN:Number(checkDC),displayedDC=isNaN(dc)?checkDC:`${dc+Number(params.adjustment)}`,text=anchor.innerText;anchor.querySelector("span.label")?.replaceWith(createLabel(game.i18n.format("PF2E.DCWithValueAndVisibility",{role:params.showDC,dc:displayedDC,text})))}}return params.roller==="self"&&actor&&!actor.canUserModify(game.user,"update")?createHTMLElement("span",{children:[anchor.innerText]}):anchor},"#createSingleCheck"),_createDamageRoll=new WeakSet,createDamageRoll_fn=__name2(async function(args){const params=__privateMethod(this,_parseInlineParams,parseInlineParams_fn).call(this,args.paramString,{first:"formula"});if(!params||!params.formula)return ui.notifications.warn(game.i18n.localize("PF2E.InlineCheck.Errors.TypeMissing")),null;const item=args.rollData?.item instanceof ItemPF2e?args.rollData?.item:null,actor=(args.rollData?.actor instanceof ActorPF2e?args.rollData?.actor:null)??item?.actor??null,domains=params.domains?.split(",");if(domains?.some(d=>!/^[a-z][-a-z0-9]+-damage$/.test(d)))return ui.notifications.warn(game.i18n.format("PF2E.InlineCheck.Errors.InvalidDomains",{type:"@Damage"})),null;const traits=(()=>{const fromParams=params.traits?.split(",").flatMap(t=>t.trim()||[])??[],fromItem=item?.system.traits?.value??[];return params.overrideTraits==="true"?fromParams:uniq([...fromParams,...fromItem])})().sort(),extraRollOptions=compact([...params.options?.split(",").map(t=>t.trim())??[],...__privateMethod(this,_createActionOptions,createActionOptions_fn).call(this,item)]).sort(),result=await augmentInlineDamageRoll(params.formula,{skipDialog:!0,actor,item,domains,traits,extraRollOptions}),baseFormula=(()=>{const baseRollData={...item?.getRollData()??{},actor:{level:(item&&"level"in item?item.level:null)??1}};return new DamageRoll(params.formula,baseRollData).formula})(),roll=result?.template.damage.roll??new DamageRoll(params.formula,args.rollData),formula=roll.formula;return createHTMLElement("a",{classes:compact(["inline-roll","roll",baseFormula!==formula?"altered":null]),children:[damageDiceIcon(roll),args.inlineLabel??formula],dataset:{formula:roll._formula,tooltip:args.inlineLabel?formula:baseFormula!==formula?game.i18n.format("PF2E.InlineDamage.Base",{formula:baseFormula}):null,damageRoll:params.formula,pf2Domains:domains?.join(",")||null,pf2BaseFormula:result?params.formula:null,pf2Traits:traits.toString()||null,pf2RollOptions:extraRollOptions.toString()||null,pf2ItemId:item?.id}})},"#createDamageRoll"),_createActionOptions=new WeakSet,createActionOptions_fn=__name2(function(item){return!item?.isOfType("action","feat")||!item.actionCost?[]:compact([`action:${item.slug??sluggify(item.name)}`,item.actionCost.value?`action:cost:${item.actionCost.value}`:null])},"#createActionOptions"),__privateAdd(_TextEditorPF2e,_localize),__privateAdd(_TextEditorPF2e,_createTemplate),__privateAdd(_TextEditorPF2e,_parseInlineParams),__privateAdd(_TextEditorPF2e,_createCheck),__privateAdd(_TextEditorPF2e,_createSingleCheck),__privateAdd(_TextEditorPF2e,_createDamageRoll),__privateAdd(_TextEditorPF2e,_createActionOptions),__name2(_TextEditorPF2e,"TextEditorPF2e");let TextEditorPF2e=_TextEditorPF2e;function getCheckDC({name:name2,params,item=null,actor=item?.actor??null}){const{type}=params,dc=params.dc,base=(()=>{if(dc?.startsWith("resolve")&&actor){params.immutable||="true";const resolve=dc.match(/resolve\((.+?)\)$/),value=resolve&&resolve?.length>0?resolve[1]:"";return Number(__name2(resolveString=>{try{const rollData=item?.getRollData()??actor?.getRollData();return Roll.safeEval(Roll.replaceFormulaData(resolveString,rollData))}catch{return 0}},"saferEval")(value))}return Number(dc)||void 0})();if(base){const getStatisticValue=__name2(selectors=>{if(item?.actor&¶ms.immutable!=="true"){const{actor:actor2}=item,{synthetics}=actor2,modifier=new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:base-10,adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,selectors,"base")}),stat=new Statistic(actor2,{slug:type,label:name2,domains:selectors,modifiers:[modifier]});return String(stat.dc.value)}return base.toString()},"getStatisticValue"),slugName=sluggify(name2);if(type==="flat")return params.immutable==="false"?getStatisticValue(["inline-dc",`${slugName}-inline-dc`]):base.toString();{const selectors=["all","inline-dc",`${slugName}-inline-dc`];return getStatisticValue(selectors)}}return"0"}__name(getCheckDC,"getCheckDC"),__name2(getCheckDC,"getCheckDC");async function augmentInlineDamageRoll(baseFormula,args){const{name:name2,actor,item,traits,extraRollOptions}=args;try{const rollData=item?.getRollData()??actor?.getRollData()??{};rollData.actor??={level:(item&&"level"in item?item.level:null)??1};const base=extractBaseDamage(new DamageRoll(baseFormula,rollData)),domains=compact(["damage","inline-damage",item?`${item.id}-inline-damage`:null,item?`${sluggify(item.slug??item.name)}-inline-damage`:null,args.domains]).flat(),options=new Set([...actor?.getRollOptions(domains)??[],...item?.getRollOptions("item")??[],...traits??[],...extraRollOptions??[]]),firstBase=base.at(0);if(firstBase&&actor?.isOfType("npc")&&(actor.isElite||actor.isWeak)){const value=options.has("item:frequency:limited")?4:2;firstBase.terms?.push({dice:null,modifier:actor.isElite?value:-value})}const{modifiers,dice}=(()=>{if(!(actor instanceof ActorPF2e))return{modifiers:[],dice:[]};const extractOptions={resolvables:rollData??{},test:options};return processDamageCategoryStacking(base,{modifiers:extractModifiers(actor.synthetics,domains,extractOptions),dice:extractDamageDice(actor.synthetics.damageDice,domains,extractOptions),test:options})})(),formulaData={base,modifiers,dice,ignoredResistances:[]},isAttack=!!traits?.includes("attack"),context={type:"damage-roll",sourceType:isAttack?"attack":"save",outcome:isAttack?"success":null,domains,options,self:(()=>actor?{actor,token:actor.token,item:item||null,statistic:null,modifiers}:null)()};if(!args.skipDialog&&!await new DamageModifierDialog({formulaData,context}).resolve())return null;const{formula,breakdown}=createDamageFormula(formulaData),roll=new DamageRoll(formula);return{template:{name:name2??item?.name??actor?.name??"",damage:{roll,breakdown},modifiers:[...modifiers,...dice],traits:traits?.filter(t=>t in CONFIG.PF2E.actionTraits)??[],materials:[]},context}}catch(ex){return console.error(`Failed to parse inline @Damage ${baseFormula}:`,ex),null}}__name(augmentInlineDamageRoll,"augmentInlineDamageRoll"),__name2(augmentInlineDamageRoll,"augmentInlineDamageRoll");const _CheckModifiersDialog=class extends Application{static{__name(this,"_CheckModifiersDialog")}constructor(check,resolve,context={options:new Set}){const title=(()=>{const maybeWithHTML=context.title?.trim()||check.slug;if(!maybeWithHTML.includes("<"))return maybeWithHTML.trim();const div=document.createElement("div");return div.innerHTML=maybeWithHTML,div.querySelector(".action-glyph, .pf2-icon")?.remove(),div.innerText.trim()})();super({title}),__privateAdd(this,_resolveSubstitutions),__publicField(this,"check"),__publicField(this,"context"),__publicField(this,"resolve"),__publicField(this,"isResolved",!1),__privateAdd(this,_originallyEnabled2,void 0),this.check=check,this.resolve=resolve,this.context=context,__privateSet(this,_originallyEnabled2,new Set(check.modifiers.filter(m=>m.enabled)))}static get defaultOptions(){return{...super.defaultOptions,template:"systems/pf2e/templates/chat/check-modifiers-dialog.hbs",classes:["roll-modifiers-dialog","dice-checks","dialog"],popOut:!0,width:380,height:"auto"}}async getData(){const fortune=this.context.rollTwice==="keep-higher",misfortune=this.context.rollTwice==="keep-lower",none=fortune===misfortune,rollMode=this.context.rollMode==="roll"?game.settings.get("core","rollMode"):this.context.rollMode;return{appId:this.id,modifiers:this.check.modifiers.map(m=>({...m,hideIfDisabled:!__privateGet(this,_originallyEnabled2).has(m)&&m.hideIfDisabled})),totalModifier:this.check.totalModifier,rollModes:CONFIG.Dice.rollModes,rollMode,showCheckDialogs:game.user.settings.showCheckDialogs,substitutions:__privateMethod(this,_resolveSubstitutions,resolveSubstitutions_fn).call(this),fortune,none,misfortune}}activateListeners($html){const html=$html[0];htmlQuery(html,"button.roll")?.addEventListener("click",()=>{this.resolve(!0),this.isResolved=!0,this.close()});for(const checkbox of htmlQueryAll(html,".substitutions input[type=checkbox]"))checkbox.addEventListener("click",()=>{const substitutions=this.context.substitutions??[],index=Number(checkbox.dataset.subIndex),toggledSub=substitutions.at(index);if(!toggledSub)return;toggledSub.selected=toggledSub.required||checkbox.checked;const options=this.context.options??=new Set;for(const substitution of substitutions){const option=`substitute:${substitution.slug}`;substitution.selected?options.add(option):options.delete(option)}this.context.substitutions=__privateMethod(this,_resolveSubstitutions,resolveSubstitutions_fn).call(this).map(s=>omit(s,["toggleable"])),this.check.calculateTotal(this.context.options),this.render()});for(const checkbox of htmlQueryAll(html,".modifier-container input[type=checkbox]"))checkbox.addEventListener("click",()=>{const index=Number(checkbox.dataset.modifierIndex);this.check.modifiers[index].ignored=!checkbox.checked,this.check.calculateTotal(),this.render()});const addModifierButton=htmlQuery(html,"button.add-modifier");addModifierButton?.addEventListener("click",()=>{const parent=addModifierButton.parentElement,value=Number(parent.querySelector(".add-modifier-value")?.value||1),type=String(parent.querySelector(".add-modifier-type")?.value);let name2=String(parent.querySelector(".add-modifier-name")?.value);const errors=[];if(Number.isNaN(value)?errors.push("Modifier value must be a number."):value===0&&errors.push("Modifier value must not be zero."),!setHasElement(MODIFIER_TYPES,type))throw ErrorPF2e("Unexpected invalid modifier type");(!name2||!name2.trim())&&(name2=game.i18n.localize(value<0?`PF2E.PenaltyLabel.${type}`:`PF2E.BonusLabel.${type}`)),errors.length>0?ui.notifications.error(errors.join(" ")):(this.check.push(new ModifierPF2e(name2,value,type)),this.render())});for(const rollTwice of htmlQueryAll(html,".fate input[type=radio]"))rollTwice.addEventListener("click",()=>{this.context.rollTwice=rollTwice.value||!1});const rollModeInput=htmlQuery(html,"select[name=rollmode]");rollModeInput?.addEventListener("change",()=>{const rollMode=rollModeInput.value;if(!tupleHasValue(Object.values(CONST.DICE_ROLL_MODES),rollMode))throw ErrorPF2e("Unexpected roll mode");this.context.rollMode=rollMode});const toggle=htmlQuery(html,"input[data-action=change-show-default]");toggle?.addEventListener("click",async()=>{await game.user.setFlag("pf2e","settings.showCheckDialogs",toggle.checked)})}async close(options){this.isResolved||this.resolve(!1),super.close(options)}_injectHTML($html){super._injectHTML($html),$html[0]?.querySelector("button.roll")?.focus()}};_originallyEnabled2=new WeakMap,_resolveSubstitutions=new WeakSet,resolveSubstitutions_fn=__name2(function(){this.context.substitutions??=[];const hasRequired={fortune:this.context.substitutions.some(s=>s.required&&s.effectType==="fortune"),misfortune:this.context.substitutions.some(s=>s.required&&s.effectType==="misfortune")};return this.context.substitutions.map(substitution=>{const toggleable=!hasRequired[substitution.effectType],selected=substitution.required?!0:substitution.selected&&toggleable;return{...substitution,selected,toggleable}})},"#resolveSubstitutions"),__name2(_CheckModifiersDialog,"CheckModifiersDialog");let CheckModifiersDialog=_CheckModifiersDialog;const _CheckRoll=class _CheckRoll2 extends Roll{static{__name(this,"_CheckRoll")}get roller(){return game.users.get(this.options.rollerId??"")??null}get type(){return this.options.type??"check"}get degreeOfSuccess(){return this.options.degreeOfSuccess??null}get isReroll(){return this.options.isReroll??!1}get isRerollable(){return!this.isReroll&&!this.dice.some(d=>d.modifiers.includes("kh")||d.modifiers.includes("kl"))}async render(options={}){this._evaluated||await this.evaluate({async:!0});const{isPrivate,flavor,template}=options,{type,identifier,action:action2,damaging}=this.options,canRollDamage=!!(damaging&&identifier&&(this.roller===game.user||game.user.isGM)),limitCueVisibility=!game.settings.get("pf2e","metagame_showResults"),chatData={formula:isPrivate?"???":this._formula,flavor:isPrivate?null:flavor,user:game.user.id,tooltip:isPrivate?"":await this.getTooltip(),total:isPrivate?"?":Math.round(this.total*100)/100,type,identifier,action:action2,degree:this.degreeOfSuccess,canRollDamage,limitCueVisibility};return renderTemplate(template??_CheckRoll2.CHAT_TEMPLATE,chatData)}};__name2(_CheckRoll,"CheckRoll"),__publicField(_CheckRoll,"CHAT_TEMPLATE","systems/pf2e/templates/chat/check/roll.hbs");let CheckRoll=_CheckRoll;const _StrikeAttackRoll=class extends CheckRoll{static{__name(this,"_StrikeAttackRoll")}};__name2(_StrikeAttackRoll,"StrikeAttackRoll");let StrikeAttackRoll=_StrikeAttackRoll;const _CheckPF2e=class _CheckPF2e2{static{__name(this,"_CheckPF2e")}static async roll(check,context={},event=null,callback){event&&mergeObject(context,eventToRollParams(event,{type:"check"})),context.skipDialog??=!game.user.settings.showCheckDialogs,context.createMessage??=!0,Array.isArray(context.options)&&(context.options=new Set(context.options));const rollOptions=context.options??new Set;typeof context.mapIncreases=="number"&&rollOptions.add(`map:increases:${context.mapIncreases}`),rollOptions.has("secret")&&(context.rollMode??=game.user.isGM?"gmroll":"blindroll"),context.rollMode??="roll",rollOptions.size>0&&!context.isReroll&&check.calculateTotal(rollOptions);const substitutions=context.substitutions??=[],requiredSubstitution=context.substitutions.find(s=>s.required&&s.selected);if(requiredSubstitution)for(const substitution of context.substitutions)substitution.required=substitution===requiredSubstitution,substitution.selected=substitution===requiredSubstitution;if(!context.skipDialog&&context.type!=="flat-check"&&!await new Promise(resolve=>{new CheckModifiersDialog(check,resolve,context).render(!0)}))return null;const extraTags=[],isReroll=context.isReroll??!1;isReroll&&(context.rollTwice=!1);const[dice,tagsFromDice]=(()=>{const substitution=substitutions.find(s=>s.selected),rollTwice=context.rollTwice??!1,fortuneMisfortune=new Set(compact([substitution?.effectType,rollTwice==="keep-higher"?"fortune":rollTwice==="keep-lower"?"misfortune":null]));for(const trait of fortuneMisfortune)rollOptions.add(trait);if(rollOptions.has("fortune")&&rollOptions.has("misfortune")){for(const sub of substitutions)rollOptions.delete(`substitute:${sub.slug}`),check.calculateTotal(rollOptions);return["1d20",["PF2E.TraitFortune","PF2E.TraitMisfortune"]]}else if(substitution){const effectType={fortune:"PF2E.TraitFortune",misfortune:"PF2E.TraitMisfortune"}[substitution.effectType],extraTag=game.i18n.format("PF2E.SpecificRule.SubstituteRoll.EffectType",{type:game.i18n.localize(effectType),substitution:reduceItemName(game.i18n.localize(substitution.label))});return[substitution.value.toString(),[extraTag]]}else return context.rollTwice==="keep-lower"?["2d20kl",["PF2E.TraitMisfortune"]]:context.rollTwice==="keep-higher"?["2d20kh",["PF2E.TraitFortune"]]:["1d20",[]]})();extraTags.push(...tagsFromDice);const options={type:context.type,identifier:context.identifier,action:context.action&&sluggify(context.action)||null,rollerId:game.userId,isReroll,totalModifier:check.totalModifier,damaging:!!context.damaging,domains:context.domains},totalModifierPart=signedInteger(check.totalModifier,{emptyStringZero:!0}),roll=await new CheckRoll(`${dice}${totalModifierPart}`,{},options).evaluate({async:!0}),dosAdjustments=(()=>{if(isNil(context.dc))return{};const naturalTotal=compact(roll.dice.map(d=>d.results.find(r=>r.active&&!r.discarded)?.result??null)).shift(),temporaryRollOptions=new Set([...rollOptions,`check:total:${roll.total}`,`check:total:natural:${naturalTotal}`]);return context.dosAdjustments?.filter(a=>a.predicate?.test(temporaryRollOptions)??!0).reduce((record,data)=>{for(const outcome of["all",...DEGREE_OF_SUCCESS_STRINGS])data.adjustments[outcome]&&(record[outcome]=deepClone(data.adjustments[outcome]));return record},{})??{}})(),degree=context.dc?new DegreeOfSuccess(roll,context.dc,dosAdjustments):null;degree&&(context.outcome=DEGREE_OF_SUCCESS_STRINGS[degree.value],context.unadjustedOutcome=DEGREE_OF_SUCCESS_STRINGS[degree.unadjusted],roll.options.degreeOfSuccess=degree.value);const notes=context.notes?.map(n=>n instanceof RollNotePF2e?n:new RollNotePF2e(n)).filter(note=>{if(!note.predicate.test([...rollOptions,...note.rule?.item.getRollOptions("parent")??[]]))return!1;if(!context.dc||note.outcome.length===0)return!0;const outcome=context.outcome??context.unadjustedOutcome;return!!(outcome&¬e.outcome.includes(outcome))})??[],notesList=RollNotePF2e.notesToHTML(notes),item=context.item??null,flavor=await(async()=>{const result=await __privateMethod(this,_createResultFlavor,createResultFlavor_fn).call(this,{degree,target:context.target??null}),tags=__privateMethod(this,_createTagFlavor,createTagFlavor_fn).call(this,{check,context,extraTags}),title=(context.title??check.slug).trim();return[title.startsWith("{const strong=document.createElement("strong");return strong.innerHTML=title,createHTMLElement("h4",{classes:["action"],children:[strong]})})(),result??[],tags,notesList].flat().map(e=>typeof e=="string"?e:e.outerHTML).join("")})(),contextFlag={...context,type:context.type??"check",identifier:context.identifier??null,item:void 0,dosAdjustments,actor:context.actor?.id??null,token:context.token?.id??null,domains:context.domains??[],target:context.target?{actor:context.target.actor.uuid,token:context.target.token.uuid}:null,options:Array.from(rollOptions).sort(),notes:notes.map(n=>n.toObject()),rollMode:context.rollMode,rollTwice:context.rollTwice??!1,title:context.title??"PF2E.Check.Label",traits:context.traits??[],substitutions,dc:context.dc?omit(context.dc,["statistic"]):null,skipDialog:context.skipDialog,isReroll:context.isReroll??!1,outcome:context.outcome??null,unadjustedOutcome:context.unadjustedOutcome??null};delete contextFlag.item;const message=await(()=>{const flags={core:context.type==="initiative"?{initiativeRoll:!0}:{},pf2e:{context:contextFlag,modifierName:check.slug,modifiers:check.modifiers.map(m=>m.toObject()),origin:item?.getOriginData()}},speaker=ChatMessagePF2e.getSpeaker({actor:context.actor,token:context.token}),{rollMode}=contextFlag,create=context.createMessage;return roll.toMessage({speaker,flavor,flags},{rollMode,create})})();if(callback){const msg=message instanceof ChatMessagePF2e?message:new ChatMessagePF2e(message),evt=event&&event instanceof Event?event:event?.originalEvent??null;await callback(roll,context.outcome,msg,evt)}return item?.isOfType("weapon")&&item.traits.has("consumable")&&item.actor.items.has(item.id)&&item.quantity>0&&await item.update({system:{quantity:item.quantity-1}}),roll}static async rerollFromMessage(message,{heroPoint=!1,keep="new"}={}){if(!(message.isAuthor||game.user.isGM)){ui.notifications.error(game.i18n.localize("PF2E.RerollMenu.ErrorCantDelete"));return}const actor=game.actors.get(message.speaker.actor??"");let rerollFlavor=game.i18n.localize(`PF2E.RerollMenu.MessageKeep.${keep}`);if(heroPoint)if(actor?.isOfType("character")){const heroPointCount=actor.heroPoints.value;if(heroPointCount)await actor.update({"system.resources.heroPoints.value":Math.clamped(heroPointCount-1,0,actor.heroPoints.max)}),rerollFlavor=game.i18n.format("PF2E.RerollMenu.MessageHeroPoint",{name:actor.name});else{ui.notifications.warn(game.i18n.format("PF2E.RerollMenu.WarnNoHeroPoint",{name:actor.name}));return}}else{ui.notifications.error("PF2E.RerollMenu.ErrorNoActor",{localize:!0});return}const systemFlags=deepClone(message.flags.pf2e),context=systemFlags.context;if(!isCheckContextFlag(context))return;context.skipDialog=!0,context.isReroll=!0;const oldRoll=message.rolls.at(0);if(!(oldRoll instanceof CheckRoll))throw ErrorPF2e("Unexpected error retrieving prior roll");const unevaluatedNewRoll=oldRoll.clone();unevaluatedNewRoll.options.isReroll=!0,Hooks.callAll("pf2e.preReroll",Roll.fromJSON(JSON.stringify(oldRoll.toJSON())),unevaluatedNewRoll,heroPoint,keep);const newRoll=await unevaluatedNewRoll.evaluate({async:!0});Hooks.callAll("pf2e.reroll",Roll.fromJSON(JSON.stringify(oldRoll.toJSON())),newRoll,heroPoint,keep);let keptRoll=newRoll,[oldRollClass,newRollClass]=["pf2e-reroll-discard",""];(keep==="higher"&&oldRoll.total>newRoll.total||keep==="lower"&&oldRoll.total{const{dc}=context;if(!dc)return null;if(dc.slug==="armor"){const targetActor=(()=>{const{target}=context;if(!target?.actor)return null;const maybeActor=fromUuidSync(target.actor);return maybeActor instanceof ActorPF2e?maybeActor:maybeActor instanceof TokenDocumentPF2e?maybeActor.actor:null})();dc.statistic=targetActor?.armorClass}return new DegreeOfSuccess(newRoll,dc,context.dosAdjustments)})(),useNewRoll=keptRoll===newRoll&&!!degree;useNewRoll&°ree&&(newRoll.options.degreeOfSuccess=degree.value);const renders={old:await _CheckPF2e2.renderReroll(oldRoll,{isOld:!0}),new:await _CheckPF2e2.renderReroll(newRoll,{isOld:!1})},rerollIcon=fontAwesomeIcon(heroPoint?"hospital-symbol":"dice");rerollIcon.classList.add("pf2e-reroll-indicator"),rerollIcon.setAttribute("title",rerollFlavor);const oldFlavor=message.flavor??"";context.outcome=useNewRoll?DEGREE_OF_SUCCESS_STRINGS[degree.value]:context.outcome;const newFlavor=useNewRoll?await(async()=>{const parsedFlavor=document.createElement("div");parsedFlavor.innerHTML=oldFlavor;const target=context.target??null,targetFlavor=await __privateMethod(this,_createResultFlavor,createResultFlavor_fn).call(this,{degree,target});targetFlavor&&htmlQuery(parsedFlavor,".target-dc-result")?.replaceWith(targetFlavor);for(const element of htmlQueryAll(parsedFlavor,".roll-note"))element.remove();const notesText=(context.notes?.map(n=>new RollNotePF2e(n))??[]).filter(note=>{if(!context.dc||note.outcome.length===0)return!0;const outcome=context.outcome??context.unadjustedOutcome;return!!(outcome&¬e.outcome.includes(outcome))}).map(n=>n.text).join(` +`)??"";return parsedFlavor.innerHTML+notesText})():oldFlavor,{initiativeRoll}=message.flags.core;if(initiativeRoll){const combatant=message.token?.combatant;await combatant?.parent.setInitiative(combatant.id,newRoll.total)}await message.delete({render:!1}),await keptRoll.toMessage({content:`

${renders.old}
${renders.new}
`,flavor:`${rerollIcon.outerHTML}${newFlavor}`,speaker:message.speaker,flags:{core:{initiativeRoll},pf2e:systemFlags}},{rollMode:context.rollMode})}static async renderReroll(roll,{isOld}){const die=roll.dice.find(d=>d instanceof Die&&d.faces===20);if(typeof die?.total!="number")throw ErrorPF2e("Unexpected error inspecting d20 term");const html=await roll.render(),element=parseHTML(`
${html}
`);return isOld&&element.querySelector(".message-buttons")?.remove(),[1,20].includes(die.total)&&element.querySelector(".dice-total")?.classList.add(die.total===20?"success":"failure"),element.innerHTML}};_createTagFlavor=new WeakSet,createTagFlavor_fn=__name2(function({check,context,extraTags}){const toTagElement=__name2((tag,cssClass=null)=>{const span=document.createElement("span");return span.classList.add("tag"),cssClass&&span.classList.add(`tag_${cssClass}`),span.innerText=tag.label,tag.name&&(span.dataset.slug=tag.name),tag.description&&(span.dataset.tooltip=tag.description),span},"toTagElement"),traits=uniqBy(context.traits?.map(trait=>(trait.label=game.i18n.localize(trait.label),trait))??[],t=>t.name).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang)).map(t=>toTagElement(t))??[],{item}=context,itemTraits=item?.isOfType("weapon","melee","spell")&&context.type!=="saving-throw"?Array.from(item.traits).map(t=>{const dictionary=item.isOfType("spell")?CONFIG.PF2E.spellTraits:CONFIG.PF2E.npcAttackTraits,obj=traitSlugToObject(t,dictionary);return obj.label=game.i18n.localize(obj.label),obj}).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang)).map(t=>toTagElement(t,"alt")):[],properties=(()=>{const range=item?.isOfType("action","weapon")?item.range:null,label=createActionRangeLabel(range);if(label&&(range?.increment||range?.max)){const slug=range.increment?`range-increment-${range.increment}`:`range-${range.max}`;return[toTagElement({name:slug,label,description:"PF2E.Item.Weapon.RangeIncrementN.Hint"},"secondary")]}else return[]})(),traitsAndProperties=createHTMLElement("div",{classes:["tags","traits"],dataset:{tooltipClass:"pf2e"}});if(itemTraits.length===0&&properties.length===0)traitsAndProperties.append(...traits);else{const verticalBar=document.createElement("hr");verticalBar.className="vr",traitsAndProperties.append(...[traits,verticalBar,itemTraits,properties].flat())}const modifiers=check.modifiers.filter(m=>m.enabled).map(modifier=>{const sign=modifier.modifier<0?"":"+",label=`${modifier.label} ${sign}${modifier.modifier}`;return toTagElement({name:modifier.slug,label},"transparent")}),tagsFromOptions=extraTags.map(t=>toTagElement({label:game.i18n.localize(t)},"transparent")),modifiersAndExtras=createHTMLElement("div",{classes:["tags","modifiers"],children:[...modifiers,...tagsFromOptions]});return compact([traitsAndProperties.childElementCount>0?traitsAndProperties:null,document.createElement("hr"),modifiersAndExtras])},"#createTagFlavor"),_createResultFlavor=new WeakSet,createResultFlavor_fn=__name2(async function({degree,target}){if(!degree)return null;const{dc}=degree,customLabel=!!dc.label&&Number.isInteger(dc.value)&&!dc.label.includes("{dc}")&&dc.label?`${game.i18n.localize(dc.label)}: {dc}`:dc.label??null,targetActor=await(async()=>{if(!target?.actor)return null;if(target.actor instanceof ActorPF2e)return target.actor;const maybeActor=await fromUuid(target.actor);return maybeActor instanceof ActorPF2e?maybeActor:maybeActor instanceof TokenDocumentPF2e?maybeActor.actor:null})(),targetData=await(async()=>{if(!target)return null;const token=await(async()=>target.token?target.token instanceof TokenDocumentPF2e?target.token:targetActor?.token?targetActor.token:fromUuid(target.token):null)(),canSeeName=(token??new TokenDocumentPF2e(targetActor?.prototypeToken.toObject()??{})).playersCanSeeName||!game.settings.get("pf2e","metagame_tokenSetsNameVisibility");return{name:token?.name??targetActor?.name??"",visible:!!canSeeName}})(),{checkDCs}=CONFIG.PF2E,dcData=(()=>{const dcSlug=dc.slug??(dc.statistic instanceof StatisticDifficultyClass?dc.statistic.parent.slug:null),dcType=game.i18n.localize(dc.label?.trim()||game.i18n.localize(objectHasKey(checkDCs.Specific,dcSlug)?checkDCs.Specific[dcSlug]:checkDCs.Unspecific)),circumstances=dc.statistic instanceof StatisticDifficultyClass?dc.statistic.modifiers.filter(m=>m.enabled&&m.type==="circumstance"):[],preadjustedDC=circumstances.length>0&&dc.statistic?dc.value-circumstances.reduce((total,c)=>total+c.modifier,0):dc.value??null,visible=targetActor?.hasPlayerOwner||dc.visible||game.settings.get("pf2e","metagame_showDC");if(typeof preadjustedDC!="number"||circumstances.length===0){const labelKey=game.i18n.localize(targetData?checkDCs.Label.WithTarget:customLabel??checkDCs.Label.NoTarget);return{markup:game.i18n.format(labelKey,{dcType,dc:dc.value,target:targetData?.name??null}),visible}}const adjustment={preadjusted:preadjustedDC,direction:preadjustedDCdc.value?"decreased":"no-change",circumstances:circumstances.map(c=>({label:c.label,value:c.modifier}))},translation=adjustment.direction==="no-change"?checkDCs.Label.NoChangeTarget:checkDCs.Label.AdjustedTarget;return{markup:game.i18n.format(translation,{target:targetData?.name??game.user.name,dcType,preadjusted:preadjustedDC,adjusted:dc.value}),visible,adjustment}})(),resultData=(()=>{const offset={value:new Intl.NumberFormat(game.i18n.lang,{maximumFractionDigits:0,signDisplay:"always",useGrouping:!1}).format(degree.rollTotal-dc.value),visible:dc.visible},checkOrAttack=sluggify(dc.scope??"Check",{camel:"bactrian"}),locPath=__name2((checkOrAttack2,dosKey)=>`PF2E.Check.Result.Degree.${checkOrAttack2}.${dosKey}`,"locPath"),unadjusted=game.i18n.localize(locPath(checkOrAttack,DEGREE_OF_SUCCESS_STRINGS[degree.unadjusted])),[adjusted,locKey]=degree.adjustment?[game.i18n.localize(locPath(checkOrAttack,DEGREE_OF_SUCCESS_STRINGS[degree.value])),"AdjustedLabel"]:[unadjusted,"Label"],markup=game.i18n.format(`PF2E.Check.Result.${locKey}`,{adjusted,unadjusted,offset:offset.value}),visible=game.settings.get("pf2e","metagame_showResults");return{markup,visible}})(),rendered=await renderTemplate("systems/pf2e/templates/chat/check/target-dc-result.hbs",{dc:dcData,result:resultData}),html=parseHTML(rendered),{convertXMLNode}=TextEditorPF2e;if(targetData&&convertXMLNode(html,"target",{visible:targetData.visible,whose:"target"}),convertXMLNode(html,"dc",{visible:dcData.visible,whose:"target"}),dcData.adjustment){const{adjustment}=dcData;convertXMLNode(html,"preadjusted",{classes:["unadjusted"]});const adjustedNode=convertXMLNode(html,"adjusted",{classes:["adjusted",adjustment.direction]});if(!adjustedNode)throw ErrorPF2e("Unexpected error processing roll template");adjustment.circumstances.length>0&&(adjustedNode.dataset.tooltip=adjustment.circumstances.map(a=>createHTMLElement("div",{children:[`${a.label}: ${signedInteger(a.value)}`]}).outerHTML).join(` +`))}if(convertXMLNode(html,"unadjusted",{visible:resultData.visible,classes:degree.adjustment?["unadjusted"]:[DEGREE_OF_SUCCESS_STRINGS[degree.value]]}),degree.adjustment){const adjustedNode=convertXMLNode(html,"adjusted",{visible:resultData.visible,classes:[DEGREE_OF_SUCCESS_STRINGS[degree.value],"adjusted"]});if(!adjustedNode)throw ErrorPF2e("Unexpected error processing roll template");adjustedNode.dataset.tooltip=degree.adjustment.label}if(convertXMLNode(html,"offset",{visible:dcData.visible,whose:"target"}),!targetData?.visible&&!dcData.visible){const targetDC=html.querySelector(".target-dc");targetDC&&(targetDC.dataset.visibility="gm"),resultData.visible||(html.dataset.visibility="gm")}return html},"#createResultFlavor"),__privateAdd(_CheckPF2e,_createTagFlavor),__privateAdd(_CheckPF2e,_createResultFlavor),__name2(_CheckPF2e,"CheckPF2e");let CheckPF2e=_CheckPF2e;const _CheckContextError=class extends Error{static{__name(this,"_CheckContextError")}constructor(message,actor,slug){super(message),this.actor=actor,this.slug=slug}};__name2(_CheckContextError,"CheckContextError");let CheckContextError=_CheckContextError;const _ActionMacroHelpers=class{static{__name(this,"_ActionMacroHelpers")}static resolveStat(stat){switch(stat){case"perception":return{checkType:"perception-check",property:"perception",stat,subtitle:"PF2E.ActionsCheck.perception"};case"unarmed":return{checkType:"attack-roll",property:"unarmed",stat,subtitle:"PF2E.ActionsCheck.unarmed"};default:return{checkType:"skill-check",property:`skills.${sluggify(stat)}`,stat,subtitle:`PF2E.ActionsCheck.${stat}`}}}static defaultCheckContext(options,data){const{checkType:type,property,stat:slug,subtitle}=this.resolveStat(data.slug),statistic=options.actor.getStatistic(data.slug)??getProperty(options.actor,property);if(!statistic){const{actor}=options,message=`Actor ${actor.name} (${actor.id}) does not have a statistic for ${slug}.`;throw new CheckContextError(message,actor,slug)}const{item,rollOptions:contextualRollOptions}=options.buildContext({actor:options.actor,item:data.item,rollOptions:[...data.rollOptions],target:options.target});return{item,modifiers:data.modifiers??[],rollOptions:contextualRollOptions,slug,statistic,subtitle,type}}static note(selector,translationPrefix,outcome,translationKey){const outcomes=game.settings.get("pf2e","metagame_showResults")?[outcome]:[];return new RollNotePF2e({selector,text:game.i18n.localize(translationKey??`${translationPrefix}.Notes.${outcome}`),outcome:outcomes})}static outcomesNote(selector,translationKey,outcomes){const visibleOutcomes=game.settings.get("pf2e","metagame_showResults")?outcomes:[];return new RollNotePF2e({selector,text:game.i18n.localize(translationKey),outcome:visibleOutcomes})}static async simpleRollActionCheck(options){const rollers=[];if(Array.isArray(options.actors)?rollers.push(...options.actors):options.actors?rollers.push(options.actors):rollers.push(...getSelectedOrOwnActors()),rollers.length===0)throw new Error(game.i18n.localize("PF2E.ActionsWarning.NoActor"));const targetData=options.target?.()??this.target();for(const actor of rollers)try{const selfToken=actor.getActiveTokens(!1,!0).shift(),{item:weapon,modifiers=[],rollOptions:combinedOptions,statistic,subtitle,type}=await options.checkContext({actor,buildContext:args=>{const combinedOptions2=compact([args.rollOptions,options.traits].flat());return combinedOptions2.push(...args.item?.getRollOptions("item")??[]),{item:args.item,rollOptions:combinedOptions2.sort(),target:args.target}},target:targetData.actor}),header=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{glyph:options.actionGlyph,subtitle,title:options.title}),actionTraits2=CONFIG.PF2E.actionTraits,traitDescriptions2=CONFIG.PF2E.traitsDescriptions,traitObjects=options.traits.map(trait=>({description:traitDescriptions2[trait],name:trait,label:actionTraits2[trait]??trait})),notes=options.extraNotes?.(statistic.slug)??[],label=await options.content?.(header)??header,title=`${game.i18n.localize(options.title)} - ${game.i18n.localize(subtitle)}`;if(statistic instanceof Statistic){const dc=__privateMethod(this,_resolveCheckDC,resolveCheckDC_fn).call(this,{unresolvedDC:options.difficultyClass});await statistic.roll({...eventToRollParams(options.event,{type:"check"}),token:selfToken,label,title,dc,extraRollNotes:notes,extraRollOptions:combinedOptions,modifiers,target:targetData.actor,traits:traitObjects,createMessage:options.createMessage,callback:(roll,outcome,message)=>{options.callback?.({actor,message,outcome,roll})}})}else{const check=new CheckModifier(label,statistic,modifiers),dc=__privateMethod(this,_resolveCheckDC,resolveCheckDC_fn).call(this,{target:targetData.actor,unresolvedDC:options.difficultyClass,fully:!0}),finalOptions=new Set(combinedOptions);ensureProficiencyOption(finalOptions,statistic.rank??-1),check.calculateTotal(finalOptions);const selfActor=actor.getContextualClone(combinedOptions.filter(o=>o.startsWith("self:"))),distance=(()=>{const reach=selfActor.isOfType("creature")&&weapon?.isOfType("weapon")?selfActor.getReach({action:"attack",weapon})??null:null;return selfToken?.object&&targetData?.token?.object?selfToken.object.distanceTo(targetData.token.object,{reach}):null})(),rangeIncrement=weapon?.isOfType("weapon")&&typeof distance=="number"?getRangeIncrement(weapon,distance):null,domains=["all",type,statistic.slug],targetInfo=targetData.token&&targetData.actor&&typeof distance=="number"?{token:targetData.token,actor:targetData.actor,distance,rangeIncrement}:null,substitutions=extractRollSubstitutions(actor.synthetics.rollSubstitutions,domains,finalOptions),dosAdjustments=extractDegreeOfSuccessAdjustments(actor.synthetics,domains);await CheckPF2e.roll(check,{actor:selfActor,token:selfToken,item:weapon,createMessage:options.createMessage,target:targetInfo,dc,type,options:finalOptions,notes:[...notes,...statistic.notes??[]],dosAdjustments,substitutions,traits:traitObjects,title},options.event,(roll,outcome,message)=>{options.callback?.({actor,message,outcome,roll})})}}catch(cce){if(cce instanceof CheckContextError){const message=game.i18n.format("PF2E.ActionsWarning.NoStatistic",{id:cce.actor.id,name:cce.actor.name,statistic:cce.slug});ui.notifications.error(message);continue}throw cce}}static target(){const target=Array.from(game.user.targets).filter(t=>t.actor?.isOfType("creature")).shift()?.document??null,targetActor=target?.actor??null;return{token:target,actor:targetActor}}static getWeaponPotencyModifier(item,selector){const slug="potency";return AutomaticBonusProgression.isEnabled(item.actor)?new ModifierPF2e({slug,type:"potency",label:"PF2E.AutomaticBonusProgression.attackPotency",modifier:item.actor.synthetics.weaponPotency["strike-attack-roll"]?.[0]?.bonus??0,adjustments:extractModifierAdjustments(item.actor.synthetics.modifierAdjustments,[selector],slug)}):item.system.runes.potency>0?new ModifierPF2e({slug,type:"item",label:"PF2E.Item.Weapon.Rune.Potency",modifier:item.system.runes.potency,adjustments:extractModifierAdjustments(item.actor.synthetics.modifierAdjustments,[selector],slug)}):null}static getApplicableEquippedWeapons(actor,trait){return actor.isOfType("character")?actor.system.actions.flatMap(s=>s.ready&&s.item.traits.has(trait)?s.item:[]):actor.itemTypes.weapon.filter(w=>w.isEquipped&&w.traits.has(trait))}};_resolveCheckDC=new WeakSet,resolveCheckDC_fn=__name2(function({unresolvedDC=null,target=null,fully=!1}){return typeof unresolvedDC=="string"?fully?target?.getStatistic(unresolvedDC)?.dc??null:{slug:unresolvedDC}:typeof unresolvedDC=="function"?unresolvedDC(target):unresolvedDC},"#resolveCheckDC"),__privateAdd(_ActionMacroHelpers,_resolveCheckDC),__name2(_ActionMacroHelpers,"ActionMacroHelpers");let ActionMacroHelpers=_ActionMacroHelpers;const _SelectItemDialog=class extends Application{static{__name(this,"_SelectItemDialog")}constructor(action2,resolve){super(),__privateAdd(this,_item,null),__privateAdd(this,_resolve2,void 0),__privateAdd(this,_action,void 0),__privateSet(this,_action,action2),__privateSet(this,_resolve2,resolve)}static get defaultOptions(){return{...super.defaultOptions,width:270}}get template(){return __privateGet(this,_action)==="craft"?"systems/pf2e/templates/system/actions/craft-target-item.hbs":"systems/pf2e/templates/system/actions/repair/select-item-dialog.hbs"}get title(){const key=sluggify(__privateGet(this,_action),{camel:"bactrian"});return game.i18n.localize(`PF2E.Actions.${key}.SelectItemDialog.Title`)}async getData(options={}){return options.classes=[`select-${__privateGet(this,_action)}-item-dialog`],{...await super.getData(options),item:__privateGet(this,_item)}}activateListeners($html){super.activateListeners($html);const html=$html[0];html.addEventListener("drop",async event=>{const json2=event.dataTransfer?.getData("text/plain");if(!json2?.startsWith("{")||!json2.endsWith("}"))return;const data=JSON.parse(json2),uuid=data.uuid??data.pf2e?.itemUuid,item=uuid?await fromUuid(uuid):null;if(__privateGet(this,_action)==="repair"&&item&&!(item?.isEmbedded&&item.isOwner))ui.notifications.error("DOCUMENT.UsePermissionWarn",{localize:!0});else if(item instanceof PhysicalItemPF2e)__privateSet(this,_item,item),this.render();else{const key=sluggify(__privateGet(this,_action),{camel:"bactrian"});ui.notifications.error(game.i18n.localize(`PF2E.Actions.${key}.Error.ItemReferenceMismatch`))}}),htmlQuery(html,`[data-event-handler=${__privateGet(this,_action)}]`)?.addEventListener("click",()=>{this.close()}),htmlQuery(html,"[data-event-handler=cancel]")?.addEventListener("click",()=>{__privateSet(this,_item,null),this.close()})}close(options){return __privateGet(this,_resolve2).call(this,__privateGet(this,_item)),super.close(options)}static async getItem(action2){return new Promise(resolve=>{new this(action2,resolve).render(!0)})}};_item=new WeakMap,_resolve2=new WeakMap,_action=new WeakMap,__name2(_SelectItemDialog,"SelectItemDialog");let SelectItemDialog=_SelectItemDialog;async function craft(options){const item=options.item??(options.uuid?await fromUuid(options.uuid):await SelectItemDialog.getItem("craft"));if(item){if(!(item instanceof PhysicalItemPF2e)){ui.notifications.warn(game.i18n.format("PF2E.Actions.Craft.Warning.NotPhysicalItem",{item:item.name??""}));return}}else{console.warn("PF2e System | No item selected to craft: aborting");return}const quantity=options.quantity??1,proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),dc=options.difficultyClass??{value:calculateDC(item.level,{proficiencyWithoutLevel}),visible:!0},free=!!options.free,slug=options?.skill??"crafting",rollOptions=["action:craft"],modifiers=options?.modifiers;ActionMacroHelpers.simpleRollActionCheck({actors:options.actors,actionGlyph:options.glyph,title:"PF2E.Actions.Craft.Title",checkContext:opts=>ActionMacroHelpers.defaultCheckContext(opts,{modifiers,rollOptions,slug}),traits:["downtime","manipulate"],event:options.event,difficultyClass:dc,extraNotes:selector=>[ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","criticalSuccess"),ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","success"),ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","failure"),ActionMacroHelpers.note(selector,"PF2E.Actions.Craft","criticalFailure")],createMessage:!1,callback:async result=>{if(result.message instanceof ChatMessagePF2e){const message=result.message,flavor=await(async()=>["criticalSuccess","success","criticalFailure"].includes(result.outcome??"")?await renderCraftingInline(item,result.roll,quantity,result.actor,free):"")();flavor&&message.updateSource({flavor:message.flavor+flavor}),ChatMessage.create(message.toObject())}else console.error("PF2E | Unable to amend chat message with craft result.",result.message);options.callback?.(result)}}).catch(error=>{throw ui.notifications.error(error.message),error})}__name(craft,"craft"),__name2(craft,"craft");function createEmptySpellcastingEntry(actor){return new SpellcastingEntryPF2e({name:"Untitled",type:"spellcastingEntry",system:{ability:{value:"cha"},spelldc:{value:0,dc:0},tradition:{value:"arcane"},prepared:{value:"innate"}}},{actor})}__name(createEmptySpellcastingEntry,"createEmptySpellcastingEntry"),__name2(createEmptySpellcastingEntry,"createEmptySpellcastingEntry");const _SpellcastingCreateAndEditDialog=class extends FormApplication{static{__name(this,"_SpellcastingCreateAndEditDialog")}constructor(object,options){super(object instanceof ActorPF2e?createEmptySpellcastingEntry(object):object.clone({},{keepId:!0}),options),__privateAdd(this,_canSetAttribute),__publicField(this,"actor"),this.actor=object instanceof ActorPF2e?object:object.actor}static get defaultOptions(){const options=super.defaultOptions;return options.id="spellcasting-dialog",options.classes=[],options.title=game.i18n.localize("PF2E.SpellcastingSettings.Title"),options.template="systems/pf2e/templates/actors/spellcasting-dialog.hbs",options.width=350,options.submitOnChange=!0,options.closeOnSubmit=!1,options}async getData(){const{actor}=this,extraStatistics=actor.synthetics.statistics.values(),classDCs=actor.isOfType("character")?Object.values(actor.system.proficiencies.classDCs).filter(cdc=>cdc.rank>0):[],selectedStatistic=actor.getStatistic(this.object.system.proficiency.slug);return{...await super.getData(),actor,system:this.object.toObject().system,statistics:[...extraStatistics,...classDCs.map(c=>({slug:c.slug,label:game.i18n.format("PF2E.Actor.Character.ClassDC.LabelSpecific",{class:c.label})}))],magicTraditions:CONFIG.PF2E.magicTraditions,spellcastingTypes:omit(CONFIG.PF2E.preparationType,["ritual"]),attributes:CONFIG.PF2E.abilities,isAttributeConfigurable:__privateMethod(this,_canSetAttribute,canSetAttribute_fn).call(this),selectedAttribute:selectedStatistic?.attribute??this.object.attribute}}async _updateObject(event,formData){const wasInnate=this.object.isInnate,inputData=expandObject(formData),system=mergeObject(inputData.system??{},{prepared:{value:this.object.system.prepared.value},ability:{value:"cha"}},{overwrite:!1});if(inputData.system=system,system.prepared.value==="innate"&&!wasInnate&&(system.ability.value="cha"),system.proficiency?.slug&&(system.ability.value=""),system?.autoHeightenLevel&&(system.autoHeightenLevel.value||=null),this.object.updateSource(inputData),this.object.reset(),event.type!=="submit"){await this.render();return}return this.updateAndClose()}async updateAndClose(){const updateData=this.object.toObject();if(this.object.isRitual&&(updateData.system.tradition.value="",updateData.system.ability.value=""),this.object.isPrepared||delete updateData.system.prepared.flexible,this.object.id===null)updateData.name=(()=>{const preparationType=game.i18n.localize(CONFIG.PF2E.preparationType[updateData.system.prepared.value])??"",magicTraditions2=CONFIG.PF2E.magicTraditions,traditionSpells=game.i18n.localize(magicTraditions2[this.object.tradition??""]);return this.object.isRitual||!traditionSpells?preparationType:game.i18n.format("PF2E.SpellCastingFormat",{preparationType,traditionSpells})})(),await this.actor.createEmbeddedDocuments("Item",[updateData]);else{const actualEntry=this.actor.spellcasting.get(this.object.id);if(!(actualEntry instanceof SpellcastingEntryPF2e))return;const system=pick(updateData.system,["prepared","tradition","ability","proficiency","autoHeightenLevel"]);await actualEntry.update({system})}this.close()}};_canSetAttribute=new WeakSet,canSetAttribute_fn=__name2(function(){const slug=this.object._source.system.proficiency.slug,baseStat=this.actor.isOfType("character")?this.actor.getStatistic(slug):null;return!slug||!!baseStat&&!baseStat.attribute},"#canSetAttribute"),__name2(_SpellcastingCreateAndEditDialog,"SpellcastingCreateAndEditDialog");let SpellcastingCreateAndEditDialog=_SpellcastingCreateAndEditDialog;async function createSpellcastingDialog(event,object){return new SpellcastingCreateAndEditDialog(object,{top:event.clientY-80,left:window.innerWidth-710,height:"auto"}).render(!0)}__name(createSpellcastingDialog,"createSpellcastingDialog"),__name2(createSpellcastingDialog,"createSpellcastingDialog");const _SpellPreparationSheet=class extends ActorSheet{static{__name(this,"_SpellPreparationSheet")}constructor(item,options){super(item.actor,options),__privateAdd(this,_getSpellFromEvent),__publicField(this,"itemRenderer",new ItemSummaryRenderer(this)),__privateAdd(this,_searchEngine,new MiniSearch({fields:["name"],idField:"id",processTerm:t=>t.length>1?t.toLocaleLowerCase(game.i18n.lang):null,searchOptions:{combineWith:"AND",prefix:!0}})),this.item=item}static get defaultOptions(){return{...super.defaultOptions,classes:["default","sheet","spellcasting-entry","preparation"],width:480,height:600,template:"systems/pf2e/templates/actors/spellcasting-prep-sheet.hbs",scrollY:[".sheet-content"],filters:[{inputSelector:"input[type=search]",contentSelector:"ol.directory-list"}],sheetConfig:!1}}get id(){return`${super.id}-spellprep-${this.item.id}`}get title(){return game.i18n.format("PF2E.Actor.Creature.SpellPreparation.Title",{actor:this.actor.name})}_getHeaderButtons(){return super._getHeaderButtons().filter(b=>b.class==="close")}async getData(){__privateGet(this,_searchEngine).removeAll();const entry=await this.item.getSheetData(),spells=Object.values(entry.spellPrepList??{}).flat().map(s=>pick$1(s.spell,["id","name"]));return __privateGet(this,_searchEngine).addAll(spells),{...await super.getData(),owner:this.actor.isOwner,entry}}activateListeners($html){super.activateListeners($html);const html=$html[0];this.itemRenderer.activateListeners(html),html.addEventListener("click",event=>{const anchor=htmlClosest(event.target,"[data-action]"),action2=anchor?.dataset.action;if(anchor&&action2)switch(action2){case"edit-spell":{__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event).sheet.render(!0);return}case"delete-spell":{__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event).delete();return}case"spell-to-chat":{__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event).toMessage(event);return}case"toggle-flexible-collection":{const spell=__privateMethod(this,_getSpellFromEvent,getSpellFromEvent_fn).call(this,event);spell.update({"system.location.signature":!spell.system.location.signature});return}case"create-spell":{onClickCreateSpell(this.actor,{...anchor?.dataset,location:this.item.id});return}case"browse-spells":{const level=Number(anchor.dataset.level)||0;game.pf2e.compendiumBrowser.openSpellTab(this.item,level)}}})}_onSearchFilter(_event,query,_rgx,html){const matches=query.length>1?new Set(__privateGet(this,_searchEngine).search(query).map(s=>s.id)):new Set;for(const row of htmlQueryAll(html,"li[data-item-id]"))row.hidden=query.length>1&&!matches.has(row.dataset.itemId??"")}async _onDropItemCreate(itemSource){const spellSources=(Array.isArray(itemSource)?itemSource:[itemSource]).filter(source=>source.type==="spell");for(const spellSource of spellSources)spellSource.system.location.value=this.item.id;return super._onDropItemCreate(spellSources)}async _onSortItem(event,itemData){if(itemData.type!=="spell")return[];const spell=this.actor.items.get(itemData._id);return itemData.system.location.value!==this.item.id&&spell?.isOfType("spell")?[await this.item.spells?.addSpell(spell)??[]].flat():super._onSortItem(event,itemData)}async _renderInner(data,options){return this.itemRenderer.saveAndRestoreState(()=>super._renderInner(data,options))}};_searchEngine=new WeakMap,_getSpellFromEvent=new WeakSet,getSpellFromEvent_fn=__name2(function(event){const itemId=htmlClosest(event.target,"li[data-item-id]")?.dataset.itemId,item=this.actor.items.get(itemId,{strict:!0});if(!item.isOfType("spell"))throw ErrorPF2e("Unexpected item type");return item},"#getSpellFromEvent"),__name2(_SpellPreparationSheet,"SpellPreparationSheet");let SpellPreparationSheet=_SpellPreparationSheet;const _CreatureSheetPF2e=class extends ActorSheetPF2e{static{__name(this,"_CreatureSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_onConfigureActor),__privateAdd(this,_onToggleSignatureSpell),__privateAdd(this,_onClickBrowseActions),__privateAdd(this,_onClickBrowseSpellCompendia)}async getData(options){const sheetData=await super.getData(options),{actor}=this;if(sheetData.data.saves)for(const key of["fortitude","reflex","will"]){const save=sheetData.data.saves[key];save.icon=this.getProficiencyIcon(save.rank),save.hover=CONFIG.PF2E.proficiencyLevels[save.rank],save.label=CONFIG.PF2E.saves[key]}if(sheetData.data.attributes!==void 0&&(sheetData.data.attributes.perception.icon=this.getProficiencyIcon(sheetData.data.attributes.perception.rank),sheetData.data.attributes.perception.hover=CONFIG.PF2E.proficiencyLevels[sheetData.data.attributes.perception.rank]),sheetData.data.abilities)for(const key of ATTRIBUTE_ABBREVIATIONS)sheetData.data.abilities[key].label=CONFIG.PF2E.abilities[key];if(sheetData.data.skills){const skills=sheetData.data.skills;for(const[key,skill]of Object.entries(skills)){const label=objectHasKey(CONFIG.PF2E.skills,key)?CONFIG.PF2E.skills[key]:null;skill.icon=this.getProficiencyIcon(skill.rank??0),skill.hover=CONFIG.PF2E.proficiencyLevels[skill.rank??0],skill.label=skill.label??label??""}}return{...sheetData,languages:createSheetTags(CONFIG.PF2E.languages,actor.system.traits.languages),abilities:CONFIG.PF2E.abilities,actorSizes:CONFIG.PF2E.actorSizes,alignments:deepClone(CONFIG.PF2E.alignments),rarity:CONFIG.PF2E.rarityTraits,frequencies:CONFIG.PF2E.frequencies,attitude:CONFIG.PF2E.attitude,pfsFactions:CONFIG.PF2E.pfsFactions,dying:{maxed:actor.attributes.dying.value>=actor.attributes.dying.max,remainingDying:Math.max(actor.attributes.dying.max-actor.attributes.dying.value),remainingWounded:Math.max(actor.attributes.wounded.max-actor.attributes.wounded.value)}}}openSpellPreparationSheet(entryId){const entry=this.actor.items.get(entryId);if(entry?.isOfType("spellcastingEntry")&&entry.isPrepared){const offset=this.element.find(`.item-container[data-container-id="${entry.id}"] .prepared-toggle`).offset()??{left:0,top:0};new SpellPreparationSheet(entry,{top:offset.top-60,left:offset.left+200}).render(!0)}}async prepareSpellcasting(){return(await Promise.all(this.actor.spellcasting.map(async entry=>entry.getSheetData()))).sort((a,b)=>a.sort-b.sort)}getProficiencyIcon(level){return[...Array(level)].map(()=>fontAwesomeIcon("check-circle").outerHTML).join("")}activateListeners($html){super.activateListeners($html);const html=$html[0],carryMenuListener=__name2(event=>{if(!(event.currentTarget instanceof HTMLElement))throw ErrorPF2e("Unexpected error retrieving carry-type link");const menu=event.currentTarget,toggle=menu.nextElementSibling;toggle?.classList.contains("carry-type-hover")&&$(toggle).tooltipster("close");const carryType=menu.dataset.carryType;if(!setHasElement(ITEM_CARRY_TYPES,carryType))throw ErrorPF2e("Unexpected error retrieving requested carry type");const itemId=htmlClosest(menu,"[data-item-id]")?.dataset.itemId,item=this.actor.inventory.get(itemId,{strict:!0}),handsHeld=Number(menu.dataset.handsHeld)||0,inSlot=menu.dataset.inSlot==="true",current=item.system.equipped;(carryType!==current.carryType||inSlot!==current.inSlot||carryType==="held"&&handsHeld!==current.handsHeld)&&this.actor.adjustCarryType(item,{carryType,handsHeld,inSlot})},"carryMenuListener");for(const carryTypeMenu of htmlQueryAll(html,".tab.inventory a[data-carry-type]"))carryTypeMenu.addEventListener("click",carryMenuListener);const selectors="input[data-item-id][data-item-property], select[data-item-id][data-item-property]";$html.find(selectors).on("change",event=>{const $target=$(event.target),{itemId,itemProperty}=event.target.dataset;if(!itemId||!itemProperty)return;const value=(()=>{const value2=$(event.target).val();if(typeof value2>"u"||value2===null)return value2;switch($target.attr("data-dtype")??($target.attr("type")==="checkbox"?"Boolean":["number","range"].includes($target.attr("type")??"")?"Number":"String")){case"Boolean":return typeof value2=="boolean"?value2:value2==="true";case"Number":return Number(value2);case"String":return String(value2);default:return value2}})();this.actor.updateEmbeddedDocuments("Item",[{_id:itemId,[itemProperty]:value}])}),$html.find(".dots.dying, .dots.wounded").on("click contextmenu",event=>{const condition=Array.from(event.delegateTarget.classList).find(className=>["dying","wounded"].includes(className));if(condition){const currentMax=this.actor.system.attributes[condition]?.max;event.type==="click"&¤tMax?this.actor.increaseCondition(condition,{max:currentMax}):event.type==="contextmenu"&&this.actor.decreaseCondition(condition)}}),$html.find("[data-action=recovery-check]").tooltipster({theme:"crb-hover"}).filter(":not(.disabled)").on("click",event=>{this.actor.rollRecovery(event)}),$html.find(".skill-name.rollable, .skill-score.rollable").on("click",event=>{const skill=event.currentTarget.closest("[data-skill]")?.dataset.skill??"",key=objectHasKey(SKILL_DICTIONARY,skill)?SKILL_DICTIONARY[skill]:skill,rollParams=eventToRollParams(event,{type:"check"});this.actor.skills[key]?.check.roll(rollParams)});for(const element of htmlQueryAll(html,"a[data-action=perception-check]"))element.addEventListener("click",event=>{const extraRollOptions=element.dataset.secret?["secret"]:[];this.actor.perception.roll({...eventToRollParams(event,{type:"check"}),extraRollOptions})});for(const section of htmlQueryAll(html,".tab.spellcasting, .tab.spells")??[]){for(const element of htmlQueryAll(section,"[data-action=spellcasting-create]")??[])element.addEventListener("click",event=>{createSpellcastingDialog(event,this.actor)});for(const element of htmlQueryAll(section,"[data-action=spellcasting-edit]")??[])element.addEventListener("click",event=>{const containerId=htmlClosest(event.target,"[data-item-id]")?.dataset.itemId,entry=this.actor.items.get(containerId,{strict:!0});entry.isOfType("spellcastingEntry")&&createSpellcastingDialog(event,entry)});for(const element of htmlQueryAll(section,"[data-action=spellcasting-remove]")??[])element.addEventListener("click",async event=>{const itemId=htmlClosest(event.currentTarget,"[data-item-id]")?.dataset.itemId,item=this.actor.items.get(itemId,{strict:!0}),title=game.i18n.localize("PF2E.DeleteSpellcastEntryTitle"),content=await renderTemplate("systems/pf2e/templates/actors/delete-spellcasting-dialog.hbs");await Dialog.confirm({title,content})&&item.delete()})}$html.find(".prepared-toggle").on("click",async event=>{event.preventDefault();const itemId=$(event.currentTarget).parents(".item-container").attr("data-container-id")??"";this.openSpellPreparationSheet(itemId)});for(const toggle of htmlQueryAll(html,".slotless-level-toggle"))toggle.addEventListener("click",async()=>{const itemId=htmlClosest(toggle,".item-container")?.dataset.containerId??"",spellcastingEntry=this.actor.items.get(itemId);if(!spellcastingEntry?.isOfType("spellcastingEntry"))throw ErrorPF2e("Tried to toggle visibility of slotless levels on a non-spellcasting entry");await spellcastingEntry.update({"system.showSlotlessLevels.value":!spellcastingEntry.showSlotlessLevels})});for(const button of htmlQueryAll(html,"button[data-action=cast-spell]"))button.addEventListener("click",()=>{const spellEl=htmlClosest(button,".item"),{itemId,slotLevel,slotId,entryId}=spellEl?.dataset??{},collection=this.actor.spellcasting.collections.get(entryId,{strict:!0}),spell=collection.get(itemId,{strict:!0});collection.entry.cast(spell,{slot:Number(slotId??NaN),level:Number(slotLevel??NaN)})});$html.find(".spell-slots-increment-reset").on("click",event=>{const target=$(event.currentTarget),itemId=target.data().itemId,itemLevel=target.data().level,item=this.actor.items.get(itemId);if(item?.isOfType("spellcastingEntry")){const{system}=item.toObject();if(!system.slots)return;const slotLevel=goesToEleven(itemLevel)?`slot${itemLevel}`:"slot0";system.slots[slotLevel].value=system.slots[slotLevel].max,item.update({system})}else if(item?.isOfType("spell")){const max=item.system.location.uses?.max;if(!max)return;item.update({"system.location.uses.value":max})}}),$html.find(".focus-pool").on("change",event=>{this.actor.update({"system.resources.focus.max":$(event.target).val()})}),$html.find(".toggle-signature-spell").on("click",event=>{__privateMethod(this,_onToggleSignatureSpell,onToggleSignatureSpell_fn).call(this,event)});for(const button of htmlQueryAll(html,".action-browse"))button.addEventListener("click",()=>__privateMethod(this,_onClickBrowseActions,onClickBrowseActions_fn).call(this,button));for(const button of htmlQueryAll(html,".spell-browse"))button.addEventListener("click",()=>__privateMethod(this,_onClickBrowseSpellCompendia,onClickBrowseSpellCompendia_fn).call(this,button))}async _onSortItem(event,itemSource){const dropItemEl=htmlClosest(event.target,".item"),dropContainerEl=htmlClosest(event.target,".item-container"),dropSlotType=dropItemEl?.dataset.itemType,dropContainerType=dropContainerEl?.dataset.containerType,item=this.actor.items.get(itemSource._id);if(!item)return[];if(item.isOfType("spell")){if(!(dropItemEl&&dropContainerEl))return[];const entryId=dropContainerEl.dataset.containerId,collection=this.actor.spellcasting.collections.get(entryId,{strict:!0});if(dropSlotType==="spellLevel"){const{level}=dropItemEl.dataset,spell=await collection.addSpell(item,{slotLevel:Number(level)});return this.openSpellPreparationSheet(collection.id),[spell??[]].flat()}else if(dropItemEl.dataset.slotId){const dropId=Number(dropItemEl.dataset.slotId),slotRank=Number(dropItemEl.dataset.slotLevel);if(Number.isInteger(dropId)&&Number.isInteger(slotRank)){const allocated=await collection.prepareSpell(item,slotRank,dropId);if(allocated instanceof SpellcastingEntryPF2e)return[allocated]}}else if(dropSlotType==="spell"){const dropId=dropItemEl.dataset.itemId??"",target=this.actor.items.get(dropId);if(target?.isOfType("spell")&&item.id!==dropId){const sourceLocation=item.system.location.value,testSibling=__name2((item2,test)=>item2.isCantrip!==test.isCantrip?!1:!!(item2.isCantrip&&test.isCantrip||item2.isFocusSpell&&test.isFocusSpell||item2.rank===test.rank),"testSibling");if(sourceLocation===entryId&&testSibling(item,target)){const siblings=collection.filter(s=>testSibling(item,s));return await item.sortRelative({target,siblings}),[target]}else{const spell=await collection.addSpell(item,{slotLevel:target.rank});return this.openSpellPreparationSheet(collection.id),[spell??[]].flat()}}}else if(dropContainerType==="spellcastingEntry"){CONFIG.debug.hooks&&console.debug("PF2e System | ***** spell from same actor dropped on a spellcasting entry *****");const dropId=htmlClosest(event.target,".item-container")?.dataset.containerId;return dropId?[await item.update({"system.location.value":dropId})]:[]}}else if(item.isOfType("spellcastingEntry")&&dropContainerType==="spellcastingEntry"){const sourceId=item.id,dropId=dropContainerEl?.dataset.containerId??"",source=this.actor.items.get(sourceId),target=this.actor.items.get(dropId);if(source?.isOfType("spellcastingEntry")&&target?.isOfType("spellcastingEntry")&&source.id!==target.id){const siblings=this.actor.itemTypes.spellcastingEntry;return await source.sortRelative({target,siblings}),[source]}}return super._onSortItem(event,itemSource)}async _handleDroppedItem(event,item,data){const containerEl=htmlClosest(event.target,".item-container[data-container-type=spellcastingEntry]");if(containerEl&&item.isOfType("spell")&&!item.isRitual){const entryId=containerEl.dataset.containerId,collection=this.actor.spellcasting.collections.get(entryId,{strict:!0}),slotLevel=Number(htmlClosest(event.target,"[data-slot-level]")?.dataset.slotLevel??0);return this.openSpellPreparationSheet(collection.id),[await collection.addSpell(item,{slotLevel:Math.max(slotLevel,item.baseRank)})??[]].flat()}return super._handleDroppedItem(event,item,data)}_getHeaderButtons(){const buttons=super._getHeaderButtons();if(!this.actor.isOfType("character","npc"))return buttons;if(this.isEditable){const index=buttons.findIndex(b=>b.class==="close");buttons.splice(index,0,{label:"Configure",class:"configure-creature",icon:"fa-solid fa-user-gear",onclick:()=>__privateMethod(this,_onConfigureActor,onConfigureActor_fn).call(this)})}return buttons}async _updateObject(event,formData){const heldShield=this.actor.heldShield;return heldShield&&typeof formData["system.attributes.shield.hp.value"]=="number"&&await heldShield.update({"system.hp.value":formData["system.attributes.shield.hp.value"]}),delete formData["system.attributes.shield.hp.value"],super._updateObject(event,formData)}};_onConfigureActor=new WeakSet,onConfigureActor_fn=__name2(function(){this.actorConfigClass&&new this.actorConfigClass(this.actor).render(!0)},"#onConfigureActor"),_onToggleSignatureSpell=new WeakSet,onToggleSignatureSpell_fn=__name2(function(event){const{itemId}=event.target.closest(".item").dataset,spell=this.actor.items.get(itemId);spell instanceof SpellPF2e&&spell.update({"system.location.signature":!spell.system.location.signature})},"#onToggleSignatureSpell"),_onClickBrowseActions=new WeakSet,onClickBrowseActions_fn=__name2(function(button){const types=(button.dataset.actionType||"").split(","),traits=(button.dataset.actionTrait||"").split(","),categories=(button.dataset.actionCategory||"").split(",");game.pf2e.compendiumBrowser.openActionTab({types,traits,categories})},"#onClickBrowseActions"),_onClickBrowseSpellCompendia=new WeakSet,onClickBrowseSpellCompendia_fn=__name2(function(button){const level=Number(button.dataset.level??null),spellcastingIndex=htmlClosest(button,"[data-container-id]")?.dataset.containerId??"",entry=this.actor.spellcasting.get(spellcastingIndex);entry&&game.pf2e.compendiumBrowser.openSpellTab(entry,level)},"#onClickBrowseSpellCompendia"),__name2(_CreatureSheetPF2e,"CreatureSheetPF2e");let CreatureSheetPF2e=_CreatureSheetPF2e;async function add(actor,event){const weaponGroups2=CONFIG.PF2E.weaponGroups,baseWeapons=CONFIG.PF2E.baseWeaponTypes,template=await renderTemplate("systems/pf2e/templates/actors/add-combat-proficiency-dialog.hbs",{message:game.i18n.localize("PF2E.AddCombatProficiency.Message"),weaponGroups:weaponGroups2,baseWeapons});new Dialog({title:game.i18n.localize("PF2E.AddCombatProficiency.Title"),content:template,buttons:{add:{icon:fontAwesomeIcon("check").outerHTML,label:game.i18n.localize("PF2E.AddShortLabel"),callback:async $dialog=>{const selection=$dialog.find("select[name=proficiency]").val();if(typeof selection=="string"&&selection){const proficiencyKey=selection in weaponGroups2?`weapon-group-${selection}`:`weapon-base-${selection}`;await actor.addAttackProficiency(proficiencyKey);const tab=htmlClosest(event.currentTarget,".tab.skills");if(tab){const $tab=$(tab);$tab.animate({scrollTop:$tab.height()},"slow")}}}},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:game.i18n.localize("Cancel")}},default:"cancel"}).render(!0)}__name(add,"add"),__name2(add,"add");function remove(actor,event){const weaponGroups2=CONFIG.PF2E.weaponGroups,baseWeapons=CONFIG.PF2E.baseWeaponTypes,key=htmlClosest(event.currentTarget,"li.skill.custom")?.dataset.slug??"",translationKey=key?.replace(/^weapon-(?:base|group)-/,"")??"",name2=objectHasKey(weaponGroups2,translationKey)?game.i18n.localize(weaponGroups2[translationKey]):baseWeapons[translationKey],localize=localizer("PF2E.RemoveCombatProficiency"),message=localize("Message",{proficiency:name2});Dialog.confirm({title:localize("Title"),content:`

${message}

`,defaultYes:!1,yes:()=>{key in(actor._source.system.proficiencies?.attacks??{})&&actor.update({[`system.proficiencies.attacks.-=${key}`]:null})}})}__name(remove,"remove"),__name2(remove,"remove");const ManageAttackProficiencies={add,remove},_AttributeBuilder=class extends Application{static{__name(this,"_AttributeBuilder")}constructor(actor){super(),__privateAdd(this,_createButtons),__privateAdd(this,_calculateAncestryBoosts),__privateAdd(this,_calculateBackgroundBoosts),__privateAdd(this,_calculateLeveledBoosts),__privateAdd(this,_getBoostFlawLabels),__publicField(this,"actor"),__privateAdd(this,_abpEnabled,void 0),this.actor=actor,__privateSet(this,_abpEnabled,game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(actor)),actor.apps[this.appId]=this}static get defaultOptions(){return{...super.defaultOptions,classes:["attribute-builder"],title:game.i18n.localize("PF2E.Actor.Character.Attribute.Boosts"),template:"systems/pf2e/templates/actors/character/attribute-builder.hbs",width:"auto",height:"auto"}}get id(){return`attribute-builder-${this.actor.uuid}`}async getData(options={}){const{actor}=this,build=actor.system.build.attributes;return{...await super.getData(options),actor,attributes:CONFIG.PF2E.abilities,manual:build.manual,ancestry:actor.ancestry,background:actor.background,class:actor.class,attributeModifiers:mapValues$1(actor.abilities,(value,attribute)=>{const mod=build.manual?actor._source.system.abilities?.[attribute].mod??0:value.base;return{mod:addSign(Number(mod.toFixed(1))),label:CONFIG.PF2E.abilities[attribute]}}),manualKeyAttribute:actor.keyAttribute,keyOptions:build.keyOptions,...__privateMethod(this,_calculateAncestryBoosts,calculateAncestryBoosts_fn).call(this),backgroundBoosts:__privateMethod(this,_calculateBackgroundBoosts,calculateBackgroundBoosts_fn).call(this),legacyFlaws:actor.ancestry?.system.voluntary?.boost!==void 0,levelBoosts:__privateMethod(this,_calculateLeveledBoosts,calculateLeveledBoosts_fn).call(this)}}async _render(force,options){return maintainFocusInRender(this,()=>super._render(force,options))}async close(options={}){return delete this.actor.apps[this.appId],super.close(options)}activateListeners($html){super.activateListeners($html);const html=$html[0],{actor}=this;$html.find("[data-tooltip-content]").tooltipster({contentAsHTML:!0,arrow:!1,debug:!1,interactive:!0,maxWidth:350,side:["bottom"],theme:"crb-hover"});for(const input of htmlQueryAll(html,"input[type=text], input[type=number]"))input.addEventListener("focus",()=>{input.type==="text"&&input.dataset.dtype==="Number"&&(input.value=input.value.replace(/[^-.0-9]/g,""),input.type="number"),input.select()}),input.addEventListener("blur",()=>{if(input.type==="number"&&input.dataset.dtype==="Number"){input.type="text";const newValue=Math.clamped(Number(input.value)||0,-5,10);input.value=addSign(newValue);const propertyPath=input.dataset.property;if(!propertyPath)throw ErrorPF2e("Empty property path");actor.update({[propertyPath]:newValue})}});htmlQuery(html,"[data-action=toggle-alternate-ancestry-boosts]")?.addEventListener("click",()=>{actor.ancestry&&(actor.ancestry.system.alternateAncestryBoosts?actor.ancestry.update({"system.-=alternateAncestryBoosts":null}):actor.ancestry.update({"system.alternateAncestryBoosts":[]}))}),htmlQuery(html,"[data-action=toggle-legacy-voluntary-flaw]")?.addEventListener("click",async()=>{const ancestry=actor.ancestry;if(!ancestry)return;const voluntary=ancestry.system.voluntary;if(voluntary?.boost!==void 0){const flaws=uniq(voluntary.flaws);ancestry.update({system:{voluntary:{"-=boost":null,flaws}}})}else{const flaws=voluntary?.flaws.slice(0,2)??[];ancestry.update({system:{voluntary:{boost:null,flaws}}})}});for(const button of htmlQueryAll(html,"[data-section=ancestry] .boost"))button.addEventListener("click",async()=>{const ancestry=actor.ancestry,attribute=button.dataset.attribute;if(!ancestry||!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))return;if(ancestry.system.alternateAncestryBoosts){const existingBoosts=ancestry.system.alternateAncestryBoosts,boosts=existingBoosts.includes(attribute)?existingBoosts.filter(b=>b!==attribute):[...existingBoosts,attribute].slice(0,2);ancestry.update({"system.alternateAncestryBoosts":boosts});return}const boostToRemove=Object.entries(ancestry.system.boosts??{}).find(([,b])=>b.selected===attribute);if(boostToRemove){await ancestry.update({[`system.boosts.${boostToRemove[0]}.selected`]:null});return}const freeBoost=Object.entries(ancestry.system.boosts??{}).find(([,b])=>!b.selected&&b.value.length>0);freeBoost&&await ancestry.update({[`system.boosts.${freeBoost[0]}.selected`]:attribute})});for(const button of htmlQueryAll(html,"[data-section=voluntary] .boost-button"))button.addEventListener("click",()=>{const ancestry=actor.ancestry,attribute=button.dataset.attribute;if(!ancestry||!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))return;const removing=button.classList.contains("selected");if(button.dataset.action==="flaw"){const{flaws,boost}=ancestry.system.voluntary??{flaws:[]},alreadyHasFlaw=flaws.includes(attribute),isLegacy=boost!==void 0;if(removing&&alreadyHasFlaw&&!boost){flaws.splice(flaws.indexOf(attribute),1),ancestry.update({system:{voluntary:{flaws}}});return}const canDoubleFlaw=ancestry.lockedBoosts.includes(attribute)&&isLegacy,maxFlaws=isLegacy?2:6;flaws.length{const attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))return;const boostToRemove=Object.entries(actor.background?.system.boosts??{}).find(([,b])=>b.selected===attribute);if(boostToRemove){actor.background?.update({[`system.boosts.${boostToRemove[0]}.selected`]:null});return}const freeBoost=Object.entries(actor.background?.system.boosts??{}).find(([,b])=>!b.selected&&b.value.length>0);freeBoost&&actor.background?.update({[`system.boosts.${freeBoost[0]}.selected`]:attribute})});for(const button of htmlQueryAll(html,"button[data-action=class-key-attribute]"))button.addEventListener("click",()=>{const attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))throw ErrorPF2e(`Unrecognized attribute abbreviation: ${attribute}`);actor.system.build.attributes.manual?actor.update({"system.details.keyability.value":attribute}):actor.class?.update({"system.keyAbility.selected":attribute})});for(const button of htmlQueryAll(html,"[data-level] .boost"))button.addEventListener("click",()=>{const level=Number(htmlClosest(button,"[data-level]")?.dataset.level),attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute)||!tupleHasValue([1,5,10,15,20],level))return;const buildSource=mergeObject(actor.toObject().system.build??{},{attributes:{boosts:{}}}),boosts=buildSource.attributes.boosts[level]??=[];boosts.includes(attribute)?boosts.splice(boosts.indexOf(attribute),1):boosts.push(attribute),actor.update({"system.build":buildSource})});for(const button of htmlQueryAll(html,"button[data-action=apex]"))button.addEventListener("click",()=>{const attribute=button.dataset.attribute;if(!setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute))throw ErrorPF2e(`Unrecognized attribute abbreviation: ${attribute}`);const current=this.actor.system.build.attributes.apex;actor.update({"system.build.attributes.apex":__privateGet(this,_abpEnabled)&&attribute!==current?attribute:null})});htmlQuery(html,"input[name=toggle-manual-mode]")?.addEventListener("click",()=>{actor.toggleAttributeManagement()}),htmlQuery(html,"button[data-action=close]")?.addEventListener("click",()=>this.close())}};_abpEnabled=new WeakMap,_createButtons=new WeakSet,createButtons_fn=__name2(function(){return Array.from(ATTRIBUTE_ABBREVIATIONS).reduce((accumulated,attribute)=>(accumulated[attribute]={ability:attribute},accumulated),{})},"#createButtons"),_calculateAncestryBoosts=new WeakSet,calculateAncestryBoosts_fn=__name2(function(){const{actor}=this,ancestry=actor.ancestry;if(!ancestry)return{ancestryBoosts:null,voluntaryFlaws:null};const buttons=__privateMethod(this,_createButtons,createButtons_fn).call(this),[maxBoosts,selectedBoosts]=(()=>{const alternateAncestryBoosts=ancestry.system.alternateAncestryBoosts;if(alternateAncestryBoosts)return[2,alternateAncestryBoosts];const baseBoosts=Object.values(ancestry.system.boosts),selectedBoosts2=baseBoosts.map(b=>b.selected).filter(b=>!!b);return[baseBoosts.filter(b=>b.value.length>0||b.selected).length,selectedBoosts2]})(),build=actor.system.build.attributes,netBoosted=difference(build.boosts.ancestry,build.flaws.ancestry),remaining=maxBoosts-selectedBoosts.length,lockedBoosts=ancestry.system.alternateAncestryBoosts?null:ancestry.lockedBoosts,lockedFlaws=ancestry.system.alternateAncestryBoosts?null:ancestry.lockedFlaws;for(const attribute of ATTRIBUTE_ABBREVIATIONS){const state=buttons[attribute],selected=selectedBoosts.includes(attribute);state.boost={selected,locked:lockedBoosts?.includes(attribute),disabled:selected?!1:!remaining||netBoosted.includes(attribute)},lockedFlaws?.includes(attribute)&&(state.flaw={selected:!0,locked:!0})}const voluntaryFlaws=(()=>{const voluntary=ancestry.system.voluntary??{flaws:[]},legacyFlaws=voluntary.boost!==void 0,flawsComplete=legacyFlaws&&voluntary.flaws.length>=2,buttons2=__privateMethod(this,_createButtons,createButtons_fn).call(this);for(const attribute of ATTRIBUTE_ABBREVIATIONS){const state=buttons2[attribute],numFlaws=voluntary.flaws.filter(f=>f===attribute).length;if(state.flaw={selected:numFlaws>0,disabled:!numFlaws&&flawsComplete},legacyFlaws){lockedBoosts?.includes(attribute)&&(state.flaw.second={selected:numFlaws>1,disabled:!numFlaws||numFlaws<2&&flawsComplete});const boosted=voluntary.boost===attribute;state.boost={selected:boosted,disabled:boosted?!1:!flawsComplete||!!voluntary.boost||netBoosted.includes(attribute)}}}return{remaining:voluntary&&legacyFlaws&&!voluntary.boost?1:0,buttons:buttons2,voluntaryBoostsRemaining:0,labels:__privateMethod(this,_getBoostFlawLabels,getBoostFlawLabels_fn).call(this,ancestry.system.flaws)}})();return{ancestryBoosts:{buttons,remaining,labels:__privateMethod(this,_getBoostFlawLabels,getBoostFlawLabels_fn).call(this,ancestry.system.boosts),alternate:!!ancestry.system.alternateAncestryBoosts},voluntaryFlaws}},"#calculateAncestryBoosts"),_calculateBackgroundBoosts=new WeakSet,calculateBackgroundBoosts_fn=__name2(function(){const{actor}=this;if(!actor.background)return null;const buttons=__privateMethod(this,_createButtons,createButtons_fn).call(this),boosts=Object.values(actor.background.system.boosts).filter(b=>b.value.length>0),selectedBoosts=boosts.map(b=>b.selected).filter(b=>!!b),unselectedRestricted=boosts.filter(b=>b.value.length<6&&!b.selected).flatMap(b=>b.value),remaining=boosts.length-selectedBoosts.length;for(const attribute of ATTRIBUTE_ABBREVIATIONS){const selected=selectedBoosts.includes(attribute),mightBeForced=unselectedRestricted.includes(attribute);buttons[attribute].boost={selected,disabled:!(selected||remaining)||!!unselectedRestricted.length&&!mightBeForced}}const labels=__privateMethod(this,_getBoostFlawLabels,getBoostFlawLabels_fn).call(this,actor.background.system.boosts),tooltip=(()=>{const boosts2=actor.background?.system.boosts??{};if(Object.values(boosts2).length===2&&Object.values(boosts2)[0].value.length===2&&Object.values(boosts2)[1].value.length===6){const choices=Object.values(boosts2)[0].value.map(b=>game.i18n.localize(CONFIG.PF2E.abilities[b]));return game.i18n.format("PF2E.Actor.Character.AttributeBuilder.BackgroundBoostDescription",{a:choices[0],b:choices[1]})}else return null})();return{buttons,remaining,labels,tooltip}},"#calculateBackgroundBoosts"),_calculateLeveledBoosts=new WeakSet,calculateLeveledBoosts_fn=__name2(function(){const build=this.actor.system.build.attributes,isGradual=game.settings.get("pf2e","gradualBoostsVariant"),boostIsPartial=__name2((attribute,level,isApex)=>{if(level<5||build.manual||isApex)return!1;const boosts=compact([build.boosts.ancestry.find(a=>a===attribute),build.boosts.background.find(a=>a===attribute),build.boosts.class===attribute?attribute:null,build.boosts[1].find(a=>a===attribute),level===20?build.boosts[20].find(a=>a===attribute):null,level>=15?build.boosts[15].find(a=>a===attribute):null,level>=10?build.boosts[10].find(a=>a===attribute):null,level>=5?build.boosts[5].find(a=>a===attribute):null]).length,flaws=Number(build.flaws.ancestry.some(a=>a===attribute)),netBoosts=boosts-flaws,cssClasses={0:!1,1:!0};return netBoosts>=5?cssClasses[netBoosts%2]:!1},"boostIsPartial");return[1,5,10,15,17,20].flatMap(level=>{const isApex=level===17;if(isApex&&!__privateGet(this,_abpEnabled))return[];const remaining=isApex?+!build.apex:build.allowedBoosts[level]-build.boosts[level].length,buttons=__privateMethod(this,_createButtons,createButtons_fn).call(this);for(const attribute of ATTRIBUTE_ABBREVIATIONS){const selected=isApex?build.apex===attribute:build.boosts[level].includes(attribute),partial=selected&&boostIsPartial(attribute,level,isApex);buttons[attribute].boost={selected,partial,disabled:!remaining}}const eligible=isApex?this.actor.level>=17:build.allowedBoosts[level]>0,minLevel=isGradual&&!isApex?Math.max(1,level-3):level;return{buttons,remaining,level,eligible,minLevel,isApex}})},"#calculateLeveledBoosts"),_getBoostFlawLabels=new WeakSet,getBoostFlawLabels_fn=__name2(function(boostData){return Object.values(boostData).flatMap(boosts=>boosts.value.length===6?game.i18n.localize("PF2E.AbilityFree"):boosts.value.length>0?boosts.value.map(b=>game.i18n.localize(CONFIG.PF2E.abilities[b])).join(" or "):[])},"#getBoostFlawLabels"),__name2(_AttributeBuilder,"AttributeBuilder");let AttributeBuilder=_AttributeBuilder;const _CreatureConfig=class extends DocumentSheet{static{__name(this,"_CreatureConfig")}get title(){const namespace=this.actor.isOfType("character")?"Character":"NPC";return game.i18n.localize(`PF2E.Actor.${namespace}.Configure.Title`)}get template(){return`systems/pf2e/templates/actors/${this.actor.type}/config.hbs`}get actor(){return this.object}static get defaultOptions(){const options=super.defaultOptions;return options.width=450,options}async getData(options={}){const source=this.actor._source,alliance=source.system.details?.alliance===null?"neutral":source.system.details?.alliance??"default",defaultValue=game.i18n.localize(this.actor.hasPlayerOwner?"PF2E.Actor.Creature.Alliance.Party":"PF2E.Actor.Creature.Alliance.Opposition"),allianceOptions={default:game.i18n.format("PF2E.Actor.Creature.Alliance.Default",{alliance:defaultValue}),opposition:"PF2E.Actor.Creature.Alliance.Opposition",party:"PF2E.Actor.Creature.Alliance.Party",neutral:"PF2E.Actor.Creature.Alliance.Neutral"};return{...await super.getData(options),alliances:createSheetOptions(allianceOptions,{value:[alliance]})}}async _updateObject(event,formData){const key="system.details.alliance",alliance=formData[key];if(alliance==="default")delete formData[key],formData["system.details.-=alliance"]=null;else if(alliance==="neutral")formData[key]=null;else if(!setHasElement(ALLIANCES,alliance))throw ErrorPF2e("Unrecognized alliance");return super._updateObject(event,formData)}};__name2(_CreatureConfig,"CreatureConfig");let CreatureConfig=_CreatureConfig;const _CharacterConfig=class extends CreatureConfig{static{__name(this,"_CharacterConfig")}async getData(options={}){const{showBasicUnarmed}=this.actor.flags.pf2e;return{...await super.getData(options),showBasicUnarmed}}};__name2(_CharacterConfig,"CharacterConfig");let CharacterConfig=_CharacterConfig;const _CraftingFormula=class{static{__name(this,"_CraftingFormula")}constructor(item,{dc,batchSize,deletable=!1}={}){this.item=item,this.dc=dc??calculateDC(item.level,{rarity:item.rarity,proficiencyWithoutLevel:game.settings.get("pf2e","proficiencyVariant")}),this.batchSize=Math.max(batchSize??1,this.defaultBatchSize),this.deletable=deletable}dc;batchSize;deletable;get uuid(){return this.item.uuid}get img(){return this.item.img}get name(){return this.item.name}get level(){return this.item.level}get rarity(){return this.item.rarity}get price(){return this.item.price}get cost(){return CoinsPF2e.fromPrice(this.price,this.batchSize)}get minimumBatchSize(){return STACK_DEFINITIONS[this.item.system.stackGroup??""]?.size??1}get defaultBatchSize(){const{item}=this,isMundaneAmmo=item instanceof ConsumablePF2e&&item.isAmmunition&&!item.isMagical,isConsumable=item instanceof ConsumablePF2e&&item.category!=="wand"||item instanceof WeaponPF2e&&item.baseType==="alchemical-bomb";return Math.max(this.minimumBatchSize,isMundaneAmmo?10:isConsumable?4:1)}get description(){return this.item.description}};__name2(_CraftingFormula,"CraftingFormula");let CraftingFormula=_CraftingFormula;const _CraftingEntry=class{static{__name(this,"_CraftingEntry")}constructor(actor,knownFormulas,data){__privateAdd(this,_updateRE),__publicField(this,"preparedCraftingFormulas"),__publicField(this,"preparedFormulaData"),__publicField(this,"name"),__publicField(this,"selector"),__publicField(this,"isAlchemical"),__publicField(this,"isDailyPrep"),__publicField(this,"isPrepared"),__publicField(this,"craftableItems"),__publicField(this,"maxSlots"),__publicField(this,"fieldDiscovery"),__publicField(this,"batchSize"),__publicField(this,"fieldDiscoveryBatchSize"),__publicField(this,"maxItemLevel"),__publicField(this,"parentItem"),this.selector=data.selector,this.name=data.name,this.isAlchemical=!!data.isAlchemical,this.isDailyPrep=!!data.isDailyPrep,this.isPrepared=!!data.isPrepared,this.maxSlots=data.maxSlots??0,this.maxItemLevel=data.maxItemLevel||actor.level,this.fieldDiscovery=data.fieldDiscovery?new PredicatePF2e(data.fieldDiscovery):null,this.batchSize=data.batchSize,this.fieldDiscoveryBatchSize=data.fieldDiscoveryBatchSize,this.craftableItems=new PredicatePF2e(data.craftableItems),this.preparedFormulaData=(data.preparedFormulaData||[]).map(prepData=>knownFormulas.find(formula2=>formula2.uuid===prepData.itemUUID)?prepData:null).filter(prepData=>!!prepData),this.parentItem=actor.items.get(data.parentItem,{strict:!0}),this.preparedCraftingFormulas=this.preparedFormulaData.sort((prepDataA,prepDataB)=>(prepDataA.sort??0)-(prepDataB.sort??0)).map(prepData=>{const formula=knownFormulas.find(formula2=>formula2.uuid===prepData.itemUUID);return formula?Object.assign(new CraftingFormula(formula.item),{quantity:prepData.quantity||1,expended:!!prepData.expended,isSignatureItem:!!prepData.isSignatureItem,sort:prepData.sort??0}):null}).filter(prepData=>!!prepData)}get actor(){return this.parentItem.actor}get formulas(){const formulas=this.preparedCraftingFormulas.map(formula=>({uuid:formula.uuid,img:formula.img,name:formula.name,expended:formula.expended,quantity:formula.quantity,isSignatureItem:formula.isSignatureItem}));if(this.maxSlots>0){const fill=this.maxSlots-formulas.length;if(fill>0){const nulls=new Array(fill).fill(null);return formulas.concat(nulls)}}return formulas}get reagentCost(){if(!this.isAlchemical)return 0;const fieldDiscoveryQuantity=this.preparedCraftingFormulas.filter(f=>!!this.fieldDiscovery?.test(f.item.getRollOptions("item"))||f.isSignatureItem).reduce((sum2,current)=>sum2+current.quantity,0),otherQuantity=this.preparedCraftingFormulas.filter(f=>!this.fieldDiscovery?.test(f.item.getRollOptions("item"))&&!f.isSignatureItem).reduce((sum2,current)=>sum2+current.quantity,0),fieldDiscoveryBatchSize=this.fieldDiscoveryBatchSize||3,batchSize=this.batchSize||2;return Math.floor(fieldDiscoveryQuantity/fieldDiscoveryBatchSize)+Math.ceil((fieldDiscoveryQuantity%fieldDiscoveryBatchSize+otherQuantity)/batchSize)}static isValid(data){return!!data&&!!data.name&&!!data.selector}async prepareFormula(formula){this.checkEntryRequirements(formula);const index=this.preparedFormulaData.findIndex(f=>f.itemUUID===formula.uuid);if(this.isAlchemical&&index!==-1){const formula2=this.preparedFormulaData[index];formula2.quantity?formula2.quantity+=1:formula2.quantity=2}else this.preparedFormulaData.push({itemUUID:formula.uuid,quantity:1});return __privateMethod(this,_updateRE,updateRE_fn).call(this)}checkEntryRequirements(formula,{warn=!0}={}){return this.maxSlots&&this.formulas.filter(f=>f!==null).length>=this.maxSlots?(warn&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MaxSlots")),!1):this.actor.levelthis.maxItemLevel?(warn&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MaxItemLevel")),!1):this.craftableItems.test(formula.item.getRollOptions("item"))?!0:(warn&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.ItemMissingTraits")),!1)}async unprepareFormula(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return this.preparedFormulaData.splice(index,1),__privateMethod(this,_updateRE,updateRE_fn).call(this)}async increaseFormulaQuantity(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return formula.quantity?formula.quantity+=1:formula.quantity=2,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async decreaseFormulaQuantity(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID)){if(formula.quantity?formula.quantity-=1:formula.quantity=0,formula.quantity<=0){await this.unprepareFormula(index,itemUUID);return}return __privateMethod(this,_updateRE,updateRE_fn).call(this)}}async setFormulaQuantity(index,itemUUID,quantity){if(quantity<=0){await this.unprepareFormula(index,itemUUID);return}const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return formula.quantity=quantity,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async toggleFormulaExpended(index,itemUUID){const formula=this.preparedFormulaData[index];if(!(!formula||formula.itemUUID!==itemUUID))return formula.expended=!formula.expended,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async toggleSignatureItem(itemUUID){const formula=this.preparedFormulaData.find(f=>f.itemUUID===itemUUID);if(formula)return formula.isSignatureItem=!formula.isSignatureItem,__privateMethod(this,_updateRE,updateRE_fn).call(this)}async updateFormulas(formulas){return this.preparedFormulaData=formulas,__privateMethod(this,_updateRE,updateRE_fn).call(this)}};_updateRE=new WeakSet,updateRE_fn=__name2(async function(){const rules=this.parentItem.toObject().system.rules,thisRule=rules.find(r=>r.key==="CraftingEntry"&&r.selector===this.selector);thisRule&&(thisRule.preparedFormulas=this.preparedFormulaData,await this.parentItem.update({"system.rules":rules}))},"#updateRE"),__name2(_CraftingEntry,"CraftingEntry");let CraftingEntry=_CraftingEntry;const _ElementalBlast=class{static{__name(this,"_ElementalBlast")}constructor(actor){if(__privateAdd(this,_prepareBlastConfigs),__privateAdd(this,_prepareBlastInfusion),__privateAdd(this,_getBlastConfig),__privateAdd(this,_createModifiedItem),__privateAdd(this,_strengthModToDamage),__publicField(this,"actor"),__publicField(this,"statistic"),__publicField(this,"item"),__publicField(this,"configs"),__publicField(this,"infusion"),!actor.isOfType("character"))throw ErrorPF2e("Must construct with a PC");this.actor=actor,this.statistic=this.actor.getStatistic("impulse"),this.item=this.actor.itemTypes.action.find(a=>a.slug==="elemental-blast")??null,this.infusion=__privateMethod(this,_prepareBlastInfusion,prepareBlastInfusion_fn).call(this),this.configs=__privateMethod(this,_prepareBlastConfigs,prepareBlastConfigs_fn).call(this)}get actionCost(){const cost=this.item?.flags.pf2e.rulesSelections.actionCost??1;if(cost!==1&&cost!==2)throw ErrorPF2e("Action cost must be 1 or 2");return cost}async attack(params){const{statistic,actionCost}=this;if(!(statistic&&this.item))throw ErrorPF2e("Unable to blast");if(!this.actor.rollOptions.all["self:effect:kinetic-aura"])throw ErrorPF2e("No kinetic gate");const{element,damageType}=params;if(!element)throw ErrorPF2e("No element provided");if(!objectHasKey(elementTraits,element))throw ErrorPF2e(`Unrecognized element: ${element}`);if(!damageType)throw ErrorPF2e("No damage type provided");if(!objectHasKey(CONFIG.PF2E.damageTypes,damageType))throw ErrorPF2e(`Unrecognized damage type: ${damageType}`);const blastConfig=__privateMethod(this,_getBlastConfig,getBlastConfig_fn).call(this,element,damageType),melee=!!(params.melee??=!0),item=__privateMethod(this,_createModifiedItem,createModifiedItem_fn).call(this,{config:blastConfig,damageType,melee});if(!item)return null;const thisToken=this.actor.getActiveTokens(!0,!1).shift()??null,targetToken=game.user.targets.first()??null;if(!params.melee&&thisToken&&targetToken&&thisToken.distanceTo(targetToken)>blastConfig.range.max)return ui.notifications.warn("PF2E.Action.Strike.OutOfRange",{localize:!0}),null;const actionSlug="elemental-blast",blastStatistic=statistic.extend({check:{domains:[`${actionSlug}-attack-roll`],modifiers:AttackTraitHelpers.createAttackModifiers({item})}}),label=await renderTemplate("systems/pf2e/templates/chat/action/header.hbs",{title:item.name,glyph:actionCost.toString(),subtitle:game.i18n.format("PF2E.ActionsCheck.x-attack-roll",{type:statistic.label})}),meleeOrRanged=params.melee?"melee":"ranged",mapIncreases=Math.clamped(params.mapIncreases??0,0,2)||0;return blastStatistic.roll({identifier:`${blastConfig.element}.${params.damageType}.${meleeOrRanged}.${actionCost}`,action:actionSlug,attackNumber:mapIncreases+1,target:targetToken?.actor??null,token:thisToken?.document??null,item,label,traits:item.system.traits.value,melee,damaging:!0,dc:{slug:"ac"},extraRollOptions:[`action:${actionSlug}`,`action:cost:${actionCost}`],...eventToRollParams(params.event,{type:"check"})})}async damage(params){if(!this.statistic)return null;const melee=!!(params.melee??=!0),blastConfig=__privateMethod(this,_getBlastConfig,getBlastConfig_fn).call(this,params.element,params.damageType);if(!blastConfig)return null;const item=__privateMethod(this,_createModifiedItem,createModifiedItem_fn).call(this,{config:blastConfig,damageType:params.damageType,melee});if(!item)return null;const outcome=params.outcome??"success",meleeOrRanged=melee?"melee":"ranged",actionCost=Math.clamped(Number(params.actionCost??this.actionCost),1,2)||1,actionSlug="elemental-blast",domains=["damage","attack-damage","impulse-damage",`${actionSlug}-damage`],targetToken=game.user.targets.first()??null;item.flags.pf2e.attackItemBonus=blastConfig.statistic.check.modifiers.find(m=>m.enabled&&["item","potency"].includes(m.type))?.value??0;const context=await this.actor.getDamageRollContext({viewOnly:params.getFormula??!1,statistic:this.statistic.check,item,target:{token:targetToken},domains,outcome,melee,checkContext:params.checkContext,options:new Set([`action:${actionSlug}`,`action:cost:${actionCost}`,meleeOrRanged,...item.traits])}),baseDamage={category:null,damageType:params.damageType,terms:[{dice:{number:1,faces:blastConfig.dieFaces},modifier:0}]},damageSynthetics=processDamageCategoryStacking([baseDamage],{modifiers:extractModifiers(context.self.actor.synthetics,domains,{test:context.options,resolvables:{blast:item}}),dice:extractDamageDice(context.self.actor.synthetics.damageDice,domains,{test:context.options,resolvables:{blast:item,target:context.target?.actor??null}}),test:context.options}),extraModifiers=compact([...damageSynthetics.modifiers,__privateMethod(this,_strengthModToDamage,strengthModToDamage_fn).call(this,item,domains)]),modifiers=new StatisticModifier("",extraModifiers).modifiers,formulaData={dice:damageSynthetics.dice,modifiers,base:[baseDamage],ignoredResistances:[]},damageContext={type:"damage-roll",sourceType:"attack",self:context.self,target:context.target,outcome,options:context.options,domains,...eventToRollParams(params.event,{type:"damage"})};if(!params.getFormula&&!damageContext.skipDialog&&!await new DamageModifierDialog({formulaData,context:damageContext}).resolve())return null;const damageData=createDamageFormula(formulaData,outcome==="success"?DEGREE_OF_SUCCESS.SUCCESS:DEGREE_OF_SUCCESS.CRITICAL_SUCCESS),roll=new DamageRoll(damageData.formula);if(params.getFormula)return roll.formula;const damageTemplate={name:`${game.i18n.localize("PF2E.DamageRoll")}: ${item.name}`,traits:item.system.traits.value,materials:[],modifiers,damage:{roll,breakdown:damageData.breakdown}};return DamagePF2e.roll(damageTemplate,damageContext)}async setDamageType({element,damageType}){if(!this.configs.some(c=>c.element===element&&c.damageTypes.some(dt=>dt.value===damageType)))throw ErrorPF2e(`Damage type "${damageType}" not available for ${element}`);await this.item?.update({[`flags.pf2e.damageSelections.${element}`]:damageType})}};_blastConfigSchema=new WeakMap,_blastInfusionSchema=new WeakMap,_prepareBlastConfigs=new WeakSet,prepareBlastConfigs_fn=__name2(function(){const{item,statistic,actionCost,infusion}=this;if(!item||!statistic)return[];const{kineticist}=this.actor.flags.pf2e;if(!isObject(kineticist)||!("elementalBlast"in kineticist)||!isObject(kineticist.elementalBlast))return[];const schema=__privateGet(_ElementalBlast,_blastConfigSchema),damageTypeSelections=(()=>{const flag=item.flags.pf2e.damageSelections;return isObject(flag)?flag:{}})(),blasts=Object.values(kineticist.elementalBlast).filter(b=>isObject(b)&&"element"in b).map(b=>schema.clean(b)),validationFailures=blasts.flatMap(b=>schema.validate(b)??[]);for(const failure of validationFailures)throw failure.asError();item.flags.pf2e.attackItemBonus=statistic.check.modifiers.find(m=>m.enabled&&["item","potency"].includes(m.type))?.value??0;const maps=(()=>{const domains=[...statistic.check.domains,"elemental-blast-attack-roll"],options=this.actor.getRollOptions(domains),modifier=statistic.check.mod,mapsFor=__name2(melee=>{const penalties=calculateMAPs(__privateMethod(this,_createModifiedItem,createModifiedItem_fn).call(this,{melee})??item,{domains,options});return{map1:game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(modifier+penalties.map1),penalty:penalties.map1}),map2:game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(modifier+penalties.map2),penalty:penalties.map2})}},"mapsFor");return{melee:mapsFor(!0),ranged:mapsFor(!1)}})();return blasts.map(blast=>{const damageTypes2=uniq(compact([blast.damageTypes,this.infusion?.damageTypes].flat())).map(dt=>({value:dt,label:game.i18n.localize(CONFIG.PF2E.damageTypes[dt]),icon:DAMAGE_TYPE_ICONS[dt]??"",selected:damageTypeSelections[blast.element]===dt})).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang)),firstDamageType=damageTypes2.at(0);firstDamageType&&!damageTypes2.some(dt=>dt.selected)&&(firstDamageType.selected=!0);const maxRange=infusion?.range?.max??blast.range,range=infusion?.range?.increment?{increment:infusion.range.increment,max:infusion.range.increment*6,label:game.i18n.format("PF2E.Action.Range.IncrementN",{n:infusion.range.increment})}:{increment:null,max:maxRange,label:game.i18n.format("PF2E.Action.Range.MaxN",{n:maxRange})};return{...blast,statistic,maps,item,actionCost,damageTypes:damageTypes2,range}})},"#prepareBlastConfigs"),_prepareBlastInfusion=new WeakSet,prepareBlastInfusion_fn=__name2(function(){const schema=__privateGet(_ElementalBlast,_blastInfusionSchema),flag=this.actor.flags.pf2e.kineticist,infusionData=isObject(flag)&&isObject(flag.elementalBlast)?flag.elementalBlast.infusion:null;return isObject(infusionData)?schema.clean(infusionData):null},"#prepareBlastInfusion"),_getBlastConfig=new WeakSet,getBlastConfig_fn=__name2(function(element,damageType){const config=this.configs.find(c=>c.element===element&&c.damageTypes.some(t=>t.value===damageType));if(!config)throw ErrorPF2e(`Elemental blast configuration of element ${element} and damage type ${damageType} not found.`);return config},"#getBlastConfig"),_createModifiedItem=new WeakSet,createModifiedItem_fn=__name2(function({melee,config,damageType}){const{item}=this;if(!item)return null;const traits=(()=>{const baseTraits=this.item?.system.traits.value??[],infusionTraits=melee?this.infusion?.traits.melee:this.infusion?.traits.ranged;return uniq(compact([baseTraits,infusionTraits,config?.element,damageType].flat()).filter(t=>t in CONFIG.PF2E.actionTraits)).sort()})(),clone=item.clone({system:{traits:{value:traits}}},{keepId:!0});return clone.range=melee?null:config?.range??null,clone},"#createModifiedItem"),_strengthModToDamage=new WeakSet,strengthModToDamage_fn=__name2(function(item,domains){if(!item.range)return null;const strengthModValue=this.actor.abilities.str.mod,{traits}=item,modifierValue=traits.has("thrown")?strengthModValue:traits.has("propulsive")?strengthModValue<0?strengthModValue:Math.floor(strengthModValue/2):null;return typeof modifierValue=="number"?new ModifierPF2e({slug:"str",label:CONFIG.PF2E.abilities.str,ability:"str",modifier:modifierValue,type:"ability",adjustments:extractModifierAdjustments(this.actor.synthetics.modifierAdjustments,domains,"str")}):null},"#strengthModToDamage"),__name2(_ElementalBlast,"ElementalBlast"),__privateAdd(_ElementalBlast,_blastConfigSchema,(()=>{const{fields:fields2}=foundry.data;return new fields2.SchemaField({element:new fields2.StringField({required:!0,choices:()=>CONFIG.PF2E.elementTraits,initial:void 0}),label:new fields2.StringField({required:!0,blank:!1,initial:void 0}),img:new fields2.FilePathField({required:!0,categories:["IMAGE"],nullable:!1,initial:"systems/pf2e/icons/default-icons/spell.svg"}),damageTypes:new fields2.ArrayField(new fields2.StringField({required:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:void 0})),dieFaces:new fields2.NumberField({required:!0,nullable:!1,integer:!0,choices:[6,8],initial:void 0}),range:new fields2.NumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})})})()),__privateAdd(_ElementalBlast,_blastInfusionSchema,(()=>{const{fields:fields2}=foundry.data;return new fields2.SchemaField({damageTypes:new fields2.ArrayField(new fields2.StringField({required:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:void 0})),range:new fields2.SchemaField({increment:new fields2.NumberField({required:!0,integer:!0,positive:!0,nullable:!1}),max:new fields2.NumberField({required:!0,integer:!0,positive:!0,nullable:!1})},{required:!1,nullable:!0,initial:null}),traits:new fields2.SchemaField({melee:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,choices:()=>CONFIG.PF2E.weaponTraits,initial:void 0})),ranged:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,choices:()=>CONFIG.PF2E.weaponTraits,initial:void 0}))})})})());let ElementalBlast=_ElementalBlast;const _PCSheetTabManager=class{static{__name(this,"_PCSheetTabManager")}constructor(actor,link){this.actor=actor,this.link=link,renderTemplate("systems/pf2e/templates/actors/character/manage-tabs.hbs").then(template=>{$(this.link).tooltipster({content:template,contentAsHTML:!0,delay:250,interactive:!0,theme:"crb-hover",title:game.i18n.localize("PF2E.TabManageTabsLabel"),trigger:"custom",triggerOpen:{click:!0},triggerClose:{originClick:!0,mouseleave:!0},functionReady:(_origin,helper)=>this.onReady(helper.tooltip),functionAfter:()=>this.onClose()})})}static initialize(actor,link){new this(actor,link)}onReady(tooltip){const tabVisibility=this.actor.flags.pf2e.sheetTabs,tabs=this.link.closest("nav")?.querySelectorAll("a.item[data-tab]")??[];for(const tab of Array.from(tabs)){const tabName=tab.dataset.tab??"",selector=`input[data-tab-name="${tabName}"]`;tooltip.querySelector(selector).checked=tabVisibility[tabName],tab.classList.contains("hidden")&&(tab.classList.remove("hidden"),tab.classList.add("to-hide"))}const checkboxes=Array.from(tooltip.querySelectorAll('input[type="checkbox"]'));for(const checkbox of checkboxes)this.handleOnChange(checkbox,checkboxes)}handleOnChange(checkbox,checkboxes){checkbox.addEventListener("change",async()=>{const nav=this.link.closest("nav"),tabName=checkbox?.dataset.tabName??"",tab=nav?.querySelector(`a.item[data-tab="${tabName}"]`);for(const c of checkboxes)c.readOnly=!0;checkbox.checked?(tab?.classList.remove("to-hide"),await this.actor.update({[`flags.pf2e.sheetTabs.-=${tabName}`]:null},{render:!1})):(tab?.classList.add("to-hide"),await this.actor.update({[`flags.pf2e.sheetTabs.${tabName}`]:!1},{render:!1}));for(const c of checkboxes)c.readOnly=!1})}onClose(){const tabs=Array.from(this.link.closest("nav")?.querySelectorAll("a.item[data-tab]")??[]);for(const tab of tabs)tab.classList.contains("to-hide")&&(tab.classList.remove("to-hide"),tab.classList.add("hidden"))}};__name2(_PCSheetTabManager,"PCSheetTabManager");let PCSheetTabManager=_PCSheetTabManager;const _CharacterSheetPF2e=class extends CreatureSheetPF2e{static{__name(this,"_CharacterSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_prepareAbilities),__privateAdd(this,_prepareCraftingEntries),__privateAdd(this,_getBlastData),__privateAdd(this,_activateBlastListeners),__privateAdd(this,_onClickBrowseFeats),__privateAdd(this,_onChangeAdjustStat),__privateAdd(this,_onChangeAdjustItemStat),__privateAdd(this,_onClickAdjustItemStat),__privateAdd(this,_getFeatSlotData),__privateAdd(this,_sortFormulas),__publicField(this,"actorConfigClass",CharacterConfig),__privateAdd(this,_knownFormulas,{}),__privateAdd(this,_formulaQuantities,{})}static get defaultOptions(){const options=super.defaultOptions;return options.classes=[...options.classes,"character"],options.width=750,options.height=800,options.scrollY.push(".tab.active .tab-content"),options.tabs=[{navSelector:".sheet-navigation",contentSelector:".sheet-content",initial:"character"},{navSelector:".actions-nav",contentSelector:".actions-panels",initial:"encounter"}],options}get template(){return`systems/pf2e/templates/actors/character/${this.actor.limited&&!game.user.isGM?"limited":"sheet"}.hbs`}async getData(options){const sheetData=await super.getData(options),{actor}=this;if(this.actor.limited){const tab=options?.tabs.find(t=>t.navSelector===".sheet-navigation");tab&&(tab.initial="biography")}sheetData.martialProficiencies={attacks:sortLabeledRecord(mapValues$1(sheetData.data.proficiencies.attacks,(data,key)=>{const groupMatch=/^weapon-group-([-\w]+)$/.exec(key),baseWeaponMatch=/^weapon-base-([-\w]+)$/.exec(key);if(objectHasKey(CONFIG.PF2E.weaponCategories,key)){const locKey=sluggify(key,{camel:"bactrian"});data.label=setHasElement(WEAPON_CATEGORIES,key)?`PF2E.Actor.Character.Proficiency.Attack.${locKey}`:CONFIG.PF2E.weaponCategories[key]}else if(Array.isArray(groupMatch)){const weaponGroup=groupMatch[1];data.label=CONFIG.PF2E.weaponGroups[weaponGroup]??weaponGroup}else if(Array.isArray(baseWeaponMatch)){const baseWeapon=baseWeaponMatch[1];data.label=CONFIG.PF2E.baseWeaponTypes[baseWeapon]??baseWeapon}else data.label??=key;const rank=data.rank??0;return data.value=createProficiencyModifier({actor,rank,domains:[]}).value,data})),defenses:sortLabeledRecord(mapValues$1(sheetData.data.proficiencies.defenses,(data,key)=>{if(key in CONFIG.PF2E.armorCategories){const locKey=sluggify(key,{camel:"bactrian"});data.label=`PF2E.Actor.Character.Proficiency.Defense.${locKey}`}const rank=data.rank??0;return data.value=createProficiencyModifier({actor,rank,domains:[]}).value,data}))};for(const key of["light-barding","heavy-barding"])sheetData.martialProficiencies.defenses[key]?.rank===0&&delete sheetData.martialProficiencies.defenses[key];sheetData.ancestry=actor.ancestry,sheetData.heritage=actor.heritage,sheetData.background=actor.background,sheetData.class=actor.class,sheetData.deity=actor.deity,sheetData.data.resources.heroPoints.hover=game.i18n.format(actor.heroPoints.value===1?"PF2E.HeroPointRatio.One":"PF2E.HeroPointRatio.Many",actor.heroPoints),sheetData.attributeBoostsAllocated=(()=>{const{build}=sheetData.data;if(build.attributes.manual||!isReallyPC(actor))return!0;const keyAttributeSelected=!sheetData.class||build.attributes.keyOptions.includes(sheetData.data.details.keyability.value),ancestryBoostsSelected=(sheetData.ancestry?.system.alternateAncestryBoosts?.length===2||Object.values(sheetData.ancestry?.system.boosts??{}).every(b=>b.value.length===0||!!b.selected))&&sheetData.ancestry?.system.voluntary?.boost!==null,backgroundBoostsSelected=Object.values(sheetData.background?.system.boosts??{}).every(b=>b.value.length===0||!!b.selected);return ancestryBoostsSelected&&backgroundBoostsSelected&&keyAttributeSelected&&[1,5,10,15,20].filter(l=>build.attributes.allowedBoosts[l]>build.attributes.boosts[l].length).length===0})();const allClassDCs=Object.values(sheetData.data.proficiencies.classDCs),classDCs=allClassDCs.filter(cdc=>cdc.rank>0||allClassDCs.length>1).map(classDC=>({...classDC,icon:this.getProficiencyIcon(classDC.rank),hover:CONFIG.PF2E.proficiencyLevels[classDC.rank],rankSlug:PROFICIENCY_RANKS[classDC.rank],rankName:game.i18n.format(`PF2E.ProficiencyLevel${classDC.rank}`)})).sort((a,b)=>a.primary?-1:b.primary?1:a.slug.localeCompare(b.slug)),primaryClassDC=sheetData.data.attributes.classDC?.slug??null;sheetData.classDCs={dcs:classDCs,primary:primaryClassDC,perDCDetails:classDCs.length>1||!primaryClassDC};const abpEnabled=game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(actor);sheetData.apexAttributeOptions=abpEnabled?[]:this.actor.itemTypes.equipment.flatMap(e=>e.system.apex?.selected===!1&&e.isInvested&&e.system.apex.attribute!==actor.system.build.attributes.apex?e.system.apex.attribute:[]),sheetData.magicTraditions=CONFIG.PF2E.magicTraditions,sheetData.preparationType=CONFIG.PF2E.preparationType,sheetData.data.attributes.perception.rankName=game.i18n.format(`PF2E.ProficiencyLevel${sheetData.data.attributes.perception.rank}`),sheetData.data.saves={fortitude:sheetData.data.saves.fortitude,reflex:sheetData.data.saves.reflex,will:sheetData.data.saves.will};for(const save of Object.values(sheetData.data.saves))save.rankName=game.i18n.format(`PF2E.ProficiencyLevel${save.rank}`);for(const save of Object.values(sheetData.data.saves))save.short=game.i18n.format(`PF2E.Saves${save.label}Short`);sheetData.data.details.keyability.singleOption=actor.class?.system.keyAbility.value.length===1,sheetData.hasStamina=game.settings.get("pf2e","staminaVariant"),sheetData.spellcastingEntries=await this.prepareSpellcasting(),sheetData.actions=__privateMethod(this,_prepareAbilities,prepareAbilities_fn).call(this),sheetData.feats=[...actor.feats,actor.feats.bonus];const craftingFormulas=await actor.getCraftingFormulas(),formulasByLevel=groupBy$1(craftingFormulas,f=>f.level),flags=actor.flags.pf2e,hasQuickAlchemy=!!(actor.rollOptions.all["feature:quick-alchemy"]||actor.rollOptions.all["feat:quick-alchemy"]);sheetData.crafting={noCost:flags.freeCrafting,hasQuickAlchemy,knownFormulas:formulasByLevel,entries:await __privateMethod(this,_prepareCraftingEntries,prepareCraftingEntries_fn).call(this,craftingFormulas)},__privateSet(this,_knownFormulas,Object.values(formulasByLevel).flat().reduce((result,entry)=>(entry.batchSize=__privateGet(this,_formulaQuantities)[entry.uuid]??entry.batchSize,result[entry.uuid]=entry,result),{})),sheetData.abpEnabled=AutomaticBonusProgression.isEnabled(actor),sheetData.data.skills=Object.fromEntries(Object.entries(sheetData.data.skills).sort(([_keyA,skillA],[_keyB,skillB])=>game.i18n.localize(skillA.label??"").localeCompare(game.i18n.localize(skillB.label??""),game.i18n.lang))),sheetData.tabVisibility=deepClone(actor.flags.pf2e.sheetTabs);const rollData=actor.getRollData(),biography=sheetData.biography=actor.system.details.biography,enrichPromises={appearance:TextEditor.enrichHTML(biography.appearance,{rollData,async:!0}),backstory:TextEditor.enrichHTML(biography.backstory,{rollData,async:!0}),campaignNotes:TextEditor.enrichHTML(biography.campaignNotes,{rollData,async:!0}),allies:TextEditor.enrichHTML(biography.allies,{rollData,async:!0}),enemies:TextEditor.enrichHTML(biography.enemies,{rollData,async:!0}),organizations:TextEditor.enrichHTML(biography.organizations,{rollData,async:!0})};await Promise.all(Object.values(enrichPromises));for(const[key,content]of Object.entries(enrichPromises))sheetData.enrichedContent[key]=await content;try{const action2=new ElementalBlast(this.actor),blastData=(await Promise.all(action2.configs.map(c=>__privateMethod(this,_getBlastData,getBlastData_fn).call(this,action2,c)))).sort((a,b)=>a.label.localeCompare(b.label,game.i18n.lang));sheetData.elementalBlasts=blastData}catch{sheetData.elementalBlasts=[]}return sheetData}async prepareItems(sheetData){const actorData=sheetData.actor,lores=[];for(const itemData of sheetData.items)if(itemData.type==="lore"){itemData.system.icon=this.getProficiencyIcon((itemData.system.proficient||{}).value),itemData.system.hover=CONFIG.PF2E.proficiencyLevels[(itemData.system.proficient||{}).value];const rank=itemData.system.proficient?.value||0,proficiency=createProficiencyModifier({actor:this.actor,rank,domains:[]}).modifier,modifier=actorData.system.abilities.int.mod,itemBonus=Number((itemData.system.item||{}).value||0);itemData.system.itemBonus=itemBonus,itemData.system.value=modifier+proficiency+itemBonus,itemData.system.breakdown=`int modifier(${modifier}) + proficiency(${proficiency}) + item bonus(${itemBonus})`,lores.push(itemData)}actorData.pfsBoons=this.actor.pfsBoons,actorData.deityBoonsCurses=this.actor.deityBoonsCurses,actorData.lores=lores}prepareInventoryItem(item){const data=super.prepareInventoryItem(item);data.isInvestable=!item.isInContainer&&item.isIdentified&&item.isInvested!==null;const invested=this.actor.inventory.invested,canInvest=invested&&invested.value{this.toggleInitiativeLink()});const heroPointsPips=htmlQuery(html,"[data-action=adjust-hero-points]");heroPointsPips?.addEventListener("click",async()=>{const newValue=Math.min(this.actor.heroPoints.value+1,this.actor.heroPoints.max);await this.actor.update({"system.resources.heroPoints.value":newValue})}),heroPointsPips?.addEventListener("contextmenu",async event=>{event.preventDefault();const newValue=Math.max(this.actor.heroPoints.value-1,0);await this.actor.update({"system.resources.heroPoints.value":newValue})});for(const selectElem of htmlQueryAll(html,"select.adjust-stat-select"))selectElem.addEventListener("change",()=>__privateMethod(this,_onChangeAdjustStat,onChangeAdjustStat_fn).call(this,selectElem));$html.find(".adjust-item-stat").on("click contextmenu",event=>__privateMethod(this,_onClickAdjustItemStat,onClickAdjustItemStat_fn).call(this,event)),$html.find(".adjust-item-stat-select").on("change",event=>__privateMethod(this,_onChangeAdjustItemStat,onChangeAdjustItemStat_fn).call(this,event));{const title=$(".sheet-navigation .active").attr("title");title&&$html.find(".navigation-title").text(title)}$html.find(".sheet-navigation").on("mouseover",".item,.manage-tabs",event=>{const title=event.currentTarget.title;title&&$(event.currentTarget).parents(".sheet-navigation").find(".navigation-title").text(title)}),$html.find(".sheet-navigation").on("mouseout",".item,.manage-tabs",event=>{const parent=$(event.currentTarget).parents(".sheet-navigation"),title=parent.find(".item.active").attr("title");title&&parent.find(".navigation-title").text(title)}),$html.find(".open-compendium").on("click",event=>{if(event.currentTarget.dataset.compendium){const compendium=game.packs.get(event.currentTarget.dataset.compendium);compendium&&compendium.render(!0)}});const mainPanel=htmlQuery(html,".tab[data-tab=character]");if(mainPanel&&this.isEditable){new ContextMenu(mainPanel,".detail-item-control",[{name:"PF2E.EditItemTitle",icon:fontAwesomeIcon("edit").outerHTML,callback:target=>{const itemId=$(target).closest("[data-item-id]").attr("data-item-id");this.actor.items.get(itemId??"")?.sheet.render(!0,{focus:!0})}},{name:"PF2E.DeleteItemTitle",icon:fontAwesomeIcon("trash").outerHTML,callback:target=>{const row=htmlClosest(target[0],"[data-item-id]"),itemId=row?.dataset.itemId,item=this.actor.items.get(itemId??"");if(row&&item)this.deleteItem(row,item);else throw ErrorPF2e("Item not found")}}],{eventName:"click"});for(const link of htmlQueryAll(html,".crb-tag-selector"))link.addEventListener("click",()=>this.openTagSelector(link,{allowCustom:!1}));htmlQuery(mainPanel,"button[data-action=edit-attribute-boosts]")?.addEventListener("click",()=>{(Object.values(this.actor.apps).find(a=>a instanceof AttributeBuilder)??new AttributeBuilder(this.actor)).render(!0)});for(const link of htmlQueryAll(mainPanel,"a[data-action=apex-attribute]"))link.addEventListener("click",()=>{if(game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(this.actor))return;const attribute=htmlClosest(link,"[data-attribute]")?.dataset.attribute;if(setHasElement(ATTRIBUTE_ABBREVIATIONS,attribute)){const apexItems=this.actor.itemTypes.equipment.filter(e=>e.system.apex),selection=apexItems.find(e=>e.isInvested&&e.system.apex?.attribute===attribute);this.actor.updateEmbeddedDocuments("Item",apexItems.map(e=>({_id:e.id,"system.apex.selected":e===selection})))}})}const actionsPanel=htmlQuery(html,".tab.actions");htmlQuery(actionsPanel,".toggle-unready-strikes")?.addEventListener("click",()=>{this.actor.setFlag("pf2e","showUnreadyStrikes",!this.actor.flags.pf2e.showUnreadyStrikes)});for(const strikeElem of htmlQueryAll(actionsPanel,".strikes-list li")){const versatileToggleButtons=htmlQueryAll(strikeElem,"button[data-action=toggle-versatile]");for(const button of versatileToggleButtons)button.addEventListener("click",()=>{const weapon=this.getStrikeFromDOM(button)?.item,baseType=weapon?.system.damage.damageType??null,selection=button.classList.contains("selected")||button.value===baseType?null:button.value,selectionIsValid=objectHasKey(CONFIG.PF2E.damageTypes,selection)||selection===null;weapon&&selectionIsValid&&toggleWeaponTrait({trait:"versatile",weapon,selection})});const auxActionButtons=htmlQueryAll(strikeElem,"button[data-action=auxiliary-action]");for(const button of auxActionButtons){const modularSelect=htmlQuery(button,"select");button.addEventListener("click",()=>{const auxiliaryActionIndex=Number(button.dataset.auxiliaryActionIndex??NaN),strike=this.getStrikeFromDOM(button),selection=modularSelect?.value??null;strike?.auxiliaryActions?.at(auxiliaryActionIndex)?.execute({selection})});for(const eventType of["change","click","dragenter","input"])modularSelect?.addEventListener(eventType,event=>{event.stopImmediatePropagation()})}const ammoSelect=htmlQuery(strikeElem,"select[data-action=link-ammo]");ammoSelect?.addEventListener("change",event=>{event.stopPropagation();const weapon=this.getStrikeFromDOM(ammoSelect)?.item,ammo=this.actor.items.get(ammoSelect.value);weapon?.update({system:{selectedAmmoId:ammo?.id??null}})})}for(const activeToggle of htmlQueryAll(actionsPanel,"[data-action=toggle-exploration]"))activeToggle.addEventListener("click",()=>{const actionId=htmlClosest(activeToggle,"[data-item-id]")?.dataset.itemId;if(!actionId)return;const exploration=this.actor.system.exploration.filter(id=>this.actor.items.has(id));exploration.findSplice(id=>id===actionId)||exploration.push(actionId),this.actor.update({"system.exploration":exploration})});htmlQuery(actionsPanel,"[data-action=clear-exploration]")?.addEventListener("click",()=>{this.actor.update({"system.exploration":[]})});for(const customModifierEl of htmlQueryAll(html,".modifiers-tooltip")){const stat=customModifierEl.dataset.stat;if(!stat)continue;for(const removeButton of htmlQueryAll(customModifierEl,"[data-action=remove-modifier]")){const slug=removeButton.dataset.slug??"";removeButton.addEventListener("click",()=>{this.actor.removeCustomModifier(stat,slug)})}const modifierValueEl=htmlQuery(customModifierEl,".add-modifier input[type=number]");htmlQuery(customModifierEl,"[data-action=increment]")?.addEventListener("click",()=>{modifierValueEl?.stepUp()}),htmlQuery(customModifierEl,"[data-action=decrement]")?.addEventListener("click",()=>{modifierValueEl?.stepDown()}),htmlQuery(customModifierEl,"[data-action=create-custom-modifier]")?.addEventListener("click",()=>{const modifier=modifierValueEl?.valueAsNumber||1,type=htmlQuery(customModifierEl,".add-modifier-type")?.value??"",label=htmlQuery(customModifierEl,".add-modifier-name")?.value?.trim()??game.i18n.localize(`PF2E.ModifierType.${type}`);if(!setHasElement(MODIFIER_TYPES,type)){ui.notifications.error("Type is required.");return}this.actor.addCustomModifier(stat,label,modifier,type)})}__privateMethod(this,_activateBlastListeners,activateBlastListeners_fn).call(this,actionsPanel);{const tab=html.querySelector(".tab.proficiencies");tab?.querySelector("h3.attacks-defenses")?.querySelector("button[data-action=add-attack-proficiency]")?.addEventListener("click",event=>{ManageAttackProficiencies.add(this.actor,event)});const list=tab?.querySelector("ol.combat-list")??null,links=htmlQueryAll(list,"li.custom a[data-action=remove-attack-proficiency]");for(const link of links)link.addEventListener("click",event=>{ManageAttackProficiencies.remove(this.actor,event)})}$html.find(".hover").tooltipster({trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["right","bottom"],theme:"crb-hover",minWidth:120}),htmlQuery(html,"[data-action=rest]")?.addEventListener("click",event=>{game.pf2e.actions.restForTheNight({event,actors:this.actor})});const castingPanel=htmlQuery(html,".tab[data-tab=spellcasting]"),focusPips=htmlQueryAll(castingPanel,".focus-pool");if(focusPips.length>0){const listener=__name2(event=>{const change=event.type==="click"?1:-1,points=this.actor.system.resources.focus.value+change;this.actor.update({"system.resources.focus.value":points})},"listener");for(const pips of focusPips)pips.addEventListener("click",listener),pips.addEventListener("contextmenu",listener)}const craftingTab=htmlQuery(html,".tab.crafting");for(const element of htmlQueryAll(craftingTab,"li.formula-item")){const quantity=htmlQuery(element,"input[data-action=enter-quantity]");quantity?.addEventListener("change",async()=>{const itemUUID=element.dataset.itemId??"",formula=__privateGet(this,_knownFormulas)[itemUUID],minBatchSize=formula.minimumBatchSize,newValue=Number(quantity.value)||minBatchSize;if(newValue<1)return;const entrySelector=htmlClosest(element,"li.crafting-entry")?.dataset.entrySelector;if(entrySelector){const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");const index=element.dataset.itemIndex;await craftingEntry.setFormulaQuantity(Number(index),itemUUID??"",newValue);return}__privateGet(this,_formulaQuantities)[formula.uuid]=Math.max(newValue,minBatchSize),this.render()});for(const button of htmlQueryAll(element,"[data-action=increase-quantity], [data-action=decrease-quantity]"))button.addEventListener("click",async()=>{if(!quantity)return;const itemUUID=element.dataset.itemId??"",formula=__privateGet(this,_knownFormulas)[itemUUID],minBatchSize=formula.minimumBatchSize,step2=button.dataset.action==="increase-quantity"?minBatchSize:-minBatchSize,newValue=(Number(quantity.value)||step2)+step2;if(newValue<1)return;const entrySelector=htmlClosest(element,"li.crafting-entry")?.dataset.entrySelector;if(entrySelector){const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");const index=element.dataset.itemIndex;await craftingEntry.setFormulaQuantity(Number(index),itemUUID??"",newValue);return}__privateGet(this,_formulaQuantities)[formula.uuid]=Math.max(newValue,minBatchSize),this.render()});const craftButton=htmlQuery(element,"a[data-action=craft-item]");craftButton?.addEventListener("click",async event=>{const{itemUuid,free,prepared}=craftButton.dataset,itemQuantity=Number(quantity?.value)||1,formula=__privateGet(this,_knownFormulas)[itemUuid??""];if(!formula)return;if(prepared==="true"){if(element.dataset.expendedState==="true"){ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.FormulaExpended"));return}const index=element.dataset.itemIndex,entrySelector=htmlClosest(craftButton,"li.crafting-entry")?.dataset.entrySelector;if(!itemUuid||!index||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");await craftingEntry.toggleFormulaExpended(Number(index),itemUuid)}if(this.actor.flags.pf2e.quickAlchemy){const reagentValue=this.actor.system.resources.crafting.infusedReagents.value-1;if(reagentValue<0){ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MissingReagents"));return}return await this.actor.update({"system.resources.crafting.infusedReagents.value":reagentValue},{render:!1}),craftItem(formula.item,1,this.actor,!0)}if(this.actor.flags.pf2e.freeCrafting){const itemId=itemUuid?.split(".").pop()??"";return isSpellConsumable(itemId)&&formula.item.isOfType("consumable")?craftSpellConsumable(formula.item,itemQuantity,this.actor):craftItem(formula.item,itemQuantity,this.actor)}const difficultyClass={value:formula.dc,visible:!0,scope:"check"};craft({difficultyClass,item:formula.item,quantity:itemQuantity,actors:this.actor,event,free:free==="true"})}),htmlQuery(element,"a.formula-delete")?.addEventListener("click",async()=>{const itemUuid=element.dataset.itemId;if(!itemUuid)return;const name2=__privateGet(this,_knownFormulas)[itemUuid]?.name,content=`

${game.i18n.format("PF2E.CraftingTab.RemoveFormulaDialogQuestion",{name:name2})}

`,title=game.i18n.localize("PF2E.CraftingTab.RemoveFormulaDialogTitle");if(await Dialog.confirm({title,content})){const actorFormulas=this.actor.toObject().system.crafting?.formulas??[];actorFormulas.findSplice(f=>f.uuid===itemUuid),this.actor.update({"system.crafting.formulas":actorFormulas})}}),htmlQuery(element,"a.formula-unprepare")?.addEventListener("click",async()=>{const itemUuid=element.dataset.itemId,index=element.dataset.itemIndex,entrySelector=element.dataset.entrySelector;if(!itemUuid||!index||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");const name2=__privateGet(this,_knownFormulas)[itemUuid]?.name,content=`

${game.i18n.format("PF2E.CraftingTab.UnprepareFormulaDialogQuestion",{name:name2})}

`,title=game.i18n.localize("PF2E.CraftingTab.UnprepareFormulaDialogTitle");await Dialog.confirm({title,content})&&await craftingEntry.unprepareFormula(Number(index),itemUuid)})}const $craftingTab=$html.find(".tab.crafting"),$craftingOptions=$craftingTab.find(".crafting-options input:checkbox");$craftingOptions.on("click",async event=>{const flags=[];$craftingOptions.each((_index,element)=>{element!==event.target&&flags.push($(element).attr("flag"))}),flags.forEach(async flag=>{await this.actor.setFlag("pf2e",flag,!1)})}),$craftingTab.find("a[data-action=quick-add]").on("click",async event=>{const{itemUuid}=event.currentTarget.dataset,formula=(await this.actor.getCraftingFormulas()).find(f=>f.uuid===itemUuid);if(!formula)return;const entries=(await this.actor.getCraftingEntries()).filter(e=>!!e.selector&&e.checkEntryRequirements(formula,{warn:!1}));for(const entry of entries)await entry.prepareFormula(formula);entries.length===0&&ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.NoEligibleEntry"))});const $formulas=$craftingTab.find(".craftingEntry-list");$formulas.find(".toggle-formula-expended").on("click",async event=>{const $target=$(event.currentTarget),itemUUID=$target.closest("li.formula-item").attr("data-item-id"),index=$target.closest("li.formula-item").attr("data-item-index"),entrySelector=$target.closest("li.crafting-entry").attr("data-entry-selector");if(!itemUUID||!index||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");await craftingEntry.toggleFormulaExpended(Number(index),itemUUID)}),$formulas.find(".toggle-signature-item").on("click",async event=>{const $target=$(event.currentTarget),itemUUID=$target.closest("li.formula-item").attr("data-item-id"),entrySelector=$target.closest("li.crafting-entry").attr("data-entry-selector");if(!itemUUID||!entrySelector)return;const craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)throw ErrorPF2e("Crafting entry not found");await craftingEntry.toggleSignatureItem(itemUUID)}),$formulas.find(".infused-reagents").on("change",event=>{const change=Number($(event.target).val()),infusedReagents=this.actor.system.resources.crafting.infusedReagents,value=Math.clamped(change,0,infusedReagents?.max??0);this.actor.update({"system.resources.crafting.infusedReagents.value":value})}),$formulas.find(".daily-crafting").on("click",async()=>await this.actor.performDailyCrafting());for(const spellcastingCollectionEl of htmlQueryAll(html,".spellcasting-entry[data-item-id]")){const entry=this.actor.spellcasting.get(spellcastingCollectionEl.dataset.itemId??"");htmlQuery(spellcastingCollectionEl,"[data-action=spell-attack]")?.addEventListener("click",event=>{entry?.statistic?.check.roll(eventToRollParams(event,{type:"check"}))})}PCSheetTabManager.initialize(this.actor,$html.find("a[data-action=manage-tabs]")[0]);for(const link of htmlQueryAll(html,"[data-action=browse-feats]"))link.addEventListener("click",()=>__privateMethod(this,_onClickBrowseFeats,onClickBrowseFeats_fn).call(this,link));htmlQuery(html,".tab[data-tab=biography]")?.addEventListener("click",event=>{const section=htmlClosest(event.target,"a[data-action=toggle-bio-visibility")?.dataset.section;if(tupleHasValue(["appearance","backstory","personality","campaign"],section)){event.stopPropagation();const{biography}=this.actor.system.details,path=`system.details.biography.visibility.${section}`;this.actor.update({[path]:!biography.visibility[section]})}})}activateInventoryListeners(panel){super.activateInventoryListeners(panel),(this.isEditable?htmlQuery(panel,".inventory-pane"):null)?.addEventListener("click",event=>{const link=htmlClosest(event.target,"a[data-action=toggle-invested]"),itemId=htmlClosest(link,".item")?.dataset.itemId;itemId&&this.actor.toggleInvested(itemId)})}toggleInitiativeLink(link){if(link??=htmlQuery(this.element.get(0),".sidebar a[data-action=roll-initiative]"),!link)return;const alreadyRolled=typeof this.actor.combatant?.initiative=="number";if(!!(this.isEditable&&game.combat&&!alreadyRolled))link.classList.remove("disabled"),link.dataset.tooltip="COMBAT.InitiativeRoll";else{link.classList.add("disabled");const reason=this.isEditable?game.combat?alreadyRolled?"AlreadyRolled":null:"NoActiveEncounter":"";reason&&(link.dataset.tooltip=game.i18n.format(`PF2E.Encounter.${reason}`,{actor:this.actor.name}))}}async _onDropItem(event,data){const item=await ItemPF2e.fromDropData(data);if(!item)throw ErrorPF2e("Unable to create item from drop data!");if(this.actor.uuid===item.parent?.uuid)return super._onDropItem(event,data);if(item.isOfType("feat")){const slotData=__privateMethod(this,_getFeatSlotData,getFeatSlotData_fn).call(this,event);return this.actor.feats.insertFeat(item,slotData)}return super._onDropItem(event,data)}async _onDrop(event){const dataString=event.dataTransfer?.getData("text/plain"),dropData=(()=>{try{return JSON.parse(dataString??"")}catch{return null}})();if(dropData)if(isObject(dropData.pf2e)&&dropData.pf2e.type==="CraftingFormula"){const dropEntrySelector=typeof dropData.entrySelector=="string"?dropData.entrySelector:null;if(!dropEntrySelector){const containerEl=htmlClosest(event.target,".item-container");if(containerEl?.dataset.containerType==="craftingEntry"){const entrySelector=containerEl.dataset.entrySelector??"",craftingEntry=await this.actor.getCraftingEntry(entrySelector);if(!craftingEntry)return;const craftingFormulas=await this.actor.getCraftingFormulas(),uuid2=dropData.pf2e.itemUuid,formula=craftingFormulas.find(f=>f.uuid===uuid2);formula&&craftingEntry.prepareFormula(formula);return}}const uuid=dropData.pf2e.itemUuid;if(typeof uuid=="string"){const formula=__privateGet(this,_knownFormulas)[uuid];if(formula){const targetUuid=htmlClosest(event.target,"li.formula-item")?.dataset.itemId??"";return __privateMethod(this,_sortFormulas,sortFormulas_fn).call(this,formula,targetUuid,dropEntrySelector)}}}else return super._onDrop(event)}async _onSortItem(event,itemSource){const item=this.actor.items.get(itemSource._id);if(item?.isOfType("feat")){const featSlot=__privateMethod(this,_getFeatSlotData,getFeatSlotData_fn).call(this,event);if(featSlot){const group=this.actor.feats.get(featSlot.groupId)??null,resorting=item.group===group&&!group?.slotted;if(group?.slotted&&!featSlot.slotId)return[];if(!resorting)return this.actor.feats.insertFeat(item,featSlot)}}return super._onSortItem(event,itemSource)}openTab(name2){["encounter","exploration","downtime"].includes(name2)?(super.openTab("actions"),this._tabs[1].activate(name2)):super.openTab(name2)}};_knownFormulas=new WeakMap,_formulaQuantities=new WeakMap,_prepareAbilities=new WeakSet,prepareAbilities_fn=__name2(function(){const{actor}=this,result={encounter:{action:{label:game.i18n.localize("PF2E.ActionsActionsHeader"),actions:[]},reaction:{label:game.i18n.localize("PF2E.ActionsReactionsHeader"),actions:[]},free:{label:game.i18n.localize("PF2E.ActionsFreeActionsHeader"),actions:[]}},exploration:{active:[],other:[]},downtime:[]};for(const item of actor.items){if(!item.isOfType("action")&&!(item.isOfType("feat")&&item.actionCost)||item.slug==="elemental-blast"&&this.actor.flags.pf2e.kineticist)continue;const img=(()=>{const actionIcon=getActionIcon(item.actionCost),defaultIcon=ItemPF2e.getDefaultArtwork(item._source).img;return item.isOfType("action")&&![actionIcon,defaultIcon].includes(item.img)?item.img:item.system.selfEffect?.img??actionIcon})(),traits=item.system.traits.value,traitDescriptions2=item.isOfType("feat")?CONFIG.PF2E.featTraits:CONFIG.PF2E.actionTraits,action2={...pick$1(item,["id","name","actionCost","frequency"]),img,glyph:getActionGlyph(item.actionCost),traits:createSheetTags(traitDescriptions2,traits),feat:item.isOfType("feat")?item:null,hasEffect:!!item.system.selfEffect};if(traits.includes("exploration")){const active=actor.system.exploration.includes(item.id);action2.exploration={active},(active?result.exploration.active:result.exploration.other).push(action2)}else traits.includes("downtime")?result.downtime.push(action2):result.encounter[item.actionCost?.type??"free"]?.actions.push(action2)}for(const list of["action","reaction","free"])result.encounter[list].actions.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang));return result.exploration.active.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang)),result.exploration.other.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang)),result.downtime.sort((a,b)=>a.name.localeCompare(b.name,game.i18n.lang)),result},"#prepareAbilities"),_prepareCraftingEntries=new WeakSet,prepareCraftingEntries_fn=__name2(async function(formulas){const craftingEntries={dailyCrafting:!1,other:[],alchemical:{entries:[],totalReagentCost:0,infusedReagents:this.actor.system.resources.crafting.infusedReagents}};for(const entry of await this.actor.getCraftingEntries(formulas))entry.isAlchemical?(craftingEntries.alchemical.entries.push(entry),craftingEntries.alchemical.totalReagentCost+=entry.reagentCost||0,craftingEntries.dailyCrafting=!0):(craftingEntries.other.push(entry),entry.isDailyPrep&&(craftingEntries.dailyCrafting=!0));return craftingEntries},"#prepareCraftingEntries"),_getBlastData=new WeakSet,getBlastData_fn=__name2(async function(blast,config){const damageType=config.damageTypes.find(dt=>dt.selected)?.value??"untyped",formulaFor=__name2((outcome,melee=!0)=>blast.damage({element:config.element,damageType,melee,outcome,getFormula:!0}),"formulaFor");return{...config,damageType,formula:{melee:{damage:await formulaFor("success"),critical:await formulaFor("criticalSuccess")},ranged:{damage:await formulaFor("success",!1),critical:await formulaFor("criticalSuccess",!1)}}}},"#getBlastData"),_activateBlastListeners=new WeakSet,activateBlastListeners_fn=__name2(function(panel){const blastList=htmlQuery(panel,"ol.elemental-blasts"),{elementTraits:elementTraits2,damageTypes:damageTypes2}=CONFIG.PF2E,selectors=["roll-attack","roll-damage","set-damage-type"].map(s=>`button[data-action=${s}]`).join(",");blastList?.addEventListener("click",async event=>{const button=htmlClosest(event.target,selectors),blastRow=htmlClosest(button,"li");if(!(button&&blastRow))return;event.stopPropagation();const blast=new ElementalBlast(this.actor),{element}=blastRow.dataset,damageType=button.value||blastRow.dataset.damageType;if(!objectHasKey(elementTraits2,element))throw ErrorPF2e("Unexpected error retrieve element");if(!objectHasKey(damageTypes2,damageType))throw ErrorPF2e("Unexpected error retrieving damage type");const melee=button.dataset.melee==="true";switch(button.dataset.action){case"roll-attack":{const mapIncreases=Math.clamped(Number(button.dataset.mapIncreases)||0,0,2);await blast.attack({mapIncreases,element,damageType,melee,event});break}case"roll-damage":{const outcome=button.dataset.outcome==="success"?"success":"criticalSuccess";await blast.damage({element,damageType,melee,outcome,event});break}case"set-damage-type":blast.setDamageType({element,damageType})}})},"#activateBlastListeners"),_onClickBrowseFeats=new WeakSet,onClickBrowseFeats_fn=__name2(async function(element){const maxLevel=Number(element.dataset.level)||this.actor.level,checkboxesFilterCodes=(element.dataset.filter??"").split(",").filter(s=>!!s).map(s=>s.trim()),featTab=game.pf2e.compendiumBrowser.tabs.feat,filter2=await featTab.getFilterData(),level=filter2.sliders.level;level.values.max=Math.min(maxLevel,level.values.upperLimit),level.isExpanded=level.values.max!==level.values.upperLimit;const{category}=filter2.checkboxes,{traits}=filter2.multiselects;for(const filterCode of checkboxesFilterCodes){const[filterType,...rest]=filterCode.split("-"),value=rest.join("-");if(!(filterType&&value))throw ErrorPF2e(`Invalid filter value for opening the compendium browser: "${filterCode}"`);if(filterType==="category"&&value in category.options)category.isExpanded=!0,category.options[value].selected=!0,category.selected.push(value);else if(filterType==="traits"){const trait=traits.options.find(t=>t.value===value);trait&&traits.selected.push(deepClone(trait))}else filterType==="conjunction"&&(value==="and"||value==="or")&&(filter2.multiselects.traits.conjunction=value)}return featTab.open(filter2)},"#onClickBrowseFeats"),_onChangeAdjustStat=new WeakSet,onChangeAdjustStat_fn=__name2(function(selectElem){const propertyKey=selectElem.dataset.property??"",currentValue=getProperty(this.actor,propertyKey),selectedValue=Number(selectElem.value);if(typeof currentValue!="number"||Number.isNaN(selectedValue))throw ErrorPF2e("Actor property not found");const newValue=Math.clamped(selectedValue,0,4),clone=this.actor.clone({[propertyKey]:newValue},{keepId:!0});newValue!==getProperty(clone,propertyKey)&&(ui.notifications.warn("PF2E.ErrorMessage.MinimumProfLevelSetByFeatures",{localize:!0}),selectElem.value=currentValue.toString())},"#onChangeAdjustStat"),_onChangeAdjustItemStat=new WeakSet,onChangeAdjustItemStat_fn=__name2(async function(event){const $select=$(event.delegateTarget),propertyKey=$select.attr("data-item-property")??"",selectedValue=Number($select.val()),itemId=$select.closest(".item").attr("data-item-id")??"",item=this.actor.items.get(itemId);if(!item)throw ErrorPF2e("Item not found");const newValue=(()=>{if(item.isOfType("spellcastingEntry"))return{"system.proficiency.value":()=>Math.clamped(selectedValue,0,4)}[propertyKey]?.();if(item.isOfType("lore"))return Math.clamped(selectedValue,0,4);throw ErrorPF2e("Item not recognized")})();typeof newValue=="number"&&await item.update({[propertyKey]:newValue}),newValue!==getProperty(item,propertyKey)&&ui.notifications.warn(game.i18n.localize("PF2E.ErrorMessage.MinimumProfLevelSetByFeatures"))},"#onChangeAdjustItemStat"),_onClickAdjustItemStat=new WeakSet,onClickAdjustItemStat_fn=__name2(async function(event){const $button=$(event.delegateTarget),itemId=$button.closest(".item").attr("data-item-id")??"",item=this.actor.items.get(itemId);if(!item)throw ErrorPF2e("Item not found");const propertyKey=$button.attr("data-item-property")??"",change=event.type==="click"?1:-1,newValue=(()=>{if(item.isOfType("spellcastingEntry")){const proficiencyRank=item.system.proficiency.value;return{"system.proficiency.value":()=>Math.clamped(proficiencyRank+change,0,4)}[propertyKey]?.()}else if(item.isOfType("lore")){const currentRank=item.system.proficient.value;return Math.clamped(currentRank+change,0,4)}else throw ErrorPF2e("Item not recognized")})();typeof newValue=="number"&&await item.update({[propertyKey]:newValue})},"#onClickAdjustItemStat"),_getFeatSlotData=new WeakSet,getFeatSlotData_fn=__name2(function(event){const groupId=htmlClosest(event.target,"[data-group-id]")?.dataset.groupId,slotId=htmlClosest(event.target,"[data-slot-id]")?.dataset.slotId||null;return groupId?{groupId,slotId}:null},"#getFeatSlotData"),_sortFormulas=new WeakSet,sortFormulas_fn=__name2(async function(sourceFormula,targetUuid,entrySelector){if(!UUIDUtils.isItemUUID(targetUuid)||sourceFormula.uuid===targetUuid)return;const sourceLevel=sourceFormula.level,targetLevel=__privateGet(this,_knownFormulas)[targetUuid].level;if(!entrySelector&&sourceLevel!==targetLevel)return;const performSort=__name2(async(formulas2,source2,target2,siblings)=>{const results=SortingHelpers.performIntegerSort(source2,{target:target2,siblings});if(results.length){for(const result of results){const formula=formulas2.find(f=>f===result.target);formula&&(formula.sort=result.update.sort)}entrySelector?await(await this.actor.getCraftingEntry(entrySelector))?.updateFormulas(formulas2):await this.actor.update({"system.crafting.formulas":formulas2})}},"performSort");if(entrySelector){const entry=await this.actor.getCraftingEntry(entrySelector);if(!entry)throw ErrorPF2e(`Crafting entry "${entrySelector}" doesn't exist!`);const formulas2=deepClone(entry.preparedFormulaData),source2=formulas2.find(f=>f.itemUUID===sourceFormula.uuid),target2=formulas2.find(f=>f.itemUUID===targetUuid);if(source2&&target2){const siblings=formulas2.filter(f=>f.itemUUID!==source2.itemUUID);return performSort(formulas2,source2,target2,siblings)}}const formulas=this.actor.toObject().system.crafting?.formulas??[],source=formulas.find(f=>f.uuid===sourceFormula.uuid),target=formulas.find(f=>f.uuid===targetUuid);if(source&&target){const siblings=formulas.filter(f=>f.uuid!==source.uuid);return performSort(formulas,source,target,siblings)}},"#sortFormulas"),__name2(_CharacterSheetPF2e,"CharacterSheetPF2e");let CharacterSheetPF2e=_CharacterSheetPF2e;const _AttackPopout=class extends CharacterSheetPF2e{static{__name(this,"_AttackPopout")}constructor(object,options){if(super(object,options),__publicField(this,"type","strike"),__privateAdd(this,_strikeItemId,""),__privateAdd(this,_strikeSlug,""),__privateAdd(this,_strike,void 0),__privateAdd(this,_elementTrait,void 0),__privateAdd(this,_blasts,[]),!options.type)throw ErrorPF2e('AttackPopout is missing mandatory "type" option.');if(options.type==="blast"){if(!options.elementTrait)throw ErrorPF2e('AttackPopout of type "blast" is missing mandatory "elementalTrait" option.');__privateSet(this,_elementTrait,options.elementTrait)}else{if(!options.strikeSlug)throw ErrorPF2e('AttackPopout of type "strike" is missing mandatory "strikeSlug" option.');if(!options.strikeItemId)throw ErrorPF2e('AttackPopout of type "strike" is missing mandatory "strikeItemId" option.');__privateSet(this,_strikeSlug,options.strikeSlug),__privateSet(this,_strikeItemId,options.strikeItemId)}this.type=options.type}get template(){return"systems/pf2e/templates/actors/character/attack-popout.hbs"}get id(){const id=super.id;return this.type==="strike"?`${id}-strike-${__privateGet(this,_strikeItemId)}-${__privateGet(this,_strikeSlug)}`:`${id}-blast-${__privateGet(this,_elementTrait)}`}static get defaultOptions(){return{...super.defaultOptions,submitOnChange:!1,submitOnClose:!1,width:480,height:"auto",resizable:!1}}get label(){return this.type==="blast"?__privateGet(this,_blasts).at(0)?.label??null:__privateGet(this,_strike)?.label??null}async getData(options){const base=await super.getData(options);return this.type==="blast"?(base.elementalBlasts=__privateSet(this,_blasts,base.elementalBlasts.filter(b=>b.element===__privateGet(this,_elementTrait))),base.data.actions=[],base.toggles=base.toggles.filter(t=>t.domain==="elemental-blast")):(base.elementalBlasts=[],__privateGet(this,_strikeSlug)&&__privateGet(this,_strikeItemId)&&__privateSet(this,_strike,base.data.actions.find(a=>a.item.id===__privateGet(this,_strikeItemId)&&a.slug===__privateGet(this,_strikeSlug)))),{...base,strike:__privateGet(this,_strike),strikeIndex:base.data.actions.findIndex(a=>a===__privateGet(this,_strike)),popoutType:this.type}}activateListeners($html){super.activateListeners($html);const html=$html[0],{label}=this;if(label){const title=htmlQuery(htmlClosest(html,"div.window-app"),"h4.window-title");title&&(title.innerHTML=game.i18n.localize(label))}}_getHeaderButtons(){return super._getHeaderButtons().filter(b=>b.label==="Close")}};_strikeItemId=new WeakMap,_strikeSlug=new WeakMap,_strike=new WeakMap,_elementTrait=new WeakMap,_blasts=new WeakMap,__name2(_AttackPopout,"AttackPopout");let AttackPopout=_AttackPopout;const _MacroPF2e=class extends Macro{static{__name(this,"_MacroPF2e")}get visible(){return this.permission>=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER}};__name2(_MacroPF2e,"MacroPF2e");let MacroPF2e=_MacroPF2e;async function rollItemMacro(itemId){const speaker=ChatMessage.getSpeaker(),item=(canvas.tokens.get(speaker.token??"")?.actor??game.actors.get(speaker.actor??""))?.items?.get(itemId);if(!item){ui.notifications.warn(`Your controlled Actor does not have an item with ID ${itemId}`);return}return item.isOfType("action","feat")&&item.system.selfEffect?createSelfEffectMessage(item):item.toChat()}__name(rollItemMacro,"rollItemMacro"),__name2(rollItemMacro,"rollItemMacro");async function createActionMacro({actorUUID,actionIndex,elementTrait,slot}){const actor=resolveMacroActor(actorUUID);if(!actor?.isOfType("character","npc"))return;const data=(()=>{if(actor.isOfType("character")&&objectHasKey(CONFIG.PF2E.elementTraits,elementTrait)){const config=new ElementalBlast(actor).configs.find(c=>c.element===elementTrait);return config?{name:game.i18n.localize(config.label),command:`game.pf2e.rollActionMacro({ actorUUID: "${actorUUID}", type: "blast", elementTrait: "${elementTrait}" })`,img:config.img}:null}else if(actionIndex!==void 0){const action2=actor.system.actions[actionIndex];return action2?{name:`${game.i18n.localize("PF2E.WeaponStrikeLabel")}: ${action2.label}`,command:`game.pf2e.rollActionMacro({ actorUUID: "${actorUUID}", type: "strike", itemId: "${action2.item.id}", slug: "${action2.slug}" })`,img:action2.item.img}:null}return null})();if(!data)return;const actionMacro=game.macros.find(macro=>macro.name===data.name&¯o.command===data.command)??await MacroPF2e.create({command:data.command,name:data.name,type:"script",img:data.img,flags:{pf2e:{actionMacro:!0}}},{renderSheet:!1});game.user.assignHotbarMacro(actionMacro??null,slot)}__name(createActionMacro,"createActionMacro"),__name2(createActionMacro,"createActionMacro");async function rollActionMacro({actorUUID,itemId,elementTrait,slug,type}){const actor=resolveMacroActor(actorUUID);if(!actor?.isOfType("character","npc")){ui.notifications.error("PF2E.MacroActionNoActorError",{localize:!0});return}const strikes=actor.system.actions,strike=strikes.find(s=>s.item.id===itemId&&s.slug===slug)??strikes.find(s=>s.slug===slug);if(actor.isOfType("character")){const closedExisting=__name2(partialId=>{const appId=`AttackPopout-Actor-${actor.id}-${partialId}`,existing=Object.values(actor.apps).find(a=>a?.id===appId);return existing?(existing.close({force:!0}),!0):!1},"closedExisting");switch(type){case"blast":{if(closedExisting(`blast-${elementTrait}`))return;if(!actor.itemTypes.effect.find(e=>e.slug==="effect-kinetic-aura")){ui.notifications.error("PF2E.MacroActionNoActionError",{localize:!0});return}new AttackPopout(actor,{type,elementTrait}).render(!0);return}case"strike":{if(closedExisting(`strike-${itemId}-${slug}`))return;if(!strike){ui.notifications.error("PF2E.MacroActionNoActionError",{localize:!0});return}new AttackPopout(actor,{type,strikeItemId:itemId,strikeSlug:slug}).render(!0);return}}}if(!strike){ui.notifications.error("PF2E.MacroActionNoActionError",{localize:!0});return}const meleeOrRanged=strike.item.isMelee?"melee":"ranged",identifier=`${strike.item.id}.${strike.slug}.${meleeOrRanged}`,description=await TextEditor.enrichHTML(game.i18n.localize(strike.description),{async:!0}),templateData={actor,strike,identifier,description},content=await renderTemplate("systems/pf2e/templates/chat/strike-card.hbs",templateData),token=actor.token??actor.getActiveTokens(!0,!0).shift()??null,chatData={speaker:ChatMessagePF2e.getSpeaker({actor,token}),content,type:CONST.CHAT_MESSAGE_TYPES.OTHER},rollMode=game.settings.get("core","rollMode");return["gmroll","blindroll"].includes(rollMode)&&(chatData.whisper=ChatMessage.getWhisperRecipients("GM").map(u=>u.id)),rollMode==="blindroll"&&(chatData.blind=!0),ChatMessagePF2e.create(chatData)}__name(rollActionMacro,"rollActionMacro"),__name2(rollActionMacro,"rollActionMacro");async function createSkillMacro(skill,skillName,actorId,slot){const dictName=SKILL_DICTIONARY[skill]??skill,command=` const a = game.actors.get("${actorId}"); if (a) { const opts = a.getRollOptions(["all", "skill-check", "${dictName}"]); @@ -94,8 +94,8 @@ if (item?.type === "condition") { } else { ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.ItemNotFoundByUUID", { uuid: ITEM_UUID })); } -`,toggleMacro=game.macros.contents.find(macro=>macro.name===effect.name&¯o.command===command)??await MacroPF2e.create({command,name:effect.name,type:"script",img:effect.img},{renderSheet:!1});game.user.assignHotbarMacro(toggleMacro??null,slot)}__name(createToggleEffectMacro,"createToggleEffectMacro"),__name2(createToggleEffectMacro,"createToggleEffectMacro");function resolveMacroActor(uuid){if(uuid){const actor=fromUuidSync(uuid);return actor instanceof ActorPF2e?actor:null}const speaker=ChatMessage.getSpeaker();return canvas.tokens.get(speaker.token??"")?.actor??game.actors.get(speaker.actor??"")??null}__name(resolveMacroActor,"resolveMacroActor"),__name2(resolveMacroActor,"resolveMacroActor");async function perceptionForSelected(event){const actors=canvas.tokens.controlled.flatMap(t=>t.actor??[]).filter(a=>!!a.isOfType("creature"));if(actors.length===0){ui.notifications.error("You must select at least one PC/NPC token.");return}const argsFromEvent=eventToRollParams(event);for(const actor of actors)await actor.perception.roll({...argsFromEvent,traits:["secret"]})}__name(perceptionForSelected,"perceptionForSelected"),__name2(perceptionForSelected,"perceptionForSelected");const ITEM_UUID="Compendium.pf2e.equipment-effects.Item.2YgXoHvJfrDHucMr",TEMPLATES={flavor:"./systems/pf2e/templates/chat/action/flavor.hbs",content:"./systems/pf2e/templates/chat/action/content.hbs"};async function raiseAShield(options){const localize=localizer("PF2E.Actions.RaiseAShield"),actors=Array.isArray(options.actors)?options.actors:[options.actors],actor=actors[0];if(actors.length>1||!(actor&&["character","npc"].includes(actor.type))){ui.notifications.error(localize("BadArgs"));return}const shield=actor.heldShield,speaker=ChatMessagePF2e.getSpeaker({actor});if(await(async()=>{const existingEffect=actor.itemTypes.effect.find(e=>e.flags.core?.sourceId===ITEM_UUID);if(existingEffect)return await existingEffect.delete(),!1;if(shield?.isDestroyed)return ui.notifications.warn(localize("ShieldIsDestroyed",{actor:speaker.alias,shield:shield.name})),!1;if(shield?.isBroken===!1){const effect=await fromUuid(ITEM_UUID);if(!(effect instanceof EffectPF2e))throw ErrorPF2e("Raise a Shield effect not found");return await actor.createEmbeddedDocuments("Item",[effect.toObject()]),!0}else return shield?.isBroken?(ui.notifications.warn(localize("ShieldIsBroken",{actor:speaker.alias,shield:shield.name})),!1):(ui.notifications.warn(localize("NoShieldEquipped",{actor:speaker.alias})),!1)})()){const combatActor=game.combat?.started&&game.combat.combatant?.actor||null,[actionType,costSymbol]=combatActor&&combatActor!==actor?["Reaction","R"]:["SingleAction","1"],content=await renderTemplate(TEMPLATES.content,{imgPath:shield.img,message:localize("Content",{actor:speaker.alias})}),flavor=await renderTemplate(TEMPLATES.flavor,{action:{title:localize(`${actionType}Title`),glyph:getActionGlyph(costSymbol)}});await ChatMessagePF2e.create({type:CONST.CHAT_MESSAGE_TYPES.EMOTE,speaker,flavor,content})}}__name(raiseAShield,"raiseAShield"),__name2(raiseAShield,"raiseAShield");async function restForTheNight(options){const actors=Array.isArray(options.actors)?options.actors:[options.actors],characters=actors.filter(a=>a?.type==="character");if(actors.length===0)return ui.notifications.error(game.i18n.localize("PF2E.ErrorMessage.NoPCTokenSelected")),[];const localize=localizer("PF2E.Action.RestForTheNight"),promptMessage=(()=>{const element=document.createElement("p");return element.innerText=localize("Prompt"),element.outerHTML})();if(!options.skipDialog&&!await Dialog.confirm({title:localize("Label"),content:promptMessage,defaultYes:!0}))return[];const messages=[];for(const actor of characters){const actorUpdates={attributes:{hp:{value:actor._source.system.attributes.hp.value}},resources:{}},itemUpdates=[],statements=[],{abilities:abilities2,attributes,hitPoints,level}=actor,conModifier=abilities2.con.mod,maxRestored=Math.max(conModifier,1)*level*hitPoints.recoveryMultiplier+hitPoints.recoveryAddend,hpLost=attributes.hp.max-attributes.hp.value,hpRestored=hpLost>=maxRestored?maxRestored:hpLost;if(hpRestored>0){const singularOrPlural=hpRestored===1?"PF2E.Action.RestForTheNight.Message.HitPointsSingle":"PF2E.Action.RestForTheNight.Message.HitPoints";actorUpdates.attributes.hp={value:attributes.hp.value+=hpRestored},statements.push(game.i18n.format(singularOrPlural,{hitPoints:hpRestored}))}const RECOVERABLE_CONDITIONS=["doomed","drained","fatigued","wounded"],conditionChanges={doomed:null,drained:null,fatigued:null,wounded:null};actor.hasCondition("fatigued")&&(await actor.decreaseCondition("fatigued"),conditionChanges.fatigued="removed");for(const slug of["doomed","drained"]){const condition=actor.getCondition(slug);if(!condition)continue;const newValue=(condition.value??1)-1;await actor.decreaseCondition(slug),conditionChanges[slug]=newValue===0?"removed":"reduced"}actor.hasCondition("wounded")&&attributes.hp.value===attributes.hp.max&&(await actor.decreaseCondition("wounded",{forceRemove:!0}),conditionChanges.wounded="removed");const wands=actor.itemTypes.consumable.filter(i=>i.category==="wand"&&i.uses.value({_id:wand.id,"system.charges.value":wand.uses.max})));const wandRecharged=itemUpdates.length>0,resources=actor.system.resources,reagents=resources.crafting.infusedReagents;reagents&&reagents.valuea.frequency&&(tupleHasValue(["turn","round","day"],a.frequency.per)||Duration.fromISO(a.frequency.per)<=Duration.fromISO("PT8H"))&&a.frequency.value({_id:a.id,"system.frequency.value":a.frequency.max})))),game.settings.get("pf2e","staminaVariant")){const stamina=attributes.hp.sp??{value:0,max:0},resolve=resources.resolve??{value:0,max:0};stamina.valuei.isTemporary).map(i=>i.id),hasActorUpdates=Object.keys({...actorUpdates.attributes,...actorUpdates.resources}).length>0,hasItemUpdates=itemUpdates.length>0,removeTempItems=temporaryItems.length>0;hasActorUpdates&&await actor.update({system:actorUpdates},{render:!1}),hasItemUpdates&&await actor.updateEmbeddedDocuments("Item",itemUpdates,{render:!1}),removeTempItems&&(await actor.deleteEmbeddedDocuments("Item",temporaryItems,{render:!1}),statements.push(localize("Message.TemporaryItems"))),spellcastingRecharge.actorUpdates&&statements.push(localize("Message.FocusPoints")),spellcastingRecharge.itemUpdates.length>0&&statements.push(localize("Message.SpellSlots")),wandRecharged&&statements.push(localize("Message.WandsCharges"));const reducedConditions=RECOVERABLE_CONDITIONS.filter(c=>conditionChanges[c]==="reduced");for(const slug of reducedConditions){const{name:name2}=game.pf2e.ConditionManager.getCondition(slug);statements.push(localize("Message.ConditionReduced",{condition:name2}))}const removedConditions=RECOVERABLE_CONDITIONS.filter(c=>conditionChanges[c]==="removed");for(const slug of removedConditions){const{name:name2}=game.pf2e.ConditionManager.getCondition(slug);statements.push(localize("Message.ConditionRemoved",{condition:name2}))}const actorAwakens=localize("Message.Awakens",{actor:actor.name}),recoveryList=document.createElement("ul");recoveryList.append(...statements.map(statement=>{const listItem=document.createElement("li");return listItem.innerText=statement,listItem}));const content=[actorAwakens,recoveryList.outerHTML].join(` -`);messages.push({user:game.user.id,content,speaker:{alias:actor.name}}),await actor.sheet.render(),Hooks.callAll("pf2e.restForTheNight",actor)}return ChatMessagePF2e.createDocuments(messages)}__name(restForTheNight,"restForTheNight"),__name2(restForTheNight,"restForTheNight");async function stealthForSelected(event){const actors=canvas.tokens.controlled.flatMap(t=>t.actor??[]).filter(a=>!!a.isOfType("creature"));if(actors.length===0){ui.notifications.error("You must select at least one PC/NPC token.");return}const argsFromEvent=eventToRollParams(event);for(const actor of actors)await actor.skills.stealth.roll({...argsFromEvent,traits:["secret"]})}__name(stealthForSelected,"stealthForSelected"),__name2(stealthForSelected,"stealthForSelected");function steelYourResolve(options){const localize=localizer("PF2E.Actions.SteelYourResolve"),actors=Array.isArray(options.actors)?options.actors:[options.actors],actor=actors[0];if(actors.length>1||!(actor instanceof CharacterPF2e)){ui.notifications.error(localize("BadArgs"));return}const toChat=__name2((alias,content)=>{ChatMessage.create({user:game.user.id,content,speaker:{alias}})},"toChat");if(!game.settings.get("pf2e","staminaVariant")){ui.notifications.error(localize("StaminaNotEnabled"));return}Dialog.confirm({title:localize("Title"),content:localize("Content"),yes:()=>{const sp=actor.system.attributes.hp.sp??{value:0,max:0},resolve=actor.system.resources.resolve??{value:0,max:0},spRatio=`${sp.value}/${sp.max}`,recoverStamina=localize("RecoverStamina",{name:actor.name,ratio:spRatio}),noStamina=localize("NoStamina",{name:actor.name});if(resolve.value>0){toChat(actor.name,recoverStamina);const newSP=sp.value+Math.floor(sp.max/2);actor.update({"system.attributes.hp.sp.value":Math.min(newSP,sp.max),"system.resources.resolve.value":resolve.value-1})}else toChat(actor.name,noStamina)},defaultYes:!0})}__name(steelYourResolve,"steelYourResolve"),__name2(steelYourResolve,"steelYourResolve");function takeABreather(){let applyChanges=!1;const pcs=uniq(compact([game.user.character,canvas.tokens.controlled.map(t=>t.actor)].flat())).filter(a=>a.isOfType("character"));if(game.settings.get("pf2e","staminaVariant")){if(pcs.length===0){ui.notifications.error("PF2E.ErrorMessage.NoPCTokenSelected",{localize:!0});return}}else return;new Dialog({title:"Take a Breather",content:"
Rest for 10 minutes, spend a resolve point, and regain stamina?
",buttons:{yes:{icon:fontAwesomeIcon("check").outerHTML,label:"Take a Breather",callback:()=>{applyChanges=!0}},no:{icon:fontAwesomeIcon("times").outerHTML,label:"Cancel"}},default:"yes",close:()=>{if(applyChanges)for(const actor of pcs){const token=actor.getActiveTokens(!0,!0).shift(),name2=token?.name??actor.name,sp=actor.system.attributes.hp.sp,resolve=actor.system.resources.resolve;if(!(sp&&resolve))continue;const speaker=ChatMessagePF2e.getSpeaker({token,actor});resolve.value>0?(actor.update({"system.attributes.hp.sp.value":sp.max,"system.resources.resolve.value":resolve.value-1}),ChatMessagePF2e.create({speaker,content:`${name2} has ${sp.value}/${sp.max} SP and spends a resolve point, taking a 10 minute breather. Stamina refreshed.`})):ChatMessagePF2e.create({speaker,content:`${name2} is tired and needs to go to bed! No resolve points remaining.`})}}}).render(!0)}__name(takeABreather,"takeABreather"),__name2(takeABreather,"takeABreather");var ExplorationActivities=(ExplorationActivities2=>(ExplorationActivities2[ExplorationActivities2.NONE=0]="NONE",ExplorationActivities2[ExplorationActivities2.HALF_SPEED=1]="HALF_SPEED",ExplorationActivities2[ExplorationActivities2.AVOID_NOTICE=2]="AVOID_NOTICE",ExplorationActivities2[ExplorationActivities2.DEFEND=3]="DEFEND",ExplorationActivities2[ExplorationActivities2.DETECT_MAGIC=4]="DETECT_MAGIC",ExplorationActivities2[ExplorationActivities2.SCOUT=5]="SCOUT",ExplorationActivities2[ExplorationActivities2.SEARCH=6]="SEARCH",ExplorationActivities2))(ExplorationActivities||{}),DetectionMode$1=(DetectionMode2=>(DetectionMode2[DetectionMode2.NONE=0]="NONE",DetectionMode2[DetectionMode2.DETECT_EVERYTHING=1]="DETECT_EVERYTHING",DetectionMode2[DetectionMode2.DETECT_BEFORE_WALKING_INTO_IT=2]="DETECT_BEFORE_WALKING_INTO_IT",DetectionMode2))(DetectionMode$1||{});function sneaksAtFullSpeed(activity,explorationOptions){return activity===2&&(explorationOptions.legendarySneak||explorationOptions.swiftSneak)}__name(sneaksAtFullSpeed,"sneaksAtFullSpeed"),__name2(sneaksAtFullSpeed,"sneaksAtFullSpeed");function defendsAtFullSpeed(activity,explorationOptions){return activity===3&&explorationOptions.practicedDefender}__name(defendsAtFullSpeed,"defendsAtFullSpeed"),__name2(defendsAtFullSpeed,"defendsAtFullSpeed");function calculateNormalizedCharacterSpeed(defaultSpeedInFeet,activity,detectionMode,explorationOptions){return Math.max(5,calculateCharacterSpeed(defaultSpeedInFeet,activity,detectionMode,explorationOptions))}__name(calculateNormalizedCharacterSpeed,"calculateNormalizedCharacterSpeed"),__name2(calculateNormalizedCharacterSpeed,"calculateNormalizedCharacterSpeed");function calculateCharacterSpeed(defaultSpeedInFeet,activity,detectionMode,explorationOptions){const halvedSpeed=defaultSpeedInFeet/2;if(sneaksAtFullSpeed(activity,explorationOptions)||defendsAtFullSpeed(activity,explorationOptions))return defaultSpeedInFeet;if(activity===6){let searchSpeedFactor=1;return explorationOptions.expeditiousSearchLegendary?searchSpeedFactor=4:explorationOptions.expeditiousSearch&&(searchSpeedFactor=2),detectionMode===1?Math.min(halvedSpeed,searchSpeedFactor*30):detectionMode===2?Math.min(halvedSpeed,searchSpeedFactor*15):halvedSpeed}else return activity===4?detectionMode===1?Math.min(halvedSpeed,30):detectionMode===2?Math.min(halvedSpeed,15):halvedSpeed:activity===0?defaultSpeedInFeet:halvedSpeed}__name(calculateCharacterSpeed,"calculateCharacterSpeed"),__name2(calculateCharacterSpeed,"calculateCharacterSpeed");var LengthUnit=(LengthUnit2=>(LengthUnit2[LengthUnit2.MILES=0]="MILES",LengthUnit2[LengthUnit2.FEET=1]="FEET",LengthUnit2))(LengthUnit||{});const golarionMileInFeet=6e3;function toFeet(distance){return distance.unit===0?distance.value*golarionMileInFeet:distance.value}__name(toFeet,"toFeet"),__name2(toFeet,"toFeet");function speedToVelocity(speedInFeet){return{distance:{unit:1,value:speedInFeet*10},time:0}}__name(speedToVelocity,"speedToVelocity"),__name2(speedToVelocity,"speedToVelocity");function toFeetPerMinute(velocity){return velocity.time===0?toFeet(velocity.distance):toFeetPerMinute({distance:{unit:velocity.distance.unit,value:velocity.distance.value/60},time:0})}__name(toFeetPerMinute,"toFeetPerMinute"),__name2(toFeetPerMinute,"toFeetPerMinute");var Terrain=(Terrain2=>(Terrain2[Terrain2.NORMAL=0]="NORMAL",Terrain2[Terrain2.DIFFICULT=1]="DIFFICULT",Terrain2[Terrain2.GREATER_DIFFICULT=2]="GREATER_DIFFICULT",Terrain2))(Terrain||{});function increaseDistanceByTerrain(trip2){const feet=toFeet(trip2.distance);return trip2.terrain===1?feet*trip2.terrainSlowdown.difficult.numerator/trip2.terrainSlowdown.difficult.denominator:trip2.terrain===2?feet*trip2.terrainSlowdown.greaterDifficult.numerator/trip2.terrainSlowdown.greaterDifficult.denominator:feet*trip2.terrainSlowdown.normal.numerator/trip2.terrainSlowdown.normal.denominator}__name(increaseDistanceByTerrain,"increaseDistanceByTerrain"),__name2(increaseDistanceByTerrain,"increaseDistanceByTerrain");const minutesPerHour=60,daysPerWeek=7;function toTravelDuration({distanceInFeet,feetPerMinute,hustleDurationInMinutes,hoursPerDay=8}){const minutesPerDay=hoursPerDay*minutesPerHour,minutesPerWeek=minutesPerDay*daysPerWeek,hustleDuration=Math.min(hustleDurationInMinutes,minutesPerDay),normalTravelDuration=minutesPerDay-hustleDuration,averageSpeed=(feetPerMinute*2*hustleDuration+feetPerMinute*normalTravelDuration)/minutesPerDay,totalMinutes=Math.round(distanceInFeet/averageSpeed),weeks=Math.floor(totalMinutes/minutesPerWeek),days=Math.floor((totalMinutes-weeks*minutesPerWeek)/minutesPerDay),remainingMinutesMovingAtDoubleSpeed=(distanceInFeet-weeks*minutesPerWeek*averageSpeed-days*minutesPerDay*averageSpeed)/(feetPerMinute*2),remainingMinutesSpentHustling=Math.min(remainingMinutesMovingAtDoubleSpeed,hustleDurationInMinutes)+Math.max(0,remainingMinutesMovingAtDoubleSpeed-hustleDurationInMinutes)*2,hours=Math.floor(remainingMinutesSpentHustling/minutesPerHour),minutes=Math.round(remainingMinutesSpentHustling-hours*minutesPerHour);return{weeks,days,hours,minutes}}__name(toTravelDuration,"toTravelDuration"),__name2(toTravelDuration,"toTravelDuration");function calculateTravelDuration({journey,velocity,hustleDurationInMinutes=0,hoursPerDay=8}){const distanceInFeet=sum(journey.map(increaseDistanceByTerrain)),feetPerMinute=toFeetPerMinute(velocity);return toTravelDuration({distanceInFeet,feetPerMinute,hustleDurationInMinutes,hoursPerDay})}__name(calculateTravelDuration,"calculateTravelDuration"),__name2(calculateTravelDuration,"calculateTravelDuration");const _TravelSpeedSheet=class extends FormApplication{static{__name(this,"_TravelSpeedSheet")}formData=void 0;static get defaultOptions(){const options=super.defaultOptions;return options.id="travel-duration",options.classes=["travel-duration"],options.title=game.i18n.localize("PF2E.TravelSpeed.Title"),options.template="systems/pf2e/templates/gm/travel/travel-speed-sheet.hbs",options.width="auto",options.submitOnChange=!0,options.closeOnSubmit=!1,options}async _updateObject(_event,formData){const data=expandObject(formData);data.actors=toArray(data.actors),this.formData=data,this.render(!0)}actorFormToSheetData(actor,data){return{requiresDetectionMode:data.explorationActivity==="Search"||data.explorationActivity==="DetectMagic",detectionMode:data.detectionMode,explorationActivity:data.explorationActivity,explorationSpeed:parseFloat(calculateNormalizedCharacterSpeed(data.speed,parseExplorationActivity(data.explorationActivity),parseDetectionModeData(data.detectionMode),parseExplorationOptions(actor)).toFixed(2)),speed:data.speed,name:actor.name}}getInitialActorData(actor){return this.actorFormToSheetData(actor,{detectionMode:"before",explorationActivity:"Search",speed:actor.system.attributes.speed.total})}formToSheetData(actors,data){const journey=[{terrainSlowdown:{difficult:data.difficultTerrainSlowdown,greaterDifficult:data.greaterDifficultTerrainSlowdown,normal:data.normalTerrainSlowdown},terrain:parseTerrainData(data.terrain),distance:{value:data.distance,unit:parseDistanceUnit(data.distanceUnit)}}],actorFormData=zip(actors,data.actors,(actor,actorData)=>this.actorFormToSheetData(actor,actorData)),partySpeedInFeet=Math.min(...actorFormData.map(data2=>data2.explorationSpeed)),velocity=speedToVelocity(partySpeedInFeet);return{travelDuration:calculateTravelDuration({journey,hoursPerDay:data.hoursPerDay,velocity,hustleDurationInMinutes:data.hustleMinutes}),distance:data.distance,actors:actorFormData,normalTerrainSlowdown:data.normalTerrainSlowdown,difficultTerrainSlowdown:data.difficultTerrainSlowdown,greaterDifficultTerrainSlowdown:data.greaterDifficultTerrainSlowdown,distanceUnit:data.distanceUnit,terrain:data.terrain,partySpeedInFeet,hustleMinutes:data.hustleMinutes,hoursPerDay:data.hoursPerDay}}getInitialFormData(actors){return this.formToSheetData(actors,{actors:actors.map(actor=>this.getInitialActorData(actor)),terrain:"normal",distanceUnit:"miles",normalTerrainSlowdown:{denominator:1,numerator:1},difficultTerrainSlowdown:{denominator:1,numerator:2},greaterDifficultTerrainSlowdown:{denominator:1,numerator:3},distance:1,hustleMinutes:getHustleMinutes(actors),hoursPerDay:8})}getData(){const sheetData=super.getData();let data;return this.formData===void 0?data=this.getInitialFormData(this.options.actors):data=this.formToSheetData(this.options.actors,this.formData),Object.assign(sheetData,data),sheetData}};__name2(_TravelSpeedSheet,"TravelSpeedSheet");let TravelSpeedSheet=_TravelSpeedSheet;function parseDistanceUnit(unit){return unit==="feet"?LengthUnit.FEET:LengthUnit.MILES}__name(parseDistanceUnit,"parseDistanceUnit"),__name2(parseDistanceUnit,"parseDistanceUnit");function parseTerrainData(terrain){return terrain==="normal"?Terrain.NORMAL:terrain==="difficult"?Terrain.DIFFICULT:Terrain.GREATER_DIFFICULT}__name(parseTerrainData,"parseTerrainData"),__name2(parseTerrainData,"parseTerrainData");function parseDetectionModeData(detectionMode){return detectionMode==="none"?DetectionMode$1.NONE:detectionMode==="before"?DetectionMode$1.DETECT_BEFORE_WALKING_INTO_IT:DetectionMode$1.DETECT_EVERYTHING}__name(parseDetectionModeData,"parseDetectionModeData"),__name2(parseDetectionModeData,"parseDetectionModeData");function parseExplorationActivity(activity){return activity==="AvoidNotice"?ExplorationActivities.AVOID_NOTICE:activity==="Defend"?ExplorationActivities.DEFEND:activity==="DetectMagic"?ExplorationActivities.DETECT_MAGIC:activity==="Scout"?ExplorationActivities.SCOUT:activity==="Search"?ExplorationActivities.SEARCH:activity==="None"?ExplorationActivities.NONE:ExplorationActivities.HALF_SPEED}__name(parseExplorationActivity,"parseExplorationActivity"),__name2(parseExplorationActivity,"parseExplorationActivity");function getHustleMinutes(actors){return Math.min(...actors.map(actor=>Math.max(1,actor.system.abilities.con.mod)*10))}__name(getHustleMinutes,"getHustleMinutes"),__name2(getHustleMinutes,"getHustleMinutes");function hasFeat(actor,slug){return actor.itemTypes.feat.some(feat=>feat.slug===slug)}__name(hasFeat,"hasFeat"),__name2(hasFeat,"hasFeat");function parseExplorationOptions(actor){return{practicedDefender:hasFeat(actor,"practiced-defender"),swiftSneak:hasFeat(actor,"swift-sneak"),legendarySneak:hasFeat(actor,"legendary-sneak"),expeditiousSearch:hasFeat(actor,"expeditious-search"),expeditiousSearchLegendary:hasFeat(actor,"expeditious-search")&&actor.attributes.perception.rank===4}}__name(parseExplorationOptions,"parseExplorationOptions"),__name2(parseExplorationOptions,"parseExplorationOptions");function toArray(data){return Object.entries(data).sort(([a],[b])=>parseInt(a)-parseInt(b)).map(([_,a])=>a)}__name(toArray,"toArray"),__name2(toArray,"toArray");function launchTravelSheet(actors){new TravelSpeedSheet({},{actors}).render(!0)}__name(launchTravelSheet,"launchTravelSheet"),__name2(launchTravelSheet,"launchTravelSheet");function CheckFeat(actor,slug){return!!actor.items.find(i=>i.slug===slug&&i.type==="feat")}__name(CheckFeat,"CheckFeat"),__name2(CheckFeat,"CheckFeat");async function treatWounds(options){const actor=(Array.isArray(options.actors)?options.actors:[options.actors])[0];if(!actor||!actor.isOfType("creature")){ui.notifications.error("PF2E.ErrorMessage.NoPCTokenSelected",{localize:!0});return}const medicineName=game.i18n.localize("PF2E.SkillMedicine"),chirurgeon=CheckFeat(actor,"chirurgeon"),naturalMedicine=CheckFeat(actor,"natural-medicine"),domIdAppend=randomID();new Dialog({title:game.i18n.localize("PF2E.Actions.TreatWounds.Label"),content:` +`,toggleMacro=game.macros.contents.find(macro=>macro.name===effect.name&¯o.command===command)??await MacroPF2e.create({command,name:effect.name,type:"script",img:effect.img},{renderSheet:!1});game.user.assignHotbarMacro(toggleMacro??null,slot)}__name(createToggleEffectMacro,"createToggleEffectMacro"),__name2(createToggleEffectMacro,"createToggleEffectMacro");function resolveMacroActor(uuid){if(uuid){const actor=fromUuidSync(uuid);return actor instanceof ActorPF2e?actor:null}const speaker=ChatMessage.getSpeaker();return canvas.tokens.get(speaker.token??"")?.actor??game.actors.get(speaker.actor??"")??null}__name(resolveMacroActor,"resolveMacroActor"),__name2(resolveMacroActor,"resolveMacroActor");async function perceptionForSelected(event){const actors=canvas.tokens.controlled.flatMap(t=>t.actor??[]).filter(a=>!!a.isOfType("creature"));if(actors.length===0){ui.notifications.error("You must select at least one PC/NPC token.");return}const argsFromEvent=eventToRollParams(event,{type:"check"});for(const actor of actors)await actor.perception.roll({...argsFromEvent,traits:["secret"]})}__name(perceptionForSelected,"perceptionForSelected"),__name2(perceptionForSelected,"perceptionForSelected");const ITEM_UUID="Compendium.pf2e.equipment-effects.Item.2YgXoHvJfrDHucMr",TEMPLATES={flavor:"./systems/pf2e/templates/chat/action/flavor.hbs",content:"./systems/pf2e/templates/chat/action/content.hbs"};async function raiseAShield(options){const localize=localizer("PF2E.Actions.RaiseAShield"),actors=Array.isArray(options.actors)?options.actors:[options.actors],actor=actors[0];if(actors.length>1||!(actor&&["character","npc"].includes(actor.type))){ui.notifications.error(localize("BadArgs"));return}const shield=actor.heldShield,speaker=ChatMessagePF2e.getSpeaker({actor});if(await(async()=>{const existingEffect=actor.itemTypes.effect.find(e=>e.flags.core?.sourceId===ITEM_UUID);if(existingEffect)return await existingEffect.delete(),!1;if(shield?.isDestroyed)return ui.notifications.warn(localize("ShieldIsDestroyed",{actor:speaker.alias,shield:shield.name})),!1;if(shield?.isBroken===!1){const effect=await fromUuid(ITEM_UUID);if(!(effect instanceof EffectPF2e))throw ErrorPF2e("Raise a Shield effect not found");return await actor.createEmbeddedDocuments("Item",[effect.toObject()]),!0}else return shield?.isBroken?(ui.notifications.warn(localize("ShieldIsBroken",{actor:speaker.alias,shield:shield.name})),!1):(ui.notifications.warn(localize("NoShieldEquipped",{actor:speaker.alias})),!1)})()){const combatActor=game.combat?.started&&game.combat.combatant?.actor||null,[actionType,costSymbol]=combatActor&&combatActor!==actor?["Reaction","R"]:["SingleAction","1"],content=await renderTemplate(TEMPLATES.content,{imgPath:shield.img,message:localize("Content",{actor:speaker.alias})}),flavor=await renderTemplate(TEMPLATES.flavor,{action:{title:localize(`${actionType}Title`),glyph:getActionGlyph(costSymbol)}});await ChatMessagePF2e.create({type:CONST.CHAT_MESSAGE_TYPES.EMOTE,speaker,flavor,content})}}__name(raiseAShield,"raiseAShield"),__name2(raiseAShield,"raiseAShield");async function restForTheNight(options){const actors=Array.isArray(options.actors)?options.actors:[options.actors],characters=actors.filter(a=>a?.type==="character");if(actors.length===0)return ui.notifications.error(game.i18n.localize("PF2E.ErrorMessage.NoPCTokenSelected")),[];const localize=localizer("PF2E.Action.RestForTheNight"),promptMessage=(()=>{const element=document.createElement("p");return element.innerText=localize("Prompt"),element.outerHTML})();if(!options.skipDialog&&!await Dialog.confirm({title:localize("Label"),content:promptMessage,defaultYes:!0}))return[];const messages=[];for(const actor of characters){const actorUpdates={attributes:{hp:{value:actor._source.system.attributes.hp.value}},resources:{}},itemUpdates=[],statements=[],{abilities:abilities2,attributes,hitPoints,level}=actor,conModifier=abilities2.con.mod,maxRestored=Math.max(conModifier,1)*level*hitPoints.recoveryMultiplier+hitPoints.recoveryAddend,hpLost=attributes.hp.max-attributes.hp.value,hpRestored=hpLost>=maxRestored?maxRestored:hpLost;if(hpRestored>0){const singularOrPlural=hpRestored===1?"PF2E.Action.RestForTheNight.Message.HitPointsSingle":"PF2E.Action.RestForTheNight.Message.HitPoints";actorUpdates.attributes.hp={value:attributes.hp.value+=hpRestored},statements.push(game.i18n.format(singularOrPlural,{hitPoints:hpRestored}))}const RECOVERABLE_CONDITIONS=["doomed","drained","fatigued","wounded"],conditionChanges={doomed:null,drained:null,fatigued:null,wounded:null};actor.hasCondition("fatigued")&&(await actor.decreaseCondition("fatigued"),conditionChanges.fatigued="removed");for(const slug of["doomed","drained"]){const condition=actor.getCondition(slug);if(!condition)continue;const newValue=(condition.value??1)-1;await actor.decreaseCondition(slug),conditionChanges[slug]=newValue===0?"removed":"reduced"}actor.hasCondition("wounded")&&attributes.hp.value===attributes.hp.max&&(await actor.decreaseCondition("wounded",{forceRemove:!0}),conditionChanges.wounded="removed");const wands=actor.itemTypes.consumable.filter(i=>i.category==="wand"&&i.uses.value({_id:wand.id,"system.charges.value":wand.uses.max})));const wandRecharged=itemUpdates.length>0,resources=actor.system.resources,reagents=resources.crafting.infusedReagents;reagents&&reagents.valuea.frequency&&(tupleHasValue(["turn","round","day"],a.frequency.per)||Duration.fromISO(a.frequency.per)<=Duration.fromISO("PT8H"))&&a.frequency.value({_id:a.id,"system.frequency.value":a.frequency.max})))),game.settings.get("pf2e","staminaVariant")){const stamina=attributes.hp.sp??{value:0,max:0},resolve=resources.resolve??{value:0,max:0};stamina.valuei.isTemporary).map(i=>i.id),hasActorUpdates=Object.keys({...actorUpdates.attributes,...actorUpdates.resources}).length>0,hasItemUpdates=itemUpdates.length>0,removeTempItems=temporaryItems.length>0;hasActorUpdates&&await actor.update({system:actorUpdates},{render:!1}),hasItemUpdates&&await actor.updateEmbeddedDocuments("Item",itemUpdates,{render:!1}),removeTempItems&&(await actor.deleteEmbeddedDocuments("Item",temporaryItems,{render:!1}),statements.push(localize("Message.TemporaryItems"))),spellcastingRecharge.actorUpdates&&statements.push(localize("Message.FocusPoints")),spellcastingRecharge.itemUpdates.length>0&&statements.push(localize("Message.SpellSlots")),wandRecharged&&statements.push(localize("Message.WandsCharges"));const reducedConditions=RECOVERABLE_CONDITIONS.filter(c=>conditionChanges[c]==="reduced");for(const slug of reducedConditions){const{name:name2}=game.pf2e.ConditionManager.getCondition(slug);statements.push(localize("Message.ConditionReduced",{condition:name2}))}const removedConditions=RECOVERABLE_CONDITIONS.filter(c=>conditionChanges[c]==="removed");for(const slug of removedConditions){const{name:name2}=game.pf2e.ConditionManager.getCondition(slug);statements.push(localize("Message.ConditionRemoved",{condition:name2}))}const actorAwakens=localize("Message.Awakens",{actor:actor.name}),recoveryList=document.createElement("ul");recoveryList.append(...statements.map(statement=>{const listItem=document.createElement("li");return listItem.innerText=statement,listItem}));const content=[actorAwakens,recoveryList.outerHTML].join(` +`);messages.push({user:game.user.id,content,speaker:{alias:actor.name}}),await actor.sheet.render(),Hooks.callAll("pf2e.restForTheNight",actor)}return ChatMessagePF2e.createDocuments(messages)}__name(restForTheNight,"restForTheNight"),__name2(restForTheNight,"restForTheNight");async function stealthForSelected(event){const actors=canvas.tokens.controlled.flatMap(t=>t.actor??[]).filter(a=>!!a.isOfType("creature"));if(actors.length===0){ui.notifications.error("You must select at least one PC/NPC token.");return}const argsFromEvent=eventToRollParams(event,{type:"check"});for(const actor of actors)await actor.skills.stealth.roll({...argsFromEvent,traits:["secret"]})}__name(stealthForSelected,"stealthForSelected"),__name2(stealthForSelected,"stealthForSelected");function steelYourResolve(options){const localize=localizer("PF2E.Actions.SteelYourResolve"),actors=Array.isArray(options.actors)?options.actors:[options.actors],actor=actors[0];if(actors.length>1||!(actor instanceof CharacterPF2e)){ui.notifications.error(localize("BadArgs"));return}const toChat=__name2((alias,content)=>{ChatMessage.create({user:game.user.id,content,speaker:{alias}})},"toChat");if(!game.settings.get("pf2e","staminaVariant")){ui.notifications.error(localize("StaminaNotEnabled"));return}Dialog.confirm({title:localize("Title"),content:localize("Content"),yes:()=>{const sp=actor.system.attributes.hp.sp??{value:0,max:0},resolve=actor.system.resources.resolve??{value:0,max:0},spRatio=`${sp.value}/${sp.max}`,recoverStamina=localize("RecoverStamina",{name:actor.name,ratio:spRatio}),noStamina=localize("NoStamina",{name:actor.name});if(resolve.value>0){toChat(actor.name,recoverStamina);const newSP=sp.value+Math.floor(sp.max/2);actor.update({"system.attributes.hp.sp.value":Math.min(newSP,sp.max),"system.resources.resolve.value":resolve.value-1})}else toChat(actor.name,noStamina)},defaultYes:!0})}__name(steelYourResolve,"steelYourResolve"),__name2(steelYourResolve,"steelYourResolve");function takeABreather(){let applyChanges=!1;const pcs=uniq(compact([game.user.character,canvas.tokens.controlled.map(t=>t.actor)].flat())).filter(a=>a.isOfType("character"));if(game.settings.get("pf2e","staminaVariant")){if(pcs.length===0){ui.notifications.error("PF2E.ErrorMessage.NoPCTokenSelected",{localize:!0});return}}else return;new Dialog({title:"Take a Breather",content:"
Rest for 10 minutes, spend a resolve point, and regain stamina?
",buttons:{yes:{icon:fontAwesomeIcon("check").outerHTML,label:"Take a Breather",callback:()=>{applyChanges=!0}},no:{icon:fontAwesomeIcon("times").outerHTML,label:"Cancel"}},default:"yes",close:()=>{if(applyChanges)for(const actor of pcs){const token=actor.getActiveTokens(!0,!0).shift(),name2=token?.name??actor.name,sp=actor.system.attributes.hp.sp,resolve=actor.system.resources.resolve;if(!(sp&&resolve))continue;const speaker=ChatMessagePF2e.getSpeaker({token,actor});resolve.value>0?(actor.update({"system.attributes.hp.sp.value":sp.max,"system.resources.resolve.value":resolve.value-1}),ChatMessagePF2e.create({speaker,content:`${name2} has ${sp.value}/${sp.max} SP and spends a resolve point, taking a 10 minute breather. Stamina refreshed.`})):ChatMessagePF2e.create({speaker,content:`${name2} is tired and needs to go to bed! No resolve points remaining.`})}}}).render(!0)}__name(takeABreather,"takeABreather"),__name2(takeABreather,"takeABreather");var ExplorationActivities=(ExplorationActivities2=>(ExplorationActivities2[ExplorationActivities2.NONE=0]="NONE",ExplorationActivities2[ExplorationActivities2.HALF_SPEED=1]="HALF_SPEED",ExplorationActivities2[ExplorationActivities2.AVOID_NOTICE=2]="AVOID_NOTICE",ExplorationActivities2[ExplorationActivities2.DEFEND=3]="DEFEND",ExplorationActivities2[ExplorationActivities2.DETECT_MAGIC=4]="DETECT_MAGIC",ExplorationActivities2[ExplorationActivities2.SCOUT=5]="SCOUT",ExplorationActivities2[ExplorationActivities2.SEARCH=6]="SEARCH",ExplorationActivities2))(ExplorationActivities||{}),DetectionMode$1=(DetectionMode2=>(DetectionMode2[DetectionMode2.NONE=0]="NONE",DetectionMode2[DetectionMode2.DETECT_EVERYTHING=1]="DETECT_EVERYTHING",DetectionMode2[DetectionMode2.DETECT_BEFORE_WALKING_INTO_IT=2]="DETECT_BEFORE_WALKING_INTO_IT",DetectionMode2))(DetectionMode$1||{});function sneaksAtFullSpeed(activity,explorationOptions){return activity===2&&(explorationOptions.legendarySneak||explorationOptions.swiftSneak)}__name(sneaksAtFullSpeed,"sneaksAtFullSpeed"),__name2(sneaksAtFullSpeed,"sneaksAtFullSpeed");function defendsAtFullSpeed(activity,explorationOptions){return activity===3&&explorationOptions.practicedDefender}__name(defendsAtFullSpeed,"defendsAtFullSpeed"),__name2(defendsAtFullSpeed,"defendsAtFullSpeed");function calculateNormalizedCharacterSpeed(defaultSpeedInFeet,activity,detectionMode,explorationOptions){return Math.max(5,calculateCharacterSpeed(defaultSpeedInFeet,activity,detectionMode,explorationOptions))}__name(calculateNormalizedCharacterSpeed,"calculateNormalizedCharacterSpeed"),__name2(calculateNormalizedCharacterSpeed,"calculateNormalizedCharacterSpeed");function calculateCharacterSpeed(defaultSpeedInFeet,activity,detectionMode,explorationOptions){const halvedSpeed=defaultSpeedInFeet/2;if(sneaksAtFullSpeed(activity,explorationOptions)||defendsAtFullSpeed(activity,explorationOptions))return defaultSpeedInFeet;if(activity===6){let searchSpeedFactor=1;return explorationOptions.expeditiousSearchLegendary?searchSpeedFactor=4:explorationOptions.expeditiousSearch&&(searchSpeedFactor=2),detectionMode===1?Math.min(halvedSpeed,searchSpeedFactor*30):detectionMode===2?Math.min(halvedSpeed,searchSpeedFactor*15):halvedSpeed}else return activity===4?detectionMode===1?Math.min(halvedSpeed,30):detectionMode===2?Math.min(halvedSpeed,15):halvedSpeed:activity===0?defaultSpeedInFeet:halvedSpeed}__name(calculateCharacterSpeed,"calculateCharacterSpeed"),__name2(calculateCharacterSpeed,"calculateCharacterSpeed");var LengthUnit=(LengthUnit2=>(LengthUnit2[LengthUnit2.MILES=0]="MILES",LengthUnit2[LengthUnit2.FEET=1]="FEET",LengthUnit2))(LengthUnit||{});const golarionMileInFeet=6e3;function toFeet(distance){return distance.unit===0?distance.value*golarionMileInFeet:distance.value}__name(toFeet,"toFeet"),__name2(toFeet,"toFeet");function speedToVelocity(speedInFeet){return{distance:{unit:1,value:speedInFeet*10},time:0}}__name(speedToVelocity,"speedToVelocity"),__name2(speedToVelocity,"speedToVelocity");function toFeetPerMinute(velocity){return velocity.time===0?toFeet(velocity.distance):toFeetPerMinute({distance:{unit:velocity.distance.unit,value:velocity.distance.value/60},time:0})}__name(toFeetPerMinute,"toFeetPerMinute"),__name2(toFeetPerMinute,"toFeetPerMinute");var Terrain=(Terrain2=>(Terrain2[Terrain2.NORMAL=0]="NORMAL",Terrain2[Terrain2.DIFFICULT=1]="DIFFICULT",Terrain2[Terrain2.GREATER_DIFFICULT=2]="GREATER_DIFFICULT",Terrain2))(Terrain||{});function increaseDistanceByTerrain(trip2){const feet=toFeet(trip2.distance);return trip2.terrain===1?feet*trip2.terrainSlowdown.difficult.numerator/trip2.terrainSlowdown.difficult.denominator:trip2.terrain===2?feet*trip2.terrainSlowdown.greaterDifficult.numerator/trip2.terrainSlowdown.greaterDifficult.denominator:feet*trip2.terrainSlowdown.normal.numerator/trip2.terrainSlowdown.normal.denominator}__name(increaseDistanceByTerrain,"increaseDistanceByTerrain"),__name2(increaseDistanceByTerrain,"increaseDistanceByTerrain");const minutesPerHour=60,daysPerWeek=7;function toTravelDuration({distanceInFeet,feetPerMinute,hustleDurationInMinutes,hoursPerDay=8}){const minutesPerDay=hoursPerDay*minutesPerHour,minutesPerWeek=minutesPerDay*daysPerWeek,hustleDuration=Math.min(hustleDurationInMinutes,minutesPerDay),normalTravelDuration=minutesPerDay-hustleDuration,averageSpeed=(feetPerMinute*2*hustleDuration+feetPerMinute*normalTravelDuration)/minutesPerDay,totalMinutes=Math.round(distanceInFeet/averageSpeed),weeks=Math.floor(totalMinutes/minutesPerWeek),days=Math.floor((totalMinutes-weeks*minutesPerWeek)/minutesPerDay),remainingMinutesMovingAtDoubleSpeed=(distanceInFeet-weeks*minutesPerWeek*averageSpeed-days*minutesPerDay*averageSpeed)/(feetPerMinute*2),remainingMinutesSpentHustling=Math.min(remainingMinutesMovingAtDoubleSpeed,hustleDurationInMinutes)+Math.max(0,remainingMinutesMovingAtDoubleSpeed-hustleDurationInMinutes)*2,hours=Math.floor(remainingMinutesSpentHustling/minutesPerHour),minutes=Math.round(remainingMinutesSpentHustling-hours*minutesPerHour);return{weeks,days,hours,minutes}}__name(toTravelDuration,"toTravelDuration"),__name2(toTravelDuration,"toTravelDuration");function calculateTravelDuration({journey,velocity,hustleDurationInMinutes=0,hoursPerDay=8}){const distanceInFeet=sum(journey.map(increaseDistanceByTerrain)),feetPerMinute=toFeetPerMinute(velocity);return toTravelDuration({distanceInFeet,feetPerMinute,hustleDurationInMinutes,hoursPerDay})}__name(calculateTravelDuration,"calculateTravelDuration"),__name2(calculateTravelDuration,"calculateTravelDuration");const _TravelSpeedSheet=class extends FormApplication{static{__name(this,"_TravelSpeedSheet")}formData=void 0;static get defaultOptions(){const options=super.defaultOptions;return options.id="travel-duration",options.classes=["travel-duration"],options.title=game.i18n.localize("PF2E.TravelSpeed.Title"),options.template="systems/pf2e/templates/gm/travel/travel-speed-sheet.hbs",options.width="auto",options.submitOnChange=!0,options.closeOnSubmit=!1,options}async _updateObject(_event,formData){const data=expandObject(formData);data.actors=toArray(data.actors),this.formData=data,this.render(!0)}actorFormToSheetData(actor,data){return{requiresDetectionMode:data.explorationActivity==="Search"||data.explorationActivity==="DetectMagic",detectionMode:data.detectionMode,explorationActivity:data.explorationActivity,explorationSpeed:parseFloat(calculateNormalizedCharacterSpeed(data.speed,parseExplorationActivity(data.explorationActivity),parseDetectionModeData(data.detectionMode),parseExplorationOptions(actor)).toFixed(2)),speed:data.speed,name:actor.name}}getInitialActorData(actor){return this.actorFormToSheetData(actor,{detectionMode:"before",explorationActivity:"Search",speed:actor.system.attributes.speed.total})}formToSheetData(actors,data){const journey=[{terrainSlowdown:{difficult:data.difficultTerrainSlowdown,greaterDifficult:data.greaterDifficultTerrainSlowdown,normal:data.normalTerrainSlowdown},terrain:parseTerrainData(data.terrain),distance:{value:data.distance,unit:parseDistanceUnit(data.distanceUnit)}}],actorFormData=zip(actors,data.actors,(actor,actorData)=>this.actorFormToSheetData(actor,actorData)),partySpeedInFeet=Math.min(...actorFormData.map(data2=>data2.explorationSpeed)),velocity=speedToVelocity(partySpeedInFeet);return{travelDuration:calculateTravelDuration({journey,hoursPerDay:data.hoursPerDay,velocity,hustleDurationInMinutes:data.hustleMinutes}),distance:data.distance,actors:actorFormData,normalTerrainSlowdown:data.normalTerrainSlowdown,difficultTerrainSlowdown:data.difficultTerrainSlowdown,greaterDifficultTerrainSlowdown:data.greaterDifficultTerrainSlowdown,distanceUnit:data.distanceUnit,terrain:data.terrain,partySpeedInFeet,hustleMinutes:data.hustleMinutes,hoursPerDay:data.hoursPerDay}}getInitialFormData(actors){return this.formToSheetData(actors,{actors:actors.map(actor=>this.getInitialActorData(actor)),terrain:"normal",distanceUnit:"miles",normalTerrainSlowdown:{denominator:1,numerator:1},difficultTerrainSlowdown:{denominator:1,numerator:2},greaterDifficultTerrainSlowdown:{denominator:1,numerator:3},distance:1,hustleMinutes:getHustleMinutes(actors),hoursPerDay:8})}getData(){const sheetData=super.getData();let data;return this.formData===void 0?data=this.getInitialFormData(this.options.actors):data=this.formToSheetData(this.options.actors,this.formData),Object.assign(sheetData,data),sheetData}};__name2(_TravelSpeedSheet,"TravelSpeedSheet");let TravelSpeedSheet=_TravelSpeedSheet;function parseDistanceUnit(unit){return unit==="feet"?LengthUnit.FEET:LengthUnit.MILES}__name(parseDistanceUnit,"parseDistanceUnit"),__name2(parseDistanceUnit,"parseDistanceUnit");function parseTerrainData(terrain){return terrain==="normal"?Terrain.NORMAL:terrain==="difficult"?Terrain.DIFFICULT:Terrain.GREATER_DIFFICULT}__name(parseTerrainData,"parseTerrainData"),__name2(parseTerrainData,"parseTerrainData");function parseDetectionModeData(detectionMode){return detectionMode==="none"?DetectionMode$1.NONE:detectionMode==="before"?DetectionMode$1.DETECT_BEFORE_WALKING_INTO_IT:DetectionMode$1.DETECT_EVERYTHING}__name(parseDetectionModeData,"parseDetectionModeData"),__name2(parseDetectionModeData,"parseDetectionModeData");function parseExplorationActivity(activity){return activity==="AvoidNotice"?ExplorationActivities.AVOID_NOTICE:activity==="Defend"?ExplorationActivities.DEFEND:activity==="DetectMagic"?ExplorationActivities.DETECT_MAGIC:activity==="Scout"?ExplorationActivities.SCOUT:activity==="Search"?ExplorationActivities.SEARCH:activity==="None"?ExplorationActivities.NONE:ExplorationActivities.HALF_SPEED}__name(parseExplorationActivity,"parseExplorationActivity"),__name2(parseExplorationActivity,"parseExplorationActivity");function getHustleMinutes(actors){return Math.min(...actors.map(actor=>Math.max(1,actor.system.abilities.con.mod)*10))}__name(getHustleMinutes,"getHustleMinutes"),__name2(getHustleMinutes,"getHustleMinutes");function hasFeat(actor,slug){return actor.itemTypes.feat.some(feat=>feat.slug===slug)}__name(hasFeat,"hasFeat"),__name2(hasFeat,"hasFeat");function parseExplorationOptions(actor){return{practicedDefender:hasFeat(actor,"practiced-defender"),swiftSneak:hasFeat(actor,"swift-sneak"),legendarySneak:hasFeat(actor,"legendary-sneak"),expeditiousSearch:hasFeat(actor,"expeditious-search"),expeditiousSearchLegendary:hasFeat(actor,"expeditious-search")&&actor.attributes.perception.rank===4}}__name(parseExplorationOptions,"parseExplorationOptions"),__name2(parseExplorationOptions,"parseExplorationOptions");function toArray(data){return Object.entries(data).sort(([a],[b])=>parseInt(a)-parseInt(b)).map(([_,a])=>a)}__name(toArray,"toArray"),__name2(toArray,"toArray");function launchTravelSheet(actors){new TravelSpeedSheet({},{actors}).render(!0)}__name(launchTravelSheet,"launchTravelSheet"),__name2(launchTravelSheet,"launchTravelSheet");function CheckFeat(actor,slug){return!!actor.items.find(i=>i.slug===slug&&i.type==="feat")}__name(CheckFeat,"CheckFeat"),__name2(CheckFeat,"CheckFeat");async function treatWounds(options){const actor=(Array.isArray(options.actors)?options.actors:[options.actors])[0];if(!actor||!actor.isOfType("creature")){ui.notifications.error("PF2E.ErrorMessage.NoPCTokenSelected",{localize:!0});return}const medicineName=game.i18n.localize("PF2E.SkillMedicine"),chirurgeon=CheckFeat(actor,"chirurgeon"),naturalMedicine=CheckFeat(actor,"natural-medicine"),domIdAppend=randomID();new Dialog({title:game.i18n.localize("PF2E.Actions.TreatWounds.Label"),content:`
${game.i18n.localize("PF2E.Actions.TreatWounds.Label")}

@@ -134,7 +134,7 @@ ${CheckFeat(actor,"mortal-healing")?`
`:""} -`,buttons:{yes:{icon:'',label:game.i18n.localize("PF2E.Actions.TreatWounds.Label"),callback:$html=>treat(actor,$html,options.event,domIdAppend)},no:{icon:'',label:game.i18n.localize("Cancel")}},default:"yes"}).render(!0)}__name(treatWounds,"treatWounds"),__name2(treatWounds,"treatWounds");async function treat(actor,$html,event=null,domIdAppend){const{name:name2}=actor,mod=Number($html.find(`#modifier-${domIdAppend}`).val())||0,requestedProf=Number($html.find(`#dc-type-${domIdAppend}`).val())||1,riskySurgery=$html.find(`#risky-surgery-${domIdAppend}`).prop("checked"),mortalHealing=$html.find(`#mortal-healing-${domIdAppend}`).prop("checked"),skillSlug=String($html.find(`#skill-${domIdAppend}`).val())||"medicine",skill=actor.skills[skillSlug];if(!skill?.proficient){ui.notifications.warn(game.i18n.format("PF2E.Actions.TreatWounds.Error",{name:name2}));return}const rank=skill.rank??1,usedProf=requestedProf<=rank?requestedProf:rank,medicBonus=CheckFeat(actor,"medic-dedication")?(usedProf-1)*5:0,dcValue=[15,20,30,40][usedProf-1]+mod,bonus=[0,10,30,50][usedProf-1]+medicBonus,rollOptions=actor.getRollOptions(["all","skill-check","medicine"]);rollOptions.push("action:treat-wounds"),riskySurgery&&rollOptions.push("risky-surgery");const dc={value:dcValue,visible:!0},increaseDoS=__name2(locKey=>({adjustments:{success:{label:`PF2E.Actions.TreatWounds.Rolls.${locKey}`,amount:DEGREE_ADJUSTMENT_AMOUNTS.INCREASE}}}),"increaseDoS");(actor.synthetics.degreeOfSuccessAdjustments.medicine??=[]).push(...riskySurgery?[increaseDoS("RiskySurgery")]:mortalHealing?[increaseDoS("MortalHealing")]:[]),skill.check.roll({dc,...eventToRollParams(event),extraRollOptions:rollOptions,callback:async(_roll,outcome,message)=>{const successLabel=outcome?game.i18n.localize(`PF2E.Check.Result.Degree.Check.${outcome}`):"",magicHands=CheckFeat(actor,"magic-hands"),bonusString=bonus>0?`+ ${bonus}`:"",healFormula=(()=>{switch(outcome){case"criticalSuccess":return magicHands?`32${bonusString}`:`4d8${bonusString}`;case"success":return magicHands?`16${bonusString}`:`2d8${bonusString}`;case"criticalFailure":return"1d8";default:return null}})(),speaker=ChatMessagePF2e.getSpeaker({actor});if(riskySurgery&&ChatMessagePF2e.create({flags:message.toObject().flags,type:CONST.CHAT_MESSAGE_TYPES.ROLL,flavor:`${game.i18n.localize("PF2E.Actions.TreatWounds.Rolls.RiskySurgery")}`,rolls:[(await new DamageRoll("{1d8[slashing]}").roll({async:!0})).toJSON()],speaker}),healFormula){const healRoll=await new DamageRoll(`{(${healFormula})[healing]}`).roll({async:!0}),rollType=outcome!=="criticalFailure"?game.i18n.localize("PF2E.Actions.TreatWounds.Rolls.TreatWounds"):game.i18n.localize("PF2E.Actions.TreatWounds.Rolls.TreatWoundsCriticalFailure");ChatMessagePF2e.create({flags:message.toObject().flags,type:CONST.CHAT_MESSAGE_TYPES.ROLL,flavor:`${rollType} (${successLabel})`,rolls:[healRoll.toJSON()],speaker})}}})}__name(treat,"treat"),__name2(treat,"treat");function getHazards(actors){return actors.filter(a=>a.type==="hazard")}__name(getHazards,"getHazards"),__name2(getHazards,"getHazards");function getLevels(actors,alliance){return actors.filter(a=>a.alliance===alliance).map(a=>a.level)}__name(getLevels,"getLevels"),__name2(getLevels,"getLevels");function dialogTemplate(xp){return` +`,buttons:{yes:{icon:'',label:game.i18n.localize("PF2E.Actions.TreatWounds.Label"),callback:$html=>treat(actor,$html,options.event,domIdAppend)},no:{icon:'',label:game.i18n.localize("Cancel")}},default:"yes"}).render(!0)}__name(treatWounds,"treatWounds"),__name2(treatWounds,"treatWounds");async function treat(actor,$html,event=null,domIdAppend){const{name:name2}=actor,mod=Number($html.find(`#modifier-${domIdAppend}`).val())||0,requestedProf=Number($html.find(`#dc-type-${domIdAppend}`).val())||1,riskySurgery=$html.find(`#risky-surgery-${domIdAppend}`).prop("checked"),mortalHealing=$html.find(`#mortal-healing-${domIdAppend}`).prop("checked"),skillSlug=String($html.find(`#skill-${domIdAppend}`).val())||"medicine",skill=actor.skills[skillSlug];if(!skill?.proficient){ui.notifications.warn(game.i18n.format("PF2E.Actions.TreatWounds.Error",{name:name2}));return}const rank=skill.rank??1,usedProf=requestedProf<=rank?requestedProf:rank,medicBonus=CheckFeat(actor,"medic-dedication")?(usedProf-1)*5:0,dcValue=[15,20,30,40][usedProf-1]+mod,bonus=[0,10,30,50][usedProf-1]+medicBonus,rollOptions=actor.getRollOptions(["all","skill-check","medicine"]);rollOptions.push("action:treat-wounds"),riskySurgery&&rollOptions.push("risky-surgery");const dc={value:dcValue,visible:!0},increaseDoS=__name2(locKey=>({adjustments:{success:{label:`PF2E.Actions.TreatWounds.Rolls.${locKey}`,amount:DEGREE_ADJUSTMENT_AMOUNTS.INCREASE}}}),"increaseDoS");(actor.synthetics.degreeOfSuccessAdjustments.medicine??=[]).push(...riskySurgery?[increaseDoS("RiskySurgery")]:mortalHealing?[increaseDoS("MortalHealing")]:[]),skill.check.roll({dc,...eventToRollParams(event,{type:"check"}),extraRollOptions:rollOptions,callback:async(_roll,outcome,message)=>{const successLabel=outcome?game.i18n.localize(`PF2E.Check.Result.Degree.Check.${outcome}`):"",magicHands=CheckFeat(actor,"magic-hands"),bonusString=bonus>0?`+ ${bonus}`:"",healFormula=(()=>{switch(outcome){case"criticalSuccess":return magicHands?`32${bonusString}`:`4d8${bonusString}`;case"success":return magicHands?`16${bonusString}`:`2d8${bonusString}`;case"criticalFailure":return"1d8";default:return null}})(),speaker=ChatMessagePF2e.getSpeaker({actor});if(riskySurgery&&ChatMessagePF2e.create({flags:message.toObject().flags,type:CONST.CHAT_MESSAGE_TYPES.ROLL,flavor:`${game.i18n.localize("PF2E.Actions.TreatWounds.Rolls.RiskySurgery")}`,rolls:[(await new DamageRoll("{1d8[slashing]}").roll({async:!0})).toJSON()],speaker}),healFormula){const healRoll=await new DamageRoll(`{(${healFormula})[healing]}`).roll({async:!0}),rollType=outcome!=="criticalFailure"?game.i18n.localize("PF2E.Actions.TreatWounds.Rolls.TreatWounds"):game.i18n.localize("PF2E.Actions.TreatWounds.Rolls.TreatWoundsCriticalFailure");ChatMessagePF2e.create({flags:message.toObject().flags,type:CONST.CHAT_MESSAGE_TYPES.ROLL,flavor:`${rollType} (${successLabel})`,rolls:[healRoll.toJSON()],speaker})}}})}__name(treat,"treat"),__name2(treat,"treat");function getHazards(actors){return actors.filter(a=>a.type==="hazard")}__name(getHazards,"getHazards"),__name2(getHazards,"getHazards");function getLevels(actors,alliance){return actors.filter(a=>a.alliance===alliance).map(a=>a.level)}__name(getLevels,"getLevels"),__name2(getLevels,"getLevels");function dialogTemplate(xp){return`

XP

@@ -256,7 +256,7 @@ ${CheckFeat(actor,"mortal-healing")?`
- `},"askLevelPopupTemplate");function showXP(partyLevel,partySize,npcLevels,hazards){const xp=game.pf2e.gm.calculateXP(partyLevel,partySize,npcLevels,hazards,{proficiencyWithoutLevel:game.settings.get("pf2e","proficiencyVariant")});new Dialog({title:"XP",content:dialogTemplate(xp),buttons:{}}).render(!0)}__name(showXP,"showXP"),__name2(showXP,"showXP");function askPartyLevelAndSize(npcLevels,hazards){new Dialog({title:"Party Information",content:askLevelPopupTemplate,buttons:{no:{icon:'',label:"Cancel"},yes:{icon:'',label:"Calculate XP",callback:$html=>{const html=$html[0],partySize=Math.abs(Math.trunc(Number(htmlQuery(html,"[name=party-size]")?.value||1))),partyLevel=Math.abs(Math.trunc(Number(htmlQuery(html,"[name=party-level]")?.value||1)));localStorage.setItem("xpMacroPartySize",partySize.toString()),localStorage.setItem("xpMacroPartyLevel",partyLevel.toString()),showXP(partyLevel,partySize,npcLevels,hazards)}}},default:"yes"}).render(!0)}__name(askPartyLevelAndSize,"askPartyLevelAndSize"),__name2(askPartyLevelAndSize,"askPartyLevelAndSize");function xpFromEncounter(){const actors=canvas.tokens.controlled.flatMap(a=>a.actor??[]).filter(a=>!a.traits.has("minion")),npcLevels=getLevels(actors,"opposition"),pcLevels=getLevels(actors,"party"),hazards=getHazards(actors);if(npcLevels.length===0&&hazards.length===0){ui.notifications.error("You must select at least one opposition and/or hazard token and optionally all PC tokens");return}pcLevels.length===0?askPartyLevelAndSize(npcLevels,hazards):showXP(pcLevels[0],pcLevels.length,npcLevels,hazards)}__name(xpFromEncounter,"xpFromEncounter"),__name2(xpFromEncounter,"xpFromEncounter");const xpVariantCreatureDifferences=new Map([[-7,9],[-6,12],[-5,14],[-4,18],[-3,21],[-2,26],[-1,32],[0,40],[1,48],[2,60],[3,72],[4,90],[5,108],[6,135],[7,160]]),xpCreatureDifferences=new Map([[-4,10],[-3,15],[-2,20],[-1,30],[0,40],[1,60],[2,80],[3,120],[4,160]]),xpSimpleHazardDifferences=new Map([[-4,2],[-3,3],[-2,4],[-1,6],[0,8],[1,12],[2,16],[3,24],[4,32]]);function getXPFromMap(partyLevel,entityLevel,values){const difference2=entityLevel+1-(partyLevel+1),range=Math.floor(values.size/2),boundedDifference=Math.clamped(difference2,0-range,range);return values.get(boundedDifference)??0}__name(getXPFromMap,"getXPFromMap"),__name2(getXPFromMap,"getXPFromMap");function calculateCreatureXP(partyLevel,npcLevel,dcOptions){return dcOptions.proficiencyWithoutLevel?getXPFromMap(partyLevel,npcLevel,xpVariantCreatureDifferences):getXPFromMap(partyLevel,npcLevel,xpCreatureDifferences)}__name(calculateCreatureXP,"calculateCreatureXP"),__name2(calculateCreatureXP,"calculateCreatureXP");function getHazardXp(partyLevel,hazard,dcOptions){return hazard.isComplex?calculateCreatureXP(partyLevel,hazard.level,dcOptions):getXPFromMap(partyLevel,hazard.level,xpSimpleHazardDifferences)}__name(getHazardXp,"getHazardXp"),__name2(getHazardXp,"getHazardXp");function generateEncounterBudgets(partySize){const budget=partySize*20;return{trivial:Math.floor(budget*.5),low:Math.floor(budget*.75),moderate:budget,severe:Math.floor(budget*1.5),extreme:Math.floor(budget*2)}}__name(generateEncounterBudgets,"generateEncounterBudgets"),__name2(generateEncounterBudgets,"generateEncounterBudgets");const rewardEncounterBudgets=generateEncounterBudgets(4);function calculateEncounterRating(challenge,budgets){return challenge<=budgets.trivial?"trivial":challenge<=budgets.low?"low":challenge<=budgets.moderate?"moderate":challenge<=budgets.severe?"severe":"extreme"}__name(calculateEncounterRating,"calculateEncounterRating"),__name2(calculateEncounterRating,"calculateEncounterRating");function calculateXP(partyLevel,partySize,npcLevels,hazards,dcOptions){const creatureChallenge=npcLevels.map(level=>calculateCreatureXP(partyLevel,level,dcOptions)).reduce((a,b)=>a+b,0),hazardChallenge=hazards.map(hazard=>getHazardXp(partyLevel,hazard,dcOptions)).reduce((a,b)=>a+b,0),totalXP=creatureChallenge+hazardChallenge,encounterBudgets=generateEncounterBudgets(partySize),rating=calculateEncounterRating(totalXP,encounterBudgets),ratingXP=rewardEncounterBudgets[rating];return{partyLevel,partySize,totalXP,encounterBudgets,rating,ratingXP,xpPerPlayer:Math.floor(totalXP/partySize*4)}}__name(calculateXP,"calculateXP"),__name2(calculateXP,"calculateXP");const _EncounterPF2e=class extends Combat{static{__name(this,"_EncounterPF2e")}_sortCombatants(a,b){const resolveTie=__name2(()=>{const[priorityA,priorityB]=[a,b].map(combatant=>combatant.overridePriority(combatant.initiative??0)??(combatant.actor?.system.attributes.initiative?combatant.actor.system.attributes.initiative.tiebreakPriority:3));return priorityA===priorityB?a.id.localeCompare(b.id):priorityA-priorityB},"resolveTie");return typeof a.initiative=="number"&&typeof b.initiative=="number"&&a.initiative===b.initiative?resolveTie():super._sortCombatants(a,b)}getCombatantWithHigherInit(a,b){const sortResult=this._sortCombatants(a,b);return sortResult>0?b:sortResult<0?a:null}analyze(){if(!game.ready)return null;const{party}=game.actors,partyMembers=party?.members.filter(a=>a.alliance==="party"&&isReallyPC(a))??[],fightyPartyMembers=(()=>{const inEncounter=partyMembers.filter(m=>m.combatant?.encounter===this);return inEncounter.length>0?inEncounter:partyMembers})(),opposition=uniq(this.combatants.filter(c=>!!(c.actor?.alliance==="opposition"||c.actor?.isOfType("hazard"))&&!partyMembers.includes(c.actor)).flatMap(c=>c.actor??[]));if(!party||fightyPartyMembers.length===0||opposition.length===0)return null;const partyLevel=Math.round(meanBy(fightyPartyMembers.filter(m=>m.isOfType("character")),m=>m.level)),result=calculateXP(partyLevel,fightyPartyMembers.length,opposition.filter(e=>e.isOfType("character","npc")).map(e=>e.level),opposition.filter(e=>e.isOfType("hazard")),{proficiencyWithoutLevel:game.settings.get("pf2e","proficiencyVariant")}),threat=result.rating,budget={spent:result.totalXP,max:result.encounterBudgets[threat],partyLevel},award={xp:Math.floor(result.xpPerPlayer*(fightyPartyMembers.length/partyMembers.length)),recipients:partyMembers};return{threat,budget,award,participants:{party:fightyPartyMembers,opposition}}}prepareDerivedData(){super.prepareDerivedData(),this.metrics=this.analyze()}async createEmbeddedDocuments(embeddedName,data,context={}){const createData=data.filter(datum=>{const token=canvas.tokens.placeables.find(canvasToken=>canvasToken.id===datum.tokenId);if(!token)return!1;const{actor}=token;if(!actor)return ui.notifications.warn(`${token.name} has no associated actor.`),!1;const actorTraits=actor.traits;if(actor.type==="loot"||["minion","eidolon"].some(t=>actorTraits.has(t))){const actorTypes2=CONFIG.PF2E.actorTypes,type=game.i18n.localize(actorTraits.has("minion")?CONFIG.PF2E.creatureTraits.minion:actorTraits.has("eidolon")?CONFIG.PF2E.creatureTraits.eidolon:actorTypes2[actor.type]);return ui.notifications.info(game.i18n.format("PF2E.Encounter.ExcludingFromInitiative",{type,actor:actor.name})),!1}return!0});return super.createEmbeddedDocuments(embeddedName,createData,context)}async rollInitiative(ids,options={}){const extraRollOptions=options.extraRollOptions??[],rollMode=options.messageOptions?.rollMode??options.rollMode;options.secret&&extraRollOptions.push("secret");const fightyCombatants=ids.flatMap(id=>this.combatants.get(id)??[]).filter(c=>!!c.actor?.initiative),initiatives=(await Promise.all(fightyCombatants.map(async combatant=>combatant.actor?.initiative?.roll({...options,combatant,extraRollOptions,updateTracker:!1,rollMode})??null))).flatMap(result=>result?{id:result.combatant.id,value:result.roll.total,statistic:result.roll.options.domains?.find(s=>setHasElement(SKILL_LONG_FORMS,s)||s==="perception")??null}:[]);await this.setMultipleInitiatives(initiatives);const remainingIds=ids.filter(id=>!fightyCombatants.some(c=>c.id===id));return super.rollInitiative(remainingIds,options)}async setMultipleInitiatives(initiatives){const currentId=this.combatant?.id,updates=initiatives.map(i=>({_id:i.id,initiative:i.value,flags:{pf2e:{initiativeStatistic:i.statistic??null,overridePriority:{[i.value]:i.overridePriority}}}}));await this.updateEmbeddedDocuments("Combatant",updates),await this.update({turn:this.turns.findIndex(c=>c.id===currentId)})}async setInitiative(id,value){const combatant=this.combatants.get(id,{strict:!0});if(combatant.actor?.isOfType("character","npc"))return this.setMultipleInitiatives([{id:combatant.id,value,statistic:combatant.actor.attributes.initiative.statistic||"perception"}]);super.setInitiative(id,value)}async resetActors(){const actors=this.combatants.contents.flatMap(c=>c.actor??[]);resetActors(actors,{rerender:!1})}_onCreate(data,options,userId){super._onCreate(data,options,userId);const pcSheets=Object.values(ui.windows).filter(sheet=>sheet.constructor.name==="CharacterSheetPF2e");for(const sheet of pcSheets)sheet.toggleInitiativeLink()}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId),game.pf2e.StatusEffects.onUpdateEncounter(this);const{combatant,previous}=this,actor=combatant?.actor;if(!this.started)return;const[newRound,newTurn]=[changed.round,changed.turn],isRoundChange=typeof newRound=="number",isTurnChange=typeof newTurn=="number",isNextRound=isRoundChange&&(previous.round===null||newRound>previous.round),isNextTurn=isTurnChange&&(previous.turn===null||newTurn>previous.turn);(isRoundChange||isTurnChange)&&Promise.resolve().then(async()=>{if(isNextRound||isNextTurn){const previousCombatant=this.combatants.get(previous.combatantId??"");if(game.user===previousCombatant?.actor?.primaryUpdater){const alreadyWent=previousCombatant.flags.pf2e.roundOfLastTurnEnd===previous.round;typeof previous.round=="number"&&!alreadyWent&&await previousCombatant.endTurn({round:previous.round})}if(game.user===actor?.primaryUpdater){const alreadyWent=combatant?.roundOfLastTurn===this.round;combatant&&!alreadyWent&&await combatant.startTurn()}}this.resetActors(),await game.pf2e.effectTracker.refresh(),game.pf2e.effectPanel.refresh()})}_onDelete(options,userId){if(super._onDelete(options,userId),this.started&&(Hooks.callAll("pf2e.endTurn",this.combatant??null,this,userId),game.pf2e.effectTracker.onEncounterEnd(this)),!game.combat){const pcSheets=Object.values(ui.windows).filter(sheet=>sheet.constructor.name==="CharacterSheetPF2e");for(const sheet of pcSheets)sheet.toggleInitiativeLink()}game.user.clearTargets(),this.resetActors()}async _manageTurnEvents(adjustedTurn){if(this.previous||game.release.generation>11)return super._manageTurnEvents(adjustedTurn)}};__name2(_EncounterPF2e,"EncounterPF2e");let EncounterPF2e=_EncounterPF2e;const _CombatantPF2e=class extends Combatant{static{__name(this,"_CombatantPF2e")}get encounter(){return this.parent}get roundOfLastTurn(){return this.flags.pf2e.roundOfLastTurn}get playersCanSeeName(){return!!this.token?.playersCanSeeName}overridePriority(initiative){return this.flags.pf2e.overridePriority[initiative]??null}hasHigherInitiative({than}){if(this.parent.id!==than.parent.id)throw ErrorPF2e("The initiative of Combatants from different combats cannot be compared");return this.parent.getCombatantWithHigherInit(this,than)===this}static async fromActor(actor,render=!0,options={}){if(!game.combat)return ui.notifications.error(game.i18n.localize("PF2E.Encounter.NoActiveEncounter")),null;const token=actor.getActiveTokens().pop(),existing=game.combat.combatants.find(combatant=>combatant.actor===actor);return existing||(token?(await(options.combat??game.combat).createEmbeddedDocuments("Combatant",[{tokenId:token.id,actorId:token.actor?.id,sceneId:token.scene.id,hidden:token.document.hidden}],{render})).at(0)??null:(ui.notifications.error(game.i18n.format("PF2E.Encounter.NoTokenInScene",{actor:actor.name})),null))}static async createDocuments(data=[],context={}){const entries=data.map(d=>({token:(d.sceneId?game.scenes.get(d.sceneId):context.parent?.scene)?.tokens.get(d.tokenId??"")||null,data:d})),tokens=entries.map(e=>e.token);for(const token of tokens)token?.actor?.isOfType("party")&&await token?.actor.addToCombat({combat:context.parent});const nonPartyData=entries.filter(e=>!e.token?.actor?.isOfType("party")).map(e=>e.data);return super.createDocuments(nonPartyData,context)}async startTurn(){const{actor,encounter}=this;if(!encounter||!actor)return;const actorUpdates={};for(const rule of actor.rules)await rule.onTurnStart?.(actorUpdates);await this.update({"flags.pf2e.roundOfLastTurn":encounter.round}),Object.keys(actorUpdates).length>0&&await actor.update(actorUpdates);for(const effect of actor.itemTypes.effect)await effect.onTurnStartEnd("start");if(actor.isOfType("character")&&actor.familiar)for(const effect of actor.familiar.itemTypes.effect)await effect.onTurnStartEnd("start");Hooks.callAll("pf2e.startTurn",this,encounter,game.user.id)}async endTurn(options){const round=options.round,{actor,encounter}=this;if(!encounter||!actor)return;const activeConditions=actor.conditions.active;for(const condition of activeConditions)await condition.onEndTurn({token:this.token});for(const effect of actor.itemTypes.effect)await effect.onTurnStartEnd("end");if(actor.isOfType("character")&&actor.familiar)for(const effect of actor.familiar.itemTypes.effect)await effect.onTurnStartEnd("end");await this.update({"flags.pf2e.roundOfLastTurnEnd":round}),Hooks.callAll("pf2e.endTurn",this,encounter,game.user.id)}prepareBaseData(){super.prepareBaseData(),this.flags.pf2e=mergeObject(this.flags.pf2e??{},{overridePriority:{}}),this.flags.pf2e.roundOfLastTurn??=null,this.flags.pf2e.initiativeStatistic??=null}async toggleDefeated({to=!this.isDefeated}={}){to!==this.isDefeated&&(await this.update({defeated:to}),await this.token?.object?.toggleEffect(game.settings.get("pf2e","deathIcon"),{active:to,overlay:!0}),this.isDefeated&&this.token?.object?.isTargeted&&this.token.object.setTarget(!1,{releaseOthers:!1}))}updateResource(){return this.isNPC&&!game.user.isGM?this.resource=null:super.updateResource()}_getInitiativeFormula(){const{actor}=this;if(!actor)return"1d20";let bonus=0;return typeof actor.attributes.initiative?.totalModifier=="number"?bonus=actor.attributes.initiative.totalModifier:actor.attributes.perception&&(bonus=actor.attributes.perception.value),["1d20",bonus||0].join("+")}async toggleNameVisibility(){if(!this.token)return;const currentVisibility=this.token.displayName,visibilityToggles={[CONST.TOKEN_DISPLAY_MODES.ALWAYS]:CONST.TOKEN_DISPLAY_MODES.OWNER,[CONST.TOKEN_DISPLAY_MODES.CONTROL]:CONST.TOKEN_DISPLAY_MODES.HOVER,[CONST.TOKEN_DISPLAY_MODES.HOVER]:CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER,[CONST.TOKEN_DISPLAY_MODES.NONE]:CONST.TOKEN_DISPLAY_MODES.HOVER,[CONST.TOKEN_DISPLAY_MODES.OWNER]:CONST.TOKEN_DISPLAY_MODES.ALWAYS,[CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER]:CONST.TOKEN_DISPLAY_MODES.HOVER};await this.token.update({displayName:visibilityToggles[currentVisibility]})}_onUpdate(changed,options,userId){if(super._onUpdate(changed,options,userId),this.encounter?.started&&typeof changed.initiative=="number"&&this.encounter.resetActors(),changed.defeated&&game.user.id===userId)for(const action2 of this.actor?.itemTypes.action??[])action2.system.deathNote&&action2.toMessage(void 0,{rollMode:this.actor?.hasPlayerOwner?"publicroll":"gmroll"})}_onDelete(options,userId){super._onDelete(options,userId),this.encounter?.started&&this.encounter.resetActors()}};__name2(_CombatantPF2e,"CombatantPF2e");let CombatantPF2e=_CombatantPF2e;const _ActorInitiative=class{static{__name(this,"_ActorInitiative")}actor;statistic;get attribute(){return this.statistic.attribute}get ability(){return foundry.utils.logCompatibilityWarning("`ActorInitiative#ability` is deprecated. Use `ActorInitiative#attribute` instead.",{since:"5.3.0",until:"6.0.0"}),this.attribute}constructor(actor){this.actor=actor;const initiativeSkill=actor.isOfType("hazard")?"stealth":actor.isOfType("character","npc")?actor.attributes.initiative?.statistic||"perception":null,base=initiativeSkill?actor.getStatistic(initiativeSkill):null,ponderousPenalty=actor.isOfType("character")?createPonderousPenalty(actor):null,rollLabel=game.i18n.format("PF2E.InitiativeWithSkill",{skillName:base?.label??""}),data={slug:"initiative",label:base?.label??"PF2E.InitiativeLabel",domains:["initiative"],rollOptions:[base?.slug??[]].flat(),check:{type:"initiative",label:rollLabel},modifiers:[ponderousPenalty??[]].flat()};this.statistic=base?base.extend(data):new Statistic(actor,data)}async roll(args={}){const combatant=args.combatant?.actor===this.actor?args.combatant:await CombatantPF2e.fromActor(this.actor,!1);if(!combatant)return null;combatant.hidden&&(args.rollMode=CONST.DICE_ROLL_MODES.PRIVATE);const roll=await this.statistic.roll(args);return roll?((args.updateTracker??!0)&&combatant.encounter.setInitiative(combatant.id,roll.total),{combatant,roll}):(game.combats.render(!1),null)}getTraceData(){const initiativeData=this.actor.attributes.initiative,tiebreakPriority=initiativeData?.tiebreakPriority??0;return{...this.statistic.getTraceData(),statistic:initiativeData?.statistic??"perception",tiebreakPriority}}};__name2(_ActorInitiative,"ActorInitiative");let ActorInitiative=_ActorInitiative;const _CreatureSizeRuleElement=class _CreatureSizeRuleElement2 extends RuleElementPF2e{static{__name(this,"_CreatureSizeRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_getReach),typeof this.value=="string"||typeof this.value=="number"||this.isBracketedValue(this.value)||this.failValidation("value must be a number, string, or bracketed value")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1}),reach:new RecordField(new fields2.StringField({required:!0,nullable:!1,choices:["add","upgrade","override"]}),new ResolvableValueField({required:!0,nullable:!1}),{required:!1,nullable:!1,initial:void 0}),resizeEquipment:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),minimumSize:new fields2.StringField({required:!1,nullable:!1,choices:SIZES,initial:void 0}),maximumSize:new fields2.StringField({required:!1,nullable:!1,choices:SIZES,initial:void 0})}}incrementSize(size,amount){return amount===0?size:this.incrementSize(_CreatureSizeRuleElement2.incrementMap[size],amount-1)}decrementSize(size,amount){return amount===0?size:this.decrementSize(_CreatureSizeRuleElement2.decrementMap[size],amount-1)}beforePrepareData(){if(!this.test())return;const value=this.resolveValue(this.value);if(!(typeof value=="string"||typeof value=="number")){this.failValidation(`CreatureSize Rule Element on actor ${this.actor.id} (${this.actor.name})`,"has a non-string, non-numeric value");return}const size=_CreatureSizeRuleElement2.wordToAbbreviation[value]??value;if(typeof size=="string"&&!tupleHasValue(SIZES,size)){this.failValidation(`"${size}" is not a recognized size`);return}const{actor}=this,originalSize=new ActorSizePF2e({value:actor.size});if(value===1){if(this.maximumSize&&!originalSize.isSmallerThan(this.maximumSize))return;actor.system.traits.size.increment()}else if(value===-1){if(this.minimumSize&&!originalSize.isLargerThan(this.minimumSize))return;actor.system.traits.size.decrement()}else if(tupleHasValue(SIZES,size))actor.system.traits.size=new ActorSizePF2e({value:size});else{const validValues=Array.from(new Set(Object.entries(_CreatureSizeRuleElement2.wordToAbbreviation).flat())).join('", "');this.failValidation(`CreatureSize Rule Element on actor ${actor.id} (${actor.name})`,`has an invalid value: must be one of "${validValues}", +1, or -1`);return}const{reach}=actor.system.attributes;if(reach.base=__privateMethod(this,_getReach,getReach_fn).call(this,originalSize),reach.manipulate=Math.max(reach.manipulate,reach.base),this.resizeEquipment){const sizeDifference=originalSize.difference(actor.system.traits.size,{smallIsMedium:!0});for(const item of actor.inventory.filter(i=>!(i instanceof TreasurePF2e&&i.isCoinage)))sizeDifference<0?item.system.size=this.incrementSize(item.size,Math.abs(sizeDifference)):sizeDifference>0&&(item.system.size=this.decrementSize(item.size,Math.abs(sizeDifference)))}}};_getReach=new WeakSet,getReach_fn=__name2(function(originalSize){const current=this.actor.attributes.reach.base;if(this.reach){const changeValue=(()=>{const resolved=this.resolveValue(this.reach.add??this.reach.upgrade??this.reach.override);return Math.trunc(Math.abs(Number(resolved)))})();if(!Number.isInteger(changeValue))return current;if(this.reach.add)return current+changeValue;if(this.reach.upgrade)return Math.max(current,changeValue);if(this.reach.override)return changeValue}const newSize=this.actor.system.traits.size;return newSize.isLargerThan(originalSize)?Math.max(SIZE_TO_REACH[this.actor.size],current):newSize.isSmallerThan(originalSize)?Math.min(SIZE_TO_REACH[this.actor.size],current):current},"#getReach"),__name2(_CreatureSizeRuleElement,"CreatureSizeRuleElement"),__publicField(_CreatureSizeRuleElement,"validActorTypes",["character","npc","familiar"]),__publicField(_CreatureSizeRuleElement,"wordToAbbreviation",{tiny:"tiny",small:"sm",medium:"med",large:"lg",huge:"huge",gargantuan:"grg"}),__publicField(_CreatureSizeRuleElement,"incrementMap",{tiny:"sm",sm:"med",med:"lg",lg:"huge",huge:"grg",grg:"grg"}),__publicField(_CreatureSizeRuleElement,"decrementMap",{tiny:"tiny",sm:"tiny",med:"sm",lg:"med",huge:"lg",grg:"huge"});let CreatureSizeRuleElement=_CreatureSizeRuleElement;const _IWRRuleElement=class extends RuleElementPF2e{static{__name(this,"_IWRRuleElement")}constructor(){super(...arguments),__privateAdd(this,_isValid)}static get dictionary(){return{}}static defineSchema(){const{fields:fields2}=foundry.data,{DataModelValidationFailure}=foundry.data.validation;return{...super.defineSchema(),mode:new fields2.StringField({required:!0,choices:["add","remove"],initial:"add"}),type:new fields2.ArrayField(new StrictStringField({required:!0,blank:!1,initial:void 0}),{validate:v=>Array.isArray(v)&&v.length>0||new DataModelValidationFailure({message:"must have at least one"})}),definition:new PredicateField({required:!1,initial:void 0}),exceptions:this.createExceptionsField(),override:new fields2.BooleanField}}static createExceptionsField(types){const customExceptionField=new foundry.data.fields.SchemaField({definition:new PredicateField({initial:void 0}),label:new StrictStringField({required:!0,blank:!1,initial:void 0})},{required:!0,initial:void 0}),exceptionField=new DataUnionField([new StrictStringField({required:!0,blank:!1,initial:void 0,choices:types}),customExceptionField],{required:!0,nullable:!1,initial:void 0});return new StrictArrayField(exceptionField)}static validateJoint(source){if(super.validateJoint(source),source.type.some(t=>t==="custom")){if(source.type.length>1)throw Error(' type: "custom" may not be included among other types');if(!source.definition)throw Error(" definition: must be present if defining a custom type")}else if(source.definition)throw Error(" definition: may only be present if defining a custom type");if(source.mode==="remove"&&source.exceptions.length>0)throw Error(' exceptions: may not be included with a mode of "remove"')}afterPrepareData(){if(!this.test())return;this.type=this.resolveInjectedProperties(this.type);const value=Math.floor(Number(this.resolveValue(this.value)));if(__privateMethod(this,_isValid,isValid_fn).call(this,value))if(this.mode==="add")this.property.push(...this.getIWR(value));else for(const toRemove of this.type)this.property.findSplice(iwr=>iwr.type===toRemove)}};_isValid=new WeakSet,isValid_fn=__name2(function(value){const{dictionary}=this.constructor,unrecognizedTypes=this.type.filter(t=>!(t in dictionary));if(unrecognizedTypes.length>0){for(const type of unrecognizedTypes)this.failValidation(`Type "${type}" is unrecognized`);return!1}return this.mode==="add"&&dictionary!==CONFIG.PF2E.immunityTypes&&(typeof value!="number"||value<0)?(this.failValidation("A `value` must be a positive number"),!1):!0},"#isValid"),__name2(_IWRRuleElement,"IWRRuleElement");let IWRRuleElement=_IWRRuleElement;const _ImmunityRuleElement=class extends IWRRuleElement{static{__name(this,"_ImmunityRuleElement")}value=null;static defineSchema(){return{...super.defineSchema(),exceptions:this.createExceptionsField(this.dictionary)}}static get dictionary(){return CONFIG.PF2E.immunityTypes}get property(){return this.actor.system.attributes.immunities}getIWR(){return this.type.map(t=>new Immunity({type:t,customLabel:t==="custom"?this.label:null,definition:this.definition,exceptions:this.exceptions,source:this.item.name})).filter(immunity=>{const existing=this.property.find(e=>e.type===immunity.type);return this.mode==="remove"||!(existing?.type===immunity.type&&existing.exceptions.every(x=>immunity.exceptions.includes(x)))})}};__name2(_ImmunityRuleElement,"ImmunityRuleElement");let ImmunityRuleElement=_ImmunityRuleElement;const _ResistanceRuleElement=class extends IWRRuleElement{static{__name(this,"_ResistanceRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0}),exceptions:this.createExceptionsField(this.dictionary),doubleVs:this.createExceptionsField(this.dictionary)}}static get dictionary(){return CONFIG.PF2E.resistanceTypes}get property(){return this.actor.system.attributes.resistances}getIWR(value){if(value<=0)return[];const resistances=this.property;for(const resistanceType of[...this.type]){const current=resistances.find(r=>r.type===resistanceType);current&&(this.override?resistances.splice(resistances.indexOf(current),1):this.mode!=="remove"&&(current.value=Math.max(current.value,value),current.source=this.label,this.type.splice(this.type.indexOf(resistanceType),1)))}return this.type.map(t=>new Resistance({type:t,value,customLabel:t==="custom"?this.label:null,definition:this.definition,exceptions:this.exceptions,doubleVs:this.doubleVs,source:this.item.name}))}};__name2(_ResistanceRuleElement,"ResistanceRuleElement");let ResistanceRuleElement=_ResistanceRuleElement;const _WeaknessRuleElement=class extends IWRRuleElement{static{__name(this,"_WeaknessRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0}),exceptions:this.createExceptionsField(this.dictionary)}}static get dictionary(){return CONFIG.PF2E.weaknessTypes}get property(){return this.actor.system.attributes.weaknesses}getIWR(value){if(value<=0)return[];const weaknesses=this.property;for(const weaknessType of[...this.type]){const current=weaknesses.find(w=>w.type===weaknessType);current&&(this.override?weaknesses.splice(weaknesses.indexOf(current),1):this.mode!=="remove"&&(current.value=Math.max(current.value,value),current.source=this.label,this.type.splice(this.type.indexOf(weaknessType),1)))}return this.type.map(t=>new Weakness({type:t,customLabel:t==="custom"?this.label:null,definition:this.definition,value,exceptions:this.exceptions,source:this.item.name}))}};__name2(_WeaknessRuleElement,"WeaknessRuleElement");let WeaknessRuleElement=_WeaknessRuleElement;const _SenseRuleElement=class extends RuleElementPF2e{static{__name(this,"_SenseRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,nullable:!1,choices:[...SENSE_TYPES]}),force:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),acuity:new fields2.StringField({required:!1,nullable:!1,choices:SENSE_ACUITIES,initial:void 0}),range:new ResolvableValueField({required:!1,nullable:!1,initial:void 0})}}constructor(data,options){data.selector&&(data.label??=CONFIG.PF2E.senses[data.selector]),super(data,options)}beforePrepareData(){if(this.ignored)return;const range=this.resolveValue(this.range,""),newSense=new CreatureSensePF2e({type:this.selector,acuity:this.acuity,value:String(range),source:this.item.name});this.actor.synthetics.senses.push({sense:newSense,predicate:this.predicate,force:this.force})}};__name2(_SenseRuleElement,"SenseRuleElement"),__publicField(_SenseRuleElement,"validActorTypes",["character","familiar"]);let SenseRuleElement=_SenseRuleElement;const _StrikeRuleElement=class extends RuleElementPF2e{static{__name(this,"_StrikeRuleElement")}constructor(source,options){source.img??=source.fist?"icons/skills/melee/unarmed-punch-fist.webp":options.parent.img,super(source,options),__privateAdd(this,_constructWeapon),this.fist&&(this.label=game.i18n.localize("PF2E.Weapon.Base.fist")),this.slug??=sluggify(this.label),this.battleForm??=!1,this.fist??=!1,this.options??=[]}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),category:new fields2.StringField({required:!0,blank:!1,choices:CONFIG.PF2E.weaponCategories,initial:"unarmed"}),group:new fields2.StringField({required:!0,nullable:!0,blank:!1,choices:CONFIG.PF2E.weaponGroups,initial:null}),baseType:new fields2.StringField({required:!0,nullable:!0,blank:!1,choices:CONFIG.PF2E.baseWeaponTypes,initial:null}),traits:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,choices:CONFIG.PF2E.npcAttackTraits})),traitToggles:new fields2.SchemaField({modular:new fields2.StringField({required:!0,blank:!1,nullable:!0,choices:CONFIG.PF2E.damageTypes,initial:null}),versatile:new fields2.StringField({required:!0,blank:!1,nullable:!0,choices:CONFIG.PF2E.damageTypes,initial:null})},{required:!0,nullable:!1,initial:{modular:null,versatile:null}}),otherTags:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,choices:CONFIG.PF2E.otherWeaponTags}),{required:!1,nullable:!1,initial:[]}),range:new fields2.SchemaField({increment:new fields2.NumberField({required:!1,integer:!0,min:5,nullable:!0,initial:5}),max:new fields2.NumberField({required:!1,integer:!0,min:5,nullable:!0,initial:null})},{required:!1,nullable:!0,initial:null}),damage:new fields2.SchemaField({base:new fields2.SchemaField({damageType:new fields2.StringField({required:!0,blank:!1,initial:"bludgeoning"}),dice:new ResolvableValueField({required:!0,nullable:!1,initial:1}),die:new fields2.StringField({required:!0,choices:CONFIG.PF2E.damageDie,initial:"d4"}),modifier:new fields2.NumberField({nullable:!1,integer:!0,initial:0})})}),img:new fields2.FilePathField({categories:["IMAGE"],nullable:!1,initial:()=>"systems/pf2e/icons/default-icons/melee.svg"}),attackModifier:new fields2.NumberField({integer:!0,positive:!0,nullable:!0,initial:null}),replaceAll:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),replaceBasicUnarmed:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),battleForm:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),ability:new fields2.StringField({required:!1,blank:!1,choices:CONFIG.PF2E.abilities,nullable:!0,initial:null}),options:new fields2.ArrayField(new fields2.StringField,{required:!1,initial:void 0}),fist:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0})}}validate(options){return(options?.changes??this._source).fist===!0?!0:super.validate(options)}_initializeSource(source,options){return"fist"in source&&source.fist===!0?source:super._initializeSource(source,options)}_initialize(options){this._source.fist?(this.key="Strike",this.priority=99,this.slug="fist",this.img=this._source.img,this.category="unarmed",this.group="brawling",this.baseType="fist",this.traits=["agile","finesse","nonlethal"],this.traitToggles=mergeObject({modular:null,versatile:null},this._source.traitToggles??{}),this.otherTags=[],this.range=null,this.damage={base:{dice:1,die:"d4",damageType:"bludgeoning",modifier:0}},this.battleForm=!1,this.fist=!0,this.replaceAll=!1,this.replaceBasicUnarmed=!1,this.predicate=new PredicatePF2e([...this._source.predicate??[],{gt:["hands-free",0]}])):super._initialize(options)}beforePrepareData(){if(this.ignored)return;const predicatePassed=this.predicate.length===0||(()=>{const rollOptions=new Set(this.actor.getRollOptions(["attack","attack-roll","strike-attack-roll"]));return this.resolveInjectedProperties(this.predicate).test(rollOptions)})(),damageType=this.resolveInjectedProperties(this.damage.base.damageType);if(!objectHasKey(CONFIG.PF2E.damageTypes,damageType))return this.failValidation("Unrecognized damage type");const dice=(()=>{const resolvedDice=Number(this.resolveValue(this.damage.base.dice));return Math.clamped(Math.trunc(resolvedDice),0,8)})();if(Number.isNaN(dice))return this.failValidation("dice does not resolve to a number");if(predicatePassed){const weapon=__privateMethod(this,_constructWeapon,constructWeapon_fn).call(this,damageType,dice),slug=weapon.slug??sluggify(weapon.name);this.actor.synthetics.strikes.set(slug,weapon)}}afterPrepareData(){if(!(this.ignored||!this.actor.isOfType("character")))if(this.replaceAll){const systemData=this.actor.system;systemData.actions=systemData.actions.filter(a=>a.item.id===this.item.id&&a.item.name===this.label&&a.item.group===this.group)}else this.replaceBasicUnarmed&&this.actor.system.actions.findSplice(a=>a.item?.slug==="basic-unarmed")}async toggleTrait({trait,selection}){const ruleSources=deepClone(this.item._source.system.rules),rule=ruleSources.at(this.sourceIndex??NaN);rule?.key==="Strike"&&(rule.traitToggles={...this.traitToggles,[trait]:selection},await this.item.update({"system.rules":ruleSources}))}};_constructWeapon=new WeakSet,constructWeapon_fn=__name2(function(damageType,dice){const actorIsNPC=this.actor.isOfType("npc"),source=deepClone({_id:this.item.id,name:this.label,type:"weapon",img:this.img,flags:{pf2e:{battleForm:this.battleForm,fixedAttack:actorIsNPC?this.attackModifier??null:null}},system:{slug:this.slug,description:{value:""},category:this.category,group:this.group,baseItem:this.baseType,attribute:this.ability,bonus:{value:actorIsNPC?this.attackModifier??0:0},damage:{...this.damage.base,dice,damageType},range:this.range?.increment??null,maxRange:this.range?.max??null,traits:{value:this.traits,otherTags:this.otherTags,rarity:"common",toggles:{modular:{selection:this.traitToggles.modular},versatile:{selection:this.traitToggles.versatile}}},options:{value:this.options},usage:{value:"held-in-one-hand"},equipped:{carryType:"held",handsHeld:1}}});return new WeaponPF2e(source,{parent:this.actor})},"#constructWeapon"),__name2(_StrikeRuleElement,"StrikeRuleElement"),__publicField(_StrikeRuleElement,"validActorTypes",["character","npc"]);let StrikeRuleElement=_StrikeRuleElement;const _TempHPRuleElement=class extends RuleElementPF2e{static{__name(this,"_TempHPRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1}),events:new StrictSchemaField({onCreate:new fields2.BooleanField({required:!1,nullable:!1}),onTurnStart:new fields2.BooleanField({required:!1,nullable:!1})},{required:!0,nullable:!1,initial:{onCreate:!0,onTurnStart:!1}})}}onCreate(actorUpdates){if(this.ignored||!this.events.onCreate)return;const updatedActorData=mergeObject(this.actor._source,actorUpdates,{inplace:!1}),value=this.resolveValue(this.value),rollOptions=Array.from(new Set([...this.actor.getRollOptions(),...this.actor.itemTypes.weapon.flatMap(w=>w.isEquipped?w.getRollOptions("self:weapon"):[])]));if(!this.test(rollOptions))return;if(typeof value!="number")return this.failValidation("Temporary HP requires a non-zero value field");const currentTempHP=Number(getProperty(updatedActorData,"system.attributes.hp.temp"))||0;value>currentTempHP&&(mergeObject(actorUpdates,{"system.attributes.hp.temp":value,"system.attributes.hp.tempsource":this.item.id}),this.broadcast(value,currentTempHP))}onTurnStart(actorUpdates){if(this.ignored||!this.events.onTurnStart)return;const rollOptions=Array.from(new Set([...this.actor.getRollOptions(["all"]),...this.actor.itemTypes.weapon.flatMap(w=>w.isEquipped?w.getRollOptions("self:weapon"):[])]));if(!this.test(rollOptions))return;const value=this.resolveValue(this.value);if(typeof value!="number")return this.failValidation("Temporary HP requires a non-zero value field");const updatedActorData=mergeObject(this.actor._source,actorUpdates,{inplace:!1}),currentTempHP=Number(getProperty(updatedActorData,"system.attributes.hp.temp"))||0;value>currentTempHP&&(actorUpdates["system.attributes.hp.temp"]=value,this.broadcast(value,currentTempHP))}onDelete(actorUpdates){const updatedActorData=mergeObject(this.actor._source,actorUpdates,{inplace:!1});if(getProperty(updatedActorData,"system.attributes.hp.tempsource")===this.item.id){mergeObject(actorUpdates,{"system.attributes.hp.temp":0});const hpData=getProperty(actorUpdates,"system.attributes.hp");isObject(hpData)&&(hpData["-=tempsource"]=null)}}broadcast(newQuantity,oldQuantity){const singularOrPlural=newQuantity===1?"PF2E.Encounter.Broadcast.TempHP.SingleNew":"PF2E.Encounter.Broadcast.TempHP.PluralNew",wasAt=oldQuantity>0?game.i18n.format("PF2E.Encounter.Broadcast.TempHP.WasAt",{oldQuantity}):"",[actor,item]=[this.actor.name,this.item.name],content=game.i18n.format(singularOrPlural,{actor,newQuantity,wasAt,item}),recipients=game.users.filter(u=>this.actor.testUserPermission(u,"OWNER")).map(u=>u.id),speaker=ChatMessagePF2e.getSpeaker({actor:this.actor,token:this.token});ChatMessagePF2e.create({content,speaker,whisper:recipients})}};__name2(_TempHPRuleElement,"TempHPRuleElement"),__publicField(_TempHPRuleElement,"validActorTypes",["character","npc","familiar"]);let TempHPRuleElement=_TempHPRuleElement;const _BattleFormRuleElement=class extends RuleElementPF2e{static{__name(this,"_BattleFormRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_setRollOptions),__privateAdd(this,_prepareAC),__privateAdd(this,_prepareSenses),__privateAdd(this,_prepareSize),__privateAdd(this,_prepareSpeeds),__privateAdd(this,_prepareSkills),__privateAdd(this,_prepareStrikes),__privateAdd(this,_prepareIWR),__privateAdd(this,_suppressModifiers),__privateAdd(this,_filterModifier),__privateAdd(this,_suppressNotes),__privateAdd(this,_resolveStrikeQueries),__publicField(this,"modifierLabel"),this.overrides=this.resolveValue(this.value,this.overrides),this.modifierLabel=this.getReducedLabel()}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!1,initial:void 0}),overrides:new fields2.SchemaField({traits:new fields2.ArrayField(new fields2.StringField),armorClass:new fields2.SchemaField({modifier:new ResolvableValueField({required:!1,nullable:!1,initial:0}),ignoreCheckPenalty:new fields2.BooleanField({required:!1,nullable:!1,initial:!0}),ignoreSpeedPenalty:new fields2.BooleanField({required:!1,nullable:!1,initial:!0})},{required:!1,initial:void 0}),tempHP:new ResolvableValueField({required:!1,nullable:!0,initial:null}),senses:new RecordField(new fields2.StringField({required:!0,blank:!1,choices:[...SENSE_TYPES]}),new fields2.SchemaField({acuity:new fields2.StringField({choices:SENSE_ACUITIES,required:!1,blank:!1,initial:void 0}),range:new fields2.NumberField({required:!1,nullable:!0,initial:void 0})}),{required:!1,initial:void 0}),size:new fields2.StringField({required:!1,blank:!1,initial:void 0}),speeds:new fields2.ObjectField({required:!1,initial:void 0}),skills:new fields2.ObjectField({required:!1,initial:void 0}),strikes:new fields2.ObjectField({required:!1}),immunities:new fields2.ArrayField(new fields2.ObjectField),weaknesses:new fields2.ArrayField(new fields2.ObjectField),resistances:new fields2.ArrayField(new fields2.ObjectField)},{required:!0,nullable:!1}),ownUnarmed:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),canCast:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),canSpeak:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),hasHands:new fields2.BooleanField({required:!1,nullable:!1,initial:!1})}}async preCreate({itemSource,ruleSource}){if(!this.test()){ruleSource.ignored=!0;return}const rules=itemSource.system?.rules??[];for(const rule of rules)if(["DamageDice","FlatModifier","Note"].includes(String(rule.key))){const predicate=rule.predicate??=[];Array.isArray(predicate)&&predicate.push("battle-form")}await __privateMethod(this,_resolveStrikeQueries,resolveStrikeQueries_fn).call(this,ruleSource)}onCreate(actorUpdates){if(this.ignored)return;const tempHP=this.overrides.tempHP;tempHP&&new TempHPRuleElement({key:"TempHP",label:this.label,value:tempHP},{parent:this.item}).onCreate(actorUpdates)}beforePrepareData(){if(this.ignored)return;const{actor}=this,{attributes}=actor;if(attributes.polymorphed){actor.synthetics.preparationWarnings.add("PF2e System | You are already under a polymorph effect"),this.ignored=!0;return}attributes.polymorphed=!0,attributes.battleForm=!0,__privateMethod(this,_setRollOptions,setRollOptions_fn).call(this),__privateMethod(this,_prepareSenses,prepareSenses_fn).call(this);for(const trait of this.overrides.traits){const currentTraits=actor.system.traits;currentTraits.value.includes(trait)||currentTraits.value.push(trait)}if(this.overrides.armorClass?.ignoreSpeedPenalty){const speedRollOptions=actor.rollOptions.speed??={};speedRollOptions["armor:ignore-speed-penalty"]=!0}}afterPrepareData(){this.ignored||(__privateMethod(this,_prepareAC,prepareAC_fn).call(this),__privateMethod(this,_prepareSize,prepareSize_fn).call(this),__privateMethod(this,_prepareSkills,prepareSkills_fn).call(this),__privateMethod(this,_prepareSpeeds,prepareSpeeds_fn).call(this),__privateMethod(this,_prepareStrikes,prepareStrikes_fn).call(this),__privateMethod(this,_prepareIWR,prepareIWR_fn).call(this),this.actor.initiative=new ActorInitiative(this.actor),this.actor.system.attributes.initiative=this.actor.initiative.getTraceData())}onDelete(actorUpdates){if(this.ignored)return;const tempHP=this.overrides.tempHP;tempHP&&new TempHPRuleElement({key:"TempHP",label:this.label,value:tempHP},{parent:this.item}).onDelete(actorUpdates)}applyDamageExclusion(weapon,modifiers){if(!this.ownUnarmed)for(const modifier of modifiers){if(modifier.predicate.some(s=>s instanceof Object&&"not"in s&&s.not==="battle-form"))continue;const isNumericBonus=modifier instanceof ModifierPF2e&&modifier.modifier>=0,isAbilityModifier=modifier instanceof ModifierPF2e&&modifier.type==="ability",isExtraDice=modifier instanceof DamageDicePF2e,isStatusOrCircumstance=isNumericBonus&&["status","circumstance"].includes(modifier.type),isDamageTrait=isExtraDice&&/^(?:deadly|fatal)-\d?d\d{1,2}$/.test(modifier.slug)&&tupleHasValue(this.overrides?.strikes?.[weapon.slug??""]?.traits??[],modifier.slug),isBattleFormModifier=!!(modifier.predicate.includes("battle-form")||modifier.predicate.some(s=>s instanceof Object&&"or"in s&&s.or.includes("battle-form"))||isDamageTrait);(isNumericBonus||isAbilityModifier||isExtraDice)&&!isStatusOrCircumstance&&!isBattleFormModifier&&(modifier.enabled=!1,modifier.ignored=!0,modifier.predicate.push({not:"battle-form"}))}}};_defaultIcons=new WeakMap,_setRollOptions=new WeakSet,setRollOptions_fn=__name2(function(){const{attributes,rollOptions}=this.actor;if(rollOptions.all.polymorph=!0,rollOptions.all["battle-form"]=!0,this.overrides.armorClass&&(rollOptions.all["armor:ignore-check-penalty"]=this.overrides.armorClass.ignoreCheckPenalty,rollOptions.all["armor:ignore-speed-penalty"]=this.overrides.armorClass.ignoreSpeedPenalty,this.overrides.armorClass.ignoreSpeedPenalty)){const speedRollOptions=rollOptions.speed??={};speedRollOptions["armor:ignore-speed-penalty"]=!0}if(this.overrides.skills)for(const key of SKILL_ABBREVIATIONS){if(!(key in this.overrides.skills))continue;const longForm=SKILL_DICTIONARY[key];rollOptions.all[`battle-form:${longForm}`]=!0}attributes.handsFree=Math.max(Object.values(this.overrides.strikes??{}).reduce((count,s)=>s.category==="unarmed"?count:count-1,2),0);for(const num of[0,1,2])attributes.handsFree===num?rollOptions.all[`hands-free:${num}`]=!0:delete rollOptions.all[`hands-free:${num}`]},"#setRollOptions"),_prepareAC=new WeakSet,prepareAC_fn=__name2(function(){const overrides=this.overrides,{actor}=this,{armorClass}=actor;if(!(Number(this.resolveValue(overrides.armorClass?.modifier,armorClass.value))||0))return;__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,armorClass);const newModifier=(Number(this.resolveValue(overrides.armorClass?.modifier))||0)-10;armorClass.modifiers.push(new ModifierPF2e(this.modifierLabel,newModifier,"untyped")),this.actor.system.attributes.ac=armorClass.parent.getTraceData()},"#prepareAC"),_prepareSenses=new WeakSet,prepareSenses_fn=__name2(function(){for(const senseType of SENSE_TYPES){const newSense=this.overrides.senses?.[senseType];if(!newSense)continue;newSense.acuity??="precise";const ruleData={key:"Sense",selector:senseType,force:!0,...newSense};new SenseRuleElement(ruleData,{parent:this.item}).beforePrepareData()}},"#prepareSenses"),_prepareSize=new WeakSet,prepareSize_fn=__name2(function(){if(!this.overrides.size)return;const ruleData={key:"CreatureSize",label:this.label,value:this.overrides.size};new CreatureSizeRuleElement(ruleData,{parent:this.item}).beforePrepareData()},"#prepareSize"),_prepareSpeeds=new WeakSet,prepareSpeeds_fn=__name2(function(){const{attributes}=this.actor,currentSpeeds=attributes.speed;for(const movementType of MOVEMENT_TYPES){const speedOverride=this.overrides.speeds?.[movementType];if(typeof speedOverride=="number")if(movementType==="land")__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,attributes.speed),attributes.speed.value=speedOverride;else{const{otherSpeeds}=currentSpeeds,label=game.i18n.localize(CONFIG.PF2E.speedTypes[movementType]);otherSpeeds.findSplice(s=>s.type===movementType),otherSpeeds.push({type:movementType,label,value:speedOverride});const newSpeed=this.actor.prepareSpeed(movementType);if(!newSpeed)throw ErrorPF2e("Unexpected failure retrieving movement type");__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,newSpeed),otherSpeeds.findSplice(s=>s.type===movementType),otherSpeeds.push(newSpeed)}}},"#prepareSpeeds"),_prepareSkills=new WeakSet,prepareSkills_fn=__name2(function(){for(const[skillShort,newSkill]of Object.entries(this.overrides.skills??{})){if(!setHasElement(SKILL_ABBREVIATIONS,skillShort))return this.failValidation(`Unrecognized skill abbreviation: ${skillShort}`);newSkill.ownIfHigher??=!0;const key=SKILL_DICTIONARY[skillShort],currentSkill=this.actor.skills[key],newModifier=Number(this.resolveValue(newSkill.modifier))||0;if(currentSkill.mod>newModifier&&newSkill.ownIfHigher)continue;const baseMod=new ModifierPF2e({label:this.modifierLabel,slug:"battle-form",modifier:newModifier,type:"untyped"});this.actor.skills[key]=currentSkill.extend({modifiers:[baseMod],filter:__privateMethod(this,_filterModifier,filterModifier_fn)}),this.actor.system.skills[skillShort]=mergeObject(this.actor.system.skills[skillShort],this.actor.skills[key].getTraceData())}},"#prepareSkills"),_prepareStrikes=new WeakSet,prepareStrikes_fn=__name2(function(){const{synthetics}=this.actor,strikes=this.overrides.strikes??{},ruleData=Object.entries(strikes).map(([slug,strikeData])=>({key:"Strike",label:game.i18n.localize(strikeData.label)??`PF2E.BattleForm.Attack.${sluggify(slug,{camel:"bactrian"})}`,slug,img:strikeData.img??__privateGet(_BattleFormRuleElement,_defaultIcons)[slug]??this.item.img,category:strikeData.category,group:strikeData.group,baseItem:strikeData.baseType,options:[slug],damage:{base:strikeData.damage},range:strikeData.range,maxRange:strikeData.maxRange,traits:strikeData.traits??[],ability:strikeData.ability,ownIfHigher:strikeData.ownIfHigher??=!0}));if(this.ownUnarmed){for(const[slug,weapon]of synthetics.strikes.entries())weapon.category!=="unarmed"&&synthetics.strikes.delete(slug);this.actor.rollOptions.all["battle-form:own-attack-modifier"]=!0}else{synthetics.strikes.clear();for(const striking of Object.values(synthetics.striking).flat())(striking.predicate??=new PredicatePF2e).push({not:"battle-form"});for(const datum of ruleData)datum.traits.includes("magical")||datum.traits.push("magical"),new StrikeRuleElement({...datum,battleForm:!0},{parent:this.item}).beforePrepareData()}this.actor.system.actions=this.actor.prepareStrikes({includeBasicUnarmed:this.ownUnarmed}).filter(a=>a.slug&&a.slug in strikes||this.ownUnarmed&&a.item.category==="unarmed");const strikeActions=this.actor.system.actions.flatMap(s=>[s,...s.altUsages]);for(const action2 of strikeActions){const strike=strikes[action2.slug??""]??null;if(!this.ownUnarmed&&strike&&(Number(this.resolveValue(strike.modifier))>=action2.totalModifier||!strike.ownIfHigher)){__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,action2),__privateMethod(this,_suppressNotes,suppressNotes_fn).call(this,Object.entries(synthetics.rollNotes).flatMap(([key,note])=>/\bdamage\b/.test(key)?note:[]));const baseModifier=Number(this.resolveValue(strike.modifier))||0;action2.unshift(new ModifierPF2e(this.modifierLabel,baseModifier,"untyped"))}else{const options=this.actor.rollOptions["strike-attack-roll"]??={};options["battle-form:own-attack-modifier"]=!0,action2.calculateTotal(new Set(this.actor.getRollOptions(action2.domains)))}}},"#prepareStrikes"),_prepareIWR=new WeakSet,prepareIWR_fn=__name2(function(){for(const immunity of this.overrides.immunities)new ImmunityRuleElement({key:"Immunity",...immunity},{parent:this.item}).afterPrepareData();for(const weakness of this.overrides.weaknesses){const args={key:"Weakness",...weakness,override:!0};new WeaknessRuleElement(args,{parent:this.item}).afterPrepareData()}for(const resistance of this.overrides.resistances){const args={key:"Resistance",...resistance,override:!0};new ResistanceRuleElement(args,{parent:this.item}).afterPrepareData()}},"#prepareIWR"),_suppressModifiers=new WeakSet,suppressModifiers_fn=__name2(function(statistic){for(const modifier of statistic.modifiers)__privateMethod(this,_filterModifier,filterModifier_fn).call(this,modifier)||(modifier.adjustments.push({slug:null,test:()=>!0,suppress:!0}),modifier.ignored=!0,modifier.enabled=!1);statistic instanceof StatisticModifier&&statistic.calculateTotal()},"#suppressModifiers"),_filterModifier=new WeakSet,filterModifier_fn=__name2(function(modifier){return modifier.slug==="battle-form"?!0:modifier.type==="ability"?!1:["status","circumstance"].includes(modifier.type)||modifier.modifier<0},"#filterModifier"),_suppressNotes=new WeakSet,suppressNotes_fn=__name2(function(notes){for(const note of notes)note.predicate.includes("battle-form")||(note.predicate=note.predicate instanceof PredicatePF2e?note.predicate:new PredicatePF2e(note.predicate),note.predicate.push({not:"battle-form"}))},"#suppressNotes"),_resolveStrikeQueries=new WeakSet,resolveStrikeQueries_fn=__name2(async function(ruleSource){const value=ruleSource.overrides?ruleSource.overrides:ruleSource.value??={};if(!__name2(v=>isObject(v)&&isObject(v.strikes),"hasStrikes")(value))return;const isStrikeQuery=__name2(maybeQuery=>isObject(maybeQuery)?typeof maybeQuery.query=="string"&&typeof maybeQuery.modifier=="number":!1,"isStrikeQuery");for(const[slug,strike]of Object.entries(value.strikes)){if(!isStrikeQuery(strike))continue;strike.pack=String(strike.pack??"pf2e.equipment-srd"),strike.ownIfHigher=!!(strike.ownIfHigher??!0);const queryObject=(()=>{try{const parsed=JSON.parse(String(this.resolveInjectedProperties(strike.query)));if(!isObject(parsed)||Array.isArray(parsed))throw Error("A strike query must be an NeDB query object");return parsed}catch(error){return error instanceof Error&&this.failValidation(error.message),ruleSource.ignored=!0,null}})();if(!queryObject){this.failValidation("Malformed query object");break}const weapon=(await game.packs.get(strike.pack)?.getDocuments(queryObject))?.[0];if(!(weapon instanceof WeaponPF2e)){this.failValidation("Failed to retrieve queried weapon");break}const resolved={label:weapon.name,img:weapon.img,ability:weapon.isRanged||weapon.traits.has("finesse")?"dex":"str",category:weapon.category,group:weapon.group,baseType:weapon.baseType,traits:deepClone(weapon.system.traits.value),modifier:strike.modifier,damage:deepClone(weapon.system.damage),ownIfHigher:strike.ownIfHigher};value.strikes[slug]=resolved}},"#resolveStrikeQueries"),__name2(_BattleFormRuleElement,"BattleFormRuleElement"),__publicField(_BattleFormRuleElement,"validActorTypes",["character"]),__privateAdd(_BattleFormRuleElement,_defaultIcons,["antler","beak","body","bone-shard","branch","claw","cube-face","fangs","fire-mote","fist","foot","foreleg","gust","horn","jaws","lighting-lash","mandibles","piercing-hymn","pincer","pseudopod","rock","spikes","stinger","tail","talon","tendril","tentacle","tongue","trunk","tusk","vine","water-spout","wave","wing"].reduce((accumulated,slug)=>{const path=slug==="fist"?"icons/skills/melee/unarmed-punch-fist.webp":`systems/pf2e/icons/unarmed-attacks/${slug}.webp`;return{...accumulated,[slug]:path}},{}));let BattleFormRuleElement=_BattleFormRuleElement;const _PickAThingPrompt=class extends Application{static{__name(this,"_PickAThingPrompt")}constructor(data){super(),__publicField(this,"item"),__privateAdd(this,_resolve3,void 0),__publicField(this,"selection",null),__publicField(this,"choices",[]),__publicField(this,"selectMenu"),__publicField(this,"predicate"),__publicField(this,"allowNoSelection"),this.item=data.item,this.predicate=data.predicate??new PredicatePF2e,this.options.title=data.title??this.item.name,this.allowNoSelection=data.allowNoSelection??!1}get actor(){return this.item.actor}static get defaultOptions(){return{...super.defaultOptions,classes:["pick-a-thing-prompt"],resizable:!1,height:"auto",width:"auto"}}getChoices(){return this.choices.filter(choice=>this.predicate.test(choice.domain??[]))??[]}getSelection(event){if(!(event.currentTarget instanceof HTMLElement))throw ErrorPF2e("Unexpected error retrieving form data");const selectedIndex=(event.currentTarget.closest(".choice")?.querySelector("button[data-action=pick]")??event.currentTarget.closest(".content")?.querySelector("tag")??event.currentTarget).getAttribute("value");return["",null].includes(selectedIndex)||!Number.isInteger(Number(selectedIndex))?null:this.choices.at(Number(selectedIndex))??null}async resolveSelection(){return this.choices=this.getChoices(),this.render(!0),new Promise(resolve=>{__privateSet(this,_resolve3,resolve)})}async getData(options={}){const slug=this.item.slug??sluggify(this.item.name);return options.id=`pick-a-${slug}`,{selectMenu:this.choices.length>9,choices:this.choices.map((c,index)=>({...c,value:index}))}}activateListeners($html){const html=$html[0];for(const element of htmlQueryAll(html,"a[data-choice], button[data-action=pick]"))element.addEventListener("click",event=>{this.selection=this.getSelection(event)??null,this.close()});const select=htmlQuery(html,"input[data-tagify-select]");select&&(this.selectMenu=new Tagify(select,{enforceWhitelist:!0,keepInvalidTags:!1,mode:"select",tagTextProp:"label",dropdown:{closeOnSelect:!0,enabled:1,highlightFirst:!0,mapValueTo:"label",maxItems:this.choices.length,searchKeys:["label"]},whitelist:this.choices.map((c,index)=>({value:index.toString(),label:c.label}))}),this.selectMenu.DOM.input.spellcheck=!1)}async close(options){var _a;for(const element of htmlQueryAll(this.element[0],"button, select"))element.style.pointerEvents="none";return this.choices.length===0?ui.notifications.warn(game.i18n.format("PF2E.UI.RuleElements.Prompt.NoValidOptions",{actor:this.actor.name,item:this.item.name})):!this.selection&&!this.allowNoSelection&&ui.notifications.warn(game.i18n.format("PF2E.UI.RuleElements.Prompt.NoSelectionMade",{item:this.item.name})),(_a=__privateGet(this,_resolve3))==null||_a.call(this,this.selection),super.close(options)}};_resolve3=new WeakMap,__name2(_PickAThingPrompt,"PickAThingPrompt");let PickAThingPrompt=_PickAThingPrompt;const _ChoiceSetPrompt=class extends PickAThingPrompt{static{__name(this,"_ChoiceSetPrompt")}prompt;containsItems;allowedDrops;constructor(data){super(data),this.prompt=data.prompt,this.choices=data.choices??[],this.containsItems=data.containsItems,this.allowedDrops=this.containsItems?data.allowedDrops:null}static get defaultOptions(){return{...super.defaultOptions,classes:["choice-set-prompt"],dragDrop:[{dropSelector:".drop-zone"}],template:"systems/pf2e/templates/system/rules-elements/choice-set-prompt.hbs"}}async getData(options={}){return{...await super.getData(options),choices:this.choices.map((c,index)=>({...c,value:index,hasUUID:UUIDUtils.isItemUUID(c.value)})),prompt:this.prompt,includeDropZone:!!this.allowedDrops,allowNoSelection:this.allowNoSelection,selectMenu:this.choices.length>9,containsItems:this.containsItems}}getChoices(){return this.choices}setChoices(choices){this.choices=choices}activateListeners($html){super.activateListeners($html);const html=$html[0];htmlQuery(html,"button[data-action=close]")?.addEventListener("click",()=>{this.close()});const renderItemSheet=__name2(async choice=>{if(!choice||!UUIDUtils.isItemUUID(choice.value))return;(await fromUuid(choice.value))?.sheet.render(!0)},"renderItemSheet");if(this.containsItems)if(this.selectMenu){const itemInfoAnchor=htmlQuery(html,"a.item-info");if(!itemInfoAnchor)return;const updateAnchor=__name2((disable,value="")=>{itemInfoAnchor.dataset.value=value,itemInfoAnchor.classList.toggle("disabled",disable),itemInfoAnchor.dataset.tooltip=game.i18n.localize(disable?"PF2E.UI.RuleElements.ChoiceSet.ViewItem.Disabled":"PF2E.UI.RuleElements.ChoiceSet.ViewItem.Tooltip")},"updateAnchor");itemInfoAnchor.addEventListener("click",event=>{renderItemSheet(this.getSelection(event))}),this.selectMenu.on("change",event=>{const data=event.detail.tagify.value.at(0);if(!data)return updateAnchor(!0);const index=Number(data.value);if(!isNaN(index)){const choice=this.choices.at(index);UUIDUtils.isItemUUID(choice?.value)?updateAnchor(!1,data.value):updateAnchor(!0)}})}else for(const anchor of htmlQueryAll(html,"a.item-info"))anchor.addEventListener("click",event=>{renderItemSheet(this.getSelection(event))})}async resolveSelection(){const firstChoice=this.choices.at(0);return!this.allowedDrops&&firstChoice&&this.choices.length===1?this.selection=firstChoice:(this.choices.length===0&&!this.allowedDrops&&this.close(),super.resolveSelection())}async _onDrop(event){event.preventDefault();const dataString=event.dataTransfer?.getData("text/plain"),dropData=JSON.parse(dataString??"");if(dropData?.type!=="Item"){ui.notifications.error("Only an item can be dropped here.");return}const droppedItem=await ItemPF2e.fromDropData(dropData);if(!droppedItem)throw ErrorPF2e("Unexpected error resolving drop");const isAllowedDrop=!!this.allowedDrops?.predicate.test(droppedItem.getRollOptions("item"));if(this.allowedDrops&&!isAllowedDrop){ui.notifications.error(game.i18n.format("PF2E.Item.ABC.InvalidDrop",{badType:droppedItem.name,goodType:game.i18n.localize(this.allowedDrops.label??"")}));return}const newChoice={value:this.containsItems&&this.choices.length>0&&this.choices.every(c=>!UUIDUtils.isItemUUID(c.value))?droppedItem.slug??sluggify(droppedItem.id):droppedItem.uuid,label:droppedItem.name},choicesLength=this.choices.push(newChoice),prompt=document.querySelector(`#${this.id}`),dropZone=prompt?.querySelector(".drop-zone");if(!prompt)throw ErrorPF2e("Unexpected error retrieving ChoiceSet dialog");if(prompt.style.height="unset",this.selectMenu){const{whitelist}=this.selectMenu.settings,menuChoice={value:String(choicesLength-1),label:newChoice.label};whitelist?.push(menuChoice.value),this.selectMenu.setPersistedData(whitelist,"whitelist"),this.selectMenu.addTags([menuChoice],!0,!0),this.selectMenu.setReadonly(!0),dropZone?.remove()}else{const img=document.createElement("img");img.src=droppedItem.img;const newButton=createHTMLElement("button",{classes:["with-image"],children:[img,createHTMLElement("span",{children:[droppedItem.name]})]});newButton.type="button",newButton.value=String(choicesLength-1),newButton.addEventListener("click",event2=>{this.selection=this.getSelection(event2)??null,this.close()}),dropZone?.replaceWith(newButton)}}_canDragDrop(){return this.actor.isOwner}};__name2(_ChoiceSetPrompt,"ChoiceSetPrompt");let ChoiceSetPrompt=_ChoiceSetPrompt;const _ChoiceSetRuleElement=class extends RuleElementPF2e{static{__name(this,"_ChoiceSetRuleElement")}constructor(data,options){if(super(data,options),__privateAdd(this,_setDefaultFlag),__privateAdd(this,_choicesFromArray),__privateAdd(this,_choicesFromPath),__privateAdd(this,_choicesFromOwnedItems),__privateAdd(this,_choicesFromAttacks),__privateAdd(this,_getPreselection),__privateAdd(this,_setRollOption),__publicField(this,"containsItems",!1),__publicField(this,"selection"),this.allowedDrops??=null,this.allowNoSelection??=!1,this.rollOption??=this.slug,this.flag=__privateMethod(this,_setDefaultFlag,setDefaultFlag_fn).call(this,this),this.selection=typeof data.selection=="string"||typeof data.selection=="number"||isObject(data.selection)?data.selection:null,isObject(this.choices)&&!Array.isArray(this.choices)&&!("filter"in this.choices)&&(this.choices.predicate=new PredicatePF2e(this.choices.predicate??[]),this.choices.unarmedAttacks&&this.choices.predicate.push("item:category:unarmed")),this.item.flags.pf2e.rulesSelections[this.flag]=this.selection,this.selection!==null)__privateMethod(this,_setRollOption,setRollOption_fn).call(this,this.selection);else if(!this.allowNoSelection&&this.test()){this.ignored=!0;for(const ruleData of this.item.system.rules)ruleData.ignored=!0}}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),choices:new DataUnionField([new StrictArrayField(new StrictObjectField({required:!0,nullable:!1,initial:void 0}),{required:!0,nullable:!1,initial:void 0}),new StrictObjectField({required:!0,nullable:!1,initial:void 0}),new StrictStringField({required:!0,nullable:!1,initial:void 0})],{required:!0,nullable:!1,initial:()=>[]}),prompt:new fields2.StringField({required:!0,blank:!1,nullable:!1,initial:"PF2E.UI.RuleElements.ChoiceSet.Prompt"}),adjustName:new fields2.BooleanField({required:!0,nullable:!1,initial:!0}),allowedDrops:new fields2.SchemaField({label:new fields2.StringField({required:!0,blank:!1,nullable:!0,initial:null}),predicate:new PredicateField},{required:!1,nullable:!0,initial:void 0}),flag:new fields2.StringField({required:!1,blank:!1,nullable:!1,initial:void 0}),rollOption:new fields2.StringField({required:!1,blank:!1,nullable:!0,initial:null}),allowNoSelection:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0})}}async preCreate({itemSource,ruleSource,pendingItems}){if(this.selection===null&&isObject(this.choices)&&"query"in this.choices){this.failValidation("As of FVTT version 11, choice set queries are no longer supported.");for(const ruleData of this.item.system.rules)ruleData.ignored=!0;return}const rollOptions=new Set([this.actor.getRollOptions(),this.item.getRollOptions("parent")].flat());if(!this.resolveInjectedProperties(this.predicate).test(rollOptions))return;if(isObject(this.choices)){const{choices}=this;if("ownedItems"in choices&&choices.ownedItems&&!choices.types?.length){console.warn("PF2E System | Failure during ChoiceSet preCreate: `types` is required if `ownedItems` is set"),ruleSource.ignored=!0;return}}__privateMethod(this,_setDefaultFlag,setDefaultFlag_fn).call(this,ruleSource);const inflatedChoices=await this.inflateChoices(rollOptions,pendingItems),selection=__privateMethod(this,_getPreselection,getPreselection_fn).call(this)??await new ChoiceSetPrompt({prompt:this.prompt,item:this.item,title:this.label,choices:inflatedChoices,containsItems:this.containsItems,allowedDrops:this.allowedDrops,allowNoSelection:this.allowNoSelection}).resolveSelection();if(selection){if(ruleSource.selection=selection.value,this.adjustName){const effectName=itemSource.name,label=game.i18n.localize(selection.label),name2=`${effectName} (${label})`,pattern=(()=>{const escaped=RegExp.escape(label);return new RegExp(`\\(${escaped}\\) \\(${escaped}\\)$`)})();itemSource.name=name2.replace(pattern,`(${label})`)}if(this.item.flags.pf2e.rulesSelections[this.flag]=selection.value,typeof ruleSource.rollOption=="string"&&UUIDUtils.isItemUUID(selection.value)){const item=await fromUuid(selection.value);if(item instanceof ItemPF2e){const slug=item.slug??sluggify(item.name);this.rollOption=ruleSource.rollOption=`${ruleSource.rollOption}:${slug}`}}__privateMethod(this,_setRollOption,setRollOption_fn).call(this,ruleSource.selection);for(const rule of this.item.rules)rule.ignored=!1,rule.onApplyActiveEffects?.()}else ruleSource.ignored=!0}async inflateChoices(rollOptions,pendingItems){const choices=Array.isArray(this.choices)?__privateMethod(this,_choicesFromArray,choicesFromArray_fn).call(this,this.choices,rollOptions):isObject(this.choices)?this.choices.ownedItems?__privateMethod(this,_choicesFromOwnedItems,choicesFromOwnedItems_fn).call(this,this.choices,rollOptions):this.choices.attacks||this.choices.unarmedAttacks?__privateMethod(this,_choicesFromAttacks,choicesFromAttacks_fn).call(this,new PredicatePF2e(this.resolveInjectedProperties(this.choices.predicate)),rollOptions):"filter"in this.choices&&Array.isArray(this.choices.filter)?await this.queryCompendium(this.choices,rollOptions,pendingItems):[]:typeof this.choices=="string"?__privateMethod(this,_choicesFromPath,choicesFromPath_fn).call(this,this.choices):[],choicesAreUUIDs=choices.every(c=>UUIDUtils.isItemUUID(c.value));if(choicesAreUUIDs){const itemChoices=await UUIDUtils.fromUUIDs(choices.map(c=>c.value));for(let i=0;i({value:c.value,label:game.i18n.localize(c.label),img:c.img}));return Array.isArray(this.choices)||choiceData.sort((a,b)=>a.label.localeCompare(b.label)),choiceData}catch{return[]}}async queryCompendium(choices,actorRollOptions,pendingItems){const filter2=Array.isArray(choices.filter)?new PredicatePF2e(this.resolveInjectedProperties(choices.filter)):new PredicatePF2e;if(!filter2.isValid||filter2.length===0)return this.failValidation("`filter` must be an array with at least one statement"),[];const itemType=objectHasKey(CONFIG.PF2E.Item.documentClasses,choices.itemType)?choices.itemType:"feat",packs=typeof choices.pack=="string"?compact([game.packs.get(choices.pack)]):game.packs.filter(p=>p.metadata.type==="Item"&&p.index.some(e=>e.type===itemType)),progress=new Progress({max:packs.length}),localize=localizer("PF2E.ProgressBar"),indexData=[];for(const pack of packs)progress.advance({label:localize("LoadingPack",{pack:pack.metadata.label})}),indexData.push(await pack.getIndex({fields:["flags","system.ancestry","system.baseItem","system.category","system.group","system.level","system.maxTakable","system.potencyRune","system.slug","system.traits"]}));progress.close({label:localize("LoadingComplete")});const filteredItems=indexData.flatMap(d=>d.contents).filter(s=>s.type===itemType).map(source=>{const parsedUUID=foundry.utils.parseUuid(source.uuid),pack=parsedUUID.collection instanceof CompendiumCollection?parsedUUID.collection.metadata.id:null;return new ItemProxyPF2e(deepClone(source),{pack})}).concat(game.items.filter(i=>i.type===itemType)).filter(i=>filter2.test([...i.getRollOptions("item"),...actorRollOptions])),existing=new Map;for(const feat of this.actor.itemTypes.feat){const slug=feat.slug??sluggify(feat.name);existing.set(slug,(existing.get(slug)??0)+1)}for(const featSource of pendingItems.filter(i=>i.type==="feat")){const slug=featSource.system?.slug??sluggify(featSource.name);existing.set(slug,(existing.get(slug)??0)+1)}return filteredItems.filter(i=>i instanceof FeatPF2e?(existing.get(i.slug??sluggify(i.name))??0)({value:choices.slugsAsValues?f.slug??sluggify(f.name):f.uuid,label:f.name,img:f.img}))}};_setDefaultFlag=new WeakSet,setDefaultFlag_fn=__name2(function(source){return source.flag=typeof source.flag=="string"&&source.flag.length>0?source.flag.replace(/[^-a-z0-9]/gi,""):sluggify(this.slug??this.item.slug??this.item.name,{camel:"dromedary"})},"#setDefaultFlag"),_choicesFromArray=new WeakSet,choicesFromArray_fn=__name2(function(choices,actorRollOptions){return choices.filter(c=>this.resolveInjectedProperties(new PredicatePF2e(c.predicate??[])).test(actorRollOptions))},"#choicesFromArray"),_choicesFromPath=new WeakSet,choicesFromPath_fn=__name2(function(path){const choiceObject=getProperty(CONFIG.PF2E,path)??getProperty(this.actor,path)??{};return Array.isArray(choiceObject)&&choiceObject.every(c=>isObject(c)&&typeof c.value=="string")?choiceObject:isObject(choiceObject)&&Object.values(choiceObject).every(c=>typeof c=="string")?Object.entries(choiceObject).map(([value,label])=>({value,label:String(label)})):[]},"#choicesFromPath"),_choicesFromOwnedItems=new WeakSet,choicesFromOwnedItems_fn=__name2(function(options,actorRollOptions){const{includeHandwraps,types}=options,predicate=new PredicatePF2e(this.resolveInjectedProperties(options.predicate)),choices=this.actor.items.filter(i=>i.isOfType(...types)&&predicate.test([...actorRollOptions,...i.getRollOptions("item")])).filter(i=>!i.isOfType("weapon")||i.category!=="unarmed").map(i=>({img:i.img,label:i.name,value:i.id}));return includeHandwraps&&choices.push(...this.actor.itemTypes.weapon.filter(i=>i.slug==="handwraps-of-mighty-blows"&&predicate.test([...actorRollOptions,...i.getRollOptions("item")])).map(h=>({img:h.img,label:h.name,value:"unarmed"}))),choices},"#choicesFromOwnedItems"),_choicesFromAttacks=new WeakSet,choicesFromAttacks_fn=__name2(function(predicate,actorRollOptions){return this.actor.isOfType("character","npc")?this.actor.system.actions.filter(a=>a.item.isOfType("melee","weapon")&&predicate.test([...actorRollOptions,...a.item.getRollOptions("item")])).map(a=>({img:a.item.img,label:a.item.name,value:a.item.slug??sluggify(a.item.name)})):[]},"#choicesFromAttacks"),_getPreselection=new WeakSet,getPreselection_fn=__name2(function(){return(Array.isArray(this.choices)?this.choices.find(c=>c.value===this.selection):null)??null},"#getPreselection"),_setRollOption=new WeakSet,setRollOption_fn=__name2(function(selection){if(!(this.rollOption&&(typeof selection=="string"||typeof selection=="number")))return;const suffix=UUIDUtils.isItemUUID(selection)?"":`:${selection}`;this.actor.rollOptions.all[`${this.rollOption}${suffix}`]=!0},"#setRollOption"),__name2(_ChoiceSetRuleElement,"ChoiceSetRuleElement");let ChoiceSetRuleElement=_ChoiceSetRuleElement;const _CraftingEntryRuleElement=class extends RuleElementPF2e{static{__name(this,"_CraftingEntryRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),isAlchemical:new fields2.BooleanField({required:!1,initial:void 0}),isDailyPrep:new fields2.BooleanField({required:!1,initial:void 0}),isPrepared:new fields2.BooleanField({required:!1,initial:void 0}),maxItemLevel:new ResolvableValueField({required:!1,nullable:!1,initial:1}),maxSlots:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),craftableItems:new PredicateField,preparedFormulas:new fields2.ArrayField(new fields2.SchemaField({itemUUID:new fields2.StringField({required:!0,blank:!1}),quantity:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),sort:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),expended:new fields2.BooleanField({required:!1,initial:void 0}),isSignatureItem:new fields2.BooleanField({required:!1,initial:void 0})},{required:!0,nullable:!1}),{initial:[]})}}constructor(data,options){super({priority:19,...data},options)}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),craftableItems=this.craftableItems??[];if(!PredicatePF2e.isValid(craftableItems))return this.failValidation("Malformed craftableItems predicate");this.actor.system.crafting.entries[this.selector]={selector,name:this.label,isAlchemical:this.isAlchemical,isDailyPrep:this.isDailyPrep,isPrepared:this.isPrepared,craftableItems,maxItemLevel:Number(this.resolveValue(this.maxItemLevel))||1,maxSlots:this.maxSlots,parentItem:this.item.id,preparedFormulaData:this.preparedFormulas};const option=sluggify(this.selector);this.actor.rollOptions.all[`crafting:entry:${option}`]=!0}};__name2(_CraftingEntryRuleElement,"CraftingEntryRuleElement"),__publicField(_CraftingEntryRuleElement,"validActorTypes",["character"]);let CraftingEntryRuleElement=_CraftingEntryRuleElement;const _CraftingFormulaRuleElement=class extends RuleElementPF2e{static{__name(this,"_CraftingFormulaRuleElement")}constructor(data,options){if(super(data,options),!(typeof data.uuid=="string"&&/^(?:Compendium|Item)\..*[a-z0-9]{16}$/i.test(data.uuid))){const{item}=this;this.failValidation(`Crafting formula rule element on ${item.name} (${item.uuid}) has a malformed UUID`)}}beforePrepareData(){this.ignored||this.actor.system.crafting.formulas.find(f=>f.uuid===this.data.uuid)||this.actor.system.crafting.formulas.push({uuid:this.data.uuid})}};__name2(_CraftingFormulaRuleElement,"CraftingFormulaRuleElement"),__publicField(_CraftingFormulaRuleElement,"validActorTypes",["character"]);let CraftingFormulaRuleElement=_CraftingFormulaRuleElement;const _CritSpecRuleElement=class extends RuleElementPF2e{static{__name(this,"_CritSpecRuleElement")}constructor(){super(...arguments),__privateAdd(this,_getEffect)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),alternate:new fields2.BooleanField,text:new fields2.StringField({blank:!1,nullable:!0,initial:null}),damageDice:new fields2.SchemaField({number:new ResolvableValueField({required:!0,nullable:!1,initial:void 0}),faces:new fields2.NumberField({required:!0,nullable:!1,choices:[4,6,8,10,12],initial:void 0}),damageType:new fields2.StringField({required:!1,nullable:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:null}),category:new fields2.StringField({required:!1,nullable:!0,choices:Array.from(DAMAGE_CATEGORIES_UNIQUE),initial:null})},{required:!1,nullable:!0,initial:null}),modifier:new fields2.SchemaField({type:new fields2.StringField({required:!0,nullable:!1,choices:Array.from(MODIFIER_TYPES),initial:"untyped"}),damageType:new fields2.StringField({required:!1,nullable:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:null}),category:new fields2.StringField({required:!1,nullable:!0,choices:Array.from(DAMAGE_CATEGORIES_UNIQUE),initial:null}),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0})},{required:!1,nullable:!0,initial:null})}}static validateJoint(data){if(super.validateJoint(data),data.alternate&&!data.text&&!data.damageDice&&!data.modifier)throw Error(" alternate: must also include at least one of text, damage dice, or modifier");if(!data.alternate&&(data.text||data.damageDice||data.modifier)){const badProperty=["text","damageDice","modifier"].find(k=>data[k]);throw Error(` ${badProperty}: may only be used if alternate is true`)}}beforePrepareData(){if(this.ignored)return;const synthetic=__name2((weapon,options)=>this.resolveInjectedProperties(this.predicate).test(options)?__privateMethod(this,_getEffect,getEffect_fn).call(this,weapon):null,"synthetic");this.ignored||this.actor.synthetics.criticalSpecalizations[this.alternate?"alternate":"standard"].push(synthetic)}};_getEffect=new WeakSet,getEffect_fn=__name2(function(weapon){const text=this.text?this.resolveInjectedProperties(this.text.trim()):null,slug="critical-specialization",label="PF2E.Actor.Creature.CriticalSpecialization",note=__name2(()=>this.alternate&&!this.text?null:new RollNotePF2e({selector:"strike-damage",title:label,text:text??`PF2E.Item.Weapon.CriticalSpecialization.${weapon.group}`,outcome:["criticalSuccess"]}),"note"),resolveInteger=__name2((value,fallback)=>{const resolved=this.resolveValue(value,0,{resolvables:{weapon}});return Math.clamped(Math.trunc(Math.abs(Number(resolved))),1,10)||fallback},"resolveInteger"),damageDice=__name2(()=>this.alternate&&this.damageDice?new DamageDicePF2e({slug,label,selector:"strike-damage",diceNumber:resolveInteger(this.damageDice.number,1),dieSize:`d${this.damageDice.faces}`,damageType:this.damageDice.damageType,category:this.damageDice.category,critical:!0}):null,"damageDice"),modifier=__name2(()=>this.alternate&&this.modifier?new ModifierPF2e({slug,label,type:this.modifier.type,modifier:resolveInteger(this.modifier.value,0),damageType:this.modifier.damageType,damageCategory:this.modifier.category,critical:!0}):null,"modifier");if(this.alternate)return compact([note(),damageDice(),modifier()]);switch(weapon.group){case"dart":case"knife":{const dice=new DamageDicePF2e({slug,selector:"strike-damage",label,damageType:"bleed",diceNumber:1,dieSize:"d6",critical:!0}),bonusValue=AutomaticBonusProgression.isEnabled(this.actor)?AutomaticBonusProgression.getAttackPotency(this.actor.level):weapon.isOfType("melee")?weapon.linkedWeapon?.system.runes.potency??0:weapon.system.runes.potency,bonus=bonusValue>0?new ModifierPF2e({slug,label,type:"item",damageType:"bleed",modifier:bonusValue,critical:!0}):null;return[dice,bonus??[]].flat()}case"pick":return weapon.baseDamage.die?[new ModifierPF2e({slug,label,type:"untyped",modifier:2*weapon.baseDamage.dice,critical:!0})]:[];default:return weapon.group?compact([note()]):[]}},"#getEffect"),__name2(_CritSpecRuleElement,"CritSpecRuleElement"),__publicField(_CritSpecRuleElement,"validActorTypes",["character","npc"]);let CritSpecRuleElement=_CritSpecRuleElement;const _DamageDiceRuleElement=class extends RuleElementPF2e{static{__name(this,"_DamageDiceRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_isValidOverride),__privateAdd(this,_resolvedBracketsIsValid),this.brackets=this.isBracketedValue(data.value)?data.value:null,data.override&&!__privateMethod(this,_isValidOverride,isValidOverride_fn).call(this,data.override)&&(this.failValidation("The override property must be an object with one property of 'upgrade' (boolean),","'downgrade (boolean)', 'diceNumber' (integer between 0 and 10), 'dieSize' (d6-d12), or 'damageType'","(recognized damage type)"),this.override=null)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,initial:void 0})),diceNumber:new ResolvableValueField({required:!1,initial:void 0}),dieSize:new fields2.StringField({required:!1,blank:!1,nullable:!0,initial:null}),damageType:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),critical:new fields2.BooleanField({required:!1,nullable:!0,initial:void 0}),category:new fields2.StringField({choices:["persistent","precision","splash"],required:!1,blank:!1,initial:void 0}),brackets:new ResolvableValueField({required:!1,nullable:!0,initial:void 0}),override:new fields2.ObjectField({required:!1,nullable:!0,initial:void 0})}}beforePrepareData(){if(!this.ignored)for(const selector of this.resolveInjectedProperties(this.selector)){if(selector==="null")continue;const deferredDice=__name2((params={})=>{const label=this.getReducedLabel(),testPassed=this.predicate.length===0||this.resolveInjectedProperties(this.predicate).test([...params.test??this.actor.getRollOptions(["damage"]),...this.item.getRollOptions("parent")]),resolveOptions={...params,warn:testPassed},diceNumber=Number(this.resolveValue(this.diceNumber,0,resolveOptions))||0;if(this.ignored)return null;const resolvedBrackets=this.resolveValue(this.brackets,{},resolveOptions);if(!__privateMethod(this,_resolvedBracketsIsValid,resolvedBracketsIsValid_fn).call(this,resolvedBrackets))return testPassed&&this.failValidation("Brackets failed to validate"),null;const damageType=this.resolveInjectedProperties(this.damageType,resolveOptions);if(damageType!==null&&!objectHasKey(CONFIG.PF2E.damageTypes,damageType))return testPassed&&this.failValidation(`Unrecognized damage type: ${damageType}`),null;if(this.override){if(this.override.damageType&&=this.resolveInjectedProperties(this.override.damageType,resolveOptions),"damageType"in this.override&&!objectHasKey(CONFIG.PF2E.damageTypes,this.override.damageType))return testPassed&&this.failValidation("Unrecognized damage type in override"),null;if(this.override.diceNumber&&=Math.floor(Number(this.resolveValue(this.override.diceNumber,resolveOptions))),typeof this.override.diceNumber=="number"&&this.override.diceNumber<0)return testPassed&&this.failValidation("A dice number must resolve to at least zero"),null;if(this.override.dieSize&&=this.resolveInjectedProperties(this.override.dieSize,resolveOptions),"dieSize"in this.override&&!setHasElement(DAMAGE_DIE_FACES,this.override.dieSize))return testPassed&&this.failValidation("Unrecognized die size in override"),null}const dieSize=this.resolveInjectedProperties(this.dieSize,resolveOptions);return dieSize!==null&&!setHasElement(DAMAGE_DIE_FACES,dieSize)?(testPassed&&this.failValidation("Die size must be a recognized damage die size, null, or omitted"),null):new DamageDicePF2e({selector,slug:this.slug??sluggify(this.item.name),label,diceNumber,dieSize,critical:this.critical,category:this.category,damageType,predicate:this.predicate,override:deepClone(this.override),enabled:testPassed,...resolvedBrackets})},"deferredDice");(this.actor.synthetics.damageDice[selector]??=[]).push(deferredDice)}}};_isValidOverride=new WeakSet,isValidOverride_fn=__name2(function(override){return override===void 0?!0:isObject(override)&&(typeof override.upgrade=="boolean"&&!("downgrade"in override)||typeof override.downgrade=="boolean"&&!("upgrade"in override)||typeof override.damageType=="string"||typeof override.dieSize=="string"||typeof override.diceNumber=="string"||typeof override.diceNumber=="number"&&Number.isInteger(override.diceNumber)&&override.diceNumber>=0&&override.diceNumber<=256)},"#isValidOverride"),_resolvedBracketsIsValid=new WeakSet,resolvedBracketsIsValid_fn=__name2(function(value){if(!isObject(value))return!1;const keysAreValid=Object.keys(value).every(k=>["diceNumber","dieSize","override"].includes(k)),diceNumberIsValid=!("diceNumber"in value)||typeof value.diceNumber=="number",dieSizeIsValid=!("dieSize"in value)||setHasElement(DAMAGE_DIE_FACES,value.dieSize),overrideIsValid=!("override"in value)||__privateMethod(this,_isValidOverride,isValidOverride_fn).call(this,value.override);return keysAreValid&&diceNumberIsValid&&dieSizeIsValid&&overrideIsValid},"#resolvedBracketsIsValid"),__name2(_DamageDiceRuleElement,"DamageDiceRuleElement");let DamageDiceRuleElement=_DamageDiceRuleElement;const _DexterityModifierCapRuleElement=class extends RuleElementPF2e{static{__name(this,"_DexterityModifierCapRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1})}}beforePrepareData(){if(!this.test())return;const value=this.resolveValue(this.value);if(typeof value!="number")return this.failValidation("value must be a number");this.actor.synthetics.dexterityModifierCaps.push({value,source:this.label})}};__name2(_DexterityModifierCapRuleElement,"DexterityModifierCapRuleElement"),__publicField(_DexterityModifierCapRuleElement,"validActorTypes",["character","npc"]);let DexterityModifierCapRuleElement=_DexterityModifierCapRuleElement;const{fields:fields$1,validation}=foundry.data,_ItemAlterationValidator=class extends fields$1.SchemaField{static{__name(this,"_ItemAlterationValidator")}constructor(fields2,options={}){super(fields2,options),__privateAdd(this,_validateForItem,void 0),__publicField(this,"operableOnInstances"),__publicField(this,"operableOnSource"),options.validateForItem&&__privateSet(this,_validateForItem,options.validateForItem),this.operableOnInstances=options.operableOnInstances??!0,this.operableOnSource=options.operableOnSource??!0}isValid(data){var _a;const{item,alteration}=data,failure=this.validate(alteration);if(failure)throw new validation.DataModelValidationError(failure);if(item.type!==alteration.itemType)return!1;const forItemFailure=(_a=__privateGet(this,_validateForItem))==null?void 0:_a.call(this,item);if(forItemFailure)throw new validation.DataModelValidationError(forItemFailure);if(!this.operableOnInstances&&item instanceof ItemPF2e)throw new validation.DataModelValidationError("may only be applied to source data");if(!this.operableOnSource&&!(item instanceof ItemPF2e))throw new validation.DataModelValidationError("may only be applied to existing items");return!0}};_validateForItem=new WeakMap,__name2(_ItemAlterationValidator,"ItemAlterationValidator");let ItemAlterationValidator=_ItemAlterationValidator;const itemHasCounterBadge=__name2(item=>{if(!(itemIsOfType(item,"condition")?typeof item.system.value.value=="number":itemIsOfType(item,"effect")?item.system.badge?.type==="counter":!1))throw new foundry.data.validation.DataModelValidationError("effect lacks a badge")},"itemHasCounterBadge"),ITEM_ALTERATION_VALIDATORS={"ac-bonus":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})}),"badge-max":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["effect"]}),mode:new fields$1.StringField({required:!0,choices:["downgrade","override"]}),value:new fields$1.NumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})},{validateForItem:itemHasCounterBadge}),"badge-value":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["condition","effect"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0,initial:void 0})},{validateForItem:itemHasCounterBadge}),"bulk-held-or-stowed":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:BULK_VALUES,initial:void 0})}),"bulk-worn":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor","backpack"]}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:BULK_VALUES,initial:void 0})}),category:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:["light","heavy","medium"],initial:void 0})}),"dex-cap":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,initial:void 0})}),"check-penalty":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,initial:void 0})}),hardness:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0})}),"hp-max":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,nullable:!1,positive:!0,initial:void 0})}),"material-type":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:Array.from(PRECIOUS_MATERIAL_TYPES),initial:void 0})}),"pd-recovery-dc":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["condition"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0,initial:void 0})},{validateForItem(item){if(item.system.slug!=="persistent-damage")return new foundry.data.validation.DataModelValidationFailure({message:"item must be a persistent damage condition"})}}),"persistent-damage":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["condition"]}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.SchemaField({formula:new fields$1.StringField({required:!0,blank:!1,validate:value=>DamageRoll.validate(String(value))}),damageType:new fields$1.StringField({required:!0,choices:()=>CONFIG.PF2E.damageTypes}),dc:new fields$1.NumberField({required:!0,integer:!0,positive:!0,nullable:!1,initial:15})},{nullable:!1})},{validateForItem(item){if(item.system.slug!=="persistent-damage")return new foundry.data.validation.DataModelValidationFailure({message:"item must be a persistent damage condition"})}}),rarity:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:Array.from(PHYSICAL_ITEM_TYPES)}),mode:new fields$1.StringField({required:!0,choices:["override"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:RARITIES})}),"frequency-max":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["action","feat"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"]}),value:new fields$1.NumberField({required:!0,integer:!0,nullable:!1,positive:!0})}),"frequency-per":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["action","feat"]}),mode:new fields$1.StringField({required:!0,choices:["downgrade","override","upgrade"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:()=>Object.keys(CONFIG.PF2E.frequencies),initial:void 0})}),"other-tags":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:()=>keys.strict(CONFIG.PF2E.Item.documentClasses)}),mode:new fields$1.StringField({required:!0,choices:["add","subtract","remove"]}),value:new SlugField({required:!0,nullable:!1,blank:!1,initial:void 0})}),"speed-penalty":new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,initial:void 0})}),strength:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","downgrade","override","remove","subtract","upgrade"]}),value:new StrictNumberField({required:!0,nullable:!1,integer:!0,positive:!0,initial:void 0})}),traits:new ItemAlterationValidator({itemType:new fields$1.StringField({required:!0,choices:["armor"]}),mode:new fields$1.StringField({required:!0,choices:["add","remove","subtract"]}),value:new fields$1.StringField({required:!0,nullable:!1,choices:()=>CONFIG.PF2E.armorTraits,initial:void 0})})},_ItemAlteration=class extends foundry.abstract.DataModel{static{__name(this,"_ItemAlteration")}constructor(){super(...arguments),__privateAdd(this,_adjustCreatureShieldData),__privateAdd(this,_getNewInterval)}static defineSchema(){const{fields:fields2}=foundry.data;return{mode:new fields2.StringField({required:!0,choices:["add","downgrade","multiply","override","remove","subtract","upgrade"],initial:void 0}),property:new fields2.StringField({required:!0,choices:this.VALID_PROPERTIES,initial:void 0}),value:new ResolvableValueField}}get actor(){return this.parent.actor}resolveValue(...args){return this.parent.resolveValue(...args)}applyTo(item){const data={item,alteration:{mode:this.mode,itemType:item.type,value:this.value=this.parent.resolveValue(this.value)}},{DataModelValidationFailure}=foundry.data.validation;switch(this.property){case"ac-bonus":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const armor=data.item,newValue=AELikeRuleElement.getNewValue(this.mode,armor.system.acBonus,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();armor.system.acBonus=Math.max(newValue,0),__privateMethod(this,_adjustCreatureShieldData,adjustCreatureShieldData_fn).call(this,armor);return}case"badge-max":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const effect=data.item,{badge}=effect.system;if(badge?.type!=="counter"||!badge.value||!badge.max)return;const newValue=AELikeRuleElement.getNewValue(this.mode,badge.max,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();const hardMax=badge.labels?.length??newValue;badge.max=Math.clamped(newValue,1,hardMax),badge.value=Math.clamped(badge.value,1,badge.max);return}case"badge-value":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const effect=data.item,badge=itemIsOfType(effect,"condition")?effect.system.value:effect.system.badge??{value:0};if(typeof badge.value!="number")return;const newValue=AELikeRuleElement.getNewValue(this.mode,badge.value,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();const max="max"in badge?badge.max??1/0:1/0;badge.value=Math.clamped(newValue,1,max);return}case"bulk-held-or-stowed":{const validator=ITEM_ALTERATION_VALIDATORS[this.property];if(data.alteration.value=String(data.alteration.value),!validator.isValid(data))return;data.item.system.weight.value=data.alteration.value,data.item instanceof foundry.abstract.DataModel&&(data.item.system.bulk=organizeBulkData(data.item));return}case"bulk-worn":{const validator=ITEM_ALTERATION_VALIDATORS[this.property];if(data.alteration.value=String(data.alteration.value),!validator.isValid(data))return;data.item.system.equippedBulk.value=data.alteration.value,data.item instanceof foundry.abstract.DataModel&&(data.item.system.bulk=organizeBulkData(data.item));return}case"category":{ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)&&(data.item.system.category=data.alteration.value);return}case"check-penalty":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.checkPenalty,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.checkPenalty=newValue===null?null:Math.min(newValue,0);return}case"dex-cap":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.dexCap,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.dexCap=Math.max(newValue,0);return}case"hardness":{if(ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)){const{system}=data.item,{value}=data.alteration,newValue=AELikeRuleElement.getNewValue(this.mode,system.hardness,value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();system.hardness=Math.max(newValue,0),__privateMethod(this,_adjustCreatureShieldData,adjustCreatureShieldData_fn).call(this,data.item)}return}case"hp-max":{if(ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)){const{hp}=data.item.system,{value}=data.alteration,newValue=AELikeRuleElement.getNewValue(this.mode,hp.max,value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();hp.max=Math.max(Math.trunc(newValue),1),"brokenThreshold"in hp&&(hp.brokenThreshold=Math.floor(hp.max/2)),__privateMethod(this,_adjustCreatureShieldData,adjustCreatureShieldData_fn).call(this,data.item)}return}case"persistent-damage":{const pdObject=isObject(data.alteration.value)?data.alteration.value:{dc:NaN},dc=Math.trunc(Math.abs(Number(pdObject?.dc)||15));data.alteration.value={...pdObject,dc};const validator=ITEM_ALTERATION_VALIDATORS[this.property];validator.isValid(data)&&(data.item.system.persistent=validator.initialize(data.alteration).value);return}case"material-type":{ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)&&(data.item.system.material.type=data.alteration.value,data.item.system.material.grade="standard","_source"in data.item&&(data.item.name=game.pf2e.system.generateItemName(data.item)));return}case"rarity":{ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)&&(data.item.system.traits.rarity=data.alteration.value);return}case"pd-recovery-dc":{const validator=ITEM_ALTERATION_VALIDATORS[this.property];if(data.alteration.value=this.resolveValue(data.alteration.value)||15,validator.isValid(data)&&data.item.system.persistent){const{persistent}=data.item.system,newValue=AELikeRuleElement.getNewValue(this.mode,persistent.dc,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();persistent.dc=Math.max(newValue,0)}return}case"frequency-max":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)||!data.item.system.frequency)return;const frequency=data.item.system.frequency,newValue=AELikeRuleElement.getNewValue(this.mode,frequency.max,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();frequency.max=newValue,frequency.value=Math.clamped(frequency.value??newValue,0,newValue);return}case"frequency-per":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data)||!data.item.system.frequency)return;const newValue=__privateMethod(this,_getNewInterval,getNewInterval_fn).call(this,this.mode,data.item.system.frequency.per,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.frequency.per=newValue;return}case"other-tags":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const otherTags=data.item.system.traits.otherTags,newValue=AELikeRuleElement.getNewValue(this.mode,otherTags,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();this.mode==="add"?otherTags.includes(newValue)||otherTags.push(newValue):["subtract","remove"].includes(this.mode)&&otherTags.splice(otherTags.indexOf(newValue),1);return}case"speed-penalty":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.speedPenalty,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.speedPenalty=newValue===null?null:Math.min(newValue,0);return}case"strength":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.strength,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();data.item.system.strength=newValue===null?null:Math.max(newValue,0);return}case"traits":{if(!ITEM_ALTERATION_VALIDATORS[this.property].isValid(data))return;const newValue=AELikeRuleElement.getNewValue(this.mode,data.item.system.traits.value,data.alteration.value);if(newValue instanceof DataModelValidationFailure)throw newValue.asError();const traits=data.item.system.traits.value;this.mode==="add"?traits.includes(newValue)||traits.push(newValue):["subtract","remove"].includes(this.mode)&&traits.splice(traits.indexOf(newValue),1);return}}}};_adjustCreatureShieldData=new WeakSet,adjustCreatureShieldData_fn=__name2(function(item){if("actor"in item&&item.actor?.isOfType("character","npc")&&item.isOfType("armor")&&item.isShield){const{heldShield}=item.actor;if(item===heldShield){const shieldData=item.actor.attributes.shield;shieldData.ac=item.system.acBonus,shieldData.hardness=item.system.hardness,shieldData.hp.max=item.system.hp.max,shieldData.brokenThreshold=Math.floor(item.system.hp.max/2)}}},"#adjustCreatureShieldData"),_getNewInterval=new WeakSet,getNewInterval_fn=__name2(function(mode,current,newValue){const{DataModelValidationFailure}=foundry.data.validation;if(!objectHasKey(CONFIG.PF2E.frequencies,newValue))return new DataModelValidationFailure({invalidValue:current,fallback:!1});if(mode==="override")return newValue;function getDuration(key){return key==="turn"||key==="round"?Duration.fromISO("PT6S"):key==="day"?Duration.fromISO("PT24H"):Duration.fromISO(key)}__name(getDuration,"getDuration"),__name2(getDuration,"getDuration");const newIsLonger=newValue==="round"&¤t==="turn"||newValue==="PT24H"&¤t==="day"||getDuration(newValue)>getDuration(current);return mode==="upgrade"&&newIsLonger||mode==="downgrade"&&!newIsLonger?newValue:current},"#getNewInterval"),__name2(_ItemAlteration,"ItemAlteration"),__publicField(_ItemAlteration,"VALID_PROPERTIES",["ac-bonus","badge-max","badge-value","bulk-held-or-stowed","bulk-worn","category","check-penalty","dex-cap","hardness","hp-max","material-type","pd-recovery-dc","persistent-damage","rarity","frequency-max","frequency-per","other-tags","speed-penalty","strength","traits"]);let ItemAlteration=_ItemAlteration;const _EphemeralEffectRuleElement=class extends RuleElementPF2e{static{__name(this,"_EphemeralEffectRuleElement")}constructor(){super(...arguments),__privateAdd(this,_createDeferredEffect)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),affects:new fields2.StringField({required:!0,choices:["target","origin"],initial:"target"}),selectors:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,nullable:!1,initial:void 0})),uuid:new fields2.StringField({required:!0,blank:!1,nullable:!1,initial:void 0}),adjustName:new fields2.BooleanField({required:!0,nullable:!1,initial:!0}),alterations:new fields2.ArrayField(new fields2.EmbeddedDataField(ItemAlteration),{required:!1,nullable:!1,initial:[]})}}static validateJoint(data){if(super.validateJoint(data),data.selectors.length===0)throw Error("must have at least one selector")}afterPrepareData(){for(const selector of this.resolveInjectedProperties(this.selectors)){const deferredEffect=__privateMethod(this,_createDeferredEffect,createDeferredEffect_fn).call(this);(this.actor.synthetics.ephemeralEffects[selector]??={target:[],origin:[]})[this.affects].push(deferredEffect)}}};_createDeferredEffect=new WeakSet,createDeferredEffect_fn=__name2(function(){return async(params={})=>{if(!this.test(params.test??this.actor.getRollOptions()))return null;const uuid=this.resolveInjectedProperties(this.uuid);if(!UUIDUtils.isItemUUID(uuid))return this.failValidation(`"${uuid}" does not look like a UUID`),null;const effect=game.pf2e.ConditionManager.conditions.get(uuid)??await fromUuid(uuid);if(!(effect instanceof ItemPF2e&&effect.isOfType("condition","effect")))return this.failValidation(`unable to find effect or condition item with uuid "${uuid}"`),null;const source=effect.toObject();if(source.system.rules.some(r=>typeof r.key=="string"&&(r.key==="ChoiceSet"||r.key==="GrantItem"&&!("inMemoryOnly"in r&&r.inMemoryOnly===!0)))&&this.failValidation("an ephemeral effect may not include a choice set or grant"),this.adjustName){const label=this.getReducedLabel();source.name=`${source.name} (${label})`}try{for(const alteration of this.alterations)alteration.applyTo(source)}catch(error){return error instanceof Error&&this.failValidation(error.message),null}return source}},"#createDeferredEffect"),__name2(_EphemeralEffectRuleElement,"EphemeralEffectRuleElement");let EphemeralEffectRuleElement=_EphemeralEffectRuleElement;const _FastHealingRuleElement=class extends RuleElementPF2e{static{__name(this,"_FastHealingRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1}),type:new fields2.StringField({required:!1,nullable:!1,choices:["fast-healing","regeneration"],initial:"fast-healing"}),details:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),deactivatedBy:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,blank:!1}),{required:!1,initial:void 0})}}static validateJoint(data){if(super.validateJoint(data),data.type==="fast-healing"){if(data.deactivatedBy)throw data.ignored=!0,Error("deactivatedBy is only valid for type regeneration");data.details&&(data.details=game.i18n.localize(data.details))}else if(data.type==="regeneration"){if(data.details)throw data.ignored=!0,Error("details is only valid for type fast-healing");if(data.deactivatedBy?.length){const typesArr=data.deactivatedBy.map(type=>objectHasKey(CONFIG.PF2E.weaknessTypes,type)?game.i18n.localize(CONFIG.PF2E.weaknessTypes[type]):type),types=localizeList(typesArr);data.details=game.i18n.format("PF2E.Encounter.Broadcast.FastHealing.DeactivatedBy",{types})}}}async onTurnStart(){if(!this.test())return;const value=this.resolveValue(this.value);if(typeof value!="number"&&typeof value!="string")return this.failValidation("value must be a number or a roll formula");const roll=(await new DamageRoll(`${value}`).evaluate({async:!0})).toJSON(),receivedMessage=game.i18n.localize(`PF2E.Encounter.Broadcast.FastHealing.${this.type}.ReceivedMessage`),postFlavor=`
${this.details??this.getReducedLabel()}
`,flavor=`
${receivedMessage}
${postFlavor}`,rollMode=this.actor.hasPlayerOwner?"publicroll":"gmroll",speaker=ChatMessagePF2e.getSpeaker({actor:this.actor,token:this.token});ChatMessagePF2e.create({flavor,speaker,type:CONST.CHAT_MESSAGE_TYPES.ROLL,rolls:[roll]},{rollMode})}};__name2(_FastHealingRuleElement,"FastHealingRuleElement"),__publicField(_FastHealingRuleElement,"validActorTypes",["character","npc","familiar"]);let FastHealingRuleElement=_FastHealingRuleElement;const _FixedProficiencyRuleElement=class extends RuleElementPF2e{static{__name(this,"_FixedProficiencyRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),value:new ResolvableValueField({required:!0,initial:void 0}),ability:new fields2.StringField({required:!0,choices:[...ATTRIBUTE_ABBREVIATIONS]})}}static validateJoint(data){data.selector==="ac"&&(data.ability="dex")}beforePrepareData(){const selector=this.resolveInjectedProperties(this.selector),proficiencyBonus=Number(this.resolveValue(this.value))||0,abilityModifier=this.ability?this.actor.system.abilities[this.ability].mod:0,modifier=new ModifierPF2e({type:"proficiency",slug:this.slug??sluggify(this.label),label:this.label,modifier:proficiencyBonus+abilityModifier});(this.actor.synthetics.modifiers[selector]??=[]).push(()=>modifier)}afterPrepareData(){const selector=this.resolveInjectedProperties(this.selector),systemData=this.actor.system,proficiency=SKILL_EXPANDED[selector]?.shortForm??selector,statistic=setHasElement(SKILL_ABBREVIATIONS,proficiency)?this.actor.skills[proficiency]:proficiency==="ac"?systemData.attributes.ac:null;if(statistic){const toIgnore=statistic.modifiers.filter(m=>m.type==="proficiency"&&m.slug!==this.slug);for(const modifier of toIgnore)modifier.predicate=new PredicatePF2e(`overridden-by-${this.slug}`)}}};__name2(_FixedProficiencyRuleElement,"FixedProficiencyRuleElement"),__publicField(_FixedProficiencyRuleElement,"validActorTypes",["character"]);let FixedProficiencyRuleElement=_FixedProficiencyRuleElement;const _FlatModifierRuleElement=class extends RuleElementPF2e{static{__name(this,"_FlatModifierRuleElement")}constructor(source,options){super(source,options),!this.item.isOfType("physical")&&this.type!=="item"&&(this.fromEquipment=!1),this.type==="ability"&&(this.ability?(this.slug=this.ability,this.label=CONFIG.PF2E.abilities[this.ability],this.value=`@actor.abilities.${source.ability}.mod`):this.failValidation('A flat modifier of type "ability" must also have an "ability" property with an ability abbreviation')),this.critical=typeof source.critical=="boolean"&&this.selectors.some(s=>s.includes("damage"))?source.critical:null,this.force&&this.type==="untyped"&&this.failValidation("A forced bonus or penalty must have a type"),this.removeAfterRoll&&!this.item.isOfType("effect")&&this.failValidation(" removeAfterRoll: may only be used with effects")}static validateJoint(data){if(super.validateJoint(data),data.type!=="ability"&&data.value===void 0)throw Error('must have defined value if type is not "ability"')}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,initial:void 0})),type:new fields2.StringField({required:!0,choices:Array.from(MODIFIER_TYPES),initial:"untyped"}),ability:new fields2.StringField({required:!1,choices:CONFIG.PF2E.abilities,initial:void 0}),min:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),max:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),force:new fields2.BooleanField,hideIfDisabled:new fields2.BooleanField,fromEquipment:new fields2.BooleanField({required:!0,nullable:!1,initial:!0}),damageType:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:void 0}),damageCategory:new fields2.StringField({required:!1,blank:!1,choices:damageCategoriesUnique,initial:void 0}),critical:new fields2.BooleanField({required:!1,nullable:!0,initial:null}),value:new ResolvableValueField({required:!1,nullable:!1,initial:void 0}),removeAfterRoll:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["if-enabled"],initial:void 0}),new StrictBooleanField({required:!1,nullable:!1,initial:void 0}),new PredicateField({required:!1,nullable:!1,initial:void 0})],{required:!1,nullable:!1,initial:!1})}}get selectors(){return this.selector}beforePrepareData(){if(this.ignored)return;const label=this.getReducedLabel(),slug=this.slug??sluggify(label),selectors=this.selectors.map(s=>this.resolveInjectedProperties(s)).filter(s=>!!s);if(selectors.length===0)return this.failValidation("must have at least one selector");for(const selector of selectors){if(selector==="null")continue;const construct=__name2((options={})=>{const resolvedValue=Number(this.resolveValue(this.value,0,options))||0;if(this.ignored)return null;const finalValue=Math.clamped(resolvedValue,this.min??resolvedValue,this.max??resolvedValue);if(game.pf2e.variantRules.AutomaticBonusProgression.suppressRuleElement(this,finalValue))return null;const damageType=this.damageType&&this.resolveInjectedProperties(this.damageType,{warn:!1})||null;if(damageType!==null&&!objectHasKey(CONFIG.PF2E.damageTypes,damageType))return this.test(options.test??[])&&this.failValidation(`Unrecognized damage type: ${damageType}`),null;const modifier=new ModifierPF2e({slug,label,modifier:finalValue,type:this.type,ability:this.type==="ability"?this.ability:null,predicate:this.resolveInjectedProperties(this.predicate),rule:this,force:this.force,damageType,damageCategory:this.damageCategory,critical:this.critical,hideIfDisabled:this.hideIfDisabled,source:this.item.uuid});return options.test&&modifier.test(options.test),modifier},"construct");(this.actor.synthetics.modifiers[selector]??=[]).push(construct)}}async afterRoll({check,rollOptions}){if(this.ignored||!this.removeAfterRoll||!this.item.isOfType("effect"))return;(this.removeAfterRoll===!0||this.removeAfterRoll==="if-enabled"&&check.modifiers.some(m=>m.rule===this&&m.enabled)||Array.isArray(this.removeAfterRoll)&&this.removeAfterRoll.test(rollOptions))&&await this.item.delete()}};__name2(_FlatModifierRuleElement,"FlatModifierRuleElement");let FlatModifierRuleElement=_FlatModifierRuleElement;const _GrantItemRuleElement=class extends RuleElementPF2e{static{__name(this,"_GrantItemRuleElement")}constructor(data,options){data.inMemoryOnly&&(data.priority??=99),super(data,options),__privateAdd(this,_getOnDeleteActions),__privateAdd(this,_applyChoiceSelections),__privateAdd(this,_setGrantFlags),__privateAdd(this,_runGrantedItemPreCreates),__privateAdd(this,_createInMemoryCondition),__privateAdd(this,_trackItem),__publicField(this,"grantedId"),__publicField(this,"preselectChoices"),__publicField(this,"onDeleteActions"),this.inMemoryOnly?(this.reevaluateOnUpdate=!0,this.allowDuplicate=!0):this.reevaluateOnUpdate&&(this.allowDuplicate=!1),this.onDeleteActions=__privateMethod(this,_getOnDeleteActions,getOnDeleteActions_fn).call(this,data);const isValidPreselect=__name2(p=>Object.values(p).every(v=>["string","number"].includes(typeof v)),"isValidPreselect");if(this.preselectChoices=isObject(data.preselectChoices)&&isValidPreselect(data.preselectChoices)?deepClone(data.preselectChoices):{},this.grantedId=this.item.flags.pf2e.itemGrants[this.flag??""]?.id??null,this.track){const grantedItem=this.actor.inventory.get(this.grantedId??"")??null;__privateMethod(this,_trackItem,trackItem_fn).call(this,grantedItem)}this.item.isOfType("physical")&&this.failValidation("parent item must not be physical")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),uuid:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0,label:"PF2E.UUID.Label"}),flag:new SlugField({required:!0,nullable:!0,initial:null,camel:"dromedary"}),reevaluateOnUpdate:new fields2.BooleanField({label:"PF2E.RuleEditor.GrantItem.ReevaluateOnUpdate"}),inMemoryOnly:new fields2.BooleanField,allowDuplicate:new fields2.BooleanField({initial:!0,label:"PF2E.RuleEditor.GrantItem.AllowDuplicate"}),alterations:new StrictArrayField(new fields2.EmbeddedDataField(ItemAlteration)),track:new fields2.BooleanField}}static validateJoint(data){if(super.validateJoint(data),data.track&&!data.flag)throw Error("must have explicit flag set if granted item is tracked")}async preCreate(args){if(this.inMemoryOnly)return;const{itemSource,pendingItems,context}=args,ruleSource=args.ruleSource;if(this.reevaluateOnUpdate&&this.predicate.length===0)return ruleSource.ignored=!0,this.failValidation("`reevaluateOnUpdate` may only be used with a predicate.");const uuid=this.resolveInjectedProperties(this.uuid),grantedItem=await(async()=>{try{return(await fromUuid(uuid))?.clone()??null}catch(error){return console.error(error),null}})();if(!(grantedItem instanceof ItemPF2e)||(ruleSource.flag=typeof ruleSource.flag=="string"&&ruleSource.flag.length>0?sluggify(ruleSource.flag,{camel:"dromedary"}):(()=>{const defaultFlag=sluggify(grantedItem.slug??grantedItem.name,{camel:"dromedary"}),flagPattern=new RegExp(`^${defaultFlag}\\d*$`),itemGrants=itemSource.flags?.pf2e?.itemGrants??{},nthGrant=Object.keys(itemGrants).filter(g=>flagPattern.test(g)).length;return nthGrant>0?`${defaultFlag}${nthGrant+1}`:defaultFlag})(),this.flag=String(ruleSource.flag),!this.test()))return;const existingItem=this.actor.items.find(i=>i.sourceId===uuid);if(!this.allowDuplicate&&existingItem){__privateMethod(this,_setGrantFlags,setGrantFlags_fn).call(this,itemSource,existingItem),ui.notifications.info(game.i18n.format("PF2E.UI.RuleElements.GrantItem.AlreadyHasItem",{actor:this.actor.name,item:grantedItem.name}));return}itemSource._id??=randomID();const grantedSource=grantedItem.toObject();grantedSource._id=randomID(),itemSource.type==="effect"&&grantedSource.type==="effect"&&(grantedSource.system.level.value=itemSource.system?.level?.value??grantedSource.system.level.value),grantedSource.flags=mergeObject(grantedSource.flags,{core:{sourceId:uuid}});const tempGranted=new ItemProxyPF2e(deepClone(grantedSource),{parent:this.actor});if(tempGranted.isOfType("affliction","condition","effect")&&this.actor.isImmuneTo(tempGranted)){ruleSource.ignored=!0;return}tempGranted.prepareActorData?.();for(const rule of tempGranted.prepareRuleElements({suppressWarnings:!0}))rule.onApplyActiveEffects?.();__privateMethod(this,_applyChoiceSelections,applyChoiceSelections_fn).call(this,tempGranted);try{for(const alteration of this.alterations)alteration.applyTo(grantedSource)}catch(error){error instanceof Error&&this.failValidation(error.message)}if(!this.ignored){for(const item of[this.item,tempGranted])if(item.isOfType("class","feat")){const prefix=item.isOfType("class")||!item.isFeature?item.type:"feature",slug=item.slug??sluggify(item.name);this.actor.rollOptions.all[`self:${prefix}:${slug}`]=!0}this.grantedId=grantedSource._id,context.keepId=!0,__privateMethod(this,_setGrantFlags,setGrantFlags_fn).call(this,itemSource,grantedSource),__privateMethod(this,_trackItem,trackItem_fn).call(this,tempGranted),args.reevaluation||await __privateMethod(this,_runGrantedItemPreCreates,runGrantedItemPreCreates_fn).call(this,args,tempGranted,grantedSource,context),pendingItems.push(grantedSource)}}async preUpdateActor(){const noAction={create:[],delete:[]};if(!this.reevaluateOnUpdate||this.inMemoryOnly)return noAction;if(this.grantedId&&this.actor.items.has(this.grantedId))return this.test()?noAction:{create:[],delete:[this.grantedId]};const itemSource=this.item.toObject(),ruleSource=itemSource.system.rules[this.sourceIndex??-1];if(!ruleSource)return noAction;const pendingItems=[],context={parent:this.actor,render:!1};if(await this.preCreate({itemSource,pendingItems,ruleSource,context,reevaluation:!0}),pendingItems.length>0){const updatedGrants=itemSource.flags.pf2e?.itemGrants??{};return await this.item.update({"flags.pf2e.itemGrants":updatedGrants},{render:!1}),{create:pendingItems,delete:[]}}return noAction}onApplyActiveEffects(){const condition=__privateMethod(this,_createInMemoryCondition,createInMemoryCondition_fn).call(this);if(!condition)return;const{actor}=this;condition.rules=condition.prepareRuleElements();for(const rule of condition.rules)rule.onApplyActiveEffects?.(),rule.beforePrepareData?.(),actor.rules.push(rule);actor.conditions.set(condition.id,condition)}};_getOnDeleteActions=new WeakSet,getOnDeleteActions_fn=__name2(function(data){const actions=data.onDeleteActions;if(isObject(actions)){const ACTIONS=_GrantItemRuleElement.ON_DELETE_ACTIONS;return tupleHasValue(ACTIONS,actions.granter)||tupleHasValue(ACTIONS,actions.grantee)?pick(actions,[actions.granter?"granter":[],actions.grantee?"grantee":[]].flat()):null}return null},"#getOnDeleteActions"),_applyChoiceSelections=new WeakSet,applyChoiceSelections_fn=__name2(function(grantedItem){const source=grantedItem._source;for(const[flag,selection]of Object.entries(this.preselectChoices??{})){const rule=grantedItem.rules.find(rule2=>rule2 instanceof ChoiceSetRuleElement&&rule2.flag===flag);if(rule){const ruleSource=source.system.rules[grantedItem.rules.indexOf(rule)],resolvedSelection=this.resolveInjectedProperties(selection);rule.selection=ruleSource.selection=resolvedSelection}}},"#applyChoiceSelections"),_setGrantFlags=new WeakSet,setGrantFlags_fn=__name2(function(granter,grantee){const flags=mergeObject(granter.flags??{},{pf2e:{itemGrants:{}}});if(!this.flag)throw ErrorPF2e("Unexpected failure looking up RE flag key");flags.pf2e.itemGrants[this.flag]={id:grantee instanceof ItemPF2e?grantee.id:grantee._id,onDelete:this.onDeleteActions?.grantee??"detach"};const grantedBy={id:granter._id,onDelete:this.onDeleteActions?.granter??(setHasElement(PHYSICAL_ITEM_TYPES,grantee.type)?"detach":"cascade")};grantee instanceof ItemPF2e?grantee.update({"flags.pf2e.grantedBy":grantedBy},{render:!1}):grantee.flags=mergeObject(grantee.flags??{},{pf2e:{grantedBy}})},"#setGrantFlags"),_runGrantedItemPreCreates=new WeakSet,runGrantedItemPreCreates_fn=__name2(async function(originalArgs,grantedItem,grantedSource,context){for(const rule of grantedItem.rules){const ruleSource=grantedSource.system.rules[grantedItem.rules.indexOf(rule)];await rule.preCreate?.({...originalArgs,itemSource:grantedSource,ruleSource,context})}},"#runGrantedItemPreCreates"),_createInMemoryCondition=new WeakSet,createInMemoryCondition_fn=__name2(function(){if(!this.inMemoryOnly||!this.test())return null;const validationFailure="an in-memory-only grant must be a condition",uuid=this.resolveInjectedProperties(this.uuid);if(!UUIDUtils.isItemUUID(uuid))return this.failValidation(validationFailure),null;const conditionSource=game.pf2e.ConditionManager.conditions.get(uuid)?.toObject();if(!conditionSource)return this.failValidation(validationFailure),null;if(this.actor.isImmuneTo(conditionSource.system.slug))return null;for(const alteration of this.alterations)alteration.applyTo(conditionSource);const flags={pf2e:{grantedBy:{id:this.item.id,onDelete:"cascade"}}};conditionSource.flags.pf2e?.grantedBy;const condition=new ConditionPF2e(mergeObject(conditionSource,{_id:randomID(),flags,system:{references:{parent:{id:this.item.id}}}}),{parent:this.actor});return condition.prepareSiblingData(),condition.prepareActorData(),condition},"#createInMemoryCondition"),_trackItem=new WeakSet,trackItem_fn=__name2(function(grantedItem){if(!(this.track&&this.flag&&this.grantedId&&grantedItem instanceof PhysicalItemPF2e))return;this.actor.flags.pf2e.trackedItems[this.flag]=this.grantedId;const slug=sluggify(this.flag),rollOptionsAll=this.actor.rollOptions.all;for(const statement of grantedItem.getRollOptions(slug))rollOptionsAll[statement]=!0},"#trackItem"),__name2(_GrantItemRuleElement,"GrantItemRuleElement"),__publicField(_GrantItemRuleElement,"validActorTypes",["character","npc","familiar"]),__publicField(_GrantItemRuleElement,"ON_DELETE_ACTIONS",["cascade","detach","restrict"]);let GrantItemRuleElement=_GrantItemRuleElement;const _ItemAlterationRuleElement=class extends RuleElementPF2e{static{__name(this,"_ItemAlterationRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema(),PRIORITIES=AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES;return baseSchema.priority.initial=d=>(PRIORITIES[String(d.mode)]??50)+100,{...baseSchema,itemId:new fields2.StringField({required:!1,nullable:!1,blank:!1,initial:void 0}),itemType:new fields2.StringField({required:!1,nullable:!1,choices:mapValues$1(CONFIG.PF2E.Item.documentClasses,key=>`TYPES.Item.${key}`),initial:void 0}),...ItemAlteration.defineSchema()}}static validateJoint(data){if(super.validateJoint(data),!data.itemId&&!data.itemType)throw Error("one of itemId and itemType must be defined")}onApplyActiveEffects(){if(this.ignored)return;const actorRollOptions=this.predicate.length>0?this.actor.getRollOptions():[];try{const items=this.itemId?compact([this.actor.items.get(this.resolveInjectedProperties(this.itemId))]):this.itemType==="condition"?this.actor.conditions:this.actor.itemTypes[this.itemType];for(const item of items){const itemRollOptions=this.predicate.length>0?item.getRollOptions("item"):[],rollOptions=[...actorRollOptions,...itemRollOptions];if(this.test(rollOptions)){const data=pick$1(this,["mode","property","value"]);new ItemAlteration(data,{parent:this}).applyTo(item)}}}catch(error){error instanceof Error&&this.failValidation(error.message)}}async preCreate(){if(this.ignored||this.property!=="hp-max")return;const itemsOfType=this.itemType?this.actor.itemTypes[this.itemType]:[],actorRollOptions=this.actor.getRollOptions(),updates=itemsOfType.filter(i=>this.test([...actorRollOptions,...i.getRollOptions("item")])).flatMap(item=>{const source=item.toObject(),alteration=new ItemAlteration(pick$1(this,["mode","property","value"]),{parent:this});alteration.applyTo(source),alteration.applyTo(item);const newHP=source.system.hp,oldHP=item._source.system.hp,newHPValue=Math.floor(oldHP.value*(newHP.max/oldHP.max));return newHPValue===oldHP.value?[]:{_id:item.id,"system.hp.value":newHPValue}});updates.length>0&&await this.actor.updateEmbeddedDocuments("Item",updates,{render:!1})}};__name2(_ItemAlterationRuleElement,"ItemAlterationRuleElement");let ItemAlterationRuleElement=_ItemAlterationRuleElement;const _LoseHitPointsRuleElement=class extends RuleElementPF2e{static{__name(this,"_LoseHitPointsRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,initial:void 0}),reevaluateOnUpdate:new fields2.BooleanField({required:!1,initial:!1}),recoverable:new fields2.BooleanField({required:!1,initial:!0})}}onCreate(actorUpdates){if(this.ignored)return;const value=Math.trunc(Math.abs(Number(this.resolveValue(this.value))||0)),currentHP=this.actor._source.system.attributes.hp.value;actorUpdates["system.attributes.hp.value"]=Math.max(currentHP-value,0)}beforePrepareData(){if(this.ignored)return;const{actor}=this;if(!this.recoverable){const value=Math.trunc(Math.abs(Number(this.resolveValue(this.value))||0));actor.system.attributes.hp.unrecoverable+=value}}async preUpdate(changes){if(!this.reevaluateOnUpdate||this.ignored)return;const previousValue=Math.trunc(Math.abs(Number(this.resolveValue(this.value))||0)),newItem=this.item.clone(changes),rule=newItem.system.rules.find(r=>r.key===this.key),valueChange=Math.trunc(Math.abs(Number(this.resolveValue(String(rule?.value),0,{resolvables:{item:newItem}}))))-previousValue;if(valueChange>0){const currentHP=this.actor._source.system.attributes.hp.value;await this.actor.update({"system.attributes.hp.value":Math.max(currentHP-valueChange,0)},{render:!1})}}};__name2(_LoseHitPointsRuleElement,"LoseHitPointsRuleElement"),__publicField(_LoseHitPointsRuleElement,"validActorTypes",["character","familiar","npc"]);let LoseHitPointsRuleElement=_LoseHitPointsRuleElement;const ARMOR_CATEGORIES=new Set(["unarmored","light","medium","heavy","light-barding","heavy-barding"]),_MartialProficiencyRuleElement=class extends RuleElementPF2e{static{__name(this,"_MartialProficiencyRuleElement")}static defineSchema(){return{...super.defineSchema(),kind:new StrictStringField({required:!0,nullable:!1,choices:["attack","defense"],initial:"attack"}),definition:new PredicateField({required:!0,nullable:!1}),sameAs:new StrictStringField({required:!1,nullable:!1,choices:[...WEAPON_CATEGORIES,...ARMOR_CATEGORIES]}),maxRank:new StrictStringField({required:!1,nullable:!1,choices:["trained","expert","master","legendary"]}),value:new ResolvableValueField({required:!1,initial:void 0})}}constructor(data,options){super({priority:9,...data},options),this.slug??=sluggify(this.label)}onApplyActiveEffects(){if(!this.test())return;const rank=Math.clamped(Number(this.resolveValue(this.value))||1,1,4),key=this.kind==="attack"?"attacks":"defenses";this.actor.system.proficiencies[key][this.slug]={definition:this.resolveInjectedProperties(this.definition),immutable:!0,label:this.label,sameAs:this.sameAs,rank,maxRank:this.maxRank,value:0,breakdown:""}}};__name2(_MartialProficiencyRuleElement,"MartialProficiencyRuleElement"),__publicField(_MartialProficiencyRuleElement,"validActorTypes",["character"]);let MartialProficiencyRuleElement=_MartialProficiencyRuleElement;const _MultipleAttackPenaltyRuleElement=class extends RuleElementPF2e{static{__name(this,"_MultipleAttackPenaltyRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1,label:"PF2E.RuleEditor.General.Selector"}),value:new ResolvableValueField({required:!0,initial:void 0,label:"PF2E.RuleEditor.General.Value"})}}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),value=Number(this.resolveValue(this.value))||0;if(selector&&value&&value<0){const map2={label:game.i18n.format("PF2E.UI.RuleElements.MultipleAttackPenalty.Breakdown",{label:this.label}),penalty:value,predicate:this.predicate};(this.actor.synthetics.multipleAttackPenalties[selector]??=[]).push(map2)}else this.failValidation("must have a negative value")}};__name2(_MultipleAttackPenaltyRuleElement,"MultipleAttackPenaltyRuleElement");let MultipleAttackPenaltyRuleElement=_MultipleAttackPenaltyRuleElement;const _RollNoteRuleElement=class extends RuleElementPF2e{static{__name(this,"_RollNoteRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,initial:void 0}),{required:!0,nullable:!1}),title:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),visibility:new fields2.StringField({required:!0,nullable:!0,choices:["gm","owner"],initial:null}),outcome:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,choices:DEGREE_OF_SUCCESS_STRINGS}),{required:!1,nullable:!1,initial:void 0}),text:new DataUnionField([new StrictStringField({required:!0,blank:!1}),new ResolvableValueField],{required:!0,nullable:!1})}}beforePrepareData(){if(!this.ignored)for(const selector of this.resolveInjectedProperties(this.selector)){if(selector==="null")continue;const title=this.resolveInjectedProperties(this.title)?.trim()??null,text=this.resolveInjectedProperties(String(this.resolveValue(this.text,"",{evaluate:!1}))).trim();if(!text)return this.failValidation("text field resolved empty");const note=new RollNotePF2e({selector,title:title?this.getReducedLabel(title):null,text,predicate:this.resolveInjectedProperties(this.predicate),outcome:this.outcome,visibility:this.visibility,rule:this});(this.actor.synthetics.rollNotes[selector]??=[]).push(note)}}};__name2(_RollNoteRuleElement,"RollNoteRuleElement");let RollNoteRuleElement=_RollNoteRuleElement;const _RollOptionRuleElement=class extends RuleElementPF2e{static{__name(this,"_RollOptionRuleElement")}constructor(source,options){super(source,options),__privateAdd(this,_resolveOption),__privateAdd(this,_setFlag),__privateAdd(this,_setRollOption2),source.removeAfterRoll&&!this.item.isOfType("effect")&&this.failValidation("removeAfterRoll may only be used on rule elements from effect items"),this.toggleable==="totm"&&!game.settings.get("pf2e","totmToggles")&&(this.ignored=!0);const firstSuboption=this.suboptions.at(0);firstSuboption&&this.suboptions.every(s=>!s.selected)&&(firstSuboption.selected=!0)}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema();return baseSchema.priority.initial=AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES.override,{...baseSchema,domain:new fields2.StringField({required:!0,nullable:!1,initial:"all",blank:!1}),option:new fields2.StringField({required:!0,nullable:!1,blank:!1}),phase:new fields2.StringField({required:!1,nullable:!1,choices:deepClone(AELikeRuleElement.PHASES),initial:"applyAEs"}),suboptions:new fields2.ArrayField(new fields2.SchemaField({label:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0}),value:new StrictStringField({required:!0,nullable:!1,blank:!1,initial:void 0}),predicate:new PredicateField,selected:new fields2.BooleanField}),{required:!1,nullable:!1,initial:[],validate:v=>Array.isArray(v)&&v.length!==1,validationError:"must have zero or 2+ suboptions"}),value:new ResolvableValueField({required:!1,initial:d=>!d.toggleable,validate:v=>["boolean","string"].includes(typeof v),validationError:"must be a boolean, string, or otherwise omitted"}),toggleable:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["totm"],initial:void 0}),new StrictBooleanField({required:!1,nullable:!1,initial:!1})],{required:!1,nullable:!1,initial:void 0}),placement:new fields2.StringField({required:!1,nullable:!1,initial:void 0}),disabledIf:new PredicateField({required:!1,initial:void 0}),disabledValue:new fields2.BooleanField({required:!1,initial:void 0}),alwaysActive:new fields2.BooleanField({required:!1,initial:void 0}),count:new fields2.BooleanField({required:!1,initial:void 0}),removeAfterRoll:new fields2.BooleanField({required:!1,initial:void 0})}}static validateJoint(source){if(super.validateJoint(source),source.suboptions.length>0&&!source.toggleable)throw Error(" suboptions: must be omitted if not toggleable");if(source.disabledIf&&!source.toggleable)throw Error(" disabledIf: must be false if not toggleable");if(source.count&&source.toggleable)throw Error(" count: must be false if toggleable");if(typeof source.disabledValue=="boolean"&&(!source.toggleable||!source.disabledIf))throw Error(" disabledValue: may only be included if toggeable and there is a disabledIf predicate.");if(source.alwaysActive&&(!source.toggleable||source.suboptions.length===0))throw Error(" alwaysActive: must be false unless toggleable and containing suboptions");if(source.placement&&!source.toggleable)throw Error(" placement: may only be present if toggleable")}onApplyActiveEffects(){this.phase==="applyAEs"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}beforePrepareData(){this.phase==="beforeDerived"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}afterPrepareData(){this.phase==="afterDerived"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}resolveValue(){return this.toggleable==="totm"&&!game.settings.get("pf2e","totmToggles")?!1:this.alwaysActive?!0:!!super.resolveValue(this.value)}async toggle(newValue=!this.resolveValue(),newSuboption=null){if(!this.toggleable)throw ErrorPF2e("Attempted to toggle non-toggleable roll option");const rulesSource=this.item.toObject().system.rules,thisSource=typeof this.sourceIndex=="number"?rulesSource.at(this.sourceIndex):null;if(!thisSource)return null;if(thisSource.value=newValue,newSuboption&&Array.isArray(thisSource.suboptions)&&thisSource.suboptions.every(o=>isObject(o)))for(const suboption of thisSource.suboptions)suboption.selected=suboption.value===newSuboption;return(await this.actor.updateEmbeddedDocuments("Item",[{_id:this.item.id,"system.rules":rulesSource}])).length===1?newValue:null}beforeRoll(domains,rollOptions){if(!(this.test(rollOptions)&&domains.includes(this.domain)))return;this.value=this.resolveValue();const option=__privateMethod(this,_resolveOption,resolveOption_fn).call(this);this.value?rollOptions.add(option):rollOptions.delete(option)}async afterRoll({domains,rollOptions}){const option=__privateMethod(this,_resolveOption,resolveOption_fn).call(this);!this.ignored&&this.removeAfterRoll&&this.value&&this.actor.items.has(this.item.id)&&domains.includes(this.domain)&&rollOptions.has(option)&&(game.settings.get("pf2e","automation.removeExpiredEffects")?await this.item.delete():game.settings.get("pf2e","automation.effectExpiration")&&await this.item.update({"system.duration.value":-1,"system.expired":!0}))}};_resolveOption=new WeakSet,resolveOption_fn=__name2(function({appendSuboption=!0}={}){const baseOption=this.resolveInjectedProperties(this.option).replace(/[^-:\w]/g,"").replace(/:+/g,":").replace(/-+/g,"-").trim();if(appendSuboption){const selectedSuboption=this.suboptions.find(o=>o.selected);return selectedSuboption?`${baseOption}:${selectedSuboption.value}`:baseOption}else return baseOption},"#resolveOption"),_setFlag=new WeakSet,setFlag_fn=__name2(function(value){const suboption=this.suboptions.find(o=>o.selected)??this.suboptions.at(0);if(suboption){const flagKey=sluggify(__privateMethod(this,_resolveOption,resolveOption_fn).call(this,{appendSuboption:!1}),{camel:"dromedary"});if(value){const flagValue=/^\d+$/.test(suboption.value)?Number(suboption.value):suboption.value;this.item.flags.pf2e.rulesSelections[flagKey]=flagValue}else this.item.flags.pf2e.rulesSelections[flagKey]=null}},"#setFlag"),_setRollOption2=new WeakSet,setRollOption_fn2=__name2(function(){this.domain=this.resolveInjectedProperties(this.domain);const isStandardDomain=/^[-a-z0-9]+$/.test(this.domain)&&/[a-z]/.test(this.domain),isIdDomain=/^[a-zA-Z0-9]{16}-[-a-z0-9]+[a-z0-9]$/.test(this.domain);if(!isStandardDomain&&!isIdDomain)return this.failValidation("domain must be a string consisting of only lowercase letters, numbers, and hyphens.");const optionSet=new Set([this.actor.getRollOptions([this.domain]),this.parent.getRollOptions("parent")].flat());if(!this.test(optionSet))return __privateMethod(this,_setFlag,setFlag_fn).call(this,!1);const{rollOptions}=this.actor,domainRecord=rollOptions[this.domain]??={},baseOption=this.option=__privateMethod(this,_resolveOption,resolveOption_fn).call(this,{appendSuboption:!1});if(!baseOption){this.failValidation('The "option" property must be a string consisting of only letters, numbers, colons, and hyphens');return}if(this.count){const existing=Object.keys(domainRecord).flatMap(key=>({key,count:Number(new RegExp(`^${baseOption}:(\\d+)$`).exec(key)?.[1])})).find(keyAndCount=>!!keyAndCount.count);existing?(delete domainRecord[existing.key],domainRecord[`${baseOption}:${existing.count+1}`]=!0):domainRecord[`${baseOption}:1`]=!0}else{const suboptions=this.suboptions.filter(s=>s.predicate.test(optionSet));if(suboptions.length>0&&!suboptions.some(s=>s.selected)){suboptions[0].selected=!0;for(const otherSuboption of this.suboptions)otherSuboption!==suboptions[0]&&(otherSuboption.selected=!1)}else if(this.suboptions.length>0&&suboptions.length===0)return;const fullOption=__privateMethod(this,_resolveOption,resolveOption_fn).call(this),value=this.resolveValue();if(value&&(domainRecord[fullOption]=value,domainRecord[baseOption]=value),this.toggleable){const toggle={itemId:this.item.id,label:this.getReducedLabel(),placement:this.placement??"actions-tab",domain:this.domain,option:baseOption,suboptions,alwaysActive:!!this.alwaysActive,checked:value,enabled:!0};if(this.disabledIf){const rollOptions2=this.actor.getRollOptions([this.domain]);toggle.enabled=!this.disabledIf.test(rollOptions2),!toggle.enabled&&!this.alwaysActive&&typeof this.disabledValue=="boolean"&&(toggle.checked=this.disabledValue,this.disabledValue||delete domainRecord[fullOption])}this.actor.synthetics.toggles.push(toggle)}__privateMethod(this,_setFlag,setFlag_fn).call(this,value)}},"#setRollOption"),__name2(_RollOptionRuleElement,"RollOptionRuleElement");let RollOptionRuleElement=_RollOptionRuleElement;const _RollTwiceRuleElement=class extends RuleElementPF2e{static{__name(this,"_RollTwiceRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),keep:new fields2.StringField({required:!0,choices:["lower","higher"]}),removeAfterRoll:new fields2.BooleanField({required:!1,initial:void 0})}}beforePrepareData(){if(this.ignored)return;const synthetic={keep:this.keep};this.predicate&&(synthetic.predicate=this.predicate),(this.actor.synthetics.rollTwice[this.selector]??=[]).push(synthetic)}async afterRoll({domains,roll,rollOptions}){if(!this.actor.items.has(this.item.id))return;const expireEffects=game.settings.get("pf2e","automation.effectExpiration"),removeExpired=game.settings.get("pf2e","automation.removeExpiredEffects"),removeAfterRoll=this.removeAfterRoll??((expireEffects||removeExpired)&&this.item.isOfType("effect"));if((roll?.dice.some(d=>["kh","kl"].some(m=>d.modifiers.includes(m)))??!1)&&removeAfterRoll&&domains.includes(this.selector)&&this.test(rollOptions)){for(const rule of this.item.rules)rule.ignored=!0;removeExpired?await this.item.delete():expireEffects&&await this.item.update({"system.duration.value":-1,"system.expired":!0})}}};__name2(_RollTwiceRuleElement,"RollTwiceRuleElement");let RollTwiceRuleElement=_RollTwiceRuleElement;const _SpecialStatisticRuleElement=class extends RuleElementPF2e{static{__name(this,"_SpecialStatisticRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),slug:new SlugField({required:!0,nullable:!1,initial:void 0,validate:v=>typeof v=="string"&&!(v in CONFIG.PF2E.magicTraditions||v in CONFIG.PF2E.classTraits||setHasElement(SKILL_LONG_FORMS,v)||tupleHasValue(SAVE_TYPES,v)||["perception","initiative"].includes(v))}),type:new fields2.StringField({required:!0,choices:["simple","check","attack-roll"],initial:"check"}),extends:new fields2.StringField({required:!0,nullable:!0,initial:null}),attribute:new fields2.StringField({required:!0,choices:Array.from(ATTRIBUTE_ABBREVIATIONS),nullable:!0,initial:null})}}afterPrepareData(){if(this.type==="simple")return;const checkDomains=this.type==="check"?[`${this.slug}-check`]:[`${this.slug}-attack-roll`],extendedFrom=this.extends?this.actor.getStatistic(this.extends):null,data={slug:this.slug,label:this.label,attribute:this.attribute??extendedFrom?.attribute??null,domains:[this.slug],check:{type:this.type==="check"?"check":"attack-roll",domains:checkDomains},dc:{domains:[`${this.slug}-dc`]}},statistic=extendedFrom?.extend(data)??new Statistic(this.actor,data);statistic?this.actor.synthetics.statistics.set(this.slug,statistic):this.failValidation(`Unable to find statistic ${this.extends} to extend from`)}};__name2(_SpecialStatisticRuleElement,"SpecialStatisticRuleElement");let SpecialStatisticRuleElement=_SpecialStatisticRuleElement;const _StrikingRuleElement=class extends RuleElementPF2e{static{__name(this,"_StrikingRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),value:new ResolvableValueField({required:!1,nullable:!1,initial:void 0})}}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),strikingValue=this.value??(this.item instanceof WeaponPF2e?getStrikingDice(this.item.system):0),value=this.resolveValue(strikingValue);if(selector&&typeof value=="number"){const striking={label:this.getReducedLabel(),bonus:value,predicate:this.predicate};(this.actor.synthetics.striking[selector]??=[]).push(striking)}else this.failValidation("Striking requires at least a selector field and a non-empty resolved value")}};__name2(_StrikingRuleElement,"StrikingRuleElement"),__publicField(_StrikingRuleElement,"validActorTypes",["character","npc"]);let StrikingRuleElement=_StrikingRuleElement;const _SubstituteRollRuleElement=class extends RuleElementPF2e{static{__name(this,"_SubstituteRollRuleElement")}constructor(source,options){super(source,options),this.removeAfterRoll&&!this.item.isOfType("effect")&&this.failValidation(" removeAfterRoll: may only be used with effects")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1,initial:"check"}),value:new ResolvableValueField({required:!0,nullable:!1}),required:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),effectType:new fields2.StringField({required:!0,nullable:!1,choices:["fortune","misfortune"],initial:"fortune"}),removeAfterRoll:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["if-enabled"],initial:void 0}),new StrictBooleanField({required:!1,nullable:!1,initial:void 0}),new PredicateField({required:!1,nullable:!1,initial:void 0})],{required:!1,nullable:!1,initial:!1})}}beforePrepareData(){const value=Math.clamped(Math.trunc(Number(this.resolveValue(this.value))),1,20);if(Number.isNaN(value))return this.failValidation("value must resolve to a number");const selector=this.resolveInjectedProperties(this.selector);(this.actor.synthetics.rollSubstitutions[selector]??=[]).push({slug:this.slug??sluggify(this.item.name),label:this.label,value,predicate:this.predicate,required:this.required,selected:this.required,effectType:this.effectType})}async afterRoll(params){if(!this.removeAfterRoll||this.ignored)return;if(this.removeAfterRoll===!0){await this.item.delete();return}if(Array.isArray(this.removeAfterRoll)&&this.removeAfterRoll.test(params.rollOptions)){await this.item.delete();return}const rollSubstituted=params.roll.dice.length===0,substitutionIncluded=!!params.context.substitutions?.some(s=>s.slug===this.slug&&s.selected);this.removeAfterRoll==="if-enabled"&&rollSubstituted&&substitutionIncluded&&await this.item.delete()}};__name2(_SubstituteRollRuleElement,"SubstituteRollRuleElement");let SubstituteRollRuleElement=_SubstituteRollRuleElement;const _TokenEffect=class{static{__name(this,"_TokenEffect")}constructor(effect){__privateAdd(this,_effect,void 0),__publicField(this,"tint",null),__publicField(this,"isTemporary",!0),__privateSet(this,_effect,effect)}get id(){return __privateGet(this,_effect).id}get _id(){return __privateGet(this,_effect).id}get parent(){return __privateGet(this,_effect).parent}get name(){return __privateGet(this,_effect).name}get icon(){return __privateGet(this,_effect).img}get changes(){return[]}get description(){return __privateGet(this,_effect).description}get flags(){return __privateGet(this,_effect).flags}get statuses(){return new Set([__privateGet(this,_effect).slug??sluggify(__privateGet(this,_effect).name)])}get disabled(){return __privateGet(this,_effect).isOfType("effect")&&__privateGet(this,_effect).isExpired}get duration(){const effect=__privateGet(this,_effect),isEffect=effect.isOfType("effect");return{type:"none",seconds:null,rounds:null,turns:null,combat:null,startTime:isEffect?effect.system.start.value:null,startRound:null,startTurn:isEffect?effect.system.start.initiative:null,label:isEffect?effect.system.remaining:""}}get transfer(){return!1}get origin(){return __privateGet(this,_effect).uuid}getFlag(scope,flag){return __privateGet(this,_effect).getFlag(scope,flag)}};_effect=new WeakMap,__name2(_TokenEffect,"TokenEffect");let TokenEffect=_TokenEffect;const _TokenEffectIconRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenEffectIconRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new fields2.StringField({required:!1,blank:!1,initial:void 0})}}afterPrepareData(){if(!this.test())return;const path=this.value?this.resolveInjectedProperties(this.value).trim():this.item.img;if(!isImageFilePath(path))return this.failValidation("value is not a valid image file path");this.actor.synthetics.tokenEffectIcons.push(new TokenEffect(new EffectPF2e({type:"effect",name:this.label,img:path})))}};__name2(_TokenEffectIconRuleElement,"TokenEffectIconRuleElement");let TokenEffectIconRuleElement=_TokenEffectIconRuleElement;const _TokenImageRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenImageRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_srcIsValid),typeof this.value=="string"||this.isBracketedValue(this.value)||this.failValidation("value must be a string or a bracketed value")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0,label:"TOKEN.ImagePath"}),scale:new fields2.NumberField({required:!1,nullable:!0,positive:!0,initial:null,label:"Scale"}),tint:new fields2.ColorField({label:"TOKEN.TintColor"}),alpha:new fields2.AlphaField({label:"PF2E.RuleEditor.General.Opacity"})}}afterPrepareData(){const src=this.resolveValue(this.value);if(!__privateMethod(this,_srcIsValid,srcIsValid_fn).call(this,src))return this.failValidation("Missing or invalid value field");if(!this.test())return;const texture={src};this.scale&&(texture.scaleX=this.scale,texture.scaleY=this.scale),this.tint&&(texture.tint=this.tint),this.alpha&&(this.actor.synthetics.tokenOverrides.alpha=this.alpha),this.actor.synthetics.tokenOverrides.texture=texture}};_srcIsValid=new WeakSet,srcIsValid_fn=__name2(function(src){if(typeof src!="string")return!1;const extension=/(?<=\.)[a-z0-9]{3,4}$/i.exec(src)?.at(0);return!!extension&&(extension in CONST.IMAGE_FILE_EXTENSIONS||extension in CONST.VIDEO_FILE_EXTENSIONS)},"#srcIsValid"),__name2(_TokenImageRuleElement,"TokenImageRuleElement");let TokenImageRuleElement=_TokenImageRuleElement;const _TokenLightRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenLightRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new fields2.SchemaField({...foundry.data.LightData.defineSchema(),dim:new ResolvableValueField({required:!1,nullable:!1,initial:void 0}),bright:new ResolvableValueField({required:!1,nullable:!1,initial:void 0})})}}constructor(data,options){super(data,options),this.validateData()}validateData(){const light=this.value;for(const key of["dim","bright"])if(light[key]!==void 0){const resolvedValue=this.resolveValue(light[key]);if(typeof resolvedValue=="number")light[key]=resolvedValue;else return this.failValidation(`${key} must resolve to a number`)}try{new foundry.data.LightData(light)}catch(error){error instanceof Error&&this.failValidation(error.message)}}afterPrepareData(){this.test()&&(this.actor.synthetics.tokenOverrides.light=deepClone(this.value))}};__name2(_TokenLightRuleElement,"TokenLightRuleElement");let TokenLightRuleElement=_TokenLightRuleElement;const _MarkTargetPrompt=class{static{__name(this,"_MarkTargetPrompt")}constructor(params){__privateAdd(this,_cancelHandler),__publicField(this,"prompt"),__publicField(this,"requirements"),__privateAdd(this,_target,void 0),__privateAdd(this,_resolve4,void 0),this.prompt=params.prompt??"PF2E.UI.RuleElements.TokenMark.TargetToken",this.requirements=params.requirements}async resolveTarget(){return game.user.targets.clear(),this.activateListeners(),ui.notifications.info(this.prompt,{localize:!0}),new Promise(resolve=>{__privateSet(this,_resolve4,resolve)})}activateListeners(){document.activeElement instanceof HTMLElement&&document.activeElement.blur();const hookParams=["targetToken",(_user,token,targeted)=>{var _a;__privateSet(this,_target,targeted&&token instanceof TokenPF2e?token.document:null),(_a=__privateGet(this,_resolve4))==null||_a.call(this,__privateGet(this,_target))}];Hooks.once(...hookParams);const cancelHandler=__privateMethod(this,_cancelHandler,cancelHandler_fn).call(this,hookParams);document.addEventListener("keyup",cancelHandler),window.setTimeout(()=>{var _a;Hooks.off(...hookParams),document.removeEventListener("keyup",cancelHandler),__privateGet(this,_target)===void 0&&((_a=__privateGet(this,_resolve4))==null||_a.call(this,null))},15e3)}};_target=new WeakMap,_resolve4=new WeakMap,_cancelHandler=new WeakSet,cancelHandler_fn=__name2(function(hookParams){const handler=__name2(event=>{event.key==="Escape"&&(event.stopPropagation(),ui.notifications.info("PF2E.UI.RuleElements.TokenMark.Timeout",{localize:!0}),Hooks.off(...hookParams),document.removeEventListener("keyup",handler))},"handler");return handler},"#cancelHandler"),__name2(_MarkTargetPrompt,"MarkTargetPrompt");let MarkTargetPrompt=_MarkTargetPrompt;const _TokenMarkRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenMarkRuleElement")}constructor(){super(...arguments),__privateAdd(this,_checkRuleSource)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),slug:new SlugField({required:!0,nullable:!1,initial:void 0}),uuid:new fields2.StringField({required:!1,nullable:!0,initial:null})}}async preCreate({ruleSource,itemSource,pendingItems}){if(this.ignored)return;if(this.uuid&&=this.resolveInjectedProperties(this.uuid),this.actor.getActiveTokens().length===0){this.ignored=ruleSource.ignored=!0;return}const token=fromUuidSync(this.uuid??"")??(game.user.targets.size===1?Array.from(game.user.targets)[0].document:await new MarkTargetPrompt({prompt:null,requirements:null}).resolveTarget());if(!(token instanceof TokenDocumentPF2e)){pendingItems.splice(pendingItems.indexOf(itemSource),1);return}__privateMethod(this,_checkRuleSource,checkRuleSource_fn).call(this,ruleSource),this.uuid=ruleSource.uuid=token.uuid}beforePrepareData(){UUIDUtils.isTokenUUID(this.uuid)&&this.test()&&this.actor.synthetics.tokenMarks.set(this.uuid,this.slug)}};_checkRuleSource=new WeakSet,checkRuleSource_fn=__name2(function(source){if(!(source.key==="TokenMark"&&source.slug===this.slug))throw ErrorPF2e("Unexpected rule element passed")},"#checkRuleSource"),__name2(_TokenMarkRuleElement,"TokenMarkRuleElement");let TokenMarkRuleElement=_TokenMarkRuleElement;const _TokenNameRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenNameRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0})}}afterPrepareData(){const name2=this.resolveValue(this.value);if(typeof name2!="string")return this.failValidation("value must resolve to a string");this.test()&&(this.actor.synthetics.tokenOverrides.name=name2)}};__name2(_TokenNameRuleElement,"TokenNameRuleElement");let TokenNameRuleElement=_TokenNameRuleElement;const _WeaponPotencyRuleElement=class extends RuleElementPF2e{static{__name(this,"_WeaponPotencyRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,nullable:!1,blank:!1}),value:new ResolvableValueField({required:!0})}}beforePrepareData(){if(this.ignored)return;const{weaponPotency}=this.actor.synthetics,selector=this.resolveInjectedProperties(this.selector),{item}=this,potencyValue=this.value??(item.isOfType("weapon")?item.system.potencyRune.value:0),value=this.resolveValue(potencyValue);if(selector&&typeof value=="number"){const bonusType=AutomaticBonusProgression.isEnabled(this.actor)?"potency":"item",potency={label:this.getReducedLabel(),bonus:value,type:bonusType,predicate:this.predicate};(weaponPotency[selector]??=[]).push(potency)}else this.failValidation("Weapon potency requires at least a selector field and a non-empty value field")}};__name2(_WeaponPotencyRuleElement,"WeaponPotencyRuleElement"),__publicField(_WeaponPotencyRuleElement,"validActorTypes",["character","npc"]);let WeaponPotencyRuleElement=_WeaponPotencyRuleElement;const _RuleElements=class{static{__name(this,"_RuleElements")}static get all(){return{...this.builtin,...this.custom}}static fromOwnedItem(options){const rules=[],item=options.parent;for(const[sourceIndex,source]of item.system.rules.entries()){if(typeof source.key!="string"){console.error(`PF2e System | Missing key in rule element ${source.key} on item ${item.name} (${item.uuid})`);continue}const REConstructor=this.custom[source.key]??this.custom[source.key]??this.builtin[source.key];if(REConstructor){const rule=(()=>{try{return new REConstructor(source,{...options,sourceIndex})}catch(error){return options?.suppressWarnings||(console.warn(`PF2e System | Failed to construct rule element ${source.key} on item ${item.name}`,`(${item.uuid})`),console.warn(error)),null}})();rule&&rules.push(rule)}else{const{name:name2,uuid}=item;console.warn(`PF2e System | Unrecognized rule element ${source.key} on item ${name2} (${uuid})`)}}return rules}};__name2(_RuleElements,"RuleElements"),__publicField(_RuleElements,"builtin",{ActiveEffectLike:AELikeRuleElement,ActorTraits:ActorTraitsRuleElement,AdjustDegreeOfSuccess:AdjustDegreeOfSuccessRuleElement,AdjustModifier:AdjustModifierRuleElement,AdjustStrike:AdjustStrikeRuleElement,Aura:AuraRuleElement,BaseSpeed:BaseSpeedRuleElement,BattleForm:BattleFormRuleElement,ChoiceSet:ChoiceSetRuleElement,CraftingEntry:CraftingEntryRuleElement,CraftingFormula:CraftingFormulaRuleElement,CreatureSize:CreatureSizeRuleElement,CriticalSpecialization:CritSpecRuleElement,DamageDice:DamageDiceRuleElement,DexterityModifierCap:DexterityModifierCapRuleElement,EphemeralEffect:EphemeralEffectRuleElement,FastHealing:FastHealingRuleElement,FixedProficiency:FixedProficiencyRuleElement,FlatModifier:FlatModifierRuleElement,GrantItem:GrantItemRuleElement,Immunity:ImmunityRuleElement,ItemAlteration:ItemAlterationRuleElement,LoseHitPoints:LoseHitPointsRuleElement,MartialProficiency:MartialProficiencyRuleElement,MultipleAttackPenalty:MultipleAttackPenaltyRuleElement,Note:RollNoteRuleElement,Resistance:ResistanceRuleElement,RollOption:RollOptionRuleElement,RollTwice:RollTwiceRuleElement,Sense:SenseRuleElement,SpecialStatistic:SpecialStatisticRuleElement,Strike:StrikeRuleElement,Striking:StrikingRuleElement,SubstituteRoll:SubstituteRollRuleElement,TempHP:TempHPRuleElement,TokenEffectIcon:TokenEffectIconRuleElement,TokenImage:TokenImageRuleElement,TokenLight:TokenLightRuleElement,TokenMark:TokenMarkRuleElement,TokenName:TokenNameRuleElement,Weakness:WeaknessRuleElement,WeaponPotency:WeaponPotencyRuleElement}),__publicField(_RuleElements,"custom",{});let RuleElements=_RuleElements;const CodeMirror={EditorView,basicSetup,json,jsonLinter:()=>linter(jsonParseLinter()),keybindings:keymap.of([indentWithTab]),ruleElementExtensions:options=>[json(),CodeMirror.jsonLinter(),autocompletion({override:[ruleElementAutocomplete(options)]})]};function ruleElementAutocomplete(options){const validKeysByPath=(()=>options.schema?{"":Object.keys(options.schema)}:{"":["key"]})();return context=>{const node=syntaxTree(context.state).resolveInner(context.pos,-1),isProperty=node.name==="Object"||node.type.name==="PropertyName",isValue=!isProperty&&(node.name==="Property"||node.parent?.name==="Property");if(isProperty){const basePath=resolveNodePath(context,node),keys2=basePath!==null?validKeysByPath[basePath]:[];return keys2?.length?{from:node.from,to:node.to,options:keys2.map(o=>({label:`"${o}"`}))}:null}else if(isValue&&resolveNodePath(context,node)==="key"){const options2=Object.keys(RuleElements.all);return{from:node.from,to:node.to,options:options2.map(o=>({label:`"${o}"`}))}}return null}}__name(ruleElementAutocomplete,"ruleElementAutocomplete"),__name2(ruleElementAutocomplete,"ruleElementAutocomplete");function resolveNodePath(context,node){node=node.type.name==="PropertyName"&&node.parent?node.parent:node;const parent=node.parent;if(!parent||parent.type.name==="JsonText")return"";const parentType=parent.type.name;if(parentType==="\u26A0")return null;const name2=(()=>parentType==="Object"?!parent.parent||parent.parent.type.name==="JsonText"?"":".":parentType==="Property"?context.state.sliceDoc(parent.from,parent.to).match(/^"([^"]*)"/)?.[1]:parentType==="Array"?"[]":null)();if(name2===null)return null;const basePath=resolveNodePath(context,parent);return basePath===null?null:basePath+name2}__name(resolveNodePath,"resolveNodePath"),__name2(resolveNodePath,"resolveNodePath");const _RuleElementForm=class{static{__name(this,"_RuleElementForm")}constructor(options){__privateAdd(this,_getFormHelpers),__publicField(this,"template","systems/pf2e/templates/items/rules/default.hbs"),__publicField(this,"tabs",null),__privateAdd(this,_activeTab,null),this.initialize(options)}get basePath(){return`system.rules.${this.index}`}initialize(options){this.sheet=options.sheet,this.index=options.index,this.rule=options.rule,this.object=options.object??(()=>{const RuleElementClass=RuleElements.all[String(this.rule.key)];if(!RuleElementClass)return null;const actor=new ActorProxyPF2e({_id:randomID(),name:"temp",type:"character"}),item=new ItemProxyPF2e(this.item.toObject(),{parent:actor});return new RuleElementClass(deepClone(this.rule),{parent:item,strict:!1,suppressWarnings:!0})})(),this.schema=this.object?.schema??RuleElements.all[String(this.rule.key)]?.schema??null}get item(){return this.sheet.item}get fieldIdPrefix(){return`field-${this.sheet.appId}-${this.index}-`}getInitialValue(){if(this.constructor.name==="RuleElementForm")return{};const initial=this.schema?.getInitialValue();if(!initial)return{};for(const property of["ignored","priority","slug"])delete initial[property];const removeArrays=__name2(object=>{for(const[key,value]of Object.entries(object))Array.isArray(value)?delete object[key]:isObject(value)&&removeArrays(value)},"removeArrays");return removeArrays(initial),initial}async getData(){const[label,recognized]=(()=>{const locPath=`PF2E.RuleElement.${this.rule.key}`,localized=game.i18n.localize(locPath);return localized===locPath?[game.i18n.localize("PF2E.RuleElement.Unrecognized"),!1]:[localized,!0]})(),mergedRule=mergeObject(this.getInitialValue(),this.rule);return{...pick$1(this,["index","rule","object"]),item:this.item,label,fieldIdPrefix:this.fieldIdPrefix,recognized,basePath:this.basePath,rule:mergedRule,fields:this.schema?.fields,form:await __privateMethod(this,_getFormHelpers,getFormHelpers_fn).call(this,mergedRule)}}async render(){const data=await this.getData();return renderTemplate("systems/pf2e/templates/items/rules/partials/outer.hbs",{...data,template:await renderTemplate(this.template,data)})}async updateItem(updates){const rules=this.item.toObject().system.rules,result=mergeObject(this.rule,updates,{performDeletions:!0});this.schema&&cleanDataUsingSchema(this.schema.fields,result),rules[this.index]=result,await this.item.update({"system.rules":rules})}activateListeners(html){this.element=html;const selectorElement=htmlQuery(html,".selector-list");tagify$1(selectorElement);const priorityInput=htmlQuery(html,".rule-element-header .priority input");priorityInput?.addEventListener("change",event=>{event.stopPropagation();const value=priorityInput.value;value===""||Number.isNaN(Number(value))?this.updateItem({"-=priority":null}):this.updateItem({priority:Number(value)})});for(const button of htmlQueryAll(html,"[data-action=toggle-brackets]"))button.addEventListener("click",()=>{const property=button.dataset.property??"value",value=getProperty(this.rule,property);isBracketedValue(value)?this.updateItem({[property]:""}):this.updateItem({[property]:{brackets:[{value:""}]}})});for(const button of htmlQueryAll(html,"[data-action=add-bracket]")){const property=button.dataset.property??"value";button.addEventListener("click",()=>{const value=getProperty(this.rule,property);isBracketedValue(value)&&(value.brackets.push({value:""}),this.updateItem({[property]:value}))})}for(const button of htmlQueryAll(html,"[data-action=delete-bracket]")){const property=button.dataset.property??"value";button.addEventListener("click",()=>{const value=getProperty(this.rule,property),idx=Number(htmlClosest(button,"[data-idx]")?.dataset.idx);isBracketedValue(value)&&(value.brackets.splice(idx,1),this.updateItem({[property]:value}))})}if(this.tabs){for(const anchor of htmlQueryAll(html,"a[data-rule-tab]"))anchor.addEventListener("click",()=>{this.activateTab(html,anchor.dataset.ruleTab)});this.activateTab(html,__privateGet(this,_activeTab))}for(const dropZone of htmlQueryAll(html,"div.rules-drop-zone"))dropZone.addEventListener("drop",event=>{this.onDrop(event,dropZone)})}async onDrop(event,_element){const data=event.dataTransfer?.getData("text/plain");return data?await ItemPF2e.fromDropData(JSON.parse(data))??null:null}activateTab(html,tabName){if(!this.tabs)return;const activeTab=tabName??this.tabs.names.at(0);if(!(!activeTab||!this.tabs.names.includes(activeTab))){__privateSet(this,_activeTab,activeTab);for(const element of htmlQueryAll(html,"[data-rule-tab]"))element.dataset.ruleTab===activeTab?(element.classList.add("active"),element.tagName!=="A"&&(element.style.display=this.tabs.displayStyle)):(element.classList.remove("active"),element.tagName!=="A"&&(element.style.display="none"))}}updateObject(source){if(typeof source=="string"){try{this.rule=JSON.parse(source)}catch(error){if(error instanceof Error)throw ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.RuleElementSyntax",{message:error.message})),console.warn("Syntax error in rule element definition.",error.message,source),error}return}source=mergeObject(duplicate(this.rule),source);for(const slider of htmlQueryAll(this.element,"input[type=range"))slider.style.pointerEvents="none";cleanPredicate(source),this.schema&&cleanDataUsingSchema(this.schema.fields,source),this.rule=source}};_activeTab=new WeakMap,_getFormHelpers=new WeakSet,getFormHelpers_fn=__name2(async function(rule){const valueTemplate=await getTemplate("systems/pf2e/templates/items/rules/partials/resolvable-value.hbs"),bracketsTemplate=await getTemplate("systems/pf2e/templates/items/rules/partials/resolvable-brackets.hbs"),dropZoneTemplate=await getTemplate("systems/pf2e/templates/items/rules/partials/drop-zone.hbs"),getResolvableData=__name2(property=>{const value=getProperty(rule,property),mode=isBracketedValue(value)?"brackets":isObject(value)?"object":"primitive";return{value,mode,property,path:`${this.basePath}.${property}`}},"getResolvableData");return{resolvableValue:(property,options={})=>valueTemplate({...getResolvableData(property),inputId:`${this.fieldIdPrefix}${property}`,fileInput:options.hash?.fileInput??!1}),resolvableAddBracket:property=>getResolvableData(property).mode!=="brackets"?"":createHTMLElement("a",{children:[fontAwesomeIcon("plus",{fixedWidth:!0})],dataset:{action:"add-bracket",property}}).outerHTML,resolvableBrackets:property=>bracketsTemplate(getResolvableData(property)),dropZone:(dropId,dropText,dropTooltip)=>dropZoneTemplate({dropId,dropText,dropTooltip})}},"#getFormHelpers"),__name2(_RuleElementForm,"RuleElementForm");let RuleElementForm=_RuleElementForm;function cleanDataUsingSchema(schema,data){const{fields:fields2}=foundry.data,deleteIfInitial=__name2((key,field)=>{if(data[key]===void 0)return!0;const initialValue=typeof field.initial=="function"?field.initial():field.initial,valueRaw=data[key],value=isObject$1(valueRaw)&&isObject$1(initialValue)?{...initialValue,...valueRaw}:valueRaw;return equals(initialValue,value)&&delete data[key],!(key in data)},"deleteIfInitial");for(const[key,field]of Object.entries(schema))if(!deleteIfInitial(key,field)){if(field instanceof ResolvableValueField){data[key]=field.clean(data[key]),deleteIfInitial(key,field);continue}if("fields"in field){const value=data[key];if(isObject$1(value)){cleanDataUsingSchema(field.fields,value),deleteIfInitial(key,field);continue}}if(field instanceof fields2.ArrayField&&field.element instanceof fields2.SchemaField){const value=data[key];if(Array.isArray(value)){for(const data2 of value)isObject$1(data2)&&(data2.predicate&&cleanPredicate(data2),cleanDataUsingSchema(field.element.fields,data2));continue}}field instanceof fields2.StringField&&(data[key]=field.clean(data[key],{}),deleteIfInitial(key,field))}}__name(cleanDataUsingSchema,"cleanDataUsingSchema"),__name2(cleanDataUsingSchema,"cleanDataUsingSchema");function cleanPredicate(source){const predicateValue=source.predicate;if(typeof predicateValue=="string")if(predicateValue.trim()==="")delete source.predicate;else try{source.predicate=JSON.parse(predicateValue)}catch(error){if(error instanceof Error)throw ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.RuleElementSyntax",{message:error.message})),error}}__name(cleanPredicate,"cleanPredicate"),__name2(cleanPredicate,"cleanPredicate");const _AuraForm=class extends RuleElementForm{static{__name(this,"_AuraForm")}constructor(){super(...arguments),__privateAdd(this,_addEffect),__privateAdd(this,_updateEffectsMap),__privateAdd(this,_deleteEffect),__publicField(this,"template","systems/pf2e/templates/items/rules/aura.hbs"),__publicField(this,"tabs",{names:["basic","effects","appearance"],displayStyle:"grid"}),__privateAdd(this,_effectsMap,new Map)}get effectsArray(){return[...__privateGet(this,_effectsMap).values()]}getInitialValue(){return __privateGet(this,_effectsMap).clear(),__privateSet(this,_effectsMap,new Map(this.object.effects.map((e,index)=>[index,deepClone(e)]))),super.getInitialValue()}activateListeners(html){super.activateListeners(html);const traitsElement=htmlQuery(html,".tagify-traits");if(traitsElement){const whitelist={...CONFIG.PF2E.spellTraits,...CONFIG.PF2E.actionTraits};tagify$1(traitsElement,{whitelist,enforceWhitelist:!1})}for(const eventsElement of htmlQueryAll(html,".tagify-events")){const whitelist=[["enter",game.i18n.localize("PF2E.RuleEditor.Aura.Effects.EventsOptions.Enter")],["turn-start",game.i18n.localize("PF2E.RuleEditor.Aura.Effects.EventsOptions.TurnStart")],["turn-end",game.i18n.localize("PF2E.RuleEditor.Aura.Effects.EventsOptions.TurnEnd")]].sort((a,b)=>a[1].localeCompare(b[1],game.i18n.lang));tagify$1(eventsElement,{whitelist:mapToObj(whitelist,w=>[w[0],w[1]]),enforceWhitelist:!0})}for(const element of htmlQueryAll(html,"a[data-action=remove-effect]"))element.addEventListener("click",()=>{__privateMethod(this,_deleteEffect,deleteEffect_fn).call(this,element.dataset.effectId)});for(const button of htmlQueryAll(html,"div[data-rule-tab=effects] button[data-action=toggle-brackets]")){const fieldset=htmlClosest(button,"fieldset"),select=htmlQuery(fieldset,"select"),input=htmlQuery(fieldset,"input");select&&input&&!select.value&&(button.disabled=!0,input.disabled=!0)}for(const key of["border","highlight"]){const inputName=`system.rules.${this.index}.appearance.${key}.color`,textInput=htmlQuery(html,`input[type=text][name="${inputName}"]`),colorInput=htmlQuery(html,`input[type=color][data-edit="${inputName}"]`),checkbox=htmlQuery(html,`input[type=checkbox][name="${inputName}"]`);textInput&&colorInput&&checkbox&&(this.object.appearance[key]?.color==="user-color"?(textInput.removeAttribute("name"),textInput.disabled=!0,colorInput.disabled=!0):checkbox.removeAttribute("name"),checkbox.addEventListener("change",()=>{checkbox.checked?(checkbox.name=textInput.name,textInput.removeAttribute("name"),textInput.disabled=!0,colorInput.disabled=!0,textInput.value=colorInput.value=userColorForActor(this.object.actor)):(textInput.name=checkbox.name,checkbox.removeAttribute("name"),textInput.disabled=!1,colorInput.disabled=!1,textInput.value=colorInput.value="#000000")}))}const translationX=htmlQuery(html,"input[data-translation=x]"),translationY=htmlQuery(html,"input[data-translation=y]");translationX&&translationY&&(translationX.addEventListener("change",()=>{translationX.value!==""&&translationY.value===""&&(translationY.value=translationX.value)}),translationY.addEventListener("change",()=>{translationY.value!==""&&translationX.value===""&&(translationX.value=translationY.value)}))}async getData(){const{border,highlight}=this.object.appearance,userColor=userColorForActor(this.object.actor);return{...await super.getData(),affectsOptions:{all:"PF2E.RuleEditor.Aura.Effects.AffectsOptions.All",allies:"PF2E.RuleEditor.Aura.Effects.AffectsOptions.Allies",enemies:"PF2E.RuleEditor.Aura.Effects.AffectsOptions.Enemies"},effects:this.effectsArray.map(e=>({...e,item:fromUuidSync(e.uuid)})),borderColor:border?.color==="user-color"?userColor:border?.color??null,highlightColor:highlight.color==="user-color"?userColor:highlight?.color,saveTypes:CONFIG.PF2E.saves,isImageFile:isImageFilePath(this.rule.appearance?.texture?.src)}}async onDrop(event,element){const{id}=element.dataset;if(id!=="aura-effect-drop")return null;const item=await super.onDrop(event,element);return!item?.isOfType("effect")||!this.schema?null:(__privateMethod(this,_addEffect,addEffect_fn).call(this,item.uuid),item)}async updateItem(updates){const expanded=expandObject(updates);return expanded.effects&&(expanded.effects=__privateMethod(this,_updateEffectsMap,updateEffectsMap_fn).call(this,expanded)),super.updateItem(expanded)}updateObject(source){source.effects=__privateMethod(this,_updateEffectsMap,updateEffectsMap_fn).call(this,source);for(const key of["level","radius"]){if(key in source&&!source[key]){delete source[key];continue}const stringValue=source[key],maybeIntegerValue=typeof stringValue=="string"&&/^\d+$/.test(stringValue)?Number(stringValue):NaN;Number.isInteger(maybeIntegerValue)&&(source[key]=maybeIntegerValue)}const appearance=source.appearance;appearance?.border?.alpha===0&&(appearance.border=null),appearance?.border?.color===null&&(appearance.border.color="#000000"),appearance?.highlight?.color===null&&(appearance.highlight.color="#000000");const texture=appearance?.texture;if(texture){if(texture.translation){const{x,y}=texture.translation;!x&&!y&&(texture.translation=null)}texture.src?isImageFilePath(texture.src)&&(texture.loop=!0,texture.playbackRate=1):appearance.texture=null}super.updateObject(source)}};_effectsMap=new WeakMap,_addEffect=new WeakSet,addEffect_fn=__name2(function(uuid){const index=__privateGet(this,_effectsMap).size+1;__privateGet(this,_effectsMap).set(index,{uuid}),this.updateItem({effects:this.effectsArray})},"#addEffect"),_updateEffectsMap=new WeakSet,updateEffectsMap_fn=__name2(function(source){return __privateSet(this,_effectsMap,new Map(Object.values(source.effects??{}).map((data,index)=>{const updatedData=deepClone(data),deletions={};if(updatedData.save&&(updatedData.save.type??data.save?.type?updatedData.save.dc||=null:deletions["-=save"]=null),updatedData.affects!=="enemies"&&updatedData.includesSelf&&(deletions["-=includesSelf"]=null),updatedData.removeOnExit&&(deletions["-=removeOnExit"]=null),updatedData.predicate)try{const parsed=JSON.parse(String(updatedData.predicate));updatedData.predicate=Array.isArray(parsed)?parsed:[]}catch{deletions["-=predicate"]=null}else deletions["-=predicate"]=null;return[index,mergeObject(updatedData,deletions,{performDeletions:!0})]}))),this.effectsArray},"#updateEffectsMap"),_deleteEffect=new WeakSet,deleteEffect_fn=__name2(function(id){const index=Number(id);Number.isNaN(index)||__privateGet(this,_effectsMap).delete(index)&&this.updateItem({effects:this.effectsArray})},"#deleteEffect"),__name2(_AuraForm,"AuraForm");let AuraForm=_AuraForm;const _FastHealingForm=class extends RuleElementForm{static{__name(this,"_FastHealingForm")}template="systems/pf2e/templates/items/rules/fast-healing.hbs";activateListeners(html){super.activateListeners(html);const selectorElement=htmlQuery(html,".deactivated-by");if(selectorElement){const whitelist=CONFIG.PF2E.weaknessTypes;tagify$1(selectorElement,{whitelist,enforceWhitelist:!1})}}async getData(){return{...await super.getData(),types:{"fast-healing":"PF2E.Encounter.Broadcast.FastHealing.fast-healing.Name",regeneration:"PF2E.Encounter.Broadcast.FastHealing.regeneration.Name"}}}updateObject(source){delete source[source.type==="regeneration"?"details":"deactivatedBy"],super.updateObject(source)}};__name2(_FastHealingForm,"FastHealingForm");let FastHealingForm=_FastHealingForm;const _FlatModifierForm=class extends RuleElementForm{static{__name(this,"_FlatModifierForm")}template="systems/pf2e/templates/items/rules/flat-modifier.hbs";get isDamage(){return[this.rule.selector??[]].flat().some(s=>s==="damage"||String(s).endsWith("-damage"))}activateListeners(html){super.activateListeners(html),htmlQuery(html,"[data-action=toggle-selector]")?.addEventListener("click",()=>{const selector=this.rule.selector,newValue=Array.isArray(selector)?selector.at(0)??"":[selector??""].filter(s=>!!s);this.updateItem({selector:newValue})})}async getData(){const data=await super.getData(),types=(()=>{const abpEnabled=AutomaticBonusProgression.isEnabled(null),entries=Array.from(MODIFIER_TYPES).filter(t=>abpEnabled||t!=="potency").map(t=>[t,game.i18n.localize(`PF2E.ModifierType.${t}`)]).sort((a,b)=>a[0]==="untyped"?-1:b[0]==="untyped"?1:a[1].localeCompare(b[1]));return fromPairs(entries)})();return{...data,selectorIsArray:Array.isArray(this.rule.selector),abilities:CONFIG.PF2E.abilities,types,damageCategories:pick$1(CONFIG.PF2E.damageCategories,Array.from(DAMAGE_CATEGORIES_UNIQUE)),isDamage:this.isDamage}}updateObject(formData){delete formData[formData.type==="ability"?"value":"ability"],formData.critical=tupleHasValue([!1,"false"],formData.critical)?!1:!!formData.critical||null,this.isDamage||(delete formData.damageCategory,delete formData.damageType,delete formData.critical),super.updateObject(formData)}};__name2(_FlatModifierForm,"FlatModifierForm");let FlatModifierForm=_FlatModifierForm;const _GrantItemForm=class extends RuleElementForm{static{__name(this,"_GrantItemForm")}template="systems/pf2e/templates/items/rules/grant-item.hbs";async getData(){const data=await super.getData(),uuid=this.rule.uuid?String(this.rule.uuid):null,granted=uuid?await fromUuid(uuid):null;return{...data,granted}}updateObject(ruleData){super.updateObject(ruleData),typeof ruleData.uuid=="string"&&(ruleData.uuid=ruleData.uuid.trim())}};__name2(_GrantItemForm,"GrantItemForm");let GrantItemForm=_GrantItemForm;const _MultipleAttackPenaltyForm=class extends RuleElementForm{static{__name(this,"_MultipleAttackPenaltyForm")}template="systems/pf2e/templates/items/rules/multiple-attack-penalty.hbs"};__name2(_MultipleAttackPenaltyForm,"MultipleAttackPenaltyForm");let MultipleAttackPenaltyForm=_MultipleAttackPenaltyForm;const _RollNoteForm=class extends RuleElementForm{static{__name(this,"_RollNoteForm")}html=null;template="systems/pf2e/templates/items/rules/note.hbs";async getData(){return{...await super.getData(),selectorIsArray:Array.isArray(this.rule.selector)}}activateListeners(html){super.activateListeners(html),this.html=html,htmlQuery(html,"[data-action=toggle-selector]")?.addEventListener("click",()=>{const selector=this.rule.selector,newValue=Array.isArray(selector)?selector.at(0)??"":[selector??""].filter(s=>!!s);this.updateItem({selector:newValue})});const optionsEl=htmlQuery(html,".outcomes");tagify$1(optionsEl,{whitelist:[...DEGREE_OF_SUCCESS_STRINGS],maxTags:3})}updateObject(ruleData){super.updateObject(ruleData);const{html}=this;if(html){const shouldBeHidden=htmlQuery(html,".hidden-value")?.checked,isHidden=["gm","owner"].includes(String(ruleData.visibility));shouldBeHidden!==isHidden&&(shouldBeHidden?ruleData.visibility="owner":delete ruleData.visibility)}Array.isArray(ruleData.outcome)&&ruleData.outcome.length===0&&delete ruleData.outcome,typeof ruleData.title=="string"&&(ruleData.title=ruleData.title.trim())}};__name2(_RollNoteForm,"RollNoteForm");let RollNoteForm=_RollNoteForm;const _TokenImageForm=class extends RuleElementForm{static{__name(this,"_TokenImageForm")}template="systems/pf2e/templates/items/rules/token-image.hbs";async getData(){return{...await super.getData(),scaleEnabled:this.object.scale!==null}}activateListeners(html){super.activateListeners(html);const tintInput=htmlQuery(html,`input[name="system.rules.${this.index}.tint"]`),scaleCheckbox=htmlQuery(html,"input[data-action=toggle-scale]"),scaleInput=htmlQuery(html,`input[name="system.rules.${this.index}.scale"]`);tintInput&&scaleCheckbox&&scaleInput&&(tintInput.id=`${this.fieldIdPrefix}-tint`,scaleInput.id=`${this.fieldIdPrefix}-scale`,scaleInput.disabled=this.object.scale===null,scaleCheckbox.addEventListener("change",event=>{event.stopPropagation();const newValue=this.object.scale===null?1:null;this.updateItem({scale:newValue})}))}};__name2(_TokenImageForm,"TokenImageForm");let TokenImageForm=_TokenImageForm;const _TokenLightForm=class extends RuleElementForm{static{__name(this,"_TokenLightForm")}template="systems/pf2e/templates/items/rules/token-light.hbs";tabs={names:["basic","animation","advanced"],displayStyle:"grid"};async getData(){const data=await super.getData();return{...data,colorationTechniques:AdaptiveLightingShader.SHADER_TECHNIQUES,light:data.rule.value,lightAnimations:mapValues$1(CONFIG.Canvas.lightAnimations,value=>value.label)}}};__name2(_TokenLightForm,"TokenLightForm");let TokenLightForm=_TokenLightForm;const RULE_ELEMENT_FORMS={Aura:AuraForm,FastHealing:FastHealingForm,FlatModifier:FlatModifierForm,GrantItem:GrantItemForm,MultipleAttackPenalty:MultipleAttackPenaltyForm,Note:RollNoteForm,TokenImage:TokenImageForm,TokenLight:TokenLightForm},_ItemSheetPF2e=class extends ItemSheet{static{__name(this,"_ItemSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_createRuleElementForms),__privateAdd(this,_selectedRuleElementType,Object.keys(RuleElements.all).at(0)??null),__privateAdd(this,_editingRuleElementIndex,null),__privateAdd(this,_rulesLastScrollTop,null),__privateAdd(this,_ruleElementForms,[])}static get defaultOptions(){const options=super.defaultOptions;return options.width=695,options.height=460,options.classes=options.classes.concat(["pf2e","item"]),options.template="systems/pf2e/templates/items/sheet.hbs",options.scrollY=[".tab.active",".inventory-details","div[data-rule-tab]"],options.tabs=[{navSelector:".tabs",contentSelector:".sheet-body",initial:"description"},{navSelector:".mystify-nav",contentSelector:".mystify-sheet",initial:"unidentified"}],options}get editingRuleElement(){return __privateGet(this,_editingRuleElementIndex)===null?null:this.item.toObject().system.rules[__privateGet(this,_editingRuleElementIndex)]??null}get validTraits(){return objectHasKey(CONFIG.PF2E.Item.traits,this.item.type)?CONFIG.PF2E.Item.traits[this.item.type]:null}async getData(options={}){options.id=this.id,options.classes?.push(this.item.type),options.editable=this.isEditable,options.sheetConfig&&=Object.values(CONFIG.Item.sheetClasses[this.item.type]).filter(c=>c.canConfigure).length>1;const{item}=this;__privateMethod(this,_createRuleElementForms,createRuleElementForms_fn).call(this);const enrichedContent={},rollData={...this.item.getRollData(),...this.actor?.getRollData()};enrichedContent.description=await TextEditor.enrichHTML(item._source.system.description.value,{rollData,async:!0}),enrichedContent.gmNotes=await TextEditor.enrichHTML(item.system.description.gm.trim(),{rollData,async:!0});const validTraits=this.validTraits,hasRarity=!item.isOfType("action","condition","deity","effect","lore","melee"),itemTraits=item.system.traits?.value??[],sourceTraits=item._source.system.traits?.value??[],traits=validTraits?createSheetTags(validTraits,itemTraits):null,traitTagifyData=validTraits?createTagifyTraits(itemTraits,{sourceTraits,record:validTraits}):null;return{itemType:null,showTraits:this.validTraits!==null,hasSidebar:this.item.isOfType("condition","lore"),sidebarTitle:game.i18n.format("PF2E.Item.SidebarSummary",{type:game.i18n.localize(`TYPES.Item.${this.item.type}`)}),sidebarTemplate:`systems/pf2e/templates/items/${sluggify(item.type)}-sidebar.hbs`,detailsTemplate:`systems/pf2e/templates/items/${sluggify(item.type)}-details.hbs`,cssClass:this.isEditable?"editable":"locked",editable:this.isEditable,document:item,item,isPhysical:!1,data:item.system,fieldIdPrefix:`field-${this.appId}-`,enrichedContent,limited:this.item.limited,options:this.options,owner:this.item.isOwner,title:this.title,user:{isGM:game.user.isGM},rarity:hasRarity?this.item.system.traits?.rarity??"common":null,rarities:CONFIG.PF2E.rarityTraits,traits,traitTagifyData,enabledRulesUI:game.user.isGM||game.settings.get("pf2e","enabledRulesUI"),ruleEditing:!!this.editingRuleElement,rules:{selection:{selected:__privateGet(this,_selectedRuleElementType),types:sortStringRecord(Object.keys(RuleElements.all).reduce((result,key)=>mergeObject(result,{[key]:`PF2E.RuleElement.${key}`}),{}))},elements:await Promise.all(__privateGet(this,_ruleElementForms).map(async form=>({template:await form.render()})))},proficiencies:CONFIG.PF2E.proficiencyLevels}}onTagSelector(anchor){if((anchor.dataset.tagSelector??"")!=="basic")throw ErrorPF2e("Item sheets can only use the basic tag selector");const propertyIsFlat=anchor.dataset.flat==="true",objectProperty=anchor.dataset.property??"",title=anchor.dataset.title,configTypes=(anchor.dataset.configTypes??"").split(",").map(type=>type.trim()).filter(tag=>tupleHasValue(SELECTABLE_TAG_FIELDS,tag)),selectorOptions={objectProperty,configTypes,title,flat:propertyIsFlat};anchor.dataset.noCustom==="true"?selectorOptions.allowCustom=!1:this.actor&&configTypes.includes("attackEffects")&&(selectorOptions.customChoices=this.getAttackEffectOptions()),new TagSelectorBasic(this.item,selectorOptions).render(!0)}getAttackEffectOptions(){return(this.actor?.items.contents??[]).filter(i=>i.isOfType("action","consumable")).reduce((options,item)=>{const key=item.slug??sluggify(item.name);return{...options,[key]:item.name}},deepClone(CONFIG.PF2E.attackEffects))}async activateEditor(name2,options={},initialContent){const sourceContent=name2==="system.description.value"?this.item._source.system.description.value:initialContent,mutuallyExclusive=["system.description.gm","system.description.value"];if(mutuallyExclusive.includes(name2)){const html=this.element[0];for(const elementName of mutuallyExclusive.filter(n=>n!==name2)){const element=htmlQuery(html,`[data-edit="${elementName}"]`),section=htmlClosest(element,".editor-container");section&&(section.style.display="none")}htmlQuery(html,".tab.description")?.classList.add("editing")}return super.activateEditor(name2,options,sourceContent)}async close(options){return __privateSet(this,_editingRuleElementIndex,null),super.close(options)}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const anchor of htmlQueryAll(html,"a.tag-selector"))anchor.addEventListener("click",()=>this.onTagSelector(anchor));const rulesPanel=htmlQuery(html,".tab[data-tab=rules]"),slugInput=htmlQuery(rulesPanel,'input[name="system.slug"]');slugInput&&(slugInput.addEventListener("change",()=>{slugInput.value=sluggify(slugInput.value)}),htmlQuery(rulesPanel,"a[data-action=regenerate-slug]")?.addEventListener("click",()=>{if(this._submitting)return;slugInput.value=sluggify(this.item.name);const event=new Event("change");slugInput.dispatchEvent(event)}));const ruleElementSelect=htmlQuery(rulesPanel,"select[data-action=select-rule-element]");ruleElementSelect?.addEventListener("change",()=>{__privateSet(this,_selectedRuleElementType,ruleElementSelect.value)});for(const anchor of htmlQueryAll(rulesPanel,"a.add-rule-element"))anchor.addEventListener("click",async event=>{await this._onSubmit(event);const rulesData=this.item.toObject().system.rules,key=__privateGet(this,_selectedRuleElementType)??"NewRuleElement";this.item.update({"system.rules":rulesData.concat({key})})});for(const anchor of htmlQueryAll(rulesPanel,"a.edit-rule-element"))anchor.addEventListener("click",async()=>{if(this._submitting)return;const index=Number(anchor.dataset.ruleIndex??"NaN")??null;__privateSet(this,_editingRuleElementIndex,index),__privateSet(this,_rulesLastScrollTop,rulesPanel?.scrollTop??null),this.render()});for(const anchor of htmlQueryAll(rulesPanel,".rules a.remove-rule-element"))anchor.addEventListener("click",async event=>{await this._onSubmit(event);const rules2=this.item.toObject().system.rules,index=Number(anchor.dataset.ruleIndex??"NaN");rules2&&Number.isInteger(index)&&rules2.length>index&&(rules2.splice(index,1),this.item.update({"system.rules":rules2}))});for(const anchor of htmlQueryAll(rulesPanel,"a[data-clipboard]"))anchor.addEventListener("click",()=>{const clipText=anchor.dataset.clipboard;clipText&&(game.clipboard.copyPlainText(clipText),ui.notifications.info(game.i18n.format("PF2E.ClipboardNotification",{clipText})))});const editingRuleElement=this.editingRuleElement;if(editingRuleElement){const ruleText=JSON.stringify(editingRuleElement,null,2),schema=RuleElements.all[String(editingRuleElement.key)]?.schema.fields,view=new CodeMirror.EditorView({doc:ruleText,extensions:[CodeMirror.basicSetup,CodeMirror.keybindings,...CodeMirror.ruleElementExtensions({schema})]});html.querySelector(".rule-editing .editor-placeholder")?.replaceWith(view.dom);const closeBtn=html.querySelector(".rule-editing button[data-action=close]");closeBtn?.addEventListener("click",()=>{__privateSet(this,_editingRuleElementIndex,null),this.render()}),closeBtn?.removeAttribute("disabled"),html.querySelector(".rule-editing button[data-action=apply]")?.addEventListener("click",()=>{const value=view.state.doc.toString();if(__privateGet(this,_editingRuleElementIndex)===null){__privateSet(this,_editingRuleElementIndex,null),this.render();return}try{const rules2=this.item.toObject().system.rules;rules2[__privateGet(this,_editingRuleElementIndex)]=JSON.parse(value),__privateSet(this,_editingRuleElementIndex,null),this.item.update({"system.rules":rules2})}catch(error){if(error instanceof Error)throw ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.RuleElementSyntax",{message:error.message})),console.warn("Syntax error in rule element definition.",error.message,value),error}})}const ruleSections=html.querySelectorAll(".rules .rule-form");for(const ruleSection of Array.from(ruleSections)){const idx=ruleSection.dataset.idx?Number(ruleSection.dataset.idx):NaN;__privateGet(this,_ruleElementForms).at(idx)?.activateListeners(ruleSection)}InlineRollLinks.listen(html,this.item);const{validTraits}=this,tagElement=html.querySelector(".sheet-header .tags"),traitsPrepend=html.querySelector(".traits-extra");if(validTraits!==null&&tagElement instanceof HTMLInputElement){const tags=tagify$1(tagElement,{whitelist:validTraits});traitsPrepend&&tags.DOM.scope.prepend(traitsPrepend.content)}else tagElement&&traitsPrepend&&tagElement.append(traitsPrepend.content);tagify$1(htmlQuery(html,'input[type=text][name="system.traits.otherTags"]'),{maxTags:6});const modifiedPropertyFields=htmlQueryAll(html,"[data-property]");for(const input of modifiedPropertyFields){const propertyPath=input.dataset.property??"",baseValue=input.dataset.valueBase??String(getProperty(this.item._source,propertyPath)??"").trim();input.addEventListener("focus",()=>{input.dataset.value=input.value,input.value=baseValue,input.name=propertyPath}),input.addEventListener("blur",()=>{input.removeAttribute("name"),input.value===baseValue&&(input.value=input.dataset.value??"")})}htmlQuery(html,".add-skill-variant")?.addEventListener("click",()=>{if(!this.item.isOfType("lore"))return;const variants=this.item.system.variants??{},index=Object.keys(variants).length;this.item.update({[`system.variants.${index}`]:{label:"+X in terrain",options:""}})});for(const button of htmlQueryAll(html,".skill-variants .remove-skill-variant"))button.addEventListener("click",event=>{if(!(event.currentTarget instanceof HTMLElement))return;const index=event.currentTarget.dataset.skillVariantIndex;this.item.update({[`system.variants.-=${index}`]:null})});if(this.isEditable&&game.user.isGM&&!this.item.system.description.gm&&!(this.item.isOfType("spell")&&this.item.isVariant)){const descriptionEditors=htmlQuery(html,".tab[data-tab=description]"),mainEditor=htmlQuery(descriptionEditors,".main .editor");if(!mainEditor)throw ErrorPF2e("Unexpected error retrieving description editor");const addGMNotesLink=document.createElement("a");addGMNotesLink.className=addGMNotesLink.dataset.action="add-gm-notes",addGMNotesLink.innerHTML=fontAwesomeIcon("fa-note-medical",{style:"regular"}).outerHTML,addGMNotesLink.dataset.tooltip="PF2E.Item.GMNotes.Add",mainEditor.prepend(addGMNotesLink),addGMNotesLink.addEventListener("click",()=>{htmlQuery(descriptionEditors,".gm-notes")?.classList.add("has-content"),this.activateEditor("system.description.gm")})}const rules=htmlQuery(html,".rule-element-forms");rules&&Sortable.create(rules,{...SORTABLE_DEFAULTS,handle:".drag-handle",onEnd:event=>{const currentIndex=event.oldDraggableIndex,newIndex=event.newDraggableIndex;if(currentIndex===void 0||newIndex===void 0){this.render();return}const rules2=this.item.toObject().system.rules,movingRule=rules2.at(currentIndex);movingRule&&newIndex<=rules2.length?(rules2.splice(currentIndex,1),rules2.splice(newIndex,0,movingRule),this.item.update({"system.rules":rules2})):this.render()}})}_getSubmitData(updateData=null){const fd=new FormDataExtended(this.form,{editors:this.editors}),data=updateData?mergeObject(fd.object,updateData):expandObject(fd.object),flattenedData=flattenObject(data);return processTagifyInSubmitData(this.form,flattenedData),flattenedData}_getHeaderButtons(){const buttons=super._getHeaderButtons();return game.settings.get("pf2e","dataTools")&&this.isEditable&&this.item.sourceId?.startsWith("Compendium.")&&buttons.unshift({label:"Refresh",class:"refresh-from-compendium",icon:"fa-solid fa-sync-alt",onclick:()=>this.item.refreshFromCompendium()}),buttons}_canDragDrop(_selector){return this.item.isOwner}async _onSubmit(event,{updateData=null,preventClose=!1,preventRender=!1}={}){return $(this.form).find("tags ~ input").each((_i,input)=>{input.value===""&&(input.value="[]")}),super._onSubmit(event,{updateData,preventClose,preventRender})}async _updateObject(event,formData){const expanded=expandObject(formData),form=htmlClosest(event.target,".rule-form[data-idx]");if(form){const idx=Number(form.dataset.idx),ruleForm=__privateGet(this,_ruleElementForms)[idx],itemRules=this.item.toObject().system.rules;if(idx>=itemRules.length||!ruleForm)throw ErrorPF2e(`Invalid rule form update, no rule form available at index ${idx}`);const incomingData=expanded.system?.rules?.[idx];incomingData&&(ruleForm.updateObject(incomingData),itemRules[idx]=ruleForm.rule,this.item.update({"system.rules":itemRules}))}return delete expanded.system?.rules,super._updateObject(event,flattenObject(expanded))}async _render(force,options){if(await maintainFocusInRender(this,()=>super._render(force,options)),__privateGet(this,_editingRuleElementIndex)===null&&__privateGet(this,_rulesLastScrollTop)){const html=this.element[0],rulesTab=htmlQuery(html,".tab[data-tab=rules]");rulesTab&&(rulesTab.scrollTop=__privateGet(this,_rulesLastScrollTop)),__privateSet(this,_rulesLastScrollTop,null)}}};_selectedRuleElementType=new WeakMap,_editingRuleElementIndex=new WeakMap,_rulesLastScrollTop=new WeakMap,_ruleElementForms=new WeakMap,_createRuleElementForms=new WeakSet,createRuleElementForms_fn=__name2(function(){const rules=this.item.toObject().system.rules,previousForms=[...__privateGet(this,_ruleElementForms)],processedRules=rules.map((rule,index)=>{const options={sheet:this,index,rule,object:this.item.rules.find(r=>r.sourceIndex===index)??null},FormClass=RULE_ELEMENT_FORMS[String(rule.key)]??RuleElementForm,existing=previousForms.find(f=>equals(f.rule,rule)&&f.constructor.name===FormClass.name)??null;return existing&&previousForms.splice(previousForms.indexOf(existing),1),{options,FormClass,existing}});for(const rule of processedRules.filter(p=>!p.existing)){const existing=__privateGet(this,_ruleElementForms)[rule.options.index];existing instanceof rule.FormClass&&(rule.existing=existing)}__privateSet(this,_ruleElementForms,processedRules.map(processed=>processed.existing?(processed.existing.initialize(processed.options),processed.existing):new processed.FormClass(processed.options)))},"#createRuleElementForms"),__name2(_ItemSheetPF2e,"ItemSheetPF2e");let ItemSheetPF2e=_ItemSheetPF2e;const _SettingsMenuPF2e=class extends FormApplication{static{__name(this,"_SettingsMenuPF2e")}cache={};static get defaultOptions(){const options=super.defaultOptions;return options.classes.push("settings-menu","sheet"),mergeObject(options,{title:`PF2E.SETTINGS.${this.namespace.titleCase()}.Name`,id:`${this.namespace}-settings`,template:"systems/pf2e/templates/system/settings/menu.hbs",width:550,height:"auto",tabs:[{navSelector:".sheet-tabs",contentSelector:"form"}],closeOnSubmit:!1,submitOnChange:!0})}static get prefix(){return`${this.namespace}.`}get namespace(){return this.constructor.namespace}get prefix(){return this.constructor.prefix}static get settings(){return{}}static registerSettings(){const settings=this.settings;for(const setting of this.SETTINGS)game.settings.register("pf2e",`${this.prefix}${setting}`,{...settings[setting],scope:"world",config:!1})}async getData(){const settings=this.constructor.settings,templateData=settingsToSheetData(settings,this.cache,this.prefix);return mergeObject(await super.getData(),{settings:templateData,instructions:`PF2E.SETTINGS.${this.namespace.titleCase()}.Hint`})}activateListeners($html){super.activateListeners($html);const html=$html[0],{highlightSetting}=this.options;if(highlightSetting){const formGroup=htmlClosest(htmlQuery(html,`label[for="${highlightSetting}"]`),".form-group");formGroup&&(formGroup.style.animation="glow 0.75s infinite alternate")}}async _updateObject(event,data){for(const key of this.constructor.SETTINGS){const settingKey=`${this.prefix}${key}`,value=data[key];this.cache[key]=value,event.type==="submit"&&await game.settings.set("pf2e",settingKey,value)}event.type==="submit"?this.close():this.render()}_injectHTML($html){super._injectHTML($html);for(const key of this.constructor.SETTINGS){const settingKey=`${this.prefix}${key}`;this.cache[key]=game.settings.get("pf2e",settingKey)}}};__name2(_SettingsMenuPF2e,"SettingsMenuPF2e"),__publicField(_SettingsMenuPF2e,"namespace"),__publicField(_SettingsMenuPF2e,"SETTINGS");let SettingsMenuPF2e=_SettingsMenuPF2e;function settingsToSheetData(settings,cache,prefix=""){return Object.entries(settings).reduce((result,[key,setting])=>{const lookupKey=`${prefix}${key}`,value=key in cache?cache[key]:game.settings.get("pf2e",lookupKey);return cache[key]=value,result[key]={...setting,key,value,isSelect:!!setting.choices,isCheckbox:setting.type===Boolean},result},{})}__name(settingsToSheetData,"settingsToSheetData"),__name2(settingsToSheetData,"settingsToSheetData");function isHomebrewFlagCategory(value){return isObject$1(value)&&Object.entries(value).every(([_hbKey,hbLabel])=>typeof hbLabel=="string"||isObject(hbLabel)&&isLabelAndDescription(hbLabel))}__name(isHomebrewFlagCategory,"isHomebrewFlagCategory"),__name2(isHomebrewFlagCategory,"isHomebrewFlagCategory");function isHomebrewCustomDamage(value){return Object.values(value).every(value2=>isObject(value2)&&typeof value2.label=="string"&&["physical","energy"].includes(value2.category??""))}__name(isHomebrewCustomDamage,"isHomebrewCustomDamage"),__name2(isHomebrewCustomDamage,"isHomebrewCustomDamage");function isLabelAndDescription(obj){return typeof obj.label=="string"&&typeof obj.description=="string"}__name(isLabelAndDescription,"isLabelAndDescription"),__name2(isLabelAndDescription,"isLabelAndDescription");function prepareCleanup(listKey,deletions){var _a;const Migration=(_a=class extends MigrationBase{static{__name(this,"_a")}async updateActor(source){if(source.type==="character"||source.type==="npc")switch(listKey){case"creatureTraits":{const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t));break}case"languages":{const languages=source.system.traits.languages;languages.value=languages.value.filter(l=>!deletions.includes(l));break}case"weaponCategories":{if(source.type==="character"){const attacks=source.system.proficiencies?.attacks??{};for(const key of deletions)attacks[key]&&(delete attacks[key],attacks[`-=${key}`]=null)}break}case"weaponGroups":{if(source.type==="character"){const proficiencyKeys=deletions.map(deletion=>`weapon-group-${deletion}`),attacks=source.system.proficiencies?.attacks??{};for(const key of proficiencyKeys)delete attacks[key],attacks[`-=${key}`]=null}break}case"baseWeapons":{if(source.type==="character"){const proficiencyKeys=deletions.map(deletion=>`weapon-base-${deletion}`),attacks=source.system.proficiencies?.attacks??{};for(const key of proficiencyKeys)delete attacks[key],attacks[`-=${key}`]=null}break}case"weaponTraits":{const weaponsAndAttacks=source.items.filter(i=>["melee","weapon"].includes(i.type));for(const itemSource of weaponsAndAttacks){const traits=itemSource.system.traits.value;for(const deleted of deletions)traits.findSplice(t=>t===deleted)}}}}async updateItem(source){switch(listKey){case"creatureTraits":{if(source.system.traits?.value){const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t))}break}case"featTraits":{if(source.type==="feat"){const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t))}break}case"magicSchools":case"spellTraits":{if(source.type==="spell"){const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t))}break}case"weaponCategories":{if(source.type==="weapon"){const systemData=source.system;systemData.category=deletions.includes(systemData.category??"")?"simple":systemData.category}break}case"weaponGroups":{if(source.type==="weapon"){const systemData=source.system;systemData.group=deletions.includes(systemData.group??"")?null:systemData.group}break}case"baseWeapons":{if(source.type==="weapon"){const base=source.system.baseItem;source.system.baseItem=deletions.includes(base??"")?null:base}break}}}},__name2(_a,"Migration"),__publicField(_a,"version",MigrationRunnerBase.LATEST_SCHEMA_VERSION),_a);return new Migration}__name(prepareCleanup,"prepareCleanup"),__name2(prepareCleanup,"prepareCleanup");const tagify="",_HomebrewElements=class extends SettingsMenuPF2e{static{__name(this,"_HomebrewElements")}constructor(){super(...arguments),__privateAdd(this,_processDeletions),__privateAdd(this,_refreshSettings),__privateAdd(this,_registerModuleTags),__privateAdd(this,_getConfigRecord),__privateAdd(this,_updateConfigRecords),__privateAdd(this,_initialRefresh,!0),__privateAdd(this,_damageManager,new DamageTypeManager)}static get SETTINGS(){return Object.keys(this.settings)}static get defaultOptions(){return mergeObject(super.defaultOptions,{template:"systems/pf2e/templates/system/settings/homebrew.hbs"})}static get traitSettings(){return HOMEBREW_TRAIT_KEYS.reduce((result,key)=>(result[key]={name:CONFIG.PF2E.SETTINGS.homebrew[key].name,hint:CONFIG.PF2E.SETTINGS.homebrew[key].hint,default:[],type:Object},result),{})}static get settings(){return{...this.traitSettings,damageTypes:{name:"PF2E.SETTINGS.Homebrew.DamageTypes.Name",default:[],type:Object}}}activateListeners($form){super.activateListeners($form);const html=$form[0];$form.find("button[name=reset]").on("click",()=>{this.render()});for(const key of HOMEBREW_TRAIT_KEYS){const $input=$form.find(`input[name="${key}"]`);new Tagify($input[0],{editTags:1,hooks:{beforeRemoveTag:tags=>{const localize=localizer("PF2E.SETTINGS.Homebrew.ConfirmDelete"),response=(async()=>{const content=localize("Message",{element:tags[0].data.value});return await Dialog.confirm({title:localize("Title"),content:`

${content}

`})})();return(async()=>await response?Promise.resolve():Promise.reject())()}}})}htmlQuery(html,"[data-action=damage-add]")?.addEventListener("click",async()=>{this.cache.damageTypes.push({label:"Custom",category:"physical",icon:"fa-question"}),this.render()});for(const element of htmlQueryAll(html,"[data-action=damage-delete]"))element.addEventListener("click",async event=>{const idx=htmlClosest(event.target,"[data-idx]")?.dataset.idx;idx&&this.cache.damageTypes.splice(Number(idx),1),this.render()})}async getData(){const data=await super.getData(),traitSettings=settingsToSheetData(this.constructor.traitSettings,this.cache,this.prefix),damageCategories2=pick(CONFIG.PF2E.damageCategories,["physical","energy"]);return{...data,traitSettings,damageCategories:damageCategories2,customDamageTypes:(this.cache.damageTypes??[]).map(customType=>({...customType,slug:`hb_${sluggify(customType.label)}`}))}}async _onSubmit(event,{updateData=null,preventClose=!1,preventRender=!1}={}){return this.form.querySelectorAll("tags ~ input").forEach(input=>{input.value===""&&(input.value="[]")}),super._onSubmit(event,{updateData,preventClose,preventRender})}_getSubmitData(updateData){const original=super._getSubmitData(updateData),data=expandObject(original);if("damageTypes"in data&&data.damageTypes&&typeof data.damageTypes=="object"){data.damageTypes=Object.values(data.damageTypes);for(const type of data.damageTypes){const sanitized=sluggify(type.icon??"");type.icon=sanitized.startsWith("fa-")?sanitized:null}}return data}async _updateObject(event,data){for(const key of HOMEBREW_TRAIT_KEYS)for(const tag of data[key])tag.id??=`hb_${sluggify(tag.value)}`;if(event.type==="submit"){const cleanupTasks=HOMEBREW_TRAIT_KEYS.map(key=>__privateMethod(this,_processDeletions,processDeletions_fn).call(this,key,data[key])).filter(task=>!!task);new MigrationRunner().runMigrations(cleanupTasks),await super._updateObject(event,data),__privateMethod(this,_refreshSettings,refreshSettings_fn).call(this)}else return super._updateObject(event,data)}onInit(){__privateMethod(this,_refreshSettings,refreshSettings_fn).call(this),__privateMethod(this,_registerModuleTags,registerModuleTags_fn).call(this)}};_initialRefresh=new WeakMap,_damageManager=new WeakMap,_processDeletions=new WeakSet,processDeletions_fn=__name2(function(listKey,newTagList){const oldTagList=game.settings.get("pf2e",`homebrew.${listKey}`),newIDList=newTagList.map(tag=>tag.id),deletions=oldTagList.flatMap(oldTag=>newIDList.includes(oldTag.id)?[]:oldTag.id),coreElements=listKey==="baseWeapons"?CONFIG.PF2E.baseWeaponTypes:CONFIG.PF2E[listKey];for(const id of deletions)if(delete coreElements[id],objectHasKey(SECONDARY_TRAIT_RECORDS,listKey))for(const recordKey of SECONDARY_TRAIT_RECORDS[listKey]){const secondaryRecord=CONFIG.PF2E[recordKey];delete secondaryRecord[id]}return game.user.isGM&&deletions.length>0?prepareCleanup(listKey,deletions):null},"#processDeletions"),_refreshSettings=new WeakSet,refreshSettings_fn=__name2(function(){__privateGet(this,_initialRefresh)||__privateGet(this,_damageManager).deleteAllHomebrew();for(const listKey of HOMEBREW_TRAIT_KEYS){const settingsKey=`homebrew.${listKey}`,elements=game.settings.get("pf2e",settingsKey);__privateMethod(this,_updateConfigRecords,updateConfigRecords_fn).call(this,elements,listKey)}const customTypes=game.settings.get("pf2e","homebrew.damageTypes");for(const data of customTypes)__privateGet(this,_damageManager).addCustomDamage(data);const activeModules=[...game.modules.entries()].filter(([_key,foundryModule])=>foundryModule.active);for(const[key,foundryModule]of activeModules){const homebrew=foundryModule.flags?.[key]?.["pf2e-homebrew"];if(isObject(homebrew)&&"damageTypes"in homebrew){const elements=homebrew.damageTypes;if(!isObject(elements)||!isHomebrewCustomDamage(elements)){console.warn(`PF2E System | Homebrew record damageTypes is malformed in module ${key}`);continue}for(const[slug,value]of Object.entries(elements))__privateGet(this,_damageManager).addCustomDamage(value,{slug})}}if(__privateGet(this,_initialRefresh))__privateSet(this,_initialRefresh,!1);else{const sheets=Object.values(ui.windows).filter(app=>app instanceof ActorSheet||app instanceof ItemSheetPF2e);for(const sheet of sheets)sheet.render(!1)}},"#refreshSettings"),_registerModuleTags=new WeakSet,registerModuleTags_fn=__name2(function(){const activeModules=[...game.modules.entries()].filter(([_key,foundryModule])=>foundryModule.active);for(const[key,foundryModule]of activeModules){const homebrew=foundryModule.flags?.[key]?.["pf2e-homebrew"];if(isObject$1(homebrew)){for(const recordKey of Object.keys(homebrew))if(!["damageTypes"].includes(recordKey))if(tupleHasValue(HOMEBREW_TRAIT_KEYS,recordKey)){const elements=homebrew[recordKey];if(!isObject(elements)||!isHomebrewFlagCategory(elements)){console.warn(`PF2E System | Homebrew record ${recordKey} is malformed in module ${key}`);continue}const tags=Object.entries(elements).map(([id,value])=>({id:`hb_${id}`,value:typeof value=="string"?value:value.label}));__privateMethod(this,_updateConfigRecords,updateConfigRecords_fn).call(this,tags,recordKey);for(const[key2,value]of Object.entries(elements))if(typeof value=="object"){const hbKey=`hb_${key2}`;CONFIG.PF2E.traitsDescriptions[hbKey]=value.description}}else{console.warn(`PF2E System | Invalid homebrew record "${recordKey}" in module ${key}`);continue}}}},"#registerModuleTags"),_getConfigRecord=new WeakSet,getConfigRecord_fn=__name2(function(recordKey){return recordKey==="baseWeapons"?CONFIG.PF2E.baseWeaponTypes:CONFIG.PF2E[recordKey]},"#getConfigRecord"),_updateConfigRecords=new WeakSet,updateConfigRecords_fn=__name2(function(elements,listKey){const coreElements=__privateMethod(this,_getConfigRecord,getConfigRecord_fn).call(this,listKey);for(const element of elements)if(coreElements[element.id]=element.value,objectHasKey(SECONDARY_TRAIT_RECORDS,listKey))for(const recordKey of SECONDARY_TRAIT_RECORDS[listKey]){const record=CONFIG.PF2E[recordKey];record[element.id]=element.value}},"#updateConfigRecords"),__name2(_HomebrewElements,"HomebrewElements"),__publicField(_HomebrewElements,"namespace","homebrew");let HomebrewElements=_HomebrewElements;const _DamageTypeManager=class{static{__name(this,"_DamageTypeManager")}collections={physical:PHYSICAL_DAMAGE_TYPES,energy:ENERGY_DAMAGE_TYPES,DAMAGE_TYPES,BASE_DAMAGE_TYPES_TO_CATEGORIES,DAMAGE_TYPE_ICONS,damageTypesLocalization:CONFIG.PF2E.damageTypes,damageRollFlavorsLocalization:CONFIG.PF2E.damageRollFlavors,immunityTypes,weaknessTypes,resistanceTypes};addCustomDamage(data,options={}){const collections=this.collections,slug=`hb_${options.slug??sluggify(data.label)}`;collections.DAMAGE_TYPES.add(slug),collections[tupleHasValue(["physical","energy"],data.category)?data.category:"physical"].push(slug),collections.BASE_DAMAGE_TYPES_TO_CATEGORIES[slug]=data.category,collections.DAMAGE_TYPE_ICONS[slug]=data.icon?.substring(3)??null,collections.damageTypesLocalization[slug]=data.label;const damageFlavor=data.label.toLocaleLowerCase();collections.damageRollFlavorsLocalization[slug]=damageFlavor,collections.immunityTypes[slug]=damageFlavor,collections.weaknessTypes[slug]=damageFlavor,collections.resistanceTypes[slug]=damageFlavor}deleteAllHomebrew(){for(const collection of Object.values(this.collections))if(collection instanceof Set){const hbTraits=[...collection].filter(tag=>tag.startsWith("hb_"));for(const trait of hbTraits)collection.delete(trait)}else{const hbTraits=Object.keys(collection).filter(tag=>tag.startsWith("hb_"));for(const trait of hbTraits)delete collection[trait]}}};__name2(_DamageTypeManager,"DamageTypeManager");let DamageTypeManager=_DamageTypeManager;const _Migration674StableHomebrewTagIDs=class extends MigrationBase{static{__name(this,"_Migration674StableHomebrewTagIDs")}homebrewKeys=deepClone(HOMEBREW_TRAIT_KEYS);homebrewTags=this.homebrewKeys.reduce((settings,key)=>mergeObject(settings,{[key]:game.settings.get("pf2e",`homebrew.${key}`)}),{});updateDocumentTags(documentTags=[]){for(const key of this.homebrewKeys){const homebrewTags=this.homebrewTags[key];for(const tag of homebrewTags){const index=documentTags.indexOf(tag.id);index!==-1&&documentTags.splice(index,1,`hb_${sluggify(tag.value)}`)}}}async updateActor(source){source.type==="familiar"||!source.system.traits?.traits||(this.updateDocumentTags(source.system.traits.traits.value),(source.type==="character"||source.type==="npc")&&this.updateDocumentTags(source.system.traits?.languages.value))}async updateItem(itemSource){this.updateDocumentTags(itemSource.system.traits?.value)}async migrate(){for(const key of this.homebrewKeys){const tags=this.homebrewTags[key];for(const tag of tags){tag.id=`hb_${sluggify(tag.value)}`;const tagMap=key==="baseWeapons"?CONFIG.PF2E.baseWeaponTypes:CONFIG.PF2E[key];tagMap[tag.id]=tag.value,delete tagMap[key]}tags.length>0&&await game.settings.set("pf2e",`homebrew.${key}`,tags)}}};__name2(_Migration674StableHomebrewTagIDs,"Migration674StableHomebrewTagIDs"),__publicField(_Migration674StableHomebrewTagIDs,"version",.674);let Migration674StableHomebrewTagIDs=_Migration674StableHomebrewTagIDs;const _Migration675FlatModifierAEsToREs=class extends MigrationBase{static{__name(this,"_Migration675FlatModifierAEsToREs")}constructor(){super(...arguments),__privateAdd(this,_isFlatModifier),__privateAdd(this,_toRuleElement)}async updateActor(actorSource){for(const effect of[...actorSource.effects])effect.changes.some(change=>change.key.endsWith(".modifiers"))&&actorSource.effects.splice(actorSource.effects.indexOf(effect),1)}async updateItem(itemSource){for(const effect of[...itemSource.effects]){for(const change of effect.changes.filter(change2=>change2.key.endsWith(".modifiers"))){const reData=__privateMethod(this,_toRuleElement,toRuleElement_fn).call(this,change.value);reData&&(effect.changes.splice(effect.changes.indexOf(change),1),itemSource.system.rules.push(reData))}effect.changes.length===0&&itemSource.effects.splice(itemSource.effects.indexOf(effect),1)}}};_isFlatModifier=new WeakSet,isFlatModifier_fn=__name2(function(data){return typeof data=="object"&&data!==null&&__name2(obj=>(typeof obj.modifier=="number"||typeof obj.modifier=="string")&&typeof obj.type=="string","dataIsModifier")(data)},"#isFlatModifier"),_toRuleElement=new WeakSet,toRuleElement_fn=__name2(function(aeValue){const aeModifier=(()=>{try{const parsed=JSON.parse(aeValue);return __privateMethod(this,_isFlatModifier,isFlatModifier_fn).call(this,parsed)?parsed:null}catch(error){return console.warn(error),null}})();return typeof aeModifier?.modifier=="string"&&aeModifier.modifier.replace("@data.","@"),aeModifier&&{key:"FlatModifier",type:aeModifier.type,value:aeModifier.modifier,selector:"hp"}},"#toRuleElement"),__name2(_Migration675FlatModifierAEsToREs,"Migration675FlatModifierAEsToREs"),__publicField(_Migration675FlatModifierAEsToREs,"version",.675);let Migration675FlatModifierAEsToREs=_Migration675FlatModifierAEsToREs;const _Migration676ReplaceItemsWithRELikeAEs=class extends MigrationBase{static{__name(this,"_Migration676ReplaceItemsWithRELikeAEs")}toughnessPromise=fromUuid("Compendium.pf2e.feats-srd.AmP0qu7c5dlBSath");stoutnessPromise=fromUuid("Compendium.pf2e.feats-srd.COP89tjrNhEucuRW");toughPromise=fromUuid("Compendium.pf2e.familiar-abilities.Le8UWr5BU8rV3iBf");replaceItem({items,type,slug,replacement}){if(!(replacement instanceof ItemPF2e))throw ErrorPF2e("Unexpected error retrieving compendium item");const current=items.find(itemSource=>itemSource.type===type&&itemSource.system.slug?.replace(/'/g,"")===slug);if(current){const newSource=replacement.toObject();current.type==="feat"&&newSource.type==="feat"&&(newSource.system.location=current.system.location),items.splice(items.indexOf(current),1,newSource)}}async updateActor(actorSource){actorSource.type==="familiar"?this.replaceItem({items:actorSource.items,type:"effect",slug:"tough",replacement:await this.toughPromise}):actorSource.type==="character"&&(this.replaceItem({items:actorSource.items,type:"feat",slug:"toughness",replacement:await this.toughnessPromise}),this.replaceItem({items:actorSource.items,type:"feat",slug:"mountains-stoutness",replacement:await this.stoutnessPromise}))}};__name2(_Migration676ReplaceItemsWithRELikeAEs,"Migration676ReplaceItemsWithRELikeAEs"),__publicField(_Migration676ReplaceItemsWithRELikeAEs,"version",.676);let Migration676ReplaceItemsWithRELikeAEs=_Migration676ReplaceItemsWithRELikeAEs;const _Migration677RuleValueDataRefs=class extends MigrationBase{static{__name(this,"_Migration677RuleValueDataRefs")}async updateItem(itemSource){for(const rule of itemSource.system.rules)typeof rule.value=="string"&&(rule.value=rule.value.replace("@data.","@"))}};__name2(_Migration677RuleValueDataRefs,"Migration677RuleValueDataRefs"),__publicField(_Migration677RuleValueDataRefs,"version",.677);let Migration677RuleValueDataRefs=_Migration677RuleValueDataRefs;const _Migration678SeparateNPCAttackTraits=class extends MigrationBase{static{__name(this,"_Migration678SeparateNPCAttackTraits")}async updateItem(itemSource){if(itemSource.type==="weapon"){const weaponTraits2=itemSource.system.traits.value,rangeTraits2=weaponTraits2.filter(trait=>/^range(?!d)/.test(trait));for(const trait of rangeTraits2)weaponTraits2.splice(weaponTraits2.indexOf(trait),1);const reloadTraits=weaponTraits2.filter(trait=>trait.startsWith("reload"));for(const trait of reloadTraits)weaponTraits2.splice(weaponTraits2.indexOf(trait),1);itemSource.system.traits.value=[...new Set(weaponTraits2)].sort()}if(!itemSource.system.traits)return;const itemTraits=itemSource.system.traits.value??[];for(const trait of itemTraits)tupleHasValue(RARITIES,trait)&&(itemTraits.splice(itemTraits.indexOf(trait),1),trait!=="common"&&isObject(itemSource.system.traits.rarity)&&itemSource.system.traits.rarity.value==="common"&&(itemSource.system.traits.rarity.value=trait))}};__name2(_Migration678SeparateNPCAttackTraits,"Migration678SeparateNPCAttackTraits"),__publicField(_Migration678SeparateNPCAttackTraits,"version",.678);let Migration678SeparateNPCAttackTraits=_Migration678SeparateNPCAttackTraits;const _Migration679TowerShieldSpeedPenalty=class extends MigrationBase{static{__name(this,"_Migration679TowerShieldSpeedPenalty")}towerShieldSlugs=["darkwood-tower-shield-high-grade","darkwood-tower-shield-standard-grade","tower-shield"];async updateItem(source){if(source.type==="armor"){const systemData=source.system;systemData.speed&&this.towerShieldSlugs.includes(systemData.slug??"")&&(systemData.speed.value=-5),systemData.armor&&(systemData.armor.value=Number(systemData.armor.value)||0),systemData.speed&&(systemData.speed.value=Number(systemData.speed.value)||0);const potencyRune=systemData.potencyRune;potencyRune.value=Number(systemData.potencyRune.value)||0,"resilient"in systemData&&("game"in globalThis?systemData["-=resilient"]=null:delete systemData.resilient)}}};__name2(_Migration679TowerShieldSpeedPenalty,"Migration679TowerShieldSpeedPenalty"),__publicField(_Migration679TowerShieldSpeedPenalty,"version",.679);let Migration679TowerShieldSpeedPenalty=_Migration679TowerShieldSpeedPenalty;const _Migration680SetWeaponHands=class extends MigrationBase{static{__name(this,"_Migration680SetWeaponHands")}oneHandedWeapons=new Set(["repeating-hand-crossbow"]);onePlusHandedWeapons=new Set(["backpack-ballista","backpack-catapult","composite-longbow","composite-shortbow","hongali-hornbow","longbow","shortbow","sun-sling"]);shieldAttachments=new Set(["shield-boss","shield-spikes"]);firearmAttachments=new Set(["bayonette","reinforced-stock"]);wornGloves=new Set(["handwraps-of-mighty-blows"]);twoHandedWeapons=new Set(["adze","alchemical-crossbow","arquebus","axe-musket","bladed-diabolo","bladed-scarf","blunderbuss","bo-staff","boarding-pike","butchering-axe","combat-grapnel","crossbow","double-barreled-musket","dueling-spear","dwarven-scattergun","elven-branched-spear","elven-curve-blade","explosive-dogslicer","falchion","fauchard","fire-lance","flingflenser","flintlock-musket","gill-hook","glaive","gnome-amalgam-musket","greataxe","greatclub","greatpick","greatsword","guisarme","gun-sword","halberd","halfling-sling-staff","hammer-gun","harmona-gun","heavy-crossbow","horsechopper","kusarigama","lance","longspear","maul","meteor-hammer","mithral-tree","naginata","ogre-hook","ranseur","repeating-crossbow","repeating-heavy-crossbow","scythe","shauth-lash","spiked-chain","taw-launcher","three-peaked-tree","thundermace","war-flail","whip-claw"]);isShield(source){return source.type==="armor"&&(source.system.armorType?.value==="shield"||source.system.category==="shield")}async updateItem(itemSource){if(this.isShield(itemSource))itemSource.system.usage.value="held-in-one-hand";else if(itemSource.type==="weapon"){itemSource.system.usage??={value:"held-in-one-hand"};const{baseItem,slug,traits}=itemSource.system,usage=itemSource.system.usage;if(this.twoHandedWeapons.has(baseItem||slug||""))usage.value="held-in-two-hands";else if(this.onePlusHandedWeapons.has(baseItem||slug||""))usage.value="held-in-one-plus-hands";else if(this.oneHandedWeapons.has(baseItem||slug||""))usage.value="held-in-one-hand";else if(this.shieldAttachments.has(baseItem||slug||"")){usage.value="held-in-one-hand";const attachedIndex=traits.value.findIndex(trait=>trait==="attached");attachedIndex!==-1&&traits.value.splice(attachedIndex,1,"attached-to-shield")}else if(this.firearmAttachments.has(baseItem||slug||"")){usage.value="held-in-one-hand";const attachedIndex=traits.value.findIndex(trait=>trait==="attached");attachedIndex!==-1&&traits.value.splice(attachedIndex,1,"attached-to-crossbow-or-firearm")}else this.wornGloves.has(baseItem||slug||"")&&(usage.value="worn-gloves")}}};__name2(_Migration680SetWeaponHands,"Migration680SetWeaponHands"),__publicField(_Migration680SetWeaponHands,"version",.68);let Migration680SetWeaponHands=_Migration680SetWeaponHands;const _Migration681GiantLanguageToJotun=class extends MigrationBase{static{__name(this,"_Migration681GiantLanguageToJotun")}replaceGiant({value}){const giantIndex=value.indexOf("giant");giantIndex!==-1&&value.splice(giantIndex,1,"jotun")}async updateActor(actorSource){(actorSource.type==="character"||actorSource.type==="npc")&&this.replaceGiant(actorSource.system.traits.languages)}async updateItem(itemSource){itemSource.type==="ancestry"&&this.replaceGiant(itemSource.system.additionalLanguages)}};__name2(_Migration681GiantLanguageToJotun,"Migration681GiantLanguageToJotun"),__publicField(_Migration681GiantLanguageToJotun,"version",.681);let Migration681GiantLanguageToJotun=_Migration681GiantLanguageToJotun;const _Migration682BiographyFields=class extends MigrationBase{static{__name(this,"_Migration682BiographyFields")}replaceBiographyData(old){old.details.biography.public?(old.details.biography.appearance=old.details.biography.public,old.details.biography["-=public"]=null):old.details.biography.appearance??="",old.details.biography.value?(old.details.biography.campaignNotes=old.details.biography.value,old.details.biography["-=value"]=null):old.details.biography.campaignNotes??="","game"in globalThis||(delete old.details.biography.public,delete old.details.biography.value),old.details.biography.backstory??="",old.details.biography.birthPlace??="",old.details.biography.attitude??="",old.details.biography.beliefs??="",old.details.biography.likes??="",old.details.biography.dislikes??="",old.details.biography.catchphrases??="",old.details.biography.allies??="",old.details.biography.enemies??="",old.details.biography.organaizations??=""}async updateActor(source){source.type==="character"&&this.replaceBiographyData(source.system)}};__name2(_Migration682BiographyFields,"Migration682BiographyFields"),__publicField(_Migration682BiographyFields,"version",.682);let Migration682BiographyFields=_Migration682BiographyFields;const _Migration683FlavorTextToPublicNotes=class extends MigrationBase{static{__name(this,"_Migration683FlavorTextToPublicNotes")}replaceFlavorTextData(old){old.details.flavorText?(old.details.publicNotes=old.details.flavorText,old.details["-=flavorText"]=null):old.details.publicNotes??="","game"in globalThis||delete old.details.flavorText,old.details.blurb??="",old.details.privateNotes??=""}async updateActor(actorSource){actorSource.type==="npc"&&this.replaceFlavorTextData(actorSource.system)}};__name2(_Migration683FlavorTextToPublicNotes,"Migration683FlavorTextToPublicNotes"),__publicField(_Migration683FlavorTextToPublicNotes,"version",.683);let Migration683FlavorTextToPublicNotes=_Migration683FlavorTextToPublicNotes;const _Migration684RationsToConsumable=class extends MigrationBase{static{__name(this,"_Migration684RationsToConsumable")}constructor(){super(...arguments),__privateAdd(this,_isOldRations),__privateAdd(this,_getRationRefs),__privateAdd(this,_rationsSourceId,"Compendium.pf2e.equipment-srd.L9ZV076913otGtiB"),__privateAdd(this,_rationsPromise,fromUuid(__privateGet(this,_rationsSourceId)))}async updateActor(source){const oldRations=source.items.filter(i=>__privateMethod(this,_isOldRations,isOldRations_fn).call(this,i)),rations=await __privateGet(this,_rationsPromise);if(!(rations instanceof ConsumablePF2e))throw ErrorPF2e("Unexpected error acquiring compendium item");for(const oldRation of oldRations){const newRation=rations.toObject();newRation.folder=oldRation.folder,newRation.sort=oldRation.sort;const oldContainerId=oldRation.system.containerId??{value:null};oldContainerId instanceof Object&&(newRation.system.containerId=oldContainerId.value);const oldQuantity=oldRation.system.quantity;isObject(oldQuantity)&&(newRation.system.quantity=Math.ceil((oldQuantity.value??1)/7)),source.items.findSplice(item=>item===oldRation,newRation)}}async updateItem(source){if(source.type!=="kit")return;const rationRefs=__privateMethod(this,_getRationRefs,getRationRefs_fn).call(this,Object.values(source.system.items));for(const rationRef of rationRefs)rationRef.quantity=Math.ceil(rationRef.quantity/7)}};_rationsSourceId=new WeakMap,_rationsPromise=new WeakMap,_isOldRations=new WeakSet,isOldRations_fn=__name2(function(itemSource){return itemSource?.type==="equipment"&&itemSource.flags.core?.sourceId===__privateGet(this,_rationsSourceId)},"#isOldRations"),_getRationRefs=new WeakSet,getRationRefs_fn=__name2(function(itemRefs){return itemRefs.reduce((rationRefs,itemRef)=>(itemRef.isContainer&&itemRef.items?rationRefs.push(...__privateMethod(this,_getRationRefs,getRationRefs_fn).call(this,Object.values(itemRef.items))):itemRef.pack==="pf2e.equipment-srd"&&itemRef.id==="L9ZV076913otGtiB"&&rationRefs.push(itemRef),rationRefs),[])},"#getRationRefs"),__name2(_Migration684RationsToConsumable,"Migration684RationsToConsumable"),__publicField(_Migration684RationsToConsumable,"version",.684);let Migration684RationsToConsumable=_Migration684RationsToConsumable;const _Migration685FixMeleeUsageTraits=class extends MigrationBase{static{__name(this,"_Migration685FixMeleeUsageTraits")}async updateItem(itemSource){if(itemSource.type==="weapon"){const systemData=itemSource.system;systemData.meleeUsage&&!Array.isArray(systemData.meleeUsage.traits)&&(systemData.meleeUsage.traits=systemData.meleeUsage.traits?.value??[])}}};__name2(_Migration685FixMeleeUsageTraits,"Migration685FixMeleeUsageTraits"),__publicField(_Migration685FixMeleeUsageTraits,"version",.685);let Migration685FixMeleeUsageTraits=_Migration685FixMeleeUsageTraits;const _Migration686HeroPointsToResources=class extends MigrationBase{static{__name(this,"_Migration686HeroPointsToResources")}async updateActor(actorSource){if(actorSource.type!=="character")return;const systemSource=actorSource.system;if(systemSource.attributes.heroPoints){const resources=systemSource.resources;resources.heroPoints={value:systemSource.attributes.heroPoints.rank},systemSource.attributes["-=heroPoints"]=null,"game"in globalThis||delete systemSource.attributes.heroPoints}}};__name2(_Migration686HeroPointsToResources,"Migration686HeroPointsToResources"),__publicField(_Migration686HeroPointsToResources,"version",.686);let Migration686HeroPointsToResources=_Migration686HeroPointsToResources;const _Migration687FamiliarityAEsToREs=class extends MigrationBase{static{__name(this,"_Migration687FamiliarityAEsToREs")}isFamiliarityAE(data){return typeof data=="object"&&data!==null&&__name2(obj=>typeof obj.trait=="string"&&typeof obj.category=="string","dataIsFamiliarity")(data)}toRuleElement(sameAs,aeValue){const aeData=(()=>{try{const parsed=JSON.parse(aeValue);return this.isFamiliarityAE(parsed)?parsed:null}catch(error){return console.warn(error),null}})();return aeData&&{key:"LinkedProficiency",slug:`${aeData.category}-${aeData.trait}-weapons`,predicate:{all:[`weapon:trait:${aeData.trait}`,`weapon:category:${aeData.category}`]},sameAs}}async updateActor(actorSource){actorSource.effects=[]}async updateItem(itemSource){for(const effect of[...itemSource.effects])for(const change of effect.changes.filter(change2=>change2.key.startsWith("system.martial."))){const linkTo=change.key.replace(/^data\.martial\.|\.familiarity$/g,""),reData=this.toRuleElement(linkTo,change.value);reData&&itemSource.system.rules.push(reData)}itemSource.effects=[]}};__name2(_Migration687FamiliarityAEsToREs,"Migration687FamiliarityAEsToREs"),__publicField(_Migration687FamiliarityAEsToREs,"version",.687);let Migration687FamiliarityAEsToREs=_Migration687FamiliarityAEsToREs;const _Migration688ClampSpellLevel=class extends MigrationBase{static{__name(this,"_Migration688ClampSpellLevel")}async updateItem(itemSource){itemSource.type==="spell"&&(itemSource.system.level.value=Math.min(Math.max(itemSource.system.level.value,1),10))}};__name2(_Migration688ClampSpellLevel,"Migration688ClampSpellLevel"),__publicField(_Migration688ClampSpellLevel,"version",.688);let Migration688ClampSpellLevel=_Migration688ClampSpellLevel;const _Migration689EncumberanceActiveEffects=class extends MigrationBase{static{__name(this,"_Migration689EncumberanceActiveEffects")}async updateItem(itemSource){const systemData=itemSource.system,slug=systemData.slug??sluggify(itemSource.name),amountToIncreaseBy=(()=>itemSource.type==="feat"&&slug==="hefty-hauler"?2:itemSource.type==="feat"&&slug==="hardy-traveler"||itemSource.type==="equipment"&&slug==="lifting-belt"?1:0)();if(amountToIncreaseBy===0||systemData.rules.some(r=>r.key==="ActiveEffectLike"))return;const rules=[{key:"ActiveEffectLike",path:"system.attributes.bonusEncumbranceBulk",mode:"add",value:amountToIncreaseBy},{key:"ActiveEffectLike",path:"system.attributes.bonusLimitBulk",mode:"add",value:amountToIncreaseBy}];for(const rule of rules)systemData.rules.push(rule)}};__name2(_Migration689EncumberanceActiveEffects,"Migration689EncumberanceActiveEffects"),__publicField(_Migration689EncumberanceActiveEffects,"version",.689);let Migration689EncumberanceActiveEffects=_Migration689EncumberanceActiveEffects;const _Migration690InitiativeTiebreakItems=class extends MigrationBase{static{__name(this,"_Migration690InitiativeTiebreakItems")}itemSlugs=["ambush-awareness","elven-instincts","pilgrims-token"];rule={key:"ActiveEffectLike",path:"system.attributes.initiative.tiebreakPriority",mode:"override",value:0};async updateItem(itemSource){this.itemSlugs.includes(itemSource.system.slug??"")&&!itemSource.system.rules.some(rule=>rule.key==="ActiveEffectLike")&&!(itemSource.system.slug==="pilgrims-token"&&itemSource.type!=="equipment")&&itemSource.system.rules.push(this.rule)}};__name2(_Migration690InitiativeTiebreakItems,"Migration690InitiativeTiebreakItems"),__publicField(_Migration690InitiativeTiebreakItems,"version",.69);let Migration690InitiativeTiebreakItems=_Migration690InitiativeTiebreakItems;const _Migration691WeaponRangeAbilityCategoryGroup=class extends MigrationBase{static{__name(this,"_Migration691WeaponRangeAbilityCategoryGroup")}isOldGroupData(group){return isObject(group)&&(typeof group.value=="string"||group.value===null)}isOldRangeData(range){return range instanceof Object&&"value"in range&&typeof range.value=="string"}async updateItem(itemSource){if(itemSource.type==="weapon"){const systemData=itemSource.system;systemData.category=(systemData.weaponType?systemData.weaponType.value:systemData.category)||"simple",systemData.weaponType&&(systemData["-=weaponType"]=null,"game"in globalThis||delete systemData.weaponType),systemData.group=(this.isOldGroupData(systemData.group)?systemData.group.value:systemData.group)||null;const hasOldRangeData=this.isOldRangeData(systemData.range);if(systemData.range=hasOldRangeData?Number(systemData.range.value)||null:systemData.range,hasOldRangeData&&isObject(systemData.ability)&&(systemData.ability.value==="str"&&!setHasElement(MANDATORY_RANGED_GROUPS,systemData.group)&&(systemData.range=null),delete systemData.ability,systemData["-=ability"]=null),setHasElement(MANDATORY_RANGED_GROUPS,systemData.group)){const thrownIndex=systemData.traits.value.findIndex(trait=>/^thrown-\d+/.test(trait));thrownIndex!==-1&&(systemData.traits.value[thrownIndex]="thrown",systemData.reload.value="-")}systemData.baseItem==="falchion"?systemData.group="sword":systemData.baseItem==="orc-knuckle-dagger"&&(systemData.group="knife")}const{rules}=itemSource.system,strikeRules=rules.filter(rule=>/\bStrike$/.test(String(rule.key)));for(const rule of strikeRules)rule.key="Strike",rule.range=Number(rule.range)||null,delete rule.ability}};__name2(_Migration691WeaponRangeAbilityCategoryGroup,"Migration691WeaponRangeAbilityCategoryGroup"),__publicField(_Migration691WeaponRangeAbilityCategoryGroup,"version",.691);let Migration691WeaponRangeAbilityCategoryGroup=_Migration691WeaponRangeAbilityCategoryGroup;const _Migration692CraftingEntryFeatReplacement=class extends MigrationBase{static{__name(this,"_Migration692CraftingEntryFeatReplacement")}requiresFlush=!0;slugToPromise=new Map([["advanced-alchemy",fromUuid("Compendium.pf2e.classfeatures.Pe0zmIqyTBc2Td0I")],["field-discovery-bomber",fromUuid("Compendium.pf2e.classfeatures.8QAFgy9U8PxEa7Dw")],["field-discovery-chirurgeon",fromUuid("Compendium.pf2e.classfeatures.qC0Iz6SlG2i9gv6g")],["field-discovery-mutagenist",fromUuid("Compendium.pf2e.classfeatures.V4Jt7eDnJBLv5bDj")],["field-discovery-toxicologist",fromUuid("Compendium.pf2e.classfeatures.6zo2PJGYoig7nFpR")],["infused-reagents",fromUuid("Compendium.pf2e.classfeatures.wySB9VHOW1v3TX1L")],["alchemist-dedication",fromUuid("Compendium.pf2e.feats-srd.CJMkxlxHiHZQYDCz")],["deeper-dabbler",fromUuid("Compendium.pf2e.feats-srd.PTXZ2C3AV8tZf0iX")],["efficient-alchemy-paragon",fromUuid("Compendium.pf2e.feats-srd.2FBZ0apnmZ7b61ct")],["expert-alchemy",fromUuid("Compendium.pf2e.feats-srd.soHLtpMM9h3AE7PD")],["expert-fireworks-crafter",fromUuid("Compendium.pf2e.feats-srd.dDFQJem5K9Jzxgda")],["expert-herbalism",fromUuid("Compendium.pf2e.feats-srd.owJorCBZmUi5lIV0")],["expert-poisoner",fromUuid("Compendium.pf2e.feats-srd.VruIzuysxw4tY6rk")],["firework-technician-dedication",fromUuid("Compendium.pf2e.feats-srd.MVbNnjqQOK9d8Ki3")],["gadget-specialist",fromUuid("Compendium.pf2e.feats-srd.DQN7YC7s7T0pL6Aa")],["herbalist-dedication",fromUuid("Compendium.pf2e.feats-srd.5CRt5Dy9eLv5LpRF")],["master-alchemy",fromUuid("Compendium.pf2e.feats-srd.f6k9lIrIS4SfnCnG")],["munitions-crafter",fromUuid("Compendium.pf2e.feats-srd.lFVqejlf52cdYrZy")],["munitions-machinist",fromUuid("Compendium.pf2e.feats-srd.lh3STEvbGnP7jVMr")],["plentiful-snares",fromUuid("Compendium.pf2e.feats-srd.wGaxWwJhIXbMJft1")],["poisoner-dedication",fromUuid("Compendium.pf2e.feats-srd.y7DDs03GtDnmhxFp")],["snare-genius",fromUuid("Compendium.pf2e.feats-srd.8DIzXO1YpsU3DpJw")],["snare-specialist",fromUuid("Compendium.pf2e.feats-srd.0haS0qXR9xTYKoTG")],["snarecrafter-dedication",fromUuid("Compendium.pf2e.feats-srd.4MUbwilvb9dI0X59")],["talisman-dabbler-dedication",fromUuid("Compendium.pf2e.feats-srd.1t5479E6bdvFs4E7")],["ubiquitous-gadgets",fromUuid("Compendium.pf2e.feats-srd.ny0nfGTDUE4p8TtO")],["ubiquitous-snares",fromUuid("Compendium.pf2e.feats-srd.bX2WI5k0afqPpCfm")]]);replaceItem({items,current,replacement}){if(!(replacement instanceof ItemPF2e))throw ErrorPF2e("Unexpected error retrieving compendium item");const newSource=replacement.toObject();current.type==="feat"&&newSource.type==="feat"&&(newSource.system.location=current.system.location),items.splice(items.indexOf(current),1,newSource)}async updateActor(actorSource){actorSource.type==="character"&&this.slugToPromise.forEach(async(promise,slug)=>{const current=actorSource.items.find(itemSource=>itemSource.type==="feat"&&itemSource.system.slug===slug);current&&this.replaceItem({items:actorSource.items,current,replacement:await promise})})}};__name2(_Migration692CraftingEntryFeatReplacement,"Migration692CraftingEntryFeatReplacement"),__publicField(_Migration692CraftingEntryFeatReplacement,"version",.692);let Migration692CraftingEntryFeatReplacement=_Migration692CraftingEntryFeatReplacement;const _Migration693ArmorCategoryGroup=class extends MigrationBase{static{__name(this,"_Migration693ArmorCategoryGroup")}isOldGroupData(group){return group instanceof Object&&"value"in group&&(typeof group.value=="string"||group.value===null)}async updateItem(itemSource){if(itemSource.type!=="armor")return;const systemData=itemSource.system;systemData.category=(systemData.armorType?systemData.armorType.value:systemData.category)||"simple",systemData.armorType&&(systemData["-=armorType"]=null,"game"in globalThis||delete systemData.armorType),systemData.group=(this.isOldGroupData(systemData.group)?systemData.group.value:systemData.group)||null}};__name2(_Migration693ArmorCategoryGroup,"Migration693ArmorCategoryGroup"),__publicField(_Migration693ArmorCategoryGroup,"version",.693);let Migration693ArmorCategoryGroup=_Migration693ArmorCategoryGroup;const _Migration694RetireSystemTokenSettings=class extends MigrationBase{static{__name(this,"_Migration694RetireSystemTokenSettings")}async migrate(){const systemNameHover=Number(game.settings.storage.get("world").getItem("pf2e.defaultTokenSettingsName"))||CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER,systemBarHover=Number(game.settings.storage.get("world").getItem("pf2e.defaultTokenSettingsBar"))||CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER,coreTokenDefaults=game.settings.get("core","defaultToken");coreTokenDefaults.displayName=systemNameHover,coreTokenDefaults.displayBars=systemBarHover}};__name2(_Migration694RetireSystemTokenSettings,"Migration694RetireSystemTokenSettings"),__publicField(_Migration694RetireSystemTokenSettings,"version",.694);let Migration694RetireSystemTokenSettings=_Migration694RetireSystemTokenSettings;const _Migration695SummonToSummoned=class extends MigrationBase{static{__name(this,"_Migration695SummonToSummoned")}async updateItem(itemSource){const traits=itemSource.system.traits;if(traits?.value)if(itemSource.type==="action")traits.custom??="",traits.custom.toLowerCase()==="summon"&&(traits.custom="",traits.value=Array.from(new Set([...traits.value,"summon"])).sort());else{const index=traits.value.indexOf("summon");index!==-1&&(traits.value[index]="summoned")}}};__name2(_Migration695SummonToSummoned,"Migration695SummonToSummoned"),__publicField(_Migration695SummonToSummoned,"version",.695);let Migration695SummonToSummoned=_Migration695SummonToSummoned;const _Migration696FlatAbilityModifiers=class extends MigrationBase{static{__name(this,"_Migration696FlatAbilityModifiers")}abilityModPattern=/@abilities\.([a-z]{3})\.mod\b/;abbreviationMap=new Map(Array.from(ATTRIBUTE_ABBREVIATIONS).map(a=>[`PF2E.Ability${sluggify(a,{camel:"bactrian"})}`,a]));async updateItem(itemSource){const rules=itemSource.system.rules;for(const rule of rules)if(typeof rule.key=="string"&&rule.key.endsWith("FlatModifier")&&rule.type==="ability"&&!setHasElement(ATTRIBUTE_ABBREVIATIONS,rule.ability)){const abilityFromValue=this.abilityModPattern.exec(String(rule.value))?.[1]??null;rule.ability=abilityFromValue??this.abbreviationMap.get(String(rule.label??""))??"str",typeof rule.value=="string"&&rule.value.startsWith("@")&&rule.value.endsWith(".mod")&&delete rule.value}itemSource.system.slug==="thief-racket"&&!rules.some(rule=>rule.ability==="dex")&&rules.unshift({ability:"dex",key:"FlatModifier",predicate:{all:["weapon:melee","weapon:trait:finesse"],not:["weapon:category:unarmed"]},selector:"damage",type:"ability"})}};__name2(_Migration696FlatAbilityModifiers,"Migration696FlatAbilityModifiers"),__publicField(_Migration696FlatAbilityModifiers,"version",.696);let Migration696FlatAbilityModifiers=_Migration696FlatAbilityModifiers;const _Migration697WeaponReachTrait=class extends MigrationBase{static{__name(this,"_Migration697WeaponReachTrait")}async updateItem(itemSource){if(itemSource.type==="weapon"){const traits=itemSource.system.traits.value,numericReach=traits.find(t=>/^reach-\d+$/.test(t));numericReach&&traits.splice(traits.indexOf(numericReach),1,"reach")}}};__name2(_Migration697WeaponReachTrait,"Migration697WeaponReachTrait"),__publicField(_Migration697WeaponReachTrait,"version",.697);let Migration697WeaponReachTrait=_Migration697WeaponReachTrait;const _Migration698RemoveDerivedActorTraits=class extends MigrationBase{static{__name(this,"_Migration698RemoveDerivedActorTraits")}async updateActor(source){if(!((source.type==="character"||source.type==="npc")&&"traits"in source.system.traits&&isObject(source.system.traits.traits)&&"value"in source.system.traits.traits&&Array.isArray(source.system.traits.traits.value)))return;const traits=source.system.traits.traits.value;for(const trait of ALIGNMENT_TRAITS){const index=traits.indexOf(trait);index>=0&&traits.splice(index,1)}if(source.type==="character"){const ancestry=source.items.find(i=>i.type==="ancestry");if(!ancestry)return;for(const trait of ancestry.system.traits.value){const index=traits.indexOf(trait);index>=0&&traits.splice(index,1)}}}};__name2(_Migration698RemoveDerivedActorTraits,"Migration698RemoveDerivedActorTraits"),__publicField(_Migration698RemoveDerivedActorTraits,"version",.698);let Migration698RemoveDerivedActorTraits=_Migration698RemoveDerivedActorTraits;const _Migration699ItemDescriptionEmptyString=class extends MigrationBase{static{__name(this,"_Migration699ItemDescriptionEmptyString")}async updateItem(itemSource){itemSource.system.description.value??=""}};__name2(_Migration699ItemDescriptionEmptyString,"Migration699ItemDescriptionEmptyString"),__publicField(_Migration699ItemDescriptionEmptyString,"version",.699);let Migration699ItemDescriptionEmptyString=_Migration699ItemDescriptionEmptyString;const _Migration700SingleClassFeatures=class extends MigrationBase{static{__name(this,"_Migration700SingleClassFeatures")}constructor(){super(...arguments),__privateAdd(this,_migrateClass),__privateAdd(this,_migrateFeature),__privateAdd(this,_isClassFeature2),__publicField(this,"itemIds",{alertness:["D8CSi8c9XiRpVc5M","OZaJz4exCoz6vuuv","qJ4fwGpoNC36ZQ8I","2o1Cj7hDayDlslqY","TAIOtk5VvPZvv4nu"],"armor-expertise":["x5jaCJxsmD5sx3KB","fRifyINZF5SKDfib"],"armor-mastery":["CGB1TczFhQhdQxml","IPDwS5pTgU3Cq6Nl"],evasion:["MV6XIuAgN9uSA0Da","EZuWfYSv3ASLyKtu","DqWr3LqUpT3Xi2xq"],"expert-spellcaster":["cD3nSupdCvONuHiE","mdzk070ixIDpid7V"],"great-fortitude":["F57Na5VxfBp56kke","25GSAotUcDwInYgG"],"improved-evasion":["L5D0NwFXdLiVSnk5","6XwGONPdr9SFDtDc"],"incredible-senses":["nLwPMPLRne1HnL00","iyb5FU2BpsCCan8Q","kktZhQPJgC5F4hgU"],"iron-will":["wMyDcVNmA7xGK83S","JVCxv4HuLaaFhAf4"],juggernaut:["OMZs5y16jZRW9KQK","sHCFQZM0xHCOYOId","Ba97T4anGhizfaCt","pzTRQxuoNOeWAalC","ojB0UJWpSekQPjT7"],"lightning-reflexes":["TUOeATt52P43r5W0","rz87RgR1crWTd7j5","Xqd0vrxq2bLXxdaB","tfugXJHITCnArN1b","7PzcKaDGy6tIkQh4","EJzjY6AIsTYqW0ee"],"magical-fortitude":["70jqXP2eS4tRZ0Ok","MzyPNlxrNA5OKVd7"],"master-spellcaster":["l1InYvhnQSz6Ucxc","zu9PcxvfoZlqQVk5"],"medium-armor-expertise":["FCEp9jjxxgRJDJV3","tzUaTqB6GHAeffOl"],"medium-armor-mastery":["cGMSYAErbUG5E8X2","NcEpvnIZfKzG1Iou"],resolve:["JQAujUXjczVnYDEI","D2g6sZQAWaTccviQ","vv63fioCtOvDIdF2","9WjZSliQZJlyGvUi"],"vigilant-senses":["0npO4rPscGm0dX13","NTp146fjLreL5zsj"],"weapon-expertise":["9XLUh9iMepZesdmc","F5BHEav90oOJ2LwN","O99eXctsEjEpuBwe"],"weapon-specialization":["9EqIasqfI8YIM3Pt","WiM7X4xmpMx4s6LD","1NGTc0gqEtwaFqUK"]}),__publicField(this,"features",["Alertness","Armor Expertise","Armor Mastery","Evasion","Expert Spellcaster","Great Fortitude","Improved Evasion","Incredible Senses","Iron Will","Juggernaut","Lightning Reflexes","Magical Fortitude","Master Spellcaster","Medium Armor Expertise","Medium Armor Mastery","Resolve","Vigilant Senses","Weapon Expertise","Weapon Specialization"].map(name2=>({slug:sluggify(name2),name:name2})))}async updateItem(source){source.type==="class"?__privateMethod(this,_migrateClass,migrateClass_fn).call(this,source):source.type==="feat"&&__privateMethod(this,_migrateFeature,migrateFeature_fn).call(this,source)}};_migrateClass=new WeakSet,migrateClass_fn=__name2(function(itemSource){for(const refId in itemSource.system.items){const itemRef=itemSource.system.items[refId];itemRef.level=Number(itemRef.level)||1;for(const feature of this.features)itemSource.system.slug==="swashbuckler"&&feature.slug==="weapon-expertise"||this.itemIds[feature.slug].includes(itemRef.id??"")&&(itemRef.id=this.itemIds[feature.slug][0],itemRef.name=feature.name)}},"#migrateClass"),_migrateFeature=new WeakSet,migrateFeature_fn=__name2(function(source){if(__privateMethod(this,_isClassFeature2,isClassFeature_fn2).call(this,source))for(const feature of this.features)source.system.slug==="swashbuckler"&&feature.slug==="weapon-expertise"||source.system.slug?.startsWith(`${feature.slug}-level-`)&&(source.system.slug=feature.slug,source.name.startsWith(`${feature.name} `)&&(source.name=feature.name),source.system.traits.value=[])},"#migrateFeature"),_isClassFeature2=new WeakSet,isClassFeature_fn2=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration700SingleClassFeatures,"Migration700SingleClassFeatures"),__publicField(_Migration700SingleClassFeatures,"version",.7);let Migration700SingleClassFeatures=_Migration700SingleClassFeatures;const _Migration701ModifierNameToSlug=class extends MigrationBase{static{__name(this,"_Migration701ModifierNameToSlug")}async updateItem(itemSource){const rules=itemSource.system.rules.filter(r=>["FlatModifier","DamageDice"].includes(String(r.key)));for(const rule of rules)rule.name&&(rule.label?rule.slug=sluggify(rule.name):rule.label=rule.name,delete rule.name),rule.label==="Rage"&&(rule.label="PF2E.TraitRage")}};__name2(_Migration701ModifierNameToSlug,"Migration701ModifierNameToSlug"),__publicField(_Migration701ModifierNameToSlug,"version",.701);let Migration701ModifierNameToSlug=_Migration701ModifierNameToSlug;const _Migration702REFormulasAtInstanceLevel=class extends MigrationBase{static{__name(this,"_Migration702REFormulasAtInstanceLevel")}raiseToInstanceLevel(value){return value.replace(/@[a-z.]+/gi,match=>["@mod","@castLevel","@heighten","@item.badge.value"].includes(match)||match.indexOf("@spell")>=0?match:match==="@details.level.value"||match==="@actor.details.level.value"?"@actor.level":match==="@item.value.value"?"@item.badge.value":match.startsWith("@abilities.")?match.replace(/\babilities\b/,"actor.abilities"):match.startsWith("@attributes.")?match.replace(/\battributes\b/,"actor.attributes"):match==="@item.level.value"?"@item.level":/^@item\.[a-z]+$/.test(match)?match:match.replace(/@item\.(?!data\b)/,"@item.system.").replace(/@(?!(?:item|actor|[A-Z]\w+))/,"@actor.system."))}async updateItem(itemSource){const rules=itemSource.system.rules;for(const rule of rules)try{if(typeof rule.value=="string")rule.value=this.raiseToInstanceLevel(rule.value);else if(isObject(rule.value)&&"brackets"in rule.value&&Array.isArray(rule.value.brackets))for(const bracket of rule.value.brackets)isObject(bracket)&&typeof bracket.value=="string"&&(bracket.value=this.raiseToInstanceLevel(bracket.value));rule.key==="Note"&&rule.text&&(rule.text=this.raiseToInstanceLevel(rule.text))}catch{continue}}};__name2(_Migration702REFormulasAtInstanceLevel,"Migration702REFormulasAtInstanceLevel"),__publicField(_Migration702REFormulasAtInstanceLevel,"version",.702);let Migration702REFormulasAtInstanceLevel=_Migration702REFormulasAtInstanceLevel;const _Migration703SpellDamageStructure=class extends MigrationBase{static{__name(this,"_Migration703SpellDamageStructure")}async updateItem(itemSource){itemSource.type==="spell"&&(itemSource.system.damage instanceof Object?itemSource.system.damage.value instanceof Object||(itemSource.system.damage.value={}):itemSource.system.damage={value:{}})}};__name2(_Migration703SpellDamageStructure,"Migration703SpellDamageStructure"),__publicField(_Migration703SpellDamageStructure,"version",.703);let Migration703SpellDamageStructure=_Migration703SpellDamageStructure;const _Migration704MartialProficiencyRE=class extends MigrationBase{static{__name(this,"_Migration704MartialProficiencyRE")}async updateItem(itemSource){const rules=itemSource.system.rules.filter(r=>r.key==="LinkedProficiency");for(const rule of rules)if(rule.key="MartialProficiency",rule.definition=rule.predicate,delete rule.predicate,typeof rule.slug=="string"&&itemSource.system.slug?.endsWith("-weapon-familiarity")&&!rule.label){const key=sluggify(rule.slug,{camel:"bactrian"});rule.label=`PF2E.SpecificRule.MartialProficiency.${key}`}if(itemSource.type==="class"&&itemSource.system.slug==="gunslinger"&&itemSource.system.rules.length===0){const gunslingerRules=[{definition:{all:["weapon:category:simple"],any:["weapon:group:firearm","weapon:tag:crossbow"]},key:"MartialProficiency",label:"PF2E.SpecificRule.MartialProficiency.SimpleFirearmsCrossbows",slug:"simple-firearms-crossbows",value:2},{definition:{all:["weapon:category:martial"],any:["weapon:group:firearm","weapon:tag:crossbow"]},key:"MartialProficiency",label:"PF2E.SpecificRule.MartialProficiency.MartialFirearmsCrossbows",slug:"martial-firearms-crossbows",value:2},{definition:{all:["weapon:category:advanced"],any:["weapon:group:firearm","weapon:tag:crossbow"]},key:"MartialProficiency",label:"PF2E.SpecificRule.MartialProficiency.AdvancedFirearmsCrossbows",slug:"advanced-firearms-crossbows",value:1}];itemSource.system.rules=gunslingerRules}}};__name2(_Migration704MartialProficiencyRE,"Migration704MartialProficiencyRE"),__publicField(_Migration704MartialProficiencyRE,"version",.704);let Migration704MartialProficiencyRE=_Migration704MartialProficiencyRE;const _Migration705GunslingerCatchUp=class extends MigrationBase{static{__name(this,"_Migration705GunslingerCatchUp")}constructor(){super(...arguments),__privateAdd(this,_isClassFeature3)}async updateItem(source){if(__privateMethod(this,_isClassFeature3,isClassFeature_fn3).call(this,source))switch(source.system.slug){case"singular-expertise":{const rules=[{key:"FlatModifier",selector:"firearm-weapon-group-damage",type:"circumstance",value:1},{key:"FlatModifier",predicate:{all:["weapon:tag:crossbow"]},selector:"bow-weapon-group-damage",type:"circumstance",value:1}];source.system.rules=rules;break}case"gunslinger-weapon-mastery":{const rules=[{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.unarmed.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.advanced-firearms-crossbows.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple-firearms-crossbows.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial-firearms-crossbows.rank",value:3}];source.system.rules=rules;break}case"gunslinging-legend":{const rules=[{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.unarmed.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.advanced-firearms-crossbows.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple-firearms-crossbows.rank",value:4},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial-firearms-crossbows.rank",value:4}];source.system.rules=rules;break}}}};_isClassFeature3=new WeakSet,isClassFeature_fn3=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration705GunslingerCatchUp,"Migration705GunslingerCatchUp"),__publicField(_Migration705GunslingerCatchUp,"version",.705);let Migration705GunslingerCatchUp=_Migration705GunslingerCatchUp;const _Migration706FormulasAtInstanceLevelEverythingElse=class extends Migration702REFormulasAtInstanceLevel{static{__name(this,"_Migration706FormulasAtInstanceLevelEverythingElse")}async updateItem(itemSource){if(itemSource.system.description.value&&(itemSource.system.description.value=this.replaceInlineRolls(itemSource.system.description.value)),itemSource.type==="spell")for(const value of Object.values(itemSource.system.damage.value))value.value=this.raiseToInstanceLevel(value.value);if(itemSource.type==="melee")for(const value of Object.values(itemSource.system.damageRolls))value.damage=this.raiseToInstanceLevel(value.damage)}replaceInlineRolls(value){return value.replace(/\[\[(.*)\]\]/g,match=>this.raiseToInstanceLevel(match))}};__name2(_Migration706FormulasAtInstanceLevelEverythingElse,"Migration706FormulasAtInstanceLevelEverythingElse"),__publicField(_Migration706FormulasAtInstanceLevelEverythingElse,"version",.706);let Migration706FormulasAtInstanceLevelEverythingElse=_Migration706FormulasAtInstanceLevelEverythingElse;const _Migration707BracketedFormulasAtInstanceLevel=class extends Migration702REFormulasAtInstanceLevel{static{__name(this,"_Migration707BracketedFormulasAtInstanceLevel")}};__name2(_Migration707BracketedFormulasAtInstanceLevel,"Migration707BracketedFormulasAtInstanceLevel"),__publicField(_Migration707BracketedFormulasAtInstanceLevel,"version",.707);let Migration707BracketedFormulasAtInstanceLevel=_Migration707BracketedFormulasAtInstanceLevel;const _Migration708SpecificRuleLabel=class extends MigrationBase{static{__name(this,"_Migration708SpecificRuleLabel")}async updateItem(itemSource){for(const rule of itemSource.system.rules)rule.label&&(rule.label=String(rule.label).replace(/\bSpecificRules\b/,"SpecificRule"))}};__name2(_Migration708SpecificRuleLabel,"Migration708SpecificRuleLabel"),__publicField(_Migration708SpecificRuleLabel,"version",.708);let Migration708SpecificRuleLabel=_Migration708SpecificRuleLabel;const _Migration709REFormulasAtInstanceLevelRedux=class extends Migration702REFormulasAtInstanceLevel{static{__name(this,"_Migration709REFormulasAtInstanceLevelRedux")}walkObject(obj){if(Array.isArray(obj))for(let i=0;ir.key==="BattleForm");for(const rule of rules)this.walkObject(rule);itemSource.type==="spell"&&itemSource.system.slug==="wild-shape"&&(itemSource.system.rules=[])}};__name2(_Migration709REFormulasAtInstanceLevelRedux,"Migration709REFormulasAtInstanceLevelRedux"),__publicField(_Migration709REFormulasAtInstanceLevelRedux,"version",.709);let Migration709REFormulasAtInstanceLevelRedux=_Migration709REFormulasAtInstanceLevelRedux;const _Migration710RarityToString=class extends MigrationBase{static{__name(this,"_Migration710RarityToString")}updateTraits(traits){typeof traits?.rarity=="object"&&traits.rarity!==null&&(traits.rarity=traits.rarity.value)}async updateActor(actorSource){"traits"in actorSource.system&&this.updateTraits(actorSource.system.traits??null)}async updateItem(itemSource){"traits"in itemSource.system&&this.updateTraits(itemSource.system.traits??null)}};__name2(_Migration710RarityToString,"Migration710RarityToString"),__publicField(_Migration710RarityToString,"version",.71);let Migration710RarityToString=_Migration710RarityToString;const toDelete=["featType","actionCategory","actions","actionType","level","location"],_Migration711HeritageItems=class extends MigrationBase{static{__name(this,"_Migration711HeritageItems")}constructor(){super(...arguments),__privateAdd(this,_isHeritageFeature),__privateAdd(this,_heritageFromFeat),__privateAdd(this,_officialAncestries,{tengu:{name:"Tengu",uuid:"Compendium.pf2e.ancestries.Item.18xDKYPDBLEv2myX"},kitsune:{name:"Kitsune",uuid:"Compendium.pf2e.ancestries.Item.4BL5wf1VF9feC2rY"},poppet:{name:"Poppet",uuid:"Compendium.pf2e.ancestries.Item.6F2fSFC1Eo1JdpY4"},kobold:{name:"Kobold",uuid:"Compendium.pf2e.ancestries.Item.7oQxL6wgsokD3QXG"},catfolk:{name:"Catfolk",uuid:"Compendium.pf2e.ancestries.Item.972EkpJOPv9KkQIW"},dwarf:{name:"Dwarf",uuid:"Compendium.pf2e.ancestries.Item.BYj5ZvlXZdpaEgA6"},gnome:{name:"Gnome",uuid:"Compendium.pf2e.ancestries.Item.CYlfsYLJcBOgqKtD"},fleshwarp:{name:"Fleshwarp",uuid:"Compendium.pf2e.ancestries.Item.FXlXmNBFiiz9oasi"},strix:{name:"Strix",uuid:"Compendium.pf2e.ancestries.Item.GXcC6oVa5quzgNHD"},android:{name:"Android",uuid:"Compendium.pf2e.ancestries.Item.GfLwE884NoRC7cRi"},halfling:{name:"Halfling",uuid:"Compendium.pf2e.ancestries.Item.GgZAHbrjnzWOZy2v"},lizardfolk:{name:"Lizardfolk",uuid:"Compendium.pf2e.ancestries.Item.HWEgF7Gmoq55VhTL"},human:{name:"Human",uuid:"Compendium.pf2e.ancestries.Item.IiG7DgeLWYrSNXuX"},ratfolk:{name:"Ratfolk",uuid:"Compendium.pf2e.ancestries.Item.P6PcVnCkh4XMdefw"},elf:{name:"Elf",uuid:"Compendium.pf2e.ancestries.Item.PgKmsA2aKdbLU6O0"},anadi:{name:"Anadi",uuid:"Compendium.pf2e.ancestries.Item.TQEqWqc7BYiadUdY"},sprite:{name:"Sprite",uuid:"Compendium.pf2e.ancestries.Item.TRqoeYfGAFjQbviF"},goloma:{name:"Goloma",uuid:"Compendium.pf2e.ancestries.Item.c4secsSNG2AO7I5i"},leshy:{name:"Leshy",uuid:"Compendium.pf2e.ancestries.Item.cdhgByGG1WtuaK73"},fetchling:{name:"Fetchling",uuid:"Compendium.pf2e.ancestries.Item.hIA3qiUsxvLZXrFP"},grippli:{name:"Grippli",uuid:"Compendium.pf2e.ancestries.Item.hXM5jXezIki1cMI2"},automaton:{name:"Automaton",uuid:"Compendium.pf2e.ancestries.Item.kYsBAJ103T44agJF"},orc:{name:"Orc",uuid:"Compendium.pf2e.ancestries.Item.lSGWXjcbOa6O5fTx"},hobgoblin:{name:"Hobgoblin",uuid:"Compendium.pf2e.ancestries.Item.piNLXUrm9iaGqD2i"},shoony:{name:"Shoony",uuid:"Compendium.pf2e.ancestries.Item.q6rsqYARyOGXZA8F"},goblin:{name:"Goblin",uuid:"Compendium.pf2e.ancestries.Item.sQfjTMDaZbT9DThq"},conrasu:{name:"Conrasu",uuid:"Compendium.pf2e.ancestries.Item.tZn4qIHCUA6wCdnI"},gnoll:{name:"Gnoll",uuid:"Compendium.pf2e.ancestries.Item.vxbQ1Yw4qwgjTzqo"},shisk:{name:"Shisk",uuid:"Compendium.pf2e.ancestries.Item.x1YinOddgUxwOLqP"},azarketi:{name:"Azarketi",uuid:"Compendium.pf2e.ancestries.Item.yFoojz6q3ZjvceFw"}}),__privateAdd(this,_heritagesWithoutAncestryInName,{"half-elf":"human","half-orc":"human","skilled-heritage":"human","versatile-heritage":"human",draxie:"sprite",grig:"sprite",melixie:"sprite",nyktera:"sprite",pixie:"sprite","deep-rat":"ratfolk","desert-rat":"ratfolk","longsnout-rat":"ratfolk","sewer-rat":"ratfolk","shadow-rat":"ratfolk","snow-rat":"ratfolk","tunnel-rat":"ratfolk","rite-of-invocation":"conrasu","rite-of-knowing":"conrasu","rite-of-light":"conrasu","rite-of-passage":"conrasu","rite-of-reinforcement":"conrasu"}),__privateAdd(this,_ancestrySlugs,Object.keys(__privateGet(this,_officialAncestries)))}async updateActor(actorSource){const heritageFeatures=actorSource.items.filter(i=>__privateMethod(this,_isHeritageFeature,isHeritageFeature_fn).call(this,i)),firstHeritageFeature=heritageFeatures[0];if(!actorSource.items.some(i=>i.type==="heritage")&&firstHeritageFeature&&actorSource.type==="character"){const heritageSource=__privateMethod(this,_heritageFromFeat,heritageFromFeat_fn).call(this,firstHeritageFeature);actorSource.items.push(heritageSource);const details=actorSource.system.details;details.heritage&&(details["-=heritage"]=null,"game"in globalThis||delete details.heritage)}for(const feature of heritageFeatures)actorSource.items.splice(actorSource.items.indexOf(feature),1)}async updateItem(itemSource,actorSource){if(actorSource||!__privateMethod(this,_isHeritageFeature,isHeritageFeature_fn).call(this,itemSource))return;const newSource=itemSource;newSource.type="heritage",itemSource.img==="systems/pf2e/icons/default-icons/feat.svg"&&(itemSource.img="systems/pf2e/icons/default-icons/heritage.svg");const newSystemData=__privateMethod(this,_heritageFromFeat,heritageFromFeat_fn).call(this,itemSource).system,deletionProperties=toDelete.map(k=>`-=${k}`);for(const property of deletionProperties)newSystemData[property]=null;if(!("game"in globalThis))for(const property of toDelete)delete newSystemData[property];newSource.system=newSystemData}};_isHeritageFeature=new WeakSet,isHeritageFeature_fn=__name2(function(feature){return feature.type==="feat"&&feature.system.featType?.value==="heritage"},"#isHeritageFeature"),_officialAncestries=new WeakMap,_heritagesWithoutAncestryInName=new WeakMap,_ancestrySlugs=new WeakMap,_heritageFromFeat=new WeakSet,heritageFromFeat_fn=__name2(function(feature){const featureSlug=feature.system.slug??"",ancestrySlug=__privateGet(this,_heritagesWithoutAncestryInName)[featureSlug]??__privateGet(this,_ancestrySlugs).find(s=>featureSlug.includes(s)),ancestryReference=__privateGet(this,_officialAncestries)[ancestrySlug??""]??null,traits=feature.system.traits,{flags}=feature;return flags.core?.sourceId&&(flags.core.sourceId=flags.core.sourceId.replace("ancestryfeatures","heritages")),{_id:randomID(),type:"heritage",img:feature.img.endsWith("/feat.svg")?"systems/pf2e/icons/default-icons/heritage.svg":feature.img,name:feature.name,effects:[],folder:feature.folder,flags:feature.flags,sort:feature.sort,ownership:feature.ownership,system:{description:feature.system.description,rules:feature.system.rules,schema:feature.system.schema,_migration:{version:null,previous:null},slug:feature.system.slug,ancestry:ancestryReference,traits:{value:traits.value.filter(t=>(t in creatureTraits||t.startsWith("hb_"))&&!(t in __privateGet(this,_officialAncestries))),rarity:traits.rarity,otherTags:[]}}}},"#heritageFromFeat"),__name2(_Migration711HeritageItems,"Migration711HeritageItems"),__publicField(_Migration711HeritageItems,"version",.711);let Migration711HeritageItems=_Migration711HeritageItems;const _Migration712ActorShieldStructure=class extends MigrationBase{static{__name(this,"_Migration712ActorShieldStructure")}async updateActor(source){if(source.type==="character"||source.type==="npc"){const attributes=source.system.attributes;attributes.shield&&(attributes["-=shield"]=null,"game"in globalThis?attributes.shield={}:delete attributes.shield)}}};__name2(_Migration712ActorShieldStructure,"Migration712ActorShieldStructure"),__publicField(_Migration712ActorShieldStructure,"version",.712);let Migration712ActorShieldStructure=_Migration712ActorShieldStructure;const _Migration713FistToStrikeRE=class extends MigrationBase{static{__name(this,"_Migration713FistToStrikeRE")}async updateItem(itemSource){const fistFeatures=["powerful-fist","martial-artist-dedication"];if(!(itemSource.type==="feat"&&fistFeatures.includes(itemSource.system.slug))||itemSource.system.rules.some(rule=>rule.key==="Strike"))return;const strike={key:"Strike",img:"systems/pf2e/icons/features/classes/powerful-fist.webp",slug:"fist",category:"unarmed",damage:{base:{damageType:"bludgeoning",dice:1,die:"d6"}},group:"brawling",label:"PF2E.Strike.Fist.Label",range:null,traits:["agile","finesse","nonlethal","unarmed"]};itemSource.system.rules=[strike]}};__name2(_Migration713FistToStrikeRE,"Migration713FistToStrikeRE"),__publicField(_Migration713FistToStrikeRE,"version",.713);let Migration713FistToStrikeRE=_Migration713FistToStrikeRE;const _Migration714RangeIncrementREs=class extends MigrationBase{static{__name(this,"_Migration714RangeIncrementREs")}farLobber={definition:{all:["weapon:base:alchemical-bomb"]},key:"AdjustStrike",mode:"upgrade",property:"range-increment",value:30};farShot={definition:{all:["weapon:ranged"]},key:"AdjustStrike",mode:"multiply",property:"range-increment",value:2};farThrow={key:"AdjustModifier",mode:"add",predicate:{all:["weapon:trait:thrown"]},selectors:["ranged-attack-roll"],slug:"range-penalty",value:1};huntPrey={key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:2",predicate:{all:["hunted-prey"]}};legendaryShot={key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:5"};masterfulHunter=(()=>({key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:3",predicate:{all:["hunted-prey",{gte:["weapon:proficiency:rank",3]}]}}))();shootistsEdge=(()=>[{key:"ActiveEffectLike",mode:"upgrade",path:"system.attributes.classDC.rank",value:3},{key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:3",phase:"beforeRoll",predicate:{all:[{gte:["weapon:proficiency:rank",3]}]}}])();triangulate=[{default:!0,key:"ToggleProperty",label:"PF2E.SpecificRule.ToggleProperty.Triangulate",property:"flags.pf2e.rollOptions.all.triangulate"},{domain:"ranged-attack-roll",key:"RollOption",option:"ignore-range-penalty:2",predicate:{all:["triangulate"]}},{key:"AdjustModifier",mode:"add",predicate:{all:["triangulate"]},selectors:["ranged-attack-roll"],slug:"range-penalty",value:1}];uncannyBombs={definition:{all:["weapon:base:alchemical-bomb"]},key:"AdjustStrike",mode:"upgrade",property:"range-increment",value:60};unerringShot=(()=>({key:"RollOption",option:"ignore-range-penalty",phase:"beforeRoll",predicate:{all:[{gte:["weapon:proficiency:rank",3]}]}}))();async updateItem(source){const{rules}=source.system;if(source.type==="feat")switch(source.system.slug){case"far-lobber":{source.system.rules=[this.farLobber];return}case"far-shot":{source.system.rules=[this.farShot];return}case"far-throw":{source.system.rules=[this.farThrow];return}case"hunt-prey":{!rules.some(r=>r.key==="RollOption"&&r.option===this.huntPrey.option)&&rules.push(this.huntPrey);return}case"legendary-shot":{source.system.rules=[this.legendaryShot];return}case"masterful-hunter":{!rules.some(r=>r.key==="RollOption"&&r.option===this.masterfulHunter.option)&&rules.push(this.masterfulHunter);return}case"shootists-edge":{source.system.rules=this.shootistsEdge;return}case"triangulate":{source.system.rules=this.triangulate;return}case"uncanny-bombs":{source.system.rules=[this.uncannyBombs];return}case"unerring-shot":{source.system.rules=[this.unerringShot];return}}}};__name2(_Migration714RangeIncrementREs,"Migration714RangeIncrementREs"),__publicField(_Migration714RangeIncrementREs,"version",.714);let Migration714RangeIncrementREs=_Migration714RangeIncrementREs;const _Migration715DangerousSorcery=class extends MigrationBase{static{__name(this,"_Migration715DangerousSorcery")}dangerousSorcery={key:"FlatModifier",phase:"afterDerived",predicate:{all:["item:spell-slot","item:duration:0","damaging-effect"]},selector:"spell-damage",value:"@spell.level"};async updateItem(source){if(source.type!=="feat")return;(source.system.slug??sluggify(source.name))==="dangerous-sorcery"&&!source.system.rules.length&&(source.system.rules=[this.dangerousSorcery])}};__name2(_Migration715DangerousSorcery,"Migration715DangerousSorcery"),__publicField(_Migration715DangerousSorcery,"version",.715);let Migration715DangerousSorcery=_Migration715DangerousSorcery;const _Migration716StrikeDamageSelector=class extends MigrationBase{static{__name(this,"_Migration716StrikeDamageSelector")}itemsToSkip=new Set(["effect-fanatical-frenzy","effect-heroic-recovery","effect-lantern-of-hope","effect-lantern-of-hope-gestalt","spell-effect-inspire-courage","spell-effect-inspire-heroics-courage-2","spell-effect-inspire-heroics-courage-3","spell-effect-stoke-the-heart"]);async updateItem(source){if(this.itemsToSkip.has(source.system.slug??""))return;const{rules}=source.system;for(const rule of rules)isObject(rule)&&["damage","mundane-damage"].includes(String(rule.selector??""))&&(rule.selector="strike-damage")}};__name2(_Migration716StrikeDamageSelector,"Migration716StrikeDamageSelector"),__publicField(_Migration716StrikeDamageSelector,"version",.716);let Migration716StrikeDamageSelector=_Migration716StrikeDamageSelector;const _Migration717TakeFeatLimits=class extends MigrationBase{static{__name(this,"_Migration717TakeFeatLimits")}levelOneOnly=new Set(["celestial-eyes","chance-death","deliberate-death","elemental-eyes","eyes-of-the-night","fiendish-eyes","gravesight","willing-death"]);maxTakeable={"additional-lore":1/0,"advanced-domain":1/0,"advanced-general-training":1/0,"animal-senses":1/0,"animal-senses-darkvision":1/0,"animal-senses-low-light-vision":1/0,"animal-senses-scent-imprecise":1/0,"armor-proficiency":3,assurance:1/0,"automatic-knowledge":1/0,"blessing-of-the-sun-gods":1/0,"consult-the-spirits":1/0,"domain-initiate":1/0,"general-training":1/0,"greater-animal-senses":1/0,"greater-sun-blessing":1/0,"hellknight-order-cross-training":1/0,"living-weapon":1/0,"magic-arrow":1/0,"modular-dynamo":1/0,multilingual:1/0,"settlement-scholastics":1/0,"skill-training":1/0,"terrain-stalker":1/0};async updateItem(source){if(source.type!=="feat")return;const slug=source.system.slug??"";source.system.traits.value.includes("lineage")||this.levelOneOnly.has(slug)?source.system.onlyLevel1=!0:"game"in globalThis&&(source.system.onlyLevel1=!1),!source.system.onlyLevel1&&slug in this.maxTakeable?source.system.maxTakable=this.maxTakeable[slug]:"game"in globalThis&&(source.system.maxTakable=1)}};__name2(_Migration717TakeFeatLimits,"Migration717TakeFeatLimits"),__publicField(_Migration717TakeFeatLimits,"version",.717);let Migration717TakeFeatLimits=_Migration717TakeFeatLimits;function isEquipped(usage,equipped){return equipped.carryType==="dropped"?!1:usage.type==="carried"?!0:usage.type!==equipped.carryType||usage.type==="worn"&&usage.where&&!equipped.inSlot?!1:usage.type==="held"?(equipped.handsHeld??0)>=(usage.hands??1):!0}__name(isEquipped,"isEquipped"),__name2(isEquipped,"isEquipped");function getUsageDetails(usage){switch(usage){case"carried":case"":return{value:"carried",type:"carried"};case"held-in-one-hand":case"held-in-one-plus-hands":return{value:usage,type:"held",hands:1};case"held-in-two-hands":return{value:usage,type:"held",hands:2};case"worn":return{value:usage,type:"worn"};case"wornarmor":case"wornamulet":case"wornanklets":case"wornarmbands":case"wornbackpack":case"wornbarding":case"wornbelt":case"wornbeltpouch":case"wornbracers":case"wornbracelet":case"worncloak":case"worncirclet":case"wornclothing":case"worncollar":case"worncrown":case"wornepaulet":case"worneyepiece":case"wornfootwear":case"worngarment":case"worngloves":case"wornheadwear":case"wornmask":case"wornnecklace":case"wornonbelt":case"wornring":case"wornshoes":case"wornhorseshoes":case"wornsaddle":case"wornwrist":return{value:usage,type:"worn",where:usage.substring(4)}}return{value:usage,type:"worn"}}__name(getUsageDetails,"getUsageDetails"),__name2(getUsageDetails,"getUsageDetails");const _Migration718CarryType=class extends MigrationBase{static{__name(this,"_Migration718CarryType")}async updateItem(itemData,actor){if(!isPhysicalData(itemData))return;const systemData=itemData.system;if(systemData.usage instanceof Object||(systemData.usage={value:"held-in-one-hand"}),systemData.usage.value==="worn-gloves")systemData.usage.value="worngloves";else if(itemData.type==="armor"){const{category}=itemData.system;systemData.usage.value=category==="shield"?"held-in-one-hand":"wornarmor"}else itemData.type==="equipment"&&systemData.slug?.startsWith("clothing-")&&(systemData.usage.value="worn");if("game"in globalThis||actor)systemData.equipped??={carryType:"worn"},systemData.equipped.carryType??="worn";else{delete systemData.equipped;return}const equipped=systemData.equipped;if(!("value"in equipped))return;if(!(actor&&["character","npc"].includes(actor.type??""))){equipped["-=value"]=null,delete equipped.value;return}const containerId=itemData.system.containerId??{value:null};if(containerId instanceof Object&&containerId.value){const inStowingContainer=actor.items.some(i=>i.type==="backpack"&&i.system.stowing&&i._id===containerId.value);if(!inStowingContainer)containerId.value=null;else if(inStowingContainer){equipped.carryType="stowed";return}}equipped.carryType="worn";const usage=getUsageDetails(systemData.usage.value);usage.type==="worn"?equipped.inSlot=!!equipped.value:usage.type==="held"&&(equipped.value&&(equipped.carryType="held"),equipped.handsHeld=equipped.value?usage.hands??1:0),equipped["-=value"]=null,delete equipped.value}};__name2(_Migration718CarryType,"Migration718CarryType"),__publicField(_Migration718CarryType,"version",.718);let Migration718CarryType=_Migration718CarryType;const _Migration719ShrugFlanking=class extends MigrationBase{static{__name(this,"_Migration719ShrugFlanking")}async updateItem(source,actorSource){const slug=source.system.slug??"";switch(source.type){case"action":{if(slug==="all-around-vision")source.system.rules=[this.allAroundVision];else if(actorSource?.type==="npc"&&source.name==="Deny Advantage"){const npcId=actorSource.flags.core?.sourceId?.replace(/^Compendium\.[^.]+\./,"")??actorSource._id;if(this.needsDenyAdvantage(source.system.rules)){const rule=this.npcDenyAvantage(npcId);source.system.rules.push(rule)}}return}case"effect":{slug==="stance-wolf-stance"&&(source.system.rules=this.wolfStanceRules);return}case"feat":{source.system.slug=source.system.slug?.replace(/^deny-advantage-level-\d$/,"deny-advantage")??null;const featSlug=source.system.slug??"";if(["constant-gaze","deny-advantage"].includes(featSlug)&&this.needsDenyAdvantage(source.system.rules))source.system.rules.push(this.denyAdvantage);else if(featSlug==="gang-up")source.system.rules=[this.gangUp];else if(featSlug.startsWith("side-by-side")){const sideBySide=this.gangUp;sideBySide.value="animal-companion",source.system.rules=[sideBySide]}else if(["pack-tactics","squad-tactics"].includes(featSlug)){const tactics=this.gangUp;tactics.value=2,source.system.rules=[tactics]}}}}get allAroundVision(){return{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.flankable",value:!1}}get denyAdvantage(){return{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.flatFootable",value:"@actor.level"}}get gangUp(){return{key:"ActiveEffectLike",mode:"add",path:"system.attributes.flanking.canGangUp",value:1}}npcVariants=new Map([["YsBSkW3aFwU1bl3w",13],["0Kb4z4h8KVqfrIju",8],["B09JfuBZHjcRXztU",4],["aaDiR0EIWRQx8wdy",3],["x4m5ks6Rd8fYzXPm",4],["qKHkamxIPbqxEiwp",6],["lCvJquCqvZJVnafy",8],["vkLhqX5oR1t89puZ",7],["aIT5S2fKgMZ6pVP2",11],["l6EuZR6zCdqyCywW",6],["QKkvnlqrhgLHuP1t",10],["ZY3q7AV1qbwWwNl2",8],["6pPolNZycfDiOl2I",8],["cQMM2Ld0IBM9GcDo",11],["VkG5yl9xcmziwpQD",4],["JrowrtDilEG8dN2s",11],["1lkay2gwgEquq0NF",6],["EMl8hARVJk8SNVyW",4],["j31HXlZiUqQrAHSB",12],["pjnTEh0NVd1DB6jI",4]]);get wolfStanceRules(){return[{category:"unarmed",damage:{base:{damageType:"piercing",dice:1,die:"d8"}},group:"brawling",key:"Strike",label:"PF2E.SpecificRule.Stance.Attack.WolfJaws",range:null,slug:"wolf-jaws",traits:["agile","backstabber","finesse","unarmed","nonlethal"]},{definition:{all:["weapon:wolf-jaws"]},key:"AdjustStrike",mode:"add",predicate:{all:["self:flanking"]},property:"traits",value:"trip"}]}npcDenyAvantage(npcId=""){const{denyAdvantage}=this;return denyAdvantage.value=this.npcVariants.get(npcId)??"@actor.level",denyAdvantage}needsDenyAdvantage(rules){return!rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="system.attributes.flanking.flatFootable")}};__name2(_Migration719ShrugFlanking,"Migration719ShrugFlanking"),__publicField(_Migration719ShrugFlanking,"version",.719);let Migration719ShrugFlanking=_Migration719ShrugFlanking;const _Migration720UpdateSpellDescriptions=class extends MigrationBase{static{__name(this,"_Migration720UpdateSpellDescriptions")}spellUUIDs=new Set(["Compendium.pf2e.spells-srd.GoKkejPj5yWJPIPK","Compendium.pf2e.spells-srd.1b55SgYTV65JvmQd","Compendium.pf2e.spells-srd.b515AZlB0sridKSq","Compendium.pf2e.spells-srd.NBSBFHxBm88qxQUy","Compendium.pf2e.spells-srd.9TauMFkIsmvKJNzZ","Compendium.pf2e.spells-srd.LoBjvguamA12iyW0","Compendium.pf2e.spells-srd.IWUe32Y5k2QFd7YQ","Compendium.pf2e.spells-srd.WBmvzNDfpwka3qT4"]);spells=UUIDUtils.fromUUIDs([...this.spellUUIDs]);async updateItem(source){if(!(source.type==="spell"&&setHasElement(this.spellUUIDs,source.flags.core?.sourceId)))return;const spell=(await this.spells).find(s=>s instanceof SpellPF2e&&s.slug===source.system.slug);spell&&(source.system.description.value=spell.description)}};__name2(_Migration720UpdateSpellDescriptions,"Migration720UpdateSpellDescriptions"),__publicField(_Migration720UpdateSpellDescriptions,"version",.72);let Migration720UpdateSpellDescriptions=_Migration720UpdateSpellDescriptions;const _Migration721SetReloadValues=class extends MigrationBase{static{__name(this,"_Migration721SetReloadValues")}toUpdate=new Set(["air-repeater","composite-longbow","composite-shortbow","godsbreath-bow","hunters-bow","long-air-repeater","longbow","oathbow","repeating-crossbow","repeating-hand-crossbow","shortbow","singing-shortbow-greater","singing-shortbow","sky-piercing-bow"]);async updateItem(source){source.type==="weapon"&&setHasElement(this.toUpdate,source.system.slug)&&(source.system.reload.value="0")}};__name2(_Migration721SetReloadValues,"Migration721SetReloadValues"),__publicField(_Migration721SetReloadValues,"version",.721);let Migration721SetReloadValues=_Migration721SetReloadValues;const _Migration722CraftingSystemData=class extends MigrationBase{static{__name(this,"_Migration722CraftingSystemData")}async updateActor(source){if(source.type!=="character")return;if(!isObject(source.system.crafting)){const filledCrafting={entries:{},formulas:[]};source.system.crafting=filledCrafting}const crafting=source.system.crafting??{};(!isObject(crafting.entries)||Array.isArray(crafting.entries))&&(crafting.entries={}),Array.isArray(crafting.formulas)||(crafting.formulas=[])}};__name2(_Migration722CraftingSystemData,"Migration722CraftingSystemData"),__publicField(_Migration722CraftingSystemData,"version",.722);let Migration722CraftingSystemData=_Migration722CraftingSystemData;const _Migration723CumulativeItemBonuses=class extends MigrationBase{static{__name(this,"_Migration723CumulativeItemBonuses")}stanceFeats=(async()=>(await UUIDUtils.fromUUIDs(["Compendium.pf2e.feats-srd.ZPclfDmiHzEqblry","Compendium.pf2e.feats-srd.ZL5UU9quCTvcWzfY","Compendium.pf2e.feats-srd.n2hawNmzW7DBn1Lm","Compendium.pf2e.feats-srd.hO4sKslTrSQMLbGx"])).filter(d=>d instanceof FeatPF2e&&!!d.slug).reduce((record,f)=>({...record,[f.slug]:f}),{}))();mountainPattern=/^mountain-(?:stance|stronghold|quake)$/;async updateActor(source){if(source.type!=="character")return;const effects=source.items.filter(i=>i.type==="effect");for(const effect of effects)effect.system.slug?.startsWith("stance-mountain")&&source.items.findSplice(i=>i===effect)}async updateItem(source){if(source.system.slug)switch(source.type){case"feat":{if(source.system.slug==="animal-skin"){const feat=(await this.stanceFeats)[source.system.slug];feat&&(source.system.rules=feat.toObject().system.rules)}else if(this.mountainPattern.test(source.system.slug)){const feat=(await this.stanceFeats)[source.system.slug];feat&&(source.system.description.value=feat.description)}return}case"equipment":{if(!source.system.slug.startsWith("bracers-of-armor-"))return;for(const rule of source.system.rules)rule.key==="FlatModifier"&&(rule.slug="bracers-of-armor");return}case"effect":{if(source.system.slug!=="spell-effect-mage-armor")return;for(const rule of source.system.rules)rule.key==="FlatModifier"&&(rule.slug="mage-armor")}}}async updateMacro(source){source.type==="script"&&source.command.includes("Stance: Mountain Stance")&&(source.command=String.raw`const actors = canvas.tokens.controlled.flatMap((token) => token.actor ?? []); + `},"askLevelPopupTemplate");function showXP(partyLevel,partySize,npcLevels,hazards){const xp=game.pf2e.gm.calculateXP(partyLevel,partySize,npcLevels,hazards,{proficiencyWithoutLevel:game.settings.get("pf2e","proficiencyVariant")});new Dialog({title:"XP",content:dialogTemplate(xp),buttons:{}}).render(!0)}__name(showXP,"showXP"),__name2(showXP,"showXP");function askPartyLevelAndSize(npcLevels,hazards){new Dialog({title:"Party Information",content:askLevelPopupTemplate,buttons:{no:{icon:'',label:"Cancel"},yes:{icon:'',label:"Calculate XP",callback:$html=>{const html=$html[0],partySize=Math.abs(Math.trunc(Number(htmlQuery(html,"[name=party-size]")?.value||1))),partyLevel=Math.abs(Math.trunc(Number(htmlQuery(html,"[name=party-level]")?.value||1)));localStorage.setItem("xpMacroPartySize",partySize.toString()),localStorage.setItem("xpMacroPartyLevel",partyLevel.toString()),showXP(partyLevel,partySize,npcLevels,hazards)}}},default:"yes"}).render(!0)}__name(askPartyLevelAndSize,"askPartyLevelAndSize"),__name2(askPartyLevelAndSize,"askPartyLevelAndSize");function xpFromEncounter(){const actors=canvas.tokens.controlled.flatMap(a=>a.actor??[]).filter(a=>!a.traits.has("minion")),npcLevels=getLevels(actors,"opposition"),pcLevels=getLevels(actors,"party"),hazards=getHazards(actors);if(npcLevels.length===0&&hazards.length===0){ui.notifications.error("You must select at least one opposition and/or hazard token and optionally all PC tokens");return}pcLevels.length===0?askPartyLevelAndSize(npcLevels,hazards):showXP(pcLevels[0],pcLevels.length,npcLevels,hazards)}__name(xpFromEncounter,"xpFromEncounter"),__name2(xpFromEncounter,"xpFromEncounter");const xpVariantCreatureDifferences=new Map([[-7,9],[-6,12],[-5,14],[-4,18],[-3,21],[-2,26],[-1,32],[0,40],[1,48],[2,60],[3,72],[4,90],[5,108],[6,135],[7,160]]),xpCreatureDifferences=new Map([[-4,10],[-3,15],[-2,20],[-1,30],[0,40],[1,60],[2,80],[3,120],[4,160]]),xpSimpleHazardDifferences=new Map([[-4,2],[-3,3],[-2,4],[-1,6],[0,8],[1,12],[2,16],[3,24],[4,32]]);function getXPFromMap(partyLevel,entityLevel,values){const difference2=entityLevel+1-(partyLevel+1),range=Math.floor(values.size/2),boundedDifference=Math.clamped(difference2,0-range,range);return values.get(boundedDifference)??0}__name(getXPFromMap,"getXPFromMap"),__name2(getXPFromMap,"getXPFromMap");function calculateCreatureXP(partyLevel,npcLevel,dcOptions){return dcOptions.proficiencyWithoutLevel?getXPFromMap(partyLevel,npcLevel,xpVariantCreatureDifferences):getXPFromMap(partyLevel,npcLevel,xpCreatureDifferences)}__name(calculateCreatureXP,"calculateCreatureXP"),__name2(calculateCreatureXP,"calculateCreatureXP");function getHazardXp(partyLevel,hazard,dcOptions){return hazard.isComplex?calculateCreatureXP(partyLevel,hazard.level,dcOptions):getXPFromMap(partyLevel,hazard.level,xpSimpleHazardDifferences)}__name(getHazardXp,"getHazardXp"),__name2(getHazardXp,"getHazardXp");function generateEncounterBudgets(partySize){const budget=partySize*20;return{trivial:Math.floor(budget*.5),low:Math.floor(budget*.75),moderate:budget,severe:Math.floor(budget*1.5),extreme:Math.floor(budget*2)}}__name(generateEncounterBudgets,"generateEncounterBudgets"),__name2(generateEncounterBudgets,"generateEncounterBudgets");const rewardEncounterBudgets=generateEncounterBudgets(4);function calculateEncounterRating(challenge,budgets){return challenge<=budgets.trivial?"trivial":challenge<=budgets.low?"low":challenge<=budgets.moderate?"moderate":challenge<=budgets.severe?"severe":"extreme"}__name(calculateEncounterRating,"calculateEncounterRating"),__name2(calculateEncounterRating,"calculateEncounterRating");function calculateXP(partyLevel,partySize,npcLevels,hazards,dcOptions){const creatureChallenge=npcLevels.map(level=>calculateCreatureXP(partyLevel,level,dcOptions)).reduce((a,b)=>a+b,0),hazardChallenge=hazards.map(hazard=>getHazardXp(partyLevel,hazard,dcOptions)).reduce((a,b)=>a+b,0),totalXP=creatureChallenge+hazardChallenge,encounterBudgets=generateEncounterBudgets(partySize),rating=calculateEncounterRating(totalXP,encounterBudgets),ratingXP=rewardEncounterBudgets[rating];return{partyLevel,partySize,totalXP,encounterBudgets,rating,ratingXP,xpPerPlayer:Math.floor(totalXP/partySize*4)}}__name(calculateXP,"calculateXP"),__name2(calculateXP,"calculateXP");const _EncounterPF2e=class extends Combat{static{__name(this,"_EncounterPF2e")}_sortCombatants(a,b){const resolveTie=__name2(()=>{const[priorityA,priorityB]=[a,b].map(combatant=>combatant.overridePriority(combatant.initiative??0)??(combatant.actor?.system.attributes.initiative?combatant.actor.system.attributes.initiative.tiebreakPriority:3));return priorityA===priorityB?a.id.localeCompare(b.id):priorityA-priorityB},"resolveTie");return typeof a.initiative=="number"&&typeof b.initiative=="number"&&a.initiative===b.initiative?resolveTie():super._sortCombatants(a,b)}getCombatantWithHigherInit(a,b){const sortResult=this._sortCombatants(a,b);return sortResult>0?b:sortResult<0?a:null}analyze(){if(!game.ready)return null;const{party}=game.actors,partyMembers=party?.members.filter(a=>a.alliance==="party"&&isReallyPC(a))??[],fightyPartyMembers=(()=>{const inEncounter=partyMembers.filter(m=>m.combatant?.encounter===this);return inEncounter.length>0?inEncounter:partyMembers})(),opposition=uniq(this.combatants.filter(c=>!!(c.actor?.alliance==="opposition"||c.actor?.isOfType("hazard"))&&!partyMembers.includes(c.actor)).flatMap(c=>c.actor??[]));if(!party||fightyPartyMembers.length===0||opposition.length===0)return null;const partyLevel=Math.round(meanBy(fightyPartyMembers.filter(m=>m.isOfType("character")),m=>m.level)),result=calculateXP(partyLevel,fightyPartyMembers.length,opposition.filter(e=>e.isOfType("character","npc")).map(e=>e.level),opposition.filter(e=>e.isOfType("hazard")),{proficiencyWithoutLevel:game.settings.get("pf2e","proficiencyVariant")}),threat=result.rating,budget={spent:result.totalXP,max:result.encounterBudgets[threat],partyLevel},award={xp:Math.floor(result.xpPerPlayer*(fightyPartyMembers.length/partyMembers.length)),recipients:partyMembers};return{threat,budget,award,participants:{party:fightyPartyMembers,opposition}}}prepareDerivedData(){super.prepareDerivedData(),this.metrics=this.analyze()}async createEmbeddedDocuments(embeddedName,data,context={}){const createData=data.filter(datum=>{const token=canvas.tokens.placeables.find(canvasToken=>canvasToken.id===datum.tokenId);if(!token)return!1;const{actor}=token;if(!actor)return ui.notifications.warn(`${token.name} has no associated actor.`),!1;const actorTraits=actor.traits;if(actor.type==="loot"||["minion","eidolon"].some(t=>actorTraits.has(t))){const actorTypes2=CONFIG.PF2E.actorTypes,type=game.i18n.localize(actorTraits.has("minion")?CONFIG.PF2E.creatureTraits.minion:actorTraits.has("eidolon")?CONFIG.PF2E.creatureTraits.eidolon:actorTypes2[actor.type]);return ui.notifications.info(game.i18n.format("PF2E.Encounter.ExcludingFromInitiative",{type,actor:actor.name})),!1}return!0});return super.createEmbeddedDocuments(embeddedName,createData,context)}async rollInitiative(ids,options={}){const extraRollOptions=options.extraRollOptions??[],rollMode=options.messageOptions?.rollMode??options.rollMode;options.secret&&extraRollOptions.push("secret");const fightyCombatants=ids.flatMap(id=>this.combatants.get(id)??[]).filter(c=>!!c.actor?.initiative),initiatives=(await Promise.all(fightyCombatants.map(async combatant=>combatant.actor?.initiative?.roll({...options,combatant,extraRollOptions,updateTracker:!1,rollMode})??null))).flatMap(result=>result?{id:result.combatant.id,value:result.roll.total,statistic:result.roll.options.domains?.find(s=>setHasElement(SKILL_LONG_FORMS,s)||s==="perception")??null}:[]);await this.setMultipleInitiatives(initiatives);const remainingIds=ids.filter(id=>!fightyCombatants.some(c=>c.id===id));return super.rollInitiative(remainingIds,options)}async setMultipleInitiatives(initiatives){const currentId=this.combatant?.id,updates=initiatives.map(i=>({_id:i.id,initiative:i.value,flags:{pf2e:{initiativeStatistic:i.statistic??null,overridePriority:{[i.value]:i.overridePriority}}}}));await this.updateEmbeddedDocuments("Combatant",updates),await this.update({turn:this.turns.findIndex(c=>c.id===currentId)})}async setInitiative(id,value){const combatant=this.combatants.get(id,{strict:!0});if(combatant.actor?.isOfType("character","npc"))return this.setMultipleInitiatives([{id:combatant.id,value,statistic:combatant.actor.attributes.initiative.statistic||"perception"}]);super.setInitiative(id,value)}async resetActors(){const actors=this.combatants.contents.flatMap(c=>c.actor??[]);resetActors(actors,{rerender:!1})}_onCreate(data,options,userId){super._onCreate(data,options,userId);const pcSheets=Object.values(ui.windows).filter(sheet=>sheet.constructor.name==="CharacterSheetPF2e");for(const sheet of pcSheets)sheet.toggleInitiativeLink()}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId),game.pf2e.StatusEffects.onUpdateEncounter(this);const{combatant,previous}=this,actor=combatant?.actor;if(!this.started)return;const[newRound,newTurn]=[changed.round,changed.turn],isRoundChange=typeof newRound=="number",isTurnChange=typeof newTurn=="number",isNextRound=isRoundChange&&(previous.round===null||newRound>previous.round),isNextTurn=isTurnChange&&(previous.turn===null||newTurn>previous.turn);(isRoundChange||isTurnChange)&&Promise.resolve().then(async()=>{if(isNextRound||isNextTurn){const previousCombatant=this.combatants.get(previous.combatantId??"");if(game.user===previousCombatant?.actor?.primaryUpdater){const alreadyWent=previousCombatant.flags.pf2e.roundOfLastTurnEnd===previous.round;typeof previous.round=="number"&&!alreadyWent&&await previousCombatant.endTurn({round:previous.round})}if(game.user===actor?.primaryUpdater){const alreadyWent=combatant?.roundOfLastTurn===this.round;combatant&&!alreadyWent&&await combatant.startTurn()}}this.resetActors(),await game.pf2e.effectTracker.refresh(),game.pf2e.effectPanel.refresh()})}_onDelete(options,userId){if(super._onDelete(options,userId),this.started&&(Hooks.callAll("pf2e.endTurn",this.combatant??null,this,userId),game.pf2e.effectTracker.onEncounterEnd(this)),!game.combat){const pcSheets=Object.values(ui.windows).filter(sheet=>sheet.constructor.name==="CharacterSheetPF2e");for(const sheet of pcSheets)sheet.toggleInitiativeLink()}game.user.clearTargets(),this.resetActors()}async _manageTurnEvents(adjustedTurn){if(this.previous||game.release.generation>11)return super._manageTurnEvents(adjustedTurn)}};__name2(_EncounterPF2e,"EncounterPF2e");let EncounterPF2e=_EncounterPF2e;const _CombatantPF2e=class extends Combatant{static{__name(this,"_CombatantPF2e")}get encounter(){return this.parent}get roundOfLastTurn(){return this.flags.pf2e.roundOfLastTurn}get playersCanSeeName(){return!!this.token?.playersCanSeeName}overridePriority(initiative){return this.flags.pf2e.overridePriority[initiative]??null}hasHigherInitiative({than}){if(this.parent.id!==than.parent.id)throw ErrorPF2e("The initiative of Combatants from different combats cannot be compared");return this.parent.getCombatantWithHigherInit(this,than)===this}static async fromActor(actor,render=!0,options={}){if(!game.combat)return ui.notifications.error(game.i18n.localize("PF2E.Encounter.NoActiveEncounter")),null;const token=actor.getActiveTokens().pop(),existing=game.combat.combatants.find(combatant=>combatant.actor===actor);return existing||(token?(await(options.combat??game.combat).createEmbeddedDocuments("Combatant",[{tokenId:token.id,actorId:token.actor?.id,sceneId:token.scene.id,hidden:token.document.hidden}],{render})).at(0)??null:(ui.notifications.error(game.i18n.format("PF2E.Encounter.NoTokenInScene",{actor:actor.name})),null))}static async createDocuments(data=[],context={}){const entries=data.map(d=>({token:(d.sceneId?game.scenes.get(d.sceneId):context.parent?.scene)?.tokens.get(d.tokenId??"")||null,data:d})),tokens=entries.map(e=>e.token);for(const token of tokens)token?.actor?.isOfType("party")&&await token?.actor.addToCombat({combat:context.parent});const nonPartyData=entries.filter(e=>!e.token?.actor?.isOfType("party")).map(e=>e.data);return super.createDocuments(nonPartyData,context)}async startTurn(){const{actor,encounter}=this;if(!encounter||!actor)return;const actorUpdates={};for(const rule of actor.rules)await rule.onTurnStart?.(actorUpdates);await this.update({"flags.pf2e.roundOfLastTurn":encounter.round}),Object.keys(actorUpdates).length>0&&await actor.update(actorUpdates);for(const effect of actor.itemTypes.effect)await effect.onTurnStartEnd("start");if(actor.isOfType("character")&&actor.familiar)for(const effect of actor.familiar.itemTypes.effect)await effect.onTurnStartEnd("start");Hooks.callAll("pf2e.startTurn",this,encounter,game.user.id)}async endTurn(options){const round=options.round,{actor,encounter}=this;if(!encounter||!actor)return;const activeConditions=actor.conditions.active;for(const condition of activeConditions)await condition.onEndTurn({token:this.token});for(const effect of actor.itemTypes.effect)await effect.onTurnStartEnd("end");if(actor.isOfType("character")&&actor.familiar)for(const effect of actor.familiar.itemTypes.effect)await effect.onTurnStartEnd("end");await this.update({"flags.pf2e.roundOfLastTurnEnd":round}),Hooks.callAll("pf2e.endTurn",this,encounter,game.user.id)}prepareBaseData(){super.prepareBaseData(),this.flags.pf2e=mergeObject(this.flags.pf2e??{},{overridePriority:{}}),this.flags.pf2e.roundOfLastTurn??=null,this.flags.pf2e.initiativeStatistic??=null}async toggleDefeated({to=!this.isDefeated}={}){to!==this.isDefeated&&(await this.update({defeated:to}),await this.token?.object?.toggleEffect(game.settings.get("pf2e","deathIcon"),{active:to,overlay:!0}),this.isDefeated&&this.token?.object?.isTargeted&&this.token.object.setTarget(!1,{releaseOthers:!1}))}updateResource(){return this.isNPC&&!game.user.isGM?this.resource=null:super.updateResource()}_getInitiativeFormula(){const{actor}=this;if(!actor)return"1d20";let bonus=0;return typeof actor.attributes.initiative?.totalModifier=="number"?bonus=actor.attributes.initiative.totalModifier:actor.attributes.perception&&(bonus=actor.attributes.perception.value),["1d20",bonus||0].join("+")}async toggleNameVisibility(){if(!this.token)return;const currentVisibility=this.token.displayName,visibilityToggles={[CONST.TOKEN_DISPLAY_MODES.ALWAYS]:CONST.TOKEN_DISPLAY_MODES.OWNER,[CONST.TOKEN_DISPLAY_MODES.CONTROL]:CONST.TOKEN_DISPLAY_MODES.HOVER,[CONST.TOKEN_DISPLAY_MODES.HOVER]:CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER,[CONST.TOKEN_DISPLAY_MODES.NONE]:CONST.TOKEN_DISPLAY_MODES.HOVER,[CONST.TOKEN_DISPLAY_MODES.OWNER]:CONST.TOKEN_DISPLAY_MODES.ALWAYS,[CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER]:CONST.TOKEN_DISPLAY_MODES.HOVER};await this.token.update({displayName:visibilityToggles[currentVisibility]})}_onUpdate(changed,options,userId){if(super._onUpdate(changed,options,userId),this.encounter?.started&&typeof changed.initiative=="number"&&this.encounter.resetActors(),changed.defeated&&game.user.id===userId)for(const action2 of this.actor?.itemTypes.action??[])action2.system.deathNote&&action2.toMessage(void 0,{rollMode:this.actor?.hasPlayerOwner?"publicroll":"gmroll"})}_onDelete(options,userId){super._onDelete(options,userId),this.encounter?.started&&this.encounter.resetActors()}};__name2(_CombatantPF2e,"CombatantPF2e");let CombatantPF2e=_CombatantPF2e;const _ActorInitiative=class{static{__name(this,"_ActorInitiative")}actor;statistic;get attribute(){return this.statistic.attribute}get ability(){return foundry.utils.logCompatibilityWarning("`ActorInitiative#ability` is deprecated. Use `ActorInitiative#attribute` instead.",{since:"5.3.0",until:"6.0.0"}),this.attribute}constructor(actor){this.actor=actor;const initiativeSkill=actor.isOfType("hazard")?"stealth":actor.isOfType("character","npc")?actor.attributes.initiative?.statistic||"perception":null,base=initiativeSkill?actor.getStatistic(initiativeSkill):null,ponderousPenalty=actor.isOfType("character")?createPonderousPenalty(actor):null,rollLabel=game.i18n.format("PF2E.InitiativeWithSkill",{skillName:base?.label??""}),data={slug:"initiative",label:base?.label??"PF2E.InitiativeLabel",domains:["initiative"],rollOptions:[base?.slug??[]].flat(),check:{type:"initiative",label:rollLabel},modifiers:[ponderousPenalty??[]].flat()};this.statistic=base?base.extend(data):new Statistic(actor,data)}async roll(args={}){const combatant=args.combatant?.actor===this.actor?args.combatant:await CombatantPF2e.fromActor(this.actor,!1);if(!combatant)return null;combatant.hidden&&(args.rollMode=CONST.DICE_ROLL_MODES.PRIVATE);const roll=await this.statistic.roll(args);return roll?((args.updateTracker??!0)&&combatant.encounter.setInitiative(combatant.id,roll.total),{combatant,roll}):(game.combats.render(!1),null)}getTraceData(){const initiativeData=this.actor.attributes.initiative,tiebreakPriority=initiativeData?.tiebreakPriority??0;return{...this.statistic.getTraceData(),statistic:initiativeData?.statistic??"perception",tiebreakPriority}}};__name2(_ActorInitiative,"ActorInitiative");let ActorInitiative=_ActorInitiative;const _CreatureSizeRuleElement=class _CreatureSizeRuleElement2 extends RuleElementPF2e{static{__name(this,"_CreatureSizeRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_getReach),typeof this.value=="string"||typeof this.value=="number"||this.isBracketedValue(this.value)||this.failValidation("value must be a number, string, or bracketed value")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1}),reach:new RecordField(new fields2.StringField({required:!0,nullable:!1,choices:["add","upgrade","override"]}),new ResolvableValueField({required:!0,nullable:!1}),{required:!1,nullable:!1,initial:void 0}),resizeEquipment:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),minimumSize:new fields2.StringField({required:!1,nullable:!1,choices:SIZES,initial:void 0}),maximumSize:new fields2.StringField({required:!1,nullable:!1,choices:SIZES,initial:void 0})}}incrementSize(size,amount){return amount===0?size:this.incrementSize(_CreatureSizeRuleElement2.incrementMap[size],amount-1)}decrementSize(size,amount){return amount===0?size:this.decrementSize(_CreatureSizeRuleElement2.decrementMap[size],amount-1)}beforePrepareData(){if(!this.test())return;const value=this.resolveValue(this.value);if(!(typeof value=="string"||typeof value=="number")){this.failValidation(`CreatureSize Rule Element on actor ${this.actor.id} (${this.actor.name})`,"has a non-string, non-numeric value");return}const size=_CreatureSizeRuleElement2.wordToAbbreviation[value]??value;if(typeof size=="string"&&!tupleHasValue(SIZES,size)){this.failValidation(`"${size}" is not a recognized size`);return}const{actor}=this,originalSize=new ActorSizePF2e({value:actor.size});if(value===1){if(this.maximumSize&&!originalSize.isSmallerThan(this.maximumSize))return;actor.system.traits.size.increment()}else if(value===-1){if(this.minimumSize&&!originalSize.isLargerThan(this.minimumSize))return;actor.system.traits.size.decrement()}else if(tupleHasValue(SIZES,size))actor.system.traits.size=new ActorSizePF2e({value:size});else{const validValues=Array.from(new Set(Object.entries(_CreatureSizeRuleElement2.wordToAbbreviation).flat())).join('", "');this.failValidation(`CreatureSize Rule Element on actor ${actor.id} (${actor.name})`,`has an invalid value: must be one of "${validValues}", +1, or -1`);return}const{reach}=actor.system.attributes;if(reach.base=__privateMethod(this,_getReach,getReach_fn).call(this,originalSize),reach.manipulate=Math.max(reach.manipulate,reach.base),this.resizeEquipment){const sizeDifference=originalSize.difference(actor.system.traits.size,{smallIsMedium:!0});for(const item of actor.inventory.filter(i=>!(i instanceof TreasurePF2e&&i.isCoinage)))sizeDifference<0?item.system.size=this.incrementSize(item.size,Math.abs(sizeDifference)):sizeDifference>0&&(item.system.size=this.decrementSize(item.size,Math.abs(sizeDifference)))}}};_getReach=new WeakSet,getReach_fn=__name2(function(originalSize){const current=this.actor.attributes.reach.base;if(this.reach){const changeValue=(()=>{const resolved=this.resolveValue(this.reach.add??this.reach.upgrade??this.reach.override);return Math.trunc(Math.abs(Number(resolved)))})();if(!Number.isInteger(changeValue))return current;if(this.reach.add)return current+changeValue;if(this.reach.upgrade)return Math.max(current,changeValue);if(this.reach.override)return changeValue}const newSize=this.actor.system.traits.size;return newSize.isLargerThan(originalSize)?Math.max(SIZE_TO_REACH[this.actor.size],current):newSize.isSmallerThan(originalSize)?Math.min(SIZE_TO_REACH[this.actor.size],current):current},"#getReach"),__name2(_CreatureSizeRuleElement,"CreatureSizeRuleElement"),__publicField(_CreatureSizeRuleElement,"validActorTypes",["character","npc","familiar"]),__publicField(_CreatureSizeRuleElement,"wordToAbbreviation",{tiny:"tiny",small:"sm",medium:"med",large:"lg",huge:"huge",gargantuan:"grg"}),__publicField(_CreatureSizeRuleElement,"incrementMap",{tiny:"sm",sm:"med",med:"lg",lg:"huge",huge:"grg",grg:"grg"}),__publicField(_CreatureSizeRuleElement,"decrementMap",{tiny:"tiny",sm:"tiny",med:"sm",lg:"med",huge:"lg",grg:"huge"});let CreatureSizeRuleElement=_CreatureSizeRuleElement;const _IWRRuleElement=class extends RuleElementPF2e{static{__name(this,"_IWRRuleElement")}constructor(){super(...arguments),__privateAdd(this,_isValid)}static get dictionary(){return{}}static defineSchema(){const{fields:fields2}=foundry.data,{DataModelValidationFailure}=foundry.data.validation;return{...super.defineSchema(),mode:new fields2.StringField({required:!0,choices:["add","remove"],initial:"add"}),type:new fields2.ArrayField(new StrictStringField({required:!0,blank:!1,initial:void 0}),{validate:v=>Array.isArray(v)&&v.length>0||new DataModelValidationFailure({message:"must have at least one"})}),definition:new PredicateField({required:!1,initial:void 0}),exceptions:this.createExceptionsField(),override:new fields2.BooleanField}}static createExceptionsField(types){const customExceptionField=new foundry.data.fields.SchemaField({definition:new PredicateField({initial:void 0}),label:new StrictStringField({required:!0,blank:!1,initial:void 0})},{required:!0,initial:void 0}),exceptionField=new DataUnionField([new StrictStringField({required:!0,blank:!1,initial:void 0,choices:types}),customExceptionField],{required:!0,nullable:!1,initial:void 0});return new StrictArrayField(exceptionField)}static validateJoint(source){if(super.validateJoint(source),source.type.some(t=>t==="custom")){if(source.type.length>1)throw Error(' type: "custom" may not be included among other types');if(!source.definition)throw Error(" definition: must be present if defining a custom type")}else if(source.definition)throw Error(" definition: may only be present if defining a custom type");if(source.mode==="remove"&&source.exceptions.length>0)throw Error(' exceptions: may not be included with a mode of "remove"')}afterPrepareData(){if(!this.test())return;this.type=this.resolveInjectedProperties(this.type),this.definition=this.resolveInjectedProperties(this.definition);const value=Math.floor(Number(this.resolveValue(this.value)));if(__privateMethod(this,_isValid,isValid_fn).call(this,value))if(this.mode==="add")this.property.push(...this.getIWR(value));else for(const toRemove of this.type)this.property.findSplice(iwr=>iwr.type===toRemove)}};_isValid=new WeakSet,isValid_fn=__name2(function(value){const{dictionary}=this.constructor,unrecognizedTypes=this.type.filter(t=>!(t in dictionary));if(unrecognizedTypes.length>0){for(const type of unrecognizedTypes)this.failValidation(`Type "${type}" is unrecognized`);return!1}return this.mode==="add"&&dictionary!==CONFIG.PF2E.immunityTypes&&(typeof value!="number"||value<0)?(this.failValidation("A `value` must be a positive number"),!1):!0},"#isValid"),__name2(_IWRRuleElement,"IWRRuleElement");let IWRRuleElement=_IWRRuleElement;const _ImmunityRuleElement=class extends IWRRuleElement{static{__name(this,"_ImmunityRuleElement")}value=null;static defineSchema(){return{...super.defineSchema(),exceptions:this.createExceptionsField(this.dictionary)}}static get dictionary(){return CONFIG.PF2E.immunityTypes}get property(){return this.actor.system.attributes.immunities}getIWR(){const immunities=this.property;return this.type.map(t=>new Immunity({type:t,customLabel:t==="custom"?this.label:null,definition:this.definition,exceptions:this.exceptions,source:this.item.name})).filter(immunity=>!immunities.find(i=>i.type===immunity.type&&(this.exceptions.length===0||equals(i.exceptions,this.exceptions))&&equals(i.definition,this.definition??null))||this.mode==="remove")}};__name2(_ImmunityRuleElement,"ImmunityRuleElement");let ImmunityRuleElement=_ImmunityRuleElement;const _ResistanceRuleElement=class extends IWRRuleElement{static{__name(this,"_ResistanceRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0}),exceptions:this.createExceptionsField(this.dictionary),doubleVs:this.createExceptionsField(this.dictionary)}}static get dictionary(){return CONFIG.PF2E.resistanceTypes}get property(){return this.actor.system.attributes.resistances}getIWR(value){if(value<=0)return[];const resistances=this.property;for(const resistanceType of[...this.type]){const current=resistances.find(r=>r.type===resistanceType&&equals(r.exceptions,this.exceptions)&&equals(r.doubleVs,this.doubleVs)&&equals(r.definition,this.definition??null));current&&(this.override?resistances.splice(resistances.indexOf(current),1):this.mode!=="remove"&&(current.value=Math.max(current.value,value),current.source=this.label,this.type.splice(this.type.indexOf(resistanceType),1)))}return this.type.map(t=>new Resistance({type:t,value,customLabel:t==="custom"?this.label:null,definition:this.definition,exceptions:this.exceptions,doubleVs:this.doubleVs,source:this.item.name}))}};__name2(_ResistanceRuleElement,"ResistanceRuleElement");let ResistanceRuleElement=_ResistanceRuleElement;const _WeaknessRuleElement=class extends IWRRuleElement{static{__name(this,"_WeaknessRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0}),exceptions:this.createExceptionsField(this.dictionary)}}static get dictionary(){return CONFIG.PF2E.weaknessTypes}get property(){return this.actor.system.attributes.weaknesses}getIWR(value){if(value<=0)return[];const weaknesses=this.property;for(const weaknessType of[...this.type]){const current=weaknesses.find(w=>w.type===weaknessType&&equals(w.exceptions,this.exceptions)&&equals(w.definition,this.definition??null));current&&(this.override?weaknesses.splice(weaknesses.indexOf(current),1):this.mode!=="remove"&&(current.value=Math.max(current.value,value),current.source=this.label,this.type.splice(this.type.indexOf(weaknessType),1)))}return this.type.map(t=>new Weakness({type:t,customLabel:t==="custom"?this.label:null,definition:this.definition,value,exceptions:this.exceptions,source:this.item.name}))}};__name2(_WeaknessRuleElement,"WeaknessRuleElement");let WeaknessRuleElement=_WeaknessRuleElement;const _SenseRuleElement=class extends RuleElementPF2e{static{__name(this,"_SenseRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,nullable:!1,choices:[...SENSE_TYPES]}),force:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),acuity:new fields2.StringField({required:!1,nullable:!1,choices:SENSE_ACUITIES,initial:void 0}),range:new ResolvableValueField({required:!1,nullable:!1,initial:void 0})}}constructor(data,options){data.selector&&(data.label??=CONFIG.PF2E.senses[data.selector]),super(data,options)}beforePrepareData(){if(this.ignored)return;const range=this.resolveValue(this.range,""),newSense=new CreatureSensePF2e({type:this.selector,acuity:this.acuity,value:String(range),source:this.item.name});this.actor.synthetics.senses.push({sense:newSense,predicate:this.predicate,force:this.force})}};__name2(_SenseRuleElement,"SenseRuleElement"),__publicField(_SenseRuleElement,"validActorTypes",["character","familiar"]);let SenseRuleElement=_SenseRuleElement;const _StrikeRuleElement=class extends RuleElementPF2e{static{__name(this,"_StrikeRuleElement")}constructor(source,options){source.img??=source.fist?"icons/skills/melee/unarmed-punch-fist.webp":options.parent.img,super(source,options),__privateAdd(this,_constructWeapon),this.fist&&(this.label=game.i18n.localize("PF2E.Weapon.Base.fist")),this.slug??=sluggify(this.label),this.battleForm??=!1,this.fist??=!1,this.options??=[],this.graspingAppendage=["fist","claw"].includes(this.baseType??"")?!0:this.category==="unarmed"||this.traits.includes("unarmed")?!!this.graspingAppendage:!1}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),category:new fields2.StringField({required:!0,blank:!1,choices:CONFIG.PF2E.weaponCategories,initial:"unarmed"}),group:new fields2.StringField({required:!0,nullable:!0,blank:!1,choices:CONFIG.PF2E.weaponGroups,initial:null}),baseType:new fields2.StringField({required:!0,nullable:!0,blank:!1,choices:CONFIG.PF2E.baseWeaponTypes,initial:null}),traits:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,choices:CONFIG.PF2E.npcAttackTraits})),traitToggles:new fields2.SchemaField({modular:new fields2.StringField({required:!0,blank:!1,nullable:!0,choices:CONFIG.PF2E.damageTypes,initial:null}),versatile:new fields2.StringField({required:!0,blank:!1,nullable:!0,choices:CONFIG.PF2E.damageTypes,initial:null})},{required:!0,nullable:!1,initial:{modular:null,versatile:null}}),otherTags:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,choices:CONFIG.PF2E.otherWeaponTags}),{required:!1,nullable:!1,initial:[]}),range:new fields2.SchemaField({increment:new fields2.NumberField({required:!1,integer:!0,min:5,nullable:!0,initial:5}),max:new fields2.NumberField({required:!1,integer:!0,min:5,nullable:!0,initial:null})},{required:!1,nullable:!0,initial:null}),damage:new fields2.SchemaField({base:new fields2.SchemaField({damageType:new fields2.StringField({required:!0,blank:!1,initial:"bludgeoning"}),dice:new ResolvableValueField({required:!0,nullable:!1,initial:1}),die:new fields2.StringField({required:!0,choices:CONFIG.PF2E.damageDie,initial:"d4"}),modifier:new fields2.NumberField({nullable:!1,integer:!0,initial:0})})}),img:new fields2.FilePathField({categories:["IMAGE"],nullable:!1,initial:()=>"systems/pf2e/icons/default-icons/melee.svg"}),attackModifier:new fields2.NumberField({integer:!0,positive:!0,nullable:!0,initial:null}),replaceAll:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),replaceBasicUnarmed:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),battleForm:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),ability:new fields2.StringField({required:!1,blank:!1,choices:CONFIG.PF2E.abilities,nullable:!0,initial:null}),options:new fields2.ArrayField(new fields2.StringField,{required:!1,initial:void 0}),fist:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0}),graspingAppendage:new StrictBooleanField({required:!1,nullable:!1,initial:void 0})}}validate(options){return(options?.changes??this._source).fist===!0?!0:super.validate(options)}_initializeSource(source,options){return"fist"in source&&source.fist===!0?source:super._initializeSource(source,options)}_initialize(options){this._source.fist?(this.key="Strike",this.priority=99,this.slug="fist",this.img=this._source.img,this.category="unarmed",this.group="brawling",this.baseType="fist",this.traits=["agile","finesse","nonlethal"],this.traitToggles=mergeObject({modular:null,versatile:null},this._source.traitToggles??{}),this.otherTags=[],this.range=null,this.damage={base:{dice:1,die:"d4",damageType:"bludgeoning",modifier:0}},this.battleForm=!1,this.fist=!0,this.graspingAppendage=!0,this.replaceAll=!1,this.replaceBasicUnarmed=!1,this.predicate=new PredicatePF2e(Array.isArray(this._source.predicate)?this._source.predicate:[])):super._initialize(options)}beforePrepareData(){if(this.ignored)return;const predicatePassed=this.predicate.length===0||(()=>{const rollOptions=new Set(this.actor.getRollOptions(["attack","attack-roll","strike-attack-roll"]));return this.resolveInjectedProperties(this.predicate).test(rollOptions)})(),damageType=this.resolveInjectedProperties(this.damage.base.damageType);if(!objectHasKey(CONFIG.PF2E.damageTypes,damageType))return this.failValidation("Unrecognized damage type");const dice=(()=>{const resolvedDice=Number(this.resolveValue(this.damage.base.dice));return Math.clamped(Math.trunc(resolvedDice),0,8)})();if(Number.isNaN(dice))return this.failValidation("dice does not resolve to a number");if(predicatePassed){const weapon=__privateMethod(this,_constructWeapon,constructWeapon_fn).call(this,damageType,dice),slug=weapon.slug??sluggify(weapon.name);this.actor.synthetics.strikes.set(slug,weapon)}}afterPrepareData(){if(!(this.ignored||!this.actor.isOfType("character")))if(this.replaceAll){const systemData=this.actor.system;systemData.actions=systemData.actions.filter(a=>a.item.id===this.item.id&&a.item.name===this.label&&a.item.group===this.group)}else this.replaceBasicUnarmed&&this.actor.system.actions.findSplice(a=>a.item?.slug==="basic-unarmed")}async toggleTrait({trait,selection}){const ruleSources=deepClone(this.item._source.system.rules),rule=ruleSources.at(this.sourceIndex??NaN);rule?.key==="Strike"&&(rule.traitToggles={...this.traitToggles,[trait]:selection},await this.item.update({"system.rules":ruleSources}))}};_constructWeapon=new WeakSet,constructWeapon_fn=__name2(function(damageType,dice){const actorIsNPC=this.actor.isOfType("npc"),source=deepClone({_id:this.item.id,name:this.label,type:"weapon",img:this.img,flags:{pf2e:{battleForm:this.battleForm,fixedAttack:actorIsNPC?this.attackModifier??null:null}},system:{slug:this.slug,description:{value:""},category:this.category,group:this.group,baseItem:this.baseType,attribute:this.ability,bonus:{value:actorIsNPC?this.attackModifier??0:0},damage:{...this.damage.base,dice,damageType},range:this.range?.increment??null,maxRange:this.range?.max??null,traits:{value:this.traits,otherTags:this.otherTags,rarity:"common",toggles:{modular:{selection:this.traitToggles.modular},versatile:{selection:this.traitToggles.versatile}}},options:{value:this.options},usage:{value:"held-in-one-hand"},equipped:{carryType:"held",handsHeld:1},graspingAppendage:this.graspingAppendage}});return new WeaponPF2e(source,{parent:this.actor})},"#constructWeapon"),__name2(_StrikeRuleElement,"StrikeRuleElement"),__publicField(_StrikeRuleElement,"validActorTypes",["character","npc"]);let StrikeRuleElement=_StrikeRuleElement;const _TempHPRuleElement=class extends RuleElementPF2e{static{__name(this,"_TempHPRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1}),events:new StrictSchemaField({onCreate:new fields2.BooleanField({required:!1,nullable:!1}),onTurnStart:new fields2.BooleanField({required:!1,nullable:!1})},{required:!0,nullable:!1,initial:{onCreate:!0,onTurnStart:!1}})}}onCreate(actorUpdates){if(this.ignored||!this.events.onCreate)return;const updatedActorData=mergeObject(this.actor._source,actorUpdates,{inplace:!1}),value=this.resolveValue(this.value),rollOptions=Array.from(new Set([...this.actor.getRollOptions(),...this.actor.itemTypes.weapon.flatMap(w=>w.isEquipped?w.getRollOptions("self:weapon"):[])]));if(!this.test(rollOptions))return;if(typeof value!="number")return this.failValidation("Temporary HP requires a non-zero value field");const currentTempHP=Number(getProperty(updatedActorData,"system.attributes.hp.temp"))||0;value>currentTempHP&&(mergeObject(actorUpdates,{"system.attributes.hp.temp":value,"system.attributes.hp.tempsource":this.item.id}),this.broadcast(value,currentTempHP))}onTurnStart(actorUpdates){if(this.ignored||!this.events.onTurnStart)return;const rollOptions=Array.from(new Set([...this.actor.getRollOptions(["all"]),...this.actor.itemTypes.weapon.flatMap(w=>w.isEquipped?w.getRollOptions("self:weapon"):[])]));if(!this.test(rollOptions))return;const value=this.resolveValue(this.value);if(typeof value!="number")return this.failValidation("Temporary HP requires a non-zero value field");const updatedActorData=mergeObject(this.actor._source,actorUpdates,{inplace:!1}),currentTempHP=Number(getProperty(updatedActorData,"system.attributes.hp.temp"))||0;value>currentTempHP&&(actorUpdates["system.attributes.hp.temp"]=value,this.broadcast(value,currentTempHP))}onDelete(actorUpdates){const updatedActorData=mergeObject(this.actor._source,actorUpdates,{inplace:!1});if(getProperty(updatedActorData,"system.attributes.hp.tempsource")===this.item.id){mergeObject(actorUpdates,{"system.attributes.hp.temp":0});const hpData=getProperty(actorUpdates,"system.attributes.hp");isObject(hpData)&&(hpData["-=tempsource"]=null)}}broadcast(newQuantity,oldQuantity){const singularOrPlural=newQuantity===1?"PF2E.Encounter.Broadcast.TempHP.SingleNew":"PF2E.Encounter.Broadcast.TempHP.PluralNew",wasAt=oldQuantity>0?game.i18n.format("PF2E.Encounter.Broadcast.TempHP.WasAt",{oldQuantity}):"",[actor,item]=[this.actor.name,this.item.name],content=game.i18n.format(singularOrPlural,{actor,newQuantity,wasAt,item}),recipients=game.users.filter(u=>this.actor.testUserPermission(u,"OWNER")).map(u=>u.id),speaker=ChatMessagePF2e.getSpeaker({actor:this.actor,token:this.token});ChatMessagePF2e.create({content,speaker,whisper:recipients})}};__name2(_TempHPRuleElement,"TempHPRuleElement"),__publicField(_TempHPRuleElement,"validActorTypes",["character","npc","familiar"]);let TempHPRuleElement=_TempHPRuleElement;const _BattleFormRuleElement=class extends RuleElementPF2e{static{__name(this,"_BattleFormRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_setRollOptions),__privateAdd(this,_prepareAC),__privateAdd(this,_prepareSenses),__privateAdd(this,_prepareSize),__privateAdd(this,_prepareSpeeds),__privateAdd(this,_prepareSkills),__privateAdd(this,_prepareStrikes),__privateAdd(this,_prepareIWR),__privateAdd(this,_suppressModifiers),__privateAdd(this,_filterModifier),__privateAdd(this,_suppressNotes),__privateAdd(this,_resolveStrikeQueries),__publicField(this,"modifierLabel"),this.overrides=this.resolveValue(this.value,this.overrides),this.modifierLabel=this.getReducedLabel()}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!1,initial:void 0}),overrides:new fields2.SchemaField({traits:new fields2.ArrayField(new fields2.StringField),armorClass:new fields2.SchemaField({modifier:new ResolvableValueField({required:!1,nullable:!1,initial:0}),ignoreCheckPenalty:new fields2.BooleanField({required:!1,nullable:!1,initial:!0}),ignoreSpeedPenalty:new fields2.BooleanField({required:!1,nullable:!1,initial:!0})},{required:!1,initial:void 0}),tempHP:new ResolvableValueField({required:!1,nullable:!0,initial:null}),senses:new RecordField(new fields2.StringField({required:!0,blank:!1,choices:[...SENSE_TYPES]}),new fields2.SchemaField({acuity:new fields2.StringField({choices:SENSE_ACUITIES,required:!1,blank:!1,initial:void 0}),range:new fields2.NumberField({required:!1,nullable:!0,initial:void 0})}),{required:!1,initial:void 0}),size:new fields2.StringField({required:!1,blank:!1,initial:void 0}),speeds:new fields2.ObjectField({required:!1,initial:void 0}),skills:new fields2.ObjectField({required:!1,initial:void 0}),strikes:new fields2.ObjectField({required:!1}),immunities:new fields2.ArrayField(new fields2.ObjectField),weaknesses:new fields2.ArrayField(new fields2.ObjectField),resistances:new fields2.ArrayField(new fields2.ObjectField)},{required:!0,nullable:!1}),ownUnarmed:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),canCast:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),canSpeak:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),hasHands:new fields2.BooleanField({required:!1,nullable:!1,initial:!1})}}async preCreate({itemSource,ruleSource}){if(!this.test()){ruleSource.ignored=!0;return}const rules=itemSource.system?.rules??[];for(const rule of rules)if(["DamageDice","FlatModifier","Note"].includes(String(rule.key))){const predicate=rule.predicate??=[];Array.isArray(predicate)&&predicate.push("battle-form")}await __privateMethod(this,_resolveStrikeQueries,resolveStrikeQueries_fn).call(this,ruleSource)}onCreate(actorUpdates){if(this.ignored)return;const tempHP=this.overrides.tempHP;tempHP&&new TempHPRuleElement({key:"TempHP",label:this.label,value:tempHP},{parent:this.item}).onCreate(actorUpdates)}beforePrepareData(){if(this.ignored)return;const{actor}=this,{attributes}=actor;if(attributes.polymorphed){actor.synthetics.preparationWarnings.add("PF2e System | You are already under a polymorph effect"),this.ignored=!0;return}attributes.polymorphed=!0,attributes.battleForm=!0,__privateMethod(this,_setRollOptions,setRollOptions_fn).call(this),__privateMethod(this,_prepareSenses,prepareSenses_fn).call(this);for(const trait of this.overrides.traits){const currentTraits=actor.system.traits;currentTraits.value.includes(trait)||currentTraits.value.push(trait)}if(this.overrides.armorClass?.ignoreSpeedPenalty){const speedRollOptions=actor.rollOptions.speed??={};speedRollOptions["armor:ignore-speed-penalty"]=!0}}afterPrepareData(){this.ignored||(__privateMethod(this,_prepareAC,prepareAC_fn).call(this),__privateMethod(this,_prepareSize,prepareSize_fn).call(this),__privateMethod(this,_prepareSkills,prepareSkills_fn).call(this),__privateMethod(this,_prepareSpeeds,prepareSpeeds_fn).call(this),__privateMethod(this,_prepareStrikes,prepareStrikes_fn).call(this),__privateMethod(this,_prepareIWR,prepareIWR_fn).call(this),this.actor.initiative=new ActorInitiative(this.actor),this.actor.system.attributes.initiative=this.actor.initiative.getTraceData())}onDelete(actorUpdates){if(this.ignored)return;const tempHP=this.overrides.tempHP;tempHP&&new TempHPRuleElement({key:"TempHP",label:this.label,value:tempHP},{parent:this.item}).onDelete(actorUpdates)}applyDamageExclusion(weapon,modifiers){if(!this.ownUnarmed)for(const modifier of modifiers){if(modifier.predicate.some(s=>s instanceof Object&&"not"in s&&s.not==="battle-form"))continue;const isNumericBonus=modifier instanceof ModifierPF2e&&modifier.modifier>=0,isAbilityModifier=modifier instanceof ModifierPF2e&&modifier.type==="ability",isExtraDice=modifier instanceof DamageDicePF2e,isStatusOrCircumstance=isNumericBonus&&["status","circumstance"].includes(modifier.type),isDamageTrait=isExtraDice&&/^(?:deadly|fatal)-\d?d\d{1,2}$/.test(modifier.slug)&&tupleHasValue(this.overrides?.strikes?.[weapon.slug??""]?.traits??[],modifier.slug),isBattleFormModifier=!!(modifier.predicate.includes("battle-form")||modifier.predicate.some(s=>s instanceof Object&&"or"in s&&s.or.includes("battle-form"))||isDamageTrait);(isNumericBonus||isAbilityModifier||isExtraDice)&&!isStatusOrCircumstance&&!isBattleFormModifier&&(modifier.enabled=!1,modifier.ignored=!0,modifier.predicate.push({not:"battle-form"}))}}};_defaultIcons=new WeakMap,_setRollOptions=new WeakSet,setRollOptions_fn=__name2(function(){const{attributes,rollOptions}=this.actor;if(rollOptions.all.polymorph=!0,rollOptions.all["battle-form"]=!0,this.overrides.armorClass&&(rollOptions.all["armor:ignore-check-penalty"]=this.overrides.armorClass.ignoreCheckPenalty,rollOptions.all["armor:ignore-speed-penalty"]=this.overrides.armorClass.ignoreSpeedPenalty,this.overrides.armorClass.ignoreSpeedPenalty)){const speedRollOptions=rollOptions.speed??={};speedRollOptions["armor:ignore-speed-penalty"]=!0}if(this.overrides.skills)for(const key of SKILL_ABBREVIATIONS){if(!(key in this.overrides.skills))continue;const longForm=SKILL_DICTIONARY[key];rollOptions.all[`battle-form:${longForm}`]=!0}attributes.handsFree=Math.max(Object.values(this.overrides.strikes??{}).reduce((count,s)=>s.category==="unarmed"?count:count-1,2),0);for(const num of[0,1,2])attributes.handsFree===num?rollOptions.all[`hands-free:${num}`]=!0:delete rollOptions.all[`hands-free:${num}`]},"#setRollOptions"),_prepareAC=new WeakSet,prepareAC_fn=__name2(function(){const overrides=this.overrides,{actor}=this,{armorClass}=actor;if(!(Number(this.resolveValue(overrides.armorClass?.modifier,armorClass.value))||0))return;__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,armorClass);const newModifier=(Number(this.resolveValue(overrides.armorClass?.modifier))||0)-10;armorClass.modifiers.push(new ModifierPF2e(this.modifierLabel,newModifier,"untyped")),this.actor.system.attributes.ac=armorClass.parent.getTraceData()},"#prepareAC"),_prepareSenses=new WeakSet,prepareSenses_fn=__name2(function(){for(const senseType of SENSE_TYPES){const newSense=this.overrides.senses?.[senseType];if(!newSense)continue;newSense.acuity??="precise";const ruleData={key:"Sense",selector:senseType,force:!0,...newSense};new SenseRuleElement(ruleData,{parent:this.item}).beforePrepareData()}},"#prepareSenses"),_prepareSize=new WeakSet,prepareSize_fn=__name2(function(){if(!this.overrides.size)return;const ruleData={key:"CreatureSize",label:this.label,value:this.overrides.size};new CreatureSizeRuleElement(ruleData,{parent:this.item}).beforePrepareData()},"#prepareSize"),_prepareSpeeds=new WeakSet,prepareSpeeds_fn=__name2(function(){const{attributes}=this.actor,currentSpeeds=attributes.speed;for(const movementType of MOVEMENT_TYPES){const speedOverride=this.overrides.speeds?.[movementType];if(typeof speedOverride=="number")if(movementType==="land")__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,attributes.speed),attributes.speed.value=speedOverride;else{const{otherSpeeds}=currentSpeeds,label=game.i18n.localize(CONFIG.PF2E.speedTypes[movementType]);otherSpeeds.findSplice(s=>s.type===movementType),otherSpeeds.push({type:movementType,label,value:speedOverride});const newSpeed=this.actor.prepareSpeed(movementType);if(!newSpeed)throw ErrorPF2e("Unexpected failure retrieving movement type");__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,newSpeed),otherSpeeds.findSplice(s=>s.type===movementType),otherSpeeds.push(newSpeed)}}},"#prepareSpeeds"),_prepareSkills=new WeakSet,prepareSkills_fn=__name2(function(){for(const[skillShort,newSkill]of Object.entries(this.overrides.skills??{})){if(!setHasElement(SKILL_ABBREVIATIONS,skillShort))return this.failValidation(`Unrecognized skill abbreviation: ${skillShort}`);newSkill.ownIfHigher??=!0;const key=SKILL_DICTIONARY[skillShort],currentSkill=this.actor.skills[key],newModifier=Number(this.resolveValue(newSkill.modifier))||0;if(currentSkill.mod>newModifier&&newSkill.ownIfHigher)continue;const baseMod=new ModifierPF2e({label:this.modifierLabel,slug:"battle-form",modifier:newModifier,type:"untyped"});this.actor.skills[key]=currentSkill.extend({modifiers:[baseMod],filter:__privateMethod(this,_filterModifier,filterModifier_fn)}),this.actor.system.skills[skillShort]=mergeObject(this.actor.system.skills[skillShort],this.actor.skills[key].getTraceData())}},"#prepareSkills"),_prepareStrikes=new WeakSet,prepareStrikes_fn=__name2(function(){const{synthetics}=this.actor,strikes=this.overrides.strikes??{},ruleData=Object.entries(strikes).map(([slug,strikeData])=>({key:"Strike",label:game.i18n.localize(strikeData.label)??`PF2E.BattleForm.Attack.${sluggify(slug,{camel:"bactrian"})}`,slug,img:strikeData.img??__privateGet(_BattleFormRuleElement,_defaultIcons)[slug]??this.item.img,category:strikeData.category,group:strikeData.group,baseItem:strikeData.baseType,options:[slug],damage:{base:strikeData.damage},range:strikeData.range,maxRange:strikeData.maxRange,traits:strikeData.traits??[],ability:strikeData.ability,ownIfHigher:strikeData.ownIfHigher??=!0}));if(this.ownUnarmed){for(const[slug,weapon]of synthetics.strikes.entries())weapon.category!=="unarmed"&&synthetics.strikes.delete(slug);this.actor.rollOptions.all["battle-form:own-attack-modifier"]=!0}else{synthetics.strikes.clear();for(const striking of Object.values(synthetics.striking).flat())(striking.predicate??=new PredicatePF2e).push({not:"battle-form"});for(const datum of ruleData)datum.traits.includes("magical")||datum.traits.push("magical"),new StrikeRuleElement({...datum,battleForm:!0},{parent:this.item}).beforePrepareData()}this.actor.system.actions=this.actor.prepareStrikes({includeBasicUnarmed:this.ownUnarmed}).filter(a=>a.slug&&a.slug in strikes||this.ownUnarmed&&a.item.category==="unarmed");const strikeActions=this.actor.system.actions.flatMap(s=>[s,...s.altUsages]);for(const action2 of strikeActions){const strike=strikes[action2.slug??""]??null;if(!this.ownUnarmed&&strike&&(Number(this.resolveValue(strike.modifier))>=action2.totalModifier||!strike.ownIfHigher)){__privateMethod(this,_suppressModifiers,suppressModifiers_fn).call(this,action2),__privateMethod(this,_suppressNotes,suppressNotes_fn).call(this,Object.entries(synthetics.rollNotes).flatMap(([key,note])=>/\bdamage\b/.test(key)?note:[]));const baseModifier=Number(this.resolveValue(strike.modifier))||0;action2.unshift(new ModifierPF2e(this.modifierLabel,baseModifier,"untyped"))}else{const options=this.actor.rollOptions["strike-attack-roll"]??={};options["battle-form:own-attack-modifier"]=!0,action2.calculateTotal(new Set(this.actor.getRollOptions(action2.domains)))}}},"#prepareStrikes"),_prepareIWR=new WeakSet,prepareIWR_fn=__name2(function(){for(const immunity of this.overrides.immunities)new ImmunityRuleElement({key:"Immunity",...immunity},{parent:this.item}).afterPrepareData();for(const weakness of this.overrides.weaknesses){const args={key:"Weakness",...weakness,override:!0};new WeaknessRuleElement(args,{parent:this.item}).afterPrepareData()}for(const resistance of this.overrides.resistances){const args={key:"Resistance",...resistance,override:!0};new ResistanceRuleElement(args,{parent:this.item}).afterPrepareData()}},"#prepareIWR"),_suppressModifiers=new WeakSet,suppressModifiers_fn=__name2(function(statistic){for(const modifier of statistic.modifiers)__privateMethod(this,_filterModifier,filterModifier_fn).call(this,modifier)||(modifier.adjustments.push({slug:null,test:()=>!0,suppress:!0}),modifier.ignored=!0,modifier.enabled=!1);statistic instanceof StatisticModifier&&statistic.calculateTotal()},"#suppressModifiers"),_filterModifier=new WeakSet,filterModifier_fn=__name2(function(modifier){return modifier.slug==="battle-form"?!0:modifier.type==="ability"?!1:["status","circumstance"].includes(modifier.type)||modifier.modifier<0},"#filterModifier"),_suppressNotes=new WeakSet,suppressNotes_fn=__name2(function(notes){for(const note of notes)note.predicate.includes("battle-form")||(note.predicate=note.predicate instanceof PredicatePF2e?note.predicate:new PredicatePF2e(note.predicate),note.predicate.push({not:"battle-form"}))},"#suppressNotes"),_resolveStrikeQueries=new WeakSet,resolveStrikeQueries_fn=__name2(async function(ruleSource){const value=ruleSource.overrides?ruleSource.overrides:ruleSource.value??={};if(!__name2(v=>isObject(v)&&isObject(v.strikes),"hasStrikes")(value))return;const isStrikeQuery=__name2(maybeQuery=>isObject(maybeQuery)?typeof maybeQuery.query=="string"&&typeof maybeQuery.modifier=="number":!1,"isStrikeQuery");for(const[slug,strike]of Object.entries(value.strikes)){if(!isStrikeQuery(strike))continue;strike.pack=String(strike.pack??"pf2e.equipment-srd"),strike.ownIfHigher=!!(strike.ownIfHigher??!0);const queryObject=(()=>{try{const parsed=JSON.parse(String(this.resolveInjectedProperties(strike.query)));if(!isObject(parsed)||Array.isArray(parsed))throw Error("A strike query must be an NeDB query object");return parsed}catch(error){return error instanceof Error&&this.failValidation(error.message),ruleSource.ignored=!0,null}})();if(!queryObject){this.failValidation("Malformed query object");break}const weapon=(await game.packs.get(strike.pack)?.getDocuments(queryObject))?.[0];if(!(weapon instanceof WeaponPF2e)){this.failValidation("Failed to retrieve queried weapon");break}const resolved={label:weapon.name,img:weapon.img,ability:weapon.isRanged||weapon.traits.has("finesse")?"dex":"str",category:weapon.category,group:weapon.group,baseType:weapon.baseType,traits:deepClone(weapon.system.traits.value),modifier:strike.modifier,damage:deepClone(weapon.system.damage),ownIfHigher:strike.ownIfHigher};value.strikes[slug]=resolved}},"#resolveStrikeQueries"),__name2(_BattleFormRuleElement,"BattleFormRuleElement"),__publicField(_BattleFormRuleElement,"validActorTypes",["character"]),__privateAdd(_BattleFormRuleElement,_defaultIcons,["antler","beak","body","bone-shard","branch","claw","cube-face","fangs","fire-mote","fist","foot","foreleg","gust","horn","jaws","lighting-lash","mandibles","piercing-hymn","pincer","pseudopod","rock","spikes","stinger","tail","talon","tendril","tentacle","tongue","trunk","tusk","vine","water-spout","wave","wing"].reduce((accumulated,slug)=>{const path=slug==="fist"?"icons/skills/melee/unarmed-punch-fist.webp":`systems/pf2e/icons/unarmed-attacks/${slug}.webp`;return{...accumulated,[slug]:path}},{}));let BattleFormRuleElement=_BattleFormRuleElement;const _PickAThingPrompt=class extends Application{static{__name(this,"_PickAThingPrompt")}constructor(data){super(),__publicField(this,"item"),__privateAdd(this,_resolve3,void 0),__publicField(this,"selection",null),__publicField(this,"choices",[]),__publicField(this,"selectMenu"),__publicField(this,"predicate"),__publicField(this,"allowNoSelection"),this.item=data.item,this.predicate=data.predicate??new PredicatePF2e,this.options.title=data.title??this.item.name,this.allowNoSelection=data.allowNoSelection??!1}get actor(){return this.item.actor}static get defaultOptions(){return{...super.defaultOptions,classes:["pick-a-thing-prompt"],resizable:!1,height:"auto",width:"auto"}}getChoices(){return this.choices.filter(choice=>this.predicate.test(choice.domain??[]))??[]}getSelection(event){if(!(event.currentTarget instanceof HTMLElement))throw ErrorPF2e("Unexpected error retrieving form data");const selectedIndex=(event.currentTarget.closest(".choice")?.querySelector("button[data-action=pick]")??event.currentTarget.closest(".content")?.querySelector("tag")??event.currentTarget).getAttribute("value");return["",null].includes(selectedIndex)||!Number.isInteger(Number(selectedIndex))?null:this.choices.at(Number(selectedIndex))??null}async resolveSelection(){return this.choices=this.getChoices(),this.render(!0),new Promise(resolve=>{__privateSet(this,_resolve3,resolve)})}async getData(options={}){const slug=this.item.slug??sluggify(this.item.name);return options.id=`pick-a-${slug}`,{selectMenu:this.choices.length>9,choices:this.choices.map((c,index)=>({...c,value:index}))}}activateListeners($html){const html=$html[0];for(const element of htmlQueryAll(html,"a[data-choice], button[data-action=pick]"))element.addEventListener("click",event=>{this.selection=this.getSelection(event)??null,this.close()});const select=htmlQuery(html,"input[data-tagify-select]");select&&(this.selectMenu=new Tagify(select,{enforceWhitelist:!0,keepInvalidTags:!1,mode:"select",tagTextProp:"label",dropdown:{closeOnSelect:!0,enabled:1,highlightFirst:!0,mapValueTo:"label",maxItems:this.choices.length,searchKeys:["label"]},whitelist:this.choices.map((c,index)=>({value:index.toString(),label:c.label}))}),this.selectMenu.DOM.input.spellcheck=!1)}async close(options){var _a;for(const element of htmlQueryAll(this.element[0],"button, select"))element.style.pointerEvents="none";return this.choices.length===0?ui.notifications.warn(game.i18n.format("PF2E.UI.RuleElements.Prompt.NoValidOptions",{actor:this.actor.name,item:this.item.name})):!this.selection&&!this.allowNoSelection&&ui.notifications.warn(game.i18n.format("PF2E.UI.RuleElements.Prompt.NoSelectionMade",{item:this.item.name})),(_a=__privateGet(this,_resolve3))==null||_a.call(this,this.selection),super.close(options)}};_resolve3=new WeakMap,__name2(_PickAThingPrompt,"PickAThingPrompt");let PickAThingPrompt=_PickAThingPrompt;const _ChoiceSetPrompt=class extends PickAThingPrompt{static{__name(this,"_ChoiceSetPrompt")}prompt;containsItems;allowedDrops;constructor(data){super(data),this.prompt=data.prompt,this.choices=data.choices??[],this.containsItems=data.containsItems,this.allowedDrops=this.containsItems?data.allowedDrops:null}static get defaultOptions(){return{...super.defaultOptions,classes:["choice-set-prompt"],dragDrop:[{dropSelector:".drop-zone"}],template:"systems/pf2e/templates/system/rules-elements/choice-set-prompt.hbs"}}async getData(options={}){return{...await super.getData(options),choices:this.choices.map((c,index)=>({...c,value:index,hasUUID:UUIDUtils.isItemUUID(c.value)})),prompt:this.prompt,includeDropZone:!!this.allowedDrops,allowNoSelection:this.allowNoSelection,selectMenu:this.choices.length>9,containsItems:this.containsItems}}getChoices(){return this.choices}setChoices(choices){this.choices=choices}activateListeners($html){super.activateListeners($html);const html=$html[0];htmlQuery(html,"button[data-action=close]")?.addEventListener("click",()=>{this.close()});const renderItemSheet=__name2(async choice=>{if(!choice||!UUIDUtils.isItemUUID(choice.value))return;(await fromUuid(choice.value))?.sheet.render(!0)},"renderItemSheet");if(this.containsItems)if(this.selectMenu){const itemInfoAnchor=htmlQuery(html,"a.item-info");if(!itemInfoAnchor)return;const updateAnchor=__name2((disable,value="")=>{itemInfoAnchor.dataset.value=value,itemInfoAnchor.classList.toggle("disabled",disable),itemInfoAnchor.dataset.tooltip=game.i18n.localize(disable?"PF2E.UI.RuleElements.ChoiceSet.ViewItem.Disabled":"PF2E.UI.RuleElements.ChoiceSet.ViewItem.Tooltip")},"updateAnchor");itemInfoAnchor.addEventListener("click",event=>{renderItemSheet(this.getSelection(event))}),this.selectMenu.on("change",event=>{const data=event.detail.tagify.value.at(0);if(!data)return updateAnchor(!0);const index=Number(data.value);if(!isNaN(index)){const choice=this.choices.at(index);UUIDUtils.isItemUUID(choice?.value)?updateAnchor(!1,data.value):updateAnchor(!0)}})}else for(const anchor of htmlQueryAll(html,"a.item-info"))anchor.addEventListener("click",event=>{renderItemSheet(this.getSelection(event))})}async resolveSelection(){const firstChoice=this.choices.at(0);return!this.allowedDrops&&firstChoice&&this.choices.length===1?this.selection=firstChoice:(this.choices.length===0&&!this.allowedDrops&&this.close(),super.resolveSelection())}async _onDrop(event){event.preventDefault();const dataString=event.dataTransfer?.getData("text/plain"),dropData=JSON.parse(dataString??"");if(dropData?.type!=="Item"){ui.notifications.error("Only an item can be dropped here.");return}const droppedItem=await ItemPF2e.fromDropData(dropData);if(!droppedItem)throw ErrorPF2e("Unexpected error resolving drop");const isAllowedDrop=!!this.allowedDrops?.predicate.test(droppedItem.getRollOptions("item"));if(this.allowedDrops&&!isAllowedDrop){ui.notifications.error(game.i18n.format("PF2E.Item.ABC.InvalidDrop",{badType:droppedItem.name,goodType:game.i18n.localize(this.allowedDrops.label??"")}));return}const newChoice={value:this.containsItems&&this.choices.length>0&&this.choices.every(c=>!UUIDUtils.isItemUUID(c.value))?droppedItem.slug??sluggify(droppedItem.id):droppedItem.uuid,label:droppedItem.name},choicesLength=this.choices.push(newChoice),prompt=document.querySelector(`#${this.id}`),dropZone=prompt?.querySelector(".drop-zone");if(!prompt)throw ErrorPF2e("Unexpected error retrieving ChoiceSet dialog");if(prompt.style.height="unset",this.selectMenu){const{whitelist}=this.selectMenu.settings,menuChoice={value:String(choicesLength-1),label:newChoice.label};whitelist?.push(menuChoice.value),this.selectMenu.setPersistedData(whitelist,"whitelist"),this.selectMenu.addTags([menuChoice],!0,!0),this.selectMenu.setReadonly(!0),dropZone?.remove()}else{const img=document.createElement("img");img.src=droppedItem.img;const newButton=createHTMLElement("button",{classes:["with-image"],children:[img,createHTMLElement("span",{children:[droppedItem.name]})]});newButton.type="button",newButton.value=String(choicesLength-1),newButton.addEventListener("click",event2=>{this.selection=this.getSelection(event2)??null,this.close()}),dropZone?.replaceWith(newButton)}}_canDragDrop(){return this.actor.isOwner}};__name2(_ChoiceSetPrompt,"ChoiceSetPrompt");let ChoiceSetPrompt=_ChoiceSetPrompt;const _ChoiceSetRuleElement=class extends RuleElementPF2e{static{__name(this,"_ChoiceSetRuleElement")}constructor(data,options){if(super(data,options),__privateAdd(this,_setDefaultFlag),__privateAdd(this,_choicesFromArray),__privateAdd(this,_choicesFromPath),__privateAdd(this,_choicesFromOwnedItems),__privateAdd(this,_choicesFromAttacks),__privateAdd(this,_getPreselection),__privateAdd(this,_setRollOption),__publicField(this,"containsItems",!1),__publicField(this,"selection"),this.allowedDrops??=null,this.allowNoSelection??=!1,this.rollOption??=this.slug,this.flag=__privateMethod(this,_setDefaultFlag,setDefaultFlag_fn).call(this,this),this.selection=typeof data.selection=="string"||typeof data.selection=="number"||isObject(data.selection)?data.selection:null,isObject(this.choices)&&!Array.isArray(this.choices)&&!("filter"in this.choices)&&(this.choices.predicate=new PredicatePF2e(this.choices.predicate??[]),this.choices.unarmedAttacks&&this.choices.predicate.push("item:category:unarmed")),this.item.flags.pf2e.rulesSelections[this.flag]=this.selection,this.selection!==null)__privateMethod(this,_setRollOption,setRollOption_fn).call(this,this.selection);else if(!this.allowNoSelection&&this.test()){this.ignored=!0;for(const ruleData of this.item.system.rules)ruleData.ignored=!0}}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),choices:new DataUnionField([new StrictArrayField(new StrictObjectField({required:!0,nullable:!1,initial:void 0}),{required:!0,nullable:!1,initial:void 0}),new StrictObjectField({required:!0,nullable:!1,initial:void 0}),new StrictStringField({required:!0,nullable:!1,initial:void 0})],{required:!0,nullable:!1,initial:()=>[]}),prompt:new fields2.StringField({required:!0,blank:!1,nullable:!1,initial:"PF2E.UI.RuleElements.ChoiceSet.Prompt"}),adjustName:new fields2.BooleanField({required:!0,nullable:!1,initial:!0}),allowedDrops:new fields2.SchemaField({label:new fields2.StringField({required:!0,blank:!1,nullable:!0,initial:null}),predicate:new PredicateField},{required:!1,nullable:!0,initial:void 0}),flag:new fields2.StringField({required:!1,blank:!1,nullable:!1,initial:void 0}),rollOption:new fields2.StringField({required:!1,blank:!1,nullable:!0,initial:null}),allowNoSelection:new fields2.BooleanField({required:!1,nullable:!1,initial:void 0})}}async preCreate({itemSource,ruleSource,tempItems}){if(this.selection===null&&isObject(this.choices)&&"query"in this.choices){this.failValidation("As of FVTT version 11, choice set queries are no longer supported.");for(const ruleData of this.item.system.rules)ruleData.ignored=!0;return}const rollOptions=new Set([this.actor.getRollOptions(),this.item.getRollOptions("parent")].flat());if(!this.resolveInjectedProperties(this.predicate).test(rollOptions))return;if(isObject(this.choices)){const{choices}=this;if("ownedItems"in choices&&choices.ownedItems&&!choices.types?.length){console.warn("PF2E System | Failure during ChoiceSet preCreate: `types` is required if `ownedItems` is set"),ruleSource.ignored=!0;return}}__privateMethod(this,_setDefaultFlag,setDefaultFlag_fn).call(this,ruleSource);const inflatedChoices=await this.inflateChoices(rollOptions,tempItems),selection=__privateMethod(this,_getPreselection,getPreselection_fn).call(this)??await new ChoiceSetPrompt({prompt:this.prompt,item:this.item,title:this.label,choices:inflatedChoices,containsItems:this.containsItems,allowedDrops:this.allowedDrops,allowNoSelection:this.allowNoSelection}).resolveSelection();if(selection){if(ruleSource.selection=selection.value,this.adjustName){const effectName=itemSource.name,label=game.i18n.localize(selection.label),name2=`${effectName} (${label})`,pattern=(()=>{const escaped=RegExp.escape(label);return new RegExp(`\\(${escaped}\\) \\(${escaped}\\)$`)})();itemSource.name=name2.replace(pattern,`(${label})`)}if(this.item.flags.pf2e.rulesSelections[this.flag]=selection.value,typeof ruleSource.rollOption=="string"&&UUIDUtils.isItemUUID(selection.value)){const item=await fromUuid(selection.value);if(item instanceof ItemPF2e){const slug=item.slug??sluggify(item.name);this.rollOption=ruleSource.rollOption=`${ruleSource.rollOption}:${slug}`}}__privateMethod(this,_setRollOption,setRollOption_fn).call(this,ruleSource.selection);for(const rule of this.item.rules)rule.ignored=!1}else ruleSource.ignored=!0}async inflateChoices(rollOptions,tempItems){const choices=Array.isArray(this.choices)?__privateMethod(this,_choicesFromArray,choicesFromArray_fn).call(this,this.choices,rollOptions):isObject(this.choices)?this.choices.ownedItems?__privateMethod(this,_choicesFromOwnedItems,choicesFromOwnedItems_fn).call(this,this.choices,rollOptions,tempItems):this.choices.attacks||this.choices.unarmedAttacks?__privateMethod(this,_choicesFromAttacks,choicesFromAttacks_fn).call(this,new PredicatePF2e(this.resolveInjectedProperties(this.choices.predicate)),rollOptions):"filter"in this.choices&&Array.isArray(this.choices.filter)?await this.queryCompendium(this.choices,rollOptions,tempItems):[]:typeof this.choices=="string"?__privateMethod(this,_choicesFromPath,choicesFromPath_fn).call(this,this.choices):[],choicesAreUUIDs=choices.every(c=>UUIDUtils.isItemUUID(c.value));if(choicesAreUUIDs){const itemChoices=await UUIDUtils.fromUUIDs(choices.map(c=>c.value));for(let i=0;i({value:c.value,label:game.i18n.localize(c.label),img:c.img}));return Array.isArray(this.choices)||choiceData.sort((a,b)=>a.label.localeCompare(b.label)),choiceData}catch{return[]}}async queryCompendium(choices,actorRollOptions,tempItems){const filter2=Array.isArray(choices.filter)?new PredicatePF2e(this.resolveInjectedProperties(choices.filter)):new PredicatePF2e;if(!filter2.isValid||filter2.length===0)return this.failValidation("`filter` must be an array with at least one statement"),[];const itemType=objectHasKey(CONFIG.PF2E.Item.documentClasses,choices.itemType)?choices.itemType:"feat",packs=typeof choices.pack=="string"?compact([game.packs.get(choices.pack)]):game.packs.filter(p=>p.metadata.type==="Item"&&p.index.some(e=>e.type===itemType)),progress=new Progress({max:packs.length}),localize=localizer("PF2E.ProgressBar"),indexData=[];for(const pack of packs)progress.advance({label:localize("LoadingPack",{pack:pack.metadata.label})}),indexData.push(await pack.getIndex({fields:["flags","system.ancestry","system.baseItem","system.category","system.group","system.level","system.maxTakable","system.potencyRune","system.slug","system.traits"]}));progress.close({label:localize("LoadingComplete")});const filteredItems=indexData.flatMap(d=>d.contents).filter(s=>s.type===itemType).map(source=>{const parsedUUID=foundry.utils.parseUuid(source.uuid),pack=parsedUUID.collection instanceof CompendiumCollection?parsedUUID.collection.metadata.id:null;return new ItemProxyPF2e(deepClone(source),{pack})}).concat(game.items.filter(i=>i.type===itemType)).filter(i=>filter2.test([...i.getRollOptions("item"),...actorRollOptions])),existing=new Map;for(const feat of this.actor.itemTypes.feat){const slug=feat.slug??sluggify(feat.name);existing.set(slug,(existing.get(slug)??0)+1)}for(const feat of tempItems.filter(i=>i.type==="feat")){const slug=feat.slug??sluggify(feat.name);existing.set(slug,(existing.get(slug)??0)+1)}return filteredItems.filter(i=>i instanceof FeatPF2e?(existing.get(i.slug??sluggify(i.name))??0)({value:choices.slugsAsValues?f.slug??sluggify(f.name):f.uuid,label:f.name,img:f.img}))}};_setDefaultFlag=new WeakSet,setDefaultFlag_fn=__name2(function(source){return source.flag=typeof source.flag=="string"&&source.flag.length>0?source.flag.replace(/[^-a-z0-9]/gi,""):sluggify(this.slug??this.item.slug??this.item.name,{camel:"dromedary"})},"#setDefaultFlag"),_choicesFromArray=new WeakSet,choicesFromArray_fn=__name2(function(choices,actorRollOptions){return choices.filter(c=>this.resolveInjectedProperties(new PredicatePF2e(c.predicate??[])).test(actorRollOptions))},"#choicesFromArray"),_choicesFromPath=new WeakSet,choicesFromPath_fn=__name2(function(path){const choiceObject=getProperty(CONFIG.PF2E,path)??getProperty(this.actor,path)??{};return Array.isArray(choiceObject)&&choiceObject.every(c=>isObject(c)&&typeof c.value=="string")?choiceObject:isObject(choiceObject)&&Object.values(choiceObject).every(c=>typeof c=="string")?Object.entries(choiceObject).map(([value,label])=>({value,label:String(label)})):[]},"#choicesFromPath"),_choicesFromOwnedItems=new WeakSet,choicesFromOwnedItems_fn=__name2(function(options,actorRollOptions,tempItems){const{includeHandwraps,types}=options,predicate=new PredicatePF2e(this.resolveInjectedProperties(options.predicate)),choices=this.actor.items.filter(i=>i.isOfType(...types)&&predicate.test([...actorRollOptions,...i.getRollOptions("item")])).filter(i=>!i.isOfType("weapon")||i.category!=="unarmed").map(i=>({img:i.img,label:i.name,value:i.id}));return includeHandwraps&&choices.push(...this.actor.itemTypes.weapon.filter(i=>i.slug==="handwraps-of-mighty-blows"&&predicate.test([...actorRollOptions,...i.getRollOptions("item")])).map(h=>({img:h.img,label:h.name,value:"unarmed"}))),choices.push(...tempItems.filter(i=>i.isOfType(...types)&&predicate.test([...actorRollOptions,...i.getRollOptions("item")])).filter(i=>!i.isOfType("weapon")||i.category!=="unarmed").map(i=>({img:i.img,label:i.name,value:i.id}))),choices},"#choicesFromOwnedItems"),_choicesFromAttacks=new WeakSet,choicesFromAttacks_fn=__name2(function(predicate,actorRollOptions){return this.actor.isOfType("character","npc")?this.actor.system.actions.filter(a=>a.item.isOfType("melee","weapon")&&predicate.test([...actorRollOptions,...a.item.getRollOptions("item")])).map(a=>({img:a.item.img,label:a.item.name,value:a.item.slug??sluggify(a.item.name)})):[]},"#choicesFromAttacks"),_getPreselection=new WeakSet,getPreselection_fn=__name2(function(){return(Array.isArray(this.choices)?this.choices.find(c=>c.value===this.selection):null)??null},"#getPreselection"),_setRollOption=new WeakSet,setRollOption_fn=__name2(function(selection){if(!(this.rollOption&&(typeof selection=="string"||typeof selection=="number")))return;const suffix=UUIDUtils.isItemUUID(selection)?"":`:${selection}`;this.actor.rollOptions.all[`${this.rollOption}${suffix}`]=!0},"#setRollOption"),__name2(_ChoiceSetRuleElement,"ChoiceSetRuleElement");let ChoiceSetRuleElement=_ChoiceSetRuleElement;const _CraftingEntryRuleElement=class extends RuleElementPF2e{static{__name(this,"_CraftingEntryRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),isAlchemical:new fields2.BooleanField({required:!1,initial:void 0}),isDailyPrep:new fields2.BooleanField({required:!1,initial:void 0}),isPrepared:new fields2.BooleanField({required:!1,initial:void 0}),maxItemLevel:new ResolvableValueField({required:!1,nullable:!1,initial:1}),maxSlots:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),craftableItems:new PredicateField,preparedFormulas:new fields2.ArrayField(new fields2.SchemaField({itemUUID:new fields2.StringField({required:!0,blank:!1}),quantity:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),sort:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),expended:new fields2.BooleanField({required:!1,initial:void 0}),isSignatureItem:new fields2.BooleanField({required:!1,initial:void 0})},{required:!0,nullable:!1}),{initial:[]})}}constructor(data,options){super({priority:19,...data},options)}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),craftableItems=this.craftableItems??[];if(!PredicatePF2e.isValid(craftableItems))return this.failValidation("Malformed craftableItems predicate");this.actor.system.crafting.entries[this.selector]={selector,name:this.label,isAlchemical:this.isAlchemical,isDailyPrep:this.isDailyPrep,isPrepared:this.isPrepared,craftableItems,maxItemLevel:Number(this.resolveValue(this.maxItemLevel))||1,maxSlots:this.maxSlots,parentItem:this.item.id,preparedFormulaData:this.preparedFormulas};const option=sluggify(this.selector);this.actor.rollOptions.all[`crafting:entry:${option}`]=!0}};__name2(_CraftingEntryRuleElement,"CraftingEntryRuleElement"),__publicField(_CraftingEntryRuleElement,"validActorTypes",["character"]);let CraftingEntryRuleElement=_CraftingEntryRuleElement;const _CraftingFormulaRuleElement=class extends RuleElementPF2e{static{__name(this,"_CraftingFormulaRuleElement")}constructor(data,options){if(super(data,options),!(typeof data.uuid=="string"&&/^(?:Compendium|Item)\..*[a-z0-9]{16}$/i.test(data.uuid))){const{item}=this;this.failValidation(`Crafting formula rule element on ${item.name} (${item.uuid}) has a malformed UUID`)}}beforePrepareData(){this.ignored||this.actor.system.crafting.formulas.find(f=>f.uuid===this.data.uuid)||this.actor.system.crafting.formulas.push({uuid:this.data.uuid})}};__name2(_CraftingFormulaRuleElement,"CraftingFormulaRuleElement"),__publicField(_CraftingFormulaRuleElement,"validActorTypes",["character"]);let CraftingFormulaRuleElement=_CraftingFormulaRuleElement;const _CritSpecRuleElement=class extends RuleElementPF2e{static{__name(this,"_CritSpecRuleElement")}constructor(){super(...arguments),__privateAdd(this,_getEffect)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),alternate:new fields2.BooleanField,text:new fields2.StringField({blank:!1,nullable:!0,initial:null}),damageDice:new fields2.SchemaField({number:new ResolvableValueField({required:!0,nullable:!1,initial:void 0}),faces:new fields2.NumberField({required:!0,nullable:!1,choices:[4,6,8,10,12],initial:void 0}),damageType:new fields2.StringField({required:!1,nullable:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:null}),category:new fields2.StringField({required:!1,nullable:!0,choices:Array.from(DAMAGE_CATEGORIES_UNIQUE),initial:null})},{required:!1,nullable:!0,initial:null}),modifier:new fields2.SchemaField({type:new fields2.StringField({required:!0,nullable:!1,choices:Array.from(MODIFIER_TYPES),initial:"untyped"}),damageType:new fields2.StringField({required:!1,nullable:!0,choices:()=>CONFIG.PF2E.damageTypes,initial:null}),category:new fields2.StringField({required:!1,nullable:!0,choices:Array.from(DAMAGE_CATEGORIES_UNIQUE),initial:null}),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0})},{required:!1,nullable:!0,initial:null})}}static validateJoint(data){if(super.validateJoint(data),data.alternate&&!data.text&&!data.damageDice&&!data.modifier)throw Error(" alternate: must also include at least one of text, damage dice, or modifier");if(!data.alternate&&(data.text||data.damageDice||data.modifier)){const badProperty=["text","damageDice","modifier"].find(k=>data[k]);throw Error(` ${badProperty}: may only be used if alternate is true`)}}beforePrepareData(){if(this.ignored)return;const synthetic=__name2((weapon,options)=>this.resolveInjectedProperties(this.predicate).test(options)?__privateMethod(this,_getEffect,getEffect_fn).call(this,weapon):null,"synthetic");this.ignored||this.actor.synthetics.criticalSpecalizations[this.alternate?"alternate":"standard"].push(synthetic)}};_getEffect=new WeakSet,getEffect_fn=__name2(function(weapon){const text=this.text?this.resolveInjectedProperties(this.text.trim()):null,slug="critical-specialization",label="PF2E.Actor.Creature.CriticalSpecialization",note=__name2(()=>this.alternate&&!this.text?null:new RollNotePF2e({selector:"strike-damage",title:label,text:text??`PF2E.Item.Weapon.CriticalSpecialization.${weapon.group}`,outcome:["criticalSuccess"]}),"note"),resolveInteger=__name2((value,fallback)=>{const resolved=this.resolveValue(value,0,{resolvables:{weapon}});return Math.clamped(Math.trunc(Math.abs(Number(resolved))),1,10)||fallback},"resolveInteger"),damageDice=__name2(()=>this.alternate&&this.damageDice?new DamageDicePF2e({slug,label,selector:"strike-damage",diceNumber:resolveInteger(this.damageDice.number,1),dieSize:`d${this.damageDice.faces}`,damageType:this.damageDice.damageType,category:this.damageDice.category,critical:!0}):null,"damageDice"),modifier=__name2(()=>this.alternate&&this.modifier?new ModifierPF2e({slug,label,type:this.modifier.type,modifier:resolveInteger(this.modifier.value,0),damageType:this.modifier.damageType,damageCategory:this.modifier.category,critical:!0}):null,"modifier");if(this.alternate)return compact([note(),damageDice(),modifier()]);switch(weapon.group){case"dart":case"knife":{const dice=new DamageDicePF2e({slug,selector:"strike-damage",label,damageType:"bleed",diceNumber:1,dieSize:"d6",critical:!0}),bonusValue=AutomaticBonusProgression.isEnabled(this.actor)?AutomaticBonusProgression.getAttackPotency(this.actor.level):weapon.isOfType("melee")?weapon.linkedWeapon?.system.runes.potency??0:weapon.system.runes.potency,bonus=bonusValue>0?new ModifierPF2e({slug,label,type:"item",damageType:"bleed",modifier:bonusValue,critical:!0}):null;return[dice,bonus??[]].flat()}case"pick":return weapon.baseDamage.die?[new ModifierPF2e({slug,label,type:"untyped",modifier:2*weapon.baseDamage.dice,critical:!0})]:[];default:return weapon.group?compact([note()]):[]}},"#getEffect"),__name2(_CritSpecRuleElement,"CritSpecRuleElement"),__publicField(_CritSpecRuleElement,"validActorTypes",["character","npc"]);let CritSpecRuleElement=_CritSpecRuleElement;const _DamageDiceRuleElement=class extends RuleElementPF2e{static{__name(this,"_DamageDiceRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_isValidOverride),__privateAdd(this,_resolvedBracketsIsValid),this.brackets=this.isBracketedValue(data.value)?data.value:null,data.override&&!__privateMethod(this,_isValidOverride,isValidOverride_fn).call(this,data.override)&&(this.failValidation("The override property must be an object with one property of 'upgrade' (boolean),","'downgrade (boolean)', 'diceNumber' (integer between 0 and 10), 'dieSize' (d6-d12), or 'damageType'","(recognized damage type)"),this.override=null)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,initial:void 0})),diceNumber:new ResolvableValueField({required:!1,initial:void 0}),dieSize:new fields2.StringField({required:!1,blank:!1,nullable:!0,initial:null}),damageType:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),critical:new fields2.BooleanField({required:!1,nullable:!0,initial:void 0}),category:new fields2.StringField({choices:["persistent","precision","splash"],required:!1,blank:!1,initial:void 0}),brackets:new ResolvableValueField({required:!1,nullable:!0,initial:void 0}),override:new fields2.ObjectField({required:!1,nullable:!0,initial:void 0})}}beforePrepareData(){if(!this.ignored)for(const selector of this.resolveInjectedProperties(this.selector)){if(selector==="null")continue;const deferredDice=__name2((params={})=>{const label=this.getReducedLabel(),testPassed=this.predicate.length===0||this.resolveInjectedProperties(this.predicate).test([...params.test??this.actor.getRollOptions(["damage"]),...this.item.getRollOptions("parent")]),resolveOptions={...params,warn:testPassed},diceNumber=Number(this.resolveValue(this.diceNumber,0,resolveOptions))||0;if(this.ignored)return null;const resolvedBrackets=this.resolveValue(this.brackets,{},resolveOptions);if(!__privateMethod(this,_resolvedBracketsIsValid,resolvedBracketsIsValid_fn).call(this,resolvedBrackets))return testPassed&&this.failValidation("Brackets failed to validate"),null;const damageType=this.resolveInjectedProperties(this.damageType,resolveOptions);if(damageType!==null&&!objectHasKey(CONFIG.PF2E.damageTypes,damageType))return testPassed&&this.failValidation(`Unrecognized damage type: ${damageType}`),null;if(this.override){if(this.override.damageType&&=this.resolveInjectedProperties(this.override.damageType,resolveOptions),"damageType"in this.override&&!objectHasKey(CONFIG.PF2E.damageTypes,this.override.damageType))return testPassed&&this.failValidation("Unrecognized damage type in override"),null;if(this.override.diceNumber&&=Math.floor(Number(this.resolveValue(this.override.diceNumber,resolveOptions))),typeof this.override.diceNumber=="number"&&this.override.diceNumber<0)return testPassed&&this.failValidation("A dice number must resolve to at least zero"),null;if(this.override.dieSize&&=this.resolveInjectedProperties(this.override.dieSize,resolveOptions),"dieSize"in this.override&&!setHasElement(DAMAGE_DIE_FACES,this.override.dieSize))return testPassed&&this.failValidation("Unrecognized die size in override"),null}const dieSize=this.resolveInjectedProperties(this.dieSize,resolveOptions);return dieSize!==null&&!setHasElement(DAMAGE_DIE_FACES,dieSize)?(testPassed&&this.failValidation("Die size must be a recognized damage die size, null, or omitted"),null):new DamageDicePF2e({selector,slug:this.slug??sluggify(this.item.name),label,diceNumber,dieSize,critical:this.critical,category:this.category,damageType,predicate:this.predicate,override:deepClone(this.override),enabled:testPassed,...resolvedBrackets})},"deferredDice");(this.actor.synthetics.damageDice[selector]??=[]).push(deferredDice)}}};_isValidOverride=new WeakSet,isValidOverride_fn=__name2(function(override){return override===void 0?!0:isObject(override)&&(typeof override.upgrade=="boolean"&&!("downgrade"in override)||typeof override.downgrade=="boolean"&&!("upgrade"in override)||typeof override.damageType=="string"||typeof override.dieSize=="string"||typeof override.diceNumber=="string"||typeof override.diceNumber=="number"&&Number.isInteger(override.diceNumber)&&override.diceNumber>=0&&override.diceNumber<=256)},"#isValidOverride"),_resolvedBracketsIsValid=new WeakSet,resolvedBracketsIsValid_fn=__name2(function(value){if(!isObject(value))return!1;const keysAreValid=Object.keys(value).every(k=>["diceNumber","dieSize","override"].includes(k)),diceNumberIsValid=!("diceNumber"in value)||typeof value.diceNumber=="number",dieSizeIsValid=!("dieSize"in value)||setHasElement(DAMAGE_DIE_FACES,value.dieSize),overrideIsValid=!("override"in value)||__privateMethod(this,_isValidOverride,isValidOverride_fn).call(this,value.override);return keysAreValid&&diceNumberIsValid&&dieSizeIsValid&&overrideIsValid},"#resolvedBracketsIsValid"),__name2(_DamageDiceRuleElement,"DamageDiceRuleElement");let DamageDiceRuleElement=_DamageDiceRuleElement;const _DexterityModifierCapRuleElement=class extends RuleElementPF2e{static{__name(this,"_DexterityModifierCapRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1})}}beforePrepareData(){if(!this.test())return;const value=this.resolveValue(this.value);if(typeof value!="number")return this.failValidation("value must be a number");this.actor.synthetics.dexterityModifierCaps.push({value,source:this.label})}};__name2(_DexterityModifierCapRuleElement,"DexterityModifierCapRuleElement"),__publicField(_DexterityModifierCapRuleElement,"validActorTypes",["character","npc"]);let DexterityModifierCapRuleElement=_DexterityModifierCapRuleElement;const _EphemeralEffectRuleElement=class extends RuleElementPF2e{static{__name(this,"_EphemeralEffectRuleElement")}constructor(){super(...arguments),__privateAdd(this,_createDeferredEffect)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),affects:new fields2.StringField({required:!0,choices:["target","origin"],initial:"target"}),selectors:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,nullable:!1,initial:void 0})),uuid:new fields2.StringField({required:!0,blank:!1,nullable:!1,initial:void 0}),adjustName:new fields2.BooleanField({required:!0,nullable:!1,initial:!0}),alterations:new fields2.ArrayField(new fields2.EmbeddedDataField(ItemAlteration),{required:!1,nullable:!1,initial:[]})}}static validateJoint(data){if(super.validateJoint(data),data.selectors.length===0)throw Error("must have at least one selector")}afterPrepareData(){for(const selector of this.resolveInjectedProperties(this.selectors)){const deferredEffect=__privateMethod(this,_createDeferredEffect,createDeferredEffect_fn).call(this);(this.actor.synthetics.ephemeralEffects[selector]??={target:[],origin:[]})[this.affects].push(deferredEffect)}}};_createDeferredEffect=new WeakSet,createDeferredEffect_fn=__name2(function(){return async(params={})=>{if(!this.test(params.test??this.actor.getRollOptions()))return null;const uuid=this.resolveInjectedProperties(this.uuid);if(!UUIDUtils.isItemUUID(uuid))return this.failValidation(`"${uuid}" does not look like a UUID`),null;const effect=game.pf2e.ConditionManager.conditions.get(uuid)??await fromUuid(uuid);if(!(effect instanceof ItemPF2e&&effect.isOfType("condition","effect")))return this.failValidation(`unable to find effect or condition item with uuid "${uuid}"`),null;const source=effect.toObject();if(source.system.rules.some(r=>typeof r.key=="string"&&(r.key==="ChoiceSet"||r.key==="GrantItem"&&!("inMemoryOnly"in r&&r.inMemoryOnly===!0)))&&this.failValidation("an ephemeral effect may not include a choice set or grant"),this.adjustName){const label=this.getReducedLabel();source.name=`${source.name} (${label})`}try{for(const alteration of this.alterations)alteration.applyTo(source)}catch(error){return error instanceof Error&&this.failValidation(error.message),null}return source}},"#createDeferredEffect"),__name2(_EphemeralEffectRuleElement,"EphemeralEffectRuleElement");let EphemeralEffectRuleElement=_EphemeralEffectRuleElement;const _FastHealingRuleElement=class extends RuleElementPF2e{static{__name(this,"_FastHealingRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1}),type:new fields2.StringField({required:!1,nullable:!1,choices:["fast-healing","regeneration"],initial:"fast-healing"}),details:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),deactivatedBy:new fields2.ArrayField(new fields2.StringField({required:!0,nullable:!1,blank:!1}),{required:!1,initial:void 0})}}static validateJoint(data){if(super.validateJoint(data),data.type==="fast-healing"){if(data.deactivatedBy)throw data.ignored=!0,Error("deactivatedBy is only valid for type regeneration");data.details&&(data.details=game.i18n.localize(data.details))}else if(data.type==="regeneration"){if(data.details)throw data.ignored=!0,Error("details is only valid for type fast-healing");if(data.deactivatedBy?.length){const typesArr=data.deactivatedBy.map(type=>objectHasKey(CONFIG.PF2E.weaknessTypes,type)?game.i18n.localize(CONFIG.PF2E.weaknessTypes[type]):type),types=localizeList(typesArr);data.details=game.i18n.format("PF2E.Encounter.Broadcast.FastHealing.DeactivatedBy",{types})}}}async onTurnStart(){if(!this.test())return;const value=this.resolveValue(this.value);if(typeof value!="number"&&typeof value!="string")return this.failValidation("value must be a number or a roll formula");const roll=(await new DamageRoll(`${value}`).evaluate({async:!0})).toJSON(),receivedMessage=game.i18n.localize(`PF2E.Encounter.Broadcast.FastHealing.${this.type}.ReceivedMessage`),postFlavor=`
${this.details??this.getReducedLabel()}
`,flavor=`
${receivedMessage}
${postFlavor}`,rollMode=this.actor.hasPlayerOwner?"publicroll":"gmroll",speaker=ChatMessagePF2e.getSpeaker({actor:this.actor,token:this.token});ChatMessagePF2e.create({flavor,speaker,type:CONST.CHAT_MESSAGE_TYPES.ROLL,rolls:[roll]},{rollMode})}};__name2(_FastHealingRuleElement,"FastHealingRuleElement"),__publicField(_FastHealingRuleElement,"validActorTypes",["character","npc","familiar"]);let FastHealingRuleElement=_FastHealingRuleElement;const _FixedProficiencyRuleElement=class extends RuleElementPF2e{static{__name(this,"_FixedProficiencyRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),value:new ResolvableValueField({required:!0,initial:void 0}),ability:new fields2.StringField({required:!0,choices:[...ATTRIBUTE_ABBREVIATIONS]})}}static validateJoint(data){data.selector==="ac"&&(data.ability="dex")}beforePrepareData(){const selector=this.resolveInjectedProperties(this.selector),proficiencyBonus=Number(this.resolveValue(this.value))||0,abilityModifier=this.ability?this.actor.system.abilities[this.ability].mod:0,modifier=new ModifierPF2e({type:"proficiency",slug:this.slug??sluggify(this.label),label:this.label,modifier:proficiencyBonus+abilityModifier});(this.actor.synthetics.modifiers[selector]??=[]).push(()=>modifier)}afterPrepareData(){const selector=this.resolveInjectedProperties(this.selector),systemData=this.actor.system,proficiency=SKILL_EXPANDED[selector]?.shortForm??selector,statistic=setHasElement(SKILL_ABBREVIATIONS,proficiency)?this.actor.skills[proficiency]:proficiency==="ac"?systemData.attributes.ac:null;if(statistic){const toIgnore=statistic.modifiers.filter(m=>m.type==="proficiency"&&m.slug!==this.slug);for(const modifier of toIgnore)modifier.predicate=new PredicatePF2e(`overridden-by-${this.slug}`)}}};__name2(_FixedProficiencyRuleElement,"FixedProficiencyRuleElement"),__publicField(_FixedProficiencyRuleElement,"validActorTypes",["character"]);let FixedProficiencyRuleElement=_FixedProficiencyRuleElement;const _FlatModifierRuleElement=class extends RuleElementPF2e{static{__name(this,"_FlatModifierRuleElement")}constructor(source,options){super(source,options),!this.item.isOfType("physical")&&this.type!=="item"&&(this.fromEquipment=!1),this.type==="ability"&&(this.ability?(this.slug=this.ability,this.label=CONFIG.PF2E.abilities[this.ability],this.value=`@actor.abilities.${source.ability}.mod`):this.failValidation('A flat modifier of type "ability" must also have an "ability" property with an ability abbreviation')),this.critical=typeof source.critical=="boolean"&&this.selectors.some(s=>s.includes("damage"))?source.critical:null,this.force&&this.type==="untyped"&&this.failValidation("A forced bonus or penalty must have a type"),this.removeAfterRoll&&!this.item.isOfType("effect")&&this.failValidation(" removeAfterRoll: may only be used with effects")}static validateJoint(data){if(super.validateJoint(data),data.type!=="ability"&&data.value===void 0)throw Error('must have defined value if type is not "ability"')}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,initial:void 0})),type:new fields2.StringField({required:!0,choices:Array.from(MODIFIER_TYPES),initial:"untyped"}),ability:new fields2.StringField({required:!1,choices:CONFIG.PF2E.abilities,initial:void 0}),min:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),max:new fields2.NumberField({required:!1,nullable:!1,initial:void 0}),force:new fields2.BooleanField,hideIfDisabled:new fields2.BooleanField,fromEquipment:new fields2.BooleanField({required:!0,nullable:!1,initial:!0}),damageType:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:void 0}),damageCategory:new fields2.StringField({required:!1,blank:!1,choices:damageCategoriesUnique,initial:void 0}),critical:new fields2.BooleanField({required:!1,nullable:!0,initial:null}),value:new ResolvableValueField({required:!1,nullable:!1,initial:void 0}),removeAfterRoll:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["if-enabled"],initial:void 0}),new StrictBooleanField({required:!1,nullable:!1,initial:void 0}),new PredicateField({required:!1,nullable:!1,initial:void 0})],{required:!1,nullable:!1,initial:!1})}}get selectors(){return this.selector}beforePrepareData(){if(this.ignored)return;const label=this.getReducedLabel(),slug=this.slug??sluggify(label),selectors=this.selectors.map(s=>this.resolveInjectedProperties(s)).filter(s=>!!s);if(selectors.length===0)return this.failValidation("must have at least one selector");for(const selector of selectors){if(selector==="null")continue;const construct=__name2((options={})=>{const resolvedValue=Number(this.resolveValue(this.value,0,options))||0;if(this.ignored)return null;const finalValue=Math.clamped(resolvedValue,this.min??resolvedValue,this.max??resolvedValue);if(game.pf2e.variantRules.AutomaticBonusProgression.suppressRuleElement(this,finalValue))return null;const damageType=this.damageType&&this.resolveInjectedProperties(this.damageType,{warn:!1})||null;if(damageType!==null&&!objectHasKey(CONFIG.PF2E.damageTypes,damageType))return this.test(options.test??[])&&this.failValidation(`Unrecognized damage type: ${damageType}`),null;const modifier=new ModifierPF2e({slug,label,modifier:finalValue,type:this.type,ability:this.type==="ability"?this.ability:null,predicate:this.resolveInjectedProperties(this.predicate),rule:this,force:this.force,damageType,damageCategory:this.damageCategory,critical:this.critical,hideIfDisabled:this.hideIfDisabled,source:this.item.uuid});return options.test&&modifier.test(options.test),modifier},"construct");(this.actor.synthetics.modifiers[selector]??=[]).push(construct)}}async afterRoll({check,rollOptions}){if(this.ignored||!this.removeAfterRoll||!this.item.isOfType("effect"))return;(this.removeAfterRoll===!0||this.removeAfterRoll==="if-enabled"&&check.modifiers.some(m=>m.rule===this&&m.enabled)||Array.isArray(this.removeAfterRoll)&&this.removeAfterRoll.test(rollOptions))&&await this.item.delete()}};__name2(_FlatModifierRuleElement,"FlatModifierRuleElement");let FlatModifierRuleElement=_FlatModifierRuleElement;const _GrantItemRuleElement=class extends RuleElementPF2e{static{__name(this,"_GrantItemRuleElement")}constructor(data,options){data.inMemoryOnly&&(data.priority??=99),super(data,options),__privateAdd(this,_getOnDeleteActions),__privateAdd(this,_applyChoicePreselections),__privateAdd(this,_setGrantFlags),__privateAdd(this,_runGrantedItemPreCreates),__privateAdd(this,_createInMemoryCondition),__privateAdd(this,_trackItem),__publicField(this,"grantedId"),__publicField(this,"preselectChoices"),__publicField(this,"onDeleteActions"),this.inMemoryOnly?(this.reevaluateOnUpdate=!0,this.allowDuplicate=!0):this.reevaluateOnUpdate&&(this.allowDuplicate=!1),this.onDeleteActions=__privateMethod(this,_getOnDeleteActions,getOnDeleteActions_fn).call(this,data);const isValidPreselect=__name2(p=>Object.values(p).every(v=>["string","number"].includes(typeof v)),"isValidPreselect");if(this.preselectChoices=isObject(data.preselectChoices)&&isValidPreselect(data.preselectChoices)?deepClone(data.preselectChoices):{},this.grantedId=this.item.flags.pf2e.itemGrants[this.flag??""]?.id??null,this.track){const grantedItem=this.actor.inventory.get(this.grantedId??"")??null;__privateMethod(this,_trackItem,trackItem_fn).call(this,grantedItem)}this.item.isOfType("physical")&&this.failValidation("parent item must not be physical")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),uuid:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0,label:"PF2E.UUID.Label"}),flag:new SlugField({required:!0,nullable:!0,initial:null,camel:"dromedary"}),reevaluateOnUpdate:new fields2.BooleanField({label:"PF2E.RuleEditor.GrantItem.ReevaluateOnUpdate"}),inMemoryOnly:new fields2.BooleanField,allowDuplicate:new fields2.BooleanField({initial:!0,label:"PF2E.RuleEditor.GrantItem.AllowDuplicate"}),alterations:new StrictArrayField(new fields2.EmbeddedDataField(ItemAlteration)),track:new fields2.BooleanField}}static validateJoint(data){if(super.validateJoint(data),data.track&&!data.flag)throw Error("must have explicit flag set if granted item is tracked");if(data.reevaluateOnUpdate&&data.predicate.length===0)throw Error("reevaluateOnUpdate: must have non-empty predicate")}async preCreate(args){if(this.inMemoryOnly)return;const{itemSource,pendingItems,context}=args,ruleSource=args.ruleSource,uuid=this.resolveInjectedProperties(this.uuid),grantedItem=await(async()=>{try{return(await fromUuid(uuid))?.clone()??null}catch(error){return console.error(error),null}})();if(!(grantedItem instanceof ItemPF2e)||(ruleSource.flag=typeof ruleSource.flag=="string"&&ruleSource.flag.length>0?sluggify(ruleSource.flag,{camel:"dromedary"}):(()=>{const defaultFlag=sluggify(grantedItem.slug??grantedItem.name,{camel:"dromedary"}),flagPattern=new RegExp(`^${defaultFlag}\\d*$`),itemGrants=itemSource.flags?.pf2e?.itemGrants??{},nthGrant=Object.keys(itemGrants).filter(g=>flagPattern.test(g)).length;return nthGrant>0?`${defaultFlag}${nthGrant+1}`:defaultFlag})(),this.flag=String(ruleSource.flag),!this.test()))return;const existingItem=this.actor.items.find(i=>i.sourceId===uuid);if(!this.allowDuplicate&&existingItem){__privateMethod(this,_setGrantFlags,setGrantFlags_fn).call(this,itemSource,existingItem),ui.notifications.info(game.i18n.format("PF2E.UI.RuleElements.GrantItem.AlreadyHasItem",{actor:this.actor.name,item:grantedItem.name}));return}itemSource._id??=randomID();const grantedSource=grantedItem.toObject();grantedSource._id=randomID(),itemSource.type==="effect"&&grantedSource.type==="effect"&&(grantedSource.system.level.value=itemSource.system?.level?.value??grantedSource.system.level.value),grantedSource.flags=mergeObject(grantedSource.flags,{core:{sourceId:uuid}});try{for(const alteration of this.alterations)alteration.applyTo(grantedSource)}catch(error){error instanceof Error&&this.failValidation(error.message)}const tempGranted=new ItemProxyPF2e(deepClone(grantedSource),{parent:this.actor});if(tempGranted.isOfType("affliction","condition","effect")&&this.actor.isImmuneTo(tempGranted)){ruleSource.ignored=!0;return}tempGranted.prepareActorData?.();for(const rule of tempGranted.prepareRuleElements({suppressWarnings:!0}))rule.onApplyActiveEffects?.();if(__privateMethod(this,_applyChoicePreselections,applyChoicePreselections_fn).call(this,tempGranted),!this.ignored){args.tempItems.push(tempGranted);for(const item of[this.item,tempGranted])if(item.isOfType("class","feat")){const prefix=item.isOfType("class")||!item.isFeature?item.type:"feature",slug=item.slug??sluggify(item.name);this.actor.rollOptions.all[`self:${prefix}:${slug}`]=!0}this.grantedId=grantedSource._id,context.keepId=!0,__privateMethod(this,_setGrantFlags,setGrantFlags_fn).call(this,itemSource,grantedSource),__privateMethod(this,_trackItem,trackItem_fn).call(this,tempGranted),args.reevaluation||await __privateMethod(this,_runGrantedItemPreCreates,runGrantedItemPreCreates_fn).call(this,args,tempGranted,grantedSource,context),pendingItems.push(grantedSource)}}async preUpdateActor(){const noAction={create:[],delete:[]};if(!this.reevaluateOnUpdate||this.inMemoryOnly)return noAction;if(this.grantedId&&this.actor.items.has(this.grantedId))return this.test()?noAction:{create:[],delete:[this.grantedId]};const itemSource=this.item.toObject(),ruleSource=itemSource.system.rules[this.sourceIndex??-1];if(!ruleSource)return noAction;const pendingItems=[],context={parent:this.actor,render:!1};if(await this.preCreate({itemSource,pendingItems,ruleSource,tempItems:[],context,reevaluation:!0}),pendingItems.length>0){const updatedGrants=itemSource.flags.pf2e?.itemGrants??{};return await this.item.update({"flags.pf2e.itemGrants":updatedGrants},{render:!1}),{create:pendingItems,delete:[]}}return noAction}onApplyActiveEffects(){const condition=__privateMethod(this,_createInMemoryCondition,createInMemoryCondition_fn).call(this);if(!condition)return;const{actor}=this;condition.rules=condition.prepareRuleElements();for(const rule of condition.rules)rule.onApplyActiveEffects?.(),rule.beforePrepareData?.(),actor.rules.push(rule);actor.conditions.set(condition.id,condition)}};_getOnDeleteActions=new WeakSet,getOnDeleteActions_fn=__name2(function(data){const actions=data.onDeleteActions;if(isObject(actions)){const ACTIONS=_GrantItemRuleElement.ON_DELETE_ACTIONS;return tupleHasValue(ACTIONS,actions.granter)||tupleHasValue(ACTIONS,actions.grantee)?pick(actions,[actions.granter?"granter":[],actions.grantee?"grantee":[]].flat()):null}return null},"#getOnDeleteActions"),_applyChoicePreselections=new WeakSet,applyChoicePreselections_fn=__name2(function(grantedItem){const source=grantedItem._source;for(const[flag,selection]of Object.entries(this.preselectChoices??{})){const rule=grantedItem.rules.find(rule2=>rule2 instanceof ChoiceSetRuleElement&&rule2.flag===flag);if(rule){const ruleSource=source.system.rules[grantedItem.rules.indexOf(rule)],resolvedSelection=this.resolveInjectedProperties(selection);rule.selection=ruleSource.selection=resolvedSelection}}},"#applyChoicePreselections"),_setGrantFlags=new WeakSet,setGrantFlags_fn=__name2(function(granter,grantee){const flags=mergeObject(granter.flags??{},{pf2e:{itemGrants:{}}});if(!this.flag)throw ErrorPF2e("Unexpected failure looking up RE flag key");flags.pf2e.itemGrants[this.flag]={id:grantee instanceof ItemPF2e?grantee.id:grantee._id,onDelete:this.onDeleteActions?.grantee??"detach"};const grantedBy={id:granter._id,onDelete:this.onDeleteActions?.granter??(setHasElement(PHYSICAL_ITEM_TYPES,grantee.type)?"detach":"cascade")};grantee instanceof ItemPF2e?grantee.update({"flags.pf2e.grantedBy":grantedBy},{render:!1}):grantee.flags=mergeObject(grantee.flags??{},{pf2e:{grantedBy}})},"#setGrantFlags"),_runGrantedItemPreCreates=new WeakSet,runGrantedItemPreCreates_fn=__name2(async function(originalArgs,grantedItem,grantedSource,context){for(const rule of grantedItem.rules){const ruleSource=grantedSource.system.rules[grantedItem.rules.indexOf(rule)];await rule.preCreate?.({...originalArgs,itemSource:grantedSource,ruleSource,context})}},"#runGrantedItemPreCreates"),_createInMemoryCondition=new WeakSet,createInMemoryCondition_fn=__name2(function(){if(!this.inMemoryOnly||!this.test())return null;const validationFailure="an in-memory-only grant must be a condition",uuid=this.resolveInjectedProperties(this.uuid);if(!UUIDUtils.isItemUUID(uuid))return this.failValidation(validationFailure),null;const conditionSource=game.pf2e.ConditionManager.conditions.get(uuid)?.toObject();if(!conditionSource)return this.failValidation(validationFailure),null;if(this.actor.isImmuneTo(conditionSource.system.slug))return null;for(const alteration of this.alterations)alteration.applyTo(conditionSource);const flags={pf2e:{grantedBy:{id:this.item.id,onDelete:"cascade"}}};conditionSource.flags.pf2e?.grantedBy;const condition=new ConditionPF2e(mergeObject(conditionSource,{_id:randomID(),flags,system:{references:{parent:{id:this.item.id}}}}),{parent:this.actor});return condition.prepareSiblingData(),condition.prepareActorData(),condition},"#createInMemoryCondition"),_trackItem=new WeakSet,trackItem_fn=__name2(function(grantedItem){if(!(this.track&&this.flag&&this.grantedId&&grantedItem instanceof PhysicalItemPF2e))return;this.actor.flags.pf2e.trackedItems[this.flag]=this.grantedId;const slug=sluggify(this.flag),rollOptionsAll=this.actor.rollOptions.all;for(const statement of grantedItem.getRollOptions(slug))rollOptionsAll[statement]=!0},"#trackItem"),__name2(_GrantItemRuleElement,"GrantItemRuleElement"),__publicField(_GrantItemRuleElement,"validActorTypes",["character","npc","familiar"]),__publicField(_GrantItemRuleElement,"ON_DELETE_ACTIONS",["cascade","detach","restrict"]);let GrantItemRuleElement=_GrantItemRuleElement;const _ItemAlterationRuleElement=class extends RuleElementPF2e{static{__name(this,"_ItemAlterationRuleElement")}constructor(){super(...arguments),__privateAdd(this,_applyAlteration)}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema(),PRIORITIES=AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES;return baseSchema.priority.initial=d=>(PRIORITIES[String(d.mode)]??50)+100,{...baseSchema,itemId:new fields2.StringField({required:!1,nullable:!1,blank:!1,initial:void 0}),itemType:new fields2.StringField({required:!1,nullable:!1,choices:mapValues$1(CONFIG.PF2E.Item.documentClasses,key=>`TYPES.Item.${key}`),initial:void 0}),...ItemAlteration.defineSchema()}}static validateJoint(data){if(super.validateJoint(data),!data.itemId&&!data.itemType)throw Error("one of itemId and itemType must be defined")}onApplyActiveEffects(){__privateMethod(this,_applyAlteration,applyAlteration_fn).call(this)}async preCreate({tempItems}){if(this.ignored||(this.itemType==="feat"&&__privateMethod(this,_applyAlteration,applyAlteration_fn).call(this,tempItems),this.property!=="hp-max"))return;const itemsOfType=this.itemType?this.actor.itemTypes[this.itemType]:[],actorRollOptions=this.actor.getRollOptions(),predicate=this.resolveInjectedProperties(this.predicate),updates=itemsOfType.filter(i=>predicate.test([...actorRollOptions,...i.getRollOptions("item")])).flatMap(item=>{const source=item.toObject(),alteration=new ItemAlteration(pick$1(this,["mode","property","value"]),{parent:this});alteration.applyTo(source),alteration.applyTo(item);const newHP=source.system.hp,oldHP=item._source.system.hp,newHPValue=Math.floor(oldHP.value*(newHP.max/oldHP.max));return newHPValue===oldHP.value?[]:{_id:item.id,"system.hp.value":newHPValue}});updates.length>0&&await this.actor.updateEmbeddedDocuments("Item",updates,{render:!1})}};_applyAlteration=new WeakSet,applyAlteration_fn=__name2(function(additionalItems=[]){if(this.ignored)return;const predicate=this.resolveInjectedProperties(this.predicate),actorRollOptions=predicate.length>0?this.actor.getRollOptions():[];try{const items=this.itemId?compact([this.actor.items.get(this.resolveInjectedProperties(this.itemId))]):this.itemType==="condition"?this.actor.conditions.contents:this.actor.itemTypes[this.itemType];items.push(...additionalItems.filter(i=>this.itemId&&i.id===this.itemId||this.itemType===i.type));for(const item of items){const itemRollOptions=predicate.length>0?item.getRollOptions("item"):[],rollOptions=[...actorRollOptions,...itemRollOptions];if(predicate.test(rollOptions)){const data=pick$1(this,["mode","property","value"]);new ItemAlteration(data,{parent:this}).applyTo(item)}}}catch(error){error instanceof Error&&this.failValidation(error.message)}},"#applyAlteration"),__name2(_ItemAlterationRuleElement,"ItemAlterationRuleElement");let ItemAlterationRuleElement=_ItemAlterationRuleElement;const _LoseHitPointsRuleElement=class extends RuleElementPF2e{static{__name(this,"_LoseHitPointsRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,initial:void 0}),reevaluateOnUpdate:new fields2.BooleanField({required:!1,initial:!1}),recoverable:new fields2.BooleanField({required:!1,initial:!0})}}onCreate(actorUpdates){if(this.ignored)return;const value=Math.trunc(Math.abs(Number(this.resolveValue(this.value))||0)),currentHP=this.actor._source.system.attributes.hp.value;actorUpdates["system.attributes.hp.value"]=Math.max(currentHP-value,0)}beforePrepareData(){if(this.ignored)return;const{actor}=this;if(!this.recoverable){const value=Math.trunc(Math.abs(Number(this.resolveValue(this.value))||0));actor.system.attributes.hp.unrecoverable+=value}}async preUpdate(changes){if(!this.reevaluateOnUpdate||this.ignored)return;const previousValue=Math.trunc(Math.abs(Number(this.resolveValue(this.value))||0)),newItem=this.item.clone(changes),rule=newItem.system.rules.find(r=>r.key===this.key),valueChange=Math.trunc(Math.abs(Number(this.resolveValue(String(rule?.value),0,{resolvables:{item:newItem}}))))-previousValue;if(valueChange>0){const currentHP=this.actor._source.system.attributes.hp.value;await this.actor.update({"system.attributes.hp.value":Math.max(currentHP-valueChange,0)},{render:!1})}}};__name2(_LoseHitPointsRuleElement,"LoseHitPointsRuleElement"),__publicField(_LoseHitPointsRuleElement,"validActorTypes",["character","familiar","npc"]);let LoseHitPointsRuleElement=_LoseHitPointsRuleElement;const ARMOR_CATEGORIES=new Set(["unarmored","light","medium","heavy","light-barding","heavy-barding"]),_MartialProficiencyRuleElement=class extends RuleElementPF2e{static{__name(this,"_MartialProficiencyRuleElement")}static defineSchema(){return{...super.defineSchema(),kind:new StrictStringField({required:!0,nullable:!1,choices:["attack","defense"],initial:"attack"}),definition:new PredicateField({required:!0,nullable:!1}),sameAs:new StrictStringField({required:!1,nullable:!1,choices:[...WEAPON_CATEGORIES,...ARMOR_CATEGORIES]}),maxRank:new StrictStringField({required:!1,nullable:!1,choices:["trained","expert","master","legendary"]}),value:new ResolvableValueField({required:!1,initial:void 0})}}constructor(data,options){super({priority:9,...data},options),this.slug??=sluggify(this.label)}onApplyActiveEffects(){if(!this.test())return;const rank=Math.clamped(Number(this.resolveValue(this.value))||1,1,4),key=this.kind==="attack"?"attacks":"defenses";this.actor.system.proficiencies[key][this.slug]={definition:this.resolveInjectedProperties(this.definition),immutable:!0,label:this.label,sameAs:this.sameAs,rank,maxRank:this.maxRank,value:0,breakdown:""}}};__name2(_MartialProficiencyRuleElement,"MartialProficiencyRuleElement"),__publicField(_MartialProficiencyRuleElement,"validActorTypes",["character"]);let MartialProficiencyRuleElement=_MartialProficiencyRuleElement;const _MultipleAttackPenaltyRuleElement=class extends RuleElementPF2e{static{__name(this,"_MultipleAttackPenaltyRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1,label:"PF2E.RuleEditor.General.Selector"}),value:new ResolvableValueField({required:!0,initial:void 0,label:"PF2E.RuleEditor.General.Value"})}}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),value=Number(this.resolveValue(this.value))||0;if(selector&&value&&value<0){const map2={label:game.i18n.format("PF2E.UI.RuleElements.MultipleAttackPenalty.Breakdown",{label:this.label}),penalty:value,predicate:this.predicate};(this.actor.synthetics.multipleAttackPenalties[selector]??=[]).push(map2)}else this.failValidation("must have a negative value")}};__name2(_MultipleAttackPenaltyRuleElement,"MultipleAttackPenaltyRuleElement");let MultipleAttackPenaltyRuleElement=_MultipleAttackPenaltyRuleElement;const _RollNoteRuleElement=class extends RuleElementPF2e{static{__name(this,"_RollNoteRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,initial:void 0}),{required:!0,nullable:!1}),title:new fields2.StringField({required:!1,nullable:!0,blank:!1,initial:null}),visibility:new fields2.StringField({required:!0,nullable:!0,choices:["gm","owner"],initial:null}),outcome:new fields2.ArrayField(new fields2.StringField({required:!0,blank:!1,choices:DEGREE_OF_SUCCESS_STRINGS}),{required:!1,nullable:!1,initial:void 0}),text:new DataUnionField([new StrictStringField({required:!0,blank:!1}),new ResolvableValueField],{required:!0,nullable:!1})}}beforePrepareData(){if(!this.ignored)for(const selector of this.resolveInjectedProperties(this.selector)){if(selector==="null")continue;const title=this.resolveInjectedProperties(this.title)?.trim()??null,text=this.resolveInjectedProperties(String(this.resolveValue(this.text,"",{evaluate:!1}))).trim();if(!text)return this.failValidation("text field resolved empty");const note=new RollNotePF2e({selector,title:title?this.getReducedLabel(title):null,text,predicate:this.resolveInjectedProperties(this.predicate),outcome:this.outcome,visibility:this.visibility,rule:this});(this.actor.synthetics.rollNotes[selector]??=[]).push(note)}}};__name2(_RollNoteRuleElement,"RollNoteRuleElement");let RollNoteRuleElement=_RollNoteRuleElement;const _RollOptionRuleElement=class extends RuleElementPF2e{static{__name(this,"_RollOptionRuleElement")}constructor(source,options){super(source,options),__privateAdd(this,_resolveOption),__privateAdd(this,_setFlag),__privateAdd(this,_setRollOption2),source.removeAfterRoll&&!this.item.isOfType("effect")&&this.failValidation("removeAfterRoll may only be used on rule elements from effect items"),this.toggleable==="totm"&&!game.settings.get("pf2e","totmToggles")&&(this.ignored=!0);const firstSuboption=this.suboptions.at(0);firstSuboption&&this.suboptions.every(s=>!s.selected)&&(firstSuboption.selected=!0)}static defineSchema(){const{fields:fields2}=foundry.data,baseSchema=super.defineSchema();return baseSchema.priority.initial=AELikeRuleElement.CHANGE_MODE_DEFAULT_PRIORITIES.override,{...baseSchema,domain:new fields2.StringField({required:!0,nullable:!1,initial:"all",blank:!1}),option:new fields2.StringField({required:!0,nullable:!1,blank:!1}),phase:new fields2.StringField({required:!1,nullable:!1,choices:deepClone(AELikeRuleElement.PHASES),initial:"applyAEs"}),suboptions:new fields2.ArrayField(new fields2.SchemaField({label:new fields2.StringField({required:!0,nullable:!1,blank:!1,initial:void 0}),value:new StrictStringField({required:!0,nullable:!1,blank:!1,initial:void 0}),predicate:new PredicateField,selected:new fields2.BooleanField}),{required:!1,nullable:!1,initial:[],validate:v=>Array.isArray(v)&&v.length!==1,validationError:"must have zero or 2+ suboptions"}),value:new ResolvableValueField({required:!1,initial:d=>!d.toggleable,validate:v=>["boolean","string"].includes(typeof v),validationError:"must be a boolean, string, or otherwise omitted"}),toggleable:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["totm"],initial:void 0}),new StrictBooleanField({required:!1,nullable:!1,initial:!1})],{required:!1,nullable:!1,initial:void 0}),placement:new fields2.StringField({required:!1,nullable:!1,initial:void 0}),disabledIf:new PredicateField({required:!1,initial:void 0}),disabledValue:new fields2.BooleanField({required:!1,initial:void 0}),alwaysActive:new fields2.BooleanField({required:!1,initial:void 0}),count:new fields2.BooleanField({required:!1,initial:void 0}),removeAfterRoll:new fields2.BooleanField({required:!1,initial:void 0})}}static validateJoint(source){if(super.validateJoint(source),source.suboptions.length>0&&!source.toggleable)throw Error(" suboptions: must be omitted if not toggleable");if(source.disabledIf&&!source.toggleable)throw Error(" disabledIf: must be false if not toggleable");if(source.count&&source.toggleable)throw Error(" count: must be false if toggleable");if(typeof source.disabledValue=="boolean"&&(!source.toggleable||!source.disabledIf))throw Error(" disabledValue: may only be included if toggeable and there is a disabledIf predicate.");if(source.alwaysActive&&(!source.toggleable||source.suboptions.length===0))throw Error(" alwaysActive: must be false unless toggleable and containing suboptions");if(source.placement&&!source.toggleable)throw Error(" placement: may only be present if toggleable")}async preCreate(){this.phase==="applyAEs"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}onApplyActiveEffects(){this.phase==="applyAEs"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}beforePrepareData(){this.phase==="beforeDerived"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}afterPrepareData(){this.phase==="afterDerived"&&__privateMethod(this,_setRollOption2,setRollOption_fn2).call(this)}resolveValue(){return this.toggleable==="totm"&&!game.settings.get("pf2e","totmToggles")?!1:this.alwaysActive?!0:!!super.resolveValue(this.value)}async toggle(newValue=!this.resolveValue(),newSuboption=null){if(!this.toggleable)throw ErrorPF2e("Attempted to toggle non-toggleable roll option");const rulesSource=this.item.toObject().system.rules,thisSource=typeof this.sourceIndex=="number"?rulesSource.at(this.sourceIndex):null;if(!thisSource)return null;if(thisSource.value=newValue,newSuboption&&Array.isArray(thisSource.suboptions)&&thisSource.suboptions.every(o=>isObject(o)))for(const suboption of thisSource.suboptions)suboption.selected=suboption.value===newSuboption;return(await this.actor.updateEmbeddedDocuments("Item",[{_id:this.item.id,"system.rules":rulesSource}])).length===1?newValue:null}beforeRoll(domains,rollOptions){if(!(this.test(rollOptions)&&domains.includes(this.domain)))return;this.value=this.resolveValue();const option=__privateMethod(this,_resolveOption,resolveOption_fn).call(this);this.value?rollOptions.add(option):rollOptions.delete(option)}async afterRoll({domains,rollOptions}){const option=__privateMethod(this,_resolveOption,resolveOption_fn).call(this);!this.ignored&&this.removeAfterRoll&&this.value&&this.actor.items.has(this.item.id)&&domains.includes(this.domain)&&rollOptions.has(option)&&(game.settings.get("pf2e","automation.removeExpiredEffects")?await this.item.delete():game.settings.get("pf2e","automation.effectExpiration")&&await this.item.update({"system.duration.value":-1,"system.expired":!0}))}};_resolveOption=new WeakSet,resolveOption_fn=__name2(function({appendSuboption=!0}={}){const baseOption=this.resolveInjectedProperties(this.option).replace(/[^-:\w]/g,"").replace(/:+/g,":").replace(/-+/g,"-").trim();if(appendSuboption){const selectedSuboption=this.suboptions.find(o=>o.selected);return selectedSuboption?`${baseOption}:${selectedSuboption.value}`:baseOption}else return baseOption},"#resolveOption"),_setFlag=new WeakSet,setFlag_fn=__name2(function(value){const suboption=this.suboptions.find(o=>o.selected)??this.suboptions.at(0);if(suboption){const flagKey=sluggify(__privateMethod(this,_resolveOption,resolveOption_fn).call(this,{appendSuboption:!1}),{camel:"dromedary"});if(value){const flagValue=/^\d+$/.test(suboption.value)?Number(suboption.value):suboption.value;this.item.flags.pf2e.rulesSelections[flagKey]=flagValue}else this.item.flags.pf2e.rulesSelections[flagKey]=null}},"#setFlag"),_setRollOption2=new WeakSet,setRollOption_fn2=__name2(function(){this.domain=this.resolveInjectedProperties(this.domain);const isStandardDomain=/^[-a-z0-9]+$/.test(this.domain)&&/[a-z]/.test(this.domain),isIdDomain=/^[a-zA-Z0-9]{16}-[-a-z0-9]+[a-z0-9]$/.test(this.domain);if(!isStandardDomain&&!isIdDomain)return this.failValidation("domain must be a string consisting of only lowercase letters, numbers, and hyphens.");const optionSet=new Set([this.actor.getRollOptions([this.domain]),this.parent.getRollOptions("parent")].flat());if(!this.test(optionSet))return __privateMethod(this,_setFlag,setFlag_fn).call(this,!1);const{rollOptions}=this.actor,domainRecord=rollOptions[this.domain]??={},baseOption=this.option=__privateMethod(this,_resolveOption,resolveOption_fn).call(this,{appendSuboption:!1});if(!baseOption){this.failValidation('The "option" property must be a string consisting of only letters, numbers, colons, and hyphens');return}if(this.count){const existing=Object.keys(domainRecord).flatMap(key=>({key,count:Number(new RegExp(`^${baseOption}:(\\d+)$`).exec(key)?.[1])})).find(keyAndCount=>!!keyAndCount.count);existing?(delete domainRecord[existing.key],domainRecord[`${baseOption}:${existing.count+1}`]=!0):domainRecord[`${baseOption}:1`]=!0}else{const suboptions=this.suboptions.filter(s=>s.predicate.test(optionSet));if(suboptions.length>0&&!suboptions.some(s=>s.selected)){suboptions[0].selected=!0;for(const otherSuboption of this.suboptions)otherSuboption!==suboptions[0]&&(otherSuboption.selected=!1)}else if(this.suboptions.length>0&&suboptions.length===0)return;const fullOption=__privateMethod(this,_resolveOption,resolveOption_fn).call(this),value=this.resolveValue();if(value&&(domainRecord[fullOption]=value,domainRecord[baseOption]=value),this.toggleable){const toggle={itemId:this.item.id,label:this.getReducedLabel(),placement:this.placement??"actions-tab",domain:this.domain,option:baseOption,suboptions,alwaysActive:!!this.alwaysActive,checked:value,enabled:!0};if(this.disabledIf){const rollOptions2=this.actor.getRollOptions([this.domain]);toggle.enabled=!this.disabledIf.test(rollOptions2),!toggle.enabled&&!this.alwaysActive&&typeof this.disabledValue=="boolean"&&(toggle.checked=this.disabledValue,this.disabledValue||delete domainRecord[fullOption])}this.actor.synthetics.toggles.push(toggle)}__privateMethod(this,_setFlag,setFlag_fn).call(this,value)}},"#setRollOption"),__name2(_RollOptionRuleElement,"RollOptionRuleElement");let RollOptionRuleElement=_RollOptionRuleElement;const _RollTwiceRuleElement=class extends RuleElementPF2e{static{__name(this,"_RollTwiceRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),keep:new fields2.StringField({required:!0,choices:["lower","higher"]}),removeAfterRoll:new fields2.BooleanField({required:!1,initial:void 0})}}beforePrepareData(){if(this.ignored)return;const synthetic={keep:this.keep};this.predicate&&(synthetic.predicate=this.predicate),(this.actor.synthetics.rollTwice[this.selector]??=[]).push(synthetic)}async afterRoll({domains,roll,rollOptions}){if(!this.actor.items.has(this.item.id))return;const expireEffects=game.settings.get("pf2e","automation.effectExpiration"),removeExpired=game.settings.get("pf2e","automation.removeExpiredEffects"),removeAfterRoll=this.removeAfterRoll??((expireEffects||removeExpired)&&this.item.isOfType("effect"));if((roll?.dice.some(d=>["kh","kl"].some(m=>d.modifiers.includes(m)))??!1)&&removeAfterRoll&&domains.includes(this.selector)&&this.test(rollOptions)){for(const rule of this.item.rules)rule.ignored=!0;removeExpired?await this.item.delete():expireEffects&&await this.item.update({"system.duration.value":-1,"system.expired":!0})}}};__name2(_RollTwiceRuleElement,"RollTwiceRuleElement");let RollTwiceRuleElement=_RollTwiceRuleElement;const _SpecialStatisticRuleElement=class extends RuleElementPF2e{static{__name(this,"_SpecialStatisticRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),slug:new SlugField({required:!0,nullable:!1,initial:void 0,validate:v=>typeof v=="string"&&!(v in CONFIG.PF2E.magicTraditions||v in CONFIG.PF2E.classTraits||setHasElement(SKILL_LONG_FORMS,v)||tupleHasValue(SAVE_TYPES,v)||["perception","initiative"].includes(v))}),type:new fields2.StringField({required:!0,choices:["simple","check","attack-roll"],initial:"check"}),extends:new fields2.StringField({required:!0,nullable:!0,initial:null}),attribute:new fields2.StringField({required:!0,choices:Array.from(ATTRIBUTE_ABBREVIATIONS),nullable:!0,initial:null})}}afterPrepareData(){if(this.type==="simple")return;const checkDomains=this.type==="check"?[`${this.slug}-check`]:[`${this.slug}-attack-roll`],extendedFrom=this.extends?this.actor.getStatistic(this.extends):null,data={slug:this.slug,label:this.label,attribute:this.attribute??extendedFrom?.attribute??null,domains:[this.slug],check:{type:this.type==="check"?"check":"attack-roll",domains:checkDomains},dc:{domains:[`${this.slug}-dc`]}},statistic=extendedFrom?.extend(data)??new Statistic(this.actor,data);statistic?this.actor.synthetics.statistics.set(this.slug,statistic):this.failValidation(`Unable to find statistic ${this.extends} to extend from`)}};__name2(_SpecialStatisticRuleElement,"SpecialStatisticRuleElement");let SpecialStatisticRuleElement=_SpecialStatisticRuleElement;const _StrikingRuleElement=class extends RuleElementPF2e{static{__name(this,"_StrikingRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1}),value:new ResolvableValueField({required:!1,nullable:!1,initial:void 0})}}beforePrepareData(){if(this.ignored)return;const selector=this.resolveInjectedProperties(this.selector),strikingValue=this.value??(this.item instanceof WeaponPF2e?getStrikingDice(this.item.system):0),value=this.resolveValue(strikingValue);if(selector&&typeof value=="number"){const striking={label:this.getReducedLabel(),bonus:value,predicate:this.predicate};(this.actor.synthetics.striking[selector]??=[]).push(striking)}else this.failValidation("Striking requires at least a selector field and a non-empty resolved value")}};__name2(_StrikingRuleElement,"StrikingRuleElement"),__publicField(_StrikingRuleElement,"validActorTypes",["character","npc"]);let StrikingRuleElement=_StrikingRuleElement;const _SubstituteRollRuleElement=class extends RuleElementPF2e{static{__name(this,"_SubstituteRollRuleElement")}constructor(source,options){super(source,options),this.removeAfterRoll&&!this.item.isOfType("effect")&&this.failValidation(" removeAfterRoll: may only be used with effects")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,blank:!1,initial:"check"}),value:new ResolvableValueField({required:!0,nullable:!1}),required:new fields2.BooleanField({required:!1,nullable:!1,initial:!1}),effectType:new fields2.StringField({required:!0,nullable:!1,choices:["fortune","misfortune"],initial:"fortune"}),removeAfterRoll:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["if-enabled"],initial:void 0}),new StrictBooleanField({required:!1,nullable:!1,initial:void 0}),new PredicateField({required:!1,nullable:!1,initial:void 0})],{required:!1,nullable:!1,initial:!1})}}beforePrepareData(){const value=Math.clamped(Math.trunc(Number(this.resolveValue(this.value))),1,20);if(Number.isNaN(value))return this.failValidation("value must resolve to a number");const selector=this.resolveInjectedProperties(this.selector);(this.actor.synthetics.rollSubstitutions[selector]??=[]).push({slug:this.slug??sluggify(this.item.name),label:this.label,value,predicate:this.predicate,required:this.required,selected:this.required,effectType:this.effectType})}async afterRoll(params){if(!this.removeAfterRoll||this.ignored)return;if(this.removeAfterRoll===!0){await this.item.delete();return}if(Array.isArray(this.removeAfterRoll)&&this.removeAfterRoll.test(params.rollOptions)){await this.item.delete();return}const rollSubstituted=params.roll.dice.length===0,substitutionIncluded=!!params.context.substitutions?.some(s=>s.slug===this.slug&&s.selected);this.removeAfterRoll==="if-enabled"&&rollSubstituted&&substitutionIncluded&&await this.item.delete()}};__name2(_SubstituteRollRuleElement,"SubstituteRollRuleElement");let SubstituteRollRuleElement=_SubstituteRollRuleElement;const _TokenEffect=class{static{__name(this,"_TokenEffect")}constructor(effect){__privateAdd(this,_effect,void 0),__publicField(this,"tint",null),__publicField(this,"isTemporary",!0),__privateSet(this,_effect,effect)}get id(){return __privateGet(this,_effect).id}get _id(){return __privateGet(this,_effect).id}get parent(){return __privateGet(this,_effect).parent}get name(){return __privateGet(this,_effect).name}get icon(){return __privateGet(this,_effect).img}get changes(){return[]}get description(){return __privateGet(this,_effect).description}get flags(){return __privateGet(this,_effect).flags}get statuses(){return new Set([__privateGet(this,_effect).slug??sluggify(__privateGet(this,_effect).name)])}get disabled(){return __privateGet(this,_effect).isOfType("effect")&&__privateGet(this,_effect).isExpired}get duration(){const effect=__privateGet(this,_effect),isEffect=effect.isOfType("effect");return{type:"none",seconds:null,rounds:null,turns:null,combat:null,startTime:isEffect?effect.system.start.value:null,startRound:null,startTurn:isEffect?effect.system.start.initiative:null,label:isEffect?effect.system.remaining:""}}get transfer(){return!1}get origin(){return __privateGet(this,_effect).uuid}getFlag(scope,flag){return __privateGet(this,_effect).getFlag(scope,flag)}};_effect=new WeakMap,__name2(_TokenEffect,"TokenEffect");let TokenEffect=_TokenEffect;const _TokenEffectIconRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenEffectIconRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new fields2.StringField({required:!1,blank:!1,initial:void 0})}}afterPrepareData(){if(!this.test())return;const path=this.value?this.resolveInjectedProperties(this.value).trim():this.item.img;if(!isImageFilePath(path))return this.failValidation("value is not a valid image file path");this.actor.synthetics.tokenEffectIcons.push(new TokenEffect(new EffectPF2e({type:"effect",name:this.label,img:path})))}};__name2(_TokenEffectIconRuleElement,"TokenEffectIconRuleElement");let TokenEffectIconRuleElement=_TokenEffectIconRuleElement;const _TokenImageRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenImageRuleElement")}constructor(data,options){super(data,options),__privateAdd(this,_srcIsValid),typeof this.value=="string"||this.isBracketedValue(this.value)||this.failValidation("value must be a string or a bracketed value")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new ResolvableValueField({required:!0,nullable:!1,initial:void 0,label:"TOKEN.ImagePath"}),scale:new fields2.NumberField({required:!1,nullable:!0,positive:!0,initial:null,label:"Scale"}),tint:new fields2.ColorField({label:"TOKEN.TintColor"}),alpha:new fields2.AlphaField({label:"PF2E.RuleEditor.General.Opacity"})}}afterPrepareData(){const src=this.resolveValue(this.value);if(!__privateMethod(this,_srcIsValid,srcIsValid_fn).call(this,src))return this.failValidation("Missing or invalid value field");if(!this.test())return;const texture={src};this.scale&&(texture.scaleX=this.scale,texture.scaleY=this.scale),this.tint&&(texture.tint=this.tint),this.alpha&&(this.actor.synthetics.tokenOverrides.alpha=this.alpha),this.actor.synthetics.tokenOverrides.texture=texture}};_srcIsValid=new WeakSet,srcIsValid_fn=__name2(function(src){if(typeof src!="string")return!1;const extension=/(?<=\.)[a-z0-9]{3,4}$/i.exec(src)?.at(0);return!!extension&&(extension in CONST.IMAGE_FILE_EXTENSIONS||extension in CONST.VIDEO_FILE_EXTENSIONS)},"#srcIsValid"),__name2(_TokenImageRuleElement,"TokenImageRuleElement");let TokenImageRuleElement=_TokenImageRuleElement;const _TokenLightRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenLightRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),value:new fields2.SchemaField({...foundry.data.LightData.defineSchema(),dim:new ResolvableValueField({required:!1,nullable:!1,initial:void 0}),bright:new ResolvableValueField({required:!1,nullable:!1,initial:void 0})})}}constructor(data,options){super(data,options),this.validateData()}validateData(){const light=this.value;for(const key of["dim","bright"])if(light[key]!==void 0){const resolvedValue=this.resolveValue(light[key]);if(typeof resolvedValue=="number")light[key]=resolvedValue;else return this.failValidation(`${key} must resolve to a number`)}try{new foundry.data.LightData(light)}catch(error){error instanceof Error&&this.failValidation(error.message)}}afterPrepareData(){this.test()&&(this.actor.synthetics.tokenOverrides.light=deepClone(this.value))}};__name2(_TokenLightRuleElement,"TokenLightRuleElement");let TokenLightRuleElement=_TokenLightRuleElement;const _MarkTargetPrompt=class{static{__name(this,"_MarkTargetPrompt")}constructor(params){__privateAdd(this,_cancelHandler),__publicField(this,"prompt"),__publicField(this,"requirements"),__privateAdd(this,_target,void 0),__privateAdd(this,_resolve4,void 0),this.prompt=params.prompt??"PF2E.UI.RuleElements.TokenMark.TargetToken",this.requirements=params.requirements}async resolveTarget(){return game.user.targets.clear(),this.activateListeners(),ui.notifications.info(this.prompt,{localize:!0}),new Promise(resolve=>{__privateSet(this,_resolve4,resolve)})}activateListeners(){document.activeElement instanceof HTMLElement&&document.activeElement.blur();const hookParams=["targetToken",(_user,token,targeted)=>{var _a;__privateSet(this,_target,targeted&&token instanceof TokenPF2e?token.document:null),(_a=__privateGet(this,_resolve4))==null||_a.call(this,__privateGet(this,_target))}];Hooks.once(...hookParams);const cancelHandler=__privateMethod(this,_cancelHandler,cancelHandler_fn).call(this,hookParams);document.addEventListener("keyup",cancelHandler),window.setTimeout(()=>{var _a;Hooks.off(...hookParams),document.removeEventListener("keyup",cancelHandler),__privateGet(this,_target)===void 0&&((_a=__privateGet(this,_resolve4))==null||_a.call(this,null))},15e3)}};_target=new WeakMap,_resolve4=new WeakMap,_cancelHandler=new WeakSet,cancelHandler_fn=__name2(function(hookParams){const handler=__name2(event=>{event.key==="Escape"&&(event.stopPropagation(),ui.notifications.info("PF2E.UI.RuleElements.TokenMark.Timeout",{localize:!0}),Hooks.off(...hookParams),document.removeEventListener("keyup",handler))},"handler");return handler},"#cancelHandler"),__name2(_MarkTargetPrompt,"MarkTargetPrompt");let MarkTargetPrompt=_MarkTargetPrompt;const _TokenMarkRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenMarkRuleElement")}constructor(){super(...arguments),__privateAdd(this,_checkRuleSource)}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),slug:new SlugField({required:!0,nullable:!1,initial:void 0}),uuid:new fields2.StringField({required:!1,nullable:!0,initial:null})}}async preCreate({ruleSource,itemSource,pendingItems}){if(this.ignored)return;if(this.uuid&&=this.resolveInjectedProperties(this.uuid),this.actor.getActiveTokens().length===0){this.ignored=ruleSource.ignored=!0;return}const token=fromUuidSync(this.uuid??"")??(game.user.targets.size===1?Array.from(game.user.targets)[0].document:await new MarkTargetPrompt({prompt:null,requirements:null}).resolveTarget());if(!(token instanceof TokenDocumentPF2e)){pendingItems.splice(pendingItems.indexOf(itemSource),1);return}__privateMethod(this,_checkRuleSource,checkRuleSource_fn).call(this,ruleSource),this.uuid=ruleSource.uuid=token.uuid}beforePrepareData(){UUIDUtils.isTokenUUID(this.uuid)&&this.test()&&this.actor.synthetics.tokenMarks.set(this.uuid,this.slug)}};_checkRuleSource=new WeakSet,checkRuleSource_fn=__name2(function(source){if(!(source.key==="TokenMark"&&source.slug===this.slug))throw ErrorPF2e("Unexpected rule element passed")},"#checkRuleSource"),__name2(_TokenMarkRuleElement,"TokenMarkRuleElement");let TokenMarkRuleElement=_TokenMarkRuleElement;const _TokenNameRuleElement=class extends RuleElementPF2e{static{__name(this,"_TokenNameRuleElement")}static defineSchema(){return{...super.defineSchema(),value:new ResolvableValueField({required:!0})}}afterPrepareData(){const name2=this.resolveValue(this.value);if(typeof name2!="string")return this.failValidation("value must resolve to a string");this.test()&&(this.actor.synthetics.tokenOverrides.name=name2)}};__name2(_TokenNameRuleElement,"TokenNameRuleElement");let TokenNameRuleElement=_TokenNameRuleElement;const _WeaponPotencyRuleElement=class extends RuleElementPF2e{static{__name(this,"_WeaponPotencyRuleElement")}static defineSchema(){const{fields:fields2}=foundry.data;return{...super.defineSchema(),selector:new fields2.StringField({required:!0,nullable:!1,blank:!1}),value:new ResolvableValueField({required:!0})}}beforePrepareData(){if(this.ignored)return;const{weaponPotency}=this.actor.synthetics,selector=this.resolveInjectedProperties(this.selector),{item}=this,potencyValue=this.value??(item.isOfType("weapon")?item.system.potencyRune.value:0),value=this.resolveValue(potencyValue);if(selector&&typeof value=="number"){const bonusType=AutomaticBonusProgression.isEnabled(this.actor)?"potency":"item",potency={label:this.getReducedLabel(),bonus:value,type:bonusType,predicate:this.predicate};(weaponPotency[selector]??=[]).push(potency)}else this.failValidation("Weapon potency requires at least a selector field and a non-empty value field")}};__name2(_WeaponPotencyRuleElement,"WeaponPotencyRuleElement"),__publicField(_WeaponPotencyRuleElement,"validActorTypes",["character","npc"]);let WeaponPotencyRuleElement=_WeaponPotencyRuleElement;const _RuleElements=class{static{__name(this,"_RuleElements")}static get all(){return{...this.builtin,...this.custom}}static fromOwnedItem(options){const rules=[],item=options.parent;for(const[sourceIndex,source]of item.system.rules.entries()){if(typeof source.key!="string"){console.error(`PF2e System | Missing key in rule element ${source.key} on item ${item.name} (${item.uuid})`);continue}const REConstructor=this.custom[source.key]??this.custom[source.key]??this.builtin[source.key];if(REConstructor){const rule=(()=>{try{return new REConstructor(source,{...options,sourceIndex})}catch(error){return options?.suppressWarnings||(console.warn(`PF2e System | Failed to construct rule element ${source.key} on item ${item.name}`,`(${item.uuid})`),console.warn(error)),null}})();rule&&rules.push(rule)}else{const{name:name2,uuid}=item;console.warn(`PF2e System | Unrecognized rule element ${source.key} on item ${name2} (${uuid})`)}}return rules}};__name2(_RuleElements,"RuleElements"),__publicField(_RuleElements,"builtin",{ActiveEffectLike:AELikeRuleElement,ActorTraits:ActorTraitsRuleElement,AdjustDegreeOfSuccess:AdjustDegreeOfSuccessRuleElement,AdjustModifier:AdjustModifierRuleElement,AdjustStrike:AdjustStrikeRuleElement,Aura:AuraRuleElement,BaseSpeed:BaseSpeedRuleElement,BattleForm:BattleFormRuleElement,ChoiceSet:ChoiceSetRuleElement,CraftingEntry:CraftingEntryRuleElement,CraftingFormula:CraftingFormulaRuleElement,CreatureSize:CreatureSizeRuleElement,CriticalSpecialization:CritSpecRuleElement,DamageDice:DamageDiceRuleElement,DexterityModifierCap:DexterityModifierCapRuleElement,EphemeralEffect:EphemeralEffectRuleElement,FastHealing:FastHealingRuleElement,FixedProficiency:FixedProficiencyRuleElement,FlatModifier:FlatModifierRuleElement,GrantItem:GrantItemRuleElement,Immunity:ImmunityRuleElement,ItemAlteration:ItemAlterationRuleElement,LoseHitPoints:LoseHitPointsRuleElement,MartialProficiency:MartialProficiencyRuleElement,MultipleAttackPenalty:MultipleAttackPenaltyRuleElement,Note:RollNoteRuleElement,Resistance:ResistanceRuleElement,RollOption:RollOptionRuleElement,RollTwice:RollTwiceRuleElement,Sense:SenseRuleElement,SpecialStatistic:SpecialStatisticRuleElement,Strike:StrikeRuleElement,Striking:StrikingRuleElement,SubstituteRoll:SubstituteRollRuleElement,TempHP:TempHPRuleElement,TokenEffectIcon:TokenEffectIconRuleElement,TokenImage:TokenImageRuleElement,TokenLight:TokenLightRuleElement,TokenMark:TokenMarkRuleElement,TokenName:TokenNameRuleElement,Weakness:WeaknessRuleElement,WeaponPotency:WeaponPotencyRuleElement}),__publicField(_RuleElements,"custom",{});let RuleElements=_RuleElements;const CodeMirror={EditorView,basicSetup,json,jsonLinter:()=>linter(jsonParseLinter()),keybindings:keymap.of([indentWithTab]),ruleElementExtensions:options=>[json(),CodeMirror.jsonLinter(),autocompletion({override:[ruleElementAutocomplete(options)]})]};function ruleElementAutocomplete(options){const validKeysByPath=(()=>options.schema?{"":Object.keys(options.schema)}:{"":["key"]})();return context=>{const node=syntaxTree(context.state).resolveInner(context.pos,-1),isProperty=node.name==="Object"||node.type.name==="PropertyName",isValue=!isProperty&&(node.name==="Property"||node.parent?.name==="Property");if(isProperty){const basePath=resolveNodePath(context,node),keys2=basePath!==null?validKeysByPath[basePath]:[];return keys2?.length?{from:node.from,to:node.to,options:keys2.map(o=>({label:`"${o}"`}))}:null}else if(isValue&&resolveNodePath(context,node)==="key"){const options2=Object.keys(RuleElements.all);return{from:node.from,to:node.to,options:options2.map(o=>({label:`"${o}"`}))}}return null}}__name(ruleElementAutocomplete,"ruleElementAutocomplete"),__name2(ruleElementAutocomplete,"ruleElementAutocomplete");function resolveNodePath(context,node){node=node.type.name==="PropertyName"&&node.parent?node.parent:node;const parent=node.parent;if(!parent||parent.type.name==="JsonText")return"";const parentType=parent.type.name;if(parentType==="\u26A0")return null;const name2=(()=>parentType==="Object"?!parent.parent||parent.parent.type.name==="JsonText"?"":".":parentType==="Property"?context.state.sliceDoc(parent.from,parent.to).match(/^"([^"]*)"/)?.[1]:parentType==="Array"?"[]":null)();if(name2===null)return null;const basePath=resolveNodePath(context,parent);return basePath===null?null:basePath+name2}__name(resolveNodePath,"resolveNodePath"),__name2(resolveNodePath,"resolveNodePath");const _RuleElementForm=class{static{__name(this,"_RuleElementForm")}constructor(options){__privateAdd(this,_getFormHelpers),__publicField(this,"template","systems/pf2e/templates/items/rules/default.hbs"),__publicField(this,"tabs",null),__privateAdd(this,_activeTab,null),this.initialize(options)}get basePath(){return`system.rules.${this.index}`}initialize(options){this.sheet=options.sheet,this.index=options.index,this.rule=options.rule,this.object=options.object??(()=>{const RuleElementClass=RuleElements.all[String(this.rule.key)];if(!RuleElementClass)return null;const actor=new ActorProxyPF2e({_id:randomID(),name:"temp",type:"character"}),item=new ItemProxyPF2e(this.item.toObject(),{parent:actor});return new RuleElementClass(deepClone(this.rule),{parent:item,strict:!1,suppressWarnings:!0})})(),this.schema=this.object?.schema??RuleElements.all[String(this.rule.key)]?.schema??null}get item(){return this.sheet.item}get fieldIdPrefix(){return`field-${this.sheet.appId}-${this.index}-`}getInitialValue(){if(this.constructor.name==="RuleElementForm")return{};const initial=this.schema?.getInitialValue();if(!initial)return{};for(const property of["ignored","priority","slug"])delete initial[property];const removeArrays=__name2(object=>{for(const[key,value]of Object.entries(object))Array.isArray(value)?delete object[key]:isObject(value)&&removeArrays(value)},"removeArrays");return removeArrays(initial),initial}async getData(){const[label,recognized]=(()=>{const locPath=`PF2E.RuleElement.${this.rule.key}`,localized=game.i18n.localize(locPath);return localized===locPath?[game.i18n.localize("PF2E.RuleElement.Unrecognized"),!1]:[localized,!0]})(),mergedRule=mergeObject(this.getInitialValue(),this.rule);return{...pick$1(this,["index","rule","object"]),item:this.item,label,fieldIdPrefix:this.fieldIdPrefix,recognized,basePath:this.basePath,rule:mergedRule,fields:this.schema?.fields,form:await __privateMethod(this,_getFormHelpers,getFormHelpers_fn).call(this,mergedRule)}}async render(){const data=await this.getData();return renderTemplate("systems/pf2e/templates/items/rules/partials/outer.hbs",{...data,template:await renderTemplate(this.template,data)})}async updateItem(updates){const rules=this.item.toObject().system.rules,result=mergeObject(this.rule,updates,{performDeletions:!0});this.schema&&cleanDataUsingSchema(this.schema.fields,result),rules[this.index]=result,await this.item.update({"system.rules":rules})}activateListeners(html){this.element=html;const selectorElement=htmlQuery(html,".selector-list");tagify$1(selectorElement);const priorityInput=htmlQuery(html,".rule-element-header .priority input");priorityInput?.addEventListener("change",event=>{event.stopPropagation();const value=priorityInput.value;value===""||Number.isNaN(Number(value))?this.updateItem({"-=priority":null}):this.updateItem({priority:Number(value)})});for(const button of htmlQueryAll(html,"[data-action=toggle-brackets]"))button.addEventListener("click",()=>{const property=button.dataset.property??"value",value=getProperty(this.rule,property);isBracketedValue(value)?this.updateItem({[property]:""}):this.updateItem({[property]:{brackets:[{value:""}]}})});for(const button of htmlQueryAll(html,"[data-action=add-bracket]")){const property=button.dataset.property??"value";button.addEventListener("click",()=>{const value=getProperty(this.rule,property);isBracketedValue(value)&&(value.brackets.push({value:""}),this.updateItem({[property]:value}))})}for(const button of htmlQueryAll(html,"[data-action=delete-bracket]")){const property=button.dataset.property??"value";button.addEventListener("click",()=>{const value=getProperty(this.rule,property),idx=Number(htmlClosest(button,"[data-idx]")?.dataset.idx);isBracketedValue(value)&&(value.brackets.splice(idx,1),this.updateItem({[property]:value}))})}if(this.tabs){for(const anchor of htmlQueryAll(html,"a[data-rule-tab]"))anchor.addEventListener("click",()=>{this.activateTab(html,anchor.dataset.ruleTab)});this.activateTab(html,__privateGet(this,_activeTab))}for(const dropZone of htmlQueryAll(html,"div.rules-drop-zone"))dropZone.addEventListener("drop",event=>{this.onDrop(event,dropZone)})}async onDrop(event,_element){const data=event.dataTransfer?.getData("text/plain");return data?await ItemPF2e.fromDropData(JSON.parse(data))??null:null}activateTab(html,tabName){if(!this.tabs)return;const activeTab=tabName??this.tabs.names.at(0);if(!(!activeTab||!this.tabs.names.includes(activeTab))){__privateSet(this,_activeTab,activeTab);for(const element of htmlQueryAll(html,"[data-rule-tab]"))element.dataset.ruleTab===activeTab?(element.classList.add("active"),element.tagName!=="A"&&(element.style.display=this.tabs.displayStyle)):(element.classList.remove("active"),element.tagName!=="A"&&(element.style.display="none"))}}updateObject(source){if(typeof source=="string"){try{this.rule=JSON.parse(source)}catch(error){if(error instanceof Error)throw ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.RuleElementSyntax",{message:error.message})),console.warn("Syntax error in rule element definition.",error.message,source),error}return}source=mergeObject(duplicate(this.rule),source);for(const slider of htmlQueryAll(this.element,"input[type=range"))slider.style.pointerEvents="none";cleanPredicate(source),this.schema&&cleanDataUsingSchema(this.schema.fields,source),this.rule=source}};_activeTab=new WeakMap,_getFormHelpers=new WeakSet,getFormHelpers_fn=__name2(async function(rule){const valueTemplate=await getTemplate("systems/pf2e/templates/items/rules/partials/resolvable-value.hbs"),bracketsTemplate=await getTemplate("systems/pf2e/templates/items/rules/partials/resolvable-brackets.hbs"),dropZoneTemplate=await getTemplate("systems/pf2e/templates/items/rules/partials/drop-zone.hbs"),getResolvableData=__name2(property=>{const value=getProperty(rule,property),mode=isBracketedValue(value)?"brackets":isObject(value)?"object":"primitive";return{value,mode,property,path:`${this.basePath}.${property}`}},"getResolvableData");return{resolvableValue:(property,options={})=>valueTemplate({...getResolvableData(property),inputId:`${this.fieldIdPrefix}${property}`,fileInput:options.hash?.fileInput??!1}),resolvableAddBracket:property=>getResolvableData(property).mode!=="brackets"?"":createHTMLElement("a",{children:[fontAwesomeIcon("plus",{fixedWidth:!0})],dataset:{action:"add-bracket",property}}).outerHTML,resolvableBrackets:property=>bracketsTemplate(getResolvableData(property)),dropZone:(dropId,dropText,dropTooltip)=>dropZoneTemplate({dropId,dropText,dropTooltip})}},"#getFormHelpers"),__name2(_RuleElementForm,"RuleElementForm");let RuleElementForm=_RuleElementForm;function cleanDataUsingSchema(schema,data){const{fields:fields2}=foundry.data,deleteIfInitial=__name2((key,field)=>{if(data[key]===void 0)return!0;const initialValue=typeof field.initial=="function"?field.initial(data):field.initial,valueRaw=data[key],value=isObject$1(valueRaw)&&isObject$1(initialValue)?{...initialValue,...valueRaw}:valueRaw;return equals(initialValue,value)&&delete data[key],!(key in data)},"deleteIfInitial");for(const[key,field]of Object.entries(schema))if(!deleteIfInitial(key,field)){if(field instanceof ResolvableValueField){data[key]=field.clean(data[key]),deleteIfInitial(key,field);continue}if("fields"in field){const value=data[key];if(isObject$1(value)){cleanDataUsingSchema(field.fields,value),deleteIfInitial(key,field);continue}}if(field instanceof fields2.ArrayField&&field.element instanceof fields2.SchemaField){const value=data[key];if(Array.isArray(value)){for(const data2 of value)isObject$1(data2)&&(data2.predicate&&cleanPredicate(data2),cleanDataUsingSchema(field.element.fields,data2));continue}}field instanceof fields2.StringField&&(data[key]=field.clean(data[key],{}),deleteIfInitial(key,field))}}__name(cleanDataUsingSchema,"cleanDataUsingSchema"),__name2(cleanDataUsingSchema,"cleanDataUsingSchema");function cleanPredicate(source){const predicateValue=source.predicate;if(typeof predicateValue=="string")if(predicateValue.trim()==="")delete source.predicate;else try{source.predicate=JSON.parse(predicateValue)}catch(error){if(error instanceof Error)throw ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.RuleElementSyntax",{message:error.message})),error}}__name(cleanPredicate,"cleanPredicate"),__name2(cleanPredicate,"cleanPredicate");const _AuraForm=class extends RuleElementForm{static{__name(this,"_AuraForm")}constructor(){super(...arguments),__privateAdd(this,_addEffect),__privateAdd(this,_updateEffectsMap),__privateAdd(this,_deleteEffect),__publicField(this,"template","systems/pf2e/templates/items/rules/aura.hbs"),__publicField(this,"tabs",{names:["basic","effects","appearance"],displayStyle:"grid"}),__privateAdd(this,_effectsMap,new Map)}get effectsArray(){return[...__privateGet(this,_effectsMap).values()]}getInitialValue(){return __privateGet(this,_effectsMap).clear(),__privateSet(this,_effectsMap,new Map(this.object.effects.map((e,index)=>[index,deepClone(e)]))),super.getInitialValue()}activateListeners(html){super.activateListeners(html);const traitsElement=htmlQuery(html,".tagify-traits");if(traitsElement){const whitelist={...CONFIG.PF2E.spellTraits,...CONFIG.PF2E.actionTraits};tagify$1(traitsElement,{whitelist,enforceWhitelist:!1})}for(const eventsElement of htmlQueryAll(html,".tagify-events")){const whitelist=[["enter",game.i18n.localize("PF2E.RuleEditor.Aura.Effects.EventsOptions.Enter")],["turn-start",game.i18n.localize("PF2E.RuleEditor.Aura.Effects.EventsOptions.TurnStart")],["turn-end",game.i18n.localize("PF2E.RuleEditor.Aura.Effects.EventsOptions.TurnEnd")]].sort((a,b)=>a[1].localeCompare(b[1],game.i18n.lang));tagify$1(eventsElement,{whitelist:mapToObj(whitelist,w=>[w[0],w[1]]),enforceWhitelist:!0})}for(const element of htmlQueryAll(html,"a[data-action=remove-effect]"))element.addEventListener("click",()=>{__privateMethod(this,_deleteEffect,deleteEffect_fn).call(this,element.dataset.effectId)});for(const button of htmlQueryAll(html,"div[data-rule-tab=effects] button[data-action=toggle-brackets]")){const fieldset=htmlClosest(button,"fieldset"),select=htmlQuery(fieldset,"select"),input=htmlQuery(fieldset,"input");select&&input&&!select.value&&(button.disabled=!0,input.disabled=!0)}for(const key of["border","highlight"]){const inputName=`system.rules.${this.index}.appearance.${key}.color`,textInput=htmlQuery(html,`input[type=text][name="${inputName}"]`),colorInput=htmlQuery(html,`input[type=color][data-edit="${inputName}"]`),checkbox=htmlQuery(html,`input[type=checkbox][name="${inputName}"]`);textInput&&colorInput&&checkbox&&(this.object.appearance[key]?.color==="user-color"?(textInput.removeAttribute("name"),textInput.disabled=!0,colorInput.disabled=!0):checkbox.removeAttribute("name"),checkbox.addEventListener("change",()=>{checkbox.checked?(checkbox.name=textInput.name,textInput.removeAttribute("name"),textInput.disabled=!0,colorInput.disabled=!0,textInput.value=colorInput.value=userColorForActor(this.object.actor)):(textInput.name=checkbox.name,checkbox.removeAttribute("name"),textInput.disabled=!1,colorInput.disabled=!1,textInput.value=colorInput.value="#000000")}))}const translationX=htmlQuery(html,"input[data-translation=x]"),translationY=htmlQuery(html,"input[data-translation=y]");translationX&&translationY&&(translationX.addEventListener("change",()=>{translationX.value!==""&&translationY.value===""&&(translationY.value=translationX.value)}),translationY.addEventListener("change",()=>{translationY.value!==""&&translationX.value===""&&(translationX.value=translationY.value)}))}async getData(){const{border,highlight}=this.object.appearance,userColor=userColorForActor(this.object.actor);return{...await super.getData(),affectsOptions:{all:"PF2E.RuleEditor.Aura.Effects.AffectsOptions.All",allies:"PF2E.RuleEditor.Aura.Effects.AffectsOptions.Allies",enemies:"PF2E.RuleEditor.Aura.Effects.AffectsOptions.Enemies"},effects:this.effectsArray.map(e=>({...e,item:fromUuidSync(e.uuid)})),borderColor:border?.color==="user-color"?userColor:border?.color??null,highlightColor:highlight.color==="user-color"?userColor:highlight?.color,saveTypes:CONFIG.PF2E.saves,isImageFile:isImageFilePath(this.rule.appearance?.texture?.src)}}async onDrop(event,element){const{id}=element.dataset;if(id!=="aura-effect-drop")return null;const item=await super.onDrop(event,element);return!item?.isOfType("effect")||!this.schema?null:(__privateMethod(this,_addEffect,addEffect_fn).call(this,item.uuid),item)}async updateItem(updates){const expanded=expandObject(updates);return expanded.effects&&(expanded.effects=__privateMethod(this,_updateEffectsMap,updateEffectsMap_fn).call(this,expanded)),super.updateItem(expanded)}updateObject(source){source.effects=__privateMethod(this,_updateEffectsMap,updateEffectsMap_fn).call(this,source);for(const key of["level","radius"]){if(key in source&&!source[key]){delete source[key];continue}const stringValue=source[key],maybeIntegerValue=typeof stringValue=="string"&&/^\d+$/.test(stringValue)?Number(stringValue):NaN;Number.isInteger(maybeIntegerValue)&&(source[key]=maybeIntegerValue)}const appearance=source.appearance;appearance?.border?.alpha===0&&(appearance.border=null),appearance?.border?.color===null&&(appearance.border.color="#000000"),appearance?.highlight?.color===null&&(appearance.highlight.color="#000000");const texture=appearance?.texture;if(texture){if(texture.translation){const{x,y}=texture.translation;!x&&!y&&(texture.translation=null)}texture.src?isImageFilePath(texture.src)&&(texture.loop=!0,texture.playbackRate=1):appearance.texture=null}super.updateObject(source)}};_effectsMap=new WeakMap,_addEffect=new WeakSet,addEffect_fn=__name2(function(uuid){const index=__privateGet(this,_effectsMap).size+1;__privateGet(this,_effectsMap).set(index,{uuid}),this.updateItem({effects:this.effectsArray})},"#addEffect"),_updateEffectsMap=new WeakSet,updateEffectsMap_fn=__name2(function(source){return __privateSet(this,_effectsMap,new Map(Object.values(source.effects??{}).map((data,index)=>{const updatedData=deepClone(data),deletions={};if(updatedData.save&&(updatedData.save.type??data.save?.type?updatedData.save.dc||=null:deletions["-=save"]=null),updatedData.affects!=="enemies"&&updatedData.includesSelf&&(deletions["-=includesSelf"]=null),updatedData.removeOnExit&&(deletions["-=removeOnExit"]=null),updatedData.predicate)try{const parsed=JSON.parse(String(updatedData.predicate));updatedData.predicate=Array.isArray(parsed)?parsed:[]}catch{deletions["-=predicate"]=null}else deletions["-=predicate"]=null;return[index,mergeObject(updatedData,deletions,{performDeletions:!0})]}))),this.effectsArray},"#updateEffectsMap"),_deleteEffect=new WeakSet,deleteEffect_fn=__name2(function(id){const index=Number(id);Number.isNaN(index)||__privateGet(this,_effectsMap).delete(index)&&this.updateItem({effects:this.effectsArray})},"#deleteEffect"),__name2(_AuraForm,"AuraForm");let AuraForm=_AuraForm;const _FastHealingForm=class extends RuleElementForm{static{__name(this,"_FastHealingForm")}template="systems/pf2e/templates/items/rules/fast-healing.hbs";activateListeners(html){super.activateListeners(html);const selectorElement=htmlQuery(html,".deactivated-by");if(selectorElement){const whitelist=CONFIG.PF2E.weaknessTypes;tagify$1(selectorElement,{whitelist,enforceWhitelist:!1})}}async getData(){return{...await super.getData(),types:{"fast-healing":"PF2E.Encounter.Broadcast.FastHealing.fast-healing.Name",regeneration:"PF2E.Encounter.Broadcast.FastHealing.regeneration.Name"}}}updateObject(source){delete source[source.type==="regeneration"?"details":"deactivatedBy"],super.updateObject(source)}};__name2(_FastHealingForm,"FastHealingForm");let FastHealingForm=_FastHealingForm;const _FlatModifierForm=class extends RuleElementForm{static{__name(this,"_FlatModifierForm")}template="systems/pf2e/templates/items/rules/flat-modifier.hbs";get isDamage(){return[this.rule.selector??[]].flat().some(s=>s==="damage"||String(s).endsWith("-damage"))}activateListeners(html){super.activateListeners(html),htmlQuery(html,"[data-action=toggle-selector]")?.addEventListener("click",()=>{const selector=this.rule.selector,newValue=Array.isArray(selector)?selector.at(0)??"":[selector??""].filter(s=>!!s);this.updateItem({selector:newValue})})}async getData(){const data=await super.getData(),types=(()=>{const abpEnabled=AutomaticBonusProgression.isEnabled(null),entries=Array.from(MODIFIER_TYPES).filter(t=>abpEnabled||t!=="potency").map(t=>[t,game.i18n.localize(`PF2E.ModifierType.${t}`)]).sort((a,b)=>a[0]==="untyped"?-1:b[0]==="untyped"?1:a[1].localeCompare(b[1]));return fromPairs(entries)})();return{...data,selectorIsArray:Array.isArray(this.rule.selector),abilities:CONFIG.PF2E.abilities,types,damageCategories:pick$1(CONFIG.PF2E.damageCategories,Array.from(DAMAGE_CATEGORIES_UNIQUE)),isDamage:this.isDamage}}updateObject(formData){delete formData[formData.type==="ability"?"value":"ability"],formData.critical=tupleHasValue([!1,"false"],formData.critical)?!1:!!formData.critical||null,this.isDamage||(delete formData.damageCategory,delete formData.damageType,delete formData.critical),super.updateObject(formData)}};__name2(_FlatModifierForm,"FlatModifierForm");let FlatModifierForm=_FlatModifierForm;const _GrantItemForm=class extends RuleElementForm{static{__name(this,"_GrantItemForm")}template="systems/pf2e/templates/items/rules/grant-item.hbs";async getData(){const data=await super.getData(),uuid=this.rule.uuid?String(this.rule.uuid):null,granted=uuid?await fromUuid(uuid):null;return{...data,granted}}updateObject(ruleData){super.updateObject(ruleData),typeof ruleData.uuid=="string"&&(ruleData.uuid=ruleData.uuid.trim())}};__name2(_GrantItemForm,"GrantItemForm");let GrantItemForm=_GrantItemForm;const _MultipleAttackPenaltyForm=class extends RuleElementForm{static{__name(this,"_MultipleAttackPenaltyForm")}template="systems/pf2e/templates/items/rules/multiple-attack-penalty.hbs"};__name2(_MultipleAttackPenaltyForm,"MultipleAttackPenaltyForm");let MultipleAttackPenaltyForm=_MultipleAttackPenaltyForm;const _RollNoteForm=class extends RuleElementForm{static{__name(this,"_RollNoteForm")}html=null;template="systems/pf2e/templates/items/rules/note.hbs";async getData(){return{...await super.getData(),selectorIsArray:Array.isArray(this.rule.selector)}}activateListeners(html){super.activateListeners(html),this.html=html,htmlQuery(html,"[data-action=toggle-selector]")?.addEventListener("click",()=>{const selector=this.rule.selector,newValue=Array.isArray(selector)?selector.at(0)??"":[selector??""].filter(s=>!!s);this.updateItem({selector:newValue})});const optionsEl=htmlQuery(html,".outcomes");tagify$1(optionsEl,{whitelist:[...DEGREE_OF_SUCCESS_STRINGS],maxTags:3})}updateObject(ruleData){super.updateObject(ruleData);const{html}=this;if(html){const shouldBeHidden=htmlQuery(html,".hidden-value")?.checked,isHidden=["gm","owner"].includes(String(ruleData.visibility));shouldBeHidden!==isHidden&&(shouldBeHidden?ruleData.visibility="owner":delete ruleData.visibility)}Array.isArray(ruleData.outcome)&&ruleData.outcome.length===0&&delete ruleData.outcome,typeof ruleData.title=="string"&&(ruleData.title=ruleData.title.trim())}};__name2(_RollNoteForm,"RollNoteForm");let RollNoteForm=_RollNoteForm;const _TokenImageForm=class extends RuleElementForm{static{__name(this,"_TokenImageForm")}template="systems/pf2e/templates/items/rules/token-image.hbs";async getData(){return{...await super.getData(),scaleEnabled:this.object.scale!==null}}activateListeners(html){super.activateListeners(html);const tintInput=htmlQuery(html,`input[name="system.rules.${this.index}.tint"]`),scaleCheckbox=htmlQuery(html,"input[data-action=toggle-scale]"),scaleInput=htmlQuery(html,`input[name="system.rules.${this.index}.scale"]`);tintInput&&scaleCheckbox&&scaleInput&&(tintInput.id=`${this.fieldIdPrefix}-tint`,scaleInput.id=`${this.fieldIdPrefix}-scale`,scaleInput.disabled=this.object.scale===null,scaleCheckbox.addEventListener("change",event=>{event.stopPropagation();const newValue=this.object.scale===null?1:null;this.updateItem({scale:newValue})}))}};__name2(_TokenImageForm,"TokenImageForm");let TokenImageForm=_TokenImageForm;const _TokenLightForm=class extends RuleElementForm{static{__name(this,"_TokenLightForm")}template="systems/pf2e/templates/items/rules/token-light.hbs";tabs={names:["basic","animation","advanced"],displayStyle:"grid"};async getData(){const data=await super.getData();return{...data,colorationTechniques:AdaptiveLightingShader.SHADER_TECHNIQUES,light:data.rule.value,lightAnimations:mapValues$1(CONFIG.Canvas.lightAnimations,value=>value.label)}}};__name2(_TokenLightForm,"TokenLightForm");let TokenLightForm=_TokenLightForm;const RULE_ELEMENT_FORMS={Aura:AuraForm,FastHealing:FastHealingForm,FlatModifier:FlatModifierForm,GrantItem:GrantItemForm,MultipleAttackPenalty:MultipleAttackPenaltyForm,Note:RollNoteForm,TokenImage:TokenImageForm,TokenLight:TokenLightForm},_ItemSheetPF2e=class extends ItemSheet{static{__name(this,"_ItemSheetPF2e")}constructor(){super(...arguments),__privateAdd(this,_createRuleElementForms),__privateAdd(this,_selectedRuleElementType,Object.keys(RuleElements.all).at(0)??null),__privateAdd(this,_editingRuleElementIndex,null),__privateAdd(this,_rulesLastScrollTop,null),__privateAdd(this,_ruleElementForms,[])}static get defaultOptions(){const options=super.defaultOptions;return options.width=695,options.height=460,options.classes=options.classes.concat(["pf2e","item"]),options.template="systems/pf2e/templates/items/sheet.hbs",options.scrollY=[".tab.active",".inventory-details","div[data-rule-tab]"],options.tabs=[{navSelector:".tabs",contentSelector:".sheet-body",initial:"description"},{navSelector:".mystify-nav",contentSelector:".mystify-sheet",initial:"unidentified"}],options}get editingRuleElement(){return __privateGet(this,_editingRuleElementIndex)===null?null:this.item.toObject().system.rules[__privateGet(this,_editingRuleElementIndex)]??null}get validTraits(){return objectHasKey(CONFIG.PF2E.Item.traits,this.item.type)?CONFIG.PF2E.Item.traits[this.item.type]:null}async getData(options={}){options.id=this.id,options.classes?.push(this.item.type),options.editable=this.isEditable,options.sheetConfig&&=Object.values(CONFIG.Item.sheetClasses[this.item.type]).filter(c=>c.canConfigure).length>1;const{item}=this;__privateMethod(this,_createRuleElementForms,createRuleElementForms_fn).call(this);const enrichedContent={},rollData={...this.item.getRollData(),...this.actor?.getRollData()};enrichedContent.description=await TextEditor.enrichHTML(item._source.system.description.value,{rollData,secrets:game.user.isGM,async:!0}),enrichedContent.gmNotes=await TextEditor.enrichHTML(item.system.description.gm.trim(),{rollData,secrets:game.user.isGM,async:!0});const validTraits=this.validTraits,hasRarity=!item.isOfType("action","condition","deity","effect","lore","melee"),itemTraits=item.system.traits?.value??[],sourceTraits=item._source.system.traits?.value??[],traits=validTraits?createSheetTags(validTraits,itemTraits):null,traitTagifyData=validTraits?createTagifyTraits(itemTraits,{sourceTraits,record:validTraits}):null;return{itemType:null,showTraits:this.validTraits!==null,hasSidebar:this.item.isOfType("condition","lore"),sidebarTitle:game.i18n.format("PF2E.Item.SidebarSummary",{type:game.i18n.localize(`TYPES.Item.${this.item.type}`)}),sidebarTemplate:`systems/pf2e/templates/items/${sluggify(item.type)}-sidebar.hbs`,detailsTemplate:`systems/pf2e/templates/items/${sluggify(item.type)}-details.hbs`,cssClass:this.isEditable?"editable":"locked",editable:this.isEditable,document:item,item,isPhysical:!1,data:item.system,fieldIdPrefix:`field-${this.appId}-`,enrichedContent,limited:this.item.limited,options:this.options,owner:this.item.isOwner,title:this.title,user:{isGM:game.user.isGM},rarity:hasRarity?this.item.system.traits?.rarity??"common":null,rarities:CONFIG.PF2E.rarityTraits,traits,traitTagifyData,enabledRulesUI:game.user.isGM||game.settings.get("pf2e","enabledRulesUI"),ruleEditing:!!this.editingRuleElement,rules:{selection:{selected:__privateGet(this,_selectedRuleElementType),types:sortStringRecord(Object.keys(RuleElements.all).reduce((result,key)=>mergeObject(result,{[key]:`PF2E.RuleElement.${key}`}),{}))},elements:await Promise.all(__privateGet(this,_ruleElementForms).map(async form=>({template:await form.render()})))},proficiencies:CONFIG.PF2E.proficiencyLevels}}onTagSelector(anchor){if((anchor.dataset.tagSelector??"")!=="basic")throw ErrorPF2e("Item sheets can only use the basic tag selector");const propertyIsFlat=anchor.dataset.flat==="true",objectProperty=anchor.dataset.property??"",title=anchor.dataset.title,configTypes=(anchor.dataset.configTypes??"").split(",").map(type=>type.trim()).filter(tag=>tupleHasValue(SELECTABLE_TAG_FIELDS,tag)),selectorOptions={objectProperty,configTypes,title,flat:propertyIsFlat};anchor.dataset.noCustom==="true"?selectorOptions.allowCustom=!1:this.actor&&configTypes.includes("attackEffects")&&(selectorOptions.customChoices=this.getAttackEffectOptions()),new TagSelectorBasic(this.item,selectorOptions).render(!0)}getAttackEffectOptions(){return(this.actor?.items.contents??[]).filter(i=>i.isOfType("action","consumable")).reduce((options,item)=>{const key=item.slug??sluggify(item.name);return{...options,[key]:item.name}},deepClone(CONFIG.PF2E.attackEffects))}async activateEditor(name2,options={},initialContent){const sourceContent=name2==="system.description.value"?this.item._source.system.description.value:initialContent,mutuallyExclusive=["system.description.gm","system.description.value"];if(mutuallyExclusive.includes(name2)){const html=this.element[0];for(const elementName of mutuallyExclusive.filter(n=>n!==name2)){const element=htmlQuery(html,`[data-edit="${elementName}"]`),section=htmlClosest(element,".editor-container");section&&(section.style.display="none")}htmlQuery(html,".tab.description")?.classList.add("editing")}return super.activateEditor(name2,options,sourceContent)}async close(options){return __privateSet(this,_editingRuleElementIndex,null),super.close(options)}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const anchor of htmlQueryAll(html,"a.tag-selector"))anchor.addEventListener("click",()=>this.onTagSelector(anchor));const rulesPanel=htmlQuery(html,".tab[data-tab=rules]"),slugInput=htmlQuery(rulesPanel,'input[name="system.slug"]');slugInput&&(slugInput.addEventListener("change",()=>{slugInput.value=sluggify(slugInput.value)}),htmlQuery(rulesPanel,"a[data-action=regenerate-slug]")?.addEventListener("click",()=>{if(this._submitting)return;slugInput.value=sluggify(this.item.name);const event=new Event("change");slugInput.dispatchEvent(event)}));const ruleElementSelect=htmlQuery(rulesPanel,"select[data-action=select-rule-element]");ruleElementSelect?.addEventListener("change",()=>{__privateSet(this,_selectedRuleElementType,ruleElementSelect.value)});for(const anchor of htmlQueryAll(rulesPanel,"a.add-rule-element"))anchor.addEventListener("click",async event=>{await this._onSubmit(event);const rulesData=this.item.toObject().system.rules,key=__privateGet(this,_selectedRuleElementType)??"NewRuleElement";this.item.update({"system.rules":rulesData.concat({key})})});for(const anchor of htmlQueryAll(rulesPanel,"a.edit-rule-element"))anchor.addEventListener("click",async()=>{if(this._submitting)return;const index=Number(anchor.dataset.ruleIndex??"NaN")??null;__privateSet(this,_editingRuleElementIndex,index),__privateSet(this,_rulesLastScrollTop,rulesPanel?.scrollTop??null),this.render()});for(const anchor of htmlQueryAll(rulesPanel,".rules a.remove-rule-element"))anchor.addEventListener("click",async event=>{await this._onSubmit(event);const rules2=this.item.toObject().system.rules,index=Number(anchor.dataset.ruleIndex??"NaN");rules2&&Number.isInteger(index)&&rules2.length>index&&(rules2.splice(index,1),this.item.update({"system.rules":rules2}))});for(const anchor of htmlQueryAll(rulesPanel,"a[data-clipboard]"))anchor.addEventListener("click",()=>{const clipText=anchor.dataset.clipboard;clipText&&(game.clipboard.copyPlainText(clipText),ui.notifications.info(game.i18n.format("PF2E.ClipboardNotification",{clipText})))});const editingRuleElement=this.editingRuleElement;if(editingRuleElement){const ruleText=JSON.stringify(editingRuleElement,null,2),schema=RuleElements.all[String(editingRuleElement.key)]?.schema.fields,view=new CodeMirror.EditorView({doc:ruleText,extensions:[CodeMirror.basicSetup,CodeMirror.keybindings,...CodeMirror.ruleElementExtensions({schema})]});html.querySelector(".rule-editing .editor-placeholder")?.replaceWith(view.dom);const closeBtn=html.querySelector(".rule-editing button[data-action=close]");closeBtn?.addEventListener("click",()=>{__privateSet(this,_editingRuleElementIndex,null),this.render()}),closeBtn?.removeAttribute("disabled"),html.querySelector(".rule-editing button[data-action=apply]")?.addEventListener("click",()=>{const value=view.state.doc.toString();if(__privateGet(this,_editingRuleElementIndex)===null){__privateSet(this,_editingRuleElementIndex,null),this.render();return}try{const rules2=this.item.toObject().system.rules;rules2[__privateGet(this,_editingRuleElementIndex)]=JSON.parse(value),__privateSet(this,_editingRuleElementIndex,null),this.item.update({"system.rules":rules2})}catch(error){if(error instanceof Error)throw ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.RuleElementSyntax",{message:error.message})),console.warn("Syntax error in rule element definition.",error.message,value),error}})}const ruleSections=html.querySelectorAll(".rules .rule-form");for(const ruleSection of Array.from(ruleSections)){const idx=ruleSection.dataset.idx?Number(ruleSection.dataset.idx):NaN;__privateGet(this,_ruleElementForms).at(idx)?.activateListeners(ruleSection)}InlineRollLinks.listen(html,this.item);const{validTraits}=this,tagElement=html.querySelector(".sheet-header .tags"),traitsPrepend=html.querySelector(".traits-extra");if(validTraits!==null&&tagElement instanceof HTMLInputElement){const tags=tagify$1(tagElement,{whitelist:validTraits});traitsPrepend&&tags.DOM.scope.prepend(traitsPrepend.content)}else tagElement&&traitsPrepend&&tagElement.append(traitsPrepend.content);tagify$1(htmlQuery(html,'input[type=text][name="system.traits.otherTags"]'),{maxTags:6});const modifiedPropertyFields=htmlQueryAll(html,"[data-property]");for(const input of modifiedPropertyFields){const propertyPath=input.dataset.property??"",baseValue=input.dataset.valueBase??String(getProperty(this.item._source,propertyPath)??"").trim();input.addEventListener("focus",()=>{input.dataset.value=input.value,input.value=baseValue,input.name=propertyPath}),input.addEventListener("blur",()=>{input.removeAttribute("name"),input.value===baseValue&&(input.value=input.dataset.value??"")})}htmlQuery(html,".add-skill-variant")?.addEventListener("click",()=>{if(!this.item.isOfType("lore"))return;const variants=this.item.system.variants??{},index=Object.keys(variants).length;this.item.update({[`system.variants.${index}`]:{label:"+X in terrain",options:""}})});for(const button of htmlQueryAll(html,".skill-variants .remove-skill-variant"))button.addEventListener("click",event=>{if(!(event.currentTarget instanceof HTMLElement))return;const index=event.currentTarget.dataset.skillVariantIndex;this.item.update({[`system.variants.-=${index}`]:null})});if(this.isEditable&&game.user.isGM&&!this.item.system.description.gm&&!(this.item.isOfType("spell")&&this.item.isVariant)){const descriptionEditors=htmlQuery(html,".tab[data-tab=description]"),mainEditor=htmlQuery(descriptionEditors,".main .editor");if(!mainEditor)throw ErrorPF2e("Unexpected error retrieving description editor");const addGMNotesLink=document.createElement("a");addGMNotesLink.className=addGMNotesLink.dataset.action="add-gm-notes",addGMNotesLink.innerHTML=fontAwesomeIcon("fa-note-medical",{style:"regular"}).outerHTML,addGMNotesLink.dataset.tooltip="PF2E.Item.GMNotes.Add",mainEditor.prepend(addGMNotesLink),addGMNotesLink.addEventListener("click",()=>{htmlQuery(descriptionEditors,".gm-notes")?.classList.add("has-content"),this.activateEditor("system.description.gm")})}const rules=htmlQuery(html,".rule-element-forms");rules&&Sortable.create(rules,{...SORTABLE_DEFAULTS,handle:".drag-handle",onEnd:async event=>{const currentIndex=event.oldDraggableIndex,newIndex=event.newDraggableIndex;if(currentIndex===void 0||newIndex===void 0){this.render();return}const rules2=this.item.toObject().system.rules,movingRule=rules2.at(currentIndex);movingRule&&newIndex<=rules2.length?(rules2.splice(currentIndex,1),rules2.splice(newIndex,0,movingRule),await this.item.update({"system.rules":rules2})||this.render()):this.render()}})}_getSubmitData(updateData=null){const fd=new FormDataExtended(this.form,{editors:this.editors}),data=updateData?mergeObject(fd.object,updateData):expandObject(fd.object),flattenedData=flattenObject(data);return processTagifyInSubmitData(this.form,flattenedData),flattenedData}_getHeaderButtons(){const buttons=super._getHeaderButtons();return game.settings.get("pf2e","dataTools")&&this.isEditable&&this.item.sourceId?.startsWith("Compendium.")&&(this.actor||!this.item.uuid.startsWith("Compendium."))&&buttons.unshift({label:"Refresh",class:"refresh-from-compendium",icon:"fa-solid fa-sync-alt",onclick:()=>this.item.refreshFromCompendium()}),buttons}_canDragDrop(_selector){return this.item.isOwner}async _onSubmit(event,{updateData=null,preventClose=!1,preventRender=!1}={}){for(const input of htmlQueryAll(this.form,"tags ~ input"))input.value===""&&(input.value="[]");return super._onSubmit(event,{updateData,preventClose,preventRender})}async _updateObject(event,formData){const expanded=expandObject(formData),form=htmlClosest(event.target,".rule-form[data-idx]");if(form){const idx=Number(form.dataset.idx),ruleForm=__privateGet(this,_ruleElementForms)[idx],itemRules=this.item.toObject().system.rules;if(idx>=itemRules.length||!ruleForm)throw ErrorPF2e(`Invalid rule form update, no rule form available at index ${idx}`);const incomingData=expanded.system?.rules?.[idx];incomingData&&(ruleForm.updateObject(incomingData),itemRules[idx]=ruleForm.rule,this.item.update({"system.rules":itemRules}))}return delete expanded.system?.rules,super._updateObject(event,flattenObject(expanded))}async _render(force,options){if(await maintainFocusInRender(this,()=>super._render(force,options)),__privateGet(this,_editingRuleElementIndex)===null&&__privateGet(this,_rulesLastScrollTop)){const html=this.element[0],rulesTab=htmlQuery(html,".tab[data-tab=rules]");rulesTab&&(rulesTab.scrollTop=__privateGet(this,_rulesLastScrollTop)),__privateSet(this,_rulesLastScrollTop,null)}}};_selectedRuleElementType=new WeakMap,_editingRuleElementIndex=new WeakMap,_rulesLastScrollTop=new WeakMap,_ruleElementForms=new WeakMap,_createRuleElementForms=new WeakSet,createRuleElementForms_fn=__name2(function(){const rules=this.item.toObject().system.rules,previousForms=[...__privateGet(this,_ruleElementForms)],processedRules=rules.map((rule,index)=>{const options={sheet:this,index,rule,object:this.item.rules.find(r=>r.sourceIndex===index)??null},FormClass=RULE_ELEMENT_FORMS[String(rule.key)]??RuleElementForm,existing=previousForms.find(f=>equals(f.rule,rule)&&f.constructor.name===FormClass.name)??null;return existing&&previousForms.splice(previousForms.indexOf(existing),1),{options,FormClass,existing}});for(const rule of processedRules.filter(p=>!p.existing)){const existing=__privateGet(this,_ruleElementForms)[rule.options.index];existing instanceof rule.FormClass&&!processedRules.some(r=>r.existing===existing)&&(rule.existing=existing)}__privateSet(this,_ruleElementForms,processedRules.map(processed=>processed.existing?(processed.existing.initialize(processed.options),processed.existing):new processed.FormClass(processed.options)))},"#createRuleElementForms"),__name2(_ItemSheetPF2e,"ItemSheetPF2e");let ItemSheetPF2e=_ItemSheetPF2e;const _SettingsMenuPF2e=class extends FormApplication{static{__name(this,"_SettingsMenuPF2e")}cache={};static get defaultOptions(){const options=super.defaultOptions;return options.classes.push("settings-menu","sheet"),mergeObject(options,{title:`PF2E.SETTINGS.${this.namespace.titleCase()}.Name`,id:`${this.namespace}-settings`,template:"systems/pf2e/templates/system/settings/menu.hbs",width:550,height:"auto",tabs:[{navSelector:".sheet-tabs",contentSelector:"form"}],closeOnSubmit:!1,submitOnChange:!0})}static get prefix(){return`${this.namespace}.`}get namespace(){return this.constructor.namespace}get prefix(){return this.constructor.prefix}static get settings(){return{}}static registerSettings(){const settings=this.settings;for(const setting of this.SETTINGS)game.settings.register("pf2e",`${this.prefix}${setting}`,{...settings[setting],scope:"world",config:!1})}async getData(){const settings=this.constructor.settings,templateData=settingsToSheetData(settings,this.cache,this.prefix);return mergeObject(await super.getData(),{settings:templateData,instructions:`PF2E.SETTINGS.${this.namespace.titleCase()}.Hint`})}activateListeners($html){super.activateListeners($html);const html=$html[0],{highlightSetting}=this.options;if(highlightSetting){const formGroup=htmlClosest(htmlQuery(html,`label[for="${highlightSetting}"]`),".form-group");formGroup&&(formGroup.style.animation="glow 0.75s infinite alternate")}}async _updateObject(event,data){for(const key of this.constructor.SETTINGS){const settingKey=`${this.prefix}${key}`,value=data[key];this.cache[key]=value,event.type==="submit"&&await game.settings.set("pf2e",settingKey,value)}event.type==="submit"?this.close():this.render()}_injectHTML($html){super._injectHTML($html);for(const key of this.constructor.SETTINGS){const settingKey=`${this.prefix}${key}`;this.cache[key]=game.settings.get("pf2e",settingKey)}}};__name2(_SettingsMenuPF2e,"SettingsMenuPF2e"),__publicField(_SettingsMenuPF2e,"namespace"),__publicField(_SettingsMenuPF2e,"SETTINGS");let SettingsMenuPF2e=_SettingsMenuPF2e;function settingsToSheetData(settings,cache,prefix=""){return Object.entries(settings).reduce((result,[key,setting])=>{const lookupKey=`${prefix}${key}`,value=key in cache?cache[key]:game.settings.get("pf2e",lookupKey);return cache[key]=value,result[key]={...setting,key,value,isSelect:!!setting.choices,isCheckbox:setting.type===Boolean},result},{})}__name(settingsToSheetData,"settingsToSheetData"),__name2(settingsToSheetData,"settingsToSheetData");function isHomebrewFlagCategory(value){return isObject$1(value)&&Object.entries(value).every(([_hbKey,hbLabel])=>typeof hbLabel=="string"||isObject(hbLabel)&&isLabelAndDescription(hbLabel))}__name(isHomebrewFlagCategory,"isHomebrewFlagCategory"),__name2(isHomebrewFlagCategory,"isHomebrewFlagCategory");function isHomebrewCustomDamage(value){return Object.values(value).every(value2=>isObject(value2)&&typeof value2.label=="string"&&["physical","energy"].includes(value2.category??""))}__name(isHomebrewCustomDamage,"isHomebrewCustomDamage"),__name2(isHomebrewCustomDamage,"isHomebrewCustomDamage");function isLabelAndDescription(obj){return typeof obj.label=="string"&&typeof obj.description=="string"}__name(isLabelAndDescription,"isLabelAndDescription"),__name2(isLabelAndDescription,"isLabelAndDescription");function prepareCleanup(listKey,deletions){var _a;const Migration=(_a=class extends MigrationBase{static{__name(this,"_a")}async updateActor(source){if(source.type==="character"||source.type==="npc")switch(listKey){case"creatureTraits":{const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t));break}case"languages":{const languages=source.system.traits.languages;languages.value=languages.value.filter(l=>!deletions.includes(l));break}case"weaponCategories":{if(source.type==="character"){const attacks=source.system.proficiencies?.attacks??{};for(const key of deletions)attacks[key]&&(delete attacks[key],attacks[`-=${key}`]=null)}break}case"weaponGroups":{if(source.type==="character"){const proficiencyKeys=deletions.map(deletion=>`weapon-group-${deletion}`),attacks=source.system.proficiencies?.attacks??{};for(const key of proficiencyKeys)delete attacks[key],attacks[`-=${key}`]=null}break}case"baseWeapons":{if(source.type==="character"){const proficiencyKeys=deletions.map(deletion=>`weapon-base-${deletion}`),attacks=source.system.proficiencies?.attacks??{};for(const key of proficiencyKeys)delete attacks[key],attacks[`-=${key}`]=null}break}case"weaponTraits":{const weaponsAndAttacks=source.items.filter(i=>["melee","weapon"].includes(i.type));for(const itemSource of weaponsAndAttacks){const traits=itemSource.system.traits.value;for(const deleted of deletions)traits.findSplice(t=>t===deleted)}}}}async updateItem(source){switch(listKey){case"creatureTraits":{if(source.system.traits?.value){const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t))}break}case"featTraits":{if(source.type==="feat"){const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t))}break}case"magicSchools":case"spellTraits":{if(source.type==="spell"){const traits=source.system.traits;traits.value=traits.value.filter(t=>!deletions.includes(t))}break}case"languages":{if(source.type==="ancestry"){const{languages}=source.system;languages.value=languages.value.filter(l=>!deletions.includes(l))}break}case"weaponCategories":{if(source.type==="weapon"){const systemData=source.system;systemData.category=deletions.includes(systemData.category??"")?"simple":systemData.category}break}case"weaponGroups":{if(source.type==="weapon"){const systemData=source.system;systemData.group=deletions.includes(systemData.group??"")?null:systemData.group}break}case"baseWeapons":{if(source.type==="weapon"){const base=source.system.baseItem;source.system.baseItem=deletions.includes(base??"")?null:base}break}}}},__name2(_a,"Migration"),__publicField(_a,"version",MigrationRunnerBase.LATEST_SCHEMA_VERSION),_a);return new Migration}__name(prepareCleanup,"prepareCleanup"),__name2(prepareCleanup,"prepareCleanup");const tagify="",_HomebrewElements=class extends SettingsMenuPF2e{static{__name(this,"_HomebrewElements")}constructor(){super(...arguments),__privateAdd(this,_processDeletions),__privateAdd(this,_refreshSettings),__privateAdd(this,_registerModuleTags),__privateAdd(this,_getConfigRecord),__privateAdd(this,_updateConfigRecords),__privateAdd(this,_initialRefresh,!0),__privateAdd(this,_damageManager,new DamageTypeManager)}static get SETTINGS(){return Object.keys(this.settings)}static get defaultOptions(){return mergeObject(super.defaultOptions,{template:"systems/pf2e/templates/system/settings/homebrew.hbs"})}static get traitSettings(){return HOMEBREW_TRAIT_KEYS.reduce((result,key)=>(result[key]={name:CONFIG.PF2E.SETTINGS.homebrew[key].name,hint:CONFIG.PF2E.SETTINGS.homebrew[key].hint,default:[],type:Object},result),{})}static get settings(){return{...this.traitSettings,damageTypes:{name:"PF2E.SETTINGS.Homebrew.DamageTypes.Name",default:[],type:Object}}}activateListeners($form){super.activateListeners($form);const html=$form[0];$form.find("button[name=reset]").on("click",()=>{this.render()});for(const key of HOMEBREW_TRAIT_KEYS){const $input=$form.find(`input[name="${key}"]`);new Tagify($input[0],{editTags:1,hooks:{beforeRemoveTag:tags=>{const localize=localizer("PF2E.SETTINGS.Homebrew.ConfirmDelete"),response=(async()=>{const content=localize("Message",{element:tags[0].data.value});return await Dialog.confirm({title:localize("Title"),content:`

${content}

`})})();return(async()=>await response?Promise.resolve():Promise.reject())()}}})}htmlQuery(html,"[data-action=damage-add]")?.addEventListener("click",async()=>{this.cache.damageTypes.push({label:"Custom",category:"physical",icon:"fa-question"}),this.render()});for(const element of htmlQueryAll(html,"[data-action=damage-delete]"))element.addEventListener("click",async event=>{const idx=htmlClosest(event.target,"[data-idx]")?.dataset.idx;idx&&this.cache.damageTypes.splice(Number(idx),1),this.render()})}async getData(){const data=await super.getData(),traitSettings=settingsToSheetData(this.constructor.traitSettings,this.cache,this.prefix),damageCategories2=pick(CONFIG.PF2E.damageCategories,["physical","energy"]);return{...data,traitSettings,damageCategories:damageCategories2,customDamageTypes:(this.cache.damageTypes??[]).map(customType=>({...customType,slug:`hb_${sluggify(customType.label)}`}))}}async _onSubmit(event,{updateData=null,preventClose=!1,preventRender=!1}={}){return this.form.querySelectorAll("tags ~ input").forEach(input=>{input.value===""&&(input.value="[]")}),super._onSubmit(event,{updateData,preventClose,preventRender})}_getSubmitData(updateData){const original=super._getSubmitData(updateData),data=expandObject(original);if("damageTypes"in data&&data.damageTypes&&typeof data.damageTypes=="object"){data.damageTypes=Object.values(data.damageTypes);for(const type of data.damageTypes){const sanitized=sluggify(type.icon??"");type.icon=sanitized.startsWith("fa-")?sanitized:null}}return data}async _updateObject(event,data){for(const key of HOMEBREW_TRAIT_KEYS)for(const tag of data[key])tag.id??=`hb_${sluggify(tag.value)}`;if(event.type==="submit"){const cleanupTasks=HOMEBREW_TRAIT_KEYS.map(key=>__privateMethod(this,_processDeletions,processDeletions_fn).call(this,key,data[key])).filter(task=>!!task);new MigrationRunner().runMigrations(cleanupTasks),await super._updateObject(event,data),__privateMethod(this,_refreshSettings,refreshSettings_fn).call(this)}else return super._updateObject(event,data)}onInit(){__privateMethod(this,_refreshSettings,refreshSettings_fn).call(this),__privateMethod(this,_registerModuleTags,registerModuleTags_fn).call(this)}};_initialRefresh=new WeakMap,_damageManager=new WeakMap,_processDeletions=new WeakSet,processDeletions_fn=__name2(function(listKey,newTagList){const oldTagList=game.settings.get("pf2e",`homebrew.${listKey}`),newIDList=newTagList.map(tag=>tag.id),deletions=oldTagList.flatMap(oldTag=>newIDList.includes(oldTag.id)?[]:oldTag.id),coreElements=listKey==="baseWeapons"?CONFIG.PF2E.baseWeaponTypes:CONFIG.PF2E[listKey];for(const id of deletions)if(delete coreElements[id],objectHasKey(SECONDARY_TRAIT_RECORDS,listKey))for(const recordKey of SECONDARY_TRAIT_RECORDS[listKey]){const secondaryRecord=CONFIG.PF2E[recordKey];delete secondaryRecord[id]}return game.user.isGM&&deletions.length>0?prepareCleanup(listKey,deletions):null},"#processDeletions"),_refreshSettings=new WeakSet,refreshSettings_fn=__name2(function(){__privateGet(this,_initialRefresh)||__privateGet(this,_damageManager).deleteAllHomebrew();for(const listKey of HOMEBREW_TRAIT_KEYS){const settingsKey=`homebrew.${listKey}`,elements=game.settings.get("pf2e",settingsKey);__privateMethod(this,_updateConfigRecords,updateConfigRecords_fn).call(this,elements,listKey)}const customTypes=game.settings.get("pf2e","homebrew.damageTypes");for(const data of customTypes)__privateGet(this,_damageManager).addCustomDamage(data);const activeModules=[...game.modules.entries()].filter(([_key,foundryModule])=>foundryModule.active);for(const[key,foundryModule]of activeModules){const homebrew=foundryModule.flags?.[key]?.["pf2e-homebrew"];if(isObject(homebrew)&&"damageTypes"in homebrew){const elements=homebrew.damageTypes;if(!isObject(elements)||!isHomebrewCustomDamage(elements)){console.warn(`PF2E System | Homebrew record damageTypes is malformed in module ${key}`);continue}for(const[slug,value]of Object.entries(elements))__privateGet(this,_damageManager).addCustomDamage(value,{slug})}}if(__privateGet(this,_initialRefresh))__privateSet(this,_initialRefresh,!1);else{const sheets=Object.values(ui.windows).filter(app=>app instanceof ActorSheet||app instanceof ItemSheetPF2e);for(const sheet of sheets)sheet.render(!1)}},"#refreshSettings"),_registerModuleTags=new WeakSet,registerModuleTags_fn=__name2(function(){const activeModules=[...game.modules.entries()].filter(([_key,foundryModule])=>foundryModule.active);for(const[key,foundryModule]of activeModules){const homebrew=foundryModule.flags?.[key]?.["pf2e-homebrew"];if(isObject$1(homebrew)){for(const recordKey of Object.keys(homebrew))if(!["damageTypes"].includes(recordKey))if(tupleHasValue(HOMEBREW_TRAIT_KEYS,recordKey)){const elements=homebrew[recordKey];if(!isObject(elements)||!isHomebrewFlagCategory(elements)){console.warn(`PF2E System | Homebrew record ${recordKey} is malformed in module ${key}`);continue}const tags=Object.entries(elements).map(([id,value])=>({id:`hb_${id}`,value:typeof value=="string"?value:value.label}));__privateMethod(this,_updateConfigRecords,updateConfigRecords_fn).call(this,tags,recordKey);for(const[key2,value]of Object.entries(elements))if(typeof value=="object"){const hbKey=`hb_${key2}`;CONFIG.PF2E.traitsDescriptions[hbKey]=value.description}}else{console.warn(`PF2E System | Invalid homebrew record "${recordKey}" in module ${key}`);continue}}}},"#registerModuleTags"),_getConfigRecord=new WeakSet,getConfigRecord_fn=__name2(function(recordKey){return recordKey==="baseWeapons"?CONFIG.PF2E.baseWeaponTypes:CONFIG.PF2E[recordKey]},"#getConfigRecord"),_updateConfigRecords=new WeakSet,updateConfigRecords_fn=__name2(function(elements,listKey){const coreElements=__privateMethod(this,_getConfigRecord,getConfigRecord_fn).call(this,listKey);for(const element of elements)if(coreElements[element.id]=element.value,objectHasKey(SECONDARY_TRAIT_RECORDS,listKey))for(const recordKey of SECONDARY_TRAIT_RECORDS[listKey]){const record=CONFIG.PF2E[recordKey];record[element.id]=element.value}},"#updateConfigRecords"),__name2(_HomebrewElements,"HomebrewElements"),__publicField(_HomebrewElements,"namespace","homebrew");let HomebrewElements=_HomebrewElements;const _DamageTypeManager=class{static{__name(this,"_DamageTypeManager")}collections={physical:PHYSICAL_DAMAGE_TYPES,energy:ENERGY_DAMAGE_TYPES,DAMAGE_TYPES,BASE_DAMAGE_TYPES_TO_CATEGORIES,DAMAGE_TYPE_ICONS,damageTypesLocalization:CONFIG.PF2E.damageTypes,damageRollFlavorsLocalization:CONFIG.PF2E.damageRollFlavors,immunityTypes,weaknessTypes,resistanceTypes};addCustomDamage(data,options={}){const collections=this.collections,slug=`hb_${options.slug??sluggify(data.label)}`;collections.DAMAGE_TYPES.add(slug),collections[tupleHasValue(["physical","energy"],data.category)?data.category:"physical"].push(slug),collections.BASE_DAMAGE_TYPES_TO_CATEGORIES[slug]=data.category,collections.DAMAGE_TYPE_ICONS[slug]=data.icon?.substring(3)??null,collections.damageTypesLocalization[slug]=data.label;const damageFlavor=data.label.toLocaleLowerCase();collections.damageRollFlavorsLocalization[slug]=damageFlavor,collections.immunityTypes[slug]=damageFlavor,collections.weaknessTypes[slug]=damageFlavor,collections.resistanceTypes[slug]=damageFlavor}deleteAllHomebrew(){for(const collection of Object.values(this.collections))if(collection instanceof Set){const hbTraits=[...collection].filter(tag=>tag.startsWith("hb_"));for(const trait of hbTraits)collection.delete(trait)}else{const hbTraits=Object.keys(collection).filter(tag=>tag.startsWith("hb_"));for(const trait of hbTraits)delete collection[trait]}}};__name2(_DamageTypeManager,"DamageTypeManager");let DamageTypeManager=_DamageTypeManager;const _Migration674StableHomebrewTagIDs=class extends MigrationBase{static{__name(this,"_Migration674StableHomebrewTagIDs")}homebrewKeys=deepClone(HOMEBREW_TRAIT_KEYS);homebrewTags=this.homebrewKeys.reduce((settings,key)=>mergeObject(settings,{[key]:game.settings.get("pf2e",`homebrew.${key}`)}),{});updateDocumentTags(documentTags=[]){for(const key of this.homebrewKeys){const homebrewTags=this.homebrewTags[key];for(const tag of homebrewTags){const index=documentTags.indexOf(tag.id);index!==-1&&documentTags.splice(index,1,`hb_${sluggify(tag.value)}`)}}}async updateActor(source){source.type==="familiar"||!source.system.traits?.traits||(this.updateDocumentTags(source.system.traits.traits.value),(source.type==="character"||source.type==="npc")&&this.updateDocumentTags(source.system.traits?.languages.value))}async updateItem(itemSource){this.updateDocumentTags(itemSource.system.traits?.value)}async migrate(){for(const key of this.homebrewKeys){const tags=this.homebrewTags[key];for(const tag of tags){tag.id=`hb_${sluggify(tag.value)}`;const tagMap=key==="baseWeapons"?CONFIG.PF2E.baseWeaponTypes:CONFIG.PF2E[key];tagMap[tag.id]=tag.value,delete tagMap[key]}tags.length>0&&await game.settings.set("pf2e",`homebrew.${key}`,tags)}}};__name2(_Migration674StableHomebrewTagIDs,"Migration674StableHomebrewTagIDs"),__publicField(_Migration674StableHomebrewTagIDs,"version",.674);let Migration674StableHomebrewTagIDs=_Migration674StableHomebrewTagIDs;const _Migration675FlatModifierAEsToREs=class extends MigrationBase{static{__name(this,"_Migration675FlatModifierAEsToREs")}constructor(){super(...arguments),__privateAdd(this,_isFlatModifier),__privateAdd(this,_toRuleElement)}async updateActor(actorSource){for(const effect of[...actorSource.effects])effect.changes.some(change=>change.key.endsWith(".modifiers"))&&actorSource.effects.splice(actorSource.effects.indexOf(effect),1)}async updateItem(itemSource){for(const effect of[...itemSource.effects]){for(const change of effect.changes.filter(change2=>change2.key.endsWith(".modifiers"))){const reData=__privateMethod(this,_toRuleElement,toRuleElement_fn).call(this,change.value);reData&&(effect.changes.splice(effect.changes.indexOf(change),1),itemSource.system.rules.push(reData))}effect.changes.length===0&&itemSource.effects.splice(itemSource.effects.indexOf(effect),1)}}};_isFlatModifier=new WeakSet,isFlatModifier_fn=__name2(function(data){return typeof data=="object"&&data!==null&&__name2(obj=>(typeof obj.modifier=="number"||typeof obj.modifier=="string")&&typeof obj.type=="string","dataIsModifier")(data)},"#isFlatModifier"),_toRuleElement=new WeakSet,toRuleElement_fn=__name2(function(aeValue){const aeModifier=(()=>{try{const parsed=JSON.parse(aeValue);return __privateMethod(this,_isFlatModifier,isFlatModifier_fn).call(this,parsed)?parsed:null}catch(error){return console.warn(error),null}})();return typeof aeModifier?.modifier=="string"&&aeModifier.modifier.replace("@data.","@"),aeModifier&&{key:"FlatModifier",type:aeModifier.type,value:aeModifier.modifier,selector:"hp"}},"#toRuleElement"),__name2(_Migration675FlatModifierAEsToREs,"Migration675FlatModifierAEsToREs"),__publicField(_Migration675FlatModifierAEsToREs,"version",.675);let Migration675FlatModifierAEsToREs=_Migration675FlatModifierAEsToREs;const _Migration676ReplaceItemsWithRELikeAEs=class extends MigrationBase{static{__name(this,"_Migration676ReplaceItemsWithRELikeAEs")}toughnessPromise=fromUuid("Compendium.pf2e.feats-srd.AmP0qu7c5dlBSath");stoutnessPromise=fromUuid("Compendium.pf2e.feats-srd.COP89tjrNhEucuRW");toughPromise=fromUuid("Compendium.pf2e.familiar-abilities.Le8UWr5BU8rV3iBf");replaceItem({items,type,slug,replacement}){if(!(replacement instanceof ItemPF2e))throw ErrorPF2e("Unexpected error retrieving compendium item");const current=items.find(itemSource=>itemSource.type===type&&itemSource.system.slug?.replace(/'/g,"")===slug);if(current){const newSource=replacement.toObject();current.type==="feat"&&newSource.type==="feat"&&(newSource.system.location=current.system.location),items.splice(items.indexOf(current),1,newSource)}}async updateActor(actorSource){actorSource.type==="familiar"?this.replaceItem({items:actorSource.items,type:"effect",slug:"tough",replacement:await this.toughPromise}):actorSource.type==="character"&&(this.replaceItem({items:actorSource.items,type:"feat",slug:"toughness",replacement:await this.toughnessPromise}),this.replaceItem({items:actorSource.items,type:"feat",slug:"mountains-stoutness",replacement:await this.stoutnessPromise}))}};__name2(_Migration676ReplaceItemsWithRELikeAEs,"Migration676ReplaceItemsWithRELikeAEs"),__publicField(_Migration676ReplaceItemsWithRELikeAEs,"version",.676);let Migration676ReplaceItemsWithRELikeAEs=_Migration676ReplaceItemsWithRELikeAEs;const _Migration677RuleValueDataRefs=class extends MigrationBase{static{__name(this,"_Migration677RuleValueDataRefs")}async updateItem(itemSource){for(const rule of itemSource.system.rules)typeof rule.value=="string"&&(rule.value=rule.value.replace("@data.","@"))}};__name2(_Migration677RuleValueDataRefs,"Migration677RuleValueDataRefs"),__publicField(_Migration677RuleValueDataRefs,"version",.677);let Migration677RuleValueDataRefs=_Migration677RuleValueDataRefs;const _Migration678SeparateNPCAttackTraits=class extends MigrationBase{static{__name(this,"_Migration678SeparateNPCAttackTraits")}async updateItem(itemSource){if(itemSource.type==="weapon"){const weaponTraits2=itemSource.system.traits.value,rangeTraits2=weaponTraits2.filter(trait=>/^range(?!d)/.test(trait));for(const trait of rangeTraits2)weaponTraits2.splice(weaponTraits2.indexOf(trait),1);const reloadTraits=weaponTraits2.filter(trait=>trait.startsWith("reload"));for(const trait of reloadTraits)weaponTraits2.splice(weaponTraits2.indexOf(trait),1);itemSource.system.traits.value=[...new Set(weaponTraits2)].sort()}if(!itemSource.system.traits)return;const itemTraits=itemSource.system.traits.value??[];for(const trait of itemTraits)tupleHasValue(RARITIES,trait)&&(itemTraits.splice(itemTraits.indexOf(trait),1),trait!=="common"&&isObject(itemSource.system.traits.rarity)&&itemSource.system.traits.rarity.value==="common"&&(itemSource.system.traits.rarity.value=trait))}};__name2(_Migration678SeparateNPCAttackTraits,"Migration678SeparateNPCAttackTraits"),__publicField(_Migration678SeparateNPCAttackTraits,"version",.678);let Migration678SeparateNPCAttackTraits=_Migration678SeparateNPCAttackTraits;const _Migration679TowerShieldSpeedPenalty=class extends MigrationBase{static{__name(this,"_Migration679TowerShieldSpeedPenalty")}towerShieldSlugs=["darkwood-tower-shield-high-grade","darkwood-tower-shield-standard-grade","tower-shield"];async updateItem(source){if(source.type==="armor"){const systemData=source.system;systemData.speed&&this.towerShieldSlugs.includes(systemData.slug??"")&&(systemData.speed.value=-5),systemData.armor&&(systemData.armor.value=Number(systemData.armor.value)||0),systemData.speed&&(systemData.speed.value=Number(systemData.speed.value)||0);const potencyRune=systemData.potencyRune;potencyRune.value=Number(systemData.potencyRune.value)||0,"resilient"in systemData&&("game"in globalThis?systemData["-=resilient"]=null:delete systemData.resilient)}}};__name2(_Migration679TowerShieldSpeedPenalty,"Migration679TowerShieldSpeedPenalty"),__publicField(_Migration679TowerShieldSpeedPenalty,"version",.679);let Migration679TowerShieldSpeedPenalty=_Migration679TowerShieldSpeedPenalty;const _Migration680SetWeaponHands=class extends MigrationBase{static{__name(this,"_Migration680SetWeaponHands")}oneHandedWeapons=new Set(["repeating-hand-crossbow"]);onePlusHandedWeapons=new Set(["backpack-ballista","backpack-catapult","composite-longbow","composite-shortbow","hongali-hornbow","longbow","shortbow","sun-sling"]);shieldAttachments=new Set(["shield-boss","shield-spikes"]);firearmAttachments=new Set(["bayonette","reinforced-stock"]);wornGloves=new Set(["handwraps-of-mighty-blows"]);twoHandedWeapons=new Set(["adze","alchemical-crossbow","arquebus","axe-musket","bladed-diabolo","bladed-scarf","blunderbuss","bo-staff","boarding-pike","butchering-axe","combat-grapnel","crossbow","double-barreled-musket","dueling-spear","dwarven-scattergun","elven-branched-spear","elven-curve-blade","explosive-dogslicer","falchion","fauchard","fire-lance","flingflenser","flintlock-musket","gill-hook","glaive","gnome-amalgam-musket","greataxe","greatclub","greatpick","greatsword","guisarme","gun-sword","halberd","halfling-sling-staff","hammer-gun","harmona-gun","heavy-crossbow","horsechopper","kusarigama","lance","longspear","maul","meteor-hammer","mithral-tree","naginata","ogre-hook","ranseur","repeating-crossbow","repeating-heavy-crossbow","scythe","shauth-lash","spiked-chain","taw-launcher","three-peaked-tree","thundermace","war-flail","whip-claw"]);isShield(source){return source.type==="armor"&&(source.system.armorType?.value==="shield"||source.system.category==="shield")}async updateItem(itemSource){if(this.isShield(itemSource))itemSource.system.usage.value="held-in-one-hand";else if(itemSource.type==="weapon"){itemSource.system.usage??={value:"held-in-one-hand"};const{baseItem,slug,traits}=itemSource.system,usage=itemSource.system.usage;if(this.twoHandedWeapons.has(baseItem||slug||""))usage.value="held-in-two-hands";else if(this.onePlusHandedWeapons.has(baseItem||slug||""))usage.value="held-in-one-plus-hands";else if(this.oneHandedWeapons.has(baseItem||slug||""))usage.value="held-in-one-hand";else if(this.shieldAttachments.has(baseItem||slug||"")){usage.value="held-in-one-hand";const attachedIndex=traits.value.findIndex(trait=>trait==="attached");attachedIndex!==-1&&traits.value.splice(attachedIndex,1,"attached-to-shield")}else if(this.firearmAttachments.has(baseItem||slug||"")){usage.value="held-in-one-hand";const attachedIndex=traits.value.findIndex(trait=>trait==="attached");attachedIndex!==-1&&traits.value.splice(attachedIndex,1,"attached-to-crossbow-or-firearm")}else this.wornGloves.has(baseItem||slug||"")&&(usage.value="worn-gloves")}}};__name2(_Migration680SetWeaponHands,"Migration680SetWeaponHands"),__publicField(_Migration680SetWeaponHands,"version",.68);let Migration680SetWeaponHands=_Migration680SetWeaponHands;const _Migration681GiantLanguageToJotun=class extends MigrationBase{static{__name(this,"_Migration681GiantLanguageToJotun")}replaceGiant({value}){const giantIndex=value.indexOf("giant");giantIndex!==-1&&value.splice(giantIndex,1,"jotun")}async updateActor(actorSource){(actorSource.type==="character"||actorSource.type==="npc")&&this.replaceGiant(actorSource.system.traits.languages)}async updateItem(itemSource){itemSource.type==="ancestry"&&this.replaceGiant(itemSource.system.additionalLanguages)}};__name2(_Migration681GiantLanguageToJotun,"Migration681GiantLanguageToJotun"),__publicField(_Migration681GiantLanguageToJotun,"version",.681);let Migration681GiantLanguageToJotun=_Migration681GiantLanguageToJotun;const _Migration682BiographyFields=class extends MigrationBase{static{__name(this,"_Migration682BiographyFields")}replaceBiographyData(old){old.details.biography.public?(old.details.biography.appearance=old.details.biography.public,old.details.biography["-=public"]=null):old.details.biography.appearance??="",old.details.biography.value?(old.details.biography.campaignNotes=old.details.biography.value,old.details.biography["-=value"]=null):old.details.biography.campaignNotes??="","game"in globalThis||(delete old.details.biography.public,delete old.details.biography.value),old.details.biography.backstory??="",old.details.biography.birthPlace??="",old.details.biography.attitude??="",old.details.biography.beliefs??="",old.details.biography.likes??="",old.details.biography.dislikes??="",old.details.biography.catchphrases??="",old.details.biography.allies??="",old.details.biography.enemies??="",old.details.biography.organaizations??=""}async updateActor(source){source.type==="character"&&this.replaceBiographyData(source.system)}};__name2(_Migration682BiographyFields,"Migration682BiographyFields"),__publicField(_Migration682BiographyFields,"version",.682);let Migration682BiographyFields=_Migration682BiographyFields;const _Migration683FlavorTextToPublicNotes=class extends MigrationBase{static{__name(this,"_Migration683FlavorTextToPublicNotes")}replaceFlavorTextData(old){old.details.flavorText?(old.details.publicNotes=old.details.flavorText,old.details["-=flavorText"]=null):old.details.publicNotes??="","game"in globalThis||delete old.details.flavorText,old.details.blurb??="",old.details.privateNotes??=""}async updateActor(actorSource){actorSource.type==="npc"&&this.replaceFlavorTextData(actorSource.system)}};__name2(_Migration683FlavorTextToPublicNotes,"Migration683FlavorTextToPublicNotes"),__publicField(_Migration683FlavorTextToPublicNotes,"version",.683);let Migration683FlavorTextToPublicNotes=_Migration683FlavorTextToPublicNotes;const _Migration684RationsToConsumable=class extends MigrationBase{static{__name(this,"_Migration684RationsToConsumable")}constructor(){super(...arguments),__privateAdd(this,_isOldRations),__privateAdd(this,_getRationRefs),__privateAdd(this,_rationsSourceId,"Compendium.pf2e.equipment-srd.L9ZV076913otGtiB"),__privateAdd(this,_rationsPromise,fromUuid(__privateGet(this,_rationsSourceId)))}async updateActor(source){const oldRations=source.items.filter(i=>__privateMethod(this,_isOldRations,isOldRations_fn).call(this,i)),rations=await __privateGet(this,_rationsPromise);if(!(rations instanceof ConsumablePF2e))throw ErrorPF2e("Unexpected error acquiring compendium item");for(const oldRation of oldRations){const newRation=rations.toObject();newRation.folder=oldRation.folder,newRation.sort=oldRation.sort;const oldContainerId=oldRation.system.containerId??{value:null};oldContainerId instanceof Object&&(newRation.system.containerId=oldContainerId.value);const oldQuantity=oldRation.system.quantity;isObject(oldQuantity)&&(newRation.system.quantity=Math.ceil((oldQuantity.value??1)/7)),source.items.findSplice(item=>item===oldRation,newRation)}}async updateItem(source){if(source.type!=="kit")return;const rationRefs=__privateMethod(this,_getRationRefs,getRationRefs_fn).call(this,Object.values(source.system.items));for(const rationRef of rationRefs)rationRef.quantity=Math.ceil(rationRef.quantity/7)}};_rationsSourceId=new WeakMap,_rationsPromise=new WeakMap,_isOldRations=new WeakSet,isOldRations_fn=__name2(function(itemSource){return itemSource?.type==="equipment"&&itemSource.flags.core?.sourceId===__privateGet(this,_rationsSourceId)},"#isOldRations"),_getRationRefs=new WeakSet,getRationRefs_fn=__name2(function(itemRefs){return itemRefs.reduce((rationRefs,itemRef)=>(itemRef.isContainer&&itemRef.items?rationRefs.push(...__privateMethod(this,_getRationRefs,getRationRefs_fn).call(this,Object.values(itemRef.items))):itemRef.pack==="pf2e.equipment-srd"&&itemRef.id==="L9ZV076913otGtiB"&&rationRefs.push(itemRef),rationRefs),[])},"#getRationRefs"),__name2(_Migration684RationsToConsumable,"Migration684RationsToConsumable"),__publicField(_Migration684RationsToConsumable,"version",.684);let Migration684RationsToConsumable=_Migration684RationsToConsumable;const _Migration685FixMeleeUsageTraits=class extends MigrationBase{static{__name(this,"_Migration685FixMeleeUsageTraits")}async updateItem(itemSource){if(itemSource.type==="weapon"){const systemData=itemSource.system;systemData.meleeUsage&&!Array.isArray(systemData.meleeUsage.traits)&&(systemData.meleeUsage.traits=systemData.meleeUsage.traits?.value??[])}}};__name2(_Migration685FixMeleeUsageTraits,"Migration685FixMeleeUsageTraits"),__publicField(_Migration685FixMeleeUsageTraits,"version",.685);let Migration685FixMeleeUsageTraits=_Migration685FixMeleeUsageTraits;const _Migration686HeroPointsToResources=class extends MigrationBase{static{__name(this,"_Migration686HeroPointsToResources")}async updateActor(actorSource){if(actorSource.type!=="character")return;const systemSource=actorSource.system;if(systemSource.attributes.heroPoints){const resources=systemSource.resources;resources.heroPoints={value:systemSource.attributes.heroPoints.rank},systemSource.attributes["-=heroPoints"]=null,"game"in globalThis||delete systemSource.attributes.heroPoints}}};__name2(_Migration686HeroPointsToResources,"Migration686HeroPointsToResources"),__publicField(_Migration686HeroPointsToResources,"version",.686);let Migration686HeroPointsToResources=_Migration686HeroPointsToResources;const _Migration687FamiliarityAEsToREs=class extends MigrationBase{static{__name(this,"_Migration687FamiliarityAEsToREs")}isFamiliarityAE(data){return typeof data=="object"&&data!==null&&__name2(obj=>typeof obj.trait=="string"&&typeof obj.category=="string","dataIsFamiliarity")(data)}toRuleElement(sameAs,aeValue){const aeData=(()=>{try{const parsed=JSON.parse(aeValue);return this.isFamiliarityAE(parsed)?parsed:null}catch(error){return console.warn(error),null}})();return aeData&&{key:"LinkedProficiency",slug:`${aeData.category}-${aeData.trait}-weapons`,predicate:{all:[`weapon:trait:${aeData.trait}`,`weapon:category:${aeData.category}`]},sameAs}}async updateActor(actorSource){actorSource.effects=[]}async updateItem(itemSource){for(const effect of[...itemSource.effects])for(const change of effect.changes.filter(change2=>change2.key.startsWith("system.martial."))){const linkTo=change.key.replace(/^data\.martial\.|\.familiarity$/g,""),reData=this.toRuleElement(linkTo,change.value);reData&&itemSource.system.rules.push(reData)}itemSource.effects=[]}};__name2(_Migration687FamiliarityAEsToREs,"Migration687FamiliarityAEsToREs"),__publicField(_Migration687FamiliarityAEsToREs,"version",.687);let Migration687FamiliarityAEsToREs=_Migration687FamiliarityAEsToREs;const _Migration688ClampSpellLevel=class extends MigrationBase{static{__name(this,"_Migration688ClampSpellLevel")}async updateItem(itemSource){itemSource.type==="spell"&&(itemSource.system.level.value=Math.min(Math.max(itemSource.system.level.value,1),10))}};__name2(_Migration688ClampSpellLevel,"Migration688ClampSpellLevel"),__publicField(_Migration688ClampSpellLevel,"version",.688);let Migration688ClampSpellLevel=_Migration688ClampSpellLevel;const _Migration689EncumberanceActiveEffects=class extends MigrationBase{static{__name(this,"_Migration689EncumberanceActiveEffects")}async updateItem(itemSource){const systemData=itemSource.system,slug=systemData.slug??sluggify(itemSource.name),amountToIncreaseBy=(()=>itemSource.type==="feat"&&slug==="hefty-hauler"?2:itemSource.type==="feat"&&slug==="hardy-traveler"||itemSource.type==="equipment"&&slug==="lifting-belt"?1:0)();if(amountToIncreaseBy===0||systemData.rules.some(r=>r.key==="ActiveEffectLike"))return;const rules=[{key:"ActiveEffectLike",path:"system.attributes.bonusEncumbranceBulk",mode:"add",value:amountToIncreaseBy},{key:"ActiveEffectLike",path:"system.attributes.bonusLimitBulk",mode:"add",value:amountToIncreaseBy}];for(const rule of rules)systemData.rules.push(rule)}};__name2(_Migration689EncumberanceActiveEffects,"Migration689EncumberanceActiveEffects"),__publicField(_Migration689EncumberanceActiveEffects,"version",.689);let Migration689EncumberanceActiveEffects=_Migration689EncumberanceActiveEffects;const _Migration690InitiativeTiebreakItems=class extends MigrationBase{static{__name(this,"_Migration690InitiativeTiebreakItems")}itemSlugs=["ambush-awareness","elven-instincts","pilgrims-token"];rule={key:"ActiveEffectLike",path:"system.attributes.initiative.tiebreakPriority",mode:"override",value:0};async updateItem(itemSource){this.itemSlugs.includes(itemSource.system.slug??"")&&!itemSource.system.rules.some(rule=>rule.key==="ActiveEffectLike")&&!(itemSource.system.slug==="pilgrims-token"&&itemSource.type!=="equipment")&&itemSource.system.rules.push(this.rule)}};__name2(_Migration690InitiativeTiebreakItems,"Migration690InitiativeTiebreakItems"),__publicField(_Migration690InitiativeTiebreakItems,"version",.69);let Migration690InitiativeTiebreakItems=_Migration690InitiativeTiebreakItems;const _Migration691WeaponRangeAbilityCategoryGroup=class extends MigrationBase{static{__name(this,"_Migration691WeaponRangeAbilityCategoryGroup")}isOldGroupData(group){return isObject(group)&&(typeof group.value=="string"||group.value===null)}isOldRangeData(range){return range instanceof Object&&"value"in range&&typeof range.value=="string"}async updateItem(itemSource){if(itemSource.type==="weapon"){const systemData=itemSource.system;systemData.category=(systemData.weaponType?systemData.weaponType.value:systemData.category)||"simple",systemData.weaponType&&(systemData["-=weaponType"]=null,"game"in globalThis||delete systemData.weaponType),systemData.group=(this.isOldGroupData(systemData.group)?systemData.group.value:systemData.group)||null;const hasOldRangeData=this.isOldRangeData(systemData.range);if(systemData.range=hasOldRangeData?Number(systemData.range.value)||null:systemData.range,hasOldRangeData&&isObject(systemData.ability)&&(systemData.ability.value==="str"&&!setHasElement(MANDATORY_RANGED_GROUPS,systemData.group)&&(systemData.range=null),delete systemData.ability,systemData["-=ability"]=null),setHasElement(MANDATORY_RANGED_GROUPS,systemData.group)){const thrownIndex=systemData.traits.value.findIndex(trait=>/^thrown-\d+/.test(trait));thrownIndex!==-1&&(systemData.traits.value[thrownIndex]="thrown",systemData.reload.value="-")}systemData.baseItem==="falchion"?systemData.group="sword":systemData.baseItem==="orc-knuckle-dagger"&&(systemData.group="knife")}const{rules}=itemSource.system,strikeRules=rules.filter(rule=>/\bStrike$/.test(String(rule.key)));for(const rule of strikeRules)rule.key="Strike",rule.range=Number(rule.range)||null,delete rule.ability}};__name2(_Migration691WeaponRangeAbilityCategoryGroup,"Migration691WeaponRangeAbilityCategoryGroup"),__publicField(_Migration691WeaponRangeAbilityCategoryGroup,"version",.691);let Migration691WeaponRangeAbilityCategoryGroup=_Migration691WeaponRangeAbilityCategoryGroup;const _Migration692CraftingEntryFeatReplacement=class extends MigrationBase{static{__name(this,"_Migration692CraftingEntryFeatReplacement")}requiresFlush=!0;slugToPromise=new Map([["advanced-alchemy",fromUuid("Compendium.pf2e.classfeatures.Pe0zmIqyTBc2Td0I")],["field-discovery-bomber",fromUuid("Compendium.pf2e.classfeatures.8QAFgy9U8PxEa7Dw")],["field-discovery-chirurgeon",fromUuid("Compendium.pf2e.classfeatures.qC0Iz6SlG2i9gv6g")],["field-discovery-mutagenist",fromUuid("Compendium.pf2e.classfeatures.V4Jt7eDnJBLv5bDj")],["field-discovery-toxicologist",fromUuid("Compendium.pf2e.classfeatures.6zo2PJGYoig7nFpR")],["infused-reagents",fromUuid("Compendium.pf2e.classfeatures.wySB9VHOW1v3TX1L")],["alchemist-dedication",fromUuid("Compendium.pf2e.feats-srd.CJMkxlxHiHZQYDCz")],["deeper-dabbler",fromUuid("Compendium.pf2e.feats-srd.PTXZ2C3AV8tZf0iX")],["efficient-alchemy-paragon",fromUuid("Compendium.pf2e.feats-srd.2FBZ0apnmZ7b61ct")],["expert-alchemy",fromUuid("Compendium.pf2e.feats-srd.soHLtpMM9h3AE7PD")],["expert-fireworks-crafter",fromUuid("Compendium.pf2e.feats-srd.dDFQJem5K9Jzxgda")],["expert-herbalism",fromUuid("Compendium.pf2e.feats-srd.owJorCBZmUi5lIV0")],["expert-poisoner",fromUuid("Compendium.pf2e.feats-srd.VruIzuysxw4tY6rk")],["firework-technician-dedication",fromUuid("Compendium.pf2e.feats-srd.MVbNnjqQOK9d8Ki3")],["gadget-specialist",fromUuid("Compendium.pf2e.feats-srd.DQN7YC7s7T0pL6Aa")],["herbalist-dedication",fromUuid("Compendium.pf2e.feats-srd.5CRt5Dy9eLv5LpRF")],["master-alchemy",fromUuid("Compendium.pf2e.feats-srd.f6k9lIrIS4SfnCnG")],["munitions-crafter",fromUuid("Compendium.pf2e.feats-srd.lFVqejlf52cdYrZy")],["munitions-machinist",fromUuid("Compendium.pf2e.feats-srd.lh3STEvbGnP7jVMr")],["plentiful-snares",fromUuid("Compendium.pf2e.feats-srd.wGaxWwJhIXbMJft1")],["poisoner-dedication",fromUuid("Compendium.pf2e.feats-srd.y7DDs03GtDnmhxFp")],["snare-genius",fromUuid("Compendium.pf2e.feats-srd.8DIzXO1YpsU3DpJw")],["snare-specialist",fromUuid("Compendium.pf2e.feats-srd.0haS0qXR9xTYKoTG")],["snarecrafter-dedication",fromUuid("Compendium.pf2e.feats-srd.4MUbwilvb9dI0X59")],["talisman-dabbler-dedication",fromUuid("Compendium.pf2e.feats-srd.1t5479E6bdvFs4E7")],["ubiquitous-gadgets",fromUuid("Compendium.pf2e.feats-srd.ny0nfGTDUE4p8TtO")],["ubiquitous-snares",fromUuid("Compendium.pf2e.feats-srd.bX2WI5k0afqPpCfm")]]);replaceItem({items,current,replacement}){if(!(replacement instanceof ItemPF2e))throw ErrorPF2e("Unexpected error retrieving compendium item");const newSource=replacement.toObject();current.type==="feat"&&newSource.type==="feat"&&(newSource.system.location=current.system.location),items.splice(items.indexOf(current),1,newSource)}async updateActor(actorSource){actorSource.type==="character"&&this.slugToPromise.forEach(async(promise,slug)=>{const current=actorSource.items.find(itemSource=>itemSource.type==="feat"&&itemSource.system.slug===slug);current&&this.replaceItem({items:actorSource.items,current,replacement:await promise})})}};__name2(_Migration692CraftingEntryFeatReplacement,"Migration692CraftingEntryFeatReplacement"),__publicField(_Migration692CraftingEntryFeatReplacement,"version",.692);let Migration692CraftingEntryFeatReplacement=_Migration692CraftingEntryFeatReplacement;const _Migration693ArmorCategoryGroup=class extends MigrationBase{static{__name(this,"_Migration693ArmorCategoryGroup")}isOldGroupData(group){return group instanceof Object&&"value"in group&&(typeof group.value=="string"||group.value===null)}async updateItem(itemSource){if(itemSource.type!=="armor")return;const systemData=itemSource.system;systemData.category=(systemData.armorType?systemData.armorType.value:systemData.category)||"simple",systemData.armorType&&(systemData["-=armorType"]=null,"game"in globalThis||delete systemData.armorType),systemData.group=(this.isOldGroupData(systemData.group)?systemData.group.value:systemData.group)||null}};__name2(_Migration693ArmorCategoryGroup,"Migration693ArmorCategoryGroup"),__publicField(_Migration693ArmorCategoryGroup,"version",.693);let Migration693ArmorCategoryGroup=_Migration693ArmorCategoryGroup;const _Migration694RetireSystemTokenSettings=class extends MigrationBase{static{__name(this,"_Migration694RetireSystemTokenSettings")}async migrate(){const systemNameHover=Number(game.settings.storage.get("world").getItem("pf2e.defaultTokenSettingsName"))||CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER,systemBarHover=Number(game.settings.storage.get("world").getItem("pf2e.defaultTokenSettingsBar"))||CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER,coreTokenDefaults=game.settings.get("core","defaultToken");coreTokenDefaults.displayName=systemNameHover,coreTokenDefaults.displayBars=systemBarHover}};__name2(_Migration694RetireSystemTokenSettings,"Migration694RetireSystemTokenSettings"),__publicField(_Migration694RetireSystemTokenSettings,"version",.694);let Migration694RetireSystemTokenSettings=_Migration694RetireSystemTokenSettings;const _Migration695SummonToSummoned=class extends MigrationBase{static{__name(this,"_Migration695SummonToSummoned")}async updateItem(itemSource){const traits=itemSource.system.traits;if(traits?.value)if(itemSource.type==="action")traits.custom??="",traits.custom.toLowerCase()==="summon"&&(traits.custom="",traits.value=Array.from(new Set([...traits.value,"summon"])).sort());else{const index=traits.value.indexOf("summon");index!==-1&&(traits.value[index]="summoned")}}};__name2(_Migration695SummonToSummoned,"Migration695SummonToSummoned"),__publicField(_Migration695SummonToSummoned,"version",.695);let Migration695SummonToSummoned=_Migration695SummonToSummoned;const _Migration696FlatAbilityModifiers=class extends MigrationBase{static{__name(this,"_Migration696FlatAbilityModifiers")}abilityModPattern=/@abilities\.([a-z]{3})\.mod\b/;abbreviationMap=new Map(Array.from(ATTRIBUTE_ABBREVIATIONS).map(a=>[`PF2E.Ability${sluggify(a,{camel:"bactrian"})}`,a]));async updateItem(itemSource){const rules=itemSource.system.rules;for(const rule of rules)if(typeof rule.key=="string"&&rule.key.endsWith("FlatModifier")&&rule.type==="ability"&&!setHasElement(ATTRIBUTE_ABBREVIATIONS,rule.ability)){const abilityFromValue=this.abilityModPattern.exec(String(rule.value))?.[1]??null;rule.ability=abilityFromValue??this.abbreviationMap.get(String(rule.label??""))??"str",typeof rule.value=="string"&&rule.value.startsWith("@")&&rule.value.endsWith(".mod")&&delete rule.value}itemSource.system.slug==="thief-racket"&&!rules.some(rule=>rule.ability==="dex")&&rules.unshift({ability:"dex",key:"FlatModifier",predicate:{all:["weapon:melee","weapon:trait:finesse"],not:["weapon:category:unarmed"]},selector:"damage",type:"ability"})}};__name2(_Migration696FlatAbilityModifiers,"Migration696FlatAbilityModifiers"),__publicField(_Migration696FlatAbilityModifiers,"version",.696);let Migration696FlatAbilityModifiers=_Migration696FlatAbilityModifiers;const _Migration697WeaponReachTrait=class extends MigrationBase{static{__name(this,"_Migration697WeaponReachTrait")}async updateItem(itemSource){if(itemSource.type==="weapon"){const traits=itemSource.system.traits.value,numericReach=traits.find(t=>/^reach-\d+$/.test(t));numericReach&&traits.splice(traits.indexOf(numericReach),1,"reach")}}};__name2(_Migration697WeaponReachTrait,"Migration697WeaponReachTrait"),__publicField(_Migration697WeaponReachTrait,"version",.697);let Migration697WeaponReachTrait=_Migration697WeaponReachTrait;const _Migration698RemoveDerivedActorTraits=class extends MigrationBase{static{__name(this,"_Migration698RemoveDerivedActorTraits")}async updateActor(source){if(!((source.type==="character"||source.type==="npc")&&"traits"in source.system.traits&&isObject(source.system.traits.traits)&&"value"in source.system.traits.traits&&Array.isArray(source.system.traits.traits.value)))return;const traits=source.system.traits.traits.value;for(const trait of ALIGNMENT_TRAITS){const index=traits.indexOf(trait);index>=0&&traits.splice(index,1)}if(source.type==="character"){const ancestry=source.items.find(i=>i.type==="ancestry");if(!ancestry)return;for(const trait of ancestry.system.traits.value){const index=traits.indexOf(trait);index>=0&&traits.splice(index,1)}}}};__name2(_Migration698RemoveDerivedActorTraits,"Migration698RemoveDerivedActorTraits"),__publicField(_Migration698RemoveDerivedActorTraits,"version",.698);let Migration698RemoveDerivedActorTraits=_Migration698RemoveDerivedActorTraits;const _Migration699ItemDescriptionEmptyString=class extends MigrationBase{static{__name(this,"_Migration699ItemDescriptionEmptyString")}async updateItem(itemSource){itemSource.system.description.value??=""}};__name2(_Migration699ItemDescriptionEmptyString,"Migration699ItemDescriptionEmptyString"),__publicField(_Migration699ItemDescriptionEmptyString,"version",.699);let Migration699ItemDescriptionEmptyString=_Migration699ItemDescriptionEmptyString;const _Migration700SingleClassFeatures=class extends MigrationBase{static{__name(this,"_Migration700SingleClassFeatures")}constructor(){super(...arguments),__privateAdd(this,_migrateClass),__privateAdd(this,_migrateFeature),__privateAdd(this,_isClassFeature2),__publicField(this,"itemIds",{alertness:["D8CSi8c9XiRpVc5M","OZaJz4exCoz6vuuv","qJ4fwGpoNC36ZQ8I","2o1Cj7hDayDlslqY","TAIOtk5VvPZvv4nu"],"armor-expertise":["x5jaCJxsmD5sx3KB","fRifyINZF5SKDfib"],"armor-mastery":["CGB1TczFhQhdQxml","IPDwS5pTgU3Cq6Nl"],evasion:["MV6XIuAgN9uSA0Da","EZuWfYSv3ASLyKtu","DqWr3LqUpT3Xi2xq"],"expert-spellcaster":["cD3nSupdCvONuHiE","mdzk070ixIDpid7V"],"great-fortitude":["F57Na5VxfBp56kke","25GSAotUcDwInYgG"],"improved-evasion":["L5D0NwFXdLiVSnk5","6XwGONPdr9SFDtDc"],"incredible-senses":["nLwPMPLRne1HnL00","iyb5FU2BpsCCan8Q","kktZhQPJgC5F4hgU"],"iron-will":["wMyDcVNmA7xGK83S","JVCxv4HuLaaFhAf4"],juggernaut:["OMZs5y16jZRW9KQK","sHCFQZM0xHCOYOId","Ba97T4anGhizfaCt","pzTRQxuoNOeWAalC","ojB0UJWpSekQPjT7"],"lightning-reflexes":["TUOeATt52P43r5W0","rz87RgR1crWTd7j5","Xqd0vrxq2bLXxdaB","tfugXJHITCnArN1b","7PzcKaDGy6tIkQh4","EJzjY6AIsTYqW0ee"],"magical-fortitude":["70jqXP2eS4tRZ0Ok","MzyPNlxrNA5OKVd7"],"master-spellcaster":["l1InYvhnQSz6Ucxc","zu9PcxvfoZlqQVk5"],"medium-armor-expertise":["FCEp9jjxxgRJDJV3","tzUaTqB6GHAeffOl"],"medium-armor-mastery":["cGMSYAErbUG5E8X2","NcEpvnIZfKzG1Iou"],resolve:["JQAujUXjczVnYDEI","D2g6sZQAWaTccviQ","vv63fioCtOvDIdF2","9WjZSliQZJlyGvUi"],"vigilant-senses":["0npO4rPscGm0dX13","NTp146fjLreL5zsj"],"weapon-expertise":["9XLUh9iMepZesdmc","F5BHEav90oOJ2LwN","O99eXctsEjEpuBwe"],"weapon-specialization":["9EqIasqfI8YIM3Pt","WiM7X4xmpMx4s6LD","1NGTc0gqEtwaFqUK"]}),__publicField(this,"features",["Alertness","Armor Expertise","Armor Mastery","Evasion","Expert Spellcaster","Great Fortitude","Improved Evasion","Incredible Senses","Iron Will","Juggernaut","Lightning Reflexes","Magical Fortitude","Master Spellcaster","Medium Armor Expertise","Medium Armor Mastery","Resolve","Vigilant Senses","Weapon Expertise","Weapon Specialization"].map(name2=>({slug:sluggify(name2),name:name2})))}async updateItem(source){source.type==="class"?__privateMethod(this,_migrateClass,migrateClass_fn).call(this,source):source.type==="feat"&&__privateMethod(this,_migrateFeature,migrateFeature_fn).call(this,source)}};_migrateClass=new WeakSet,migrateClass_fn=__name2(function(itemSource){for(const refId in itemSource.system.items){const itemRef=itemSource.system.items[refId];itemRef.level=Number(itemRef.level)||1;for(const feature of this.features)itemSource.system.slug==="swashbuckler"&&feature.slug==="weapon-expertise"||this.itemIds[feature.slug].includes(itemRef.id??"")&&(itemRef.id=this.itemIds[feature.slug][0],itemRef.name=feature.name)}},"#migrateClass"),_migrateFeature=new WeakSet,migrateFeature_fn=__name2(function(source){if(__privateMethod(this,_isClassFeature2,isClassFeature_fn2).call(this,source))for(const feature of this.features)source.system.slug==="swashbuckler"&&feature.slug==="weapon-expertise"||source.system.slug?.startsWith(`${feature.slug}-level-`)&&(source.system.slug=feature.slug,source.name.startsWith(`${feature.name} `)&&(source.name=feature.name),source.system.traits.value=[])},"#migrateFeature"),_isClassFeature2=new WeakSet,isClassFeature_fn2=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration700SingleClassFeatures,"Migration700SingleClassFeatures"),__publicField(_Migration700SingleClassFeatures,"version",.7);let Migration700SingleClassFeatures=_Migration700SingleClassFeatures;const _Migration701ModifierNameToSlug=class extends MigrationBase{static{__name(this,"_Migration701ModifierNameToSlug")}async updateItem(itemSource){const rules=itemSource.system.rules.filter(r=>["FlatModifier","DamageDice"].includes(String(r.key)));for(const rule of rules)rule.name&&(rule.label?rule.slug=sluggify(rule.name):rule.label=rule.name,delete rule.name),rule.label==="Rage"&&(rule.label="PF2E.TraitRage")}};__name2(_Migration701ModifierNameToSlug,"Migration701ModifierNameToSlug"),__publicField(_Migration701ModifierNameToSlug,"version",.701);let Migration701ModifierNameToSlug=_Migration701ModifierNameToSlug;const _Migration702REFormulasAtInstanceLevel=class extends MigrationBase{static{__name(this,"_Migration702REFormulasAtInstanceLevel")}raiseToInstanceLevel(value){return value.replace(/@[a-z.]+/gi,match=>["@mod","@castLevel","@heighten","@item.badge.value"].includes(match)||match.indexOf("@spell")>=0?match:match==="@details.level.value"||match==="@actor.details.level.value"?"@actor.level":match==="@item.value.value"?"@item.badge.value":match.startsWith("@abilities.")?match.replace(/\babilities\b/,"actor.abilities"):match.startsWith("@attributes.")?match.replace(/\battributes\b/,"actor.attributes"):match==="@item.level.value"?"@item.level":/^@item\.[a-z]+$/.test(match)?match:match.replace(/@item\.(?!data\b)/,"@item.system.").replace(/@(?!(?:item|actor|[A-Z]\w+))/,"@actor.system."))}async updateItem(itemSource){const rules=itemSource.system.rules;for(const rule of rules)try{if(typeof rule.value=="string")rule.value=this.raiseToInstanceLevel(rule.value);else if(isObject(rule.value)&&"brackets"in rule.value&&Array.isArray(rule.value.brackets))for(const bracket of rule.value.brackets)isObject(bracket)&&typeof bracket.value=="string"&&(bracket.value=this.raiseToInstanceLevel(bracket.value));rule.key==="Note"&&rule.text&&(rule.text=this.raiseToInstanceLevel(rule.text))}catch{continue}}};__name2(_Migration702REFormulasAtInstanceLevel,"Migration702REFormulasAtInstanceLevel"),__publicField(_Migration702REFormulasAtInstanceLevel,"version",.702);let Migration702REFormulasAtInstanceLevel=_Migration702REFormulasAtInstanceLevel;const _Migration703SpellDamageStructure=class extends MigrationBase{static{__name(this,"_Migration703SpellDamageStructure")}async updateItem(itemSource){itemSource.type==="spell"&&(itemSource.system.damage instanceof Object?itemSource.system.damage.value instanceof Object||(itemSource.system.damage.value={}):itemSource.system.damage={value:{}})}};__name2(_Migration703SpellDamageStructure,"Migration703SpellDamageStructure"),__publicField(_Migration703SpellDamageStructure,"version",.703);let Migration703SpellDamageStructure=_Migration703SpellDamageStructure;const _Migration704MartialProficiencyRE=class extends MigrationBase{static{__name(this,"_Migration704MartialProficiencyRE")}async updateItem(itemSource){const rules=itemSource.system.rules.filter(r=>r.key==="LinkedProficiency");for(const rule of rules)if(rule.key="MartialProficiency",rule.definition=rule.predicate,delete rule.predicate,typeof rule.slug=="string"&&itemSource.system.slug?.endsWith("-weapon-familiarity")&&!rule.label){const key=sluggify(rule.slug,{camel:"bactrian"});rule.label=`PF2E.SpecificRule.MartialProficiency.${key}`}if(itemSource.type==="class"&&itemSource.system.slug==="gunslinger"&&itemSource.system.rules.length===0){const gunslingerRules=[{definition:{all:["weapon:category:simple"],any:["weapon:group:firearm","weapon:tag:crossbow"]},key:"MartialProficiency",label:"PF2E.SpecificRule.MartialProficiency.SimpleFirearmsCrossbows",slug:"simple-firearms-crossbows",value:2},{definition:{all:["weapon:category:martial"],any:["weapon:group:firearm","weapon:tag:crossbow"]},key:"MartialProficiency",label:"PF2E.SpecificRule.MartialProficiency.MartialFirearmsCrossbows",slug:"martial-firearms-crossbows",value:2},{definition:{all:["weapon:category:advanced"],any:["weapon:group:firearm","weapon:tag:crossbow"]},key:"MartialProficiency",label:"PF2E.SpecificRule.MartialProficiency.AdvancedFirearmsCrossbows",slug:"advanced-firearms-crossbows",value:1}];itemSource.system.rules=gunslingerRules}}};__name2(_Migration704MartialProficiencyRE,"Migration704MartialProficiencyRE"),__publicField(_Migration704MartialProficiencyRE,"version",.704);let Migration704MartialProficiencyRE=_Migration704MartialProficiencyRE;const _Migration705GunslingerCatchUp=class extends MigrationBase{static{__name(this,"_Migration705GunslingerCatchUp")}constructor(){super(...arguments),__privateAdd(this,_isClassFeature3)}async updateItem(source){if(__privateMethod(this,_isClassFeature3,isClassFeature_fn3).call(this,source))switch(source.system.slug){case"singular-expertise":{const rules=[{key:"FlatModifier",selector:"firearm-weapon-group-damage",type:"circumstance",value:1},{key:"FlatModifier",predicate:{all:["weapon:tag:crossbow"]},selector:"bow-weapon-group-damage",type:"circumstance",value:1}];source.system.rules=rules;break}case"gunslinger-weapon-mastery":{const rules=[{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.unarmed.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.advanced-firearms-crossbows.rank",value:2},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple-firearms-crossbows.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial-firearms-crossbows.rank",value:3}];source.system.rules=rules;break}case"gunslinging-legend":{const rules=[{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.unarmed.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.advanced-firearms-crossbows.rank",value:3},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.simple-firearms-crossbows.rank",value:4},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.martial-firearms-crossbows.rank",value:4}];source.system.rules=rules;break}}}};_isClassFeature3=new WeakSet,isClassFeature_fn3=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration705GunslingerCatchUp,"Migration705GunslingerCatchUp"),__publicField(_Migration705GunslingerCatchUp,"version",.705);let Migration705GunslingerCatchUp=_Migration705GunslingerCatchUp;const _Migration706FormulasAtInstanceLevelEverythingElse=class extends Migration702REFormulasAtInstanceLevel{static{__name(this,"_Migration706FormulasAtInstanceLevelEverythingElse")}async updateItem(itemSource){if(itemSource.system.description.value&&(itemSource.system.description.value=this.replaceInlineRolls(itemSource.system.description.value)),itemSource.type==="spell")for(const value of Object.values(itemSource.system.damage.value))value.value=this.raiseToInstanceLevel(value.value);if(itemSource.type==="melee")for(const value of Object.values(itemSource.system.damageRolls))value.damage=this.raiseToInstanceLevel(value.damage)}replaceInlineRolls(value){return value.replace(/\[\[(.*)\]\]/g,match=>this.raiseToInstanceLevel(match))}};__name2(_Migration706FormulasAtInstanceLevelEverythingElse,"Migration706FormulasAtInstanceLevelEverythingElse"),__publicField(_Migration706FormulasAtInstanceLevelEverythingElse,"version",.706);let Migration706FormulasAtInstanceLevelEverythingElse=_Migration706FormulasAtInstanceLevelEverythingElse;const _Migration707BracketedFormulasAtInstanceLevel=class extends Migration702REFormulasAtInstanceLevel{static{__name(this,"_Migration707BracketedFormulasAtInstanceLevel")}};__name2(_Migration707BracketedFormulasAtInstanceLevel,"Migration707BracketedFormulasAtInstanceLevel"),__publicField(_Migration707BracketedFormulasAtInstanceLevel,"version",.707);let Migration707BracketedFormulasAtInstanceLevel=_Migration707BracketedFormulasAtInstanceLevel;const _Migration708SpecificRuleLabel=class extends MigrationBase{static{__name(this,"_Migration708SpecificRuleLabel")}async updateItem(itemSource){for(const rule of itemSource.system.rules)rule.label&&(rule.label=String(rule.label).replace(/\bSpecificRules\b/,"SpecificRule"))}};__name2(_Migration708SpecificRuleLabel,"Migration708SpecificRuleLabel"),__publicField(_Migration708SpecificRuleLabel,"version",.708);let Migration708SpecificRuleLabel=_Migration708SpecificRuleLabel;const _Migration709REFormulasAtInstanceLevelRedux=class extends Migration702REFormulasAtInstanceLevel{static{__name(this,"_Migration709REFormulasAtInstanceLevelRedux")}walkObject(obj){if(Array.isArray(obj))for(let i=0;ir.key==="BattleForm");for(const rule of rules)this.walkObject(rule);itemSource.type==="spell"&&itemSource.system.slug==="wild-shape"&&(itemSource.system.rules=[])}};__name2(_Migration709REFormulasAtInstanceLevelRedux,"Migration709REFormulasAtInstanceLevelRedux"),__publicField(_Migration709REFormulasAtInstanceLevelRedux,"version",.709);let Migration709REFormulasAtInstanceLevelRedux=_Migration709REFormulasAtInstanceLevelRedux;const _Migration710RarityToString=class extends MigrationBase{static{__name(this,"_Migration710RarityToString")}updateTraits(traits){typeof traits?.rarity=="object"&&traits.rarity!==null&&(traits.rarity=traits.rarity.value)}async updateActor(actorSource){"traits"in actorSource.system&&this.updateTraits(actorSource.system.traits??null)}async updateItem(itemSource){"traits"in itemSource.system&&this.updateTraits(itemSource.system.traits??null)}};__name2(_Migration710RarityToString,"Migration710RarityToString"),__publicField(_Migration710RarityToString,"version",.71);let Migration710RarityToString=_Migration710RarityToString;const toDelete=["featType","actionCategory","actions","actionType","level","location"],_Migration711HeritageItems=class extends MigrationBase{static{__name(this,"_Migration711HeritageItems")}constructor(){super(...arguments),__privateAdd(this,_isHeritageFeature),__privateAdd(this,_heritageFromFeat),__privateAdd(this,_officialAncestries,{tengu:{name:"Tengu",uuid:"Compendium.pf2e.ancestries.Item.18xDKYPDBLEv2myX"},kitsune:{name:"Kitsune",uuid:"Compendium.pf2e.ancestries.Item.4BL5wf1VF9feC2rY"},poppet:{name:"Poppet",uuid:"Compendium.pf2e.ancestries.Item.6F2fSFC1Eo1JdpY4"},kobold:{name:"Kobold",uuid:"Compendium.pf2e.ancestries.Item.7oQxL6wgsokD3QXG"},catfolk:{name:"Catfolk",uuid:"Compendium.pf2e.ancestries.Item.972EkpJOPv9KkQIW"},dwarf:{name:"Dwarf",uuid:"Compendium.pf2e.ancestries.Item.BYj5ZvlXZdpaEgA6"},gnome:{name:"Gnome",uuid:"Compendium.pf2e.ancestries.Item.CYlfsYLJcBOgqKtD"},fleshwarp:{name:"Fleshwarp",uuid:"Compendium.pf2e.ancestries.Item.FXlXmNBFiiz9oasi"},strix:{name:"Strix",uuid:"Compendium.pf2e.ancestries.Item.GXcC6oVa5quzgNHD"},android:{name:"Android",uuid:"Compendium.pf2e.ancestries.Item.GfLwE884NoRC7cRi"},halfling:{name:"Halfling",uuid:"Compendium.pf2e.ancestries.Item.GgZAHbrjnzWOZy2v"},lizardfolk:{name:"Lizardfolk",uuid:"Compendium.pf2e.ancestries.Item.HWEgF7Gmoq55VhTL"},human:{name:"Human",uuid:"Compendium.pf2e.ancestries.Item.IiG7DgeLWYrSNXuX"},ratfolk:{name:"Ratfolk",uuid:"Compendium.pf2e.ancestries.Item.P6PcVnCkh4XMdefw"},elf:{name:"Elf",uuid:"Compendium.pf2e.ancestries.Item.PgKmsA2aKdbLU6O0"},anadi:{name:"Anadi",uuid:"Compendium.pf2e.ancestries.Item.TQEqWqc7BYiadUdY"},sprite:{name:"Sprite",uuid:"Compendium.pf2e.ancestries.Item.TRqoeYfGAFjQbviF"},goloma:{name:"Goloma",uuid:"Compendium.pf2e.ancestries.Item.c4secsSNG2AO7I5i"},leshy:{name:"Leshy",uuid:"Compendium.pf2e.ancestries.Item.cdhgByGG1WtuaK73"},fetchling:{name:"Fetchling",uuid:"Compendium.pf2e.ancestries.Item.hIA3qiUsxvLZXrFP"},grippli:{name:"Grippli",uuid:"Compendium.pf2e.ancestries.Item.hXM5jXezIki1cMI2"},automaton:{name:"Automaton",uuid:"Compendium.pf2e.ancestries.Item.kYsBAJ103T44agJF"},orc:{name:"Orc",uuid:"Compendium.pf2e.ancestries.Item.lSGWXjcbOa6O5fTx"},hobgoblin:{name:"Hobgoblin",uuid:"Compendium.pf2e.ancestries.Item.piNLXUrm9iaGqD2i"},shoony:{name:"Shoony",uuid:"Compendium.pf2e.ancestries.Item.q6rsqYARyOGXZA8F"},goblin:{name:"Goblin",uuid:"Compendium.pf2e.ancestries.Item.sQfjTMDaZbT9DThq"},conrasu:{name:"Conrasu",uuid:"Compendium.pf2e.ancestries.Item.tZn4qIHCUA6wCdnI"},gnoll:{name:"Gnoll",uuid:"Compendium.pf2e.ancestries.Item.vxbQ1Yw4qwgjTzqo"},shisk:{name:"Shisk",uuid:"Compendium.pf2e.ancestries.Item.x1YinOddgUxwOLqP"},azarketi:{name:"Azarketi",uuid:"Compendium.pf2e.ancestries.Item.yFoojz6q3ZjvceFw"}}),__privateAdd(this,_heritagesWithoutAncestryInName,{"half-elf":"human","half-orc":"human","skilled-heritage":"human","versatile-heritage":"human",draxie:"sprite",grig:"sprite",melixie:"sprite",nyktera:"sprite",pixie:"sprite","deep-rat":"ratfolk","desert-rat":"ratfolk","longsnout-rat":"ratfolk","sewer-rat":"ratfolk","shadow-rat":"ratfolk","snow-rat":"ratfolk","tunnel-rat":"ratfolk","rite-of-invocation":"conrasu","rite-of-knowing":"conrasu","rite-of-light":"conrasu","rite-of-passage":"conrasu","rite-of-reinforcement":"conrasu"}),__privateAdd(this,_ancestrySlugs,Object.keys(__privateGet(this,_officialAncestries)))}async updateActor(actorSource){const heritageFeatures=actorSource.items.filter(i=>__privateMethod(this,_isHeritageFeature,isHeritageFeature_fn).call(this,i)),firstHeritageFeature=heritageFeatures[0];if(!actorSource.items.some(i=>i.type==="heritage")&&firstHeritageFeature&&actorSource.type==="character"){const heritageSource=__privateMethod(this,_heritageFromFeat,heritageFromFeat_fn).call(this,firstHeritageFeature);actorSource.items.push(heritageSource);const details=actorSource.system.details;details.heritage&&(details["-=heritage"]=null,"game"in globalThis||delete details.heritage)}for(const feature of heritageFeatures)actorSource.items.splice(actorSource.items.indexOf(feature),1)}async updateItem(itemSource,actorSource){if(actorSource||!__privateMethod(this,_isHeritageFeature,isHeritageFeature_fn).call(this,itemSource))return;const newSource=itemSource;newSource.type="heritage",itemSource.img==="systems/pf2e/icons/default-icons/feat.svg"&&(itemSource.img="systems/pf2e/icons/default-icons/heritage.svg");const newSystemData=__privateMethod(this,_heritageFromFeat,heritageFromFeat_fn).call(this,itemSource).system,deletionProperties=toDelete.map(k=>`-=${k}`);for(const property of deletionProperties)newSystemData[property]=null;if(!("game"in globalThis))for(const property of toDelete)delete newSystemData[property];newSource.system=newSystemData}};_isHeritageFeature=new WeakSet,isHeritageFeature_fn=__name2(function(feature){return feature.type==="feat"&&feature.system.featType?.value==="heritage"},"#isHeritageFeature"),_officialAncestries=new WeakMap,_heritagesWithoutAncestryInName=new WeakMap,_ancestrySlugs=new WeakMap,_heritageFromFeat=new WeakSet,heritageFromFeat_fn=__name2(function(feature){const featureSlug=feature.system.slug??"",ancestrySlug=__privateGet(this,_heritagesWithoutAncestryInName)[featureSlug]??__privateGet(this,_ancestrySlugs).find(s=>featureSlug.includes(s)),ancestryReference=__privateGet(this,_officialAncestries)[ancestrySlug??""]??null,traits=feature.system.traits,{flags}=feature;return flags.core?.sourceId&&(flags.core.sourceId=flags.core.sourceId.replace("ancestryfeatures","heritages")),{_id:randomID(),type:"heritage",img:feature.img.endsWith("/feat.svg")?"systems/pf2e/icons/default-icons/heritage.svg":feature.img,name:feature.name,effects:[],folder:feature.folder,flags:feature.flags,sort:feature.sort,ownership:feature.ownership,system:{description:feature.system.description,rules:feature.system.rules,schema:feature.system.schema,_migration:{version:null,previous:null},slug:feature.system.slug,ancestry:ancestryReference,traits:{value:traits.value.filter(t=>(t in creatureTraits||t.startsWith("hb_"))&&!(t in __privateGet(this,_officialAncestries))),rarity:traits.rarity,otherTags:[]}}}},"#heritageFromFeat"),__name2(_Migration711HeritageItems,"Migration711HeritageItems"),__publicField(_Migration711HeritageItems,"version",.711);let Migration711HeritageItems=_Migration711HeritageItems;const _Migration712ActorShieldStructure=class extends MigrationBase{static{__name(this,"_Migration712ActorShieldStructure")}async updateActor(source){if(source.type==="character"||source.type==="npc"){const attributes=source.system.attributes;attributes.shield&&(attributes["-=shield"]=null,"game"in globalThis?attributes.shield={}:delete attributes.shield)}}};__name2(_Migration712ActorShieldStructure,"Migration712ActorShieldStructure"),__publicField(_Migration712ActorShieldStructure,"version",.712);let Migration712ActorShieldStructure=_Migration712ActorShieldStructure;const _Migration713FistToStrikeRE=class extends MigrationBase{static{__name(this,"_Migration713FistToStrikeRE")}async updateItem(itemSource){const fistFeatures=["powerful-fist","martial-artist-dedication"];if(!(itemSource.type==="feat"&&fistFeatures.includes(itemSource.system.slug))||itemSource.system.rules.some(rule=>rule.key==="Strike"))return;const strike={key:"Strike",img:"systems/pf2e/icons/features/classes/powerful-fist.webp",slug:"fist",category:"unarmed",damage:{base:{damageType:"bludgeoning",dice:1,die:"d6"}},group:"brawling",label:"PF2E.Strike.Fist.Label",range:null,traits:["agile","finesse","nonlethal","unarmed"]};itemSource.system.rules=[strike]}};__name2(_Migration713FistToStrikeRE,"Migration713FistToStrikeRE"),__publicField(_Migration713FistToStrikeRE,"version",.713);let Migration713FistToStrikeRE=_Migration713FistToStrikeRE;const _Migration714RangeIncrementREs=class extends MigrationBase{static{__name(this,"_Migration714RangeIncrementREs")}farLobber={definition:{all:["weapon:base:alchemical-bomb"]},key:"AdjustStrike",mode:"upgrade",property:"range-increment",value:30};farShot={definition:{all:["weapon:ranged"]},key:"AdjustStrike",mode:"multiply",property:"range-increment",value:2};farThrow={key:"AdjustModifier",mode:"add",predicate:{all:["weapon:trait:thrown"]},selectors:["ranged-attack-roll"],slug:"range-penalty",value:1};huntPrey={key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:2",predicate:{all:["hunted-prey"]}};legendaryShot={key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:5"};masterfulHunter=(()=>({key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:3",predicate:{all:["hunted-prey",{gte:["weapon:proficiency:rank",3]}]}}))();shootistsEdge=(()=>[{key:"ActiveEffectLike",mode:"upgrade",path:"system.attributes.classDC.rank",value:3},{key:"RollOption",domain:"ranged-attack-roll",option:"ignore-range-penalty:3",phase:"beforeRoll",predicate:{all:[{gte:["weapon:proficiency:rank",3]}]}}])();triangulate=[{default:!0,key:"ToggleProperty",label:"PF2E.SpecificRule.ToggleProperty.Triangulate",property:"flags.pf2e.rollOptions.all.triangulate"},{domain:"ranged-attack-roll",key:"RollOption",option:"ignore-range-penalty:2",predicate:{all:["triangulate"]}},{key:"AdjustModifier",mode:"add",predicate:{all:["triangulate"]},selectors:["ranged-attack-roll"],slug:"range-penalty",value:1}];uncannyBombs={definition:{all:["weapon:base:alchemical-bomb"]},key:"AdjustStrike",mode:"upgrade",property:"range-increment",value:60};unerringShot=(()=>({key:"RollOption",option:"ignore-range-penalty",phase:"beforeRoll",predicate:{all:[{gte:["weapon:proficiency:rank",3]}]}}))();async updateItem(source){const{rules}=source.system;if(source.type==="feat")switch(source.system.slug){case"far-lobber":{source.system.rules=[this.farLobber];return}case"far-shot":{source.system.rules=[this.farShot];return}case"far-throw":{source.system.rules=[this.farThrow];return}case"hunt-prey":{!rules.some(r=>r.key==="RollOption"&&r.option===this.huntPrey.option)&&rules.push(this.huntPrey);return}case"legendary-shot":{source.system.rules=[this.legendaryShot];return}case"masterful-hunter":{!rules.some(r=>r.key==="RollOption"&&r.option===this.masterfulHunter.option)&&rules.push(this.masterfulHunter);return}case"shootists-edge":{source.system.rules=this.shootistsEdge;return}case"triangulate":{source.system.rules=this.triangulate;return}case"uncanny-bombs":{source.system.rules=[this.uncannyBombs];return}case"unerring-shot":{source.system.rules=[this.unerringShot];return}}}};__name2(_Migration714RangeIncrementREs,"Migration714RangeIncrementREs"),__publicField(_Migration714RangeIncrementREs,"version",.714);let Migration714RangeIncrementREs=_Migration714RangeIncrementREs;const _Migration715DangerousSorcery=class extends MigrationBase{static{__name(this,"_Migration715DangerousSorcery")}dangerousSorcery={key:"FlatModifier",phase:"afterDerived",predicate:{all:["item:spell-slot","item:duration:0","damaging-effect"]},selector:"spell-damage",value:"@spell.level"};async updateItem(source){if(source.type!=="feat")return;(source.system.slug??sluggify(source.name))==="dangerous-sorcery"&&!source.system.rules.length&&(source.system.rules=[this.dangerousSorcery])}};__name2(_Migration715DangerousSorcery,"Migration715DangerousSorcery"),__publicField(_Migration715DangerousSorcery,"version",.715);let Migration715DangerousSorcery=_Migration715DangerousSorcery;const _Migration716StrikeDamageSelector=class extends MigrationBase{static{__name(this,"_Migration716StrikeDamageSelector")}itemsToSkip=new Set(["effect-fanatical-frenzy","effect-heroic-recovery","effect-lantern-of-hope","effect-lantern-of-hope-gestalt","spell-effect-inspire-courage","spell-effect-inspire-heroics-courage-2","spell-effect-inspire-heroics-courage-3","spell-effect-stoke-the-heart"]);async updateItem(source){if(this.itemsToSkip.has(source.system.slug??""))return;const{rules}=source.system;for(const rule of rules)isObject(rule)&&["damage","mundane-damage"].includes(String(rule.selector??""))&&(rule.selector="strike-damage")}};__name2(_Migration716StrikeDamageSelector,"Migration716StrikeDamageSelector"),__publicField(_Migration716StrikeDamageSelector,"version",.716);let Migration716StrikeDamageSelector=_Migration716StrikeDamageSelector;const _Migration717TakeFeatLimits=class extends MigrationBase{static{__name(this,"_Migration717TakeFeatLimits")}levelOneOnly=new Set(["celestial-eyes","chance-death","deliberate-death","elemental-eyes","eyes-of-the-night","fiendish-eyes","gravesight","willing-death"]);maxTakeable={"additional-lore":1/0,"advanced-domain":1/0,"advanced-general-training":1/0,"animal-senses":1/0,"animal-senses-darkvision":1/0,"animal-senses-low-light-vision":1/0,"animal-senses-scent-imprecise":1/0,"armor-proficiency":3,assurance:1/0,"automatic-knowledge":1/0,"blessing-of-the-sun-gods":1/0,"consult-the-spirits":1/0,"domain-initiate":1/0,"general-training":1/0,"greater-animal-senses":1/0,"greater-sun-blessing":1/0,"hellknight-order-cross-training":1/0,"living-weapon":1/0,"magic-arrow":1/0,"modular-dynamo":1/0,multilingual:1/0,"settlement-scholastics":1/0,"skill-training":1/0,"terrain-stalker":1/0};async updateItem(source){if(source.type!=="feat")return;const slug=source.system.slug??"";source.system.traits.value.includes("lineage")||this.levelOneOnly.has(slug)?source.system.onlyLevel1=!0:"game"in globalThis&&(source.system.onlyLevel1=!1),!source.system.onlyLevel1&&slug in this.maxTakeable?source.system.maxTakable=this.maxTakeable[slug]:"game"in globalThis&&(source.system.maxTakable=1)}};__name2(_Migration717TakeFeatLimits,"Migration717TakeFeatLimits"),__publicField(_Migration717TakeFeatLimits,"version",.717);let Migration717TakeFeatLimits=_Migration717TakeFeatLimits;function isEquipped(usage,equipped){return equipped.carryType==="dropped"?!1:usage.type==="carried"?!0:usage.type!==equipped.carryType||usage.type==="worn"&&usage.where&&!equipped.inSlot?!1:usage.type==="held"?(equipped.handsHeld??0)>=(usage.hands??1):!0}__name(isEquipped,"isEquipped"),__name2(isEquipped,"isEquipped");function getUsageDetails(usage){switch(usage){case"carried":case"":return{value:"carried",type:"carried"};case"held-in-one-hand":case"held-in-one-plus-hands":return{value:usage,type:"held",hands:1};case"held-in-two-hands":return{value:usage,type:"held",hands:2};case"worn":return{value:usage,type:"worn"};case"wornarmor":case"wornamulet":case"wornanklets":case"wornarmbands":case"wornbackpack":case"wornbarding":case"wornbelt":case"wornbeltpouch":case"wornbracers":case"wornbracelet":case"worncloak":case"worncirclet":case"wornclothing":case"worncollar":case"worncrown":case"wornepaulet":case"worneyepiece":case"wornfootwear":case"worngarment":case"worngloves":case"wornheadwear":case"wornmask":case"wornnecklace":case"wornonbelt":case"wornring":case"wornshoes":case"wornhorseshoes":case"wornsaddle":case"wornwrist":return{value:usage,type:"worn",where:usage.substring(4)}}return{value:usage,type:"worn"}}__name(getUsageDetails,"getUsageDetails"),__name2(getUsageDetails,"getUsageDetails");const _Migration718CarryType=class extends MigrationBase{static{__name(this,"_Migration718CarryType")}async updateItem(itemData,actor){if(!isPhysicalData(itemData))return;const systemData=itemData.system;if(systemData.usage instanceof Object||(systemData.usage={value:"held-in-one-hand"}),systemData.usage.value==="worn-gloves")systemData.usage.value="worngloves";else if(itemData.type==="armor"){const{category}=itemData.system;systemData.usage.value=category==="shield"?"held-in-one-hand":"wornarmor"}else itemData.type==="equipment"&&systemData.slug?.startsWith("clothing-")&&(systemData.usage.value="worn");if("game"in globalThis||actor)systemData.equipped??={carryType:"worn"},systemData.equipped.carryType??="worn";else{delete systemData.equipped;return}const equipped=systemData.equipped;if(!("value"in equipped))return;if(!(actor&&["character","npc"].includes(actor.type??""))){equipped["-=value"]=null,delete equipped.value;return}const containerId=itemData.system.containerId??{value:null};if(containerId instanceof Object&&containerId.value){const inStowingContainer=actor.items.some(i=>i.type==="backpack"&&i.system.stowing&&i._id===containerId.value);if(!inStowingContainer)containerId.value=null;else if(inStowingContainer){equipped.carryType="stowed";return}}equipped.carryType="worn";const usage=getUsageDetails(systemData.usage.value);usage.type==="worn"?equipped.inSlot=!!equipped.value:usage.type==="held"&&(equipped.value&&(equipped.carryType="held"),equipped.handsHeld=equipped.value?usage.hands??1:0),equipped["-=value"]=null,delete equipped.value}};__name2(_Migration718CarryType,"Migration718CarryType"),__publicField(_Migration718CarryType,"version",.718);let Migration718CarryType=_Migration718CarryType;const _Migration719ShrugFlanking=class extends MigrationBase{static{__name(this,"_Migration719ShrugFlanking")}async updateItem(source,actorSource){const slug=source.system.slug??"";switch(source.type){case"action":{if(slug==="all-around-vision")source.system.rules=[this.allAroundVision];else if(actorSource?.type==="npc"&&source.name==="Deny Advantage"){const npcId=actorSource.flags.core?.sourceId?.replace(/^Compendium\.[^.]+\./,"")??actorSource._id;if(this.needsDenyAdvantage(source.system.rules)){const rule=this.npcDenyAvantage(npcId);source.system.rules.push(rule)}}return}case"effect":{slug==="stance-wolf-stance"&&(source.system.rules=this.wolfStanceRules);return}case"feat":{source.system.slug=source.system.slug?.replace(/^deny-advantage-level-\d$/,"deny-advantage")??null;const featSlug=source.system.slug??"";if(["constant-gaze","deny-advantage"].includes(featSlug)&&this.needsDenyAdvantage(source.system.rules))source.system.rules.push(this.denyAdvantage);else if(featSlug==="gang-up")source.system.rules=[this.gangUp];else if(featSlug.startsWith("side-by-side")){const sideBySide=this.gangUp;sideBySide.value="animal-companion",source.system.rules=[sideBySide]}else if(["pack-tactics","squad-tactics"].includes(featSlug)){const tactics=this.gangUp;tactics.value=2,source.system.rules=[tactics]}}}}get allAroundVision(){return{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.flankable",value:!1}}get denyAdvantage(){return{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.flatFootable",value:"@actor.level"}}get gangUp(){return{key:"ActiveEffectLike",mode:"add",path:"system.attributes.flanking.canGangUp",value:1}}npcVariants=new Map([["YsBSkW3aFwU1bl3w",13],["0Kb4z4h8KVqfrIju",8],["B09JfuBZHjcRXztU",4],["aaDiR0EIWRQx8wdy",3],["x4m5ks6Rd8fYzXPm",4],["qKHkamxIPbqxEiwp",6],["lCvJquCqvZJVnafy",8],["vkLhqX5oR1t89puZ",7],["aIT5S2fKgMZ6pVP2",11],["l6EuZR6zCdqyCywW",6],["QKkvnlqrhgLHuP1t",10],["ZY3q7AV1qbwWwNl2",8],["6pPolNZycfDiOl2I",8],["cQMM2Ld0IBM9GcDo",11],["VkG5yl9xcmziwpQD",4],["JrowrtDilEG8dN2s",11],["1lkay2gwgEquq0NF",6],["EMl8hARVJk8SNVyW",4],["j31HXlZiUqQrAHSB",12],["pjnTEh0NVd1DB6jI",4]]);get wolfStanceRules(){return[{category:"unarmed",damage:{base:{damageType:"piercing",dice:1,die:"d8"}},group:"brawling",key:"Strike",label:"PF2E.SpecificRule.Stance.Attack.WolfJaws",range:null,slug:"wolf-jaws",traits:["agile","backstabber","finesse","unarmed","nonlethal"]},{definition:{all:["weapon:wolf-jaws"]},key:"AdjustStrike",mode:"add",predicate:{all:["self:flanking"]},property:"traits",value:"trip"}]}npcDenyAvantage(npcId=""){const{denyAdvantage}=this;return denyAdvantage.value=this.npcVariants.get(npcId)??"@actor.level",denyAdvantage}needsDenyAdvantage(rules){return!rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="system.attributes.flanking.flatFootable")}};__name2(_Migration719ShrugFlanking,"Migration719ShrugFlanking"),__publicField(_Migration719ShrugFlanking,"version",.719);let Migration719ShrugFlanking=_Migration719ShrugFlanking;const _Migration720UpdateSpellDescriptions=class extends MigrationBase{static{__name(this,"_Migration720UpdateSpellDescriptions")}spellUUIDs=new Set(["Compendium.pf2e.spells-srd.GoKkejPj5yWJPIPK","Compendium.pf2e.spells-srd.1b55SgYTV65JvmQd","Compendium.pf2e.spells-srd.b515AZlB0sridKSq","Compendium.pf2e.spells-srd.NBSBFHxBm88qxQUy","Compendium.pf2e.spells-srd.9TauMFkIsmvKJNzZ","Compendium.pf2e.spells-srd.LoBjvguamA12iyW0","Compendium.pf2e.spells-srd.IWUe32Y5k2QFd7YQ","Compendium.pf2e.spells-srd.WBmvzNDfpwka3qT4"]);spells=UUIDUtils.fromUUIDs([...this.spellUUIDs]);async updateItem(source){if(!(source.type==="spell"&&setHasElement(this.spellUUIDs,source.flags.core?.sourceId)))return;const spell=(await this.spells).find(s=>s instanceof SpellPF2e&&s.slug===source.system.slug);spell&&(source.system.description.value=spell.description)}};__name2(_Migration720UpdateSpellDescriptions,"Migration720UpdateSpellDescriptions"),__publicField(_Migration720UpdateSpellDescriptions,"version",.72);let Migration720UpdateSpellDescriptions=_Migration720UpdateSpellDescriptions;const _Migration721SetReloadValues=class extends MigrationBase{static{__name(this,"_Migration721SetReloadValues")}toUpdate=new Set(["air-repeater","composite-longbow","composite-shortbow","godsbreath-bow","hunters-bow","long-air-repeater","longbow","oathbow","repeating-crossbow","repeating-hand-crossbow","shortbow","singing-shortbow-greater","singing-shortbow","sky-piercing-bow"]);async updateItem(source){source.type==="weapon"&&setHasElement(this.toUpdate,source.system.slug)&&(source.system.reload.value="0")}};__name2(_Migration721SetReloadValues,"Migration721SetReloadValues"),__publicField(_Migration721SetReloadValues,"version",.721);let Migration721SetReloadValues=_Migration721SetReloadValues;const _Migration722CraftingSystemData=class extends MigrationBase{static{__name(this,"_Migration722CraftingSystemData")}async updateActor(source){if(source.type!=="character")return;if(!isObject(source.system.crafting)){const filledCrafting={entries:{},formulas:[]};source.system.crafting=filledCrafting}const crafting=source.system.crafting??{};(!isObject(crafting.entries)||Array.isArray(crafting.entries))&&(crafting.entries={}),Array.isArray(crafting.formulas)||(crafting.formulas=[])}};__name2(_Migration722CraftingSystemData,"Migration722CraftingSystemData"),__publicField(_Migration722CraftingSystemData,"version",.722);let Migration722CraftingSystemData=_Migration722CraftingSystemData;const _Migration723CumulativeItemBonuses=class extends MigrationBase{static{__name(this,"_Migration723CumulativeItemBonuses")}stanceFeats=(async()=>(await UUIDUtils.fromUUIDs(["Compendium.pf2e.feats-srd.ZPclfDmiHzEqblry","Compendium.pf2e.feats-srd.ZL5UU9quCTvcWzfY","Compendium.pf2e.feats-srd.n2hawNmzW7DBn1Lm","Compendium.pf2e.feats-srd.hO4sKslTrSQMLbGx"])).filter(d=>d instanceof FeatPF2e&&!!d.slug).reduce((record,f)=>({...record,[f.slug]:f}),{}))();mountainPattern=/^mountain-(?:stance|stronghold|quake)$/;async updateActor(source){if(source.type!=="character")return;const effects=source.items.filter(i=>i.type==="effect");for(const effect of effects)effect.system.slug?.startsWith("stance-mountain")&&source.items.findSplice(i=>i===effect)}async updateItem(source){if(source.system.slug)switch(source.type){case"feat":{if(source.system.slug==="animal-skin"){const feat=(await this.stanceFeats)[source.system.slug];feat&&(source.system.rules=feat.toObject().system.rules)}else if(this.mountainPattern.test(source.system.slug)){const feat=(await this.stanceFeats)[source.system.slug];feat&&(source.system.description.value=feat.description)}return}case"equipment":{if(!source.system.slug.startsWith("bracers-of-armor-"))return;for(const rule of source.system.rules)rule.key==="FlatModifier"&&(rule.slug="bracers-of-armor");return}case"effect":{if(source.system.slug!=="spell-effect-mage-armor")return;for(const rule of source.system.rules)rule.key==="FlatModifier"&&(rule.slug="mage-armor")}}}async updateMacro(source){source.type==="script"&&source.command.includes("Stance: Mountain Stance")&&(source.command=String.raw`const actors = canvas.tokens.controlled.flatMap((token) => token.actor ?? []); if (actors.length === 0 && game.user.character) actors.push(game.user.character); if (actors.length === 0) { const message = game.i18n.localize("PF2E.ErrorMessage.NoTokenSelected"); @@ -274,12 +274,12 @@ for (const actor of actors) { } else { await actor.createEmbeddedDocuments("Item", [source]); } -}`)}};__name2(_Migration723CumulativeItemBonuses,"Migration723CumulativeItemBonuses"),__publicField(_Migration723CumulativeItemBonuses,"version",.723);let Migration723CumulativeItemBonuses=_Migration723CumulativeItemBonuses;const _Migration724CraftingMaxItemLevel=class extends MigrationBase{static{__name(this,"_Migration724CraftingMaxItemLevel")}pathPattern=/^data\.crafting\.entries\.([-a-z]+)\.maxItemLevel$/i;async updateItem(source){if(source.type!=="feat")return;if(source.system.slug==="advanced-alchemy"){const rules=source.system.rules;for(const rule of rules)rule.predicate={all:["self:class:alchemist"]},rule.key==="CraftingEntry"&&(delete rule.name,rule.label="PF2E.TraitAlchemist")}else if(source.system.slug?.endsWith("-dedication")&&source.system.slug!=="alchemist-dedication"){const rules=source.system.rules.filter(r=>r.key==="CraftingEntry");for(const rule of rules){delete rule.name;const i18nKey=sluggify(source.system.slug.replace(/-dedication$/,""),{camel:"bactrian"});rule.label=`PF2E.SpecificRule.DedicationCraftingEntry.${i18nKey}`}}const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike");for(const rule of aeLikes){if(typeof rule.path!="string")continue;const selector=this.pathPattern.exec(rule.path)?.[1]??null;if(selector){const predicate=rule.predicate=mergeObject({all:[]},isObject(rule.predicate)?rule.predicate:{}),slug=sluggify(selector);predicate.all=Array.from(new Set([...predicate.all,`crafting:entry:${slug}`]))}}}};__name2(_Migration724CraftingMaxItemLevel,"Migration724CraftingMaxItemLevel"),__publicField(_Migration724CraftingMaxItemLevel,"version",.724);let Migration724CraftingMaxItemLevel=_Migration724CraftingMaxItemLevel;const _Migration725QuickClimbREs=class extends MigrationBase{static{__name(this,"_Migration725QuickClimbREs")}quickClimb=[{key:"BaseSpeed",predicate:{all:["self:skill:ath:rank:4"]},selector:"climb",value:"@actor.attributes.speed.value"},{key:"Note",predicate:{all:["action:climb"]},selector:"athletics",text:'

{item|name} You move 5 more feet on a success, and 10 more feet on a critical success.

'}];async updateItem(source){source.type==="feat"&&source.system.slug==="quick-climb"&&(source.system.rules=deepClone(this.quickClimb))}};__name2(_Migration725QuickClimbREs,"Migration725QuickClimbREs"),__publicField(_Migration725QuickClimbREs,"version",.725);let Migration725QuickClimbREs=_Migration725QuickClimbREs;const _Migration726JournalSetting=class extends MigrationBase{static{__name(this,"_Migration726JournalSetting")}async migrate(){const sheetClasses=game.settings.get("core","sheetClasses");if(isObject(sheetClasses)&&sheetClasses.JournalEntry?.base)return;const theme=game.settings.storage.get("world").getItem("pf2e.journalEntryTheme");if(!theme)return;const base=theme==="pf2eTheme"?"pf2e.JournalSheetStyledPF2e":"pf2e.JournalSheetPF2e";DocumentSheetConfig.updateDefaultSheets({JournalEntry:{base}})}};__name2(_Migration726JournalSetting,"Migration726JournalSetting"),__publicField(_Migration726JournalSetting,"version",.726);let Migration726JournalSetting=_Migration726JournalSetting;const _Migration727TrimSelfRollOptions=class extends MigrationBase{static{__name(this,"_Migration727TrimSelfRollOptions")}optionPattern=/^self:(ability|class|feat(?:ure)?|perception|skill):/;optionReplacement="$1:";trimRollOption(option){return option.replace(this.optionPattern,this.optionReplacement)}trimPredicates(obj){for(const[key,value]of Object.entries(obj))typeof value=="string"?obj[key]=this.trimRollOption(value):Array.isArray(value)?obj[key]=value.map(e=>typeof e=="string"?this.trimRollOption(e):isObject(e)?this.trimPredicates(e):e):isObject(value)&&(obj[key]=this.trimPredicates(value));return obj}async updateItem(source){source.system.rules=source.system.rules.map(r=>this.trimPredicates(r))}};__name2(_Migration727TrimSelfRollOptions,"Migration727TrimSelfRollOptions"),__publicField(_Migration727TrimSelfRollOptions,"version",.727);let Migration727TrimSelfRollOptions=_Migration727TrimSelfRollOptions;const _Migration728FlattenPhysicalProperties=class extends MigrationBase{static{__name(this,"_Migration728FlattenPhysicalProperties")}booleanKeys=["temporary","collapsed"];numericKeys=["quantity","hardness"];stringKeys=["stackGroup","containerId"];async updateItem(source){if(!isPhysicalData(source))return;const systemSource=source.system;if(systemSource.currency&&(delete systemSource.currency,systemSource["-=currency"]=null),systemSource.hands&&(delete systemSource.hands,systemSource["-=hands"]=null),systemSource.equipped&&systemSource.invested instanceof Object){const value=systemSource.invested.value;if(typeof value=="boolean"||value===null){const shouldBeBoolean=source.system.traits.value.includes("invested")||source.type==="armor"&&(source.system.potencyRune.value??0)>0;systemSource.equipped.invested=shouldBeBoolean?!!value:null}}if(delete systemSource.invested,systemSource["-=invested"]=null,systemSource.capacity&&source.type!=="book"&&(delete systemSource.capacity,systemSource["-=capacity"]=null),source.type!=="backpack"&&(delete systemSource.bulkCapacity,systemSource["-=bulkCapacity"]=null,delete systemSource.collapsed,systemSource["-=collapsed"]=null),systemSource.size instanceof Object){const size=SIZES.includes(systemSource.size.value)?systemSource.size.value:"med";systemSource.size=size}"brokenThreshold"in systemSource&&(systemSource.brokenThreshold instanceof Object&&(systemSource.hp.brokenThreshold=Number(systemSource.brokenThreshold.value)),delete systemSource.brokenThreshold,systemSource["-=brokenThreshold"]=null),systemSource.hp.value=Number(systemSource.hp.value),systemSource.maxHp instanceof Object&&(systemSource.hp.max=Number(systemSource.maxHp.value)||0,delete systemSource.maxHp,systemSource["-=maxHp"]=null);for(const key of this.booleanKeys){const value=systemSource[key];value instanceof Object&&(systemSource[key]=value.value)}for(const key of this.numericKeys){const value=systemSource[key];value instanceof Object&&(systemSource[key]=Number(value.value)||0)}for(const key of this.stringKeys){const value=systemSource[key];value instanceof Object&&(systemSource[key]=String(value.value)||null)}}};__name2(_Migration728FlattenPhysicalProperties,"Migration728FlattenPhysicalProperties"),__publicField(_Migration728FlattenPhysicalProperties,"version",.728);let Migration728FlattenPhysicalProperties=_Migration728FlattenPhysicalProperties;const _Migration729CumulativeItemBonusCleanup=class extends MigrationBase{static{__name(this,"_Migration729CumulativeItemBonusCleanup")}constructor(){super(...arguments),__privateAdd(this,_explorersClothingVariants,new Set(["clothing-explorers","robe-of-the-arch-magi","robe-of-the-arch-magi-greater","sarkorian-god-caller-garb"]))}isExplorersClothing(source){return source.type==="armor"&&__privateGet(this,_explorersClothingVariants).has(source.system.slug??"")}isStanceEffectOrAnimalSkinFeat(source){return source.type==="effect"&&source.system.slug==="stance-mountain-stance"||source.type==="feat"&&source.system.slug==="animal-skin"}async updateItem(source){if(this.isExplorersClothing(source))source.system.category="unarmored",source.system.group="cloth",source.system.baseItem="explorers-clothing",source.system.traits.value.includes("comfort")||source.system.traits.value.push("comfort");else if(this.isStanceEffectOrAnimalSkinFeat(source)){const rule=source.system.rules.find(r=>r.key==="AdjustModifier"&&r.slug==="clothing-explorers");rule&&(rule.slug="explorers-clothing")}else if(source.type==="equipment"){const isBracers=!!source.system.slug?.startsWith("bracers-of-armor-");for(const rule of source.system.rules)rule.key==="FlatModifier"&&rule.slug==="bracers-of-armor"&&!isBracers&&(source.system.slug==="metuaks-pendant"?rule.slug="metuaks-pendant":delete rule.slug)}}};_explorersClothingVariants=new WeakMap,__name2(_Migration729CumulativeItemBonusCleanup,"Migration729CumulativeItemBonusCleanup"),__publicField(_Migration729CumulativeItemBonusCleanup,"version",.729);let Migration729CumulativeItemBonusCleanup=_Migration729CumulativeItemBonusCleanup;const _Migration730DeruneHandwraps=class extends MigrationBase{static{__name(this,"_Migration730DeruneHandwraps")}async updateItem(source){if(source.type==="weapon"&&source.system.slug==="handwraps-of-mighty-blows"){const{rules}=source.system;for(const rule of[...rules])["Striking","WeaponPotency"].includes(String(rule.key))&&source.system.rules.splice(rules.indexOf(rule),1)}}};__name2(_Migration730DeruneHandwraps,"Migration730DeruneHandwraps"),__publicField(_Migration730DeruneHandwraps,"version",.73);let Migration730DeruneHandwraps=_Migration730DeruneHandwraps;const _Migration731TogglePropertyToRollOption=class extends Migration727TrimSelfRollOptions{static{__name(this,"_Migration731TogglePropertyToRollOption")}constructor(){super(...arguments),__publicField(this,"optionPattern",/^target:flatFooted$/),__publicField(this,"optionReplacement","target:condition:flat-footed"),__privateAdd(this,_pathPattern,/^flags\.pf2e\.rollOptions\.([^.]+)\.([^.]+)$/)}async updateItem(source){source.system.rules=source.system.rules.map(r=>this.trimPredicates(r));const rules=source.system.rules;for(const rule of[...rules]){if(rule.key!=="ToggleProperty")continue;const match=__privateGet(this,_pathPattern).exec(rule.property?.trim()??"");if(!(match?.length===3&&match[1].length>=2&&match[2].length>=1)){rules.splice(rules.indexOf(rule),1);continue}rule.key="RollOption",rule.domain=match[1],rule.option=match[2],rule.toggleable=!0,delete rule.property,typeof rule.default=="boolean"&&(rule.value=rule.default,delete rule.default),sluggify(String(rule.label??""))===source.system.slug&&delete rule.label}}async updateActor(source){source.flags.pf2e?.rollOptions?.all&&(source.flags.pf2e.rollOptions.all["-=panache"]=!1,source.flags.pf2e.rollOptions.all["-=rage"]=!1,source.flags.pf2e.rollOptions.all["-=target:flatFooted"]=!1)}};_pathPattern=new WeakMap,__name2(_Migration731TogglePropertyToRollOption,"Migration731TogglePropertyToRollOption"),__publicField(_Migration731TogglePropertyToRollOption,"version",.731);let Migration731TogglePropertyToRollOption=_Migration731TogglePropertyToRollOption;const _Migration732FixDedicationFeatTypes=class extends MigrationBase{static{__name(this,"_Migration732FixDedicationFeatTypes")}constructor(){super(...arguments),__privateAdd(this,_hasWellFormedFeatType)}async updateItem(source){if(source.type==="feat"){const system=source.system;if(!__privateMethod(this,_hasWellFormedFeatType,hasWellFormedFeatType_fn).call(this,system))system.featType={value:"bonus"};else{const{featType}=system;(featType.value==="dedication"||featType.value==="class"&&source.system.slug?.endsWith("-dedication"))&&(featType.value="archetype")}}}};_hasWellFormedFeatType=new WeakSet,hasWellFormedFeatType_fn=__name2(function(system){return"featType"in system&&isObject(system.featType)&&"value"in system.featType&&typeof system.featType=="string"},"#hasWellFormedFeatType"),__name2(_Migration732FixDedicationFeatTypes,"Migration732FixDedicationFeatTypes"),__publicField(_Migration732FixDedicationFeatTypes,"version",.732);let Migration732FixDedicationFeatTypes=_Migration732FixDedicationFeatTypes;const _Migration733ItemBonusFromEquipment=class extends MigrationBase{static{__name(this,"_Migration733ItemBonusFromEquipment")}slugs=new Set(["animal-skin","stance-mountain-stance","spell-effect-mage-armor"]);async updateItem(source){const compendiumItem=this.slugs.has(source.system.slug??""),homebrewItem=!compendiumItem&&source.type==="feat";if(!(compendiumItem||homebrewItem))return;const rules=source.system.rules;for(const rule of rules)rule.key==="FlatModifier"&&rule.type==="item"&&(rule.fromEquipment=!1)}};__name2(_Migration733ItemBonusFromEquipment,"Migration733ItemBonusFromEquipment"),__publicField(_Migration733ItemBonusFromEquipment,"version",.733);let Migration733ItemBonusFromEquipment=_Migration733ItemBonusFromEquipment;const _Migration734SpellLocationPropsAndSignature=class extends MigrationBase{static{__name(this,"_Migration734SpellLocationPropsAndSignature")}async updateActor(actor){const entries=actor.items.filter(item=>item.type==="spellcastingEntry"),spells=actor.items.filter(item=>item.type==="spell");for(const spellSource of spells){const spellData=spellSource.system,entrySource=entries.find(entry=>entry._id===spellData.location.value);if(!entrySource)continue;const entryData=entrySource.system;if(!entryData.signatureSpells)continue;entryData.signatureSpells.value.includes(spellSource._id??"")&&(spellData.location.signature=!0)}}async updateItem(source,actor){if(source.type==="spellcastingEntry"){const data=source.system;data.signatureSpells&&(delete data.signatureSpells,"game"in globalThis&&(data["-=signatureSpells"]=null))}if(source.type==="spell"){const data=source.system;(data.heightenedLevel||data.autoHeightenLevel)&&(actor&&(data.location.heightenedLevel=data.heightenedLevel?.value??void 0,data.location.autoHeightenLevel=data.autoHeightenLevel?.value??void 0),delete data.autoHeightenLevel,delete data.heightenedLevel,"game"in globalThis&&(data["-=autoHeightenLevel"]=null,data["-=heightenedLevel"]=null))}}};__name2(_Migration734SpellLocationPropsAndSignature,"Migration734SpellLocationPropsAndSignature"),__publicField(_Migration734SpellLocationPropsAndSignature,"version",.734);let Migration734SpellLocationPropsAndSignature=_Migration734SpellLocationPropsAndSignature;const _Migration735FirearmAmmoAlchemical=class extends MigrationBase{static{__name(this,"_Migration735FirearmAmmoAlchemical")}constructor(){super(...arguments),__privateAdd(this,_needsTrait)}async updateItem(source){source.type==="consumable"&&__privateMethod(this,_needsTrait,needsTrait_fn).call(this,source)&&source.system.traits.value.unshift("alchemical")}};_needsTrait=new WeakSet,needsTrait_fn=__name2(function(source){return source.system.consumableType.value==="ammo"&&!!source.system.stackGroup?.startsWith("rounds")&&source.system.slug!=="cutlery"&&!source.system.traits.value.includes("alchemical")},"#needsTrait"),__name2(_Migration735FirearmAmmoAlchemical,"Migration735FirearmAmmoAlchemical"),__publicField(_Migration735FirearmAmmoAlchemical,"version",.735);let Migration735FirearmAmmoAlchemical=_Migration735FirearmAmmoAlchemical;const _Migration736RemoveBrokenThreshold=class extends MigrationBase{static{__name(this,"_Migration736RemoveBrokenThreshold")}constructor(){super(...arguments),__privateAdd(this,_hasBrokenThreshold)}async updateItem(source){__privateMethod(this,_hasBrokenThreshold,hasBrokenThreshold_fn).call(this,source)&&(delete source.system.brokenThreshold,source.system["-=brokenThreshold"]=null)}};_hasBrokenThreshold=new WeakSet,hasBrokenThreshold_fn=__name2(function(source){return isPhysicalData(source)&&"brokenThreshold"in source.system},"#hasBrokenThreshold"),__name2(_Migration736RemoveBrokenThreshold,"Migration736RemoveBrokenThreshold"),__publicField(_Migration736RemoveBrokenThreshold,"version",.736);let Migration736RemoveBrokenThreshold=_Migration736RemoveBrokenThreshold;const _Migration737NormalizeRuleElementKeys=class extends Migration731TogglePropertyToRollOption{static{__name(this,"_Migration737NormalizeRuleElementKeys")}async updateItem(source){const rules=source.system.rules;for(const rule of[...rules]){if(!isObject(rule)||typeof rule.key!="string"){rules.splice(rules.indexOf(rule),1);continue}rule.key=rule.key.trim().replace(/^PF2E\.RuleElement\./,"")}return super.updateItem(source)}};__name2(_Migration737NormalizeRuleElementKeys,"Migration737NormalizeRuleElementKeys"),__publicField(_Migration737NormalizeRuleElementKeys,"version",.737);let Migration737NormalizeRuleElementKeys=_Migration737NormalizeRuleElementKeys;const _Migration738UpdateLaughingShadow=class extends MigrationBase{static{__name(this,"_Migration738UpdateLaughingShadow")}constructor(){super(...arguments),__privateAdd(this,_shadowPromise,fromUuid("Compendium.pf2e.classfeatures.3gVDqDPSz4fB5T9G")),__privateAdd(this,_cascadePromise,fromUuid("Compendium.pf2e.feature-effects.fsjO5oTKttsbpaKl"))}async updateActor(source){const rollOptionsAll=source.flags.pf2e?.rollOptions?.all;rollOptionsAll instanceof Object&&"feature:laughing-shadow:damage"in rollOptionsAll&&(rollOptionsAll["-=feature:laughing-shadow:damage"]=!1)}async updateItem(source){if(source.type==="feat"&&source.system.slug==="laughing-shadow"){const laughingShadow=await __privateGet(this,_shadowPromise);if(!(laughingShadow instanceof ItemPF2e))return;source.system.rules=deepClone(laughingShadow._source.system.rules)}else if(source.type==="effect"&&source.system.slug==="stance-arcane-cascade"){const arcaneCascade=await __privateGet(this,_cascadePromise);if(!(arcaneCascade instanceof ItemPF2e))return;const newRules=deepClone(arcaneCascade._source.system.rules),withSelection=source.system.rules.find(r=>r.key==="ChoiceSet"&&typeof r.selection=="string");if(withSelection){const unselected=newRules.find(r=>r.key==="ChoiceSet");unselected&&(unselected.selection=withSelection.selection)}source.system.rules=newRules}}};_shadowPromise=new WeakMap,_cascadePromise=new WeakMap,__name2(_Migration738UpdateLaughingShadow,"Migration738UpdateLaughingShadow"),__publicField(_Migration738UpdateLaughingShadow,"version",.738);let Migration738UpdateLaughingShadow=_Migration738UpdateLaughingShadow;const _Migration739RecoveryCheckDC=class extends MigrationBase{static{__name(this,"_Migration739RecoveryCheckDC")}toughness=[{key:"FlatModifier",selector:"hp",value:"@actor.level"},{key:"ActiveEffectLike",mode:"downgrade",path:"system.attributes.dying.recoveryDC",value:9}];defyDeath=[{key:"ActiveEffectLike",mode:"downgrade",predicate:{not:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:9},{key:"ActiveEffectLike",mode:"downgrade",predicate:{all:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:8}];mountainsStoutness=[{key:"FlatModifier",selector:"hp",type:"untyped",value:"@actor.level"},{key:"ActiveEffectLike",mode:"downgrade",predicate:{not:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:9},{key:"ActiveEffectLike",mode:"downgrade",predicate:{all:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:6}];async updateItem(source){if(source.type!=="feat")return;if(source.system.slug==="toughness"){source.system.rules=this.toughness;return}else if(source.system.slug==="defy-death"){source.system.rules=this.defyDeath;return}else if(source.system.slug==="mountains-stoutness"){source.system.rules=this.mountainsStoutness;return}const{rules}=source.system;for(const rule of[...rules])rule.key==="RecoveryCheckDC"&&source.system.rules.splice(rules.indexOf(rule),1)}};__name2(_Migration739RecoveryCheckDC,"Migration739RecoveryCheckDC"),__publicField(_Migration739RecoveryCheckDC,"version",.739);let Migration739RecoveryCheckDC=_Migration739RecoveryCheckDC;const _Migration740MaxTakable=class extends MigrationBase{static{__name(this,"_Migration740MaxTakable")}async updateItem(source){if(source.type!=="feat")return;const systemData=source.system;"maxTaken"in systemData&&(typeof systemData.maxTaken=="number"&&typeof systemData.maxTakable!="number"&&(systemData.maxTakable=systemData.maxTaken),delete systemData.maxTaken,systemData["-=maxTaken"]=null),"maxTakable"in systemData&&typeof systemData.maxTakable!="number"&&(systemData.maxTakable=null)}};__name2(_Migration740MaxTakable,"Migration740MaxTakable"),__publicField(_Migration740MaxTakable,"version",.74);let Migration740MaxTakable=_Migration740MaxTakable;const _Migration741RollOptionToggleToItem=class extends MigrationBase{static{__name(this,"_Migration741RollOptionToggleToItem")}async updateActor(source){if(!(source.flags.pf2e?.rollOptions instanceof Object))return;const rules=source.items.flatMap(i=>i.system.rules).filter(r=>!!r.toggleable&&r.key==="RollOption"&&typeof r.domain=="string"&&r.domain.length>0&&typeof r.option=="string"&&r.option.length>0),{rollOptions}=source.flags.pf2e;for(const rule of rules){const domain=rollOptions[rule.domain];domain instanceof Object&&rule.option in domain&&(domain[`-=${rule.option}`]=!1,rule.value=!!domain[rule.option])}}};__name2(_Migration741RollOptionToggleToItem,"Migration741RollOptionToggleToItem"),__publicField(_Migration741RollOptionToggleToItem,"version",.741);let Migration741RollOptionToggleToItem=_Migration741RollOptionToggleToItem;const _Migration742RMAbilityBoostLevels=class extends MigrationBase{static{__name(this,"_Migration742RMAbilityBoostLevels")}async updateItem(source){if(source.type!=="class")return;const systemData=source.system;"abilityBoostLevels"in source.system&&(delete systemData.abilityBoostLevels,systemData["-=abilityBoostLevels"]=null)}};__name2(_Migration742RMAbilityBoostLevels,"Migration742RMAbilityBoostLevels"),__publicField(_Migration742RMAbilityBoostLevels,"version",.742);let Migration742RMAbilityBoostLevels=_Migration742RMAbilityBoostLevels;const _Migration743FixWeaknessStructure=class extends MigrationBase{static{__name(this,"_Migration743FixWeaknessStructure")}async updateActor(source){if(source.type!=="character"&&source.type!=="npc")return;const traits=source.system.traits;Array.isArray(traits.dv)||(traits.dv=[]),Array.isArray(traits.dr)||(traits.dr=[])}};__name2(_Migration743FixWeaknessStructure,"Migration743FixWeaknessStructure"),__publicField(_Migration743FixWeaknessStructure,"version",.743);let Migration743FixWeaknessStructure=_Migration743FixWeaknessStructure;const _Migration744MigrateSpellHeighten=class extends MigrationBase{static{__name(this,"_Migration744MigrateSpellHeighten")}async updateItem(source){if(source.type!=="spell")return;const system=source.system;system.scaling&&(system.heightening={type:"interval",interval:system.scaling.interval,damage:system.scaling.damage},delete system.scaling,system["-=scaling"]=null)}};__name2(_Migration744MigrateSpellHeighten,"Migration744MigrateSpellHeighten"),__publicField(_Migration744MigrateSpellHeighten,"version",.744);let Migration744MigrateSpellHeighten=_Migration744MigrateSpellHeighten;const _Migration745EffectTargetToChoiceSet=class extends MigrationBase{static{__name(this,"_Migration745EffectTargetToChoiceSet")}constructor(){super(...arguments),__privateAdd(this,_isEffectTargetRE),__privateAdd(this,_toChoiceSet)}async updateItem(source,actorSource){const{rules}=source.system;for(const rule of rules)if(__privateMethod(this,_isEffectTargetRE,isEffectTargetRE_fn).call(this,rule)){rules[rules.indexOf(rule)]=__privateMethod(this,_toChoiceSet,toChoiceSet_fn).call(this,rule,source,actorSource??null);const otherRules=rules.filter(r=>typeof r.selector=="string"&&/item\|data\.target/.test(r.selector));for(const other of otherRules){const flag=sluggify(source.system.slug??source.name,{camel:"dromedary"});other.selector=other.selector.replace(/\bdata\.target\b/,`flags.pf2e.rulesSelections.${flag}`)}}}};_isEffectTargetRE=new WeakSet,isEffectTargetRE_fn=__name2(function(rule){return rule.key==="EffectTarget"},"#isEffectTargetRE"),_toChoiceSet=new WeakSet,toChoiceSet_fn=__name2(function(rule,itemSource,actorSource){const newRE={key:"ChoiceSet",choices:{ownedItems:!0,types:["weapon"]},prompt:"PF2E.SpecificRule.Prompt.Weapon"};if(typeof rule.targetId=="string"&&actorSource){const weapon=actorSource.items.find(i=>i.type==="weapon"&&i._id===rule.targetId);weapon&&(newRE.selection=weapon.system.slug??sluggify(weapon.name))}return itemSource.system.slug?.includes("blade-ally")?newRE.choices.includeHandwraps=!0:itemSource.system.slug?.includes("weapon-surge")?newRE.choices.predicate={all:["item:equipped"]}:itemSource.system.slug==="shillelagh"?(newRE.adjustName=!1,newRE.prompt="PF2E.SpecificRule.Prompt.Shillelagh",newRE.choices.predicate={all:["item:equipped"],any:["item:base:club","item:base:staff"]}):isObject(rule.predicate)&&(newRE.choices.predicate=deepClone(rule.predicate)),newRE},"#toChoiceSet"),__name2(_Migration745EffectTargetToChoiceSet,"Migration745EffectTargetToChoiceSet"),__publicField(_Migration745EffectTargetToChoiceSet,"version",.745);let Migration745EffectTargetToChoiceSet=_Migration745EffectTargetToChoiceSet;const _Migration746StandardizePricing=class extends MigrationBase{static{__name(this,"_Migration746StandardizePricing")}async updateItem(item){if(!(!isPhysicalData(item)&&item.type!=="kit"))if(isObject(item.system.price)||(item.system.price={value:CoinsPF2e.fromString(String(item.system.price)).toObject()}),item.type==="treasure"){const systemData=item.system;if(systemData.denomination||systemData.value){const value=systemData.value?.value??0,denomination=systemData.denomination?.value??"gp";systemData.price={value:{[denomination]:value}},systemData["-=denomination"]=null,delete systemData.denomination,systemData["-=value"]=null,delete systemData.value}}else isObject(item.system.price.value)||(item.system.price.value=CoinsPF2e.fromString(String(item.system.price.value)).toObject())}};__name2(_Migration746StandardizePricing,"Migration746StandardizePricing"),__publicField(_Migration746StandardizePricing,"version",.746);let Migration746StandardizePricing=_Migration746StandardizePricing;const _Migration747FixedHeightening=class extends MigrationBase{static{__name(this,"_Migration747FixedHeightening")}constructor(){super(...arguments),__privateAdd(this,_loadedSpells,void 0),__publicField(this,"fixedHeightenSpells",new Set(["Compendium.pf2e.spells-srd.0fKHBh5goe2eiFYL","Compendium.pf2e.spells-srd.10VcmSYNBrvBphu1","Compendium.pf2e.spells-srd.2gQYrCPwBmwau26O","Compendium.pf2e.spells-srd.2iQKhCQBijhj5Rf3","Compendium.pf2e.spells-srd.4koZzrnMXhhosn0D","Compendium.pf2e.spells-srd.5WM3WjshXgrkVCg6","Compendium.pf2e.spells-srd.7CUgqHunmHfW2lC5","Compendium.pf2e.spells-srd.7OFKYR1VY6EXDuiR","Compendium.pf2e.spells-srd.9s5tqqXNzcoKamWx","Compendium.pf2e.spells-srd.BCuHKrDeJ4eq53M6","Compendium.pf2e.spells-srd.CxpFy4HJHf4ACbxF","Compendium.pf2e.spells-srd.D2nPKbIS67m9199U","Compendium.pf2e.spells-srd.DCQHaLrYXMI37dvW","Compendium.pf2e.spells-srd.DgcSiOCR1uDXGaEA","Compendium.pf2e.spells-srd.EfFMLVbmkBWmzoLF","Compendium.pf2e.spells-srd.Et8RSCLx8w7uOLvo","Compendium.pf2e.spells-srd.F23T5tHPo3WsFiHW","Compendium.pf2e.spells-srd.FhOaQDTSnsY7tiam","Compendium.pf2e.spells-srd.Fr58LDSrbndgld9n","Compendium.pf2e.spells-srd.GaRQlC9Yw1BGKHfN","Compendium.pf2e.spells-srd.HGmBY8KjgLV97nUp","Compendium.pf2e.spells-srd.HHGUBGle4OjoxvNR","Compendium.pf2e.spells-srd.HTou8cG05yuSkesj","Compendium.pf2e.spells-srd.HWrNMQENi9WSGbnF","Compendium.pf2e.spells-srd.HcIAQZjNXHemoXSU","Compendium.pf2e.spells-srd.Ifc2b6bNVdjKV7Si","Compendium.pf2e.spells-srd.JHntYF0SbaWKq7wR","Compendium.pf2e.spells-srd.LQzlKbYjZSMFQawP","Compendium.pf2e.spells-srd.LiGbewa9pO0yjbsY","Compendium.pf2e.spells-srd.Llx0xKvtu8S4z6TI","Compendium.pf2e.spells-srd.Mkbq9xlAUxHUHyR2","Compendium.pf2e.spells-srd.OAt2ZEns1gIOCgrn","Compendium.pf2e.spells-srd.OhD2Z6rIGGD5ocZA","Compendium.pf2e.spells-srd.PRrZ7anETWPm90YY","Compendium.pf2e.spells-srd.PjhUmyKnq6K5uDby","Compendium.pf2e.spells-srd.Popa5umI3H33levx","Compendium.pf2e.spells-srd.Pwq6T7xpfAJXV5aj","Compendium.pf2e.spells-srd.Q7QQ91vQtyi1Ux36","Compendium.pf2e.spells-srd.Seaah9amXg70RKw2","Compendium.pf2e.spells-srd.U58aQWJ47VrI36yP","Compendium.pf2e.spells-srd.UmXhuKrYZR3W16mQ","Compendium.pf2e.spells-srd.VTb0yI6P1bLkzuRr","Compendium.pf2e.spells-srd.VlNcjmYyu95vOUe8","Compendium.pf2e.spells-srd.W02bHXylIpoXbO4e","Compendium.pf2e.spells-srd.WsUwpfmhKrKwoIe3","Compendium.pf2e.spells-srd.Wt94cw03L77sbud7","Compendium.pf2e.spells-srd.XhgMx9WC6NfXd9RP","Compendium.pf2e.spells-srd.ZAX0OOcKtYMQlquR","Compendium.pf2e.spells-srd.ZqmP9gijBmK7y8Xy","Compendium.pf2e.spells-srd.aIHY2DArKFweIrpf","Compendium.pf2e.spells-srd.atlgGNI1E1Ox3O3a","Compendium.pf2e.spells-srd.bay4AfSu2iIozNNW","Compendium.pf2e.spells-srd.czO0wbT1i320gcu9","Compendium.pf2e.spells-srd.dINQzhqGmIsqGMUY","Compendium.pf2e.spells-srd.drmvQJETA3WZzXyw","Compendium.pf2e.spells-srd.e36Z2t6tLdW3RUzZ","Compendium.pf2e.spells-srd.fprqWKUc0jnMIyGU","Compendium.pf2e.spells-srd.gISYsBFby1TiXfBt","Compendium.pf2e.spells-srd.ivKnEtI1z4UqEKIA","Compendium.pf2e.spells-srd.kuoYff1csM5eAcAP","Compendium.pf2e.spells-srd.lbrWMnS2pecKaSVB","Compendium.pf2e.spells-srd.lsR3RLEdBG4rcSzd","Compendium.pf2e.spells-srd.nXmC2Xx9WmS5NsAo","Compendium.pf2e.spells-srd.o6YCGx4lycsYpww4","Compendium.pf2e.spells-srd.pZTqGY1MLRjgKasV","Compendium.pf2e.spells-srd.pt3gEnzA159uHcJC","Compendium.pf2e.spells-srd.pwzdSlJgYqN7bs2w","Compendium.pf2e.spells-srd.q5qmNn144ZJGxnvJ","Compendium.pf2e.spells-srd.qTr2oCgIXl703Whb","Compendium.pf2e.spells-srd.qwlh6aDgi86U3Q7H","Compendium.pf2e.spells-srd.r4HLQcYwB62bTayl","Compendium.pf2e.spells-srd.sFwoKj0TsacsmoWj","Compendium.pf2e.spells-srd.vLA0q0WOK2YPuJs6","Compendium.pf2e.spells-srd.vLzFcIaSXs7YTIqJ","Compendium.pf2e.spells-srd.vTQvfYu2llKQedmY","Compendium.pf2e.spells-srd.vctIUOOgSmxAF0KG","Compendium.pf2e.spells-srd.wzctak6BxOW8xvFV","Compendium.pf2e.spells-srd.x5rGOmhDRDVQPrnW","Compendium.pf2e.spells-srd.x7SPrsRxGb2Vy2nu","Compendium.pf2e.spells-srd.x9RIFhquazom4p02","Compendium.pf2e.spells-srd.xRgU9rrhmGAgG4Rc","Compendium.pf2e.spells-srd.yH13KXUK2x093NUv","Compendium.pf2e.spells-srd.yM3KTTSAIHhyuP14","Compendium.pf2e.spells-srd.zlnXpME1T2uvn8Lr","Compendium.pf2e.spells-srd.zul5cBTfr7NXHBZf"]))}async updateItem(item){if(item.type!=="spell")return;const isAcidSplash=(item.system.slug??sluggify(item.name))==="acid-splash";if(item.system.heightening?.type==="fixed"&&!isAcidSplash)return;const sourceId=item.flags.core?.sourceId;if(sourceId&&this.fixedHeightenSpells.has(sourceId)){const spell=(await this.loadSpells())[sourceId];spell&&spell.system.heightening?.type==="fixed"&&(item.system.heightening=spell.system.heightening,this.overwriteDamage(item,spell))}}overwriteDamage(spell,newSpell){const newDamage=newSpell.system.damage,newKeys=new Set(Object.keys(newDamage.value)),diff=Object.keys(spell.system.damage.value).filter(key=>!newKeys.has(key)),damage=spell.system.damage;damage.value=newDamage.value;for(const deleteKey of diff)damage.value[`-=${deleteKey}`]=null}async loadSpells(){if(__privateGet(this,_loadedSpells))return __privateGet(this,_loadedSpells);const spells=await UUIDUtils.fromUUIDs([...this.fixedHeightenSpells]);return __privateSet(this,_loadedSpells,spells.reduce((record,spell)=>({...record,[spell.uuid]:spell}),{})),__privateGet(this,_loadedSpells)}};_loadedSpells=new WeakMap,__name2(_Migration747FixedHeightening,"Migration747FixedHeightening"),__publicField(_Migration747FixedHeightening,"version",.747);let Migration747FixedHeightening=_Migration747FixedHeightening;const _Migration748BatchConsumablePricing=class extends MigrationBase{static{__name(this,"_Migration748BatchConsumablePricing")}async updateItem(item){if(!isPhysicalData(item))return;const slug=item.system.slug??sluggify(item.name);batched_5.has(slug)&&(item.system.price.per=5),batched_10.has(slug)&&(item.system.price.per=10)}};__name2(_Migration748BatchConsumablePricing,"Migration748BatchConsumablePricing"),__publicField(_Migration748BatchConsumablePricing,"version",.748);let Migration748BatchConsumablePricing=_Migration748BatchConsumablePricing;const batched_5=new Set(["rounds-harmona-gun","rounds-dwarven-scattergun","rounds-flingflenser","rounds-explosive-dogslicer"]),batched_10=new Set(["rounds-three-peaked-tree","rounds-dragon-mouth-pistol","rounds-pepperbox","rounds-fire-lance","rounds-flintlock-pistol","rounds-clan-pistol","bolts","rounds-hand-cannon","sun-shot","rounds-dagger-pistol","rounds-dueling-pistol","rounds-flintlock-musket","rounds-hammer-gun","rounds-black-powder-knuckle-dusters","rounds-slide-pistol","sling-bullets","rounds-double-barreled-musket","rounds-mace-multipistol","rounds-gnome-amalgam-musket","cutlery","rounds-axe-musket","rounds-mithral-tree","wooden-taws","rounds-gun-sword","rounds-blunderbuss","rounds-jezail","rounds-double-barreled-pistol","rounds-arquebus","rounds-cane-pistol","rounds-rapier-pistol","rounds-coat-pistol","rounds-piercing-wind","blowgun-darts","arrows","light-writer-plates","practice-target"]),_Migration749AssuranceREs=class extends MigrationBase{static{__name(this,"_Migration749AssuranceREs")}constructor(){super(...arguments),__privateAdd(this,_isChoiceSetWithSelection),__privateAdd(this,_newRules)}async updateItem(source){const{slug,rules}=source.system;if(!(source.type==="feat"&&slug?.startsWith("assurance")))return;const firstRule=rules.at(0);if(slug==="assurance"&&firstRule&&rules.length===1&&__privateMethod(this,_isChoiceSetWithSelection,isChoiceSetWithSelection_fn).call(this,firstRule))firstRule.flag="assurance",rules.push(...__privateMethod(this,_newRules,newRules_fn).call(this,"choice"));else if(rules.length===0){const skill=/^assurance-([a-z]+)$/.exec(slug)?.at(1);setHasElement(SKILL_LONG_FORMS,skill)&&rules.push(...__privateMethod(this,_newRules,newRules_fn).call(this,skill))}}};_isChoiceSetWithSelection=new WeakSet,isChoiceSetWithSelection_fn=__name2(function(rule){return rule.key==="ChoiceSet"},"#isChoiceSetWithSelection"),_newRules=new WeakSet,newRules_fn=__name2(function(skill){const selector=skill==="choice"?"{item|flags.pf2e.rulesSelections.assurance}":skill;return[{key:"SubstituteRoll",label:"PF2E.SpecificRule.SubstituteRoll.Assurance",selector,slug:"assurance",value:10},{key:"AdjustModifier",predicate:{all:["substitute:assurance"],not:["bonus:type:proficiency"]},selector,suppress:!0}]},"#newRules"),__name2(_Migration749AssuranceREs,"Migration749AssuranceREs"),__publicField(_Migration749AssuranceREs,"version",.749);let Migration749AssuranceREs=_Migration749AssuranceREs;const _Migration750FixCorruptedPrice=class extends MigrationBase{static{__name(this,"_Migration750FixCorruptedPrice")}async updateItem(item){!isPhysicalData(item)&&item.type!=="kit"||typeof item.system.price=="string"&&(item.system.price={value:CoinsPF2e.fromString(item.system.price).toObject()})}};__name2(_Migration750FixCorruptedPrice,"Migration750FixCorruptedPrice"),__publicField(_Migration750FixCorruptedPrice,"version",.75);let Migration750FixCorruptedPrice=_Migration750FixCorruptedPrice;const _Migration751ResetRollOptions=class extends MigrationBase{static{__name(this,"_Migration751ResetRollOptions")}async updateActor(source){isObject(source.flags.pf2e)&&"rollOptions"in source.flags.pf2e&&(source.flags.pf2e["-=rollOptions"]=null)}};__name2(_Migration751ResetRollOptions,"Migration751ResetRollOptions"),__publicField(_Migration751ResetRollOptions,"version",.751);let Migration751ResetRollOptions=_Migration751ResetRollOptions;const _Migration752StrikeVsWeaponTraits=class extends MigrationBase{static{__name(this,"_Migration752StrikeVsWeaponTraits")}constructor(){super(...arguments),__privateAdd(this,_toSkip,new Set(["ghost-hunter","stance-arcane-cascade","spirit-strikes"]))}async updateItem(source){if(__privateGet(this,_toSkip).has(source.system.slug??""))return;const rules=source.system.rules.filter(r=>r.key==="AdjustStrike"&&r.property==="traits");for(const rule of rules)objectHasKey(weaponTraits,rule.value)&&(rule.property="weapon-traits")}};_toSkip=new WeakMap,__name2(_Migration752StrikeVsWeaponTraits,"Migration752StrikeVsWeaponTraits"),__publicField(_Migration752StrikeVsWeaponTraits,"version",.752);let Migration752StrikeVsWeaponTraits=_Migration752StrikeVsWeaponTraits;const _Migration753WeaponReloadTimes=class extends MigrationBase{static{__name(this,"_Migration753WeaponReloadTimes")}constructor(){super(...arguments),__privateAdd(this,_hasThrownTrait)}async updateItem(source){if(source.type!=="weapon")return;const slug=source.system.slug??"";["backpack-catapult","backpack-catapult"].includes(slug)?source.system.reload.value="10":(source.system.baseItem==="alchemical-bomb"||__privateMethod(this,_hasThrownTrait,hasThrownTrait_fn).call(this,source))&&(source.system.reload.value="-")}};_hasThrownTrait=new WeakSet,hasThrownTrait_fn=__name2(function(source){return source.system.traits.value.some(t=>t.startsWith("thrown"))},"#hasThrownTrait"),__name2(_Migration753WeaponReloadTimes,"Migration753WeaponReloadTimes"),__publicField(_Migration753WeaponReloadTimes,"version",.753);let Migration753WeaponReloadTimes=_Migration753WeaponReloadTimes;const _Migration754MightyBulwarkAdjustModifiers=class extends MigrationBase{static{__name(this,"_Migration754MightyBulwarkAdjustModifiers")}async updateItem(source){if(!(source.type==="feat"&&source.system.slug==="mighty-bulwark"))return;const newRules=[{key:"FlatModifier",predicate:{all:["self:armor:trait:bulwark"]},selector:"reflex",type:"untyped",value:4},{key:"AdjustModifier",predicate:{all:["self:armor:trait:bulwark"]},selector:"reflex",slug:"dex",suppress:!0},{key:"AdjustModifier",selector:"reflex",slug:"bulwark",suppress:!0}];source.system.rules=newRules}};__name2(_Migration754MightyBulwarkAdjustModifiers,"Migration754MightyBulwarkAdjustModifiers"),__publicField(_Migration754MightyBulwarkAdjustModifiers,"version",.754);let Migration754MightyBulwarkAdjustModifiers=_Migration754MightyBulwarkAdjustModifiers;const _Migration755GrantIdsToData=class extends MigrationBase{static{__name(this,"_Migration755GrantIdsToData")}async updateActor(source){for(const item of source.items){if(!item.flags.pf2e)continue;const systemFlags=item.flags.pf2e,{grantedBy,itemGrants}=systemFlags;typeof grantedBy=="string"&&(source.items.find(i=>i._id===grantedBy)?systemFlags.grantedBy={id:grantedBy}:systemFlags["-=grantedBy"]=null),Array.isArray(itemGrants)&&(systemFlags.itemGrants=itemGrants.flatMap(grant=>typeof grant=="string"?source.items.find(i=>i._id===grant)?{id:grant}:[]:grant))}}};__name2(_Migration755GrantIdsToData,"Migration755GrantIdsToData"),__publicField(_Migration755GrantIdsToData,"version",.755);let Migration755GrantIdsToData=_Migration755GrantIdsToData;const _Migration756RMStoredResourceMaxes=class extends MigrationBase{static{__name(this,"_Migration756RMStoredResourceMaxes")}async updateActor(source){source.type==="character"&&(source["system.resources.focus.-=max"]=null,source["system.resources.crafting.infusedReagents.-=max"]=null,source["system.resources.-=investiture"]=null)}};__name2(_Migration756RMStoredResourceMaxes,"Migration756RMStoredResourceMaxes"),__publicField(_Migration756RMStoredResourceMaxes,"version",.756);let Migration756RMStoredResourceMaxes=_Migration756RMStoredResourceMaxes;const _Migration757HillockHalfling=class extends MigrationBase{static{__name(this,"_Migration757HillockHalfling")}async updateItem(itemSource){if(itemSource.type!=="heritage"||(itemSource.system.slug??sluggify(itemSource.name))!=="hillock-halfling")return;const rules=itemSource.system.rules;if(!rules.some(rule=>"path"in rule&&rule.path==="system.attributes.hp.recoveryAddend")){const element={key:"ActiveEffectLike",mode:"add",path:"system.attributes.hp.recoveryAddend",value:"@actor.level"};rules.push(element)}}};__name2(_Migration757HillockHalfling,"Migration757HillockHalfling"),__publicField(_Migration757HillockHalfling,"version",.757);let Migration757HillockHalfling=_Migration757HillockHalfling;const _Migration758PrunePCAttributes=class extends MigrationBase{static{__name(this,"_Migration758PrunePCAttributes")}toDelete=["-=ac","-=ancestryhp","-=battleForm","-=classDC","-=classOrSpellDC","-=classhp","-=dexCap","-=doomed","-=dying","-=familiarAbilities","-=flanking","-=flatbonushp","-=flatbonussp","-=handsFree","-=hardness","hp.-=breakdown","hp.-=details","hp.-=max","hp.-=name","hp.-=negativeHealing","hp.-=recoveryMultiplier","hp.-=totalModifier","hp.-=tempsource","hp.-=_modifiers","initiative.-=_modifiers","initiative.-=breakdown","initiative.-=label","initiative.-=name","initiative.-=roll","initiative.-=tiebreakPriority","initiative.-=totalModifier","-=levelbonushp","-=levelbonussp","-=perception","-=polymorphed","-=reach","-=shield","speed.-=_modifiers","speed.-=breakdown","speed.-=name","speed.-=total","speed.-=totalModifier","speed.-=type","-=spellDC","-=wounded"];async updateActor(source){if(source.type==="character")for(const key of this.toDelete)source[`system.attributes.${key}`]=null}};__name2(_Migration758PrunePCAttributes,"Migration758PrunePCAttributes"),__publicField(_Migration758PrunePCAttributes,"version",.758);let Migration758PrunePCAttributes=_Migration758PrunePCAttributes;const _Migration759CritSpecRE=class extends MigrationBase{static{__name(this,"_Migration759CritSpecRE")}async updateItem(source){if(!["feat","weapon"].includes(source.type))return;const critSpecKey="CriticalSpecialization";if(!source.system.rules.some(r=>r.key===critSpecKey))switch(source.system.slug){case"archer-dedication":{source.system.rules.push({key:critSpecKey,predicate:{all:["weapon:group:bow",{gte:["weapon:proficiency:rank",2]}]}});return}case"azarketi-weapon-aptitude":{source.system.rules=[{key:critSpecKey,predicate:{any:["weapon:trait:azarketi","weapon:base:crossbow","weapon:base:hand-crossbow","weapon:base:longspear","weapon:base:spear","weapon:base:trident"]}}];return}case"brawling-focus":{source.system.rules=[{key:critSpecKey,predicate:{any:["weapon:group:brawling",{and:["feat:monastic-weaponry","weapon:trait:monk",{not:"weapon:category:unarmed"},{gte:["weapon:proficiency:rank",1]}]}]}}];return}case"brutality":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:["self:effect:rage","weapon:melee"]}});return}case"catfolk-weapon-rake":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:catfolk","weapon:base:hatchet","weapon:base:kama","weapon:base:kukri","weapon:base:scimitar","weapon:base:sickle"]}}];return}case"conrasu-weapon-understanding":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:conrasu","weapon:base:glaive","weapon:base:longspear","weapon:base:longsword","weapon:base:shortbow","weapon:base:spear"]}}];return}case"dwarven-weapon-cunning":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:dwarf","weapon:base:battle-axe","weapon:base:pick","weapon:base:warhammer"]}}];return}case"elven-weapon-elegance":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:elf","weapon:base:longbow","weapon:base:longsword","weapon:base:rapier","weapon:base:shortbow"]}}];return}case"fighter-weapon-mastery":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:[{gte:["weapon:proficiency:rank",3]}]}});return}case"genie-weapon-flourish":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:geniekin","weapon:base:falchion","weapon:base:ranseur","weapon:base:scimitar","weapon:base:trident"]}}];return}case"gnoll-weapon-practicality":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:gnoll","weapon:base:flail","weapon:base:khopesh","weapon:base:mambele","weapon:base:spear","weapon:base:war-flail"]}}];return}case"gnome-weapon-innovator":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:gnome","weapon:base:glaive","weapon:base:kukri"]}}];return}case"goblin-weapon-frenzy":{source.system.rules=[{key:"CriticalSpecialization",predicate:{all:["weapon:trait:goblin"]}}];return}case"grippli-weapon-innovator":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:grippli","weapon:base:blowgun","weapon:base:hatchet","weapon:base:scythe","weapon:base:shortbow"]}}];return}case"gunslinger-weapon-mastery":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{any:["weapon:group:firearm","weapon:tag:crossbow"]}});return}case"halfling-weapon-trickster":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:halfling","weapon:base:shortsword","weapon:base:sling"]}}];return}case"hobgoblin-weapon-discipline":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:group:polearm","weapon:group:spear","weapon:group:sword"]}}];return}case"improvised-critical":{source.system.rules=[{key:critSpecKey,predicate:{all:["weapon:tag:improvised"]}}];return}case"kobold-weapon-innovator":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:kobold","weapon:base:crossbow","weapon:base:greatpick","weapon:base:light-pick","weapon:base:pick","weapon:base:spear"]}}];return}case"mauler-dedication":{source.system.rules.push({key:"CriticalSpecialization",predicate:{all:["weapon:melee",{or:["weapon:category:simple","weapon:category:martial"]},{or:["weapon:usage:hands:2","weapon:trait:two-hand-d6","weapon:trait:two-hand-d8","weapon:trait:two-hand-d10","weapon:trait:two-hand-d12"]}]}});return}case"orc-weapon-carnage":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:orc","weapon:base:falchion","weapon:base:greataxe"]}}];return}case"ranger-weapon-expertise":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:["hunted-prey"],any:["weapon:category:simple","weapon:category:martial"]}});return}case"spike-launcher":{const rule={key:critSpecKey,alternate:!0,predicate:{all:["weapon:id:{item|_id}"]},text:"PF2E.Item.Weapon.CriticalSpecialization.bow"};source.system.rules.push(rule);return}case"student-of-the-staff":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.unshift({key:critSpecKey,predicate:{all:["weapon:base:staff"]}});return}case"sun-sling":{source.system.rules.push({key:critSpecKey,predicate:{all:["weapon:id:{item|_id}","feat:suns-fury"]}});return}case"suns-fury":{source.system.rules=[];return}case"third-doctrine-warpriest":{source.system.rules.push({key:critSpecKey,predicate:{all:["weapon:deity-favored"]}});return}case"vanths-weapon-execution":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:base:bo-staff","weapon:base:longbow","weapon:base:scythe","weapon:base:staff"]}}];return}case"weapon-expertise-swashbuckler":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:[{gte:["weapon:proficiency:rank",2]}]}});return}case"weapon-tricks":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:["target:condition:flat-footed"],any:[{and:[{or:["weapon:trait:agile","weapon:trait:finesse"]},{or:["weapon:category:simple","weapon:category:unarmed"]}]},"weapon:base:rapier","weapon:base:sap","weapon:base:shortbow","weapon:base:shortsword"]}});return}}}};__name2(_Migration759CritSpecRE,"Migration759CritSpecRE"),__publicField(_Migration759CritSpecRE,"version",.759);let Migration759CritSpecRE=_Migration759CritSpecRE;const _Migration760SeparateNoteTitle=class extends MigrationBase{static{__name(this,"_Migration760SeparateNoteTitle")}constructor(){super(...arguments),__privateAdd(this,_cleanText)}async updateItem(source){const notes=source.system.rules.filter(r=>r.key==="Note"&&typeof r.text=="string"&&!("title"in r));for(const note of notes){if(note.text=note.text.trim(),!note.text.startsWith("{const text=note.text.includes("

")?note.text:`${note.text}

`;try{const fragment=document.createElement("template");fragment.innerHTML=text;const children2=Array.from(fragment.content.childNodes);if(children2.length===1&&children2[0]instanceof HTMLElement)return children2[0];if(children2.length===2&&children2[0]instanceof HTMLParagraphElement&&children2[1]instanceof Text){const[first,second]=children2;return first.append(second),first}else return null}catch{return null}})();if(pElement?.nodeName!=="P")continue;const children=Array.from(pElement.childNodes);if(children.length===1&&children[0]instanceof Text){note.text=__privateMethod(this,_cleanText,cleanText_fn).call(this,children[0].textContent??""),pElement.dataset.visibility&&["gm","owner"].includes(pElement.dataset.visibility)&&(note.visibility=pElement.dataset.visibility);continue}if(children.length!==2||!(children[0]instanceof HTMLElement)||children[0].nodeName!=="STRONG"||!(children[1]instanceof Text))continue;const strongElement=children[0];strongElement.remove();const newText=pElement.innerHTML.trim();if(newText===""||note.text.includes("typeof group=="string"?`PF2E.Item.Weapon.CriticalSpecialization.${group.toLowerCase()}`:substring)},"#cleanText"),__name2(_Migration760SeparateNoteTitle,"Migration760SeparateNoteTitle"),__publicField(_Migration760SeparateNoteTitle,"version",.76);let Migration760SeparateNoteTitle=_Migration760SeparateNoteTitle;const _Migration761ShotRules=class extends MigrationBase{static{__name(this,"_Migration761ShotRules")}constructor(){super(...arguments),__privateAdd(this,_updateEffect),__privateAdd(this,_updateFeat)}async updateItem(source){switch(source.type){case"effect":__privateMethod(this,_updateEffect,updateEffect_fn).call(this,source);break;case"feat":__privateMethod(this,_updateFeat,updateFeat_fn).call(this,source);break}}};_updateEffect=new WeakSet,updateEffect_fn=__name2(function(source){if(source.system.slug==="stance-multishot-stance"){const newRules=[{key:"AdjustModifier",mode:"add",predicate:{all:["double-shot"]},relabel:"{item|name}",selector:"ranged-attack-roll",slug:"double-shot",value:1},{key:"AdjustModifier",mode:"add",predicate:{all:["triple-shot"]},relabel:"{item|name}",selector:"ranged-attack-roll",slug:"double-shot",value:1}];source.system.rules=newRules}},"#updateEffect"),_updateFeat=new WeakSet,updateFeat_fn=__name2(function(source){switch(source.system.slug){case"double-shot":{const newRules=[{domain:"ranged-attack-roll",key:"RollOption",option:"double-shot",toggleable:!0},{key:"FlatModifier",predicate:{all:["double-shot","weapon:reload:0"]},selector:"ranged-attack-roll",slug:"double-shot",value:-2}];source.system.rules=newRules;break}case"triple-shot":{const newRules=[{domain:"ranged-attack-roll",disabledIf:{not:["double-shot"]},key:"RollOption",option:"triple-shot",priority:51,toggleable:!0},{key:"AdjustModifier",mode:"override",predicate:{all:["double-shot","triple-shot"]},relabel:"{item|name}",selector:"ranged-attack-roll",slug:"double-shot",value:-4}];source.system.rules=newRules;break}}},"#updateFeat"),__name2(_Migration761ShotRules,"Migration761ShotRules"),__publicField(_Migration761ShotRules,"version",.761);let Migration761ShotRules=_Migration761ShotRules;const _Migration762UpdateBackgroundItems=class extends MigrationBase{static{__name(this,"_Migration762UpdateBackgroundItems")}async updateItem(source){source.type==="background"&&(source.system.slug==="amnesiac"||source.system.slug==="discarded-duplicate")&&Object.values(source.system.boosts).length!==3&&(source.system.boosts[2]={value:["cha","con","dex","int","str","wis"],selected:null})}};__name2(_Migration762UpdateBackgroundItems,"Migration762UpdateBackgroundItems"),__publicField(_Migration762UpdateBackgroundItems,"version",.762);let Migration762UpdateBackgroundItems=_Migration762UpdateBackgroundItems;const _Migration763RestoreAnimalStrikeOptions=class extends MigrationBase{static{__name(this,"_Migration763RestoreAnimalStrikeOptions")}async updateItem(source){if(source.type!=="feat"||!/^[a-z]+-animal-instinct$/.test(source.system.slug??""))return;const strikeRE=source.system.rules.find(r=>r.key==="Strike"&&!Array.isArray(r.options));strikeRE&&(strikeRE.options=["animal-instinct"])}};__name2(_Migration763RestoreAnimalStrikeOptions,"Migration763RestoreAnimalStrikeOptions"),__publicField(_Migration763RestoreAnimalStrikeOptions,"version",.763);let Migration763RestoreAnimalStrikeOptions=_Migration763RestoreAnimalStrikeOptions;const _Migration764PanacheVivaciousREs=class extends MigrationBase{static{__name(this,"_Migration764PanacheVivaciousREs")}constructor(){super(...arguments),__privateAdd(this,_vivaciousRules)}async updateItem(source){source.type==="feat"&&(source.system.slug==="panache"?source.system.rules=[]:source.system.slug==="vivacious-speed"&&(source.system.rules=__privateGet(this,_vivaciousRules,vivaciousRules_get)))}};_vivaciousRules=new WeakSet,vivaciousRules_get=__name2(function(){return[{key:"FlatModifier",predicate:{all:["self:effect:panache"]},selector:"speed",slug:"vivacious-full",type:"status",value:{brackets:[{end:2,value:5},{end:6,start:3,value:10},{end:10,start:7,value:15},{end:14,start:11,value:20},{end:18,start:15,value:25},{start:19,value:30}]}},{key:"FlatModifier",predicate:{not:["self:effect:panache"]},selector:"speed",slug:"vivacious-half",type:"status",value:{brackets:[{end:10,start:3,value:5},{end:18,start:11,value:10},{start:19,value:15}]}}]},"#vivaciousRules"),__name2(_Migration764PanacheVivaciousREs,"Migration764PanacheVivaciousREs"),__publicField(_Migration764PanacheVivaciousREs,"version",.764);let Migration764PanacheVivaciousREs=_Migration764PanacheVivaciousREs;const _Migration765ChoiceOwnedItemTypes=class extends MigrationBase{static{__name(this,"_Migration765ChoiceOwnedItemTypes")}async updateItem(source){for(const rule of source.system.rules)rule.key==="ChoiceSet"&&"choices"in rule&&isObject(rule.choices)&&rule.choices.ownedItems&&!rule.choices.types&&(rule.choices.types=["weapon"])}};__name2(_Migration765ChoiceOwnedItemTypes,"Migration765ChoiceOwnedItemTypes"),__publicField(_Migration765ChoiceOwnedItemTypes,"version",.765);let Migration765ChoiceOwnedItemTypes=_Migration765ChoiceOwnedItemTypes;const _Migration766WipeURLSources=class extends MigrationBase{static{__name(this,"_Migration766WipeURLSources")}async updateItem(source){(!("game"in globalThis)||source.flags.core?.sourceId?.startsWith("Compendium.pf2e."))&&"source"in source.system&&isObject(source.system.source)&&typeof source.system.source.value=="string"&&source.system.source.value.startsWith("http")&&(source.system.source.value="")}};__name2(_Migration766WipeURLSources,"Migration766WipeURLSources"),__publicField(_Migration766WipeURLSources,"version",.766);let Migration766WipeURLSources=_Migration766WipeURLSources;const _Migration767ConvertVoluntaryFlaws=class extends MigrationBase{static{__name(this,"_Migration767ConvertVoluntaryFlaws")}async updateItem(source){if(source.type!=="ancestry")return;const system=source.system,oldFlaws=Object.values(system.voluntaryFlaws??{}).map(b=>b.selected).filter(a=>!!a),oldBoosts=Object.values(system.voluntaryBoosts??{}).map(b=>b.selected).filter(a=>!!a);(oldBoosts.length||oldFlaws.length)&&(system.voluntary={boost:oldBoosts.at(0)||null,flaws:oldFlaws}),system.voluntaryBoosts&&(delete system.voluntaryBoosts,delete system["-=voluntaryBoosts"]),system.voluntaryFlaws&&(delete system.voluntaryFlaws,delete system.voluntaryFlaws)}};__name2(_Migration767ConvertVoluntaryFlaws,"Migration767ConvertVoluntaryFlaws"),__publicField(_Migration767ConvertVoluntaryFlaws,"version",.767);let Migration767ConvertVoluntaryFlaws=_Migration767ConvertVoluntaryFlaws;const _Migration768AddNewAuras=class extends MigrationBase{static{__name(this,"_Migration768AddNewAuras")}constructor(){super(...arguments),__privateAdd(this,_auraOfLife,{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.feat-effects.FPuICuxBLiDaEbDX"}],key:"Aura",radius:15,slug:"aura-of-life"}),__privateAdd(this,_enlightenedPresence,{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.feat-effects.XM1AA8z5cHm8sJXM"}],key:"Aura",radius:15,slug:"enlightened-presence",traits:["emotion","mental"]}),__privateAdd(this,_eternalBlessing,[{domain:"all",key:"RollOption",option:"eternal-blessing-active",toggleable:!0,value:!0},{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.spell-effects.Gqy7K6FnbLtwGpud"}],key:"Aura",predicate:{all:["eternal-blessing-active"]},radius:15,slug:"eternal-blessing",traits:["enchantment","mental"]}]),__privateAdd(this,_marshalsAura,{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.feat-effects.Ru4BNABCZ0hUbX7S"}],key:"Aura",radius:10,slug:"marshals-aura",traits:["emotion","mental","visual"]})}async updateItem(source){if(!(source.type!=="feat"||source.system.rules.length>0))switch(source.system.slug){case"aura-of-life":source.system.rules=[deepClone(__privateGet(this,_auraOfLife))];break;case"enlightened-presence":source.system.rules=[deepClone(__privateGet(this,_enlightenedPresence))];break;case"eternal-blessing":source.system.rules=deepClone(__privateGet(this,_eternalBlessing));break;case"marshal-dedication":source.system.rules=[deepClone(__privateGet(this,_marshalsAura))];break}}};_auraOfLife=new WeakMap,_enlightenedPresence=new WeakMap,_eternalBlessing=new WeakMap,_marshalsAura=new WeakMap,__name2(_Migration768AddNewAuras,"Migration768AddNewAuras"),__publicField(_Migration768AddNewAuras,"version",.768);let Migration768AddNewAuras=_Migration768AddNewAuras;const _Migration769NoUniversalistFocusPool=class extends MigrationBase{static{__name(this,"_Migration769NoUniversalistFocusPool")}async updateItem(source){if(source.type==="feat"&&source.system.slug==="arcane-school"){const rule=source.system.rules.find(r=>r.key==="ActiveEffectLike"&&r.path==="system.resources.focus.max");rule&&(rule.predicate={not:["feature:universalist"]})}}};__name2(_Migration769NoUniversalistFocusPool,"Migration769NoUniversalistFocusPool"),__publicField(_Migration769NoUniversalistFocusPool,"version",.769);let Migration769NoUniversalistFocusPool=_Migration769NoUniversalistFocusPool;const _Migration770REDataToSystem=class extends MigrationBase{static{__name(this,"_Migration770REDataToSystem")}async updateActor(source){source.system=recursiveReplaceString(source.system,value=>value.replace(/@(actor|item)\.data\.data./g,"@$1.system.").replace(/@(actor|item)\.data./g,"@$1."))}async updateItem(source){source.system=recursiveReplaceString(source.system,value=>value.replace(/^data\.data\./,"system.").replace(/^data\./,"system.").replace(/"data\.data\./g,'"system.').replace(/"data\./g,'"system.').replace(/@(actor|item)\.data\.data./g,"@$1.system.").replace(/@(actor|item)\.data./g,"@$1.").replace(/\b(actor|item|rule)\|data\.data\./g,"$1|system.").replace(/\b(actor|item|rule)\|data\./g,"$1|system."))}};__name2(_Migration770REDataToSystem,"Migration770REDataToSystem"),__publicField(_Migration770REDataToSystem,"version",.77);let Migration770REDataToSystem=_Migration770REDataToSystem;const _Migration771SpellVariantsToSystem=class extends MigrationBase{static{__name(this,"_Migration771SpellVariantsToSystem")}async updateItem(source){if(source.type==="spell"){for(const overlayData of Object.values(source.system.overlays??{}))if(overlayData.overlayType==="override"){const maybeWithData=overlayData;maybeWithData.data&&(delete Object.assign(maybeWithData,{system:maybeWithData.data}).data,maybeWithData["-=data"]=null)}}}};__name2(_Migration771SpellVariantsToSystem,"Migration771SpellVariantsToSystem"),__publicField(_Migration771SpellVariantsToSystem,"version",.771);let Migration771SpellVariantsToSystem=_Migration771SpellVariantsToSystem;const _Migration772V10EmbeddedSpellData=class extends MigrationBase{static{__name(this,"_Migration772V10EmbeddedSpellData")}async preUpdateItem(source){if(source.type==="consumable"&&source.system.spell){const embeddedSpell=source.system.spell;embeddedSpell.data?.data?(source.system.spell=embeddedSpell.data,source.system.spell.system=embeddedSpell.data.data,source.system.spell.system.location.heightenedLevel=Number(embeddedSpell.data.heightenedLevel)||source.system.spell.system.level.value,embeddedSpell.data["-=data"]=null,delete embeddedSpell.data.data):embeddedSpell.data?.system?(source.system.spell=embeddedSpell.data,source.system.spell.system.location.heightenedLevel=Number(embeddedSpell.data.heightenedLevel)||source.system.spell.system.level.value):embeddedSpell.data===null&&(source.system.spell=null)}}};__name2(_Migration772V10EmbeddedSpellData,"Migration772V10EmbeddedSpellData"),__publicField(_Migration772V10EmbeddedSpellData,"version",.772);let Migration772V10EmbeddedSpellData=_Migration772V10EmbeddedSpellData;const _Migration773ReligiousSymbolUsage=class extends MigrationBase{static{__name(this,"_Migration773ReligiousSymbolUsage")}async updateItem(source){source.type==="equipment"&&source.system.slug?.startsWith("religious-symbol")&&(source.system.usage.value="held-in-one-hand")}};__name2(_Migration773ReligiousSymbolUsage,"Migration773ReligiousSymbolUsage"),__publicField(_Migration773ReligiousSymbolUsage,"version",.773);let Migration773ReligiousSymbolUsage=_Migration773ReligiousSymbolUsage;const _Migration774UnpersistCraftingEntries=class extends MigrationBase{static{__name(this,"_Migration774UnpersistCraftingEntries")}munitionsCrafterPredicate={all:["item:trait:alchemical"],any:["item:trait:bomb","item:subtype:ammo"]};async updateActor(source){if(source.type==="character"){const craftingData=source.system.crafting??{},craftingEntries=craftingData.entries??{},rules=source.items.flatMap(i=>i.system.rules);for(const rule of rules)rule.key!=="CraftingEntry"||typeof rule.selector!="string"||rule.selector.length===0||!rule.requiredTraits||(rule.preparedFormulas=craftingEntries[rule.selector]?.actorPreparedFormulas??[]);delete craftingData.entries,craftingData["-=entries"]=null}}async updateItem(source){const rules=source.system.rules,craftingEntryRules=rules.filter(r=>r.key==="CraftingEntry"&&Array.isArray(r.requiredTraits)),newCraftingEntryRules=craftingEntryRules.map(craftingEntryRule=>(craftingEntryRule.craftableItems=craftingEntryRule.selector==="munitionsCrafter"?this.munitionsCrafterPredicate:this.generatePredicateFromRequiredTraits(craftingEntryRule.requiredTraits||[]),delete craftingEntryRule.requiredTraits,craftingEntryRule));for(const craftingEntryRule of craftingEntryRules){const index=rules.indexOf(craftingEntryRule);rules.splice(index,1,newCraftingEntryRules.shift()),delete craftingEntryRule.requiredTraits}const craftingEntryAELikes=rules.filter(r=>r.key==="ActiveEffectLike"&&typeof r.path=="string"&&r.path.startsWith("system.crafting.entries.")),newCraftingEntryAELikes=craftingEntryAELikes.map(craftingEntryAELike=>(craftingEntryAELike.phase="beforeDerived",craftingEntryAELike));for(const craftingEntryAELike of craftingEntryAELikes){const index=rules.indexOf(craftingEntryAELike);rules.splice(index,1,newCraftingEntryAELikes.shift())}}generatePredicateFromRequiredTraits(requiredTraits){return requiredTraits.length===1?{all:requiredTraits[0].map(trait=>`item:trait:${trait}`)}:{any:requiredTraits.map(traits=>({and:traits.map(trait=>`item:trait:${trait}`)}))}}};__name2(_Migration774UnpersistCraftingEntries,"Migration774UnpersistCraftingEntries"),__publicField(_Migration774UnpersistCraftingEntries,"version",.774);let Migration774UnpersistCraftingEntries=_Migration774UnpersistCraftingEntries;const _Migration775AgileFinesseRanged=class extends MigrationBase{static{__name(this,"_Migration775AgileFinesseRanged")}constructor(){super(...arguments),__privateAdd(this,_findDamageDiceRE),__privateAdd(this,_isClassFeature4),__privateAdd(this,_athleticStrategist),__privateAdd(this,_deviseAStratagem),__privateAdd(this,_ruffianPredicate),__privateAdd(this,_sneakAttackPredicate)}async updateItem(source){switch(source.type){case"action":{if(source.system.slug==="sneak-attack"){const damageDiceRE=__privateMethod(this,_findDamageDiceRE,findDamageDiceRE_fn).call(this,source);isObject(damageDiceRE)&&damageDiceRE.predicate&&Array.isArray(damageDiceRE.predicate.all)&&damageDiceRE.predicate.all.some(s=>s instanceof Object&&"or"in s)&&(damageDiceRE.predicate=__privateGet(this,_sneakAttackPredicate,sneakAttackPredicate_get))}break}case"feat":switch(source.system.slug){case"athletic-strategist":{const index=source.system.rules.findIndex(r=>r.key==="FlatModifier");index!==-1&&(source.system.rules[index]=__privateGet(this,_athleticStrategist,athleticStrategist_get));break}case"devise-a-stratagem":{const index=source.system.rules.findIndex(r=>r.key==="FlatModifier");index!==-1&&(source.system.rules[index]=__privateGet(this,_deviseAStratagem,deviseAStratagem_get));break}case"ruffian":{const damageDiceRE=__privateMethod(this,_findDamageDiceRE,findDamageDiceRE_fn).call(this,source);damageDiceRE&&(damageDiceRE.predicate=__privateGet(this,_ruffianPredicate,ruffianPredicate_get));break}case"shadow-sneak-attack":case"sneak-attack":case"sneak-attacker":{const damageDiceRE=__privateMethod(this,_findDamageDiceRE,findDamageDiceRE_fn).call(this,source);if(damageDiceRE){const predicate=__privateGet(this,_sneakAttackPredicate,sneakAttackPredicate_get);__privateMethod(this,_isClassFeature4,isClassFeature_fn4).call(this,source)&&predicate.all?.unshift("class:rogue"),damageDiceRE.predicate=predicate}break}}}}};_findDamageDiceRE=new WeakSet,findDamageDiceRE_fn=__name2(function(source){return source.system.rules.find(r=>r.key==="DamageDice")??null},"#findDamageDiceRE"),_isClassFeature4=new WeakSet,isClassFeature_fn4=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),_athleticStrategist=new WeakSet,athleticStrategist_get=__name2(function(){return{ability:"int",key:"FlatModifier",predicate:{all:["class:investigator","devise-a-stratagem",{or:["action:disarm","action:grapple","action:shove","action:trip"]}],any:["weapon:trait:agile","weapon:trait:finesse",{and:["weapon:ranged",{not:"weapon:thrown-melee"}]},"weapon:base:sap"]},selector:"athletics",type:"ability"}},"#athleticStrategist"),_deviseAStratagem=new WeakSet,deviseAStratagem_get=__name2(function(){return{ability:"int",key:"FlatModifier",predicate:{all:["class:investigator","devise-a-stratagem"],any:["weapon:trait:agile","weapon:trait:finesse",{and:["weapon:ranged",{not:"weapon:thrown-melee"}]},"weapon:base:sap"]},selector:"attack-roll",type:"ability"}},"#deviseAStratagem"),_ruffianPredicate=new WeakSet,ruffianPredicate_get=__name2(function(){return{all:["target:condition:flat-footed","weapon:category:simple",{nor:[{and:["weapon:ranged",{not:"weapon:thrown-melee"}]},"weapon:trait:agile","weapon:trait:finesse"]}]}},"#ruffianPredicate"),_sneakAttackPredicate=new WeakSet,sneakAttackPredicate_get=__name2(function(){return{all:["target:condition:flat-footed"],any:["weapon:trait:agile","weapon:trait:finesse",{and:["weapon:ranged",{not:"weapon:thrown-melee"}]}]}},"#sneakAttackPredicate"),__name2(_Migration775AgileFinesseRanged,"Migration775AgileFinesseRanged"),__publicField(_Migration775AgileFinesseRanged,"version",.775);let Migration775AgileFinesseRanged=_Migration775AgileFinesseRanged;const _Migration776SlugifyConditionOverrides=class extends MigrationBase{static{__name(this,"_Migration776SlugifyConditionOverrides")}async updateItem(source){if(source.type!=="condition")return;const{system}=source;Array.isArray(system.overrides)&&system.overrides.every(o=>typeof o=="string")&&(system.overrides=system.overrides.map(o=>sluggify(o)))}};__name2(_Migration776SlugifyConditionOverrides,"Migration776SlugifyConditionOverrides"),__publicField(_Migration776SlugifyConditionOverrides,"version",.776);let Migration776SlugifyConditionOverrides=_Migration776SlugifyConditionOverrides;const _Migration777HandOfTheApprentice=class extends MigrationBase{static{__name(this,"_Migration777HandOfTheApprentice")}async updateItem(source){if(source.type==="feat"&&source.system.slug==="hand-of-the-apprentice"){const rule={key:"ActiveEffectLike",mode:"add",path:"system.resources.focus.max",value:1};source.system.rules=[rule]}}};__name2(_Migration777HandOfTheApprentice,"Migration777HandOfTheApprentice"),__publicField(_Migration777HandOfTheApprentice,"version",.777);let Migration777HandOfTheApprentice=_Migration777HandOfTheApprentice;const _Migration778RenameRetiredPackRefs=class extends MigrationBase{static{__name(this,"_Migration778RenameRetiredPackRefs")}async updateItem(source){const rename=__name2(text=>text.replace(/\bpf2e\.consumable-effects\b/g,"pf2e.equipment-effects").replace(/\bpf2e\.exploration-effects\b/g,"pf2e.other-effects").replace(/\bpf2e\.feature-effects\b/g,"pf2e.feat-effects").replace(/\bpf2e\.equipment-effects\.I9lfZUiCwMiGogVi\b/g,"pf2e.other-effects.I9lfZUiCwMiGogVi").replace(/\bpf2e\.equipment-effects\.Cover\b/g,"pf2e.other-effects.Effect: Cover"),"rename");source.system.rules=recursiveReplaceString(source.system.rules,rename),source.system.description=recursiveReplaceString(source.system.description,rename)}};__name2(_Migration778RenameRetiredPackRefs,"Migration778RenameRetiredPackRefs"),__publicField(_Migration778RenameRetiredPackRefs,"version",.778);let Migration778RenameRetiredPackRefs=_Migration778RenameRetiredPackRefs;const _Migration779EliteWeak=class extends MigrationBase{static{__name(this,"_Migration779EliteWeak")}async updateActor(source){if(!(source.type==="npc"&&source.system.traits.traits?.value))return;const traits=source.system.traits.traits,adjustment=traits.value.includes("elite")?"elite":traits.value.includes("weak")?"weak":null;adjustment&&(source.system.attributes.adjustment=adjustment,traits.value=traits.value.filter(trait=>trait!=="elite"&&trait!=="weak"))}};__name2(_Migration779EliteWeak,"Migration779EliteWeak"),__publicField(_Migration779EliteWeak,"version",.779);let Migration779EliteWeak=_Migration779EliteWeak;const _Migration780NumifySpeeds=class extends MigrationBase{static{__name(this,"_Migration780NumifySpeeds")}constructor(){super(...arguments),__privateAdd(this,_updateSpeed)}async updateActor(source){if(source.type!=="npc"&&source.type!=="character")return;const speeds=source.system.attributes.speed;speeds.value=__privateMethod(this,_updateSpeed,updateSpeed_fn).call(this,speeds.value),Array.isArray(speeds.otherSpeeds)||(speeds.otherSpeeds=[]);for(const movementType of speeds.otherSpeeds)movementType.value=__privateMethod(this,_updateSpeed,updateSpeed_fn).call(this,movementType.value)}};_updateSpeed=new WeakSet,updateSpeed_fn=__name2(function(speed){const numifiedValue=parseInt(String(speed),10);return Number.isNaN(numifiedValue)?25:numifiedValue},"#updateSpeed"),__name2(_Migration780NumifySpeeds,"Migration780NumifySpeeds"),__publicField(_Migration780NumifySpeeds,"version",.78);let Migration780NumifySpeeds=_Migration780NumifySpeeds;const _Migration781SuppressNoCrowbar=class extends MigrationBase{static{__name(this,"_Migration781SuppressNoCrowbar")}constructor(){super(...arguments),__privateAdd(this,_suppressNoCrowbar)}async updateItem(source){if(!source.system.slug)return;const isCrowbar=source.type==="equipment"&&/^crowbar(?:-levered)?$/.test(source.system.slug),isForcedEntry=source.type==="feat"&&source.system.slug==="forced-entry";(isCrowbar||isForcedEntry)&&!source.system.rules.some(r=>r.key==="AdjustModifier")&&source.system.rules.push(__privateGet(this,_suppressNoCrowbar,suppressNoCrowbar_get))}};_suppressNoCrowbar=new WeakSet,suppressNoCrowbar_get=__name2(function(){return{key:"AdjustModifier",selector:"athletics",slug:"no-crowbar",suppress:!0}},"#suppressNoCrowbar"),__name2(_Migration781SuppressNoCrowbar,"Migration781SuppressNoCrowbar"),__publicField(_Migration781SuppressNoCrowbar,"version",.781);let Migration781SuppressNoCrowbar=_Migration781SuppressNoCrowbar;const _Migration782UnnestActorTraits=class extends MigrationBase{static{__name(this,"_Migration782UnnestActorTraits")}async updateActor(source){const traits=source.system.traits;traits&&traits.traits&&Array.isArray(traits.traits.value)&&(traits.value=traits.traits.value,delete traits.traits,traits["-=traits"]=null)}};__name2(_Migration782UnnestActorTraits,"Migration782UnnestActorTraits"),__publicField(_Migration782UnnestActorTraits,"version",.782);let Migration782UnnestActorTraits=_Migration782UnnestActorTraits;const _Migration783RemoveClassSkillAELikes=class extends MigrationBase{static{__name(this,"_Migration783RemoveClassSkillAELikes")}async updateItem(source){source.type==="class"&&(source.system.rules=source.system.rules.filter(r=>!(r.key==="ActiveEffectLike"&&typeof r.path=="string"&&/^system.skills\.[a-z]{3}\.rank$/.test(r.path)&&r.value===1)))}};__name2(_Migration783RemoveClassSkillAELikes,"Migration783RemoveClassSkillAELikes"),__publicField(_Migration783RemoveClassSkillAELikes,"version",.783);let Migration783RemoveClassSkillAELikes=_Migration783RemoveClassSkillAELikes;const _Migration784CompBrowserPackSetting=class extends MigrationBase{static{__name(this,"_Migration784CompBrowserPackSetting")}async migrate(){const savedSettings=game.settings.get("pf2e","compendiumBrowserPacks");if(savedSettings instanceof String){const settings=JSON.parse(savedSettings.toString());await game.settings.set("pf2e","compendiumBrowserPacks",settings);const browser=game?.pf2e?.compendiumBrowser;browser&&(browser.settings=settings,browser.initCompendiumList())}}};__name2(_Migration784CompBrowserPackSetting,"Migration784CompBrowserPackSetting"),__publicField(_Migration784CompBrowserPackSetting,"version",.784);let Migration784CompBrowserPackSetting=_Migration784CompBrowserPackSetting;const _Migration785ABCKitItemUUIDs=class extends MigrationBase{static{__name(this,"_Migration785ABCKitItemUUIDs")}constructor(){super(...arguments),__privateAdd(this,_convertToUUIDs)}async updateItem(source){switch(source.type){case"ancestry":case"background":case"class":case"kit":__privateMethod(this,_convertToUUIDs,convertToUUIDs_fn).call(this,Object.values(source.system.items))}}};_convertToUUIDs=new WeakSet,convertToUUIDs_fn=__name2(function(references){for(const reference of references)reference.id&&reference.pack?reference.uuid=`Compendium.${reference.pack}.${reference.id}`:reference.id&&(reference.uuid=`Item.${reference.id}`),delete reference.id,delete reference.pack,reference["-=id"]=null,reference["-=pack"]=null,reference.items&&__privateMethod(this,_convertToUUIDs,convertToUUIDs_fn).call(this,Object.values(reference.items))},"#convertToUUIDs"),__name2(_Migration785ABCKitItemUUIDs,"Migration785ABCKitItemUUIDs"),__publicField(_Migration785ABCKitItemUUIDs,"version",.785);let Migration785ABCKitItemUUIDs=_Migration785ABCKitItemUUIDs;const _Migration786RemoveIdentifiedData=class extends MigrationBase{static{__name(this,"_Migration786RemoveIdentifiedData")}async updateItem(source){if(!isPhysicalData(source))return;const identification=source.system.identification??{};identification.identified&&(identification["-=identified"]=null)}};__name2(_Migration786RemoveIdentifiedData,"Migration786RemoveIdentifiedData"),__publicField(_Migration786RemoveIdentifiedData,"version",.786);let Migration786RemoveIdentifiedData=_Migration786RemoveIdentifiedData;const _Migration787ResolvablesToSystem=class extends MigrationBase{static{__name(this,"_Migration787ResolvablesToSystem")}async updateItem(source){source.system=recursiveReplaceString(source.system,value=>value.replace(/@(weapon|spell)\.data\.data./g,"@$1.system.").replace(/@(weapon|spell)\.data./g,"@$1."))}};__name2(_Migration787ResolvablesToSystem,"Migration787ResolvablesToSystem"),__publicField(_Migration787ResolvablesToSystem,"version",.787);let Migration787ResolvablesToSystem=_Migration787ResolvablesToSystem;const _Migration788UpdateTanglefootBags=class extends MigrationBase{static{__name(this,"_Migration788UpdateTanglefootBags")}constructor(){super(...arguments),__privateAdd(this,_getRules)}async updateItem(source){if(source.type==="weapon"&&source.system.slug?.startsWith("tanglefoot-bag-"))switch(source.system.damage.dice=0,source.system.slug){case"tanglefoot-bag-lesser":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Lesser");return}case"tanglefoot-bag-moderate":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Moderate");return}case"tanglefoot-bag-greater":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Greater");return}case"tanglefoot-bag-major":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Major");return}}}};_getRules=new WeakSet,getRules_fn=__name2(function(type){return[{key:"Note",outcome:["success"],selector:"{item|_id}-attack",text:`PF2E.BombNotes.TanglefootBag.${type}.success`,title:"TYPES.Item.effect"},{key:"Note",outcome:["criticalSuccess"],selector:"{item|_id}-attack",text:`PF2E.BombNotes.TanglefootBag.${type}.criticalSuccess`,title:"TYPES.Item.effect"}]},"#getRules"),__name2(_Migration788UpdateTanglefootBags,"Migration788UpdateTanglefootBags"),__publicField(_Migration788UpdateTanglefootBags,"version",.788);let Migration788UpdateTanglefootBags=_Migration788UpdateTanglefootBags;const _Migration789UpdatePreciseStrike=class extends MigrationBase{static{__name(this,"_Migration789UpdatePreciseStrike")}constructor(){super(...arguments),__privateAdd(this,_preciseStrikeRules),__privateAdd(this,_finishingPrecisionRules)}async updateItem(source){if(source.type==="feat"){if(source.system.slug==="precise-strike")source.system.rules=__privateGet(this,_preciseStrikeRules,preciseStrikeRules_get);else if(source.system.slug==="finishing-precision"){const rules=source.system.rules.filter(r=>r.key==="GrantItem");source.system.rules=[...rules,...__privateGet(this,_finishingPrecisionRules,finishingPrecisionRules_get)]}}}};_preciseStrikeRules=new WeakSet,preciseStrikeRules_get=__name2(function(){return[{domain:"damage-roll",key:"RollOption",label:"PF2E.SpecificRule.PreciseStrike.Finisher",option:"finisher",toggleable:!0},{damageCategory:"precision",key:"FlatModifier",predicate:{all:["class:swashbuckler","self:effect:panache",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"],not:["finisher"]},selector:"strike-damage",slug:"precise-strike",value:{brackets:[{end:4,value:2},{end:8,start:5,value:3},{end:12,start:9,value:4},{end:16,start:13,value:5},{start:17,value:6}]}},{category:"precision",dieSize:"d6",key:"DamageDice",predicate:{all:["class:swashbuckler","self:effect:panache","finisher",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"]},selector:"strike-damage",slug:"finisher",value:{brackets:[{end:4,value:{diceNumber:2}},{end:8,start:5,value:{diceNumber:3}},{end:12,start:9,value:{diceNumber:4}},{end:16,start:13,value:{diceNumber:5}},{start:17,value:{diceNumber:6}}]}}]},"#preciseStrikeRules"),_finishingPrecisionRules=new WeakSet,finishingPrecisionRules_get=__name2(function(){return[{damageCategory:"precision",key:"FlatModifier",predicate:{all:["self:effect:panache",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"],not:["finisher"]},selector:"strike-damage",slug:"finishing-precision",value:1},{category:"precision",diceNumber:1,dieSize:"d6",key:"DamageDice",predicate:{all:["self:effect:panache","finisher",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"]},selector:"strike-damage",slug:"finishing-precision"}]},"#finishingPrecisionRules"),__name2(_Migration789UpdatePreciseStrike,"Migration789UpdatePreciseStrike"),__publicField(_Migration789UpdatePreciseStrike,"version",.789);let Migration789UpdatePreciseStrike=_Migration789UpdatePreciseStrike;const _Migration790MultipleClassDCs=class extends MigrationBase{static{__name(this,"_Migration790MultipleClassDCs")}constructor(){super(...arguments),__privateAdd(this,_isClassFeature5),__privateAdd(this,_otherClassDCs,new Map([["call-implement","thaumaturge"],["eerie-proclamation","ranger"],["stunning-fist","monk"],["ring-bell","thaumaturge"]]))}async updateActor(source){if(source.type!=="character")return;const customModifiers=source.system.customModifiers??{};customModifiers?.class&&(customModifiers["-=class"]=null)}async updateItem(source){if(__privateMethod(this,_isClassFeature5,isClassFeature_fn5).call(this,source)){const classSlug=source.system.traits.value.at(0);if(!classSlug)return;const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike");for(const aeLike of aeLikes)aeLike.path==="system.attributes.classDC.rank"&&(aeLike.path=`system.proficiencies.classDCs.${classSlug}.rank`)}const itemSlug=source.system.slug??"";if(__privateGet(this,_otherClassDCs).has(itemSlug)){const oldClassDCPattern=/\bsystem\.attributes\.classDC\b/,classSlug=__privateGet(this,_otherClassDCs).get(itemSlug),{description}=source.system;description.value=description.value.replace(oldClassDCPattern,`system.proficiencies.classDCs.${classSlug}`);const notes=source.system.rules.filter(r=>r.key==="Note"&&typeof r.text=="string");for(const note of notes)note.text=note.text.replace(oldClassDCPattern,`system.proficiencies.classDCs.${classSlug}`)}}};_otherClassDCs=new WeakMap,_isClassFeature5=new WeakSet,isClassFeature_fn5=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration790MultipleClassDCs,"Migration790MultipleClassDCs"),__publicField(_Migration790MultipleClassDCs,"version",.79);let Migration790MultipleClassDCs=_Migration790MultipleClassDCs;const _Migration791RuffianHands=class extends MigrationBase{static{__name(this,"_Migration791RuffianHands")}constructor(){super(...arguments),__privateAdd(this,_critSpec),__privateAdd(this,_hands)}async updateItem(source){if(!(source.type!=="feat"||!source.system.slug))switch(source.system.slug){case"ruffian":{source.system.rules.some(r=>r.key==="CriticalSpecialization")||source.system.rules.push(__privateGet(this,_critSpec,critSpec_get));break}case"healing-hands":{const hands=__privateGet(this,_hands,hands_get);hands.predicate={all:["item:slug:heal"]},source.system.rules=[hands];break}case"harming-hands":{const hands=__privateGet(this,_hands,hands_get);hands.predicate={all:["item:slug:harm"]},source.system.rules=[hands];break}}}};_critSpec=new WeakSet,critSpec_get=__name2(function(){return{key:"CriticalSpecialization",predicate:{all:["target:condition:flat-footed","weapon:category:simple",{lte:["weapon:damage:die:faces",8]}]}}},"#critSpec"),_hands=new WeakSet,hands_get=__name2(function(){return{key:"DamageDice",override:{dieSize:"d10"},selector:"spell-damage"}},"#hands"),__name2(_Migration791RuffianHands,"Migration791RuffianHands"),__publicField(_Migration791RuffianHands,"version",.791);let Migration791RuffianHands=_Migration791RuffianHands;const _Migration792RemoveTokenAELikes=class extends MigrationBase{static{__name(this,"_Migration792RemoveTokenAELikes")}async updateItem(source){const rules=source.system.rules;for(const rule of[...rules])rule.key==="ActiveEffectLike"&&typeof rule.path=="string"&&/^token\./.test(rule.path)&&rules.splice(rules.indexOf(rule),1)}};__name2(_Migration792RemoveTokenAELikes,"Migration792RemoveTokenAELikes"),__publicField(_Migration792RemoveTokenAELikes,"version",.792);let Migration792RemoveTokenAELikes=_Migration792RemoveTokenAELikes;const _Migration793MakePredicatesArrays=class extends MigrationBase{static{__name(this,"_Migration793MakePredicatesArrays")}constructor(){super(...arguments),__privateAdd(this,_convertLegacyData),__privateAdd(this,_isOldRawPredicate),__privateAdd(this,_isArrayChoiceSet),__privateAdd(this,_isObjectChoiceSet)}async updateActor(source){if("customModifiers"in source.system){isObject(source.system.customModifiers)||(source.system.customModifiers={});for(const modifier of Object.values(source.system.customModifiers).flat())modifier.predicate&&=[]}}async updateItem(source){const rules=source.system.rules;for(const rule of rules){if(__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.predicate)&&(rule.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.predicate)),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.definition)&&(rule.definition=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.definition)),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.allowedDrops)&&(rule.allowedDrops={label:rule.allowedDrops.label??void 0,predicate:__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.allowedDrops)}),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.predicate)&&(rule.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.predicate)),__privateMethod(this,_isArrayChoiceSet,isArrayChoiceSet_fn).call(this,rule))for(const choice of rule.choices)__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,choice.predicate)&&(choice.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,choice.predicate));else __privateMethod(this,_isObjectChoiceSet,isObjectChoiceSet_fn).call(this,rule)?(__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.choices.predicate)&&(rule.choices.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.choices.predicate)),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.choices.postFilter)&&(rule.choices.postFilter=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.choices.postFilter))):__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.craftableItems)&&(rule.craftableItems=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.craftableItems));__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.disabledIf)&&(rule.disabledIf=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.disabledIf))}}};_convertLegacyData=new WeakSet,convertLegacyData_fn=__name2(function(predicate){const keys2=Object.keys(predicate);return keys2.length===0?[]:keys2.length===1&&Array.isArray(predicate.all)?deepClone(predicate.all):keys2.length===1&&Array.isArray(predicate.any)&&predicate.any.length===1?deepClone(predicate.any):deepClone([predicate.all??[],Array.isArray(predicate.any)?{or:predicate.any}:[],Array.isArray(predicate.not)?predicate.not.length===1?{not:predicate.not[0]}:{nor:predicate.not}:[]].flat())},"#convertLegacyData"),_isOldRawPredicate=new WeakSet,isOldRawPredicate_fn=__name2(function(predicate){return!predicate||Array.isArray(predicate)||isObject(predicate)&&Array.isArray(predicate.predicate)?!1:predicate instanceof Object},"#isOldRawPredicate"),_isArrayChoiceSet=new WeakSet,isArrayChoiceSet_fn=__name2(function(rule){return rule.key==="ChoiceSet"&&Array.isArray(rule.choices)},"#isArrayChoiceSet"),_isObjectChoiceSet=new WeakSet,isObjectChoiceSet_fn=__name2(function(rule){return rule.key==="ChoiceSet"&&isObject(rule.choices)&&!Array.isArray(rule.choices)},"#isObjectChoiceSet"),__name2(_Migration793MakePredicatesArrays,"Migration793MakePredicatesArrays"),__publicField(_Migration793MakePredicatesArrays,"version",.793);let Migration793MakePredicatesArrays=_Migration793MakePredicatesArrays;const _Migration794AddWildShapeChoices=class extends MigrationBase{static{__name(this,"_Migration794AddWildShapeChoices")}constructor(){super(...arguments),__privateAdd(this,_shapeFeats,new Set(["VaIHQzOE5ibmbtqU","OWedlrKGsVZVkSnT","wNHUryoRzlfDCFAd","F0MYBfiyOD8YHq5t","I9rSWQyueWHQyNxe","p0jZhb8PSswUsZaz","Le30algCdKIsxmeK","54JzsYCx3uoj7Wlz"].map(id=>`Compendium.pf2e.feats-srd.${id}`)))}async updateItem(source){const sourceId=source.flags.core?.sourceId;if(source.type==="feat"&&sourceId&&__privateGet(this,_shapeFeats).has(sourceId)){const fromPack=await fromUuid(sourceId);fromPack instanceof FeatPF2e&&(source.system.rules=fromPack.toObject().system.rules)}}};_shapeFeats=new WeakMap,__name2(_Migration794AddWildShapeChoices,"Migration794AddWildShapeChoices"),__publicField(_Migration794AddWildShapeChoices,"version",.794);let Migration794AddWildShapeChoices=_Migration794AddWildShapeChoices;const _Migration795CleanupFlatFootedToggle=class extends MigrationBase{static{__name(this,"_Migration795CleanupFlatFootedToggle")}constructor(){super(...arguments),__privateAdd(this,_flatFootedToggle),__privateAdd(this,_isFlatFootedToggle)}async updateActor(source){source.flags.pf2e?.rollOptions&&(source.flags.pf2e["-=rollOptions"]=null)}async updateItem(source){if(source.type==="feat"||source.type==="action"&&source.system.slug==="sneak-attack")switch(source.system.slug){case"sneak-attack":case"laughing-shadow":case"shadow-sneak-attack":case"butterflys-sting":case"game-hunter-dedication":source.system.rules.some(r=>__privateMethod(this,_isFlatFootedToggle,isFlatFootedToggle_fn).call(this,r))||source.system.rules.push(__privateGet(this,_flatFootedToggle,flatFootedToggle_get))}}};_flatFootedToggle=new WeakSet,flatFootedToggle_get=__name2(function(){return{key:"RollOption",domain:"all",label:"PF2E.SpecificRule.TOTMToggle.FlatFooted",option:"target:condition:flat-footed",toggleable:"totm"}},"#flatFootedToggle"),_isFlatFootedToggle=new WeakSet,isFlatFootedToggle_fn=__name2(function(rule){return rule.key==="RollOption"&&rule.option==="target:condition:flat-footed"&&rule.toggleable==="totm"},"#isFlatFootedToggle"),__name2(_Migration795CleanupFlatFootedToggle,"Migration795CleanupFlatFootedToggle"),__publicField(_Migration795CleanupFlatFootedToggle,"version",.795);let Migration795CleanupFlatFootedToggle=_Migration795CleanupFlatFootedToggle;const _Migration796ItemGrantsToObjects=class extends MigrationBase{static{__name(this,"_Migration796ItemGrantsToObjects")}constructor(){super(...arguments),__privateAdd(this,_convertToEntry),__privateAdd(this,_modifyFlag)}async updateActor(source){for(const item of source.items){const systemFlags=item.flags.pf2e;!systemFlags?.itemGrants||!Array.isArray(systemFlags.itemGrants)||(systemFlags.itemGrants=systemFlags.itemGrants.reduce((grantsObject,grant)=>{if(typeof grant=="string"||grant instanceof Object){const[flag,grantSource]=__privateMethod(this,_convertToEntry,convertToEntry_fn).call(this,source,item,grant);if(flag!==null){const modifiedFlag=__privateMethod(this,_modifyFlag,modifyFlag_fn).call(this,grantsObject,flag);grantsObject[modifiedFlag]=grantSource}}return grantsObject},{}))}}};_convertToEntry=new WeakSet,convertToEntry_fn=__name2(function(actor,granter,grantedData){const grantedId=grantedData instanceof Object?grantedData.id:grantedData;return actor.items.some(i=>i._id===grantedId)?[sluggify(granter.name,{camel:"dromedary"}),{id:grantedId}]:[null,null]},"#convertToEntry"),_modifyFlag=new WeakSet,modifyFlag_fn=__name2(function(grantedItems,flag){const pattern=new RegExp(`^${flag}\\d*$`),nthGrant=Object.keys(grantedItems).filter(g=>pattern.test(g)).length;return nthGrant===0?flag:`${flag}${nthGrant+1}`},"#modifyFlag"),__name2(_Migration796ItemGrantsToObjects,"Migration796ItemGrantsToObjects"),__publicField(_Migration796ItemGrantsToObjects,"version",.796);let Migration796ItemGrantsToObjects=_Migration796ItemGrantsToObjects;const _Migration797MetagameSetting=class extends MigrationBase{static{__name(this,"_Migration797MetagameSetting")}visibilitySettings=["showDC","showResults"];settings=[...this.visibilitySettings,"tokenSetsNameVisibility","secretDamage","secretCondition","partyVision"];async migrate(){for(const setting of this.settings){const storage=game.settings.storage.get("world"),newKey=`metagame_${setting}`,oldValue=storage.getItem(`pf2e.metagame.${setting}`)??null,existingValueRaw=storage.getItem(`pf2e.${newKey}`)??null;if(oldValue!==null&&existingValueRaw!==null){const newValue=this.visibilitySettings.includes(setting)?!["gm","owner"].includes(oldValue):oldValue;game.settings.set("pf2e",newKey,newValue)}}}};__name2(_Migration797MetagameSetting,"Migration797MetagameSetting"),__publicField(_Migration797MetagameSetting,"version",.797);let Migration797MetagameSetting=_Migration797MetagameSetting;const _Migration798WeaponToItemStatements=class extends MigrationBase{static{__name(this,"_Migration798WeaponToItemStatements")}async updateItem(source){const rules=source.system.rules;for(const rule of rules)for(const property of["predicate","definition"]){const predicate=rule[property];Array.isArray(predicate)&&(rule[property]=recursiveReplaceString(predicate,s=>s.replace(/^weapon:/,"item:")))}}};__name2(_Migration798WeaponToItemStatements,"Migration798WeaponToItemStatements"),__publicField(_Migration798WeaponToItemStatements,"version",.798);let Migration798WeaponToItemStatements=_Migration798WeaponToItemStatements;const _Migration799RMRecallKnowledgeDuplicates=class extends MigrationBase{static{__name(this,"_Migration799RMRecallKnowledgeDuplicates")}constructor(){super(...arguments),__privateAdd(this,_oldIdsPattern,new RegExp("pf2e\\.actionspf2e\\.(?:".concat(["KygTSeDvsFoSO6HW","B0Eu3EfwIa9kyDEA","SeUolRoPzorFUAaI","eT1jXYvz2YH70Ovp","B2BpIZFHoF9Kjzpx","LZgjpWd0pL3vK9Q1","KUfLlXDWTcAWhl8l"].join("|")).concat(")"),"g"))}async updateItem(source){source.system.description.value??="",source.system.description.value=source.system.description.value.replace(__privateGet(this,_oldIdsPattern),"pf2e.actionspf2e.1OagaWtBpVXExToo")}};_oldIdsPattern=new WeakMap,__name2(_Migration799RMRecallKnowledgeDuplicates,"Migration799RMRecallKnowledgeDuplicates"),__publicField(_Migration799RMRecallKnowledgeDuplicates,"version",.799);let Migration799RMRecallKnowledgeDuplicates=_Migration799RMRecallKnowledgeDuplicates;const _Migration800SelfEffectPanacheRage=class extends MigrationBase{static{__name(this,"_Migration800SelfEffectPanacheRage")}async updateItem(source,actorSource){if(!(actorSource?._id==="bpTQfx4UixMV3Fja"||actorSource?.flags.core?.sourceId==="Compendium.pf2e.extinction-curse-bestiary.Actor.bpTQfx4UixMV3Fja"))for(const rule of source.system.rules)rule.predicate&&Array.isArray(rule.predicate)&&(rule.predicate=recursiveReplaceString(rule.predicate,s=>s.replace(/^(rage|panache)$/,"self:effect:$1")))}};__name2(_Migration800SelfEffectPanacheRage,"Migration800SelfEffectPanacheRage"),__publicField(_Migration800SelfEffectPanacheRage,"version",.8);let Migration800SelfEffectPanacheRage=_Migration800SelfEffectPanacheRage;const _Migration801ColorDarkvision=class extends MigrationBase{static{__name(this,"_Migration801ColorDarkvision")}constructor(){super(...arguments),__privateAdd(this,_colorDarkvision)}async updateItem(source){if(!source.system.slug)return;const isFetchling=source.type==="ancestry"&&source.system.slug==="fetchling",isResonantLight=source.type==="feat"&&source.system.slug==="resonant-reflection-reflection-of-light",getsColorDarkvision=isFetchling||isResonantLight,rules=source.system.rules;getsColorDarkvision&&!rules.some(r=>r.path==="flags.pf2e.colorDarkvision")&&source.system.rules.push(__privateGet(this,_colorDarkvision,colorDarkvision_get))}};_colorDarkvision=new WeakSet,colorDarkvision_get=__name2(function(){return{key:"ActiveEffectLike",path:"flags.pf2e.colorDarkvision",mode:"override",value:!0}},"#colorDarkvision"),__name2(_Migration801ColorDarkvision,"Migration801ColorDarkvision"),__publicField(_Migration801ColorDarkvision,"version",.801);let Migration801ColorDarkvision=_Migration801ColorDarkvision;const _Migration802StripFeatActionCategory=class extends MigrationBase{static{__name(this,"_Migration802StripFeatActionCategory")}async updateItem(source){if(source.type!=="feat")return;const feat=source.system;feat.actionCategory&&(delete feat.actionCategory,feat["-=actionCategory"]=null)}};__name2(_Migration802StripFeatActionCategory,"Migration802StripFeatActionCategory"),__publicField(_Migration802StripFeatActionCategory,"version",.802);let Migration802StripFeatActionCategory=_Migration802StripFeatActionCategory;const _Migration803NormalizeSpellArea=class extends MigrationBase{static{__name(this,"_Migration803NormalizeSpellArea")}constructor(){super(...arguments),__privateAdd(this,_isAreaType),__privateAdd(this,_hasDetails),__privateAdd(this,_AREA_TYPES,new Set(["burst","cone","cube","emanation","line","square"]))}async updateItem(source){if(source.type!=="spell")return;const area=source.system.area;area&&(area.value=Number(area.value),"areaType"in area&&__privateMethod(this,_isAreaType,isAreaType_fn).call(this,area.areaType)&&(area.type=area.areaType,delete area.areaType,area["-=areaType"]=null)),area?.value&&__privateMethod(this,_isAreaType,isAreaType_fn).call(this,area.type)||(source.system.area=null),"areasize"in source.system&&isObject(source.system.areasize)&&(__privateMethod(this,_hasDetails,hasDetails_fn).call(this,source.system.areasize.value)&&area&&(area.details=source.system.areasize.value),delete source.system.areasize,source.system["-=areasize"]=null)}};_AREA_TYPES=new WeakMap,_isAreaType=new WeakSet,isAreaType_fn=__name2(function(areaType){return typeof areaType=="string"&&areaType.length>0&&__privateGet(this,_AREA_TYPES).has(areaType)},"#isAreaType"),_hasDetails=new WeakSet,hasDetails_fn=__name2(function(details){return typeof details=="string"&&details.trim().length>0&&!/^\d+-foot (?:burst|cone|cube|emanation|line|square)$/.test(details)},"#hasDetails"),__name2(_Migration803NormalizeSpellArea,"Migration803NormalizeSpellArea"),__publicField(_Migration803NormalizeSpellArea,"version",.803);let Migration803NormalizeSpellArea=_Migration803NormalizeSpellArea;const _Migration804RemoveConsumableProperties=class extends MigrationBase{static{__name(this,"_Migration804RemoveConsumableProperties")}async updateItem(source){if(source.type!=="consumable")return;const system=source.system;system.uses&&(delete system.uses,system["-=uses"]=null),system.autoUse&&(delete system.autoUse,system["-=autoUse"]=null),"_deprecated"in system.charges&&(delete system.charges._deprecated,system.charges["-=deprecated"]=null),"_deprecated"in system.consume&&(delete system.consume._deprecated,system.consume["-=deprecated"]=null)}};__name2(_Migration804RemoveConsumableProperties,"Migration804RemoveConsumableProperties"),__publicField(_Migration804RemoveConsumableProperties,"version",.804);let Migration804RemoveConsumableProperties=_Migration804RemoveConsumableProperties;const _Migration805InlineDamageRolls=class extends MigrationBase{static{__name(this,"_Migration805InlineDamageRolls")}constructor(){super(...arguments),__privateAdd(this,_updateDamageFormula),__privateAdd(this,_pattern,/\[\[\/r .+?\]\]\]?(?:\{[^}]+\})?/g),__privateAdd(this,_damageTypeLabelPattern,(()=>{const dicePattern="[0-9]{1,2}d[0-9]{1,2}(?:\\s*[-+]\\s*[0-9]{1,3})?",typesUnion=["acid","bleed","bludgeoning","chaotic","cold","electricity","evil","fire","force","good","lawful","mental","negative","piercing","poison","positive","slashing","sonic","untyped"].join("|");return new RegExp(`^${dicePattern} (?:${typesUnion})(?: damage)?$`,"i")})())}async updateActor(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula,updateDamageFormula_fn).call(this,s))}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula,updateDamageFormula_fn).call(this,s))}async updateJournalEntry(source){source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_updateDamageFormula,updateDamageFormula_fn).call(this,s))}};_pattern=new WeakMap,_damageTypeLabelPattern=new WeakMap,_updateDamageFormula=new WeakSet,updateDamageFormula_fn=__name2(function(text){const skipStrings=["splash","precision","persistent","d20","#"];return text.replace(__privateGet(this,_pattern),match=>{const labelEndsWithDamage=match.toLowerCase().endsWith("damage}");if(skipStrings.some(s=>match.includes(s)))return match;const customLabel=/\{([^}]+)\}$/.exec(match)?.at(1),expressions=match.replace(/\{[^}]+\}$/,"").match(/\{[^}]+\}\[\w+\]/g)??[];if(expressions.length===0)return match;const instances=expressions.map(i=>i.trim().replace(/^\{([^}]+)\}\[([a-z]+)\]$/i,["+","-","*","/"].some(o=>i.includes(o))?"($1)[$2]":"$1[$2]").toLowerCase()),reassembled=instances.length===1?`[[/r ${instances[0]}]]`:`[[/r {${instances.join(",")}}]]`;return customLabel&&!__privateGet(this,_damageTypeLabelPattern).test(customLabel)?`${reassembled}{${customLabel}}`:labelEndsWithDamage?`${reassembled} damage`:reassembled})},"#updateDamageFormula"),__name2(_Migration805InlineDamageRolls,"Migration805InlineDamageRolls"),__publicField(_Migration805InlineDamageRolls,"version",.805);let Migration805InlineDamageRolls=_Migration805InlineDamageRolls;const _Migration806TorchImprovisedOtherTags=class extends MigrationBase{static{__name(this,"_Migration806TorchImprovisedOtherTags")}async updateItem(source){if(source.type==="equipment"&&source.system.slug==="torch"){const torchStrikeRE=source.system.rules.find(r=>r.key==="Strike"&&r.otherTags===void 0);torchStrikeRE&&(delete torchStrikeRE.traits,torchStrikeRE.otherTags=["improvised"])}}};__name2(_Migration806TorchImprovisedOtherTags,"Migration806TorchImprovisedOtherTags"),__publicField(_Migration806TorchImprovisedOtherTags,"version",.806);let Migration806TorchImprovisedOtherTags=_Migration806TorchImprovisedOtherTags;const _Migration807RMActivatedEffectFields=class extends MigrationBase{static{__name(this,"_Migration807RMActivatedEffectFields")}async updateItem(source){if(source.type==="consumable")for(const property of["activation","duration","range","target","uses"])property in source.system&&(delete source.system[property],source.system[`-=${property}`]=null)}};__name2(_Migration807RMActivatedEffectFields,"Migration807RMActivatedEffectFields"),__publicField(_Migration807RMActivatedEffectFields,"version",.807);let Migration807RMActivatedEffectFields=_Migration807RMActivatedEffectFields;const _Migration808CountDamageDice=class extends MigrationBase{static{__name(this,"_Migration808CountDamageDice")}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>s.replace(/\(?\b1\s*\+\s*@(item|weapon)(?:.system)?.runes.striking\)?/g,"@$1.system.damage.dice"))}};__name2(_Migration808CountDamageDice,"Migration808CountDamageDice"),__publicField(_Migration808CountDamageDice,"version",.808);let Migration808CountDamageDice=_Migration808CountDamageDice;const _Migration809AutomatonEnhancements=class extends MigrationBase{static{__name(this,"_Migration809AutomatonEnhancements")}constructor(){super(...arguments),__privateAdd(this,_automatonEnhancements)}async updateItem(source){const isAutomaton=source.type==="ancestry"&&source.system.slug==="automaton",rules=source.system.rules;isAutomaton&&!rules.some(r=>r.path==="flags.pf2e.automaton.enhancements")&&source.system.rules.push(__privateGet(this,_automatonEnhancements,automatonEnhancements_get))}};_automatonEnhancements=new WeakSet,automatonEnhancements_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.automaton.enhancements",priority:10,value:{greater:[],lesser:[]}}},"#automatonEnhancements"),__name2(_Migration809AutomatonEnhancements,"Migration809AutomatonEnhancements"),__publicField(_Migration809AutomatonEnhancements,"version",.809);let Migration809AutomatonEnhancements=_Migration809AutomatonEnhancements;const _Migration810LootDescriptionValue=class extends MigrationBase{static{__name(this,"_Migration810LootDescriptionValue")}async updateActor(source){if(source.type==="loot"){const details=source.system.details;details.description instanceof Object&&(details.description=String(details.description.value??""))}}};__name2(_Migration810LootDescriptionValue,"Migration810LootDescriptionValue"),__publicField(_Migration810LootDescriptionValue,"version",.81);let Migration810LootDescriptionValue=_Migration810LootDescriptionValue;const _Migration811InlineDamageRollsPersistent=class extends MigrationBase{static{__name(this,"_Migration811InlineDamageRollsPersistent")}constructor(){super(...arguments),__privateAdd(this,_updateDamageFormula2),__privateAdd(this,_conditionPattern,/(?<=\]\]|})(\s*@(?:UUID|Compendium)\[(?:Compendium\.)?pf2e\.conditionitems\.(?:Persistent Damage|lDVqvLKA6eF3Df60)\]\{[^}]+})/g),__privateAdd(this,_pattern2,/\[\[\/r ([^[\]]+(\[.*?\])?)\]\](\{\dd\d[^{}]*\})?/g)}async updateActor(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula2,updateDamageFormula_fn2).call(this,s))}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula2,updateDamageFormula_fn2).call(this,s))}async updateJournalEntry(source){source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_updateDamageFormula2,updateDamageFormula_fn2).call(this,s))}};_conditionPattern=new WeakMap,_pattern2=new WeakMap,_updateDamageFormula2=new WeakSet,updateDamageFormula_fn2=__name2(function(text){return text.replace(__privateGet(this,_conditionPattern)," damage").replace(__privateGet(this,_pattern2),(match,formula)=>{if(!match.includes("persistent"))return match;const hashStyle=formula.match(/([^#]+)#\s*persistent ([^#]+)/);if(hashStyle){const expression=hashStyle[1].trim(),damageType=hashStyle[2].trim(),expressionCleaned=["+","-","*","/"].some(o=>expression.includes(o))?`(${expression})`:expression;return match.replace(formula,`${expressionCleaned}[persistent,${damageType}]`)}const expressions=formula.match(/\{[^}]+\}\[[\w,]+\]/g)??[];if(expressions.length){const withoutLabel=match.replace(/\{\dd\d[^{}]*\}$/,""),instances=expressions.map(i=>i.replace(/^\{([^}]+)\}\[([a-z,]+)\]$/,["+","-","*","/"].some(o=>i.includes(o))?"($1)[$2]":"$1[$2]")),reassembled=instances.length===1?instances[0]:`{${instances.join(",")}}`;return withoutLabel.replace(formula,reassembled)}return match})},"#updateDamageFormula"),__name2(_Migration811InlineDamageRollsPersistent,"Migration811InlineDamageRollsPersistent"),__publicField(_Migration811InlineDamageRollsPersistent,"version",.811);let Migration811InlineDamageRollsPersistent=_Migration811InlineDamageRollsPersistent;const _Migration812RestructureIWR=class extends MigrationBase{static{__name(this,"_Migration812RestructureIWR")}constructor(){super(...arguments),__privateAdd(this,_getWR),__privateAdd(this,_parseExceptions),__privateAdd(this,_normalizeType),__privateAdd(this,_oldENmappings,{"PF2E.ResistanceException.Bludgeoning":"except bludgeoning","PF2E.ResistanceException.ForceGhostTouchDoubleNonMagical":"except force, or ghost touch; double resistance vs. non-magical","PF2E.ResistanceException.ForceGhostTouchNegativeDoubleNonMagical":"except force, ghost touch, or negative; double resistance vs. non-magical","PF2E.ResistanceException.ForceGhostTouchPositiveDoubleNonMagical":"except force, ghost touch, or positive; double resistance vs. non-magical"})}async updateActor(source){const traits=source.system.traits;if(!traits||source.type==="familiar")return;const{attributes}=source.system;if("ci"in traits&&("game"in globalThis||delete traits.ci,traits["-=ci"]=null),"di"in traits){const oldData=traits.di;if("game"in globalThis||delete traits.di,traits["-=di"]=null,isObject(oldData)&&"value"in oldData&&Array.isArray(oldData.value)&&oldData.value.length>0){const immunities=oldData.value.map(i=>__privateMethod(this,_normalizeType,normalizeType_fn).call(this,String(i))).filter(i=>setHasElement(IMMUNITY_TYPES,i)).map(i=>({type:i}));immunities.length>0&&(attributes.immunities=immunities)}}if("dv"in traits){const oldData=traits.dv;if("game"in globalThis||delete traits.dv,traits["-=dv"]=null,Array.isArray(oldData)&&oldData.length>0){const weaknesses=__privateMethod(this,_getWR,getWR_fn).call(this,oldData,WEAKNESS_TYPES).map(data=>{const weakness=pick(data,["type","value"]),exceptions=__privateMethod(this,_parseExceptions,parseExceptions_fn).call(this,String(data.exceptions??"")).exceptions.filter(e=>setHasElement(WEAKNESS_TYPES,e));return exceptions.length>0&&(weakness.exceptions=exceptions),weakness});weaknesses.length>0&&(attributes.weaknesses=weaknesses)}}if("dr"in traits){const oldData=traits.dr;if("game"in globalThis||delete traits.dr,traits["-=dr"]=null,Array.isArray(oldData)&&oldData.length>0){const resistances=__privateMethod(this,_getWR,getWR_fn).call(this,oldData,RESISTANCE_TYPES).map(data=>{const resistance=pick(data,["type","value"]),parsed=__privateMethod(this,_parseExceptions,parseExceptions_fn).call(this,String(data.exceptions??"")),exceptions=parsed.exceptions.filter(e=>setHasElement(RESISTANCE_TYPES,e));exceptions.length>0&&(resistance.exceptions=exceptions);const doubleVs=parsed.doubleVs.filter(e=>setHasElement(RESISTANCE_TYPES,e));return doubleVs.length>0&&(resistance.doubleVs=doubleVs),resistance});resistances.length>0&&(attributes.resistances=resistances)}}}async updateItem(source){if(source.type==="weapon"){const material=source.system.preciousMaterial??{};material.value=typeof material.value=="string"?sluggify(material.value):null,source.system.preciousMaterialGrade&&(source.system.preciousMaterialGrade.value||=null)}const iwrREs=source.system.rules.filter(r=>typeof r.key=="string"&&["Immunity","Weakness","Resistance"].includes(r.key)&&"type"in r&&typeof r.type=="string");for(const rule of iwrREs)if(rule.type=rule.type.startsWith("{")?rule.type:__privateMethod(this,_normalizeType,normalizeType_fn).call(this,rule.type),typeof rule.except=="string"){const exceptions=__privateMethod(this,_parseExceptions,parseExceptions_fn).call(this,rule.except).exceptions.filter(exception=>rule.key==="Immunity"?setHasElement(IMMUNITY_TYPES,exception):rule.key==="Weakness"?setHasElement(WEAKNESS_TYPES,exception):setHasElement(RESISTANCE_TYPES,exception));exceptions.length>0&&(rule.exceptions=exceptions),delete rule.except}const adjustStrikeREs=source.system.rules.filter(r=>r.key==="AdjustStrike"&&typeof r.value=="string");for(const rule of adjustStrikeREs)rule.value=rule.value.startsWith("{")||["property-runes","weapon-traits"].includes(rule.property)?rule.value:__privateMethod(this,_normalizeType,normalizeType_fn).call(this,rule.value)}};_getWR=new WeakSet,getWR_fn=__name2(function(maybeWR,typeSet){return maybeWR.filter(r=>isObject(r)&&typeof r.type=="string"&&typeof r.value=="number").map(wr=>(wr.type=__privateMethod(this,_normalizeType,normalizeType_fn).call(this,wr.type),wr.value=Math.abs(wr.value),wr)).filter(r=>setHasElement(typeSet,r.type))},"#getWR"),_oldENmappings=new WeakMap,_parseExceptions=new WeakSet,parseExceptions_fn=__name2(function(text){const normalized=(__privateGet(this,_oldENmappings)[text]??text).toLowerCase().replace("PF2E.TraitForce","force").replace("PF2E.TraitPositive","positive").replace("cold iron","cold-iron").replace("critical hits","critical-hits").replace("ghost touch","ghost-touch").replace("nonmagical","non-magical").replace("weapons shedding bright light","weapons-shedding-bright-light").replace("unarmed","unarmed-attacks").replace(/\bexcept\b/,"").trim().replace(/\s+/," ");if(!normalized)return{exceptions:[],doubleVs:[]};const doubleIndex=normalized.indexOf("double"),exceptions=(doubleIndex===-1?normalized:normalized.slice(0,doubleIndex)).split(/[,\s]+/).map(d=>sluggify(d)),doubleVs=normalized.slice(doubleIndex).split(/[,\s]+/).map(d=>sluggify(d));return{exceptions,doubleVs}},"#parseExceptions"),_normalizeType=new WeakSet,normalizeType_fn=__name2(function(text){switch(text=text.trim(),text){case"all":case"All":return"all-damage";case"arrow":return"arrow-vulnerability";case"axe":return"axe-vulnerability";case"coldiron":return"cold-iron";case"nonlethal":return"nonlethal-attacks";case"nonmagical-attacks":return"non-magical";case"protean anatomy":return"protean-anatomy";case"unarmed":return"unarmed-attacks";default:return sluggify(text)}},"#normalizeType"),__name2(_Migration812RestructureIWR,"Migration812RestructureIWR"),__publicField(_Migration812RestructureIWR,"version",.812);let Migration812RestructureIWR=_Migration812RestructureIWR;const _Migration813NormalizeColdIron=class extends MigrationBase{static{__name(this,"_Migration813NormalizeColdIron")}constructor(){super(...arguments),__privateAdd(this,_updateWeaponMaterialData),__privateAdd(this,_updateChoiceSet)}async updateItem(source){switch(source.type){case"melee":{const traits=source.system.traits;traits.value=traits.value.map(t=>t.replace(/^coldiron$/i,"cold-iron"));return}case"armor":case"weapon":{const preciousMaterial=source.system.preciousMaterial;if(typeof preciousMaterial?.value!="string")return;preciousMaterial.value&&=preciousMaterial.value.replace(/^coldiron$/i,"cold-iron"),source.type==="weapon"&&__privateMethod(this,_updateWeaponMaterialData,updateWeaponMaterialData_fn).call(this,source);return}}const choiceSets=source.system.rules.filter(r=>r.key==="ChoiceSet"&&"choices"in r&&Array.isArray(r.choices)&&r.choices.every(c=>isObject(c)&&"value"in c&&typeof c.value=="string"));for(const choiceSet of choiceSets)__privateMethod(this,_updateChoiceSet,updateChoiceSet_fn).call(this,choiceSet)}};_updateWeaponMaterialData=new WeakSet,updateWeaponMaterialData_fn=__name2(function(source){if(source.type!=="weapon"||!isObject(source.system.specific))return;const specificData=source.system.specific;specificData.value||(delete specificData.material,delete specificData.price,delete specificData.runes,specificData["-=material"]=null,specificData["-=price"]=null,specificData["-=runes"]=null);const material=specificData.material;material?.precious?(material.precious.type&&=material.precious?.type.replace(/^coldiron$/i,"cold-iron"),delete material.base,material["-=base"]=null):typeof material?.type=="string"&&typeof material.grade=="string"&&(material.precious={type:material.type.replace(/^coldiron$/i,"cold-iron"),grade:material.grade},delete material.type,delete material.grade,material["-=type"]=null,material["-=grade"]=null)},"#updateWeaponMaterialData"),_updateChoiceSet=new WeakSet,updateChoiceSet_fn=__name2(function(choiceSet){for(const choice of choiceSet.choices)/coldiron/i.test(String(choice.value))&&(choice.value="cold-iron");/coldiron/i.test(String(choiceSet.selection))&&(choiceSet.selection="cold-iron")},"#updateChoiceSet"),__name2(_Migration813NormalizeColdIron,"Migration813NormalizeColdIron"),__publicField(_Migration813NormalizeColdIron,"version",.813);let Migration813NormalizeColdIron=_Migration813NormalizeColdIron;const _Migration814CalculatedExpandedSplash=class extends MigrationBase{static{__name(this,"_Migration814CalculatedExpandedSplash")}async updateItem(source){if(source.type==="feat")switch(source.system.slug){case"calculated-splash":{const rules=[{key:"AdjustModifier",mode:"upgrade",predicate:[{not:"feat:expanded-splash"}],relabel:"{item|name}",selector:"alchemical-bomb-damage",slug:"splash",value:"@actor.abilities.int.mod"}];source.system.rules=rules;return}case"expanded-splash":{const rules=[{damageCategory:"splash",key:"FlatModifier",predicate:["item:trait:splash"],selector:"alchemical-bomb-damage",value:"@actor.abilities.int.mod"},{key:"Note",predicate:["item:trait:splash"],selector:"alchemical-bomb-damage",text:"The bomb deals splash damage to every creature within 10 feet of the target.",title:"{item|name}"}];source.system.rules=rules}}}};__name2(_Migration814CalculatedExpandedSplash,"Migration814CalculatedExpandedSplash"),__publicField(_Migration814CalculatedExpandedSplash,"version",.814);let Migration814CalculatedExpandedSplash=_Migration814CalculatedExpandedSplash;const _Migration815ConsumableDataCleanup=class extends MigrationBase{static{__name(this,"_Migration815ConsumableDataCleanup")}consumableKeys=new Set(["autoDestroy","baseItem","bulk","charges","consumableType","consume","containerId","description","equipped","equippedBulk","hardness","hp","identification","level","negateBulk","preciousMaterial","preciousMaterialGrade","price","quantity","rules","schema","size","slug","source","spell","stackGroup","temporary","traits","usage","weight"]);async updateItem(source){if(source.type!=="consumable")return;const systemData=source.system;for(const key of Object.keys(systemData)){const value=systemData[key];this.consumableKeys.has(key)?isObject(value)&&"_deprecated"in value&&(delete value._deprecated,value["-=_deprecated"]=null):(delete systemData[key],systemData[`-=${key}`]=null)}}};__name2(_Migration815ConsumableDataCleanup,"Migration815ConsumableDataCleanup"),__publicField(_Migration815ConsumableDataCleanup,"version",.815);let Migration815ConsumableDataCleanup=_Migration815ConsumableDataCleanup;const _Migration816AlchemistResearchFields=class extends MigrationBase{static{__name(this,"_Migration816AlchemistResearchFields")}constructor(){super(...arguments),__privateAdd(this,_bomberSetFlags),__privateAdd(this,_chirurgeonSetFlags),__privateAdd(this,_mutagenistSetFlags),__privateAdd(this,_toxicologistSetFlags)}async updateItem(source){if(!(source.type!=="feat"||!source.system.slug)&&!source.system.rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.alchemist"))switch(source.system.slug){case"bomber":{source.system.rules.push(__privateGet(this,_bomberSetFlags,bomberSetFlags_get));break}case"chirurgeon":{source.system.rules.push(__privateGet(this,_chirurgeonSetFlags,chirurgeonSetFlags_get));break}case"mutagenist":{source.system.rules.push(__privateGet(this,_mutagenistSetFlags,mutagenistSetFlags_get));break}case"toxicologist":{source.system.rules.push(__privateGet(this,_toxicologistSetFlags,toxicologistSetFlags_get));break}}}};_bomberSetFlags=new WeakSet,bomberSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.8QAFgy9U8PxEa7Dw",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.RGs4uR3CAvgbtBAA",perpetualInfusions:"Compendium.pf2e.classfeatures.DFQDtT1Van4fFEHi",perpetualPerfection:"Compendium.pf2e.classfeatures.xO90iBD8XNGyaCkz",perpetualPotency:"Compendium.pf2e.classfeatures.8rEVg03QJ71ic3PP"}}},"#bomberSetFlags"),_chirurgeonSetFlags=new WeakSet,chirurgeonSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.qC0Iz6SlG2i9gv6g",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.JJcaVijwRt9dsnac",perpetualInfusions:"Compendium.pf2e.classfeatures.fzvIe6FwwCuIdnjX",perpetualPerfection:"Compendium.pf2e.classfeatures.YByJ9O7oe8wxfbqs",perpetualPotency:"Compendium.pf2e.classfeatures.VS5vkqUQu4n7E28Y"}}},"#chirurgeonSetFlags"),_mutagenistSetFlags=new WeakSet,mutagenistSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.V4Jt7eDnJBLv5bDj",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.1BKdOJ0HNL6Eg3xw",perpetualInfusions:"Compendium.pf2e.classfeatures.Dug1oaVYejLmYEFt",perpetualPerfection:"Compendium.pf2e.classfeatures.CGetAmSbv06fW7GT",perpetualPotency:"Compendium.pf2e.classfeatures.mZFqRLYOQEqKA8ri"}}},"#mutagenistSetFlags"),_toxicologistSetFlags=new WeakSet,toxicologistSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.6zo2PJGYoig7nFpR",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.tnqyQrhrZeDtDvcO",perpetualInfusions:"Compendium.pf2e.classfeatures.LlZ5R50z9j8jysZL",perpetualPerfection:"Compendium.pf2e.classfeatures.3R19zS7gERhEX87F",perpetualPotency:"Compendium.pf2e.classfeatures.JOdbVu14phvdjhaY"}}},"#toxicologistSetFlags"),__name2(_Migration816AlchemistResearchFields,"Migration816AlchemistResearchFields"),__publicField(_Migration816AlchemistResearchFields,"version",.816);let Migration816AlchemistResearchFields=_Migration816AlchemistResearchFields;const _Migration817FieldDiscoveryPredicates=class extends MigrationBase{static{__name(this,"_Migration817FieldDiscoveryPredicates")}async updateItem(source){const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike"&&"path"in r&&typeof r.path=="string"&&/^system.crafting.entries.\w+.fieldDiscovery$/.test(r.path)&&"value"in r&&typeof r.value=="string");for(const rule of aeLikes)switch(rule.value){case"bomb":rule.value=["item:base:alchemical-bomb"];break;case"elixir":rule.value=["item:trait:elixir","item:trait:healing"];break;case"mutagen":rule.value=["item:trait:mutagen"];break;case"poison":rule.value=["item:trait:alchemical","item:trait:poison"];break;default:rule.value=[`item:trait:${rule.value}`]}}};__name2(_Migration817FieldDiscoveryPredicates,"Migration817FieldDiscoveryPredicates"),__publicField(_Migration817FieldDiscoveryPredicates,"version",.817);let Migration817FieldDiscoveryPredicates=_Migration817FieldDiscoveryPredicates;const _Migration818BasicUndeadNegativeHealing=class extends MigrationBase{static{__name(this,"_Migration818BasicUndeadNegativeHealing")}constructor(){super(...arguments),__privateAdd(this,_needsRE)}async updateItem(source){if(source.type==="feat"&&__privateMethod(this,_needsRE,needsRE_fn).call(this,source)){const rule={key:"ActiveEffectLike",mode:"override",path:"system.attributes.hp.negativeHealing",value:!0};source.system.rules.push(rule)}}};_needsRE=new WeakSet,needsRE_fn=__name2(function(source){return source.system.slug==="basic-undead-benefits"&&!source.system.rules.some(r=>r.key==="ActiveEffectLike"&&"path"in r&&r.path==="system.attributes.hp.negativeHealing")},"#needsRE"),__name2(_Migration818BasicUndeadNegativeHealing,"Migration818BasicUndeadNegativeHealing"),__publicField(_Migration818BasicUndeadNegativeHealing,"version",.818);let Migration818BasicUndeadNegativeHealing=_Migration818BasicUndeadNegativeHealing;const _Migration819SpinTaleAdventureSpecific=class extends MigrationBase{static{__name(this,"_Migration819SpinTaleAdventureSpecific")}async updateItem(source){if(source.type==="feat"){const oldSpinTale="Compendium.pf2e.adventure-specific-actions.Spin Tale",newSpinTale="Compendium.pf2e.actionspf2e.Spin Tale",oldSpinTaleId="Compendium.pf2e.adventure-specific-actions.5gahZQXf3UVwATSC",newSpinTaleId="Compendium.pf2e.actionspf2e.hPZQ5vA9QHEPtjFW";source.system.description.value=source.system.description.value.replace(oldSpinTale,newSpinTale),source.system.description.value=source.system.description.value.replace(oldSpinTaleId,newSpinTaleId)}}};__name2(_Migration819SpinTaleAdventureSpecific,"Migration819SpinTaleAdventureSpecific"),__publicField(_Migration819SpinTaleAdventureSpecific,"version",.819);let Migration819SpinTaleAdventureSpecific=_Migration819SpinTaleAdventureSpecific;const _Migration820RemoveUnusedTraitsData=class extends MigrationBase{static{__name(this,"_Migration820RemoveUnusedTraitsData")}async updateItem(source){source.system.traits;const systemSource=source.system;systemSource.traits&&("custom"in systemSource.traits&&(delete systemSource.traits.custom,systemSource.traits["-=custom"]=null),(source.type==="spellcastingEntry"||source.type==="condition")&&(delete systemSource.traits,systemSource["-=traits"]=null))}};__name2(_Migration820RemoveUnusedTraitsData,"Migration820RemoveUnusedTraitsData"),__publicField(_Migration820RemoveUnusedTraitsData,"version",.82);let Migration820RemoveUnusedTraitsData=_Migration820RemoveUnusedTraitsData;const _Migration821InlineDamageRolls=class extends MigrationBase{static{__name(this,"_Migration821InlineDamageRolls")}constructor(){super(...arguments),__privateAdd(this,_cleanFormula),__privateAdd(this,_buildSplashFormula),__privateAdd(this,_buildDamageFormula),__privateAdd(this,_updateDamageFormula3),__privateAdd(this,_splashPattern1,/\[\[(\/b?r)\s*{([^}]*)}\[splash,\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g),__privateAdd(this,_splashPattern2,/\[\[(\/b?r)\s*([^[]*)\[splash,\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g),__privateAdd(this,_damagePatternSingle,/\[\[(\/b?r)\s*{([^}]*)}\[\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g),__privateAdd(this,_damagePatternPair,/\[\[(\/b?r)\s*{([^}]*)}\[\s*([^\]]*)\]\s*[+,]\s*{([^}]*)}\[\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g)}async updateActor(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula3,updateDamageFormula_fn3).call(this,s))}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula3,updateDamageFormula_fn3).call(this,s))}async updateJournalEntry(source){source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_updateDamageFormula3,updateDamageFormula_fn3).call(this,s))}};_splashPattern1=new WeakMap,_splashPattern2=new WeakMap,_damagePatternSingle=new WeakMap,_damagePatternPair=new WeakMap,_cleanFormula=new WeakSet,cleanFormula_fn=__name2(function(formula){return formula=formula.replace(/\s+/g,""),["+","-","*","/"].some(o=>formula.includes(o))?`(${formula})`:formula},"#cleanFormula"),_buildSplashFormula=new WeakSet,buildSplashFormula_fn=__name2(function(roll,formula,damage,tag){return formula=__privateMethod(this,_cleanFormula,cleanFormula_fn).call(this,formula),damage=damage.trim(),tag=tag?.trim()??"",tag.length>0?`[[${roll} (${formula}[splash])[${damage}] ${tag}]]`:`[[${roll} (${formula}[splash])[${damage}]]]`},"#buildSplashFormula"),_buildDamageFormula=new WeakSet,buildDamageFormula_fn=__name2(function(roll,parts,tag){if(tag=tag?.trim()??"",parts.length===1){const formula=__privateMethod(this,_cleanFormula,cleanFormula_fn).call(this,parts[0].formula),damage=parts[0].damage.trim();return tag.length>0?`[[${roll} ${formula}[${damage}] ${tag}]]`:`[[${roll} ${formula}[${damage}]]]`}else if(parts.length>1){const assembled=parts.map(p=>{const formula=__privateMethod(this,_cleanFormula,cleanFormula_fn).call(this,p.formula),damage=p.damage.trim();return`${formula}[${damage}]`}).join(",");return tag.length>0?`[[${roll} {${assembled}} ${tag}]]`:`[[${roll} {${assembled}}]]`}else return""},"#buildDamageFormula"),_updateDamageFormula3=new WeakSet,updateDamageFormula_fn3=__name2(function(text){return text=text.replace(__privateGet(this,_splashPattern1),(_,roll,formula,damage,tag)=>__privateMethod(this,_buildSplashFormula,buildSplashFormula_fn).call(this,roll,formula,damage,tag)),text=text.replace(__privateGet(this,_splashPattern2),(_,roll,formula,damage,tag)=>__privateMethod(this,_buildSplashFormula,buildSplashFormula_fn).call(this,roll,formula,damage,tag)),text=text.replace(__privateGet(this,_damagePatternSingle),(_,roll,formula,damage,tag)=>__privateMethod(this,_buildDamageFormula,buildDamageFormula_fn).call(this,roll,[{formula,damage}],tag)),text=text.replace(__privateGet(this,_damagePatternPair),(_,roll,formula1,damage1,formula2,damage2,tag)=>__privateMethod(this,_buildDamageFormula,buildDamageFormula_fn).call(this,roll,[{formula:formula1,damage:damage1},{formula:formula2,damage:damage2}],tag)),text},"#updateDamageFormula"),__name2(_Migration821InlineDamageRolls,"Migration821InlineDamageRolls"),__publicField(_Migration821InlineDamageRolls,"version",.821);let Migration821InlineDamageRolls=_Migration821InlineDamageRolls;const _Migration822BladeAllyConsolidation=class extends MigrationBase{static{__name(this,"_Migration822BladeAllyConsolidation")}constructor(){super(...arguments),__privateAdd(this,_rename)}async updateItem(source){source.system.description.value.includes("feat-effects")&&(source.system.description.value=__privateMethod(this,_rename,rename_fn).call(this,source.system.description.value))}};_rename=new WeakSet,rename_fn=__name2(function(text){return text.replace(/\bfeat-effects\.Effect: Blade Ally Anarchic Rune\b/g,"equipment-srd.Anarchic").replace(/\bfeat-effects\.xLXFK4mtzgAF4zvx\b/g,"equipment-srd.65YL6nk1jIzCWutt").replace(/\bfeat-effects\.Effect: Blade Ally Axiomatic Rune\b/g,"equipment-srd.Axiomatic").replace(/\bfeat-effects\.ZzE6jPbCyUqEqhcb\b/g,"equipment-srd.6xu6dPIaUZ7edKEB").replace(/\bfeat-effects\.Effect: Blade Ally Disrupting Rune\b/g,"equipment-srd.Disrupting").replace(/\bfeat-effects\.eippbzuocVM6ftcj\b/g,"equipment-srd.LwQb7ryTC8FlOXgX").replace(/\bfeat-effects\.Effect: Blade Ally Fearsome Rune\b/g,"equipment-srd.Fearsome").replace(/\bfeat-effects\.6LgJB4ypaSTWSJLu\b/g,"equipment-srd.P6v2AtJw7AUwaDzf").replace(/\bfeat-effects\.Effect: Blade Ally Flaming Rune\b/g,"equipment-srd.Flaming").replace(/\bfeat-effects\.YxYr18vleIt2t3RS\b/g,"equipment-srd.XszNvxnymWYRaoTp").replace(/\bfeat-effects\.Effect: Blade Ally Holy Rune\b/g,"equipment-srd.Holy").replace(/\bfeat-effects\.l98IthkklgLDJXIo\b/g,"equipment-srd.DH0kB9Wbr5pDeunX").replace(/\bfeat-effects\.Effect: Blade Ally Keen Rune\b/g,"equipment-srd.Keen").replace(/\bfeat-effects\.Gf7h44DcTB43464h\b/g,"equipment-srd.hg3IogR8ue2IWwgS").replace(/\bfeat-effects\.Effect: Blade Ally Unholy Rune\b/g,"equipment-srd.Unholy").replace(/\bfeat-effects\.rGSc2PtvU3mgm18S\b/g,"equipment-srd.gmMrJREf4JSHd2dZ").replace(/\bfeat-effects\.Effect: Blade Ally Ghost Touch Rune\b/g,"equipment-srd.Ghost Touch").replace(/\bfeat-effects\.Rgio0hasm2epEMfh\b/g,"equipment-srd.JQdwHECogcTzdd8R").replace(/\bfeat-effects\.Effect: Blade Ally Disrupting Rune (Greater)\b/g,"equipment-srd.Disrupting (Greater)").replace(/\bfeat-effects\.HjfIXg5btodThCTW\b/g,"equipment-srd.oVrVzML63VFvVfKk")},"#rename"),__name2(_Migration822BladeAllyConsolidation,"Migration822BladeAllyConsolidation"),__publicField(_Migration822BladeAllyConsolidation,"version",.822);let Migration822BladeAllyConsolidation=_Migration822BladeAllyConsolidation;const _Migration823HeritageAncestrySlug=class extends MigrationBase{static{__name(this,"_Migration823HeritageAncestrySlug")}async updateItem(source){if(source.type!=="heritage"||!source.system.ancestry||source.system.ancestry.slug)return;const ancestry=await fromUuid(source.system.ancestry.uuid);source.system.ancestry.slug=ancestry instanceof AncestryPF2e?ancestry.slug??sluggify(ancestry.name):sluggify(source.system.ancestry.name)}};__name2(_Migration823HeritageAncestrySlug,"Migration823HeritageAncestrySlug"),__publicField(_Migration823HeritageAncestrySlug,"version",.823);let Migration823HeritageAncestrySlug=_Migration823HeritageAncestrySlug;const _Migration824SneakAttackDamageSource=class extends MigrationBase{static{__name(this,"_Migration824SneakAttackDamageSource")}async updateItem(source){if(source.type==="feat")switch(source.system.slug){case"sneak-attack":{const rules=[{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.number",predicate:["class:rogue"],value:"ternary(lt(@actor.level, 5), 1, ternary(lt(@actor.level, 11), 2, ternary(lt(@actor.level, 17), 3, 4)))"},{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.faces",predicate:["class:rogue"],value:6},{category:"precision",diceNumber:"@actor.flags.pf2e.sneakAttackDamage.number",dieSize:"d{actor|flags.pf2e.sneakAttackDamage.faces}",key:"DamageDice",predicate:["target:condition:flat-footed",{or:["item:trait:agile","item:trait:finesse",{and:["item:ranged",{not:"item:thrown-melee"}]}]}],selector:"strike-damage"},{domain:"all",key:"RollOption",label:"PF2E.SpecificRule.TOTMToggle.FlatFooted",option:"target:condition:flat-footed",toggleable:"totm"}];source.system.rules=rules;return}case"ruffian":{const rules=[{category:"precision",diceNumber:"@actor.flags.pf2e.sneakAttackDamage.number",dieSize:"d{actor|flags.pf2e.sneakAttackDamage.faces}",key:"DamageDice",label:"PF2E.SpecificRule.SneakAttack",predicate:["target:condition:flat-footed","item:category:simple",{nor:[{and:["item:ranged",{not:"item:thrown-melee"}]},"item:trait:agile","item:trait:finesse"]}],selector:"strike-damage"},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.medium.rank",value:1},{key:"ActiveEffectLike",mode:"upgrade",path:"system.skills.itm.rank",value:1},{key:"CriticalSpecialization",predicate:["target:condition:flat-footed","item:category:simple",{lte:["item:damage:die:faces",8]}]}];source.system.rules=rules;return}case"sneak-attacker":{const rules=[{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.number",value:1},{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.faces",value:"ternary(lt(@actor.level, 6), 4, 6)"},{key:"GrantItem",uuid:"Compendium.pf2e.classfeatures.Sneak Attack"}];source.system.rules=rules;return}case"butterflys-sting":{const rules=[{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.number",value:1},{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.faces",value:6},{key:"GrantItem",uuid:"Compendium.pf2e.classfeatures.Sneak Attack"},{domain:"all",key:"RollOption",label:"PF2E.SpecificRule.TOTMToggle.FlatFooted",option:"target:condition:flat-footed",toggleable:"totm"}];source.system.rules=rules;return}case"magical-trickster":{const rules=[{category:"precision",diceNumber:"@actor.flags.pf2e.sneakAttackDamage.number",dieSize:"d{actor|flags.pf2e.sneakAttackDamage.faces}",key:"DamageDice",predicate:["item:trait:attack","target:condition:flat-footed"],selector:"spell-damage"}];source.system.rules=rules;return}}}};__name2(_Migration824SneakAttackDamageSource,"Migration824SneakAttackDamageSource"),__publicField(_Migration824SneakAttackDamageSource,"version",.824);let Migration824SneakAttackDamageSource=_Migration824SneakAttackDamageSource;const _Migration825KhakkharaFengHuoLun=class extends MigrationBase{static{__name(this,"_Migration825KhakkharaFengHuoLun")}async updateItem(source){if(source.img.endsWith("icons/equipment/weapons/khakkara.webp")&&(source.img=source.img.replace("khakkara.webp","khakkhara.webp")),source.type==="weapon"){const fixBaseItemAndSlug=__name2((oldId,newId)=>{source.system.baseItem===oldId&&(source.system.baseItem=newId),source.system.slug===oldId&&(source.system.slug=newId)},"fixBaseItemAndSlug");fixBaseItemAndSlug("khakkara","khakkhara"),fixBaseItemAndSlug("wind-and-fire-wheel","feng-huo-lun")}else if(source.type==="feat"){const oldLink="@UUID[Compendium.pf2e.equipment-srd.Khakkara]",newLink="@UUID[Compendium.pf2e.equipment-srd.Khakkhara]";source.system.description.value=source.system.description.value.replace(oldLink,newLink);for(const rule of source.system.rules)rule.key==="ActiveEffectLike"&&"path"in rule&&rule.path==="system.martial.weapon-base-khakkara.rank"&&(rule.path="system.martial.weapon-base-khakkhara.rank")}}};__name2(_Migration825KhakkharaFengHuoLun,"Migration825KhakkharaFengHuoLun"),__publicField(_Migration825KhakkharaFengHuoLun,"version",.825);let Migration825KhakkharaFengHuoLun=_Migration825KhakkharaFengHuoLun;const _Migration826GutConditionData=class extends MigrationBase{static{__name(this,"_Migration826GutConditionData")}async updateItem(source){if(source.type!=="condition")return;const system=source.system,topLevel=["active","base","removable","hud","modifiers","sources","alsoApplies"];for(const key of topLevel)key in system&&(delete system[key],system[`-=${key}`]=null);const valueData=system.value;for(const key of["immutable","modifiers"])key in valueData&&(delete valueData[key],valueData[`-=${key}`]=null);const durationData=system.duration;for(const key of["perpetual","text"])key in durationData&&(delete durationData[key],durationData[`-=${key}`]=null);system.group||=null}};__name2(_Migration826GutConditionData,"Migration826GutConditionData"),__publicField(_Migration826GutConditionData,"version",.826);let Migration826GutConditionData=_Migration826GutConditionData;const _Migration827FixTVShieldTraits=class extends MigrationBase{static{__name(this,"_Migration827FixTVShieldTraits")}async updateItem(source){const traits=source.system.traits;if(isObject(traits)&&"value"in traits&&!Array.isArray(traits.value)&&(traits.value=[]),source.type==="armor")switch(source.system.slug){case"dart-shield":{source.system.traits.value=["launching-dart"];return}case"klar":{source.system.traits.value=["integrated-1d6-s-versatile-p"];return}case"meteor-shield":{source.system.traits.value=["shield-throw-30"];return}case"razor-disc":{source.system.traits.value=["integrated-1d6-s","shield-throw-20"];return}}}};__name2(_Migration827FixTVShieldTraits,"Migration827FixTVShieldTraits"),__publicField(_Migration827FixTVShieldTraits,"version",.827);let Migration827FixTVShieldTraits=_Migration827FixTVShieldTraits;const _Migration828PruneInvalidTraits=class extends MigrationBase{static{__name(this,"_Migration828PruneInvalidTraits")}async updateActor(source){const traits=source.system.traits;if(traits)switch(source.type){case"character":case"npc":{traits.value=traits.value.filter(t=>t in creatureTraits);return}case"hazard":{traits.value=traits.value.filter(t=>t in hazardTraits);return}case"vehicle":{traits.value=traits.value.filter(t=>t in vehicleTraits);return}}}async updateItem(source){const traits=source.system.traits;if(traits?.value)switch(source.type){case"action":{traits.value=traits.value.map(t=>t.replace(/^audible$/,"auditory").replace(/^concentration$/,"concentrate").replace(/^(interact|manipulation)$/i,"manipulate").replace(/^vocal$/,"verbal")).filter(t=>t in actionTraits);return}case"affliction":case"effect":{traits.value=traits.value.filter(t=>t in actionTraits||t in spellTraits);return}case"ancestry":{traits.value=traits.value.filter(t=>t in creatureTraits||["animal"].includes(t));return}case"armor":{traits.value=traits.value.map(t=>source.system.slug?.includes("helmsmans")?t.replace(/^shield-throw$/,"shield-throw-30"):source.system.slug?.includes("klar")?t.replace(/^integrated$/,"integrated-1d6-s-versatile-p"):t).filter(t=>t in armorTraits);return}case"backpack":case"equipment":{traits.value=traits.value.filter(t=>t in equipmentTraits);return}case"consumable":{traits.value=traits.value.filter(t=>t in consumableTraits);return}case"class":{traits.value=traits.value.filter(t=>t in classTraits);return}case"feat":{traits.value=traits.value.filter(t=>t in featTraits);return}case"melee":{traits.value=traits.value.filter(t=>t in npcAttackTraits);return}case"spell":{traits.value=traits.value.map(t=>t.replace(/^audible$/,"auditory")).filter(t=>t in spellTraits);return}case"weapon":{traits.value=traits.value.filter(t=>t in weaponTraits);return}}}};__name2(_Migration828PruneInvalidTraits,"Migration828PruneInvalidTraits"),__publicField(_Migration828PruneInvalidTraits,"version",.828);let Migration828PruneInvalidTraits=_Migration828PruneInvalidTraits;const _Migration829RMRitualEntries=class extends MigrationBase{static{__name(this,"_Migration829RMRitualEntries")}async updateActor(source){for(const item of source.items.filter(i=>i.type==="spellcastingEntry"))item.system.prepared.value==="ritual"&&(source.items.splice(source.items.indexOf(item),1),source.type==="npc"&&(source.system.spellcasting??={},source.system.spellcasting.rituals={dc:item.system.spelldc.dc}))}async updateItem(source){source.type==="spell"&&source.system.category.value==="ritual"&&source.system.location&&(source.system.location.value=null)}};__name2(_Migration829RMRitualEntries,"Migration829RMRitualEntries"),__publicField(_Migration829RMRitualEntries,"version",.829);let Migration829RMRitualEntries=_Migration829RMRitualEntries;const _Migration830BarbarianRework=class extends MigrationBase{static{__name(this,"_Migration830BarbarianRework")}constructor(){super(...arguments),__privateAdd(this,_removeLinks)}async updateItem(source){source.system.description.value=__privateMethod(this,_removeLinks,removeLinks_fn).call(this,source.system.description.value);for(const rule of source.system.rules)rule.key==="ActiveEffectLike"&&"path"in rule&&(rule.path==="system.custom.modifiers.barbarian-dedication-count"||rule.path==="flags.pf2e.rollOptions.all.barbarian-dedication")&&(rule.path="flags.pf2e.barbarian.archetypeFeatCount"),rule.key==="FlatModifier"&&rule.value==="3 * @actor.system.custom.modifiers.barbarian-dedication-count"&&(rule.value="3 * @actor.flags.pf2e.barbarian.archetypeFeatCount")}};_removeLinks=new WeakSet,removeLinks_fn=__name2(function(text){return text.replace("@UUID[Compendium.pf2e.classfeatures.vlRvOQS1HZZqSyh7]{Ape}","Ape").replace("@UUID[Compendium.pf2e.classfeatures.uGY2yddm8mZx8Yo2]{Bear}","Bear").replace("@UUID[Compendium.pf2e.classfeatures.31sPXwmEbbcvgsM9]{Bull}","Bull").replace("@UUID[Compendium.pf2e.classfeatures.vCNtX2LwlemhA3tu]{Cat}","Cat").replace("@UUID[Compendium.pf2e.classfeatures.RQUJgDjJODO775qb]{Deer}","Deer").replace("@UUID[Compendium.pf2e.classfeatures.CXZwt1e6ManeBaFV]{Frog}","Frog").replace("@UUID[Compendium.pf2e.classfeatures.OJmI1L4dhQfz8vze]{Shark}","Shark").replace("@UUID[Compendium.pf2e.classfeatures.pIYWMCNnYDQfSRQh]{Snake}","Snake").replace("@UUID[Compendium.pf2e.classfeatures.xX6KnYYgHlPGoTG6]{Wolf}","Wolf").replace("@UUID[Compendium.pf2e.classfeatures.VNbDNiWjARtGQQAs]{Black}","Black").replace("@UUID[Compendium.pf2e.classfeatures.RiOww9KMu06D7wtW]{Blue}","Blue").replace("@UUID[Compendium.pf2e.classfeatures.IezPDYlweTtwCqkT]{Green}","Green").replace("@UUID[Compendium.pf2e.classfeatures.hyHgLQCDMSrR4RfE]{Red}","Red").replace("@UUID[Compendium.pf2e.classfeatures.2esqOHCn4GcZ4zYD]{White}","White").replace("@UUID[Compendium.pf2e.classfeatures.b5rvKZQCfpgBenKJ]{Brass}","Brass").replace("@UUID[Compendium.pf2e.classfeatures.kdzIxHpzeRbdRqQA]{Bronze}","Bronze").replace("@UUID[Compendium.pf2e.classfeatures.1ZugTzJHsa94AZRW]{Copper}","Copper").replace("@UUID[Compendium.pf2e.classfeatures.3lxIGMbsPZLNEXQ7]{Gold}","Gold").replace("@UUID[Compendium.pf2e.classfeatures.Z2eWkfXblU0QxFx1]{Silver}","Silver").replace("@UUID[Compendium.pf2e.classfeatures.Ape Animal Instinct]{Ape}","Ape").replace("@UUID[Compendium.pf2e.classfeatures.Bear Animal Instinct]{Bear}","Bear").replace("@UUID[Compendium.pf2e.classfeatures.Bull Animal Instinct]{Bull}","Bull").replace("@UUID[Compendium.pf2e.classfeatures.Cat Animal Instinct]{Cat}","Cat").replace("@UUID[Compendium.pf2e.classfeatures.Deer Animal Instinct]{Deer}","Deer").replace("@UUID[Compendium.pf2e.classfeatures.Frog Animal Instinct]{Frog}","Frog").replace("@UUID[Compendium.pf2e.classfeatures.Shark Animal Instinct]{Shark}","Shark").replace("@UUID[Compendium.pf2e.classfeatures.Snake Animal Instinct]{Snake}","Snake").replace("@UUID[Compendium.pf2e.classfeatures.Wolf Animal Instinct]{Wolf}","Wolf").replace("@UUID[Compendium.pf2e.classfeatures.Black Dragon Instinct]{Black}","Black").replace("@UUID[Compendium.pf2e.classfeatures.Blue Dragon Instinct]{Blue}","Blue").replace("@UUID[Compendium.pf2e.classfeatures.Green Dragon Instinct]{Green}","Green").replace("@UUID[Compendium.pf2e.classfeatures.Red Dragon Instinct]{Red}","Red").replace("@UUID[Compendium.pf2e.classfeatures.White Dragon Instinct]{White}","White").replace("@UUID[Compendium.pf2e.classfeatures.Brass Dragon Instinct]{Brass}","Brass").replace("@UUID[Compendium.pf2e.classfeatures.Bronze Dragon Instinct]{Bronze}","Bronze").replace("@UUID[Compendium.pf2e.classfeatures.Copper Dragon Instinct]{Copper}","Copper").replace("@UUID[Compendium.pf2e.classfeatures.Gold Dragon Instinct]{Gold}","Gold").replace("@UUID[Compendium.pf2e.classfeatures.Silver Dragon Instinct]{Silver}","Silver")},"#removeLinks"),__name2(_Migration830BarbarianRework,"Migration830BarbarianRework"),__publicField(_Migration830BarbarianRework,"version",.83);let Migration830BarbarianRework=_Migration830BarbarianRework;const _Migration831ClericDoctrines=class extends MigrationBase{static{__name(this,"_Migration831ClericDoctrines")}constructor(){super(...arguments),__privateAdd(this,_cloisteredClericSetFlags),__privateAdd(this,_warpriestSetFlags)}async updateItem(source){if(!(source.type!=="feat"||!source.system.slug)&&!source.system.rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.cleric"))switch(source.system.slug){case"cloistered-cleric":{source.system.rules.push(__privateGet(this,_cloisteredClericSetFlags,cloisteredClericSetFlags_get));break}case"warpriest":{source.system.rules.push(__privateGet(this,_warpriestSetFlags,warpriestSetFlags_get));break}}}};_cloisteredClericSetFlags=new WeakSet,cloisteredClericSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.cleric",value:{firstDoctrine:"Compendium.pf2e.classfeatures.aiwxBj5MjnafCMyn",secondDoctrine:"Compendium.pf2e.classfeatures.sa7BWfnyCswAvBVa",thirdDoctrine:"Compendium.pf2e.classfeatures.s8WEmc4GGZSHSC7q",fourthDoctrine:"Compendium.pf2e.classfeatures.vxOf4LXZcqUG3P7a",fifthDoctrine:"Compendium.pf2e.classfeatures.n9W8MjjRgPpUTvWf",finalDoctrine:"Compendium.pf2e.classfeatures.DgGefatQ4v6xT6f9"}}},"#cloisteredClericSetFlags"),_warpriestSetFlags=new WeakSet,warpriestSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.cleric",value:{firstDoctrine:"Compendium.pf2e.classfeatures.xxkszluN9icAiTO4",secondDoctrine:"Compendium.pf2e.classfeatures.D34mPo29r1J3DPaX",thirdDoctrine:"Compendium.pf2e.classfeatures.Zp81uTBItG1xlH4O",fourthDoctrine:"Compendium.pf2e.classfeatures.px3gVYp7zlEQIpcl",fifthDoctrine:"Compendium.pf2e.classfeatures.kmimy4VOaoEOgOiQ",finalDoctrine:"Compendium.pf2e.classfeatures.N1ugDqZlslxbp3Uy"}}},"#warpriestSetFlags"),__name2(_Migration831ClericDoctrines,"Migration831ClericDoctrines"),__publicField(_Migration831ClericDoctrines,"version",.831);let Migration831ClericDoctrines=_Migration831ClericDoctrines;const _Migration832ChoiceSetFlags=class extends MigrationBase{static{__name(this,"_Migration832ChoiceSetFlags")}async updateItem(source){const choiceSets=source.system.rules.filter(r=>r.key==="ChoiceSet"&&"flag"in r&&typeof r.flag=="string");for(const choiceSet of choiceSets){const originalFlag=choiceSet.flag;if(choiceSet.flag=sluggify(choiceSet.flag,{camel:"dromedary"}),choiceSet.flag!==originalFlag){console.log(`${originalFlag} ->> ${choiceSet.flag}`);const pattern=new RegExp(String.raw`\brulesSelections\.${originalFlag}\b`,"g");source.system.rules=source.system.rules.map(r=>r.key==="ChoiceSet"?r:recursiveReplaceString(r,s=>s.replace(pattern,`rulesSelections.${choiceSet.flag}`)))}}}};__name2(_Migration832ChoiceSetFlags,"Migration832ChoiceSetFlags"),__publicField(_Migration832ChoiceSetFlags,"version",.832);let Migration832ChoiceSetFlags=_Migration832ChoiceSetFlags;const _Migration833AddRogueToysFixPrecision=class extends MigrationBase{static{__name(this,"_Migration833AddRogueToysFixPrecision")}async updateItem(source){if(source.type!=="feat")return;const flatFootedId="game"in globalThis?"AJh5ex99aV6VTggg":"Flat-Footed";switch(source.system.slug){case"surprise-attack":{const rules=[{key:"EphemeralEffect",predicate:["encounter:round:1",{lt:["self:participant:initiative:rank","target:participant:initiative:rank"]},{or:["self:participant:initiative:stat:deception","self:participant:initiative:stat:stealth"]}],selectors:["strike-attack-roll","spell-attack-roll","strike-damage","attack-spell-damage"],uuid:`Compendium.pf2e.conditionitems.Item.${flatFootedId}`}];source.system.rules=rules;break}case"dread-striker":{const rules=[{key:"EphemeralEffect",predicate:["target:condition:frightened"],selectors:["strike-attack-roll","spell-attack-roll","strike-damage","attack-spell-damage"],uuid:`Compendium.pf2e.conditionitems.Item.${flatFootedId}`}];source.system.rules=rules;break}case"precision":{if(source.system.rules.some(r=>"damageType"in r&&r.damageType==="precision")){const rules=[{domain:"all",key:"RollOption",label:"PF2E.SpecificRule.Ranger.HuntersEdge.FirstAttack",option:"first-attack",toggleable:!0},{category:"precision",diceNumber:"ternary(lt(@actor.level, 11), 1, ternary(lt(@actor.level, 19), 2, 3))",dieSize:"d8",key:"DamageDice",predicate:["first-attack"],selector:"strike-damage"}];source.system.rules=rules}break}}}};__name2(_Migration833AddRogueToysFixPrecision,"Migration833AddRogueToysFixPrecision"),__publicField(_Migration833AddRogueToysFixPrecision,"version",.833);let Migration833AddRogueToysFixPrecision=_Migration833AddRogueToysFixPrecision;const FEAT_CATEGORIES=new Set(["ancestry","bonus","class","general","skill"]),FEATURE_CATEGORIES=new Set(["ancestryfeature","classfeature","curse","deityboon","pfsboon"]),FEAT_OR_FEATURE_CATEGORIES=new Set(["ancestry","ancestryfeature","bonus","class","classfeature","curse","deityboon","general","pfsboon","skill"]),_Migration834FeatCategories=class extends MigrationBase{static{__name(this,"_Migration834FeatCategories")}constructor(){super(...arguments),__privateAdd(this,_updateCategoryData)}async updateItem(source){source.type==="feat"&&__privateMethod(this,_updateCategoryData,updateCategoryData_fn).call(this,source.system);const choiceSets=source.system.rules.filter(r=>r.key==="ChoiceSet");for(const rule of choiceSets)isObject(rule.allowedDrops)&&"predicate"in rule.allowedDrops&&Array.isArray(rule.allowedDrops.predicate)&&(rule.allowedDrops.predicate=recursiveReplaceString(rule.allowedDrops.predicate,s=>s.replace(/\bfeat(?:ure)?-type\b/,"category"))),isObject(rule.choices)&&"query"in rule.choices&&typeof rule.choices.query=="string"&&(rule.choices.query=rule.choices.query.replace('"featType.value":"archetype"','"category":"class"').replace("featType.value","category"))}};_updateCategoryData=new WeakSet,updateCategoryData_fn=__name2(function(system){const{traits}=system;if("featType"in system&&isObject(system.featType)){const category=system.featType.value;delete system.featType,"game"in globalThis&&(system["-=featType"]=null),category==="archetype"?(system.category=system.traits.value.includes("skill")?"skill":"class",traits.value.includes("archetype")||(traits.value.push("archetype"),traits.value.sort())):setHasElement(FEAT_OR_FEATURE_CATEGORIES,category)&&(system.category=category)}setHasElement(FEAT_OR_FEATURE_CATEGORIES,system.category)||(system.category="bonus"),system.category==="skill"&&!traits.value.includes("archetype")&&!traits.value.includes("general")&&(system.traits.value.push("general"),system.traits.value.sort())},"#updateCategoryData"),__name2(_Migration834FeatCategories,"Migration834FeatCategories"),__publicField(_Migration834FeatCategories,"version",.834);let Migration834FeatCategories=_Migration834FeatCategories;const _Migration835InitiativeLongform=class extends MigrationBase{static{__name(this,"_Migration835InitiativeLongform")}async updateActor(actor){if(!("initiative"in actor.system.attributes))return;const initiative=actor.system.attributes.initiative;if(!initiative||!initiative.ability)return;const ability=initiative.ability;objectHasKey(SKILL_DICTIONARY,ability)?initiative.statistic=SKILL_DICTIONARY[ability]:initiative.statistic="perception",delete initiative.ability,initiative["-=ability"]=null}};__name2(_Migration835InitiativeLongform,"Migration835InitiativeLongform"),__publicField(_Migration835InitiativeLongform,"version",.835);let Migration835InitiativeLongform=_Migration835InitiativeLongform;const _Migration836EnergizingConsolidation=class extends MigrationBase{static{__name(this,"_Migration836EnergizingConsolidation")}constructor(){super(...arguments),__privateAdd(this,_rename2)}async updateItem(source){source.system.description.value.includes("equipment-effects")&&(source.system.description.value=__privateMethod(this,_rename2,rename_fn2).call(this,source.system.description.value))}};_rename2=new WeakSet,rename_fn2=__name2(function(text){const newEffectEnergizingRune="equipment-effects.R5ywXEYZFV1WBe8t";return text.replace("equipment-effects.ClsVhp5baFRjZQ23",newEffectEnergizingRune).replace("equipment-effects.68xcDyxsNgD3JddD",newEffectEnergizingRune).replace("equipment-effects.9BsFdrEc7hkPWgSd",newEffectEnergizingRune).replace("equipment-effects.ascxqSlMEN9R6OOy",newEffectEnergizingRune).replace("equipment-effects.4RnEUeYEzC919GZR",newEffectEnergizingRune)},"#rename"),__name2(_Migration836EnergizingConsolidation,"Migration836EnergizingConsolidation"),__publicField(_Migration836EnergizingConsolidation,"version",.836);let Migration836EnergizingConsolidation=_Migration836EnergizingConsolidation;const _Migration837MoveHazardBookSources=class extends MigrationBase{static{__name(this,"_Migration837MoveHazardBookSources")}async updateActor(source){if(source.type==="hazard"&&isObject(source.system.source)){const value=typeof source.system.source.value=="string"?source.system.source.value:"",author=typeof source.system.source.author=="string"?source.system.source.author:"";source.system.details.source={value,author},"game"in globalThis?source.system["-=source"]=null:delete source.system.source}}};__name2(_Migration837MoveHazardBookSources,"Migration837MoveHazardBookSources"),__publicField(_Migration837MoveHazardBookSources,"version",.837);let Migration837MoveHazardBookSources=_Migration837MoveHazardBookSources;const _Migration838StrikeAttackRollSelector=class extends MigrationBase{static{__name(this,"_Migration838StrikeAttackRollSelector")}async updateItem(source){Array.isArray(source.system.rules)||(source.system.rules=[]);for(const rule of source.system.rules)"selector"in rule&&(rule.selector==="mundane-attack"?rule.selector="strike-attack-roll":Array.isArray(rule.selector)&&(rule.selector=rule.selector.map(s=>s==="mundane-attack"?"strike-attack-roll":s)))}};__name2(_Migration838StrikeAttackRollSelector,"Migration838StrikeAttackRollSelector"),__publicField(_Migration838StrikeAttackRollSelector,"version",.838);let Migration838StrikeAttackRollSelector=_Migration838StrikeAttackRollSelector;const _Migration839ActionCategories=class extends MigrationBase{static{__name(this,"_Migration839ActionCategories")}async updateItem(source,actorSource){if(source.type!=="action")return;const system=source.system;if(system.actionCategory){const npcCategories=["offensive","defensive","interaction"],oldValue=system.actionCategory.value||null,mustBeNull=oldValue&&npcCategories.includes(oldValue)&&actorSource&&actorSource.type!=="npc";system.category=mustBeNull?null:oldValue,delete system.actionCategory,system["-=actionCategory"]=null}}};__name2(_Migration839ActionCategories,"Migration839ActionCategories"),__publicField(_Migration839ActionCategories,"version",.839);let Migration839ActionCategories=_Migration839ActionCategories;const _Migration840ArrayWrapPredicates=class extends MigrationBase{static{__name(this,"_Migration840ArrayWrapPredicates")}constructor(){super(...arguments),__privateAdd(this,_wrapPredicate)}async updateItem(source){for(const rule of source.system.rules)"predicate"in rule&&(rule.predicate=__privateMethod(this,_wrapPredicate,wrapPredicate_fn).call(this,rule.predicate)),"definition"in rule&&(rule.definition=__privateMethod(this,_wrapPredicate,wrapPredicate_fn).call(this,rule.definition))}};_wrapPredicate=new WeakSet,wrapPredicate_fn=__name2(function(predicate){if(Array.isArray(predicate))return predicate;const arrayWrapped=[predicate];return predicate&&PredicatePF2e.isValid(arrayWrapped)?arrayWrapped:void 0},"#wrapPredicate"),__name2(_Migration840ArrayWrapPredicates,"Migration840ArrayWrapPredicates"),__publicField(_Migration840ArrayWrapPredicates,"version",.84);let Migration840ArrayWrapPredicates=_Migration840ArrayWrapPredicates;const _Migration841V11UUIDFormat=class extends MigrationBase{static{__name(this,"_Migration841V11UUIDFormat")}constructor(){super(...arguments),__privateAdd(this,_replaceUUID),__privateAdd(this,_replaceUUIDsInLinks)}async updateActor(source){if(source.flags.core?.sourceId&&(source.flags.core.sourceId=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,source.flags.core.sourceId,"Actor")),source.type==="character"){if(isObject(source.system.crafting)&&Array.isArray(source.system.crafting.formulas))for(const formula of source.system.crafting.formulas)formula.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,formula.uuid,"Item")}else if(source.type==="npc"){const{details}=source.system;details.publicNotes&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.publicNotes),details.privateNotes&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.privateNotes)}else if(source.type==="hazard"){const{details}=source.system;details.reset&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.reset),details.description&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.description),details.routine&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.routine),details.disable&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.disable)}}async updateItem(source){if(source.flags.core?.sourceId&&(source.flags.core.sourceId=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,source.flags.core.sourceId,"Item")),source.system.rules=source.system.rules.map(rule=>("text"in rule&&typeof rule.text=="string"&&(rule.text=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,rule.text)),recursiveReplaceString(rule,s=>__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,s,"Item")))),itemIsOfType(source,"ancestry","background","class","kit")){const items=source.system.items;for(const entry of Object.values(items))if(entry.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,entry.uuid,"Item"),isObject(entry.items))for(const subentry of Object.values(entry.items))subentry.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,subentry.uuid,"Item")}else if(source.type==="heritage")source.system.ancestry?.uuid&&(source.system.ancestry.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,source.system.ancestry.uuid,"Item"));else if(source.type==="deity")for(const[key,spell]of Object.entries(source.system.spells))source.system.spells[Number(key)]=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,spell);const{description}=source.system;description.value??="",description.value=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,description.value),description.value=description.value.replace(/Compendium\.pf2e\.journals\.(?!JournalEntry)/g,"Compendium.pf2e.journals.JournalEntry."),description.gm&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,description.gm)}async updateJournalEntry(source){for(const page of source.pages)page.text.content&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,page.text.content)}};_replaceUUID=new WeakSet,replaceUUID_fn=__name2(function(uuid,explicitDocType){if(typeof uuid!="string"||!uuid.startsWith("Compendium."))return uuid;const documentType=(()=>{if(explicitDocType)return explicitDocType;if("game"in globalThis){const{collection}=foundry.utils.parseUuid(uuid)??{};return collection instanceof CompendiumCollection?collection.metadata.type??null:null}return null})();if(!documentType)return uuid;const parts=uuid.split(/\.(?! )/);if(parts.length!==4)return uuid;const[head,scope,pack,id]=parts;return`${head}.${scope}.${pack}.${documentType}.${id}`},"#replaceUUID"),_replaceUUIDsInLinks=new WeakSet,replaceUUIDsInLinks_fn=__name2(function(text){return typeof text!="string"?text:Array.from(text.matchAll(/(?<=@UUID\[)[^\]]+(?=\])/g)).reduce((replaced,[link])=>replaced.replace(link,s=>__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,s)),text)},"#replaceUUIDsInLinks"),__name2(_Migration841V11UUIDFormat,"Migration841V11UUIDFormat"),__publicField(_Migration841V11UUIDFormat,"version",.841);let Migration841V11UUIDFormat=_Migration841V11UUIDFormat;const _Migration842NumifyNumericSettings=class extends MigrationBase{static{__name(this,"_Migration842NumifyNumericSettings")}async migrate(){for(const setting of["staminaVariant","worldClock.timeConvention"]){const value=game.settings.storage.get("world").getItem(`pf2e.${setting}`);value!==null&&typeof value!="number"&&await game.settings.set("pf2e",setting,Number(value))}}};__name2(_Migration842NumifyNumericSettings,"Migration842NumifyNumericSettings"),__publicField(_Migration842NumifyNumericSettings,"version",.842);let Migration842NumifyNumericSettings=_Migration842NumifyNumericSettings;const _Migration843RMArmorCustomModifiers=class extends MigrationBase{static{__name(this,"_Migration843RMArmorCustomModifiers")}async updateActor(source){if(source.type==="character"&&source.system.customModifiers?.armor){const customModifiers=source.system.customModifiers;customModifiers["-=armor"]=null}}};__name2(_Migration843RMArmorCustomModifiers,"Migration843RMArmorCustomModifiers"),__publicField(_Migration843RMArmorCustomModifiers,"version",.843);let Migration843RMArmorCustomModifiers=_Migration843RMArmorCustomModifiers;const _Migration844DeityDomainUUIDs=class extends MigrationBase{static{__name(this,"_Migration844DeityDomainUUIDs")}constructor(){super(...arguments),__privateAdd(this,_updateUUIDs),__privateAdd(this,_idMap,[{oldId:"0cbxczrql4MwAHwV",name:"Glyph Domain",pageId:"9g1dNytABTpmmGkG"},{oldId:"1BU8deh48XZFclWl",name:"Healing Domain",pageId:"A7vErdGAweYsFcW8"},{oldId:"1NHV4ujqoR2JVWpY",name:"Travel Domain",pageId:"bTujFcUut9RX4GCy"},{oldId:"1aoUqGYDrdpnPWio",name:"Family Domain",pageId:"SAnmegCTIqGW9S7S"},{oldId:"41qaGiMit8nDP4xv",name:"Abomination Domain",pageId:"qMS6QepvY7UQQjcr"},{oldId:"6klWznsb0f2bNg3T",name:"Void Domain",pageId:"xLxrtbsj4acqgsyC"},{oldId:"8ITGLquhimrr9CNv",name:"Indulgence Domain",pageId:"GiuzDTtkQAgtGW6n"},{oldId:"8pPvbTMZLIsvCwQk",name:"Darkness Domain",pageId:"CM9ZqWwl7myKn2X1"},{oldId:"9blxcDLIRPWenK5f",name:"Plague Domain",pageId:"hGoWOjdsUz16oJUm"},{oldId:"9tsJg13xeJLGzzGV",name:"Undeath Domain",pageId:"RIlgBuWGfHC1rzYu"},{oldId:"AaY3BmDItGry4oac",name:"Decay Domain",pageId:"cAxBEZsej32riaY5"},{oldId:"B40VxP6oZ0mIR4PS",name:"Fate Domain",pageId:"EC2eB0JglDG5j1gT"},{oldId:"BlovCvjhk4Ag07w2",name:"Dreams Domain",pageId:"0wCEUwABKPdKPj8e"},{oldId:"FJ9D4qpeRhJvjHai",name:"Star Domain",pageId:"6bDpXy7pQdGrd2og"},{oldId:"HYe7Yv1fYUANVVI3",name:"Death Domain",pageId:"798PFdS8FmefcOl0"},{oldId:"HpZ4NQIqBRcFihyE",name:"Wealth Domain",pageId:"mJBp4KIszuqrmnp5"},{oldId:"J7K7kHoIE69558Su",name:"Freedom Domain",pageId:"5MjSsuKOLBoiL8FB"},{oldId:"KXFxeEyD6MmJ3a6V",name:"Naga Domain",pageId:"QzsUe3Rt3SifTQvb"},{oldId:"KzuJAIWdjwoPjHkc",name:"Secrecy Domain",pageId:"S1gyomjojgtCdxc3"},{oldId:"M7koZH0zimcMgRDb",name:"Destruction Domain",pageId:"AOQZjqgfafqqtHOB"},{oldId:"MRHDhBQvgJhDZ1zq",name:"Cities Domain",pageId:"QSk78hQR3zskMlq2"},{oldId:"MktBsoHR9HsKrbbr",name:"Zeal Domain",pageId:"DI3MYGIK8iEycanU"},{oldId:"NA4v0iwIPgkde8DP",name:"Ambition Domain",pageId:"yaMJsfYZmWJLqbFE"},{oldId:"NEI4MDBGNjEtOEIy",name:"Introspection Domain",pageId:"qjnUXickBOBDBu2N"},{oldId:"O1qeC0mIufSf3wv5",name:"Passion Domain",pageId:"ajCEExOaxuB4C1tY"},{oldId:"OsM8NfP408uB6yTi",name:"Wyrmkin Domain",pageId:"nuywscaiVGXLQpZ1"},{oldId:"PrFvU65ewfst69Mp",name:"Water Domain",pageId:"U8WVR6EDfmUaMCbu"},{oldId:"TpFgfwcWrfT8zVMP",name:"Pain Domain",pageId:"FtW1gtbHgO0KofPl"},{oldId:"WrmaTmOHojfhiENF",name:"Truth Domain",pageId:"lgsJz7mZ1OTe340e"},{oldId:"X7MkBRJGUIp91k6f",name:"Sorrow Domain",pageId:"5TqEbLR9QT3gJGe3"},{oldId:"Xs6XznYHOZyQ0hJl",name:"Tyranny Domain",pageId:"T0JHj79aGphlZ4Mt"},{oldId:"Y2kOBQydrsSqGCyn",name:"Magic Domain",pageId:"DS95vr2zmTsjsMhU"},{oldId:"YQ6IT8DgEpqvOREx",name:"Might Domain",pageId:"MOVMHZU1SfkhNN1K"},{oldId:"ZAx1RUB376BjNdlF",name:"Repose Domain",pageId:"CbsAiY68e8n5vVVN"},{oldId:"Ze2hoTyOQHbaQ6jD",name:"Air Domain",pageId:"T2y0vuYibZCL7CH0"},{oldId:"ZyFTUCbA0zYrzynD",name:"Creation Domain",pageId:"ydbCjJ9PPmRzZhDN"},{oldId:"a0fe0kFowMMwUFZa",name:"Nightmares Domain",pageId:"R20JXF43vU5RQyUj"},{oldId:"c9odhpRoKId5dXmn",name:"Perfection Domain",pageId:"Czi3XXuNOSE7ISpd"},{oldId:"dnljU1twPjH4KFgO",name:"Swarm Domain",pageId:"rd0jQwvTK4jpv95o"},{oldId:"fVfFKKvGocG2JM5q",name:"Toil Domain",pageId:"EQfZepZX6rxxBRqG"},{oldId:"fqr2OnTww3bAq0ae",name:"Sun Domain",pageId:"CkBvj5y1lAm1jnsc"},{oldId:"giUsAWI9NbpdeUzl",name:"Knowledge Domain",pageId:"0GwpYEjCHWyfQvgg"},{oldId:"i4UU3qCjIMwejIQF",name:"Delirium Domain",pageId:"tuThzOCvMLbRVba8"},{oldId:"jWmGQxJvKh5y5zfB",name:"Protection Domain",pageId:"Dx47K8wpx8KZUa9S"},{oldId:"l2EFJssJKu7rG77m",name:"Luck Domain",pageId:"L11XsA5G89xVKlDw"},{oldId:"mBvjWSvg7UYdS9TL",name:"Moon Domain",pageId:"Y3DFBCWiM9GBIlfl"},{oldId:"p5Q5RGl1lKgs5DZZ",name:"Soul Domain",pageId:"rtobUemb6vF2Yu3Y"},{oldId:"rIDXRIdb9m2E3qC6",name:"Earth Domain",pageId:"zkiLWWYzzqoxmN2J"},{oldId:"rIZ7OoG8c4Cct42M",name:"Vigil Domain",pageId:"StXN6IHR6evRaeXF"},{oldId:"udASTZy5jJWFCt5w",name:"Time Domain",pageId:"3P0NWwP3s7bIiidH"},{oldId:"unN0otycQZanf3va",name:"Duty Domain",pageId:"uGQKjk2w4whzomky"},{oldId:"uy8GUGIOmEUNqIhH",name:"Trickery Domain",pageId:"xJtbGqoz3BcCjUik"},{oldId:"v4SDXgCuPdZqhMeL",name:"Fire Domain",pageId:"egSErNozlL3HRK1y"},{oldId:"wCPGej4ZwdKCNtym",name:"Change Domain",pageId:"7xrNAgAnBqBgE3yM"},{oldId:"wPtGuF1bh4wvKE6Q",name:"Confidence Domain",pageId:"flmxRzGxN2rRNyxZ"},{oldId:"xYx8UD0JnFyBHGhJ",name:"Nature Domain",pageId:"wBhgIgt47v9uspp3"},{oldId:"y3TTKFLPbP09HZUW",name:"Cold Domain",pageId:"jq9O1tl76g2AzLOh"},{oldId:"ywn4ODaUt382Z3Nz",name:"Lightning Domain",pageId:"Kca7UPuMm44tOo9n"},{oldId:"zec5N7EnDJANGHmy",name:"Dust Domain",pageId:"6qTjtFWaBO5b60zJ"}])}async updateActor(source){source.type==="npc"&&(source.system.details.publicNotes&&=__privateMethod(this,_updateUUIDs,updateUUIDs_fn).call(this,source.system.details.publicNotes))}async updateItem(source){source.system.description.gm&&=__privateMethod(this,_updateUUIDs,updateUUIDs_fn).call(this,source.system.description.gm),source.system.description.value&&=__privateMethod(this,_updateUUIDs,updateUUIDs_fn).call(this,source.system.description.value)}};_updateUUIDs=new WeakSet,updateUUIDs_fn=__name2(function(text){return __privateGet(this,_idMap).reduce((oldText,data)=>{const pattern=new RegExp(String.raw`\bCompendium\.pf2e\.domains\.(?:JournalEntry?\.)?(?:${data.oldId}|${data.name})\](?:\{[^}]+})?`,"g");return oldText.replace(pattern,`Compendium.pf2e.journals.JournalEntry.EEZvDB1Z7ezwaxIr.JournalEntryPage.${data.pageId}]{${data.name}}`)},text)},"#updateUUIDs"),_idMap=new WeakMap,__name2(_Migration844DeityDomainUUIDs,"Migration844DeityDomainUUIDs"),__publicField(_Migration844DeityDomainUUIDs,"version",.844);let Migration844DeityDomainUUIDs=_Migration844DeityDomainUUIDs;const _Migration845EmptySpellConsumables=class extends MigrationBase{static{__name(this,"_Migration845EmptySpellConsumables")}async preUpdateItem(source){if(source.type==="consumable"){const spell=source.system.spell;isObject(spell)&&!["_id","name","type","system"].every(p=>p in spell)&&(source.system.spell=null)}}};__name2(_Migration845EmptySpellConsumables,"Migration845EmptySpellConsumables"),__publicField(_Migration845EmptySpellConsumables,"version",.845);let Migration845EmptySpellConsumables=_Migration845EmptySpellConsumables;const _Migration846SpellSchoolOptional=class extends MigrationBase{static{__name(this,"_Migration846SpellSchoolOptional")}async updateItem(source){if(source.type!=="spell")return;const system=source.system;system.school&&(source.system.traits.value=uniq(compact([...source.system.traits.value,system.school.value])),system["-=school"]=null,delete system.school)}};__name2(_Migration846SpellSchoolOptional,"Migration846SpellSchoolOptional"),__publicField(_Migration846SpellSchoolOptional,"version",.846);let Migration846SpellSchoolOptional=_Migration846SpellSchoolOptional;const _Migration847TempHPRuleEvents=class extends MigrationBase{static{__name(this,"_Migration847TempHPRuleEvents")}async updateItem(source){const rules=source.system.rules.filter(r=>r.key==="TempHP");for(const rule of rules)rule.onCreate!==void 0&&(rule.events??={},rule.events.onCreate=rule.onCreate,delete rule.onCreate),rule.onTurnStart!==void 0&&(rule.events??={},rule.events.onTurnStart=rule.onTurnStart,delete rule.onTurnStart)}};__name2(_Migration847TempHPRuleEvents,"Migration847TempHPRuleEvents"),__publicField(_Migration847TempHPRuleEvents,"version",.847);let Migration847TempHPRuleEvents=_Migration847TempHPRuleEvents;const _Migration848NumericArmorProperties=class extends MigrationBase{static{__name(this,"_Migration848NumericArmorProperties")}constructor(){super(...arguments),__privateAdd(this,_oldToNew,[["armor","acBonus"],["dex","dexCap"],["check","checkPenalty"],["speed","speedPenalty"],["strength","strength"]])}async updateItem(source){if(source.type==="armor")for(const[oldKey,newKey]of __privateGet(this,_oldToNew)){const oldProperty=source.system[oldKey],newProperty=isObject(source.system[newKey])?0:source.system[newKey]??0;if(isObject(oldProperty)&&newProperty===0)if(delete source.system[oldKey],oldKey==="strength"){const value=Number(oldProperty.value)||null;source.system[newKey]=value===null?null:Math.max(Math.floor((value-10)/2),0)}else tupleHasValue(["checkPenalty","speedPenalty"],newKey)?(source.system[newKey]=Number(oldProperty.value)||null,source.system[`-=${oldKey}`]=null):(source.system[newKey]=Number(oldProperty.value)||0,source.system[`-=${oldKey}`]=null)}}};_oldToNew=new WeakMap,__name2(_Migration848NumericArmorProperties,"Migration848NumericArmorProperties"),__publicField(_Migration848NumericArmorProperties,"version",.848);let Migration848NumericArmorProperties=_Migration848NumericArmorProperties;const _Migration849DeleteBrokenThreshold=class extends MigrationBase{static{__name(this,"_Migration849DeleteBrokenThreshold")}async updateItem(source){const hitPoints="hp"in source.system&&isObject(source.system.hp)?source.system.hp:null;isObject(hitPoints)&&"brokenThreshold"in hitPoints&&(delete hitPoints.brokenThreshold,hitPoints["-=brokenThreshold"]=null)}};__name2(_Migration849DeleteBrokenThreshold,"Migration849DeleteBrokenThreshold"),__publicField(_Migration849DeleteBrokenThreshold,"version",.849);let Migration849DeleteBrokenThreshold=_Migration849DeleteBrokenThreshold;const _Migration850FlatFootedToOffGuard=class extends MigrationBase{static{__name(this,"_Migration850FlatFootedToOffGuard")}constructor(){super(...arguments),__privateAdd(this,_replace),__privateAdd(this,_oldNamePattern,new RegExp(/\bFlat-Footed\b/g)),__privateAdd(this,_newName,"Off-Guard"),__privateAdd(this,_imgPattern,/(?<=systems\/pf2e\/icons\/conditions(?:-2)?\/)flat-?footed.webp$/i),__privateAdd(this,_aToAnUUIDPatern,/\ba(?= @UUID\[Compendium\.pf2e\.conditionitems\.Item\.(?:Flat-Footed|AJh5ex99aV6VTggg)\])/g)}async updateActor(source){source.type==="hazard"&&(source.system.details.routine&&=__privateMethod(this,_replace,replace_fn).call(this,source.system.details.routine)),"attributes"in source.system&&isObject$1(source.system.attributes)&&"immunities"in source.system.attributes&&(source.system.attributes.immunities=recursiveReplaceString(source.system.attributes.immunities,s=>__privateMethod(this,_replace,replace_fn).call(this,s)))}async updateItem(source){source.name=source.name.replace(__privateGet(this,_oldNamePattern),__privateGet(this,_newName)),source.img=source.img.replace(__privateGet(this,_imgPattern),"off-guard.webp"),source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_replace,replace_fn).call(this,s))}async updateJournalEntry(source){source.name!=="Remaster Changes"&&(source.name=source.name.replace(__privateGet(this,_oldNamePattern),__privateGet(this,_newName)),"img"in source&&typeof source.img=="string"&&(source.img=source.img.replace(__privateGet(this,_imgPattern),"off-guard.webp")),source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_replace,replace_fn).call(this,s)),"content"in source&&typeof source.content=="string"&&(source.content=__privateMethod(this,_replace,replace_fn).call(this,source.content)))}};_oldNamePattern=new WeakMap,_newName=new WeakMap,_imgPattern=new WeakMap,_aToAnUUIDPatern=new WeakMap,_replace=new WeakSet,replace_fn=__name2(function(text){return text.replace(__privateGet(this,_imgPattern),"off-guard.webp").replace(/^flat-footed$/,"off-guard").replace(/(?<=[:.])flat-footed\b/g,"off-guard").replace(/\.Flat-Footed\b/g,".Off-Guard").replace(/\bFlatFooted\b/g,"OffGuard").replace(/\.flatFootable\b/g,".offGuardable").replace(__privateGet(this,_oldNamePattern),"Off-Guard").replace(/\bflatfooted\b/g,"flat-footed").replace(/\ba flat-footed\b/g,"an off-guard").replace(__privateGet(this,_aToAnUUIDPatern),"an").replace(/\bFlat-footed\b/g,"Off-guard").replace(/\bflat-footed\b/g,"off-guard")},"#replace"),__name2(_Migration850FlatFootedToOffGuard,"Migration850FlatFootedToOffGuard"),__publicField(_Migration850FlatFootedToOffGuard,"version",.85);let Migration850FlatFootedToOffGuard=_Migration850FlatFootedToOffGuard;const _Migration851JustInnovationId=class extends MigrationBase{static{__name(this,"_Migration851JustInnovationId")}async updateItem(source){if(source.type!=="feat")return;source.system.rules=source.system.rules.map(r=>recursiveReplaceString(r,s=>s.replace("flags.pf2e.armorInnovationId","flags.pf2e.innovationId")));const hasAELike=source.system.rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.innovationId");if(source.system.slug==="weapon-innovation"&&!hasAELike){const reSource={key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.innovationId",value:"{item|flags.pf2e.itemGrants.weaponInnovation.id}"};source.system.rules.push(reSource)}else if(source.system.slug==="construct-innovation"&&!hasAELike){const reSource={key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.innovationId",value:null};source.system.rules.push(reSource)}else if(source.system.slug==="inventor-weapon-expertise"&&!source.system.rules.some(r=>r.key==="CriticalSpecialization")){const reSource={key:"CriticalSpecialization",predicate:["feature:weapon-innovation","item:id:{actor|flags.pf2e.innovationId}"]};source.system.rules.push(reSource)}}};__name2(_Migration851JustInnovationId,"Migration851JustInnovationId"),__publicField(_Migration851JustInnovationId,"version",.851);let Migration851JustInnovationId=_Migration851JustInnovationId;const _Migration852AbilityScoresToModifiers=class extends MigrationBase{static{__name(this,"_Migration852AbilityScoresToModifiers")}async updateActor(source){if(source.type!=="character")return;if(source.system.abilities&&Object.keys(source.system.abilities).length>0){const abilityObjects=Object.values(source.system.abilities);for(const data of abilityObjects)typeof data.value=="number"&&(data.mod=Math.min(Math.max(Math.trunc((data.value-10)/2),-5),10)||0,delete data.value,data["-=value"]=null)}else if(source.system.abilities){const systemData=source.system;delete systemData.abilities,systemData["-=abilities"]=null}const build=source.system.build??{};build.abilities&&(build.attributes=build.abilities,delete build.abilities,build["-=abilities"]=null)}async updateItem(source){const apexRules=source.system.rules.filter(r=>r.key==="ActiveEffectLike"&&typeof r.path=="string"&&/^system\.abilities\..+\.value$/.test(r.path)&&typeof r.value=="number");for(const rule of apexRules)switch(rule.path=rule.path.replace(/\.value$/,".mod"),rule.mode){case"add":case"remove":case"subtract":rule.value=Math.min(Math.max(Math.trunc(rule.value/2),-5),10)||0;break;case"downgrade":case"override":case"upgrade":rule.value=Math.min(Math.max(Math.trunc((rule.value-10)/2),-5),10)||0;break}const otherRules=source.system.rules.filter(r=>"value"in r&&typeof r.value=="string"&&/\.abilities\.[a-z]{3}\.value\b/.test(r.value));for(const rule of otherRules)rule.value=rule.value.replace(/(?:floor\()?\(?@actor.abilities.([a-z]{3})\.value ?- ?10\) ?\/ ?2\)?/,"@actor.abilities.$1.mod").replace(/\s+/g," ").trim();if(source.system.slug==="thaumaturges-investiture"){source.system.rules=source.system.rules.filter(r=>r.key!=="ActiveEffectLike");const bracketedAELike={key:"ActiveEffectLike",mode:"upgrade",path:"system.resources.investiture.max",value:{brackets:[{end:4,start:4,value:14},{end:5,start:5,value:16},{end:6,start:6,value:18},{start:7,value:20}],field:"system.abilities.cha.mod"}};source.system.rules.push(bracketedAELike)}}};__name2(_Migration852AbilityScoresToModifiers,"Migration852AbilityScoresToModifiers"),__publicField(_Migration852AbilityScoresToModifiers,"version",.852);let Migration852AbilityScoresToModifiers=_Migration852AbilityScoresToModifiers;const _Migration853RemasterLanguages=class extends MigrationBase{static{__name(this,"_Migration853RemasterLanguages")}constructor(){super(...arguments),__privateAdd(this,_OLD_TO_NEW_LANGUAGES,new Map([["aquan","thalassic"],["auran","sussuran"],["ignan","pyric"],["sylvan","fey"],["terran","petran"]]))}async updateActor(source){const languages=source.system.traits?.languages??{};languages?.value&&(languages.value=languages.value.map(l=>__privateGet(this,_OLD_TO_NEW_LANGUAGES).get(l)??l).sort())}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateGet(this,_OLD_TO_NEW_LANGUAGES).get(s)??s),source.type==="ancestry"&&Array.isArray(source.system.additionalLanguages?.value)&&source.system.additionalLanguages.value.sort()}};_OLD_TO_NEW_LANGUAGES=new WeakMap,__name2(_Migration853RemasterLanguages,"Migration853RemasterLanguages"),__publicField(_Migration853RemasterLanguages,"version",.853);let Migration853RemasterLanguages=_Migration853RemasterLanguages;const _Migration854BracketedAbilityScoresToModifiers=class extends MigrationBase{static{__name(this,"_Migration854BracketedAbilityScoresToModifiers")}async updateItem(source){const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike"&&typeof r.path=="string"&&/^system\.abilities\..+\.value$/.test(r.path)&&isObject(r.value)&&typeof r.value.field=="string"&&/^actor\|system\.abilities\.[a-z]{3}\.value$/.test(r.value.field)&&Array.isArray(r.value.brackets)&&r.value.brackets.every(b=>isObject(b)&&typeof b.value=="number"));for(const aeLike of aeLikes){aeLike.path=aeLike.path.replace(/\.value$/,".mod"),aeLike.value.field&&=aeLike.value.field.replace(/\.value$/,".mod");for(const bracket of aeLike.value.brackets)typeof bracket.start=="number"&&(bracket.start=Math.trunc((bracket.start-10)/2)),typeof bracket.end=="number"&&(bracket.end=Math.trunc((bracket.end-10)/2)),bracket.value=bracket.value/2}}};__name2(_Migration854BracketedAbilityScoresToModifiers,"Migration854BracketedAbilityScoresToModifiers"),__publicField(_Migration854BracketedAbilityScoresToModifiers,"version",.854);let Migration854BracketedAbilityScoresToModifiers=_Migration854BracketedAbilityScoresToModifiers;const _Migration855ApexEquipmentSystemData=class extends MigrationBase{static{__name(this,"_Migration855ApexEquipmentSystemData")}async updateItem(source){if(source.type!=="equipment"||!source.system.traits.value.includes("apex"))return;const attributeModPattern=/^system\.abilities\.([a-z]{3})\.mod$/,isApexRE=__name2(r=>r.key==="ActiveEffectLike"&&attributeModPattern.test(String(r.path)),"isApexRE"),apexAttribute=source.system.rules.flatMap(r=>isApexRE(r)?attributeModPattern.exec(String(r.path))?.at(1):[]).shift();setHasElement(ATTRIBUTE_ABBREVIATIONS,apexAttribute)&&(source.system.apex??={attribute:apexAttribute},source.system.rules=source.system.rules.filter(r=>!isApexRE(r)))}};__name2(_Migration855ApexEquipmentSystemData,"Migration855ApexEquipmentSystemData"),__publicField(_Migration855ApexEquipmentSystemData,"version",.855);let Migration855ApexEquipmentSystemData=_Migration855ApexEquipmentSystemData;const _Migration856NoSystemDotCustom=class extends MigrationBase{static{__name(this,"_Migration856NoSystemDotCustom")}async updateItem(source){source.system.rules=source.system.rules.map(r=>recursiveReplaceString(r,s=>s.replace(/\bsystem\.custom\.(?:modifiers\.)?([-a-z]+)/,(_match,group1)=>`flags.pf2e.${sluggify(group1,{camel:"dromedary"})}`)))}};__name2(_Migration856NoSystemDotCustom,"Migration856NoSystemDotCustom"),__publicField(_Migration856NoSystemDotCustom,"version",.856);let Migration856NoSystemDotCustom=_Migration856NoSystemDotCustom;const _Migration857WeaponSpecializationRE=class extends MigrationBase{static{__name(this,"_Migration857WeaponSpecializationRE")}async updateItem(source){const slug=source.system.slug??sluggify(source.name);source.type!=="feat"||!slug.includes("weapon-specialization")||slug.includes("eidolon-weapon-specialization")||source.system.rules.some(r=>r.slug==="weapon-specialization")||(slug.includes("greater-weapon-specialization")?source.system.rules.unshift({key:"AdjustModifier",mode:"multiply",relabel:"PF2E.GreaterWeaponSpecialization",selector:"strike-damage",slug:"weapon-specialization",value:2}):source.system.rules.unshift({hideIfDisabled:!0,key:"FlatModifier",label:"PF2E.WeaponSpecialization",predicate:[{gte:["item:proficiency:rank",2]}],selector:"strike-damage",slug:"weapon-specialization",value:2},{key:"AdjustModifier",mode:"upgrade",predicate:["item:proficiency:rank:3"],priority:0,selector:"strike-damage",slug:"weapon-specialization",value:3},{key:"AdjustModifier",mode:"upgrade",predicate:["item:proficiency:rank:4"],priority:0,selector:"strike-damage",slug:"weapon-specialization",value:4}))}};__name2(_Migration857WeaponSpecializationRE,"Migration857WeaponSpecializationRE"),__publicField(_Migration857WeaponSpecializationRE,"version",.857);let Migration857WeaponSpecializationRE=_Migration857WeaponSpecializationRE;const _Migration858FakeWeaponSpecialization=class extends MigrationBase{static{__name(this,"_Migration858FakeWeaponSpecialization")}constructor(){super(...arguments),__privateAdd(this,_testHasOption)}async updateItem(source){if(source.type!=="feat")return;const slug=source.system.slug??sluggify(source.name);slug==="greater-weapon-specialization-barbarian"&&!__privateMethod(this,_testHasOption,testHasOption_fn).call(this,source)?source.system.rules.push({domain:"all",key:"RollOption",option:"feature:greater-weapon-specialization"}):slug==="psychic-weapon-specialization"&&!__privateMethod(this,_testHasOption,testHasOption_fn).call(this,source)&&source.system.rules.push({domain:"all",key:"RollOption",option:"feature:weapon-specialization"})}};_testHasOption=new WeakSet,testHasOption_fn=__name2(function(source){return source.system.rules.some(r=>r.key==="RollOption"&&"option"in r&&["feature:greater-weapon-specialization","feature:weapon-specialization"].includes(String(r.option)))},"#testHasOption"),__name2(_Migration858FakeWeaponSpecialization,"Migration858FakeWeaponSpecialization"),__publicField(_Migration858FakeWeaponSpecialization,"version",.858);let Migration858FakeWeaponSpecialization=_Migration858FakeWeaponSpecialization;const _Migration859MaterialTypeGrade=class extends MigrationBase{static{__name(this,"_Migration859MaterialTypeGrade")}constructor(){super(...arguments),__privateAdd(this,_hasOldMaterialData)}async updateItem(source){if(itemIsOfType(source,"physical")&&__privateMethod(this,_hasOldMaterialData,hasOldMaterialData_fn).call(this,source)){const{preciousMaterial,preciousMaterialGrade}=source.system,type=setHasElement(PRECIOUS_MATERIAL_TYPES,preciousMaterial?.value)?preciousMaterial?.value??null:null,grade=setHasElement(PRECIOUS_MATERIAL_GRADES,preciousMaterialGrade?.value)?preciousMaterialGrade?.value??null:null;source.system.material={type,grade},"game"in globalThis?(source.system["-=preciousMaterial"]=null,source.system["-=preciousMaterialGrade"]=null):(delete source.system.preciousMaterial,delete source.system.preciousMaterialGrade)}}};_hasOldMaterialData=new WeakSet,hasOldMaterialData_fn=__name2(function(source){return"preciousMaterial"in source.system&&isObject(source.system.preciousMaterial)&&"preciousMaterialGrade"in source.system&&isObject(source.system.preciousMaterialGrade)},"#hasOldMaterialData"),__name2(_Migration859MaterialTypeGrade,"Migration859MaterialTypeGrade"),__publicField(_Migration859MaterialTypeGrade,"version",.859);let Migration859MaterialTypeGrade=_Migration859MaterialTypeGrade;const _Migration860RMGroup=class extends MigrationBase{static{__name(this,"_Migration860RMGroup")}async updateItem(source){itemIsOfType(source,"armor","condition","weapon")||!("group"in source.system)||("game"in globalThis?source.system["-=group"]=null:delete source.system.group)}};__name2(_Migration860RMGroup,"Migration860RMGroup"),__publicField(_Migration860RMGroup,"version",.86);let Migration860RMGroup=_Migration860RMGroup;const _Migration861AuraColorsToAppearance=class extends MigrationBase{static{__name(this,"_Migration861AuraColorsToAppearance")}async updateItem(source){const auraREs=source.system.rules.filter(r=>r.key==="Aura"&&"colors"in r&&isObject(r.colors));for(const rule of auraREs)rule.appearance={},typeof rule.colors?.border=="string"&&(rule.appearance.border={color:rule.colors.border}),typeof rule.colors?.fill=="string"&&(rule.appearance.highlight={color:rule.colors.fill}),delete rule.colors}};__name2(_Migration861AuraColorsToAppearance,"Migration861AuraColorsToAppearance"),__publicField(_Migration861AuraColorsToAppearance,"version",.861);let Migration861AuraColorsToAppearance=_Migration861AuraColorsToAppearance;const _Migration862SpecificMagicArmor=class extends MigrationBase{static{__name(this,"_Migration862SpecificMagicArmor")}constructor(){super(...arguments),__privateAdd(this,_resilientRuneValues,new Map([["",0],["resilient",1],["greaterResilient",3],["majorResilient",3]]))}async updateItem(source){if(source.type!=="armor"||source.system.category==="shield")return;switch(source.system.slug){case"power-suit":source.system.baseItem="power-suit";break;case"subterfuge-suit":source.system.baseItem;break;case"clothing-explorers":source.system.slug="explorers-clothing",source.name.endsWith("Clothing (Explorer's)")&&(source.name="Explorer's Clothing")}source.system.slug==="power-suit"&&(source.system.baseItem??="power-suit"),source.system.slug==="subterfuge-suit"&&(source.system.baseItem??="subterfuge-suit");const isMagical=!!(source.system.potencyRune.value||source.system.resiliencyRune.value),hasBaseAndSlug=!!(source.system.baseItem&&source.system.slug);isMagical&&hasBaseAndSlug&&source.system.baseItem!==source.system.slug&&(source.system.specific??={value:!0,material:source.system.material??null,runes:{potency:source.system.potencyRune?.value||1,resilient:__privateGet(this,_resilientRuneValues).get(source.system.resiliencyRune?.value??"")||0}})}};_resilientRuneValues=new WeakMap,__name2(_Migration862SpecificMagicArmor,"Migration862SpecificMagicArmor"),__publicField(_Migration862SpecificMagicArmor,"version",.862);let Migration862SpecificMagicArmor=_Migration862SpecificMagicArmor;const _Migration863FixMisspelledOrganaizationsProperty=class extends MigrationBase{static{__name(this,"_Migration863FixMisspelledOrganaizationsProperty")}async updateActor(source){if(source.type!=="character")return;const biography=source.system.details.biography;biography.organaizations!==void 0&&(biography.organizations=biography.organaizations,delete biography.organaizations,biography["-=organaizations"]=null)}};__name2(_Migration863FixMisspelledOrganaizationsProperty,"Migration863FixMisspelledOrganaizationsProperty"),__publicField(_Migration863FixMisspelledOrganaizationsProperty,"version",.863);let Migration863FixMisspelledOrganaizationsProperty=_Migration863FixMisspelledOrganaizationsProperty;const _Migration864RemoveWeaponMAP=class extends MigrationBase{static{__name(this,"_Migration864RemoveWeaponMAP")}async updateItem(source){if(source.type==="weapon"&&isObject(source.system.MAP)){const mapValue=-1*Number(source.system.MAP.value);if(mapValue<0&&mapValue!==-5){const rule={key:"MultipleAttackPenalty",selector:"{item|id}-attack",value:mapValue};source.system.rules.push(rule)}"game"in globalThis?source.system["-=MAP"]=null:delete source.system.MAP}}};__name2(_Migration864RemoveWeaponMAP,"Migration864RemoveWeaponMAP"),__publicField(_Migration864RemoveWeaponMAP,"version",.864);let Migration864RemoveWeaponMAP=_Migration864RemoveWeaponMAP;const _Migration865VitalityVoid=class extends MigrationBase{static{__name(this,"_Migration865VitalityVoid")}constructor(){super(...arguments),__privateAdd(this,_replaceStrings)}async updateActor(source){source.system=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.system),source.flags=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.flags)}async updateItem(source){source.system=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.system),source.flags=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.flags)}};_replaceStrings=new WeakSet,replaceStrings_fn=__name2(function(data){return recursiveReplaceString(data,s=>s.replace(/^positive$/,"vitality").replace(/^negative$/,"void").replace(/^versatile-positive$/,"versatile-vitality").replace(/^versatile-negative$/,"versatile-void").replace(/\bpositive\]/g,"vitality]").replace(/\bnegative\]/g,"void]").replace(/\[positive\b/g,"[vitality").replace(/\[negative\b/g,"[void").replace(/\bRollFlavor\.positive\b/g,"RollFlavor.vitality").replace(/\bRollFlavor\.negative\b/g,"RollFlavor.void").replace(/\bTraitPositive\b/g,"TraitVitality").replace(/\bTraitNegative\b/g,"TraitVoid").replace(/\bTraitVersatilePositive\b/g,"TraitVersatileVitality").replace(/\bTraitVersatileNegative\b/g,"TraitVersatileVoid").replace(/\bnegative negative damage\b/,"void damage"))},"#replaceStrings"),__name2(_Migration865VitalityVoid,"Migration865VitalityVoid"),__publicField(_Migration865VitalityVoid,"version",.865);let Migration865VitalityVoid=_Migration865VitalityVoid;const _Migration866LinkToActorSizeAgain=class extends MigrationBase{static{__name(this,"_Migration866LinkToActorSizeAgain")}async updateActor(actorSource){SIZE_LINKABLE_ACTOR_TYPES.has(actorSource.type)||actorSource.prototypeToken.flags.pf2e&&(actorSource.prototypeToken.flags.pf2e.linkToActorSize=!1,actorSource.prototypeToken.flags.pf2e.autoscale=!1)}async updateToken(tokenSource,actor){!actor||SIZE_LINKABLE_ACTOR_TYPES.has(actor.type)||mergeObject(tokenSource.flags,{pf2e:{linkToActorSize:!1,autoscale:!1}})}};__name2(_Migration866LinkToActorSizeAgain,"Migration866LinkToActorSizeAgain"),__publicField(_Migration866LinkToActorSizeAgain,"version",.866);let Migration866LinkToActorSizeAgain=_Migration866LinkToActorSizeAgain;const _Migration867DamageRollDomainFix=class extends MigrationBase{static{__name(this,"_Migration867DamageRollDomainFix")}async updateItem(source){for(const rule of source.system.rules??[])"domain"in rule&&rule.domain==="damage-roll"&&(rule.domain="damage")}};__name2(_Migration867DamageRollDomainFix,"Migration867DamageRollDomainFix"),__publicField(_Migration867DamageRollDomainFix,"version",.867);let Migration867DamageRollDomainFix=_Migration867DamageRollDomainFix;const _Migration868StrikeRERange=class extends MigrationBase{static{__name(this,"_Migration868StrikeRERange")}async updateItem(source){const strikeREs=source.system.rules.filter(r=>r.key==="Strike");for(const rule of strikeREs)typeof rule.maxRange=="number"&&rule.range!==rule.maxRange/6?rule.range={max:rule.maxRange}:typeof rule.range=="number"&&(rule.range={increment:rule.range}),delete rule.maxRange}};__name2(_Migration868StrikeRERange,"Migration868StrikeRERange"),__publicField(_Migration868StrikeRERange,"version",.868);let Migration868StrikeRERange=_Migration868StrikeRERange;const _Migration869RefreshMightyBulwark=class extends MigrationBase{static{__name(this,"_Migration869RefreshMightyBulwark")}constructor(){super(...arguments),__privateAdd(this,_mightyBulwarkRules)}async updateItem(source){if(source.type==="feat"&&source.system.slug==="mighty-bulwark")source.system.rules=__privateGet(this,_mightyBulwarkRules,mightyBulwarkRules_get);else for(const rule of source.system.rules)"option"in rule&&rule.option==="self:armor:strength-requirement-met"&&(rule.option="armor:strength-requirement-met")}};_mightyBulwarkRules=new WeakSet,mightyBulwarkRules_get=__name2(function(){return[{key:"FlatModifier",predicate:["armor:trait:bulwark"],selector:"reflex",value:4},{key:"AdjustModifier",predicate:["armor:trait:bulwark"],selector:"reflex",slug:"dex",suppress:!0},{key:"AdjustModifier",selector:"reflex",slug:"bulwark",suppress:!0}]},"#mightyBulwarkRules"),__name2(_Migration869RefreshMightyBulwark,"Migration869RefreshMightyBulwark"),__publicField(_Migration869RefreshMightyBulwark,"version",.869);let Migration869RefreshMightyBulwark=_Migration869RefreshMightyBulwark;const _Migration870MartialToProficiencies=class extends MigrationBase{static{__name(this,"_Migration870MartialToProficiencies")}constructor(){super(...arguments),__privateAdd(this,_defensePathPattern,new RegExp(String.raw`system\.martial\.(?:${Array.from(ARMOR_CATEGORIES).join("|")})\.`))}async updateActor(source){if(source.type!=="character")return;const systemSource=source.system,oldData=isObject(systemSource.martial)&&Object.keys(systemSource.martial).length>0?systemSource.martial:{};for(const[key,data]of Object.entries(oldData))!data.rank||["simple","unarmed","unarmored"].includes(key)&&data.rank===1||(systemSource.proficiencies??={},setHasElement(ARMOR_CATEGORIES,key)?(systemSource.proficiencies.defenses??={},systemSource.proficiencies.defenses[key]={rank:data.rank}):(systemSource.proficiencies.attacks??={},systemSource.proficiencies.attacks[key]={custom:data.custom,rank:data.rank}));"game"in globalThis&&"martial"in systemSource?systemSource["-=martial"]=null:delete systemSource.martial}async updateItem(source){source.system.rules=source.system.rules.map(r=>recursiveReplaceString(r,text=>{const key=__privateGet(this,_defensePathPattern).test(text)?"defenses":"attacks";return text.replace(/\bsystem\.martial\./g,`system.proficiencies.${key}.`)}))}};_defensePathPattern=new WeakMap,__name2(_Migration870MartialToProficiencies,"Migration870MartialToProficiencies"),__publicField(_Migration870MartialToProficiencies,"version",.87);let Migration870MartialToProficiencies=_Migration870MartialToProficiencies;const _Migration871MigrateRollActionMacroParams=class extends MigrationBase{static{__name(this,"_Migration871MigrateRollActionMacroParams")}async updateMacro(source){if(source.type!=="script")return;const matches=source.command.matchAll(/game\.pf2e\.rollActionMacro\("(.+)".*"(.+)"\)/gm);for(const match of matches){if(match.length<3)continue;const[current,itemId,slug]=match;source.command=source.command.replace(current,`game.pf2e.rollActionMacro({ itemId: "${itemId}", slug: "${slug}" })`)}}};__name2(_Migration871MigrateRollActionMacroParams,"Migration871MigrateRollActionMacroParams"),__publicField(_Migration871MigrateRollActionMacroParams,"version",.871);let Migration871MigrateRollActionMacroParams=_Migration871MigrateRollActionMacroParams;const _Migration872MoveSchemaProperty=class extends MigrationBase{static{__name(this,"_Migration872MoveSchemaProperty")}constructor(){super(...arguments),__privateAdd(this,_mvSchema)}async updateActor(source){__privateMethod(this,_mvSchema,mvSchema_fn).call(this,source.system)}async updateItem(source){__privateMethod(this,_mvSchema,mvSchema_fn).call(this,source.system)}};_mvSchema=new WeakSet,mvSchema_fn=__name2(function(systemData){const migrations=systemData._migration??={version:null,previous:null};"schema"in systemData&&(systemData["-=schema"]=null,isObject(systemData.schema)&&typeof systemData.schema.version=="number"&&(migrations.version=systemData.schema.version))},"#mvSchema"),__name2(_Migration872MoveSchemaProperty,"Migration872MoveSchemaProperty"),__publicField(_Migration872MoveSchemaProperty,"version",.872);let Migration872MoveSchemaProperty=_Migration872MoveSchemaProperty;const _Migration873RemoveBonusBulkLimit=class extends MigrationBase{static{__name(this,"_Migration873RemoveBonusBulkLimit")}async updateActor(source){if(source.type!=="character"&&source.type!=="npc")return;const data=source.system;"bonusLimitBulk"in data.attributes&&(delete data.attributes.bonusLimitBulk,data.attributes["-=bonusLimitBulk"]=null),"bonusEncumbranceBulk"in data.attributes&&(delete data.attributes.bonusEncumbranceBulk,data.attributes["-=bonusEncumbranceBulk"]=null)}async updateItem(source){source.system.rules=recursiveReplaceString(source.system.rules,text=>text.replace(/^system\.attributes\.bonusEncumbranceBulk$/,"inventory.bulk.encumberedAfterAddend").replace(/^system\.attributes\.bonusLimitBulk$/,"inventory.bulk.maxAddend"))}};__name2(_Migration873RemoveBonusBulkLimit,"Migration873RemoveBonusBulkLimit"),__publicField(_Migration873RemoveBonusBulkLimit,"version",.873);let Migration873RemoveBonusBulkLimit=_Migration873RemoveBonusBulkLimit;const _Migration874MoveStaminaStuff=class extends MigrationBase{static{__name(this,"_Migration874MoveStaminaStuff")}async updateActor(source){if(source.type!=="character")return;const variantEnabled="game"in globalThis&&game.settings.storage.get("world").find(s=>s.key==="pf2e.staminaVariant")?.value!=='"0"'&&game.settings.get("pf2e","staminaVariant"),systemSource=source.system;if(isObject(systemSource.attributes.sp)){const value=Math.floor(Number(systemSource.attributes.sp.value))||0;value>0&&variantEnabled&&(systemSource.attributes.hp.sp={value}),delete systemSource.attributes.sp,systemSource.attributes["-=sp"]=null}if(isObject(systemSource.attributes.resolve)){const value=Math.floor(Number(systemSource.attributes.resolve.value))||0;value>0&&variantEnabled&&(systemSource.resources.resolve={value}),delete systemSource.attributes.resolve,systemSource.attributes["-=resolve"]=null}}async updateItem(source){source.system.rules=recursiveReplaceString(source.system.rules,text=>text.replace(/^system\.attributes\.sp\.max$/,"system.attributes.hp.sp.max").replace(/^system\.attributes\.resolve.max$/,"system.resources.resolve.max"))}async migrate(){const staminaVariant=game.settings.storage.get("world").find(s=>s.key==="pf2e.staminaVariant");["1",'"1"'].includes(staminaVariant?._source.value??"")?await game.settings.set("pf2e","staminaVariant",!0):staminaVariant&&await game.settings.set("pf2e","staminaVariant",!1),game.settings.storage.get("world").find(s=>s.key==="pf2e.proficiencyVariant")?._source.value==='"ProficiencyWithoutLevel"'?await game.settings.set("pf2e","proficiencyVariant",!0):staminaVariant&&await game.settings.set("pf2e","proficiencyVariant",!1)}};__name2(_Migration874MoveStaminaStuff,"Migration874MoveStaminaStuff"),__publicField(_Migration874MoveStaminaStuff,"version",.874);let Migration874MoveStaminaStuff=_Migration874MoveStaminaStuff;const _Migration875SetInnovationIdEarly=class extends MigrationBase{static{__name(this,"_Migration875SetInnovationIdEarly")}async updateItem(source){if(source.type!=="feat"||!["armor-innovation","weapon-innovation"].includes(source.system.slug??""))return;const aeLike=source.system.rules.find(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.innovationId");aeLike&&(aeLike.priority=5)}};__name2(_Migration875SetInnovationIdEarly,"Migration875SetInnovationIdEarly"),__publicField(_Migration875SetInnovationIdEarly,"version",.875);let Migration875SetInnovationIdEarly=_Migration875SetInnovationIdEarly;const _Migration876FeatLevelTaken=class extends MigrationBase{static{__name(this,"_Migration876FeatLevelTaken")}async updateItem(source,actorSource){if(source.type!=="feat"||!setHasElement(FEAT_CATEGORIES,source.system.category))return;const location=source.system.location??"",background=actorSource?.items.find(i=>i.type==="background");if(location===background?._id)source.system.level.taken=1;else{const levelString=/^.+-(\d+)$/.exec(location)?.[1]??"NaN";levelString&&(source.system.level.taken=Number(levelString)||void 0)}const{category,traits}=source.system;category==="skill"&&!traits.value.includes("skill")?traits.value.push("skill"):category==="general"&&!traits.value.includes("general")&&traits.value.push("general"),traits.value.sort()}};__name2(_Migration876FeatLevelTaken,"Migration876FeatLevelTaken"),__publicField(_Migration876FeatLevelTaken,"version",.876);let Migration876FeatLevelTaken=_Migration876FeatLevelTaken;const _Migration877PublicationData=class extends MigrationBase{static{__name(this,"_Migration877PublicationData")}constructor(){super(...arguments),__privateAdd(this,_setPublicationData)}async updateActor(source){source.type!=="hazard"&&source.type!=="npc"&&source.type!=="vehicle"||(source.type==="vehicle"&&isObject$1(source.system.source)?(__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,source.system.source),"game"in globalThis?source.system["-=source"]=null:delete source.system.source):(source.type==="hazard"||source.type==="npc")&&isObject$1(source.system.details.source)&&(__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,source.system.details.source),"game"in globalThis?source.system.details["-=source"]=null:delete source.system.details.source))}async updateItem(source){if("details"in source.system&&isObject$1(source.system.details)){const oldDataInWrongPlace=source.system.details.source;isObject$1(oldDataInWrongPlace)&&typeof oldDataInWrongPlace.value=="string"&&(source.system.source={value:oldDataInWrongPlace.value.trim()}),"game"in globalThis?source.system["-=details"]=null:delete source.system.details}isObject$1(source.system.source)?(__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,source.system.source),"game"in globalThis?source.system["-=source"]=null:delete source.system.source):!source.system.publication&&!("game"in globalThis)&&__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,{})}};_setPublicationData=new WeakSet,setPublicationData_fn=__name2(function(systemSource,oldData){const title=typeof oldData.value=="string"?oldData.value.trim():"",authors=typeof oldData.author=="string"?oldData.author.trim():"",license=title==="Pathfinder Player Core"?"ORC":"OGL",remaster=["Pathfinder Player Core","Pathfinder Rage of Elements"].includes(title),publication={title,authors,license,remaster};isObject$1(systemSource.details)?systemSource.details.publication=publication:systemSource.publication=publication},"#setPublicationData"),__name2(_Migration877PublicationData,"Migration877PublicationData"),__publicField(_Migration877PublicationData,"version",.877);let Migration877PublicationData=_Migration877PublicationData;const _Migration878TakeABreather=class extends MigrationBase{static{__name(this,"_Migration878TakeABreather")}async updateMacro(source){source.type==="script"&&source.command.includes("console.log(resolve, sp)")&&(source.command="game.pf2e.actions.takeABreather();")}};__name2(_Migration878TakeABreather,"Migration878TakeABreather"),__publicField(_Migration878TakeABreather,"version",.878);let Migration878TakeABreather=_Migration878TakeABreather;const Migrations=Object.freeze(Object.defineProperty({__proto__:null,Migration600Reach,Migration601SplitEffectCompendia,Migration602UpdateDiehardFeat,Migration603ResetQuickRollDefault,Migration604FixClassItem,Migration605CatchUpToTemplateJSON,Migration606SignatureSpells,Migration607MeleeItemDamageRolls,Migration608DeletePersistedKits,Migration609LootActorTraits,Migration610SetHeritageFeatType,Migration611UpdateToughnessMountainsStoutness,Migration612NormalizeRarities,Migration613RemoveAmmoCharges,Migration614NumifyMeleeBonuses,Migration615RemoveInstinctTrait,Migration616MigrateFeatPrerequisites,Migration617FixUserFlags,Migration618MigrateItemImagePaths,Migration619TraditionLowercaseAndRemoveWandScroll,Migration620RenameToWebp,Migration621RemoveConfigSpellSchools,Migration623NumifyPotencyRunes,Migration624RemoveTokenEffectIconFlags,Migration625EnsurePresenceOfSaves,Migration626UpdateSpellCategory,Migration627LowerCaseSpellSaves,Migration629SetBaseItems,Migration630FixTalismanSpelling,Migration631FixSenseRuleElementSelector,Migration632DeleteOrphanedSpells,Migration633DeleteUnidentifiedTraits,Migration634PurgeMartialItems,Migration635NumifyACAndQuantity,Migration636NumifyArmorData,Migration637CleanMeleeItems,Migration638SpellComponents,Migration639NormalizeLevelAndPrice,Migration640CantripsAreNotZeroLevel,Migration641SovereignSteelValue,Migration642TrackSchemaVersion,Migration643HazardLevel,Migration644SpellcastingCategory,Migration645TokenImageSize,Migration646UpdateInlineLinks,Migration647FixPCSenses,Migration648RemoveInvestedProperty,Migration649FocusToActor,Migration650StringifyWeaponProperties,Migration651EphemeralFocusPool,Migration652KillHalcyonTradition,Migration653AEstoREs,Migration654ActionTypeAndCount,Migration655CreatureTokenSizes,Migration656OtherFocusPoolSources,Migration657RemoveSetProperty,Migration658MonkUnarmoredProficiency,Migration659MultipleDamageRows,Migration660DerivedSpellTraits,Migration661NumifyVehicleDimensions,Migration662LinkToActorSizeDefaults,Migration663FixSpellDamage,Migration664DeleteCUBConditions,Migration665HandwrapsCorrections,Migration666UsageAndStowingContainers,Migration667HPSubProperties,Migration668ArmorSpeedPenalty,Migration669NPCAttackEffects,Migration670AncestryVision,Migration670NoCustomTrait,Migration671NoPCItemsOnNonPCs,Migration672RemoveNPCBaseProperties,Migration673RemoveBulwarkREs,Migration674StableHomebrewTagIDs,Migration675FlatModifierAEsToREs,Migration676ReplaceItemsWithRELikeAEs,Migration677RuleValueDataRefs,Migration678SeparateNPCAttackTraits,Migration679TowerShieldSpeedPenalty,Migration680SetWeaponHands,Migration681GiantLanguageToJotun,Migration682BiographyFields,Migration683FlavorTextToPublicNotes,Migration684RationsToConsumable,Migration685FixMeleeUsageTraits,Migration686HeroPointsToResources,Migration687FamiliarityAEsToREs,Migration688ClampSpellLevel,Migration689EncumberanceActiveEffects,Migration690InitiativeTiebreakItems,Migration691WeaponRangeAbilityCategoryGroup,Migration692CraftingEntryFeatReplacement,Migration693ArmorCategoryGroup,Migration694RetireSystemTokenSettings,Migration695SummonToSummoned,Migration696FlatAbilityModifiers,Migration697WeaponReachTrait,Migration698RemoveDerivedActorTraits,Migration699ItemDescriptionEmptyString,Migration700SingleClassFeatures,Migration701ModifierNameToSlug,Migration702REFormulasAtInstanceLevel,Migration703SpellDamageStructure,Migration704MartialProficiencyRE,Migration705GunslingerCatchUp,Migration706FormulasAtInstanceLevelEverythingElse,Migration707BracketedFormulasAtInstanceLevel,Migration708SpecificRuleLabel,Migration709REFormulasAtInstanceLevelRedux,Migration710RarityToString,Migration711HeritageItems,Migration712ActorShieldStructure,Migration713FistToStrikeRE,Migration714RangeIncrementREs,Migration715DangerousSorcery,Migration716StrikeDamageSelector,Migration717TakeFeatLimits,Migration718CarryType,Migration719ShrugFlanking,Migration720UpdateSpellDescriptions,Migration721SetReloadValues,Migration722CraftingSystemData,Migration723CumulativeItemBonuses,Migration724CraftingMaxItemLevel,Migration725QuickClimbREs,Migration726JournalSetting,Migration727TrimSelfRollOptions,Migration728FlattenPhysicalProperties,Migration729CumulativeItemBonusCleanup,Migration730DeruneHandwraps,Migration731TogglePropertyToRollOption,Migration732FixDedicationFeatTypes,Migration733ItemBonusFromEquipment,Migration734SpellLocationPropsAndSignature,Migration735FirearmAmmoAlchemical,Migration736RemoveBrokenThreshold,Migration737NormalizeRuleElementKeys,Migration738UpdateLaughingShadow,Migration739RecoveryCheckDC,Migration740MaxTakable,Migration741RollOptionToggleToItem,Migration742RMAbilityBoostLevels,Migration743FixWeaknessStructure,Migration744MigrateSpellHeighten,Migration745EffectTargetToChoiceSet,Migration746StandardizePricing,Migration747FixedHeightening,Migration748BatchConsumablePricing,Migration749AssuranceREs,Migration750FixCorruptedPrice,Migration751ResetRollOptions,Migration752StrikeVsWeaponTraits,Migration753WeaponReloadTimes,Migration754MightyBulwarkAdjustModifiers,Migration755GrantIdsToData,Migration756RMStoredResourceMaxes,Migration757HillockHalfling,Migration758PrunePCAttributes,Migration759CritSpecRE,Migration760SeparateNoteTitle,Migration761ShotRules,Migration762UpdateBackgroundItems,Migration763RestoreAnimalStrikeOptions,Migration764PanacheVivaciousREs,Migration765ChoiceOwnedItemTypes,Migration766WipeURLSources,Migration767ConvertVoluntaryFlaws,Migration768AddNewAuras,Migration769NoUniversalistFocusPool,Migration770REDataToSystem,Migration771SpellVariantsToSystem,Migration772V10EmbeddedSpellData,Migration773ReligiousSymbolUsage,Migration774UnpersistCraftingEntries,Migration775AgileFinesseRanged,Migration776SlugifyConditionOverrides,Migration777HandOfTheApprentice,Migration778RenameRetiredPackRefs,Migration779EliteWeak,Migration780NumifySpeeds,Migration781SuppressNoCrowbar,Migration782UnnestActorTraits,Migration783RemoveClassSkillAELikes,Migration784CompBrowserPackSetting,Migration785ABCKitItemUUIDs,Migration786RemoveIdentifiedData,Migration787ResolvablesToSystem,Migration788UpdateTanglefootBags,Migration789UpdatePreciseStrike,Migration790MultipleClassDCs,Migration791RuffianHands,Migration792RemoveTokenAELikes,Migration793MakePredicatesArrays,Migration794AddWildShapeChoices,Migration795CleanupFlatFootedToggle,Migration796ItemGrantsToObjects,Migration797MetagameSetting,Migration798WeaponToItemStatements,Migration799RMRecallKnowledgeDuplicates,Migration800SelfEffectPanacheRage,Migration801ColorDarkvision,Migration802StripFeatActionCategory,Migration803NormalizeSpellArea,Migration804RemoveConsumableProperties,Migration805InlineDamageRolls,Migration806TorchImprovisedOtherTags,Migration807RMActivatedEffectFields,Migration808CountDamageDice,Migration809AutomatonEnhancements,Migration810LootDescriptionValue,Migration811InlineDamageRollsPersistent,Migration812RestructureIWR,Migration813NormalizeColdIron,Migration814CalculatedExpandedSplash,Migration815ConsumableDataCleanup,Migration816AlchemistResearchFields,Migration817FieldDiscoveryPredicates,Migration818BasicUndeadNegativeHealing,Migration819SpinTaleAdventureSpecific,Migration820RemoveUnusedTraitsData,Migration821InlineDamageRolls,Migration822BladeAllyConsolidation,Migration823HeritageAncestrySlug,Migration824SneakAttackDamageSource,Migration825KhakkharaFengHuoLun,Migration826GutConditionData,Migration827FixTVShieldTraits,Migration828PruneInvalidTraits,Migration829RMRitualEntries,Migration830BarbarianRework,Migration831ClericDoctrines,Migration832ChoiceSetFlags,Migration833AddRogueToysFixPrecision,Migration834FeatCategories,Migration835InitiativeLongform,Migration836EnergizingConsolidation,Migration837MoveHazardBookSources,Migration838StrikeAttackRollSelector,Migration839ActionCategories,Migration840ArrayWrapPredicates,Migration841V11UUIDFormat,Migration842NumifyNumericSettings,Migration843RMArmorCustomModifiers,Migration844DeityDomainUUIDs,Migration845EmptySpellConsumables,Migration846SpellSchoolOptional,Migration847TempHPRuleEvents,Migration848NumericArmorProperties,Migration849DeleteBrokenThreshold,Migration850FlatFootedToOffGuard,Migration851JustInnovationId,Migration852AbilityScoresToModifiers,Migration853RemasterLanguages,Migration854BracketedAbilityScoresToModifiers,Migration855ApexEquipmentSystemData,Migration856NoSystemDotCustom,Migration857WeaponSpecializationRE,Migration858FakeWeaponSpecialization,Migration859MaterialTypeGrade,Migration860RMGroup,Migration861AuraColorsToAppearance,Migration862SpecificMagicArmor,Migration863FixMisspelledOrganaizationsProperty,Migration864RemoveWeaponMAP,Migration865VitalityVoid,Migration866LinkToActorSizeAgain,Migration867DamageRollDomainFix,Migration868StrikeRERange,Migration869RefreshMightyBulwark,Migration870MartialToProficiencies,Migration871MigrateRollActionMacroParams,Migration872MoveSchemaProperty,Migration873RemoveBonusBulkLimit,Migration874MoveStaminaStuff,Migration875SetInnovationIdEarly,Migration876FeatLevelTaken,Migration877PublicationData,Migration878TakeABreather},Symbol.toStringTag,{value:"Module"})),_MigrationList=class{static{__name(this,"_MigrationList")}static get latestVersion(){return Math.max(...__privateGet(this,_list).map(M=>M.version))}static constructAll(){return __privateGet(this,_list).map(M=>new M)}static constructFromVersion(version){const minVersion=Number(version)||MigrationRunner.RECOMMENDED_SAFE_VERSION;return __privateGet(this,_list).filter(M=>M.version>minVersion).map(M=>new M)}static constructRange(min,max=1/0){return __privateGet(this,_list).filter(M=>M.version>=min&&M.version<=max).map(M=>new M)}};_list=new WeakMap,__name2(_MigrationList,"MigrationList"),__privateAdd(_MigrationList,_list,Object.values(Migrations));let MigrationList=_MigrationList;const _WeaponDamagePF2e=class _WeaponDamagePF2e2{static{__name(this,"_WeaponDamagePF2e")}static async fromNPCAttack({attack,actor,actionTraits:actionTraits2=[],context}){const secondaryInstances=Object.values(attack.system.damageRolls).slice(1).map(this.npcDamageToWeaponDamage),damageDice=[],modifiers=[],labelFromCategory={null:"",persistent:"",precision:"PF2E.Damage.Precision",splash:"PF2E.WeaponSplashDamageLabel"};for(const instance of secondaryInstances){const{damageType}=instance;instance.dice>0&&instance.die&&damageDice.push(new DamageDicePF2e({slug:"base",label:labelFromCategory[instance.category??"null"],selector:"damage",diceNumber:instance.dice,dieSize:instance.die,damageType:instance.damageType,category:instance.category})),instance.modifier&&modifiers.push(new ModifierPF2e({label:labelFromCategory[instance.category??"null"],modifier:instance.modifier,damageType,damageCategory:instance.category}))}return _WeaponDamagePF2e2.calculate({weapon:attack,actor,damageDice,modifiers,actionTraits:actionTraits2,context})}static async calculate({weapon,actor,damageDice=[],modifiers=[],actionTraits:actionTraits2=[],weaponPotency=null,context}){var _a;const{baseDamage}=weapon,{options}=context,domains=context.domains??[];if(baseDamage.die===null&&baseDamage.modifier>0)baseDamage.dice=0;else if(!weapon.dealsDamage)return null;const weaponTraits2=weapon.system.traits.value,materialTraits=weapon.isOfType("melee")?weapon.system.traits.value.filter(t=>t in CONFIG.PF2E.materialDamageEffects):[];for(const trait of weaponTraits2)options.add(trait);const isMelee=!!weapon.isMelee;if(options.add(isMelee?"melee":"ranged"),actor.isOfType("character","npc")){const strengthModValue=actor.abilities.str.mod,modifierValue=__privateMethod(_a=_WeaponDamagePF2e2,_strengthModToDamage2,strengthModToDamage_fn2).call(_a,weapon,domains.includes("str-damage"))?strengthModValue:weaponTraits2.some(t=>t==="propulsive")?strengthModValue<0?strengthModValue:Math.floor(strengthModValue/2):null;if(weapon.isOfType("weapon")&&typeof modifierValue=="number"){const strModifier=new ModifierPF2e({slug:"str",label:CONFIG.PF2E.abilities.str,ability:"str",modifier:modifierValue,type:"ability",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"str")});modifiers.push(strModifier)}}for(const rule of actor.rules.filter(r=>!r.ignored))rule.beforeRoll?.(domains,options);const splashDamage=weapon.isOfType("weapon")?Number(weapon.system.splashDamage?.value):0;if(splashDamage>0){const modifier=new ModifierPF2e({slug:"splash",label:"PF2E.WeaponSplashDamageLabel",modifier:splashDamage,damageCategory:"splash",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"splash")});modifiers.push(modifier)}if(weapon.isOfType("weapon")){weaponTraits2.includes("kickback")&&modifiers.push(new ModifierPF2e({slug:"kickback",label:CONFIG.PF2E.weaponTraits.kickback,modifier:1,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"kickback")}));const handsHeld=weapon.system.equipped.handsHeld??0,baseDieFaces=Number(baseDamage.die?.replace("d","")??"NaN"),twoHandSize=weaponTraits2.find(t=>t.startsWith("two-hand-"))?.replace("two-hand-",""),twoHandFaces=Number(twoHandSize?.replace("d","")??"NaN");if(handsHeld===2&&setHasElement(DAMAGE_DIE_FACES,twoHandSize)&&twoHandFaces>baseDieFaces&&(baseDamage.die=twoHandSize),weaponTraits2.find(t=>t.startsWith("scatter-"))&&baseDamage.die){const modifier=new ModifierPF2e({slug:"scatter",label:"PF2E.Damage.Scatter",modifier:baseDamage.dice,damageCategory:"splash",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"scatter")});modifiers.push(modifier)}const bonusDamage=Number(weapon.system.bonusDamage?.value);bonusDamage>0&&modifiers.push(new ModifierPF2e({label:"PF2E.WeaponBonusDamageLabel",modifier:bonusDamage}));const customDamage=weapon.system.property1,normalDice=customDamage.dice??0;if(normalDice>0){const damageType=customDamage.damageType||null;damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:"custom",label:"PF2E.WeaponCustomDamageLabel",diceNumber:normalDice,dieSize:customDamage.die,damageType}))}const critDice=customDamage.critDice??0;if(critDice>0){const damageType=customDamage.critDamageType||null;damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:"custom-critical",label:"PF2E.WeaponCustomDamageLabel",diceNumber:critDice,dieSize:customDamage.critDie,damageType,critical:!0}))}}const potency=weaponPotency?.bonus??0,strikingSynthetic=domains.flatMap(key=>actor.synthetics.striking[key]??[]).filter(wp=>wp.predicate.test(options)).reduce((highest,current)=>highest&&highest.bonus>current.bonus?highest:current,null);strikingSynthetic&&baseDamage.die&&(weapon.isOfType("melee")||strikingSynthetic.bonus>weapon.system.runes.striking)&&(damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:"striking",label:strikingSynthetic.label,diceNumber:strikingSynthetic.bonus})),weapon.isOfType("weapon")&&(weapon.system.damage.dice-=weapon.system.runes.striking,weapon.system.runes.striking=0));const critSpecEffect=(()=>{const critSpecs=actor.synthetics.criticalSpecalizations,standard=critSpecs.standard.reduceRight((result,cs)=>result??cs?.(weapon,options),null),alternate=critSpecs.alternate.reduceRight((result,cs)=>result??cs?.(weapon,options),null);return standard?alternate??standard:[]})();critSpecEffect.length>0&&options.add("critical-specialization"),modifiers.push(...critSpecEffect.filter(e=>e instanceof ModifierPF2e)),damageDice.push(...critSpecEffect.filter(e=>e instanceof DamageDicePF2e));const propertyRunes=weapon.isOfType("weapon")?weapon.system.runes.property:[];damageDice.push(...getPropertyRuneDice(propertyRunes,options));const propertyRuneAdjustments=getPropertyRuneModifierAdjustments(propertyRunes),ignoredResistances=propertyRunes.flatMap(r=>RUNE_DATA.weapon.property[r].damage?.ignoredResistances??[]);if(weaponTraits2.some(t=>t==="backstabber")&&options.has("target:condition:off-guard")){const modifier=new ModifierPF2e({label:CONFIG.PF2E.weaponTraits.backstabber,slug:"backstabber",modifier:potency>2?2:1,damageCategory:"precision",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"backstabber")});modifiers.push(modifier)}const traitLabels=CONFIG.PF2E.weaponTraits,deadlyTraits=weaponTraits2.filter(t=>t.startsWith("deadly-")),strikingDice=(()=>{if(weapon.isOfType("weapon")){const weaponStrikingDice=weapon.system.damage.dice-weapon._source.system.damage.dice;return strikingSynthetic&&strikingSynthetic.bonus>weaponStrikingDice?strikingSynthetic.bonus:weaponStrikingDice}else return strikingSynthetic?.bonus??0})();for(const slug of deadlyTraits){const diceNumber=(()=>{const baseNumber=Number(/-(\d)d\d{1,2}$/.exec(slug)?.at(1))||1;return strikingDice>1?strikingDice*baseNumber:baseNumber})();damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug,label:traitLabels[slug],damageType:baseDamage.damageType,diceNumber,dieSize:/-\d?(d\d{1,2})$/.exec(slug)?.at(1)??baseDamage.die,critical:!0}))}for(const trait of weaponTraits2.filter(t=>t.startsWith("fatal-d"))){const dieSize=trait.substring(trait.indexOf("-")+1);damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:trait,label:traitLabels[trait],damageType:baseDamage.damageType,diceNumber:1,dieSize,critical:!0,enabled:!0,override:{dieSize}}))}const runeNotes=propertyRunes.flatMap(r=>(RUNE_DATA.weapon.property[r].damage?.notes??[]).map(d=>new RollNotePF2e({selector:"strike-damage",...d})));context.notes=[runeNotes,critSpecEffect.filter(e=>e instanceof RollNotePF2e)].flat();const material=objectHasKey(CONFIG.PF2E.materialDamageEffects,weapon.system.material.type)?weapon.system.material.type:null,materials=new Set([materialTraits,material??[]].flat());for(const adjustment of actor.synthetics.strikeAdjustments)adjustment.adjustDamageRoll?.(weapon,{materials});for(const option of Array.from(materials).map(m=>`item:material:${m}`))options.add(option);for(const modifier of modifiers){const propRuneAdjustments=propertyRuneAdjustments.filter(a=>a.slug===modifier.slug),extractedAdjustments=extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,modifier.slug);modifier.adjustments.push(...propRuneAdjustments,...extractedAdjustments)}const baseUncategorized=(()=>{const diceNumber=baseDamage.die?baseDamage.dice:0;return diceNumber>0||baseDamage.modifier>0?{diceNumber,dieSize:baseDamage.die,modifier:baseDamage.modifier,damageType:baseDamage.damageType,category:"category"in baseDamage&&baseDamage.category==="persistent"?"persistent":null,materials:Array.from(materials)}:null})(),basePersistent=(()=>baseDamage.persistent?.faces?{diceNumber:baseDamage.persistent.number,dieSize:`d${baseDamage.persistent.faces}`,damageType:baseDamage.persistent.type,category:"persistent"}:baseDamage.persistent?.number?{modifier:baseDamage.persistent.number,damageType:baseDamage.persistent.type,category:"persistent"}:null)();if(!(baseUncategorized||basePersistent||splashDamage))return null;const base=compact([baseUncategorized,basePersistent]),extractOptions={test:options,resolvables:{weapon,target:context.target?.actor??null},injectables:{weapon}},extracted=processDamageCategoryStacking(base,{modifiers:[modifiers,extractModifiers(actor.synthetics,domains,extractOptions)].flat(),dice:extractDamageDice(actor.synthetics.damageDice,domains,extractOptions),test:options}),testedModifiers=extracted.modifiers;damageDice.push(...extracted.dice);const formulaData={base,dice:damageDice,modifiers:testedModifiers,ignoredResistances};formulaData.base[0].diceNumber||formulaData.base[0].modifier||(formulaData.dice=formulaData.dice.filter(d=>![null,"precision"].includes(d.category)),formulaData.modifiers=formulaData.modifiers.filter(m=>![null,"precision"].includes(m.category)));const excludeFrom=weapon.isOfType("weapon")?weapon:null;__privateMethod(this,_excludeDamage,excludeDamage_fn).call(this,{actor,weapon:excludeFrom,modifiers:[...modifiers,...damageDice],options});const computedFormulas={criticalFailure:null,failure:__privateMethod(this,_finalizeDamage,finalizeDamage_fn).call(this,formulaData,DEGREE_OF_SUCCESS.FAILURE),success:__privateMethod(this,_finalizeDamage,finalizeDamage_fn).call(this,formulaData,DEGREE_OF_SUCCESS.SUCCESS),criticalSuccess:__privateMethod(this,_finalizeDamage,finalizeDamage_fn).call(this,formulaData,DEGREE_OF_SUCCESS.CRITICAL_SUCCESS)};return{name:`${game.i18n.localize("PF2E.DamageRoll")}: ${weapon.name}`,traits:(actionTraits2??[]).map(t=>t.name),materials:Array.from(materials),modifiers:[...modifiers,...damageDice],damage:{...formulaData,formula:mapValues(computedFormulas,formula=>formula?.formula??null),breakdown:mapValues(computedFormulas,formula=>formula?.breakdown??[])}}}static npcDamageToWeaponDamage(instance){const terms=parseTermsFromSimpleFormula(instance.damage),die=terms.find(t=>t.dice)?.dice,modifier=terms.find(t=>t.modifier)?.modifier??0;return{dice:die?.number??0,die:die?.faces?`d${die.faces}`:null,modifier,damageType:instance.damageType,persistent:null,category:instance.category}}};_finalizeDamage=new WeakSet,finalizeDamage_fn=__name2(function(damage,degree){damage=deepClone(damage);for(const base of damage.base){const critical=degree===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS,outcomeMatches=__name2(m=>m.critical===null||critical&&m.critical||!critical&&!m.critical,"outcomeMatches"),hasUpgrade=damage.dice.some(d=>d.enabled&&d.override?.upgrade&&outcomeMatches(d)),hasDowngrade=damage.dice.some(d=>d.enabled&&d.override?.downgrade&&(critical||!d.critical));base.dieSize&&hasUpgrade&&!hasDowngrade?base.dieSize=nextDamageDieSize({upgrade:base.dieSize}):base.dieSize&&hasDowngrade&&!hasUpgrade&&(base.dieSize=nextDamageDieSize({downgrade:base.dieSize}));const damageOverrides=damage.dice.filter(d=>!!(d.enabled&&d.override));for(const override of damageOverrides)if(critical&&override.critical!==!1||!critical&&!override.critical){base.dieSize=override.override?.dieSize??base.dieSize,base.damageType=override.override?.damageType??base.damageType,base.diceNumber=override.override?.diceNumber??base.diceNumber;for(const die of damage.dice.filter(d=>/^(?:deadly|fatal)-/.test(d.slug)))die.damageType=override.override?.damageType??die.damageType}}return createDamageFormula(damage,degree)},"#finalizeDamage"),_excludeDamage=new WeakSet,excludeDamage_fn=__name2(function({actor,modifiers,weapon,options}){if(!weapon)return;const notIgnored=modifiers.filter(modifier=>!modifier.ignored);for(const rule of actor.rules)rule.applyDamageExclusion?.(weapon,notIgnored);for(const modifier of notIgnored)modifier.ignored=!modifier.predicate.test(options)},"#excludeDamage"),_strengthModToDamage2=new WeakSet,strengthModToDamage_fn2=__name2(function(weapon,strengthBased){return weapon.isOfType("weapon")&&strengthBased&&!weapon.traits.has("propulsive")},"#strengthModToDamage"),__privateAdd(_WeaponDamagePF2e,_finalizeDamage),__privateAdd(_WeaponDamagePF2e,_excludeDamage),__privateAdd(_WeaponDamagePF2e,_strengthModToDamage2),__name2(_WeaponDamagePF2e,"WeaponDamagePF2e");let WeaponDamagePF2e=_WeaponDamagePF2e;async function resetActors(actors,{rerender=!0}={}){actors??=[game.actors.contents,game.scenes.contents.flatMap(s=>s.tokens.contents).flatMap(t=>t.actor??[])].flat();for(const actor of actors)actor.reset(),rerender&&actor.render();if(game.pf2e.effectPanel.refresh(),game.settings.get("pf2e","automation.effectExpiration")&&!game.settings.get("pf2e","automation.removeExpiredEffects")){const scenes=new Set(Array.from(actors).flatMap(a=>a.getActiveTokens(!1,!0)).flatMap(t=>t.scene));for(const scene of scenes)scene.reset(),scene.isView&&canvas.perception.update({initializeVision:!0},!0)}}__name(resetActors,"resetActors"),__name2(resetActors,"resetActors");function userColorForActor(actor){return(game.users.find(u=>u.character===actor)??game.users.players.find(u=>actor.testUserPermission(u,"OWNER"))??actor.primaryUpdater)?.color??"#43dfdf"}__name(userColorForActor,"userColorForActor"),__name2(userColorForActor,"userColorForActor");async function migrateActorSource(source){source.effects=[],["flags","items","system"].some(k=>k in source)||(source.system={_migration:{version:MigrationRunnerBase.LATEST_SCHEMA_VERSION}});const lowestSchemaVersion=Math.min(source.system?._migration?.version??MigrationRunnerBase.LATEST_SCHEMA_VERSION,...(source.items??[]).map(i=>i.system?._migration?.version??MigrationRunnerBase.LATEST_SCHEMA_VERSION)),tokenDefaults=deepClone(game.settings.get("core","defaultToken")),actor=new ActorProxyPF2e(mergeObject({prototypeToken:tokenDefaults},source));return await MigrationRunner.ensureSchemaVersion(actor,MigrationList.constructFromVersion(lowestSchemaVersion)),actor.toObject()}__name(migrateActorSource,"migrateActorSource"),__name2(migrateActorSource,"migrateActorSource");async function checkAreaEffects(){if(!canvas.ready||game.user!==this.primaryUpdater||this.isOfType("party"))return;const thisTokens=this.getActiveTokens(!0,!0),toDelete2=[],toKeep=[];for(const effect of this.itemTypes.effect){const auraData=effect.flags.pf2e.aura;if(!auraData?.removeOnExit)continue;const auraActor=await fromUuid(auraData.origin),aura=(auraActor?.getActiveTokens(!0,!0).shift()??null)?.auras.get(auraData.slug),auraEffectData=auraActor?.auras.get(auraData.slug)?.effects.find(e=>e.uuid===effect.sourceId&&auraAffectsActor(e,auraActor,this));for(const token of thisTokens)auraEffectData&&aura?.containsToken(token)?toKeep.push(effect.id):toDelete2.push(effect.id);thisTokens.length===0&&toDelete2.push(effect.id)}const finalToDelete=toDelete2.filter(id=>!toKeep.includes(id));finalToDelete.length>0&&await this.deleteEmbeddedDocuments("Item",finalToDelete)}__name(checkAreaEffects,"checkAreaEffects"),__name2(checkAreaEffects,"checkAreaEffects");function auraAffectsActor(data,origin,actor){return data.includesSelf&&origin===actor||data.affects==="allies"&&actor.isAllyOf(origin)||data.affects==="enemies"&&actor.isEnemyOf(origin)||data.affects==="all"&&actor!==origin}__name(auraAffectsActor,"auraAffectsActor"),__name2(auraAffectsActor,"auraAffectsActor");function setHitPointsRollOptions(actor){const hp=actor.hitPoints;if(!hp)return;actor.flags.pf2e.rollOptions.all[`hp-remaining:${hp.value}`]=!0;const percentRemaining=Math.floor(hp.value/hp.max*100);actor.flags.pf2e.rollOptions.all[`hp-percent:${percentRemaining}`]=!0}__name(setHitPointsRollOptions,"setHitPointsRollOptions"),__name2(setHitPointsRollOptions,"setHitPointsRollOptions");function calculateMAPs(item,{domains,options}){const slugAndLabel={slug:"multiple-attack-penalty",label:"PF2E.MultipleAttackPenalty"},baseMap=item.isOfType("action","melee","weapon")&&item.traits.has("agile")?{...slugAndLabel,map1:-4,map2:-8}:{...slugAndLabel,map1:-5,map2:-10},optionSet=options instanceof Set?options:new Set(options),maps=item.actor?.synthetics.multipleAttackPenalties??{},fromSynthetics=domains.flatMap(d=>maps[d]??[]).filter(p=>p.predicate?.test(optionSet)??!0).map(p=>({slug:baseMap.slug,label:p.label,map1:p.penalty,map2:p.penalty*2}));return[baseMap,...fromSynthetics].reduce((lowest,p)=>p.map1>lowest.map1?p:lowest)}__name(calculateMAPs,"calculateMAPs"),__name2(calculateMAPs,"calculateMAPs");function createEncounterRollOptions(actor){const encounter=game.ready?game.combat:null;if(!encounter?.started)return{};const participants=encounter.combatants.contents.filter(c=>typeof c.initiative=="number").sort((a,b)=>b.initiative-a.initiative),participant=actor.combatant;if(typeof participant?.initiative!="number"||!participants.includes(participant))return{};const initiativeRoll=Math.trunc(participant.initiative),initiativeRank=participants.indexOf(participant)+1,{initiativeStatistic}=participant.flags.pf2e,threat=encounter.metrics?.threat,numericThreat={trivial:0,low:1,moderate:2,severe:3,extreme:4}[threat??"trivial"],entries=[["encounter",!0],[`encounter:threat:${numericThreat}`,!!threat],[`encounter:threat:${threat}`,!!threat],[`encounter:round:${encounter.round}`,!0],[`encounter:turn:${Number(encounter.turn)+1}`,!0],["self:participant:own-turn",encounter.combatant===participant],[`self:participant:initiative:roll:${initiativeRoll}`,!0],[`self:participant:initiative:rank:${initiativeRank}`,!0],[`self:participant:initiative:stat:${initiativeStatistic}`,!!initiativeStatistic]].filter(([,value])=>!!value);return Object.fromEntries(entries)}__name(createEncounterRollOptions,"createEncounterRollOptions"),__name2(createEncounterRollOptions,"createEncounterRollOptions");function isOffGuardFromFlanking(target,origin){if(!target?.isOfType("creature"))return!1;const{flanking}=target.attributes;return flanking.flankable?typeof flanking.offGuardable=="number"?origin.level>flanking.offGuardable:flanking.offGuardable:!1}__name(isOffGuardFromFlanking,"isOffGuardFromFlanking"),__name2(isOffGuardFromFlanking,"isOffGuardFromFlanking");function getStrikeAttackDomains(weapon,proficiencyRank,baseRollOptions){const unarmedOrWeapon=weapon.category==="unarmed"?"unarmed":"weapon",meleeOrRanged=weapon.isMelee?"melee":"ranged",weaponSlug=weapon.slug??sluggify(weapon.name),domains=[weapon.baseType?`${weapon.baseType}-base-attack-roll`:[],weapon.group?`${weapon.group}-group-attack-roll`:[],weapon.system.traits.otherTags.map(t=>`${t}-tag-attack-roll`),`${weapon.id}-attack`,`${weaponSlug}-attack`,`${weaponSlug}-attack-roll`,`${unarmedOrWeapon}-attack-roll`,`${meleeOrRanged}-attack-roll`,`${meleeOrRanged}-strike-attack-roll`,"strike-attack-roll","attack-roll","attack","check","all"].flat();if(typeof proficiencyRank=="number"){const proficiencies=["untrained","trained","expert","master","legendary"];domains.push(`${proficiencies[proficiencyRank]}-damage`)}const{actor}=weapon;if(actor.isOfType("character","npc")){const defaultAttributeModifier=createAttributeModifier({actor,attribute:weapon.defaultAttribute,domains}),rollOptions=[...baseRollOptions,actor.getRollOptions(domains),weapon.getRollOptions("item")].flat(),attributeModifier=[defaultAttributeModifier,...extractModifiers(weapon.actor.synthetics,domains,{resolvables:{weapon},test:rollOptions})].filter(m=>m.type==="ability"&&m.enabled).reduce((best,candidate)=>candidate.modifier>best.modifier?candidate:best);domains.push(`${attributeModifier.ability}-attack`,`${attributeModifier.ability}-based`)}return uniq(domains).sort()}__name(getStrikeAttackDomains,"getStrikeAttackDomains"),__name2(getStrikeAttackDomains,"getStrikeAttackDomains");function getStrikeDamageDomains(weapon,proficiencyRank){const meleeOrRanged=weapon.isMelee?"melee":"ranged",slug=weapon.slug??sluggify(weapon.name),{actor,traits}=weapon,unarmedOrWeapon=traits.has("unarmed")?"unarmed":"weapon",domains=[`${weapon.id}-damage`,`${slug}-damage`,`${meleeOrRanged}-strike-damage`,`${meleeOrRanged}-damage`,`${unarmedOrWeapon}-damage`,"attack-damage","strike-damage","damage"];if(weapon.group&&domains.push(`${weapon.group}-weapon-group-damage`),weapon.baseType&&domains.push(`${weapon.baseType}-base-type-damage`),typeof proficiencyRank=="number"){const proficiencies=["untrained","trained","expert","master","legendary"];domains.push(`${proficiencies[proficiencyRank]}-damage`)}const baseType=CONFIG.PF2E.equivalentWeapons[weapon.baseType??""]??weapon.baseType;if(baseType&&!domains.includes(`${baseType}-damage`)&&domains.push(`${baseType}-damage`),actor.isOfType("character","npc")){const attributeModifier=[weapon.isMelee||weapon.isThrown&&!traits.has("splash")||traits.has("propulsive")?createAttributeModifier({actor,attribute:"str",domains}):null,...extractModifiers(actor.synthetics,domains,{resolvables:{weapon},test:[...actor.getRollOptions(domains),...weapon.getRollOptions("item")]}).filter(m=>!m.ignored&&m.type==="ability")].reduce((best,candidate)=>candidate&&best?candidate.value>best.value?candidate:best:candidate??best);attributeModifier&&domains.push(`${attributeModifier.ability}-damage`)}return uniq(domains).sort()}__name(getStrikeDamageDomains,"getStrikeDamageDomains"),__name2(getStrikeDamageDomains,"getStrikeDamageDomains");function strikeFromMeleeItem(item){const{actor,isMelee,isThrown}=item;if(!actor.isOfType("npc","hazard"))throw ErrorPF2e("Attempted to create melee-item strike statistic for non-NPC/hazard");const meleeOrRanged=isMelee?"melee":"ranged",baseOptions=new Set(compact([isThrown?"thrown":null,meleeOrRanged,...item.system.traits.value])),domains=getStrikeAttackDomains(item,actor.isOfType("npc")?1:null,baseOptions),{synthetics}=actor,modifiers=[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:item.attackModifier,adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,domains,"base")})];modifiers.push(...extractModifiers(synthetics,domains)),modifiers.push(...AttackTraitHelpers.createAttackModifiers({item}));const notes=extractNotes(synthetics.rollNotes,domains),attackEffects=CONFIG.PF2E.attackEffects,additionalEffects=item.attackEffects.map(tag=>{const items=actor.items.contents,label=attackEffects[tag]??items.find(i=>(i.slug??sluggify(i.name))===tag)?.name??tag;return{tag,label}});for(const adjustment of synthetics.strikeAdjustments)adjustment.adjustWeapon?.(item);const initialRollOptions=new Set([...baseOptions,...actor.getRollOptions(domains),...item.getRollOptions("item")]),attackSlug=item.slug??sluggify(item.name),statistic=new StatisticModifier(attackSlug,modifiers,initialRollOptions),traitObjects=item.system.traits.value.map(t=>({name:t,label:CONFIG.PF2E.npcAttackTraits[t]??t,description:CONFIG.PF2E.traitsDescriptions[t]})),strike=mergeObject(statistic,{label:item.name,type:"strike",glyph:getActionGlyph({type:"action",value:1}),description:item.description,imageUrl:getActionIcon({type:"action",value:1}),sourceId:item.id,attackRollType:item.isRanged?"PF2E.NPCAttackRanged":"PF2E.NPCAttackMelee",additionalEffects,item,weapon:item,traits:traitObjects,options:Array.from(baseOptions),variants:[],ready:!0,success:"",criticalSuccess:""});strike.breakdown=strike.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${signedInteger(m.value)}`).join(", ");const attackTrait={name:"attack",label:CONFIG.PF2E.featTraits.attack,description:CONFIG.PF2E.traitsDescriptions.attack},maps=calculateMAPs(item,{domains,options:initialRollOptions}),createMapModifier=__name2(prop=>new ModifierPF2e({slug:maps.slug,label:maps.label,modifier:maps[prop],adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,domains,maps.slug)}),"createMapModifier"),labels=[`${game.i18n.localize("PF2E.WeaponStrikeLabel")} ${signedInteger(strike.totalModifier)}`,...["map1","map2"].map(prop=>{const modifier=createMapModifier(prop);adjustModifiers([modifier],baseOptions);const penalty=modifier.ignored?0:modifier.value;return game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(strike.totalModifier+penalty),penalty})})];strike.variants=[null,...["map1","map2"].map(createMapModifier)].map((map2,mapIncreases)=>({label:labels[mapIncreases],roll:async(params={})=>{const attackEffects2=actor.isOfType("npc")?await actor.getAttackEffects(item):[],rollNotes=notes.concat(attackEffects2);params.options??=[];const context=await actor.getCheckContext({item,viewOnly:params.getFormula??!1,statistic:strike,target:{token:params.target??game.user.targets.first()??null},defense:"armor",domains,options:new Set([...baseOptions,...params.options])});if(context.self.item.isRanged&&typeof context.target?.distance=="number"){const maxRange=item.range?.max??10;if(context.target.distance>maxRange)return ui.notifications.warn("PF2E.Action.Strike.OutOfRange",{localize:!0}),null}const otherModifiers=[map2??[],context.self.modifiers].flat(),title=game.i18n.format(item.isMelee?"PF2E.Action.Strike.MeleeLabel":"PF2E.Action.Strike.RangedLabel",{weapon:item.name}),check=new CheckModifier("strike",context.self.statistic??strike,otherModifiers),checkContext={type:"attack-roll",identifier:`${item.id}.${attackSlug}.${meleeOrRanged}`,action:"strike",title,actor:context.self.actor,token:context.self.token,item:context.self.item,target:context.target,damaging:item.dealsDamage,domains,options:context.options,traits:[attackTrait],notes:rollNotes,dc:params.dc??context.dc,mapIncreases,rollTwice:extractRollTwice(synthetics.rollTwice,domains,context.options),substitutions:extractRollSubstitutions(synthetics.rollSubstitutions,domains,context.options),dosAdjustments:extractDegreeOfSuccessAdjustments(synthetics,domains)},roll=await CheckPF2e.roll(check,checkContext,params.event);if(roll)for(const rule of actor.rules.filter(r=>!r.ignored))await rule.afterRoll?.({roll,check,context:checkContext,domains,rollOptions:context.options});return roll}})),strike.roll=strike.attack=strike.variants[0].roll;const damageRoll=__name2(outcome=>async(params={})=>{const domains2=getStrikeDamageDomains(item,actor.isOfType("npc")?1:null),targetToken=params.target??game.user.targets.first()??null,context=await actor.getDamageRollContext({item,statistic:strike,target:{token:targetToken},viewOnly:params.getFormula??!1,domains:domains2,checkContext:params.checkContext,outcome,options:new Set([...baseOptions,...params.options??[]])});if(!context.self.item.dealsDamage&&!params.getFormula)return ui.notifications.warn("PF2E.ErrorMessage.WeaponNoDamage",{localize:!0}),null;const{self,target}=context,damageContext={type:"damage-roll",sourceType:"attack",self,target,outcome,options:context.options,domains:domains2,...eventToRollParams(params.event)};typeof params.mapIncreases=="number"&&(damageContext.mapIncreases=params.mapIncreases,damageContext.options.add(`map:increases:${params.mapIncreases}`)),params.getFormula&&(damageContext.skipDialog=!0);const damage=await WeaponDamagePF2e.fromNPCAttack({attack:context.self.item,actor:context.self.actor,actionTraits:[attackTrait],context:damageContext});if(!damage)return null;if(params.getFormula){const formula=damage.damage.formula[outcome];return formula?new DamageRoll(formula).formula:""}else return DamagePF2e.roll(damage,damageContext,params.callback)},"damageRoll");return strike.damage=damageRoll("success"),strike.critical=damageRoll("criticalSuccess"),strike}__name(strikeFromMeleeItem,"strikeFromMeleeItem"),__name2(strikeFromMeleeItem,"strikeFromMeleeItem");function getRangeIncrement(attackItem,distance){if(!attackItem.isOfType("action","melee","weapon"))return null;const{increment}=attackItem.range??{};return increment&&typeof distance=="number"?Math.max(Math.ceil(distance/increment),1):null}__name(getRangeIncrement,"getRangeIncrement"),__name2(getRangeIncrement,"getRangeIncrement");function calculateRangePenalty(actor,increment,selectors,rollOptions){if(!increment||increment===1)return null;const slug="range-penalty",modifier=new ModifierPF2e({label:"PF2E.RangePenalty",slug,type:"untyped",modifier:Math.max((increment-1)*-2,-12),predicate:[{nor:["ignore-range-penalty",{gte:["ignore-range-penalty",increment]}]}],adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,selectors,slug)});return modifier.test(rollOptions),modifier}__name(calculateRangePenalty,"calculateRangePenalty"),__name2(calculateRangePenalty,"calculateRangePenalty");function isReallyPC(actor){const traits=actor.traits;return actor.isOfType("character")&&!(traits.has("minion")||traits.has("eidolon"))}__name(isReallyPC,"isReallyPC"),__name2(isReallyPC,"isReallyPC");function findMatchingCheckContext(actor,params){if(params.viewOnly||!params.target?.token)return null;const paramsItem=params.item;return paramsItem?.isOfType("melee","weapon")?game.messages.contents.slice(-3).reverse().find(message=>{if(!message.rolls.some(r=>r instanceof CheckRoll)||message.actor?.uuid!==actor.uuid||params.target?.token!==message.target?.token.object)return!1;const messageItem=message.item;if(!messageItem?.isOfType("melee","weapon"))return!1;const paramsItemSlug=paramsItem.slug??sluggify(paramsItem.name),messageItemSlug=messageItem.slug??sluggify(messageItem.name);return paramsItemSlug===messageItemSlug&¶msItem.uuid===messageItem.uuid&¶msItem.isMelee===messageItem.isMelee})?.flags.pf2e.context??null:null}__name(findMatchingCheckContext,"findMatchingCheckContext"),__name2(findMatchingCheckContext,"findMatchingCheckContext");const _Statistic=class _Statistic2 extends BaseStatistic{static{__name(this,"_Statistic")}constructor(actor,data,config={}){data.modifiers??=[];const domains=data.domains??=[],attributeModifier=actor.isOfType("character")&&data.attribute?data.modifiers.find(m=>m.type==="ability"&&m.ability===data.attribute)??createAttributeModifier({actor,attribute:data.attribute,domains}):null,proficiencyModifier=actor.isOfType("character")?typeof data.rank=="number"?createProficiencyModifier({actor,rank:data.rank,domains}):data.rank==="untrained-level"?createProficiencyModifier({actor,rank:0,domains,addLevel:!0}):null:null,baseModifiers=compact([attributeModifier,proficiencyModifier]),activeSlugs=new Set(baseModifiers.map(m=>m.slug));data.modifiers=data.modifiers.filter(m=>!activeSlugs.has(m.slug)),data.modifiers.unshift(...baseModifiers),super(actor,data),__publicField(this,"attribute",null),__publicField(this,"rank",null),__publicField(this,"proficient",!0),__publicField(this,"base",null),__publicField(this,"lore"),__publicField(this,"config"),__privateAdd(this,_check,void 0),__privateAdd(this,_dc,void 0),this.attribute=data.attribute??null,typeof data.lore=="boolean"&&(this.lore=data.lore),this.rank=data.rank==="untrained-level"?0:data.rank??null,this.config=config,this.proficient=data.proficient===void 0?this.rank===null||this.rank>0:!!data.proficient,data.filter&&(this.modifiers=this.modifiers.filter(data.filter)),this.data.dc??={domains:[`${this.slug}-dc`]}}get attributeModifier(){return this.actor.isOfType("npc")?this.attribute?createAttributeModifier({actor:this.actor,attribute:this.attribute,domains:this.domains}):null:this.modifiers.find(m=>m.type==="ability"&&m.enabled&&m.ability===this.attribute)??null}get check(){return __privateGet(this,_check)??__privateSet(this,_check,new StatisticCheck(this,this.data,this.config))}get dc(){return __privateGet(this,_dc)??__privateSet(this,_dc,new StatisticDifficultyClass(this,this.data,this.config))}get mod(){return this.check.mod}get ability(){return foundry.utils.logCompatibilityWarning("`Statistic#ability` is deprecated. Use `Statistic#attribute` instead.",{since:"5.5.0",until:"6.0.0"}),this.attribute}createRollOptions(domains=this.domains,args={}){const{item,extraRollOptions,origin,target}=args,rollOptions=[];return domains.length>0&&rollOptions.push(...super.createRollOptions(domains)),typeof this.rank=="number"&&rollOptions.push(PROFICIENCY_RANK_OPTION[this.rank]),this.data.rollOptions&&rollOptions.push(...this.data.rollOptions),item&&(rollOptions.push(...item.getRollOptions("item")),item.actor&&item.actor.uuid!==this.actor.uuid&&rollOptions.push(...item.actor.getSelfRollOptions("origin")),(item.system.traits?.value??[]).includes("attack")&&rollOptions.push("trait:attack")),origin?rollOptions.push(...origin.getSelfRollOptions("origin")):target&&rollOptions.push(...target.getSelfRollOptions("target")),extraRollOptions&&rollOptions.push(...extraRollOptions),new Set(rollOptions.sort())}withRollOptions(options){const newOptions=mergeObject(this.config??{},options??{},{inplace:!1});return new _Statistic2(this.actor,deepClone(this.data),newOptions)}extend(data){function maybeMergeArrays(arr1,arr2){if(!(!arr1&&!arr2))return[...new Set([arr1??[],arr2??[]].flat())]}__name(maybeMergeArrays,"maybeMergeArrays"),__name2(maybeMergeArrays,"maybeMergeArrays");const result=mergeObject(deepClone(this.data),data);result.domains=maybeMergeArrays(this.domains,data.domains),result.modifiers=maybeMergeArrays(this.data.modifiers,data.modifiers),result.rollOptions=maybeMergeArrays(this.data.rollOptions,data.rollOptions),result.check&&this.data.check&&(result.check.domains=maybeMergeArrays(this.data.check.domains,data.check?.domains),result.check.modifiers=maybeMergeArrays(this.data.check.modifiers,data.check?.modifiers)),result.dc&&this.data.dc&&(result.dc.domains=maybeMergeArrays(this.data.dc.domains,data.dc?.domains),result.dc.modifiers=maybeMergeArrays(this.data.dc.modifiers,data.dc?.modifiers));const extended=new _Statistic2(this.actor,result,this.config);return extended.base=this,extended}roll(args={}){return this.check.roll(args)}getChatData(options={}){const{check,dc}=this.withRollOptions(options),{map1,map2}=options.item?calculateMAPs(options.item,{domains:check?.domains??[],options:check?.createRollOptions(options)??[]}):{map1:-5,map2:-10};return{slug:this.slug,label:this.label,rank:this.rank,check:{mod:check.mod,breakdown:check.breakdown,label:check.label,map1,map2},dc:{value:dc.value,breakdown:dc.breakdown}}}getTraceData(options={}){const{check,dc}=this,valueProp=options.value??"mod",[label,value,totalModifier,breakdown,modifiers]=valueProp==="mod"?[this.label,check.mod,check.mod,check.breakdown,check.modifiers]:[dc.label||this.label,dc.value,dc.value-10,dc.breakdown,dc.modifiers];return{slug:this.slug,label,value,totalModifier,dc:dc.value,breakdown,modifiers:modifiers.map(m=>m.toObject())}}};_check=new WeakMap,_dc=new WeakMap,__name2(_Statistic,"Statistic");let Statistic=_Statistic;const _StatisticCheck=class{static{__name(this,"_StatisticCheck")}constructor(parent,data,config={}){__privateAdd(this,_determineLabel),__publicField(this,"parent"),__publicField(this,"type"),__publicField(this,"label"),__publicField(this,"domains"),__publicField(this,"mod"),__publicField(this,"modifiers"),this.parent=parent,this.type=data.check?.type??"check",data.check=mergeObject(data.check??{},{type:this.type});const checkDomains=new Set(compact(["check",data.check.domains].flat()));this.type==="attack-roll"?(checkDomains.add("attack"),checkDomains.add("attack-roll"),checkDomains.add(`${this.parent.slug}-attack-roll`)):(checkDomains.add(`${this.parent.slug}-check`),this.type==="flat-check"&&(checkDomains.delete("check"),checkDomains.add("flat-check"))),data.check.domains=Array.from(checkDomains).sort(),this.domains=uniq(compact([data.domains,data.check.domains].flat())).sort(),this.label=__privateMethod(this,_determineLabel,determineLabel_fn).call(this,data);const{modifierAdjustments}=parent.actor.synthetics,parentModifiers=parent.modifiers.map(modifier=>{const clone=modifier.clone();return clone.adjustments.push(...extractModifierAdjustments(modifierAdjustments,data.check?.domains??[],clone.slug)),clone}),checkOnlyModifiers=[data.check?.modifiers??[],extractModifiers(parent.actor.synthetics,data.check?.domains??[])].flat().map(modifier=>(modifier.adjustments.push(...extractModifierAdjustments(parent.actor.synthetics.modifierAdjustments,parent.domains,this.parent.slug)),modifier)),rollOptions=parent.createRollOptions(this.domains,config);this.modifiers=[...parentModifiers,...checkOnlyModifiers.map(modifier=>modifier.clone({test:rollOptions}))],this.type==="flat-check"&&this.modifiers.length>0&&(console.error(ErrorPF2e("Flat checks cannot have modifiers.").message),this.modifiers=[]),this.mod=new StatisticModifier(this.label,this.modifiers,rollOptions).totalModifier}get actor(){return this.parent.actor}createRollOptions(args={}){return this.parent.createRollOptions(this.domains,args)}async roll(args={}){args.dc=typeof args.dc=="number"?{value:Math.trunc(args.dc)||0}:args.dc??null;const{rollMode,skipDialog}=(()=>{if(isObject(args)){const event=args.event?.originalEvent??args.event;if(event instanceof MouseEvent){const{rollMode:rollMode2,skipDialog:skipDialog2}=args;return mergeObject({rollMode:rollMode2,skipDialog:skipDialog2},eventToRollParams(event))}}return args})(),{actor,domains}=this,token=args.token??actor.getActiveTokens(!1,!0).shift(),item=args.item??null,{origin}=args,targetToken=origin?null:(args.target?.getActiveTokens()??Array.from(game.user.targets)).find(t=>t.actor?.isOfType("creature"))??null,rollContext=await(()=>{const isValidAttacker=actor.isOfType("creature","hazard"),isTargetedCheck=this.domains.includes("spell-attack-roll")&&item?.isOfType("spell")||!["flat-check","saving-throw"].includes(this.type)&&!!(args.dc?.slug||"statistic"in(args.dc??{}))&&(!item||item.isOfType("action","feat","weapon"));return isValidAttacker&&isTargetedCheck?actor.getCheckContext({item:item?.isOfType("action","melee","spell","weapon")?item:null,domains,statistic:this,target:targetToken,defense:args.dc?.slug??"armor",melee:args.melee,options:new Set(args.extraRollOptions??[])}):null})(),targetActor=origin?null:rollContext?.target?.actor??args.target??null,dc=typeof args.dc?.value=="number"?args.dc:rollContext?.dc??null,extraModifiers=this.type==="flat-check"?[]:compact([args.modifiers,rollContext?.self.modifiers].flat()),extraRollOptions=[...args.extraRollOptions??[],...rollContext?.options??[],`check:statistic:${this.parent.slug}`,`check:type:${this.type.replace(/-check$/,"")}`];this.parent.base&&extraRollOptions.push(`check:statistic:base:${this.parent.base.slug}`);const options=this.createRollOptions({...args,origin,target:targetActor,extraRollOptions}),notes=[...extractNotes(actor.synthetics.rollNotes,domains),...args.extraRollNotes??[]];for(const rule of actor.rules.filter(r=>!r.ignored))rule.beforeRoll?.(domains,options);const dosAdjustments=dc?extractDegreeOfSuccessAdjustments(actor.synthetics,domains):[];if((options.has("incapacitation")||options.has("item:trait:incapacitation"))&&dc){const effectLevel=item?.isOfType("spell")?2*item.rank:item?.isOfType("physical")?item.level:origin?.level??actor.level,amount=this.type==="saving-throw"&&actor.level>effectLevel?DEGREE_ADJUSTMENT_AMOUNTS.INCREASE:targetActor&&targetActor.level>effectLevel&&["attack-roll","spell-attack-roll","skill-check"].includes(this.type)?DEGREE_ADJUSTMENT_AMOUNTS.LOWER:null;amount&&dosAdjustments.push({adjustments:{all:{label:"PF2E.TraitIncapacitation",amount}}})}const mapIncreases=Math.clamped((args.attackNumber??1)-1,0,2);if(mapIncreases!==0)if(!item)console.warn("Missing item argument while calculating MAP during check");else{const maps=calculateMAPs(item,{domains,options}),penalty=maps[`map${mapIncreases}`];extraModifiers.push(new ModifierPF2e(maps.label,penalty,"untyped"))}const traits=args.traits?.map(t=>typeof t=="string"?traitSlugToObject(t,CONFIG.PF2E.actionTraits):t);for(const trait of traits??[])options.add(trait.name);const context={actor,token,item,type:this.type,identifier:args.identifier,domains,target:rollContext?.target??null,dc,notes,options,action:args.action,damaging:args.damaging,rollMode,skipDialog,rollTwice:args.rollTwice||extractRollTwice(actor.synthetics.rollTwice,domains,options),substitutions:extractRollSubstitutions(actor.synthetics.rollSubstitutions,domains,options),dosAdjustments,traits,title:args.title?.trim()||args.label?.trim()||this.label,createMessage:args.createMessage??!0};typeof args.attackNumber=="number"&&(context.mapIncreases=mapIncreases,context.options?.add(`map:increases:${mapIncreases}`));const check=new CheckModifier(this.parent.slug,{modifiers:this.modifiers},extraModifiers),roll=await CheckPF2e.roll(check,context,null,args.callback);if(roll)for(const rule of actor.rules.filter(r=>!r.ignored))await rule.afterRoll?.({roll,check,context,domains,rollOptions:options});return roll}get breakdown(){return this.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.modifier<0?"":"+"}${m.modifier}`).join(", ")}};_determineLabel=new WeakSet,determineLabel_fn=__name2(function(data){const parentLabel=this.parent.label;if(data.check?.label)return game.i18n.localize(data.check?.label);if(this.domains.includes("spell-attack-roll"))return game.i18n.format("PF2E.SpellAttackWithTradition",{tradition:parentLabel});switch(this.type){case"skill-check":return game.i18n.format("PF2E.SkillCheckWithName",{skillName:parentLabel});case"saving-throw":return game.i18n.format("PF2E.SavingThrowWithName",{saveName:parentLabel});case"perception-check":return game.i18n.format("PF2E.PerceptionCheck");default:return parentLabel}},"#determineLabel"),__name2(_StatisticCheck,"StatisticCheck");let StatisticCheck=_StatisticCheck;const _StatisticDifficultyClass=class{static{__name(this,"_StatisticDifficultyClass")}parent;domains;label;modifiers;options;constructor(parent,data,options={}){this.parent=parent,this.domains=uniq(compact([data.domains,data.dc?.domains].flat())).sort(),this.label=data.dc?.label,this.options=parent.createRollOptions(this.domains,options);const{modifierAdjustments}=parent.actor.synthetics,parentModifiers=parent.modifiers.map(modifier=>{const clone=modifier.clone();return clone.adjustments.push(...extractModifierAdjustments(modifierAdjustments,data.dc?.domains??[],clone.slug)),clone}),dcOnlyModifiers=[data.dc?.modifiers??[],extractModifiers(parent.actor.synthetics,data.dc?.domains??[])].flat().map(modifier=>(modifier.adjustments.push(...extractModifierAdjustments(parent.actor.synthetics.modifierAdjustments,parent.domains,this.parent.slug)),modifier));this.modifiers=[...new StatisticModifier("",[...parentModifiers,...dcOnlyModifiers.map(m=>m.clone())],this.options).modifiers]}get value(){return 10+new StatisticModifier("",this.modifiers.map(m=>m.clone()),this.options).totalModifier}get breakdown(){const enabledMods=this.modifiers.filter(m=>m.enabled);return[game.i18n.localize("PF2E.DCBase")].concat(enabledMods.map(m=>`${m.label} ${signedInteger(m.modifier)}`)).join(", ")}toString(){return String(this.value)}};__name2(_StatisticDifficultyClass,"StatisticDifficultyClass");let StatisticDifficultyClass=_StatisticDifficultyClass;const _ArmorStatistic=class extends Statistic{static{__name(this,"_ArmorStatistic")}constructor(actor,data={}){data.rank??=1;const attribute=actor.isOfType("creature")?data.attribute??"dex":null,domains=attribute?["all",`${attribute}-based`]:["all"],fullData={...data,label:"TYPES.Item.armor",slug:"armor",attribute,domains,proficient:data.rank>0,dc:{label:"PF2E.ArmorClassLabel",domains:["ac"],modifiers:[]}};super(actor,fullData),__privateAdd(this,_createBonusesAndPenalties),__privateAdd(this,_createShieldBonus),__publicField(this,"details"),this.details=data.details??"";const dcModifiers=[...this.dc.modifiers,...__privateMethod(this,_createBonusesAndPenalties,createBonusesAndPenalties_fn).call(this)].map(m=>m.clone());this.dc.modifiers=[...new StatisticModifier("",dcModifiers,this.dc.options).modifiers]}get item(){return this.actor.isOfType("character")?this.actor.wornArmor:null}getTraceData(){return{...super.getTraceData({value:"dc"}),details:this.details,breakdown:this.dc.breakdown}}};_createBonusesAndPenalties=new WeakSet,createBonusesAndPenalties_fn=__name2(function(){const{actor}=this,armor=actor.isOfType("character")?actor.wornArmor:null,armorSlug=armor?.baseType??armor?.slug??sluggify(armor?.name??""),itemBonus=armor?new ModifierPF2e({label:armor.name,type:"item",slug:armorSlug,modifier:armor.acBonus,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,["all","ac"],armorSlug)}):null;return compact([itemBonus,createShoddyPenalty(actor,armor,this.dc.domains),__privateMethod(this,_createShieldBonus,createShieldBonus_fn).call(this)])},"#createBonusesAndPenalties"),_createShieldBonus=new WeakSet,createShieldBonus_fn=__name2(function(){const{actor}=this;if(!actor.isOfType("character","npc"))return null;const shieldData=actor.system.attributes.shield,slug="raised-shield";return shieldData.raised&&!shieldData.broken?new ModifierPF2e({label:shieldData.name,slug,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,["all","dex-based","ac"],slug),type:"circumstance",modifier:shieldData.ac}):null},"#createShieldBonus"),__name2(_ArmorStatistic,"ArmorStatistic");let ArmorStatistic=_ArmorStatistic;const _HitPointsStatistic=class extends BaseStatistic{static{__name(this,"_HitPointsStatistic")}constructor(actor,{baseMax=0}={}){const modifiers=actor.isOfType("character")?[createAttributeModifier({actor,attribute:"con",domains:["hp","con-based"]})]:[];super(actor,{slug:"hp",label:"PF2E.HitPointsHeader",domains:actor.isOfType("character","npc")?["con-based","hp"]:["hp"],modifiers}),__publicField(this,"value"),__publicField(this,"max"),__privateAdd(this,_baseMax,void 0),__publicField(this,"temp"),__publicField(this,"negativeHealing"),__publicField(this,"unrecoverable"),__publicField(this,"details"),__privateSet(this,_baseMax,baseMax),this.max=baseMax+new StatisticModifier("",this.modifiers.map(m=>m.clone())).totalModifier,this.value=Math.clamped(actor.system.attributes.hp.value,0,this.max),this.temp=actor.system.attributes.hp.temp,this.negativeHealing=actor.system.attributes.hp.negativeHealing,this.unrecoverable=actor.system.attributes.hp.unrecoverable,this.details=actor.system.attributes.hp.details||""}get breakdown(){return compact([__privateGet(this,_baseMax)>0?game.i18n.format("PF2E.MaxHitPointsBaseLabel",{base:__privateGet(this,_baseMax)}):null,...this.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${signedInteger(m.modifier)}`)]).join(", ")}getTraceData(){return{slug:this.slug,label:this.label,value:this.value,max:this.max,temp:this.temp,breakdown:this.breakdown,negativeHealing:this.negativeHealing,unrecoverable:this.unrecoverable,details:this.details,modifiers:this.modifiers.map(m=>m.toObject())}}};_baseMax=new WeakMap,__name2(_HitPointsStatistic,"HitPointsStatistic");let HitPointsStatistic=_HitPointsStatistic;const TRICK_MAGIC_SKILLS=["arcana","nature","occultism","religion"],TrickMagicTradition={arcana:"arcane",nature:"primal",occultism:"occult",religion:"divine"},traditionSkills={arcane:"arcana",divine:"religion",occult:"occultism",primal:"nature"},_TrickMagicItemEntry=class{static{__name(this,"_TrickMagicItemEntry")}id;actor;skill;statistic;attribute;get ability(){return foundry.utils.logCompatibilityWarning("`TrickMagicItemEntry#ability` is deprecated. Use `TrickMagicItemEntry#attribute` instead.",{since:"5.3.0",until:"6.0.0"}),this.attribute}tradition;constructor(actor,skill){if(!actor.isOfType("character"))throw ErrorPF2e("Trick magic entries may only be constructed with PCs");this.actor=actor,this.skill=skill,this.id=`trick-${this.skill}`;const attributes=actor.abilities,{attribute}=["int","wis","cha"].map(attribute2=>({attribute:attribute2,mod:attributes[attribute2].mod})).reduce((highest,next)=>next.mod>highest.mod?next:highest);this.attribute=attribute;const tradition=this.tradition=TrickMagicTradition[skill],selectors=[`${attribute}-based`,"all","spell-attack-dc"],attackSelectors=[`${tradition}-spell-attack`,"spell-attack","spell-attack-roll","attack","attack-roll"],saveSelectors=[`${tradition}-spell-dc`,"spell-dc"],skillRank=actor.skills[skill].rank,trickRank=skillRank===4?2:skillRank===3?1:0;this.statistic=new Statistic(actor,{slug:`trick-${tradition}`,label:CONFIG.PF2E.magicTraditions[tradition],attribute,rank:trickRank||"untrained-level",modifiers:extractModifiers(actor.synthetics,selectors),domains:selectors,check:{type:"attack-roll",modifiers:extractModifiers(actor.synthetics,attackSelectors),domains:attackSelectors},dc:{modifiers:extractModifiers(actor.synthetics,saveSelectors),domains:saveSelectors}})}get name(){return game.i18n.localize("PF2E.TrickMagicItemPopup.Title")}get sort(){return 0}get category(){return"items"}get spells(){return null}get isFlexible(){return!1}get isFocusPool(){return!1}get isInnate(){return!1}get isPrepared(){return!1}get isRitual(){return!1}get isSpontaneous(){return!1}canCast(){return!0}async cast(spell,options={}){const{rollMode,message}=options,castLevel=spell.computeCastRank(spell.rank);if(message!==!1)try{spell.trickMagicEntry=this,await spell.toMessage(void 0,{rollMode,data:{castLevel}})}finally{spell.trickMagicEntry=null}}async getSheetData(){return{id:this.id,name:this.name,statistic:this.statistic.getChatData(),tradition:this.tradition,category:"items",hasCollection:!1,sort:0,levels:[],spellPrepList:null}}};__name2(_TrickMagicItemEntry,"TrickMagicItemEntry");let TrickMagicItemEntry=_TrickMagicItemEntry;const _ChatInspectRoll=class extends Application{static{__name(this,"_ChatInspectRoll")}constructor(message,options={}){super(options),__privateAdd(this,_currentFilter,""),this.message=message}static get defaultOptions(){const options=super.defaultOptions;return options.title="PF2E.ChatRollDetails.Title",options.template="systems/pf2e/templates/chat/chat-inspect-roll.hbs",options.classes=["chat-inspect-roll"],options.resizable=!0,options.width=600,options.height=420,options}getData(){const{context}=this.message.flags.pf2e,domains=context?.domains?.sort(),modifiers=this.prepareModifiers();return{context,domains,modifiers:modifiers??[],hasModifiers:!!modifiers}}prepareModifiers(){return this.message.flags.pf2e.modifiers?.map(mod=>{const value="dieSize"in mod?`+${mod.diceNumber}${mod.dieSize}`:addSign(mod.modifier??0);return{...mod,value,critical:mod.critical!==null?game.i18n.localize(`PF2E.RuleEditor.General.CriticalBehavior.${mod.critical}`):null}})??null}activateListeners($html){super.activateListeners($html);const html=$html[0];this.filterOptions(__privateGet(this,_currentFilter));const filterInput=htmlQuery(html,"input.filter");filterInput?.addEventListener("input",()=>{__privateSet(this,_currentFilter,filterInput.value?.trim()),this.filterOptions(__privateGet(this,_currentFilter))})}filterOptions(filter2){const html=this.element[0],{context}=this.message.flags.pf2e,allOptions=context?.options??[],topLevelOptions=allOptions.filter(option=>!option.includes(":")),remainingOptions=allOptions.filter(option=>option.includes(":")),rollOptions=[...topLevelOptions.sort(),...remainingOptions.sort()],filteredOptions=filter2?rollOptions.filter(r=>r.includes(filter2)):rollOptions,template=htmlQuery(html,"template.roll-option-template")?.innerHTML,content=Handlebars.compile(template)({rollOptions:filteredOptions}),destination=htmlQuery(html,".roll-option-lists");destination&&(destination.innerHTML=content)}};_currentFilter=new WeakMap,__name2(_ChatInspectRoll,"ChatInspectRoll");let ChatInspectRoll=_ChatInspectRoll;const _CriticalHitAndFumbleCards=class{static{__name(this,"_CriticalHitAndFumbleCards")}static handleDraw(message){if(message.isAuthor&&message.isContentVisible){const type=message.flags.pf2e.context?.type??"",firstDie=message.rolls.at(0)?.dice[0];firstDie&&firstDie.faces===20&&this.rollTypes.includes(type)&&(firstDie.total===20?this.automaticDraw("critTable"):firstDie.total===1&&this.automaticDraw("fumbleTable"))}}static automaticDraw(table){this.diceSoNice??=!!game.modules.get("dice-so-nice")?.active,this.diceSoNice?Hooks.once("diceSoNiceRollComplete",()=>{this.drawFromTable(table,!0)}):this.drawFromTable(table,!0)}static drawFromTable(table,automatic=!1){const tableId=table==="critTable"?"FTEpsIWWVrDj0jNG":"WzMGWMIrrPvSp75D";game.packs.get("pf2e.rollable-tables",{strict:!0}).getDocument(tableId).then(rollTable=>{rollTable.draw({displayChat:!1}).then(draw=>{const data={roll:draw.roll,messageData:{}};automatic&&!this.diceSoNice&&(data.messageData.sound=void 0),rollTable.toMessage(draw.results,data)})})}static appendButtons(message,$html){if(this.appendButtonsOption??=game.settings.get("pf2e","critFumbleButtons"),this.appendButtonsOption&&(message.isAuthor||game.user.isGM)&&message.isContentVisible){const type=message.flags.pf2e.context?.type??"";if(this.rollTypes.includes(type)){const critButton=$(``),fumbleButton=$(``),btnContainer1=$('');btnContainer1.append(critButton),btnContainer1.append(fumbleButton),critButton.on("click",event=>{event.stopPropagation(),this.drawFromTable("critTable"),event.currentTarget.blur()}),fumbleButton.on("click",event=>{event.stopPropagation(),this.drawFromTable("fumbleTable"),event.currentTarget.blur()}),$html.find(".dice-total").wrapInner('').append(btnContainer1)}}}};__name2(_CriticalHitAndFumbleCards,"CriticalHitAndFumbleCards"),__publicField(_CriticalHitAndFumbleCards,"rollTypes",["attack-roll","spell-attack-roll"]),__publicField(_CriticalHitAndFumbleCards,"diceSoNice"),__publicField(_CriticalHitAndFumbleCards,"appendButtonsOption");let CriticalHitAndFumbleCards=_CriticalHitAndFumbleCards;async function repair(options){const item=options.item??(options.uuid?await fromUuid(options.uuid):await SelectItemDialog.getItem("repair"));if(item&&!(item instanceof PhysicalItemPF2e)){ui.notifications.warn(game.i18n.format("PF2E.Actions.Repair.Warning.NotPhysicalItem",{item:item.name??""}));return}const dc=options.difficultyClass??(()=>{if(item){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant");return{label:game.i18n.format("PF2E.Actions.Repair.Labels.ItemLevelRepairDC",{level:item.level}),value:calculateDC(item.level,{proficiencyWithoutLevel}),visibility:"all"}}})(),targetItemOptions=Array.from(item?.traits??[]).map(trait=>`target:trait:${trait}`),slug=options?.skill??"crafting",rollOptions=["action:repair",...targetItemOptions],modifiers=options?.modifiers;ActionMacroHelpers.simpleRollActionCheck({actors:options.actors,actionGlyph:options.glyph,title:"PF2E.Actions.Repair.Title",checkContext:opts=>ActionMacroHelpers.defaultCheckContext(opts,{modifiers,rollOptions,slug}),content:async title=>{if(item){const templatePath="systems/pf2e/templates/system/actions/repair/item-heading-partial.hbs",templateData={item},content=await renderTemplate(templatePath,templateData);return title+content}},traits:["exploration","manipulate"],event:options.event,difficultyClass:dc,extraNotes:selector=>[ActionMacroHelpers.note(selector,"PF2E.Actions.Repair","criticalSuccess"),ActionMacroHelpers.note(selector,"PF2E.Actions.Repair","success"),ActionMacroHelpers.note(selector,"PF2E.Actions.Repair","criticalFailure")],createMessage:!1,callback:async result=>{const{actor}=result;if(item&&result.message instanceof ChatMessagePF2e&&actor.isOfType("creature")){const messageSource=result.message.toObject(),flavor=await(async()=>{const proficiencyRank=actor.skills.crafting.rank??0;if(result.outcome==="criticalSuccess"){const label="PF2E.Actions.Repair.Labels.RestoreItemHitPoints",restored=String(10+proficiencyRank*10);return renderRepairResult(item,"restore",label,restored)}else if(result.outcome==="success"){const label="PF2E.Actions.Repair.Labels.RestoreItemHitPoints",restored=String(5+proficiencyRank*5);return renderRepairResult(item,"restore",label,restored)}else if(result.outcome==="criticalFailure")return renderRepairResult(item,"roll-damage","PF2E.Actions.Repair.Labels.RollItemDamage","2d6");return""})();flavor&&(messageSource.flavor+=flavor),await ChatMessage.create(messageSource)}}}).catch(error=>{throw ui.notifications.error(error.message),error})}__name(repair,"repair"),__name2(repair,"repair");async function onRepairChatCardEvent(event,message,card){const itemUuid=card.dataset.itemUuid,item=await fromUuid(itemUuid??""),button=event.currentTarget;if(!(item instanceof PhysicalItemPF2e)||!(button instanceof HTMLElement))return;const repair2=button.dataset.repair,speaker=message&&ChatMessagePF2e.getSpeaker({actor:message.actor,alias:message.alias,token:message.token});if(repair2==="restore"){const value=Number(button.dataset.repairValue)||0,beforeRepair=item.system.hp.value,afterRepair=Math.min(item.system.hp.max,beforeRepair+value);await item.update({"system.hp.value":afterRepair});const content=game.i18n.format("PF2E.Actions.Repair.Chat.ItemRepaired",{itemName:item.name,repairedDamage:afterRepair-beforeRepair,afterRepairHitPoints:afterRepair,maximumHitPoints:item.system.hp.max});await ChatMessage.create({content,speaker})}else if(repair2==="roll-damage"){const roll=await Roll.create("2d6").evaluate({async:!0}),templatePath="systems/pf2e/templates/system/actions/repair/roll-damage-chat-message.hbs",flavor=await renderTemplate(templatePath,{damage:{dealt:Math.max(0,roll.total-item.system.hardness),rolled:roll.total},item});await roll.toMessage({flags:{pf2e:{suppressDamageButtons:!0}},flavor,speaker})}else if(repair2==="damage"){const hardness=Math.max(0,item.system.hardness),damage=(message?.rolls.at(0)?.total??0)-hardness;if(damage>0){const beforeDamage=item.system.hp.value,afterDamage=Math.max(0,item.system.hp.value-damage);await item.update({"system.hp.value":afterDamage});const content=game.i18n.format("PF2E.Actions.Repair.Chat.ItemDamaged",{itemName:item.name,damageDealt:beforeDamage-afterDamage,afterDamageHitPoints:afterDamage,maximumHitPoints:item.system.hp.max});await ChatMessage.create({content,speaker})}else{const templatePath="systems/pf2e/templates/system/actions/repair/roll-damage-chat-message.hbs",content=await renderTemplate(templatePath,{damage:{dealt:0,rolled:message?.rolls.at(0)?.total??0},item});await ChatMessage.create({content,speaker})}}}__name(onRepairChatCardEvent,"onRepairChatCardEvent"),__name2(onRepairChatCardEvent,"onRepairChatCardEvent");async function renderRepairResult(item,result,buttonLabel,value){const templatePath="systems/pf2e/templates/system/actions/repair/repair-result-partial.hbs",label=game.i18n.format(buttonLabel,{value});return renderTemplate(templatePath,{item,label,result,value})}__name(renderRepairResult,"renderRepairResult"),__name2(renderRepairResult,"renderRepairResult");const _ChatCards=class{static{__name(this,"_ChatCards")}static listen(message,html){const selector=["a[data-action], button[data-action]"].join(",");for(const button of htmlQueryAll(html,selector))button.addEventListener("click",async event=>__privateMethod(this,_onClickButton,onClickButton_fn).call(this,{message,event,html,button}))}};_lastClick=new WeakMap,_onClickButton=new WeakSet,onClickButton_fn=__name2(async function({message,event,html,button}){const currentTime=Date.now();if(currentTime-__privateGet(this,_lastClick)<500)return;__privateSet(this,_lastClick,currentTime);const action2=button.dataset.action??"",item=message.item,actor=item?.actor??message.actor;if(!actor||!game.user.isGM&&!actor.isOwner&&!["spell-save","expand-description"].includes(action2))return;const strikeAction=message._strike;if(strikeAction&&action2?.startsWith("strike-")){const context=message.rolls.some(r=>r instanceof CheckRoll)?message.flags.pf2e.context??null:null,mapIncreases=context&&"mapIncreases"in context&&tupleHasValue([0,1,2],context.mapIncreases)?context.mapIncreases:null,altUsage=context&&"altUsage"in context?context.altUsage:null,target=message.target?.token?.object??null,rollArgs={event,altUsage,mapIncreases,checkContext:context,target};switch(sluggify(action2??"")){case"strike-attack":strikeAction.variants[0].roll(rollArgs);return;case"strike-attack2":strikeAction.variants[1].roll(rollArgs);return;case"strike-attack3":strikeAction.variants[2].roll(rollArgs);return;case"strike-damage":{const method=button.dataset.outcome==="success"?"damage":"critical";strikeAction[method]?.(rollArgs);return}}}if(item){const spell=item.isOfType("spell")?item:item.isOfType("consumable")?item.embeddedSpell:null;switch(action2){case"spell-attack":return spell?.rollAttack(event);case"spell-attack-2":return spell?.rollAttack(event,2);case"spell-attack-3":return spell?.rollAttack(event,3);case"spell-damage":spell?.rollDamage(event);return;case"spell-save":return __privateMethod(this,_rollActorSaves,rollActorSaves_fn).call(this,{event,button,actor,item});case"affliction-save":item?.isOfType("affliction")&&item.rollRecovery();return;case"spell-counteract":spell?.rollCounteract(event);return;case"spell-template":return spell?.placeTemplate(message);case"spell-template-clear":{const templateIds=canvas.scene?.templates.filter(t=>t.message===message).map(t=>t.id)??[];button.disabled=!0,await canvas.scene?.deleteEmbeddedDocuments("MeasuredTemplate",templateIds),button.disabled=!1;return}case"spell-variant":{const castLevel=Number(htmlQuery(html,"div.chat-card")?.dataset.castLevel)||1,overlayIds=button.dataset.overlayIds?.split(",").map(id=>id.trim());if(overlayIds){const variantSpell=spell?.loadVariant({overlayIds,castLevel});if(variantSpell){const variantMessage=await variantSpell.toMessage(void 0,{create:!1,data:{castLevel}});if(variantMessage){const messageSource=variantMessage.toObject();await message.update(messageSource)}}}else if(spell){const originalMessage=await(spell?.original??spell).toMessage(void 0,{create:!1,data:{castLevel}});originalMessage&&await message.update(originalMessage.toObject())}return}case"consume":{if(item.isOfType("consumable"))item.consume();else if(item.isOfType("melee")){const consumable=actor.items.get(button.dataset.item??"");if(consumable?.isOfType("consumable")){const oldQuant=consumable.quantity,consumableString=game.i18n.localize("TYPES.Item.consumable"),toReplace=`${consumable.name} - ${consumableString} (${oldQuant})`;await consumable.consume();const currentQuant=oldQuant===1?0:consumable.quantity;let flavor=message.flavor.replace(toReplace,`${consumable.name} - ${consumableString} (${currentQuant})`);if(currentQuant===0){const buttonStr=`>${game.i18n.localize("PF2E.ConsumableUseLabel")}`;flavor=flavor?.replace(buttonStr," disabled"+buttonStr)}await message.update({flavor}),message.render(!0)}}return}case"expand-description":{const{description}=item,element=htmlClosest(button,".description");element&&(element.innerHTML=await TextEditor.enrichHTML(description,{async:!0,rollData:actor.getRollData()}),element.scrollIntoView({behavior:"smooth",block:"center"}));break}case"apply-effect":{button.disabled=!0;const target=fromUuidSync(button.dataset.targets??""),effect=item.isOfType("action","feat")&&item.system.selfEffect?await fromUuid(item.system.selfEffect.uuid):null;if(target instanceof ActorPF2e&&effect instanceof ItemPF2e&&effect.isOfType("effect")){await target.createEmbeddedDocuments("Item",[effect.clone().toObject()]);const parsedMessageContent=(()=>{const container=document.createElement("div");return container.innerHTML=message.content,container})(),buttons=htmlQuery(parsedMessageContent,".message-buttons");if(buttons){const span=createHTMLElement("span",{classes:["effect-applied"]}),anchor=effect.toAnchor({attrs:{draggable:"true"}}),locKey="PF2E.Item.Action.SelfAppliedEffect.Applied",statement=game.i18n.format(locKey,{effect:anchor.outerHTML});span.innerHTML=statement,buttons.replaceChildren(span),await message.update({content:parsedMessageContent.innerHTML})}}break}case"elemental-blast-damage":{if(!actor.isOfType("character"))return;const roll=message.rolls.find(r=>r instanceof CheckRoll&&r.options.action==="elemental-blast"),checkContext=roll?message.flags.pf2e.context??null:null,outcome=button.dataset.outcome==="success"?"success":"criticalSuccess",[element,damageType,meleeOrRanged,actionCost]=roll?.options.identifier?.split(".")??[];objectHasKey(elementTraits,element)&&objectHasKey(CONFIG.PF2E.damageTypes,damageType)&&await new ElementalBlast(actor).damage({element,damageType,melee:meleeOrRanged==="melee",actionCost:Number(actionCost)||1,checkContext,outcome,event})}}}else if(action2&&actor.isOfType("character","npc")){const buttonGroup=htmlClosest(button,".chat-card, .message-buttons"),physicalItem=await(async()=>{const itemUuid=buttonGroup?.dataset.itemUuid??"",maybeItem=await fromUuid(itemUuid);return maybeItem instanceof PhysicalItemPF2e?maybeItem:null})(),quantity=Number(buttonGroup?.dataset.craftingQuantity)||1;if(action2==="repair-item"&&buttonGroup)await onRepairChatCardEvent(event,message,buttonGroup);else if(physicalItem&&action2==="pay-crafting-costs"){const quantity2=Number(buttonGroup?.dataset.craftingQuantity)||1,craftingCost=CoinsPF2e.fromPrice(physicalItem.price,quantity2),coinsToRemove=button.classList.contains("full")?craftingCost:craftingCost.scale(.5);if(!await actor.inventory.removeCoins(coinsToRemove)){ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.InsufficientCoins"));return}if(isSpellConsumable(physicalItem.id)&&physicalItem.isOfType("consumable")){craftSpellConsumable(physicalItem,quantity2,actor),ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.PayAndReceive",{actorName:actor.name,cost:coinsToRemove.toString(),quantity:quantity2,itemName:physicalItem.name}),speaker:{alias:actor.name}});return}const itemObject=physicalItem.toObject();if(itemObject.system.quantity=quantity2,!await actor.addToInventory(itemObject,void 0)){ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.CantAddItem"));return}ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.LoseMaterials",{actorName:actor.name,cost:coinsToRemove.toString(),quantity:quantity2,itemName:physicalItem.name}),speaker:{alias:actor.name}})}else if(physicalItem&&action2==="lose-materials"){const coinsToRemove=CoinsPF2e.fromPrice(physicalItem.price,quantity).scale(.5).scale(.1);await actor.inventory.removeCoins(coinsToRemove)?ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.PayAndReceive",{actorName:actor.name,cost:coinsToRemove.toString()}),speaker:{alias:actor.name}}):ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.InsufficientCoins"))}else if(action2==="receieve-crafting-item"&&physicalItem)return isSpellConsumable(physicalItem.id)&&physicalItem.isOfType("consumable")?craftSpellConsumable(physicalItem,quantity,actor):craftItem(physicalItem,quantity,actor)}},"#onClickButton"),_rollActorSaves=new WeakSet,rollActorSaves_fn=__name2(async function({event,button,actor,item}){if(canvas.tokens.controlled.length>0){const saveType=button.dataset.save;if(!tupleHasValue(SAVE_TYPES,saveType))throw ErrorPF2e(`"${saveType}" is not a recognized save type`);const dc=Number(button.dataset.dc??"NaN");for(const token of canvas.tokens.controlled){const save=token.actor?.saves?.[saveType];if(!save)return;save.check.roll({...eventToRollParams(event),dc:Number.isInteger(dc)?{value:Number(dc)}:null,item,origin:actor})}}else ui.notifications.error(game.i18n.localize("PF2E.UI.errorTargetToken"))},"#rollActorSaves"),__privateAdd(_ChatCards,_onClickButton),__privateAdd(_ChatCards,_rollActorSaves),__name2(_ChatCards,"ChatCards"),__privateAdd(_ChatCards,_lastClick,0);let ChatCards=_ChatCards;const DamageTaken={listen:async(message,html)=>{const damageTakenCard=htmlQuery(html,".damage-taken");if(!damageTakenCard)return;const settingEnabled=game.settings.get("pf2e","metagame_tokenSetsNameVisibility");if(!game.user.isGM&&settingEnabled&&message.token&&!message.token.playersCanSeeName){const nameElem=htmlQuery(damageTakenCard,".target-name");nameElem&&(nameElem.innerText=game.i18n.localize("PF2E.Actor.ApplyDamage.TheTarget"))}const iwrInfo=htmlQuery(damageTakenCard,".iwr");if(!iwrInfo)return;const iwrApplications=(()=>{try{const parsed=JSON.parse(iwrInfo?.dataset.applications??"null");return Array.isArray(parsed)&&parsed.every(a=>a instanceof Object&&"category"in a&&typeof a.category=="string"&&"type"in a&&typeof a.type=="string"&&"adjustment"in a&&typeof a.adjustment=="number")?parsed:null}catch{return null}})();iwrApplications&&$(iwrInfo).tooltipster({theme:"crb-hover",maxWidth:400,content:await renderTemplate("systems/pf2e/templates/chat/damage/iwr-breakdown.hbs",{applications:iwrApplications}),contentAsHTML:!0})}},DegreeOfSuccessHighlights={listen:(message,html)=>{if(htmlQueryAll(html,".pf2e-reroll-indicator").length>0)return;const firstRoll=message.rolls.at(0);if(!firstRoll||message.isDamageRoll)return;const firstDice=firstRoll.dice.at(0);if(!(firstDice instanceof Die&&firstDice.faces===20&&message.isContentVisible))return;const diceTotal=htmlQuery(html,".dice-total"),results=firstDice.results.filter(r=>r.active);results.every(r=>r.result===20)?diceTotal?.classList.add("success"):results.every(r=>r.result===1)&&diceTotal?.classList.add("failure")}},SetAsInitiative={listen:li=>{const message=game.messages.get(li.dataset.messageId??"",{strict:!0}),{context}=message.flags.pf2e;if(message.token&&(message.isAuthor&&!message.blind||game.user.isGM)&&(context?.type==="skill-check"||context?.type==="perception-check")){const btnContainer=document.createElement("span");btnContainer.classList.add("dmgBtn-container"),Object.assign(btnContainer.style,{position:"absolute",right:"0",bottom:"1px"});const setInitiativeButton=document.createElement("button");setInitiativeButton.classList.add("dice-total-setInitiative-btn"),Object.assign(setInitiativeButton.style,{width:"22px",height:"22px",fontSize:"10px",lineHeight:"1px"}),setInitiativeButton.title=game.i18n.localize("PF2E.ClickToSetInitiative"),setInitiativeButton.appendChild(fontAwesomeIcon("fa-swords",{style:"solid"})),btnContainer.appendChild(setInitiativeButton);const selector=message.isReroll?".pf2e-reroll-second .dice-total":".dice-total";li.querySelector(selector)?.appendChild(btnContainer),setInitiativeButton.addEventListener("click",async event=>{event.stopPropagation();const{actor,token}=message;if(!token){ui.notifications.error(game.i18n.format("PF2E.Encounter.NoTokenInScene",{actor:message.actor?.name??message.user?.name??""}));return}if(!actor)return;const combatant=await CombatantPF2e.fromActor(actor);if(!combatant)return;const value=message.rolls.at(0)?.total??0;await combatant.encounter.setInitiative(combatant.id,value),ui.notifications.info(game.i18n.format("PF2E.Encounter.InitiativeSet",{actor:actor.name,initiative:value}))})}}},_ChatMessagePF2e=class _ChatMessagePF2e2 extends ChatMessage{static{__name(this,"_ChatMessagePF2e")}constructor(data={},context={}){const expandedFlags=expandObject(data.flags??{});data.flags=mergeObject(expandedFlags,{core:{canPopout:expandedFlags.core?.canPopout??!0},pf2e:{}}),super(data,context),__privateAdd(this,_onHoverIn),__privateAdd(this,_onHoverOut)}get isDamageRoll(){const firstRoll=this.rolls.at(0);if(!firstRoll||firstRoll.terms.some(t=>t instanceof FateDie||t instanceof Coin))return!1;if(this.flags.pf2e.context?.type==="damage-roll")return!0;const isCheck=firstRoll instanceof CheckRoll||firstRoll.dice[0]?.faces===20,fromRollTable=!!this.flags.core.RollTable;return!(isCheck||fromRollTable)}get actor(){return _ChatMessagePF2e2.getSpeakerActor(this.speaker)}get target(){const context=this.flags.pf2e.context;if(!context)return null;const targetUUID="target"in context?context.target?.token:null;if(!targetUUID)return null;const match=/^Scene\.(\w+)\.Token\.(\w+)$/.exec(targetUUID??"")??[],token=game.scenes.get(match[1]??"")?.tokens.get(match[2]??""),actor=token?.actor;return actor?{actor,token}:null}get journalEntry(){const uuid=this.flags.pf2e.journalEntry;if(!uuid)return null;const entryId=/^JournalEntry.([A-Za-z0-9]{16})$/.exec(uuid)?.at(1);return game.journal.get(entryId??"")??null}get isCheckRoll(){return this.rolls[0]instanceof CheckRoll}get isReroll(){const context=this.flags.pf2e.context;return!!context&&"isReroll"in context&&!!context.isReroll}get isRerollable(){const roll=this.rolls[0];return!!(this.actor?.isOwner&&(this.isAuthor||this.isOwner)&&roll instanceof CheckRoll&&roll.isRerollable)}get item(){if(this.flags.pf2e.context?.type==="self-effect")return this.actor?.items.get(this.flags.pf2e.context.item)??null;const strike=this._strike;if(strike?.item)return strike.item;const item=(()=>{const domItem=this.getItemFromDOM();if(domItem)return domItem;const origin=this.flags.pf2e?.origin??null,match=/Item\.(\w+)/.exec(origin?.uuid??"")??[];return this.actor?.items.get(match?.[1]??"")??null})();if(!item)return null;const{tradition}=this.flags.pf2e?.casting??{},isCharacter=item.actor.isOfType("character");if(tradition&&item.isOfType("spell")&&!item.spellcasting&&isCharacter){const trick=new TrickMagicItemEntry(item.actor,traditionSkills[tradition]);item.trickMagicEntry=trick}if(item?.isOfType("spell")){const overlayIds=this.flags.pf2e.origin?.variant?.overlays,castLevel=this.flags.pf2e.origin?.castLevel??item.rank;return item.loadVariant({overlayIds,castLevel})??item}return item}get _strike(){const{actor}=this,identifier=this.rolls.find(r=>r instanceof CheckRoll)?.options.identifier??htmlQuery(document.body,`li.message[data-message-id="${this.id}"] [data-identifier]`)?.dataset.identifier,[itemId,slug,meleeOrRanged]=identifier?.split(".")??[null,null,null];if(!meleeOrRanged||!["melee","ranged"].includes(meleeOrRanged))return null;const strikeData=actor?.system.actions?.find(s=>s.slug===slug&&s.item.id===itemId),itemMeleeOrRanged=strikeData?.item.isMelee?"melee":"ranged";return meleeOrRanged===itemMeleeOrRanged?strikeData??null:strikeData?.altUsages?.find(u=>{const altUsageMeleeOrRanged=u.item.isMelee?"melee":"ranged";return meleeOrRanged===altUsageMeleeOrRanged})??null}getItemFromDOM(){const html=ui.chat.element[0],messageElem=htmlQuery(html,`#chat-log > li[data-message-id="${this.id}"]`),sourceString=htmlQuery(messageElem,".pf2e.item-card")?.dataset.embeddedItem??"null";try{const itemSource=JSON.parse(sourceString);return itemSource?new ItemProxyPF2e(itemSource,{parent:this.actor,fromConsumable:this.flags?.pf2e?.isFromConsumable}):null}catch{return null}}async showDetails(){this.flags.pf2e.context&&new ChatInspectRoll(this).render(!0)}get token(){if(!game.scenes)return null;const sceneId=this.speaker.scene??"",tokenId=this.speaker.token??"";return game.scenes.get(sceneId)?.tokens.get(tokenId)??null}getRollData(){const{actor,item}=this;return{...actor?.getRollData(),...item?.getRollData()}}async getHTML(){const{actor}=this;if(this.isContentVisible){const rollData=this.getRollData();this.flavor=await TextEditorPF2e.enrichHTML(this.flavor,{async:!0,rollData,processVisibility:!1})}const $html=await super.getHTML(),html=$html[0];!this.flags.pf2e.suppressDamageButtons&&this.isDamageRoll&&htmlQueryAll(html,".damage-application").forEach((buttons,index)=>{buttons.dataset.rollIndex=index.toString()}),UserVisibilityPF2e.process(html,{message:this}),await DamageTaken.listen(this,html),CriticalHitAndFumbleCards.appendButtons(this,$html),ChatCards.listen(this,html),InlineRollLinks.listen(html,this),DegreeOfSuccessHighlights.listen(this,html),canvas.ready&&SetAsInitiative.listen(html);const roll=this.rolls[0];if(actor?.isOwner&&roll instanceof DamageRoll&&roll.options.evaluatePersistent){const damageType=roll.instances.find(i=>i.persistent)?.type;if(damageType?this.actor?.getCondition(`persistent-damage-${damageType}`):null){const template="systems/pf2e/templates/chat/persistent-damage-recovery.hbs",section=parseHTML(await renderTemplate(template));html.querySelector(".message-content")?.append(section),html.dataset.actorIsTarget="true"}htmlQuery(html,"[data-action=recover-persistent-damage]")?.addEventListener("click",()=>{const{actor:actor2}=this;if(!actor2)return;const damageType2=roll.instances.find(i=>i.persistent)?.type;if(!damageType2)return;const condition2=actor2.getCondition(`persistent-damage-${damageType2}`);if(!condition2?.system.persistent){const damageTypeLocalized=game.i18n.localize(CONFIG.PF2E.damageTypes[damageType2]??damageType2),message=game.i18n.format("PF2E.Item.Condition.PersistentDamage.Error.DoesNotExist",{damageType:damageTypeLocalized});ui.notifications.warn(message);return}condition2.rollRecovery()})}return this.flags.pf2e.appliedDamage?.isReverted||this.actor?.isOwner||htmlQuery(html,"button[data-action=revert-damage]")?.remove(),html.addEventListener("mouseenter",event=>__privateMethod(this,_onHoverIn,onHoverIn_fn).call(this,event)),html.addEventListener("mouseleave",event=>__privateMethod(this,_onHoverOut,onHoverOut_fn).call(this,event)),UserVisibilityPF2e.processMessageSender(this,html),!actor&&this.content&&UserVisibilityPF2e.process(html,{document:this}),$html}_onCreate(data,options,userId){super._onCreate(data,options,userId),this.isRoll&&game.settings.get("pf2e","drawCritFumble")&&CriticalHitAndFumbleCards.handleDraw(this)}};_onHoverIn=new WeakSet,onHoverIn_fn=__name2(function(nativeEvent){if(!canvas.ready)return;const token=this.token?.object;token?.isVisible&&!token.controlled&&token.emitHoverIn(nativeEvent)},"#onHoverIn"),_onHoverOut=new WeakSet,onHoverOut_fn=__name2(function(nativeEvent){canvas.ready&&this.token?.object?.emitHoverOut(nativeEvent)},"#onHoverOut"),__name2(_ChatMessagePF2e,"ChatMessagePF2e");let ChatMessagePF2e=_ChatMessagePF2e;async function preImportJSON(document2,json2){const source=JSON.parse(json2);if(!isObject(source)||("data"in source&&("items"in source?ActorPF2e.migrateData(source):ItemPF2e.migrateData(source)),!isObject(source.system)))return null;const sourceSchemaVersion=Number(source.system?._migration?.version)||0,worldSchemaVersion=MigrationRunnerBase.LATEST_SCHEMA_VERSION;if(foundry.utils.isNewerVersion(sourceSchemaVersion,worldSchemaVersion))return ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.CantImportTooHighVersion",{sourceName:game.i18n.localize("DOCUMENT.Actor"),sourceSchemaVersion,worldSchemaVersion})),null;const newDoc=new document2.constructor(source,{parent:document2.parent}),migrations=MigrationList.constructFromVersion(newDoc.schemaVersion);return await MigrationRunner.ensureSchemaVersion(newDoc,migrations),JSON.stringify(newDoc.toObject())}__name(preImportJSON,"preImportJSON"),__name2(preImportJSON,"preImportJSON");function combatantAndTokenDoc(document2){return document2 instanceof CombatantPF2e?{combatant:document2,tokenDoc:document2.token}:{combatant:document2.combatant,tokenDoc:document2}}__name(combatantAndTokenDoc,"combatantAndTokenDoc"),__name2(combatantAndTokenDoc,"combatantAndTokenDoc");async function processGrantDeletions(item,pendingItems){const{actor}=item,granter=actor.items.get(item.flags.pf2e.grantedBy?.id??""),parentGrant=Object.values(granter?.flags.pf2e.itemGrants??{}).find(g=>g.id===item.id),grants=Object.values(item.flags.pf2e.itemGrants);if(granter&&parentGrant?.onDelete==="restrict"&&!pendingItems.includes(granter)){ui.notifications.warn(game.i18n.format("PF2E.Item.RemovalPrevented",{item:item.name,preventer:granter.name})),pendingItems.splice(pendingItems.indexOf(item),1);return}for(const grant of grants){const grantee=actor.items.get(grant.id);if(grantee?.flags.pf2e.grantedBy?.id===item.id&&grantee.flags.pf2e.grantedBy.onDelete==="restrict"&&!pendingItems.includes(grantee)){ui.notifications.warn(game.i18n.format("PF2E.Item.RemovalPrevented",{item:item.name,preventer:grantee.name})),pendingItems.splice(pendingItems.indexOf(item),1);return}}granter&&parentGrant?.onDelete==="cascade"&&!pendingItems.includes(granter)&&(pendingItems.push(granter),await processGrantDeletions(granter,pendingItems));for(const grant of grants){const grantee=actor.items.get(grant.id);grantee?.flags.pf2e.grantedBy?.id===item.id&&grantee.flags.pf2e.grantedBy.onDelete==="cascade"&&!pendingItems.includes(grantee)&&(pendingItems.push(grantee),await processGrantDeletions(grantee,pendingItems))}const[key]=Object.entries(granter?.flags.pf2e.itemGrants??{}).find(([,g])=>g===parentGrant)??[null];granter&&key&&!pendingItems.includes(granter)&&await granter.update({[`flags.pf2e.itemGrants.-=${key}`]:null},{render:!1});for(const grant of grants){const grantee=actor.items.get(grant.id);grantee?.flags.pf2e.grantedBy?.id===item.id&&grantee.flags.pf2e.grantedBy.onDelete==="detach"&&!pendingItems.includes(grantee)&&await grantee.update({"flags.pf2e.-=grantedBy":null},{render:!1})}}__name(processGrantDeletions,"processGrantDeletions"),__name2(processGrantDeletions,"processGrantDeletions");const _ItemPF2e=class _ItemPF2e2 extends Item{static{__name(this,"_ItemPF2e")}static getDefaultArtwork(itemData){return{img:`systems/pf2e/icons/default-icons/${itemData.type}.svg`}}get slug(){return this.system.slug}get sourceId(){return this.flags.core?.sourceId??null}get schemaVersion(){return Number(this.system._migration?.version??this.system.schema?.version)||null}get description(){return this.system.description.value.trim()}get grantedBy(){return this.actor?.items.get(this.flags.pf2e.grantedBy?.id??"")??null}get inMemoryOnly(){return!this.collection.has(this.id)}static fromDropData(data,options){if("uuid"in data&&UUIDUtils.isItemUUID(data.uuid)){const item=fromUuidSync(data.uuid);item instanceof _ItemPF2e2&&item.parent&&!item.sourceId&&(item._source.flags=mergeObject(item._source.flags,{core:{sourceId:item.uuid}}),item.flags=mergeObject(item.flags,{core:{sourceId:item.uuid}}))}return super.fromDropData(data,options)}isOfType(...types){return types.some(t=>t==="physical"?setHasElement(PHYSICAL_ITEM_TYPES,this.type):this.type===t)}async delete(context={}){return this.actor?(await this.actor.deleteEmbeddedDocuments("Item",[this.id],context),this):super.delete(context)}getRollOptions(prefix=this.type){if(prefix.length===0)throw ErrorPF2e("`prefix` must be at least one character long");const slug=this.slug??sluggify(this.name),{value:traits=[],otherTags}=this.system.traits,traitOptions=(()=>{const damageType=Object.keys(CONFIG.PF2E.damageTypes).join("|"),diceOrNumber=/-(?:[0-9]*d)?[0-9]+(?:-min)?$/,versatile=new RegExp(`-(?:b|p|s|${damageType})$`),deannotated=traits.filter(t=>diceOrNumber.test(t)||versatile.test(t)).map(t=>t.replace(diceOrNumber,"").replace(versatile,""));return[traits,deannotated].flat().map(t=>`trait:${t}`)})(),options=[`${prefix}:id:${this.id}`,`${prefix}:${slug}`,`${prefix}:slug:${slug}`,...traitOptions.map(t=>`${prefix}:${t}`),...otherTags.map(t=>`${prefix}:tag:${t}`)];(this.isOfType("spell")||traits.some(t=>["magical",...MAGIC_TRADITIONS].includes(t)))&&options.push(`${prefix}:magical`);const level=this.isOfType("spell")?this.rank:this.system.level?.value??null;typeof level=="number"&&options.push(`${prefix}:level:${level}`);const itemType=this.isOfType("feat")&&this.isFeature?"feature":this.type;return prefix!==itemType&&options.unshift(`${prefix}:type:${itemType}`),options.sort()}getRollData(){return{...this.actor?.getRollData()??{actor:null},item:this}}async toMessage(event,{rollMode=void 0,create=!0,data={}}={}){if(!this.actor)throw ErrorPF2e(`Cannot create message for unowned item ${this.name}`);const template=`systems/pf2e/templates/chat/${sluggify(this.type)}-card.hbs`,token=this.actor.token,nearestItem=event?.currentTarget.closest(".item")??{},contextualData=Object.keys(data).length>0?data:nearestItem.dataset||{},templateData={actor:this.actor,tokenId:token?`${token.parent?.id}.${token.id}`:null,item:this,data:await this.getChatData(void 0,contextualData)},chatData={speaker:ChatMessagePF2e.getSpeaker({actor:this.actor,token:this.actor.getActiveTokens(!1,!0)[0]??null}),flags:{pf2e:{origin:this.getOriginData()}},type:CONST.CHAT_MESSAGE_TYPES.OTHER};return rollMode??=event?.ctrlKey||event?.metaKey?"blindroll":game.settings.get("core","rollMode"),["gmroll","blindroll"].includes(rollMode)&&(chatData.whisper=ChatMessagePF2e.getWhisperRecipients("GM").map(u=>u.id)),rollMode==="blindroll"&&(chatData.blind=!0),chatData.content=await renderTemplate(template,templateData),create?ChatMessagePF2e.create(chatData,{renderSheet:!1}):new ChatMessagePF2e(chatData)}async toChat(event){return this.toMessage(event,{create:!0})}_initialize(options){this.rules=[],super._initialize(options)}prepareData(){this.parent&&!this.parent.flags?.pf2e||super.prepareData()}prepareBaseData(){super.prepareBaseData();const{flags}=this;flags.pf2e=mergeObject(flags.pf2e??{},{rulesSelections:{}}),this.system.slug||=null,isObject(flags.pf2e.grantedBy)&&(flags.pf2e.grantedBy.onDelete??=this.isOfType("physical")?"detach":"cascade");const grants=flags.pf2e.itemGrants??={};for(const grant of Object.values(grants))isObject(grant)&&(grant.onDelete??="detach")}prepareRuleElements(options={}){if(!this.actor)throw ErrorPF2e("Rule elements may only be prepared from embedded items");return this.rules=this.actor.canHostRuleElements?RuleElements.fromOwnedItem({...options,parent:this}):[]}async refreshFromCompendium(options={}){if(!this.isOwned){ui.notifications.error("This utility may only be used on owned items");return}if(!this.sourceId?.startsWith("Compendium.")){ui.notifications.warn(`Item "${this.name}" has no compendium source.`);return}options.name??=!1;const currentSource=this.toObject(),latestSource=(await fromUuid(this.sourceId))?.toObject();if(latestSource){if(latestSource.type!==this.type){ui.notifications.error(`The compendium source for "${this.name}" is of a different type than what is present on this actor.`);return}}else{ui.notifications.warn(`The compendium source for "${this.name}" (source ID: ${this.sourceId}) was not found.`);return}const updates={img:currentSource.img.endsWith(".svg")?latestSource.img:currentSource.img,system:latestSource.system};if(options.name&&(updates.name=latestSource.name),isPhysicalData(currentSource)){const{containerId,quantity}=currentSource.system;mergeObject(updates,expandObject({"system.containerId":containerId,"system.quantity":quantity}))}else(currentSource.type==="feat"||currentSource.type==="spell")&&mergeObject(updates,expandObject({"system.location":currentSource.system.location}));if(currentSource.type==="weapon"||currentSource.type==="armor"){const materialAndRunes={"system.material":currentSource.system.material,"system.potencyRune":currentSource.system.potencyRune,"system.propertyRune1":currentSource.system.propertyRune1,"system.propertyRune2":currentSource.system.propertyRune2,"system.propertyRune3":currentSource.system.propertyRune3,"system.propertyRune4":currentSource.system.propertyRune4};currentSource.type==="weapon"?materialAndRunes["system.strikingRune"]=currentSource.system.strikingRune:materialAndRunes["system.resiliencyRune"]=currentSource.system.resiliencyRune,mergeObject(updates,expandObject(materialAndRunes))}await this.update(updates,{diff:!1,recursive:!1}),ui.notifications.info(`Item "${this.name}" has been refreshed.`)}getOriginData(){return{uuid:this.uuid,type:this.type}}async processChatData(htmlOptions={},data){if(data.properties=data.properties?.filter(property=>property!==null)??[],isItemSystemData(data)){const chatData=duplicate(data);return htmlOptions.rollData=mergeObject(this.getRollData(),htmlOptions.rollData??{}),chatData.description.value=await TextEditor.enrichHTML(chatData.description.value,{...htmlOptions,async:!0}),chatData}return data}async getChatData(htmlOptions={},_rollOptions2={}){if(!this.actor)throw ErrorPF2e(`Cannot retrieve chat data for unowned item ${this.name}`);const systemData={...this.system,traits:this.traitChatData()};return this.processChatData(htmlOptions,deepClone(systemData))}traitChatData(dictionary={}){return[...this.system.traits?.value??[]].sort().map(trait=>{const label=dictionary[trait]??trait,traitDescriptions2=CONFIG.PF2E.traitsDescriptions;return{value:trait,label,description:traitDescriptions2[trait]}})}static async createDialog(data={},context={}){const omittedTypes=["condition","spellcastingEntry","lore"];omittedTypes.push("affliction","book"),game.settings.get("pf2e","campaignType")!=="kingmaker"&&omittedTypes.push("campaignFeature");const original=game.system.documentTypes.Item;try{return game.system.documentTypes.Item=difference(original,omittedTypes),super.createDialog(data,{...context,classes:[...context.classes??[],"dialog-item-create"]})}finally{game.system.documentTypes.Item=original}}async importFromJSON(json2){const processed=await preImportJSON(this,json2);return processed?super.importFromJSON(processed):this}toDragData(){return{...super.toDragData(),itemType:this.type}}static async createDocuments(data=[],context={}){const sources=data.map(d=>d instanceof _ItemPF2e2?d.toObject():d);for(const source of[...sources]){if(source.effects=[],!Object.keys(source).some(k=>k.startsWith("flags")||k.startsWith("system"))){source.system={_migration:{version:MigrationRunnerBase.LATEST_SCHEMA_VERSION}};continue}const item=new CONFIG.Item.documentClass(source);await MigrationRunner.ensureSchemaVersion(item,MigrationList.constructFromVersion(item.schemaVersion)),data.splice(data.indexOf(source),1,item.toObject())}const actor=context.parent;if(!actor)return super.createDocuments(sources,context);const validTypes=actor.allowedItemTypes;validTypes.includes("physical")&&validTypes.push(...PHYSICAL_ITEM_TYPES,"kit");for(const source of sources)if(!validTypes.includes(source.type))return ui.notifications.error(game.i18n.format("PF2E.Item.CannotAddType",{type:game.i18n.localize(CONFIG.Item.typeLabels[source.type]??source.type.titleCase())})),[];const effectSources=sources.filter(s=>["affliction","condition","effect"].includes(s.type));for(const source of effectSources){const effect=new CONFIG.PF2E.Item.documentClasses[source.type](deepClone(source),{parent:actor}),isUnaffected=effect.isOfType("condition")&&!actor.isAffectedBy(effect),isImmune=actor.isImmuneTo(effect);if((isUnaffected||isImmune)&&(sources.splice(sources.indexOf(source),1),!(effect.isOfType("effect")&&effect.fromAura))){const locKey=isUnaffected?"PF2E.Damage.IWR.ActorIsUnaffected":"PF2E.Damage.IWR.ActorIsImmune",message=game.i18n.format(locKey,{actor:actor.name,effect:effect.name});ui.notifications.info(message)}}const preCreateDeletions=["ancestry","background","class","heritage","deity"].filter(type=>sources.some(s=>s.type===type)).flatMap(type=>actor.itemTypes[type]);if(preCreateDeletions.length){const idsToDelete=preCreateDeletions.map(i=>i.id);await actor.deleteEmbeddedDocuments("Item",idsToDelete,{render:!1})}const items=await(async()=>{async function getSimpleGrants(item){const granted=await item.createGrantedItems?.({size:context.parent?.size})??[];if(!granted.length)return[];const reparented=granted.map(i=>i.parent?i:new CONFIG.Item.documentClass(i._source,{parent:actor}));return[...reparented,...(await Promise.all(reparented.map(getSimpleGrants))).flat()]}__name(getSimpleGrants,"getSimpleGrants"),__name2(getSimpleGrants,"getSimpleGrants");const items2=sources.map(source=>(context.keepId||context.keepEmbeddedIds||(source._id=randomID()),new CONFIG.Item.documentClass(source,{parent:actor})));for(const item of[...items2]){const grants=await getSimpleGrants(item);grants.length&&(context.keepId=!0,items2.push(...grants))}return items2})(),outputSources=items.map(i=>i._source);for(const item of items){item.prepareActorData?.();const itemSource=item._source,rules=item.prepareRuleElements({suppressWarnings:!0});for(const rule of rules){const ruleSource=itemSource.system.rules[rules.indexOf(rule)];await rule.preCreate?.({itemSource,ruleSource,pendingItems:outputSources,context})}}if(outputSources.some(i=>i.type==="class")){const classFeatures=outputSources.filter(i=>i.type==="feat"&&typeof i.system?.level?.value=="number"&&i.system.category==="classfeature"&&!i.flags?.pf2e?.grantedBy);for(const feature of classFeatures)feature.sort=classFeatures.indexOf(feature)*100*(feature.system.level?.value??1)}const nonKits=outputSources.filter(source=>source.type!=="kit");return super.createDocuments(nonKits,context)}static async deleteDocuments(ids=[],context={}){ids=Array.from(new Set(ids));const actor=context.parent;if(actor){const items=ids.flatMap(id=>actor.items.get(id)??[]),containers=items.filter(i=>i.isOfType("backpack"));for(const container of containers)await container.ejectContents();for(const item of[...items]){for(const rule of item.rules)await rule.preDelete?.({pendingItems:items,context});await processGrantDeletions(item,items)}ids=Array.from(new Set(items.map(i=>i.id))).filter(id=>actor.items.has(id))}return super.deleteDocuments(ids,context)}async _preCreate(data,options,user){if(this._source.system.traits.value?.sort(),this.actor?.isOfType("character")&&this.isOfType("ancestry","background","class","feat","heritage")){const hpMaxDifference=this.actor.clone({items:[...this.actor.items.toObject(),data]}).hitPoints.max-this.actor.hitPoints.max;if(hpMaxDifference!==0){const newHitPoints=this.actor.hitPoints.value+hpMaxDifference;await this.actor.update({"system.attributes.hp.value":newHitPoints},{render:!1,allowHPOverage:!0})}}return this._source.system.rules=this._source.system.rules.filter(r=>!r.removeUponCreate),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){if(changed.system?.description?.value===null&&(changed.system.description.value=""),changed.system?.level&&"value"in changed.system.level&&(changed.system.level.value=Math.max(0,Math.trunc(Number(changed.system.level.value)||0))),typeof changed.system?.slug=="string"&&(changed.system.slug=sluggify(changed.system.slug)||null),changed.system?.traits&&(Array.isArray(changed.system.traits.value)&&changed.system.traits.value.sort(),Array.isArray(changed.system.traits.otherTags)&&(changed.system.traits.otherTags=changed.system.traits.otherTags.map(t=>sluggify(t)).sort())),this.actor?.isOfType("character")&&this.isOfType("ancestry","background","class","feat","heritage")){const actorClone=this.actor.clone();actorClone.items.get(this.id,{strict:!0}).updateSource(changed,options),actorClone.reset();const hpMaxDifference=actorClone.hitPoints.max-this.actor.hitPoints.max;if(hpMaxDifference!==0){const newHitPoints=this.actor.hitPoints.value+hpMaxDifference;await this.actor.update({"system.attributes.hp.value":newHitPoints},{render:!1,allowHPOverage:!0})}}for(const rule of this.rules)await rule.preUpdate?.(changed);return super._preUpdate(changed,options,user)}_onCreate(data,options,userId){if(super._onCreate(data,options,userId),!(this.actor&&game.user.id===userId))return;this.actor.reset();const actorUpdates={};for(const rule of this.rules)rule.onCreate?.(actorUpdates);const updateKeys=Object.keys(actorUpdates);updateKeys.length>0&&!updateKeys.every(k=>k==="_id")&&this.actor.update(actorUpdates)}_onUpdate(data,options,userId){super._onUpdate(data,options,userId),game.ready&&game.items.get(this.id)===this&&ui.items.render()}_onDelete(options,userId){if(super._onDelete(options,userId),!(this.actor&&game.user.id===userId)||!(this.actor.isOfType("creature")&&this.canUserModify(game.user,"update")))return;const actorUpdates={};for(const rule of this.rules)rule.onDelete?.(actorUpdates);if(this.actor.isOfType("npc")&&["action","consumable"].includes(this.type)){const slug=this.slug??sluggify(this.name);if(this.actor.isToken){const promises=[];for(const item of this.actor.itemTypes.melee){const attackEffects=item.system.attackEffects.value;if(attackEffects.includes(slug)){const updatedEffects=attackEffects.filter(effect=>effect!==slug);promises.push(item.update({"system.attackEffects.value":updatedEffects}))}}promises.length>0&&Promise.allSettled(promises)}else{const itemUpdates=[];for(const attack of this.actor.itemTypes.melee){const attackEffects=attack.system.attackEffects.value;if(attackEffects.includes(slug)){const updatedEffects=attackEffects.filter(effect=>effect!==slug);itemUpdates.push({_id:attack.id,system:{attackEffects:{value:updatedEffects}}})}}itemUpdates.length>0&&mergeObject(actorUpdates,{items:itemUpdates})}}const updateKeys=Object.keys(actorUpdates);updateKeys.length>0&&!updateKeys.every(k=>k==="_id")&&this.actor.update(actorUpdates)}};__name2(_ItemPF2e,"ItemPF2e");let ItemPF2e=_ItemPF2e;const ItemProxyPF2e=new Proxy(ItemPF2e,{construct(_target2,args){const ItemClass=CONFIG.PF2E.Item.documentClasses[args[0]?.type]??ItemPF2e;return new ItemClass(...args)}}),DURATION_UNITS={rounds:6,minutes:60,hours:3600,days:86400};function calculateRemainingDuration(effect,durationData){if(durationData.unit==="encounter"){const isExpired=effect.system.expired;return{expired:!!isExpired,remaining:isExpired?0:1/0}}else if(durationData.unit==="unlimited"||!("start"in effect.system))return{expired:!1,remaining:1/0};const start=effect.system.start.value,{combatant}=game.combat??{},{unit,expiry}=durationData,duration=durationData.value*(DURATION_UNITS[durationData.unit]??0),addend=!combatant&&duration===0&&unit==="rounds"&&["turn-end","round-end"].includes(expiry??"")?1:0,remaining=start+duration+addend-game.time.worldTime,result={remaining,expired:remaining<=0};if(remaining===0&&combatant?.actor){const startInitiative=effect.system.start.initiative??0,currentInitiative=combatant.initiative??0,fightyActor=effect.actor?.isOfType("familiar")?effect.actor.master??effect.actor:effect.actor,atTurnStart=__name2(()=>startInitiative===currentInitiative&&combatant.actor===(effect.origin??fightyActor),"atTurnStart");result.expired=expiry==="turn-start"?atTurnStart():expiry==="turn-end"?currentInitiativestart:!1}return result}__name(calculateRemainingDuration,"calculateRemainingDuration"),__name2(calculateRemainingDuration,"calculateRemainingDuration");const _AbstractEffectPF2e=class _AbstractEffectPF2e2 extends ItemPF2e{static{__name(this,"_AbstractEffectPF2e")}get origin(){const requiresActorConstructed=!!(this.actor?._id&&this.actor.isToken),requiresCanvasReady=!!this.system.context?.origin.actor.startsWith("Scene");if(requiresActorConstructed&&!this.actor?.constructed||requiresCanvasReady&&!canvas.ready)return null;const actorOrToken=this.system.context?.origin.actor?fromUuidSync(this.system.context.origin.actor):this.actor;return actorOrToken instanceof ActorPF2e?actorOrToken:actorOrToken instanceof TokenDocumentPF2e?actorOrToken.actor:this.actor}get isIdentified(){return!0}get isLocked(){return!1}get fromSpell(){return this.system.fromSpell}get totalDuration(){const{duration}=this.system;return["unlimited","encounter"].includes(duration.unit)?1/0:duration.value*(DURATION_UNITS[duration.unit]??0)}get remainingDuration(){return calculateRemainingDuration(this,this.system.duration)}getRollOptions(prefix=this.type){const{origin}=this,originRollOptions=!!origin?.flags?.pf2e?.rollOptions?origin.getSelfRollOptions("origin").map(o=>`${prefix}:${o}`)??[]:[],{badge}=this,itemOrigin=this.grantedBy?.getRollOptions(`${prefix}:granter`)??[];return[...super.getRollOptions(prefix),...itemOrigin,...Object.entries({[`badge:type:${badge?.type}`]:!!badge,[`badge:value:${badge?.value}`]:!!badge,"from-spell":this.fromSpell}).filter(([,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`),...originRollOptions]}prepareBaseData(){super.prepareBaseData();const slug=this.slug??sluggify(this.name);this.rollOptionSlug=slug.replace(/^(?:[a-z]+-)?(?:effect|stance)-/,""),this.system.fromSpell??=!1}prepareActorData(){const actor=this.actor;if(!actor)throw ErrorPF2e("prepareActorData called from unembedded item");actor.rollOptions.all[`self:${this.type}:${this.rollOptionSlug}`]=!0;const badge=this.badge;if(typeof badge?.value=="number"){const values=actor.items.filter(i=>i instanceof _AbstractEffectPF2e2&&i.rollOptionSlug===this.rollOptionSlug).map(effect=>effect.badge?.value).filter(value=>typeof value=="number");badge.value>=Math.max(...values)&&(actor.rollOptions.all[`self:${this.type}:${this.rollOptionSlug}:${badge.value}`]=!0)}}_preCreate(data,options,user){return data.system.fromSpell??=(()=>{if((this.slug??sluggify(this.name)).startsWith("spell-effect-"))return!0;const originItem=fromUuidSync(this.system.context?.origin.item??"");return originItem instanceof ItemPF2e&&(originItem.isOfType("spell")||originItem.isOfType("affliction","condition","effect")&&originItem.fromSpell)})(),super._preCreate(data,options,user)}_onCreate(data,options,userId){super._onCreate(data,options,userId),this.handleChange({create:this})}_onDelete(options,userId){super._onDelete(options,userId),this.handleChange({delete:{name:this._source.name}})}handleChange(change){const skipFloatyText=this.isOfType("condition")&&!game.user.isGM&&!this.actor?.hasPlayerOwner&&game.settings.get("pf2e","metagame_secretCondition"),auraNotInCombat=this.flags.pf2e.aura&&!game.combat?.started,identified=game.user.isGM||this.isIdentified;if(!(skipFloatyText||!identified||auraNotInCombat)){if(this.isLocked||this.actor?.getActiveTokens().shift()?.showFloatyText(change),this.isOfType("condition"))for(const token of this.actor?.getActiveTokens()??[])token._onApplyStatusEffect(this.rollOptionSlug,!1);game.pf2e.StatusEffects.refresh()}}};__name2(_AbstractEffectPF2e,"AbstractEffectPF2e");let AbstractEffectPF2e=_AbstractEffectPF2e;const _ConditionManager=class _ConditionManager2{static{__name(this,"_ConditionManager")}static get conditionsSlugs(){return[...this.conditions.keys()].filter(k=>!k.startsWith("Compendium."))}static async initialize(force=!1){if(__privateGet(this,_initialized)||(this.conditions=new Map(this.CONDITION_SOURCES?.flatMap(source=>{const condition=new ConditionPF2e(source,{pack:"pf2e.conditionitems"});return[[condition.slug,condition],[condition.uuid,condition]]})??[]),delete this.CONDITION_SOURCES),(!__privateGet(this,_initialized)||force)&&game.i18n.lang!=="en"&&game.modules.get("babele")?.active){const localize=localizer("PF2E.condition");for(const condition of this.conditions.values())condition.name=condition._source.name=localize(`${condition.slug}.name`),condition.system.description.value=condition._source.system.description.value=localize(`${condition.slug}.rules`)}__privateSet(this,_initialized,!0)}static getCondition(slug,modifications={}){if(slug=sluggify(slug),!setHasElement(CONDITION_SLUGS,slug))return null;const condition=_ConditionManager2.conditions.get(slug)?.clone(modifications);if(!condition)throw ErrorPF2e("Unexpected failure looking up condition");return condition}static async updateConditionValue(itemId,actorOrToken,value){const actor=actorOrToken instanceof ActorPF2e?actorOrToken:actorOrToken.actor,condition=actor?.items.get(itemId);condition?.isOfType("condition")&&(value===0?await condition.delete():actor?.isOfType("creature")&&(tupleHasValue(["dying","wounded","doomed"],condition.slug)&&(value=Math.min(value,actor.attributes[condition.slug].max)),await condition.update({"system.value.value":value})))}};_initialized=new WeakMap,__name2(_ConditionManager,"ConditionManager"),__privateAdd(_ConditionManager,_initialized,!1),__publicField(_ConditionManager,"conditions",new Map),__publicField(_ConditionManager,"CONDITION_SOURCES",[{_id:"1wQY3JYyhMYeeV2G",img:"systems/pf2e/icons/conditions/observed.webp",name:"Observed",system:{description:{value:"

Anything in plain view is observed by you. If a creature takes measures to avoid detection, such as by using Stealth to @UUID[Compendium.pf2e.actionspf2e.Item.XMcnh4cSI32tljXa]{Hide}, it can become @UUID[Compendium.pf2e.conditionitems.Item.iU0fEDdBp3rXpTMC]{Hidden} or @UUID[Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf]{Undetected} instead of observed. If you have another precise sense instead of or in addition to sight, you might be able to observe a creature or object using that sense instead. You can observe a creature only with precise senses. When @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seeking} a creature using only imprecise senses, it remains hidden, rather than observed.

"},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"observed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G"}},effects:[]},{_id:"3uh1r86TzbQvosxv",img:"systems/pf2e/icons/conditions/doomed.webp",name:"Doomed",system:{description:{value:`

A powerful force has gripped your soul, calling you closer to death. Doomed always includes a value. The @UUID[Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1]{Dying} value at which you die is reduced by your doomed value. If your maximum dying value is reduced to 0, you instantly die. When you die, you're no longer doomed.

-

Your doomed value decreases by 1 each time you get a full night's rest.

`},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"doomed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.3uh1r86TzbQvosxv"}},effects:[]},{_id:"4D2KBtexWXa6oUMR",img:"systems/pf2e/icons/conditions/drained.webp",name:"Drained",system:{description:{value:`

When a creature successfully drains you of blood or life force, you become less healthy. Drained always includes a value. You take a status penalty equal to your drained value on Constitution-based checks, such as Fortitude saves. You also lose a number of Hit Points equal to your level (minimum 1) times the drained value, and your maximum Hit Points are reduced by the same amount. For example, if you're hit by an effect that inflicts drained 3 and you're a 3rd-level character, you lose 9 Hit Points and reduce your maximum Hit Points by 9. Losing these Hit Points doesn't count as taking damage.

-

Each time you get a full night's rest, your drained value decreases by 1. This increases your maximum Hit Points, but you don't immediately recover the lost Hit Points.

`},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"con-based",slug:"drained",type:"status",value:"-1 * @item.badge.value"},{key:"FlatModifier",selector:"hp",slug:"drained",type:"status",value:"min(-1 * @actor.level,-1) * @item.badge.value"},{key:"LoseHitPoints",reevaluateOnUpdate:!0,value:"max(1,@actor.level) * @item.badge.value"}],value:{isValued:!0,value:1},slug:"drained",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.4D2KBtexWXa6oUMR"}},effects:[]},{_id:"6dNUvdb1dhToNDj3",img:"systems/pf2e/icons/conditions/broken.webp",name:"Broken",system:{description:{value:`

Broken is a condition that affects objects. An object is broken when damage has reduced its Hit Points below its Broken Threshold. A broken object can't be used for its normal function, nor does it grant bonuses-with the exception of armor. Broken armor still grants its item bonus to AC, but it also imparts a status penalty to AC depending on its category: -1 for broken light armor, -2 for broken medium armor, or -3 for broken heavy armor.

+}`)}};__name2(_Migration723CumulativeItemBonuses,"Migration723CumulativeItemBonuses"),__publicField(_Migration723CumulativeItemBonuses,"version",.723);let Migration723CumulativeItemBonuses=_Migration723CumulativeItemBonuses;const _Migration724CraftingMaxItemLevel=class extends MigrationBase{static{__name(this,"_Migration724CraftingMaxItemLevel")}pathPattern=/^data\.crafting\.entries\.([-a-z]+)\.maxItemLevel$/i;async updateItem(source){if(source.type!=="feat")return;if(source.system.slug==="advanced-alchemy"){const rules=source.system.rules;for(const rule of rules)rule.predicate={all:["self:class:alchemist"]},rule.key==="CraftingEntry"&&(delete rule.name,rule.label="PF2E.TraitAlchemist")}else if(source.system.slug?.endsWith("-dedication")&&source.system.slug!=="alchemist-dedication"){const rules=source.system.rules.filter(r=>r.key==="CraftingEntry");for(const rule of rules){delete rule.name;const i18nKey=sluggify(source.system.slug.replace(/-dedication$/,""),{camel:"bactrian"});rule.label=`PF2E.SpecificRule.DedicationCraftingEntry.${i18nKey}`}}const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike");for(const rule of aeLikes){if(typeof rule.path!="string")continue;const selector=this.pathPattern.exec(rule.path)?.[1]??null;if(selector){const predicate=rule.predicate=mergeObject({all:[]},isObject(rule.predicate)?rule.predicate:{}),slug=sluggify(selector);predicate.all=Array.from(new Set([...predicate.all,`crafting:entry:${slug}`]))}}}};__name2(_Migration724CraftingMaxItemLevel,"Migration724CraftingMaxItemLevel"),__publicField(_Migration724CraftingMaxItemLevel,"version",.724);let Migration724CraftingMaxItemLevel=_Migration724CraftingMaxItemLevel;const _Migration725QuickClimbREs=class extends MigrationBase{static{__name(this,"_Migration725QuickClimbREs")}quickClimb=[{key:"BaseSpeed",predicate:{all:["self:skill:ath:rank:4"]},selector:"climb",value:"@actor.attributes.speed.value"},{key:"Note",predicate:{all:["action:climb"]},selector:"athletics",text:'

{item|name} You move 5 more feet on a success, and 10 more feet on a critical success.

'}];async updateItem(source){source.type==="feat"&&source.system.slug==="quick-climb"&&(source.system.rules=deepClone(this.quickClimb))}};__name2(_Migration725QuickClimbREs,"Migration725QuickClimbREs"),__publicField(_Migration725QuickClimbREs,"version",.725);let Migration725QuickClimbREs=_Migration725QuickClimbREs;const _Migration726JournalSetting=class extends MigrationBase{static{__name(this,"_Migration726JournalSetting")}async migrate(){const sheetClasses=game.settings.get("core","sheetClasses");if(isObject(sheetClasses)&&sheetClasses.JournalEntry?.base)return;const theme=game.settings.storage.get("world").getItem("pf2e.journalEntryTheme");if(!theme)return;const base=theme==="pf2eTheme"?"pf2e.JournalSheetStyledPF2e":"pf2e.JournalSheetPF2e";DocumentSheetConfig.updateDefaultSheets({JournalEntry:{base}})}};__name2(_Migration726JournalSetting,"Migration726JournalSetting"),__publicField(_Migration726JournalSetting,"version",.726);let Migration726JournalSetting=_Migration726JournalSetting;const _Migration727TrimSelfRollOptions=class extends MigrationBase{static{__name(this,"_Migration727TrimSelfRollOptions")}optionPattern=/^self:(ability|class|feat(?:ure)?|perception|skill):/;optionReplacement="$1:";trimRollOption(option){return option.replace(this.optionPattern,this.optionReplacement)}trimPredicates(obj){for(const[key,value]of Object.entries(obj))typeof value=="string"?obj[key]=this.trimRollOption(value):Array.isArray(value)?obj[key]=value.map(e=>typeof e=="string"?this.trimRollOption(e):isObject(e)?this.trimPredicates(e):e):isObject(value)&&(obj[key]=this.trimPredicates(value));return obj}async updateItem(source){source.system.rules=source.system.rules.map(r=>this.trimPredicates(r))}};__name2(_Migration727TrimSelfRollOptions,"Migration727TrimSelfRollOptions"),__publicField(_Migration727TrimSelfRollOptions,"version",.727);let Migration727TrimSelfRollOptions=_Migration727TrimSelfRollOptions;const _Migration728FlattenPhysicalProperties=class extends MigrationBase{static{__name(this,"_Migration728FlattenPhysicalProperties")}booleanKeys=["temporary","collapsed"];numericKeys=["quantity","hardness"];stringKeys=["stackGroup","containerId"];async updateItem(source){if(!isPhysicalData(source))return;const systemSource=source.system;if(systemSource.currency&&(delete systemSource.currency,systemSource["-=currency"]=null),systemSource.hands&&(delete systemSource.hands,systemSource["-=hands"]=null),systemSource.equipped&&systemSource.invested instanceof Object){const value=systemSource.invested.value;if(typeof value=="boolean"||value===null){const shouldBeBoolean=source.system.traits.value.includes("invested")||source.type==="armor"&&(source.system.potencyRune.value??0)>0;systemSource.equipped.invested=shouldBeBoolean?!!value:null}}if(delete systemSource.invested,systemSource["-=invested"]=null,systemSource.capacity&&source.type!=="book"&&(delete systemSource.capacity,systemSource["-=capacity"]=null),source.type!=="backpack"&&(delete systemSource.bulkCapacity,systemSource["-=bulkCapacity"]=null,delete systemSource.collapsed,systemSource["-=collapsed"]=null),systemSource.size instanceof Object){const size=SIZES.includes(systemSource.size.value)?systemSource.size.value:"med";systemSource.size=size}"brokenThreshold"in systemSource&&(systemSource.brokenThreshold instanceof Object&&(systemSource.hp.brokenThreshold=Number(systemSource.brokenThreshold.value)),delete systemSource.brokenThreshold,systemSource["-=brokenThreshold"]=null),systemSource.hp.value=Number(systemSource.hp.value),systemSource.maxHp instanceof Object&&(systemSource.hp.max=Number(systemSource.maxHp.value)||0,delete systemSource.maxHp,systemSource["-=maxHp"]=null);for(const key of this.booleanKeys){const value=systemSource[key];value instanceof Object&&(systemSource[key]=value.value)}for(const key of this.numericKeys){const value=systemSource[key];value instanceof Object&&(systemSource[key]=Number(value.value)||0)}for(const key of this.stringKeys){const value=systemSource[key];value instanceof Object&&(systemSource[key]=String(value.value)||null)}}};__name2(_Migration728FlattenPhysicalProperties,"Migration728FlattenPhysicalProperties"),__publicField(_Migration728FlattenPhysicalProperties,"version",.728);let Migration728FlattenPhysicalProperties=_Migration728FlattenPhysicalProperties;const _Migration729CumulativeItemBonusCleanup=class extends MigrationBase{static{__name(this,"_Migration729CumulativeItemBonusCleanup")}constructor(){super(...arguments),__privateAdd(this,_explorersClothingVariants,new Set(["clothing-explorers","robe-of-the-arch-magi","robe-of-the-arch-magi-greater","sarkorian-god-caller-garb"]))}isExplorersClothing(source){return source.type==="armor"&&__privateGet(this,_explorersClothingVariants).has(source.system.slug??"")}isStanceEffectOrAnimalSkinFeat(source){return source.type==="effect"&&source.system.slug==="stance-mountain-stance"||source.type==="feat"&&source.system.slug==="animal-skin"}async updateItem(source){if(this.isExplorersClothing(source))source.system.category="unarmored",source.system.group="cloth",source.system.baseItem="explorers-clothing",source.system.traits.value.includes("comfort")||source.system.traits.value.push("comfort");else if(this.isStanceEffectOrAnimalSkinFeat(source)){const rule=source.system.rules.find(r=>r.key==="AdjustModifier"&&r.slug==="clothing-explorers");rule&&(rule.slug="explorers-clothing")}else if(source.type==="equipment"){const isBracers=!!source.system.slug?.startsWith("bracers-of-armor-");for(const rule of source.system.rules)rule.key==="FlatModifier"&&rule.slug==="bracers-of-armor"&&!isBracers&&(source.system.slug==="metuaks-pendant"?rule.slug="metuaks-pendant":delete rule.slug)}}};_explorersClothingVariants=new WeakMap,__name2(_Migration729CumulativeItemBonusCleanup,"Migration729CumulativeItemBonusCleanup"),__publicField(_Migration729CumulativeItemBonusCleanup,"version",.729);let Migration729CumulativeItemBonusCleanup=_Migration729CumulativeItemBonusCleanup;const _Migration730DeruneHandwraps=class extends MigrationBase{static{__name(this,"_Migration730DeruneHandwraps")}async updateItem(source){if(source.type==="weapon"&&source.system.slug==="handwraps-of-mighty-blows"){const{rules}=source.system;for(const rule of[...rules])["Striking","WeaponPotency"].includes(String(rule.key))&&source.system.rules.splice(rules.indexOf(rule),1)}}};__name2(_Migration730DeruneHandwraps,"Migration730DeruneHandwraps"),__publicField(_Migration730DeruneHandwraps,"version",.73);let Migration730DeruneHandwraps=_Migration730DeruneHandwraps;const _Migration731TogglePropertyToRollOption=class extends Migration727TrimSelfRollOptions{static{__name(this,"_Migration731TogglePropertyToRollOption")}constructor(){super(...arguments),__publicField(this,"optionPattern",/^target:flatFooted$/),__publicField(this,"optionReplacement","target:condition:flat-footed"),__privateAdd(this,_pathPattern,/^flags\.pf2e\.rollOptions\.([^.]+)\.([^.]+)$/)}async updateItem(source){source.system.rules=source.system.rules.map(r=>this.trimPredicates(r));const rules=source.system.rules;for(const rule of[...rules]){if(rule.key!=="ToggleProperty")continue;const match=__privateGet(this,_pathPattern).exec(rule.property?.trim()??"");if(!(match?.length===3&&match[1].length>=2&&match[2].length>=1)){rules.splice(rules.indexOf(rule),1);continue}rule.key="RollOption",rule.domain=match[1],rule.option=match[2],rule.toggleable=!0,delete rule.property,typeof rule.default=="boolean"&&(rule.value=rule.default,delete rule.default),sluggify(String(rule.label??""))===source.system.slug&&delete rule.label}}async updateActor(source){source.flags.pf2e?.rollOptions?.all&&(source.flags.pf2e.rollOptions.all["-=panache"]=!1,source.flags.pf2e.rollOptions.all["-=rage"]=!1,source.flags.pf2e.rollOptions.all["-=target:flatFooted"]=!1)}};_pathPattern=new WeakMap,__name2(_Migration731TogglePropertyToRollOption,"Migration731TogglePropertyToRollOption"),__publicField(_Migration731TogglePropertyToRollOption,"version",.731);let Migration731TogglePropertyToRollOption=_Migration731TogglePropertyToRollOption;const _Migration732FixDedicationFeatTypes=class extends MigrationBase{static{__name(this,"_Migration732FixDedicationFeatTypes")}constructor(){super(...arguments),__privateAdd(this,_hasWellFormedFeatType)}async updateItem(source){if(source.type==="feat"){const system=source.system;if(!__privateMethod(this,_hasWellFormedFeatType,hasWellFormedFeatType_fn).call(this,system))system.featType={value:"bonus"};else{const{featType}=system;(featType.value==="dedication"||featType.value==="class"&&source.system.slug?.endsWith("-dedication"))&&(featType.value="archetype")}}}};_hasWellFormedFeatType=new WeakSet,hasWellFormedFeatType_fn=__name2(function(system){return"featType"in system&&isObject(system.featType)&&"value"in system.featType&&typeof system.featType=="string"},"#hasWellFormedFeatType"),__name2(_Migration732FixDedicationFeatTypes,"Migration732FixDedicationFeatTypes"),__publicField(_Migration732FixDedicationFeatTypes,"version",.732);let Migration732FixDedicationFeatTypes=_Migration732FixDedicationFeatTypes;const _Migration733ItemBonusFromEquipment=class extends MigrationBase{static{__name(this,"_Migration733ItemBonusFromEquipment")}slugs=new Set(["animal-skin","stance-mountain-stance","spell-effect-mage-armor"]);async updateItem(source){const compendiumItem=this.slugs.has(source.system.slug??""),homebrewItem=!compendiumItem&&source.type==="feat";if(!(compendiumItem||homebrewItem))return;const rules=source.system.rules;for(const rule of rules)rule.key==="FlatModifier"&&rule.type==="item"&&(rule.fromEquipment=!1)}};__name2(_Migration733ItemBonusFromEquipment,"Migration733ItemBonusFromEquipment"),__publicField(_Migration733ItemBonusFromEquipment,"version",.733);let Migration733ItemBonusFromEquipment=_Migration733ItemBonusFromEquipment;const _Migration734SpellLocationPropsAndSignature=class extends MigrationBase{static{__name(this,"_Migration734SpellLocationPropsAndSignature")}async updateActor(actor){const entries=actor.items.filter(item=>item.type==="spellcastingEntry"),spells=actor.items.filter(item=>item.type==="spell");for(const spellSource of spells){const spellData=spellSource.system,entrySource=entries.find(entry=>entry._id===spellData.location.value);if(!entrySource)continue;const entryData=entrySource.system;if(!entryData.signatureSpells)continue;entryData.signatureSpells.value.includes(spellSource._id??"")&&(spellData.location.signature=!0)}}async updateItem(source,actor){if(source.type==="spellcastingEntry"){const data=source.system;data.signatureSpells&&(delete data.signatureSpells,"game"in globalThis&&(data["-=signatureSpells"]=null))}if(source.type==="spell"){const data=source.system;(data.heightenedLevel||data.autoHeightenLevel)&&(actor&&(data.location.heightenedLevel=data.heightenedLevel?.value??void 0,data.location.autoHeightenLevel=data.autoHeightenLevel?.value??void 0),delete data.autoHeightenLevel,delete data.heightenedLevel,"game"in globalThis&&(data["-=autoHeightenLevel"]=null,data["-=heightenedLevel"]=null))}}};__name2(_Migration734SpellLocationPropsAndSignature,"Migration734SpellLocationPropsAndSignature"),__publicField(_Migration734SpellLocationPropsAndSignature,"version",.734);let Migration734SpellLocationPropsAndSignature=_Migration734SpellLocationPropsAndSignature;const _Migration735FirearmAmmoAlchemical=class extends MigrationBase{static{__name(this,"_Migration735FirearmAmmoAlchemical")}constructor(){super(...arguments),__privateAdd(this,_needsTrait)}async updateItem(source){source.type==="consumable"&&__privateMethod(this,_needsTrait,needsTrait_fn).call(this,source)&&source.system.traits.value.unshift("alchemical")}};_needsTrait=new WeakSet,needsTrait_fn=__name2(function(source){return source.system.consumableType.value==="ammo"&&!!source.system.stackGroup?.startsWith("rounds")&&source.system.slug!=="cutlery"&&!source.system.traits.value.includes("alchemical")},"#needsTrait"),__name2(_Migration735FirearmAmmoAlchemical,"Migration735FirearmAmmoAlchemical"),__publicField(_Migration735FirearmAmmoAlchemical,"version",.735);let Migration735FirearmAmmoAlchemical=_Migration735FirearmAmmoAlchemical;const _Migration736RemoveBrokenThreshold=class extends MigrationBase{static{__name(this,"_Migration736RemoveBrokenThreshold")}constructor(){super(...arguments),__privateAdd(this,_hasBrokenThreshold)}async updateItem(source){__privateMethod(this,_hasBrokenThreshold,hasBrokenThreshold_fn).call(this,source)&&(delete source.system.brokenThreshold,source.system["-=brokenThreshold"]=null)}};_hasBrokenThreshold=new WeakSet,hasBrokenThreshold_fn=__name2(function(source){return isPhysicalData(source)&&"brokenThreshold"in source.system},"#hasBrokenThreshold"),__name2(_Migration736RemoveBrokenThreshold,"Migration736RemoveBrokenThreshold"),__publicField(_Migration736RemoveBrokenThreshold,"version",.736);let Migration736RemoveBrokenThreshold=_Migration736RemoveBrokenThreshold;const _Migration737NormalizeRuleElementKeys=class extends Migration731TogglePropertyToRollOption{static{__name(this,"_Migration737NormalizeRuleElementKeys")}async updateItem(source){const rules=source.system.rules;for(const rule of[...rules]){if(!isObject(rule)||typeof rule.key!="string"){rules.splice(rules.indexOf(rule),1);continue}rule.key=rule.key.trim().replace(/^PF2E\.RuleElement\./,"")}return super.updateItem(source)}};__name2(_Migration737NormalizeRuleElementKeys,"Migration737NormalizeRuleElementKeys"),__publicField(_Migration737NormalizeRuleElementKeys,"version",.737);let Migration737NormalizeRuleElementKeys=_Migration737NormalizeRuleElementKeys;const _Migration738UpdateLaughingShadow=class extends MigrationBase{static{__name(this,"_Migration738UpdateLaughingShadow")}constructor(){super(...arguments),__privateAdd(this,_shadowPromise,fromUuid("Compendium.pf2e.classfeatures.3gVDqDPSz4fB5T9G")),__privateAdd(this,_cascadePromise,fromUuid("Compendium.pf2e.feature-effects.fsjO5oTKttsbpaKl"))}async updateActor(source){const rollOptionsAll=source.flags.pf2e?.rollOptions?.all;rollOptionsAll instanceof Object&&"feature:laughing-shadow:damage"in rollOptionsAll&&(rollOptionsAll["-=feature:laughing-shadow:damage"]=!1)}async updateItem(source){if(source.type==="feat"&&source.system.slug==="laughing-shadow"){const laughingShadow=await __privateGet(this,_shadowPromise);if(!(laughingShadow instanceof ItemPF2e))return;source.system.rules=deepClone(laughingShadow._source.system.rules)}else if(source.type==="effect"&&source.system.slug==="stance-arcane-cascade"){const arcaneCascade=await __privateGet(this,_cascadePromise);if(!(arcaneCascade instanceof ItemPF2e))return;const newRules=deepClone(arcaneCascade._source.system.rules),withSelection=source.system.rules.find(r=>r.key==="ChoiceSet"&&typeof r.selection=="string");if(withSelection){const unselected=newRules.find(r=>r.key==="ChoiceSet");unselected&&(unselected.selection=withSelection.selection)}source.system.rules=newRules}}};_shadowPromise=new WeakMap,_cascadePromise=new WeakMap,__name2(_Migration738UpdateLaughingShadow,"Migration738UpdateLaughingShadow"),__publicField(_Migration738UpdateLaughingShadow,"version",.738);let Migration738UpdateLaughingShadow=_Migration738UpdateLaughingShadow;const _Migration739RecoveryCheckDC=class extends MigrationBase{static{__name(this,"_Migration739RecoveryCheckDC")}toughness=[{key:"FlatModifier",selector:"hp",value:"@actor.level"},{key:"ActiveEffectLike",mode:"downgrade",path:"system.attributes.dying.recoveryDC",value:9}];defyDeath=[{key:"ActiveEffectLike",mode:"downgrade",predicate:{not:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:9},{key:"ActiveEffectLike",mode:"downgrade",predicate:{all:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:8}];mountainsStoutness=[{key:"FlatModifier",selector:"hp",type:"untyped",value:"@actor.level"},{key:"ActiveEffectLike",mode:"downgrade",predicate:{not:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:9},{key:"ActiveEffectLike",mode:"downgrade",predicate:{all:["feat:toughness"]},path:"system.attributes.dying.recoveryDC",value:6}];async updateItem(source){if(source.type!=="feat")return;if(source.system.slug==="toughness"){source.system.rules=this.toughness;return}else if(source.system.slug==="defy-death"){source.system.rules=this.defyDeath;return}else if(source.system.slug==="mountains-stoutness"){source.system.rules=this.mountainsStoutness;return}const{rules}=source.system;for(const rule of[...rules])rule.key==="RecoveryCheckDC"&&source.system.rules.splice(rules.indexOf(rule),1)}};__name2(_Migration739RecoveryCheckDC,"Migration739RecoveryCheckDC"),__publicField(_Migration739RecoveryCheckDC,"version",.739);let Migration739RecoveryCheckDC=_Migration739RecoveryCheckDC;const _Migration740MaxTakable=class extends MigrationBase{static{__name(this,"_Migration740MaxTakable")}async updateItem(source){if(source.type!=="feat")return;const systemData=source.system;"maxTaken"in systemData&&(typeof systemData.maxTaken=="number"&&typeof systemData.maxTakable!="number"&&(systemData.maxTakable=systemData.maxTaken),delete systemData.maxTaken,systemData["-=maxTaken"]=null),"maxTakable"in systemData&&typeof systemData.maxTakable!="number"&&(systemData.maxTakable=null)}};__name2(_Migration740MaxTakable,"Migration740MaxTakable"),__publicField(_Migration740MaxTakable,"version",.74);let Migration740MaxTakable=_Migration740MaxTakable;const _Migration741RollOptionToggleToItem=class extends MigrationBase{static{__name(this,"_Migration741RollOptionToggleToItem")}async updateActor(source){if(!(source.flags.pf2e?.rollOptions instanceof Object))return;const rules=source.items.flatMap(i=>i.system.rules).filter(r=>!!r.toggleable&&r.key==="RollOption"&&typeof r.domain=="string"&&r.domain.length>0&&typeof r.option=="string"&&r.option.length>0),{rollOptions}=source.flags.pf2e;for(const rule of rules){const domain=rollOptions[rule.domain];domain instanceof Object&&rule.option in domain&&(domain[`-=${rule.option}`]=!1,rule.value=!!domain[rule.option])}}};__name2(_Migration741RollOptionToggleToItem,"Migration741RollOptionToggleToItem"),__publicField(_Migration741RollOptionToggleToItem,"version",.741);let Migration741RollOptionToggleToItem=_Migration741RollOptionToggleToItem;const _Migration742RMAbilityBoostLevels=class extends MigrationBase{static{__name(this,"_Migration742RMAbilityBoostLevels")}async updateItem(source){if(source.type!=="class")return;const systemData=source.system;"abilityBoostLevels"in source.system&&(delete systemData.abilityBoostLevels,systemData["-=abilityBoostLevels"]=null)}};__name2(_Migration742RMAbilityBoostLevels,"Migration742RMAbilityBoostLevels"),__publicField(_Migration742RMAbilityBoostLevels,"version",.742);let Migration742RMAbilityBoostLevels=_Migration742RMAbilityBoostLevels;const _Migration743FixWeaknessStructure=class extends MigrationBase{static{__name(this,"_Migration743FixWeaknessStructure")}async updateActor(source){if(source.type!=="character"&&source.type!=="npc")return;const traits=source.system.traits;Array.isArray(traits.dv)||(traits.dv=[]),Array.isArray(traits.dr)||(traits.dr=[])}};__name2(_Migration743FixWeaknessStructure,"Migration743FixWeaknessStructure"),__publicField(_Migration743FixWeaknessStructure,"version",.743);let Migration743FixWeaknessStructure=_Migration743FixWeaknessStructure;const _Migration744MigrateSpellHeighten=class extends MigrationBase{static{__name(this,"_Migration744MigrateSpellHeighten")}async updateItem(source){if(source.type!=="spell")return;const system=source.system;system.scaling&&(system.heightening={type:"interval",interval:system.scaling.interval,damage:system.scaling.damage},delete system.scaling,system["-=scaling"]=null)}};__name2(_Migration744MigrateSpellHeighten,"Migration744MigrateSpellHeighten"),__publicField(_Migration744MigrateSpellHeighten,"version",.744);let Migration744MigrateSpellHeighten=_Migration744MigrateSpellHeighten;const _Migration745EffectTargetToChoiceSet=class extends MigrationBase{static{__name(this,"_Migration745EffectTargetToChoiceSet")}constructor(){super(...arguments),__privateAdd(this,_isEffectTargetRE),__privateAdd(this,_toChoiceSet)}async updateItem(source,actorSource){const{rules}=source.system;for(const rule of rules)if(__privateMethod(this,_isEffectTargetRE,isEffectTargetRE_fn).call(this,rule)){rules[rules.indexOf(rule)]=__privateMethod(this,_toChoiceSet,toChoiceSet_fn).call(this,rule,source,actorSource??null);const otherRules=rules.filter(r=>typeof r.selector=="string"&&/item\|data\.target/.test(r.selector));for(const other of otherRules){const flag=sluggify(source.system.slug??source.name,{camel:"dromedary"});other.selector=other.selector.replace(/\bdata\.target\b/,`flags.pf2e.rulesSelections.${flag}`)}}}};_isEffectTargetRE=new WeakSet,isEffectTargetRE_fn=__name2(function(rule){return rule.key==="EffectTarget"},"#isEffectTargetRE"),_toChoiceSet=new WeakSet,toChoiceSet_fn=__name2(function(rule,itemSource,actorSource){const newRE={key:"ChoiceSet",choices:{ownedItems:!0,types:["weapon"]},prompt:"PF2E.SpecificRule.Prompt.Weapon"};if(typeof rule.targetId=="string"&&actorSource){const weapon=actorSource.items.find(i=>i.type==="weapon"&&i._id===rule.targetId);weapon&&(newRE.selection=weapon.system.slug??sluggify(weapon.name))}return itemSource.system.slug?.includes("blade-ally")?newRE.choices.includeHandwraps=!0:itemSource.system.slug?.includes("weapon-surge")?newRE.choices.predicate={all:["item:equipped"]}:itemSource.system.slug==="shillelagh"?(newRE.adjustName=!1,newRE.prompt="PF2E.SpecificRule.Prompt.Shillelagh",newRE.choices.predicate={all:["item:equipped"],any:["item:base:club","item:base:staff"]}):isObject(rule.predicate)&&(newRE.choices.predicate=deepClone(rule.predicate)),newRE},"#toChoiceSet"),__name2(_Migration745EffectTargetToChoiceSet,"Migration745EffectTargetToChoiceSet"),__publicField(_Migration745EffectTargetToChoiceSet,"version",.745);let Migration745EffectTargetToChoiceSet=_Migration745EffectTargetToChoiceSet;const _Migration746StandardizePricing=class extends MigrationBase{static{__name(this,"_Migration746StandardizePricing")}async updateItem(item){if(!(!isPhysicalData(item)&&item.type!=="kit"))if(isObject(item.system.price)||(item.system.price={value:CoinsPF2e.fromString(String(item.system.price)).toObject()}),item.type==="treasure"){const systemData=item.system;if(systemData.denomination||systemData.value){const value=systemData.value?.value??0,denomination=systemData.denomination?.value??"gp";systemData.price={value:{[denomination]:value}},systemData["-=denomination"]=null,delete systemData.denomination,systemData["-=value"]=null,delete systemData.value}}else isObject(item.system.price.value)||(item.system.price.value=CoinsPF2e.fromString(String(item.system.price.value)).toObject())}};__name2(_Migration746StandardizePricing,"Migration746StandardizePricing"),__publicField(_Migration746StandardizePricing,"version",.746);let Migration746StandardizePricing=_Migration746StandardizePricing;const _Migration747FixedHeightening=class extends MigrationBase{static{__name(this,"_Migration747FixedHeightening")}constructor(){super(...arguments),__privateAdd(this,_loadedSpells,void 0),__publicField(this,"fixedHeightenSpells",new Set(["Compendium.pf2e.spells-srd.0fKHBh5goe2eiFYL","Compendium.pf2e.spells-srd.10VcmSYNBrvBphu1","Compendium.pf2e.spells-srd.2gQYrCPwBmwau26O","Compendium.pf2e.spells-srd.2iQKhCQBijhj5Rf3","Compendium.pf2e.spells-srd.4koZzrnMXhhosn0D","Compendium.pf2e.spells-srd.5WM3WjshXgrkVCg6","Compendium.pf2e.spells-srd.7CUgqHunmHfW2lC5","Compendium.pf2e.spells-srd.7OFKYR1VY6EXDuiR","Compendium.pf2e.spells-srd.9s5tqqXNzcoKamWx","Compendium.pf2e.spells-srd.BCuHKrDeJ4eq53M6","Compendium.pf2e.spells-srd.CxpFy4HJHf4ACbxF","Compendium.pf2e.spells-srd.D2nPKbIS67m9199U","Compendium.pf2e.spells-srd.DCQHaLrYXMI37dvW","Compendium.pf2e.spells-srd.DgcSiOCR1uDXGaEA","Compendium.pf2e.spells-srd.EfFMLVbmkBWmzoLF","Compendium.pf2e.spells-srd.Et8RSCLx8w7uOLvo","Compendium.pf2e.spells-srd.F23T5tHPo3WsFiHW","Compendium.pf2e.spells-srd.FhOaQDTSnsY7tiam","Compendium.pf2e.spells-srd.Fr58LDSrbndgld9n","Compendium.pf2e.spells-srd.GaRQlC9Yw1BGKHfN","Compendium.pf2e.spells-srd.HGmBY8KjgLV97nUp","Compendium.pf2e.spells-srd.HHGUBGle4OjoxvNR","Compendium.pf2e.spells-srd.HTou8cG05yuSkesj","Compendium.pf2e.spells-srd.HWrNMQENi9WSGbnF","Compendium.pf2e.spells-srd.HcIAQZjNXHemoXSU","Compendium.pf2e.spells-srd.Ifc2b6bNVdjKV7Si","Compendium.pf2e.spells-srd.JHntYF0SbaWKq7wR","Compendium.pf2e.spells-srd.LQzlKbYjZSMFQawP","Compendium.pf2e.spells-srd.LiGbewa9pO0yjbsY","Compendium.pf2e.spells-srd.Llx0xKvtu8S4z6TI","Compendium.pf2e.spells-srd.Mkbq9xlAUxHUHyR2","Compendium.pf2e.spells-srd.OAt2ZEns1gIOCgrn","Compendium.pf2e.spells-srd.OhD2Z6rIGGD5ocZA","Compendium.pf2e.spells-srd.PRrZ7anETWPm90YY","Compendium.pf2e.spells-srd.PjhUmyKnq6K5uDby","Compendium.pf2e.spells-srd.Popa5umI3H33levx","Compendium.pf2e.spells-srd.Pwq6T7xpfAJXV5aj","Compendium.pf2e.spells-srd.Q7QQ91vQtyi1Ux36","Compendium.pf2e.spells-srd.Seaah9amXg70RKw2","Compendium.pf2e.spells-srd.U58aQWJ47VrI36yP","Compendium.pf2e.spells-srd.UmXhuKrYZR3W16mQ","Compendium.pf2e.spells-srd.VTb0yI6P1bLkzuRr","Compendium.pf2e.spells-srd.VlNcjmYyu95vOUe8","Compendium.pf2e.spells-srd.W02bHXylIpoXbO4e","Compendium.pf2e.spells-srd.WsUwpfmhKrKwoIe3","Compendium.pf2e.spells-srd.Wt94cw03L77sbud7","Compendium.pf2e.spells-srd.XhgMx9WC6NfXd9RP","Compendium.pf2e.spells-srd.ZAX0OOcKtYMQlquR","Compendium.pf2e.spells-srd.ZqmP9gijBmK7y8Xy","Compendium.pf2e.spells-srd.aIHY2DArKFweIrpf","Compendium.pf2e.spells-srd.atlgGNI1E1Ox3O3a","Compendium.pf2e.spells-srd.bay4AfSu2iIozNNW","Compendium.pf2e.spells-srd.czO0wbT1i320gcu9","Compendium.pf2e.spells-srd.dINQzhqGmIsqGMUY","Compendium.pf2e.spells-srd.drmvQJETA3WZzXyw","Compendium.pf2e.spells-srd.e36Z2t6tLdW3RUzZ","Compendium.pf2e.spells-srd.fprqWKUc0jnMIyGU","Compendium.pf2e.spells-srd.gISYsBFby1TiXfBt","Compendium.pf2e.spells-srd.ivKnEtI1z4UqEKIA","Compendium.pf2e.spells-srd.kuoYff1csM5eAcAP","Compendium.pf2e.spells-srd.lbrWMnS2pecKaSVB","Compendium.pf2e.spells-srd.lsR3RLEdBG4rcSzd","Compendium.pf2e.spells-srd.nXmC2Xx9WmS5NsAo","Compendium.pf2e.spells-srd.o6YCGx4lycsYpww4","Compendium.pf2e.spells-srd.pZTqGY1MLRjgKasV","Compendium.pf2e.spells-srd.pt3gEnzA159uHcJC","Compendium.pf2e.spells-srd.pwzdSlJgYqN7bs2w","Compendium.pf2e.spells-srd.q5qmNn144ZJGxnvJ","Compendium.pf2e.spells-srd.qTr2oCgIXl703Whb","Compendium.pf2e.spells-srd.qwlh6aDgi86U3Q7H","Compendium.pf2e.spells-srd.r4HLQcYwB62bTayl","Compendium.pf2e.spells-srd.sFwoKj0TsacsmoWj","Compendium.pf2e.spells-srd.vLA0q0WOK2YPuJs6","Compendium.pf2e.spells-srd.vLzFcIaSXs7YTIqJ","Compendium.pf2e.spells-srd.vTQvfYu2llKQedmY","Compendium.pf2e.spells-srd.vctIUOOgSmxAF0KG","Compendium.pf2e.spells-srd.wzctak6BxOW8xvFV","Compendium.pf2e.spells-srd.x5rGOmhDRDVQPrnW","Compendium.pf2e.spells-srd.x7SPrsRxGb2Vy2nu","Compendium.pf2e.spells-srd.x9RIFhquazom4p02","Compendium.pf2e.spells-srd.xRgU9rrhmGAgG4Rc","Compendium.pf2e.spells-srd.yH13KXUK2x093NUv","Compendium.pf2e.spells-srd.yM3KTTSAIHhyuP14","Compendium.pf2e.spells-srd.zlnXpME1T2uvn8Lr","Compendium.pf2e.spells-srd.zul5cBTfr7NXHBZf"]))}async updateItem(item){if(item.type!=="spell")return;const isAcidSplash=(item.system.slug??sluggify(item.name))==="acid-splash";if(item.system.heightening?.type==="fixed"&&!isAcidSplash)return;const sourceId=item.flags.core?.sourceId;if(sourceId&&this.fixedHeightenSpells.has(sourceId)){const spell=(await this.loadSpells())[sourceId];spell&&spell.system.heightening?.type==="fixed"&&(item.system.heightening=spell.system.heightening,this.overwriteDamage(item,spell))}}overwriteDamage(spell,newSpell){const newDamage=newSpell.system.damage,newKeys=new Set(Object.keys(newDamage.value)),diff=Object.keys(spell.system.damage.value).filter(key=>!newKeys.has(key)),damage=spell.system.damage;damage.value=newDamage.value;for(const deleteKey of diff)damage.value[`-=${deleteKey}`]=null}async loadSpells(){if(__privateGet(this,_loadedSpells))return __privateGet(this,_loadedSpells);const spells=await UUIDUtils.fromUUIDs([...this.fixedHeightenSpells]);return __privateSet(this,_loadedSpells,spells.reduce((record,spell)=>({...record,[spell.uuid]:spell}),{})),__privateGet(this,_loadedSpells)}};_loadedSpells=new WeakMap,__name2(_Migration747FixedHeightening,"Migration747FixedHeightening"),__publicField(_Migration747FixedHeightening,"version",.747);let Migration747FixedHeightening=_Migration747FixedHeightening;const _Migration748BatchConsumablePricing=class extends MigrationBase{static{__name(this,"_Migration748BatchConsumablePricing")}async updateItem(item){if(!isPhysicalData(item))return;const slug=item.system.slug??sluggify(item.name);batched_5.has(slug)&&(item.system.price.per=5),batched_10.has(slug)&&(item.system.price.per=10)}};__name2(_Migration748BatchConsumablePricing,"Migration748BatchConsumablePricing"),__publicField(_Migration748BatchConsumablePricing,"version",.748);let Migration748BatchConsumablePricing=_Migration748BatchConsumablePricing;const batched_5=new Set(["rounds-harmona-gun","rounds-dwarven-scattergun","rounds-flingflenser","rounds-explosive-dogslicer"]),batched_10=new Set(["rounds-three-peaked-tree","rounds-dragon-mouth-pistol","rounds-pepperbox","rounds-fire-lance","rounds-flintlock-pistol","rounds-clan-pistol","bolts","rounds-hand-cannon","sun-shot","rounds-dagger-pistol","rounds-dueling-pistol","rounds-flintlock-musket","rounds-hammer-gun","rounds-black-powder-knuckle-dusters","rounds-slide-pistol","sling-bullets","rounds-double-barreled-musket","rounds-mace-multipistol","rounds-gnome-amalgam-musket","cutlery","rounds-axe-musket","rounds-mithral-tree","wooden-taws","rounds-gun-sword","rounds-blunderbuss","rounds-jezail","rounds-double-barreled-pistol","rounds-arquebus","rounds-cane-pistol","rounds-rapier-pistol","rounds-coat-pistol","rounds-piercing-wind","blowgun-darts","arrows","light-writer-plates","practice-target"]),_Migration749AssuranceREs=class extends MigrationBase{static{__name(this,"_Migration749AssuranceREs")}constructor(){super(...arguments),__privateAdd(this,_isChoiceSetWithSelection),__privateAdd(this,_newRules)}async updateItem(source){const{slug,rules}=source.system;if(!(source.type==="feat"&&slug?.startsWith("assurance")))return;const firstRule=rules.at(0);if(slug==="assurance"&&firstRule&&rules.length===1&&__privateMethod(this,_isChoiceSetWithSelection,isChoiceSetWithSelection_fn).call(this,firstRule))firstRule.flag="assurance",rules.push(...__privateMethod(this,_newRules,newRules_fn).call(this,"choice"));else if(rules.length===0){const skill=/^assurance-([a-z]+)$/.exec(slug)?.at(1);setHasElement(SKILL_LONG_FORMS,skill)&&rules.push(...__privateMethod(this,_newRules,newRules_fn).call(this,skill))}}};_isChoiceSetWithSelection=new WeakSet,isChoiceSetWithSelection_fn=__name2(function(rule){return rule.key==="ChoiceSet"},"#isChoiceSetWithSelection"),_newRules=new WeakSet,newRules_fn=__name2(function(skill){const selector=skill==="choice"?"{item|flags.pf2e.rulesSelections.assurance}":skill;return[{key:"SubstituteRoll",label:"PF2E.SpecificRule.SubstituteRoll.Assurance",selector,slug:"assurance",value:10},{key:"AdjustModifier",predicate:{all:["substitute:assurance"],not:["bonus:type:proficiency"]},selector,suppress:!0}]},"#newRules"),__name2(_Migration749AssuranceREs,"Migration749AssuranceREs"),__publicField(_Migration749AssuranceREs,"version",.749);let Migration749AssuranceREs=_Migration749AssuranceREs;const _Migration750FixCorruptedPrice=class extends MigrationBase{static{__name(this,"_Migration750FixCorruptedPrice")}async updateItem(item){!isPhysicalData(item)&&item.type!=="kit"||typeof item.system.price=="string"&&(item.system.price={value:CoinsPF2e.fromString(item.system.price).toObject()})}};__name2(_Migration750FixCorruptedPrice,"Migration750FixCorruptedPrice"),__publicField(_Migration750FixCorruptedPrice,"version",.75);let Migration750FixCorruptedPrice=_Migration750FixCorruptedPrice;const _Migration751ResetRollOptions=class extends MigrationBase{static{__name(this,"_Migration751ResetRollOptions")}async updateActor(source){isObject(source.flags.pf2e)&&"rollOptions"in source.flags.pf2e&&(source.flags.pf2e["-=rollOptions"]=null)}};__name2(_Migration751ResetRollOptions,"Migration751ResetRollOptions"),__publicField(_Migration751ResetRollOptions,"version",.751);let Migration751ResetRollOptions=_Migration751ResetRollOptions;const _Migration752StrikeVsWeaponTraits=class extends MigrationBase{static{__name(this,"_Migration752StrikeVsWeaponTraits")}constructor(){super(...arguments),__privateAdd(this,_toSkip,new Set(["ghost-hunter","stance-arcane-cascade","spirit-strikes"]))}async updateItem(source){if(__privateGet(this,_toSkip).has(source.system.slug??""))return;const rules=source.system.rules.filter(r=>r.key==="AdjustStrike"&&r.property==="traits");for(const rule of rules)objectHasKey(weaponTraits,rule.value)&&(rule.property="weapon-traits")}};_toSkip=new WeakMap,__name2(_Migration752StrikeVsWeaponTraits,"Migration752StrikeVsWeaponTraits"),__publicField(_Migration752StrikeVsWeaponTraits,"version",.752);let Migration752StrikeVsWeaponTraits=_Migration752StrikeVsWeaponTraits;const _Migration753WeaponReloadTimes=class extends MigrationBase{static{__name(this,"_Migration753WeaponReloadTimes")}constructor(){super(...arguments),__privateAdd(this,_hasThrownTrait)}async updateItem(source){if(source.type!=="weapon")return;const slug=source.system.slug??"";["backpack-catapult","backpack-catapult"].includes(slug)?source.system.reload.value="10":(source.system.baseItem==="alchemical-bomb"||__privateMethod(this,_hasThrownTrait,hasThrownTrait_fn).call(this,source))&&(source.system.reload.value="-")}};_hasThrownTrait=new WeakSet,hasThrownTrait_fn=__name2(function(source){return source.system.traits.value.some(t=>t.startsWith("thrown"))},"#hasThrownTrait"),__name2(_Migration753WeaponReloadTimes,"Migration753WeaponReloadTimes"),__publicField(_Migration753WeaponReloadTimes,"version",.753);let Migration753WeaponReloadTimes=_Migration753WeaponReloadTimes;const _Migration754MightyBulwarkAdjustModifiers=class extends MigrationBase{static{__name(this,"_Migration754MightyBulwarkAdjustModifiers")}async updateItem(source){if(!(source.type==="feat"&&source.system.slug==="mighty-bulwark"))return;const newRules=[{key:"FlatModifier",predicate:{all:["self:armor:trait:bulwark"]},selector:"reflex",type:"untyped",value:4},{key:"AdjustModifier",predicate:{all:["self:armor:trait:bulwark"]},selector:"reflex",slug:"dex",suppress:!0},{key:"AdjustModifier",selector:"reflex",slug:"bulwark",suppress:!0}];source.system.rules=newRules}};__name2(_Migration754MightyBulwarkAdjustModifiers,"Migration754MightyBulwarkAdjustModifiers"),__publicField(_Migration754MightyBulwarkAdjustModifiers,"version",.754);let Migration754MightyBulwarkAdjustModifiers=_Migration754MightyBulwarkAdjustModifiers;const _Migration755GrantIdsToData=class extends MigrationBase{static{__name(this,"_Migration755GrantIdsToData")}async updateActor(source){for(const item of source.items){if(!item.flags.pf2e)continue;const systemFlags=item.flags.pf2e,{grantedBy,itemGrants}=systemFlags;typeof grantedBy=="string"&&(source.items.find(i=>i._id===grantedBy)?systemFlags.grantedBy={id:grantedBy}:systemFlags["-=grantedBy"]=null),Array.isArray(itemGrants)&&(systemFlags.itemGrants=itemGrants.flatMap(grant=>typeof grant=="string"?source.items.find(i=>i._id===grant)?{id:grant}:[]:grant))}}};__name2(_Migration755GrantIdsToData,"Migration755GrantIdsToData"),__publicField(_Migration755GrantIdsToData,"version",.755);let Migration755GrantIdsToData=_Migration755GrantIdsToData;const _Migration756RMStoredResourceMaxes=class extends MigrationBase{static{__name(this,"_Migration756RMStoredResourceMaxes")}async updateActor(source){source.type==="character"&&(source["system.resources.focus.-=max"]=null,source["system.resources.crafting.infusedReagents.-=max"]=null,source["system.resources.-=investiture"]=null)}};__name2(_Migration756RMStoredResourceMaxes,"Migration756RMStoredResourceMaxes"),__publicField(_Migration756RMStoredResourceMaxes,"version",.756);let Migration756RMStoredResourceMaxes=_Migration756RMStoredResourceMaxes;const _Migration757HillockHalfling=class extends MigrationBase{static{__name(this,"_Migration757HillockHalfling")}async updateItem(itemSource){if(itemSource.type!=="heritage"||(itemSource.system.slug??sluggify(itemSource.name))!=="hillock-halfling")return;const rules=itemSource.system.rules;if(!rules.some(rule=>"path"in rule&&rule.path==="system.attributes.hp.recoveryAddend")){const element={key:"ActiveEffectLike",mode:"add",path:"system.attributes.hp.recoveryAddend",value:"@actor.level"};rules.push(element)}}};__name2(_Migration757HillockHalfling,"Migration757HillockHalfling"),__publicField(_Migration757HillockHalfling,"version",.757);let Migration757HillockHalfling=_Migration757HillockHalfling;const _Migration758PrunePCAttributes=class extends MigrationBase{static{__name(this,"_Migration758PrunePCAttributes")}toDelete=["-=ac","-=ancestryhp","-=battleForm","-=classDC","-=classOrSpellDC","-=classhp","-=dexCap","-=doomed","-=dying","-=familiarAbilities","-=flanking","-=flatbonushp","-=flatbonussp","-=handsFree","-=hardness","hp.-=breakdown","hp.-=details","hp.-=max","hp.-=name","hp.-=negativeHealing","hp.-=recoveryMultiplier","hp.-=totalModifier","hp.-=tempsource","hp.-=_modifiers","initiative.-=_modifiers","initiative.-=breakdown","initiative.-=label","initiative.-=name","initiative.-=roll","initiative.-=tiebreakPriority","initiative.-=totalModifier","-=levelbonushp","-=levelbonussp","-=perception","-=polymorphed","-=reach","-=shield","speed.-=_modifiers","speed.-=breakdown","speed.-=name","speed.-=total","speed.-=totalModifier","speed.-=type","-=spellDC","-=wounded"];async updateActor(source){if(source.type==="character")for(const key of this.toDelete)source[`system.attributes.${key}`]=null}};__name2(_Migration758PrunePCAttributes,"Migration758PrunePCAttributes"),__publicField(_Migration758PrunePCAttributes,"version",.758);let Migration758PrunePCAttributes=_Migration758PrunePCAttributes;const _Migration759CritSpecRE=class extends MigrationBase{static{__name(this,"_Migration759CritSpecRE")}async updateItem(source){if(!["feat","weapon"].includes(source.type))return;const critSpecKey="CriticalSpecialization";if(!source.system.rules.some(r=>r.key===critSpecKey))switch(source.system.slug){case"archer-dedication":{source.system.rules.push({key:critSpecKey,predicate:{all:["weapon:group:bow",{gte:["weapon:proficiency:rank",2]}]}});return}case"azarketi-weapon-aptitude":{source.system.rules=[{key:critSpecKey,predicate:{any:["weapon:trait:azarketi","weapon:base:crossbow","weapon:base:hand-crossbow","weapon:base:longspear","weapon:base:spear","weapon:base:trident"]}}];return}case"brawling-focus":{source.system.rules=[{key:critSpecKey,predicate:{any:["weapon:group:brawling",{and:["feat:monastic-weaponry","weapon:trait:monk",{not:"weapon:category:unarmed"},{gte:["weapon:proficiency:rank",1]}]}]}}];return}case"brutality":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:["self:effect:rage","weapon:melee"]}});return}case"catfolk-weapon-rake":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:catfolk","weapon:base:hatchet","weapon:base:kama","weapon:base:kukri","weapon:base:scimitar","weapon:base:sickle"]}}];return}case"conrasu-weapon-understanding":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:conrasu","weapon:base:glaive","weapon:base:longspear","weapon:base:longsword","weapon:base:shortbow","weapon:base:spear"]}}];return}case"dwarven-weapon-cunning":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:dwarf","weapon:base:battle-axe","weapon:base:pick","weapon:base:warhammer"]}}];return}case"elven-weapon-elegance":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:elf","weapon:base:longbow","weapon:base:longsword","weapon:base:rapier","weapon:base:shortbow"]}}];return}case"fighter-weapon-mastery":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:[{gte:["weapon:proficiency:rank",3]}]}});return}case"genie-weapon-flourish":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:geniekin","weapon:base:falchion","weapon:base:ranseur","weapon:base:scimitar","weapon:base:trident"]}}];return}case"gnoll-weapon-practicality":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:gnoll","weapon:base:flail","weapon:base:khopesh","weapon:base:mambele","weapon:base:spear","weapon:base:war-flail"]}}];return}case"gnome-weapon-innovator":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:gnome","weapon:base:glaive","weapon:base:kukri"]}}];return}case"goblin-weapon-frenzy":{source.system.rules=[{key:"CriticalSpecialization",predicate:{all:["weapon:trait:goblin"]}}];return}case"grippli-weapon-innovator":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:grippli","weapon:base:blowgun","weapon:base:hatchet","weapon:base:scythe","weapon:base:shortbow"]}}];return}case"gunslinger-weapon-mastery":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{any:["weapon:group:firearm","weapon:tag:crossbow"]}});return}case"halfling-weapon-trickster":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:halfling","weapon:base:shortsword","weapon:base:sling"]}}];return}case"hobgoblin-weapon-discipline":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:group:polearm","weapon:group:spear","weapon:group:sword"]}}];return}case"improvised-critical":{source.system.rules=[{key:critSpecKey,predicate:{all:["weapon:tag:improvised"]}}];return}case"kobold-weapon-innovator":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:kobold","weapon:base:crossbow","weapon:base:greatpick","weapon:base:light-pick","weapon:base:pick","weapon:base:spear"]}}];return}case"mauler-dedication":{source.system.rules.push({key:"CriticalSpecialization",predicate:{all:["weapon:melee",{or:["weapon:category:simple","weapon:category:martial"]},{or:["weapon:usage:hands:2","weapon:trait:two-hand-d6","weapon:trait:two-hand-d8","weapon:trait:two-hand-d10","weapon:trait:two-hand-d12"]}]}});return}case"orc-weapon-carnage":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:trait:orc","weapon:base:falchion","weapon:base:greataxe"]}}];return}case"ranger-weapon-expertise":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:["hunted-prey"],any:["weapon:category:simple","weapon:category:martial"]}});return}case"spike-launcher":{const rule={key:critSpecKey,alternate:!0,predicate:{all:["weapon:id:{item|_id}"]},text:"PF2E.Item.Weapon.CriticalSpecialization.bow"};source.system.rules.push(rule);return}case"student-of-the-staff":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.unshift({key:critSpecKey,predicate:{all:["weapon:base:staff"]}});return}case"sun-sling":{source.system.rules.push({key:critSpecKey,predicate:{all:["weapon:id:{item|_id}","feat:suns-fury"]}});return}case"suns-fury":{source.system.rules=[];return}case"third-doctrine-warpriest":{source.system.rules.push({key:critSpecKey,predicate:{all:["weapon:deity-favored"]}});return}case"vanths-weapon-execution":{source.system.rules=[{key:"CriticalSpecialization",predicate:{any:["weapon:base:bo-staff","weapon:base:longbow","weapon:base:scythe","weapon:base:staff"]}}];return}case"weapon-expertise-swashbuckler":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:[{gte:["weapon:proficiency:rank",2]}]}});return}case"weapon-tricks":{source.system.rules=source.system.rules.filter(r=>r.key!=="Note"),source.system.rules.push({key:critSpecKey,predicate:{all:["target:condition:flat-footed"],any:[{and:[{or:["weapon:trait:agile","weapon:trait:finesse"]},{or:["weapon:category:simple","weapon:category:unarmed"]}]},"weapon:base:rapier","weapon:base:sap","weapon:base:shortbow","weapon:base:shortsword"]}});return}}}};__name2(_Migration759CritSpecRE,"Migration759CritSpecRE"),__publicField(_Migration759CritSpecRE,"version",.759);let Migration759CritSpecRE=_Migration759CritSpecRE;const _Migration760SeparateNoteTitle=class extends MigrationBase{static{__name(this,"_Migration760SeparateNoteTitle")}constructor(){super(...arguments),__privateAdd(this,_cleanText)}async updateItem(source){const notes=source.system.rules.filter(r=>r.key==="Note"&&typeof r.text=="string"&&!("title"in r));for(const note of notes){if(note.text=note.text.trim(),!note.text.startsWith("{const text=note.text.includes("

")?note.text:`${note.text}

`;try{const fragment=document.createElement("template");fragment.innerHTML=text;const children2=Array.from(fragment.content.childNodes);if(children2.length===1&&children2[0]instanceof HTMLElement)return children2[0];if(children2.length===2&&children2[0]instanceof HTMLParagraphElement&&children2[1]instanceof Text){const[first,second]=children2;return first.append(second),first}else return null}catch{return null}})();if(pElement?.nodeName!=="P")continue;const children=Array.from(pElement.childNodes);if(children.length===1&&children[0]instanceof Text){note.text=__privateMethod(this,_cleanText,cleanText_fn).call(this,children[0].textContent??""),pElement.dataset.visibility&&["gm","owner"].includes(pElement.dataset.visibility)&&(note.visibility=pElement.dataset.visibility);continue}if(children.length!==2||!(children[0]instanceof HTMLElement)||children[0].nodeName!=="STRONG"||!(children[1]instanceof Text))continue;const strongElement=children[0];strongElement.remove();const newText=pElement.innerHTML.trim();if(newText===""||note.text.includes("typeof group=="string"?`PF2E.Item.Weapon.CriticalSpecialization.${group.toLowerCase()}`:substring)},"#cleanText"),__name2(_Migration760SeparateNoteTitle,"Migration760SeparateNoteTitle"),__publicField(_Migration760SeparateNoteTitle,"version",.76);let Migration760SeparateNoteTitle=_Migration760SeparateNoteTitle;const _Migration761ShotRules=class extends MigrationBase{static{__name(this,"_Migration761ShotRules")}constructor(){super(...arguments),__privateAdd(this,_updateEffect),__privateAdd(this,_updateFeat)}async updateItem(source){switch(source.type){case"effect":__privateMethod(this,_updateEffect,updateEffect_fn).call(this,source);break;case"feat":__privateMethod(this,_updateFeat,updateFeat_fn).call(this,source);break}}};_updateEffect=new WeakSet,updateEffect_fn=__name2(function(source){if(source.system.slug==="stance-multishot-stance"){const newRules=[{key:"AdjustModifier",mode:"add",predicate:{all:["double-shot"]},relabel:"{item|name}",selector:"ranged-attack-roll",slug:"double-shot",value:1},{key:"AdjustModifier",mode:"add",predicate:{all:["triple-shot"]},relabel:"{item|name}",selector:"ranged-attack-roll",slug:"double-shot",value:1}];source.system.rules=newRules}},"#updateEffect"),_updateFeat=new WeakSet,updateFeat_fn=__name2(function(source){switch(source.system.slug){case"double-shot":{const newRules=[{domain:"ranged-attack-roll",key:"RollOption",option:"double-shot",toggleable:!0},{key:"FlatModifier",predicate:{all:["double-shot","weapon:reload:0"]},selector:"ranged-attack-roll",slug:"double-shot",value:-2}];source.system.rules=newRules;break}case"triple-shot":{const newRules=[{domain:"ranged-attack-roll",disabledIf:{not:["double-shot"]},key:"RollOption",option:"triple-shot",priority:51,toggleable:!0},{key:"AdjustModifier",mode:"override",predicate:{all:["double-shot","triple-shot"]},relabel:"{item|name}",selector:"ranged-attack-roll",slug:"double-shot",value:-4}];source.system.rules=newRules;break}}},"#updateFeat"),__name2(_Migration761ShotRules,"Migration761ShotRules"),__publicField(_Migration761ShotRules,"version",.761);let Migration761ShotRules=_Migration761ShotRules;const _Migration762UpdateBackgroundItems=class extends MigrationBase{static{__name(this,"_Migration762UpdateBackgroundItems")}async updateItem(source){source.type==="background"&&(source.system.slug==="amnesiac"||source.system.slug==="discarded-duplicate")&&Object.values(source.system.boosts).length!==3&&(source.system.boosts[2]={value:["cha","con","dex","int","str","wis"],selected:null})}};__name2(_Migration762UpdateBackgroundItems,"Migration762UpdateBackgroundItems"),__publicField(_Migration762UpdateBackgroundItems,"version",.762);let Migration762UpdateBackgroundItems=_Migration762UpdateBackgroundItems;const _Migration763RestoreAnimalStrikeOptions=class extends MigrationBase{static{__name(this,"_Migration763RestoreAnimalStrikeOptions")}async updateItem(source){if(source.type!=="feat"||!/^[a-z]+-animal-instinct$/.test(source.system.slug??""))return;const strikeRE=source.system.rules.find(r=>r.key==="Strike"&&!Array.isArray(r.options));strikeRE&&(strikeRE.options=["animal-instinct"])}};__name2(_Migration763RestoreAnimalStrikeOptions,"Migration763RestoreAnimalStrikeOptions"),__publicField(_Migration763RestoreAnimalStrikeOptions,"version",.763);let Migration763RestoreAnimalStrikeOptions=_Migration763RestoreAnimalStrikeOptions;const _Migration764PanacheVivaciousREs=class extends MigrationBase{static{__name(this,"_Migration764PanacheVivaciousREs")}constructor(){super(...arguments),__privateAdd(this,_vivaciousRules)}async updateItem(source){source.type==="feat"&&(source.system.slug==="panache"?source.system.rules=[]:source.system.slug==="vivacious-speed"&&(source.system.rules=__privateGet(this,_vivaciousRules,vivaciousRules_get)))}};_vivaciousRules=new WeakSet,vivaciousRules_get=__name2(function(){return[{key:"FlatModifier",predicate:{all:["self:effect:panache"]},selector:"speed",slug:"vivacious-full",type:"status",value:{brackets:[{end:2,value:5},{end:6,start:3,value:10},{end:10,start:7,value:15},{end:14,start:11,value:20},{end:18,start:15,value:25},{start:19,value:30}]}},{key:"FlatModifier",predicate:{not:["self:effect:panache"]},selector:"speed",slug:"vivacious-half",type:"status",value:{brackets:[{end:10,start:3,value:5},{end:18,start:11,value:10},{start:19,value:15}]}}]},"#vivaciousRules"),__name2(_Migration764PanacheVivaciousREs,"Migration764PanacheVivaciousREs"),__publicField(_Migration764PanacheVivaciousREs,"version",.764);let Migration764PanacheVivaciousREs=_Migration764PanacheVivaciousREs;const _Migration765ChoiceOwnedItemTypes=class extends MigrationBase{static{__name(this,"_Migration765ChoiceOwnedItemTypes")}async updateItem(source){for(const rule of source.system.rules)rule.key==="ChoiceSet"&&"choices"in rule&&isObject(rule.choices)&&rule.choices.ownedItems&&!rule.choices.types&&(rule.choices.types=["weapon"])}};__name2(_Migration765ChoiceOwnedItemTypes,"Migration765ChoiceOwnedItemTypes"),__publicField(_Migration765ChoiceOwnedItemTypes,"version",.765);let Migration765ChoiceOwnedItemTypes=_Migration765ChoiceOwnedItemTypes;const _Migration766WipeURLSources=class extends MigrationBase{static{__name(this,"_Migration766WipeURLSources")}async updateItem(source){(!("game"in globalThis)||source.flags.core?.sourceId?.startsWith("Compendium.pf2e."))&&"source"in source.system&&isObject(source.system.source)&&typeof source.system.source.value=="string"&&source.system.source.value.startsWith("http")&&(source.system.source.value="")}};__name2(_Migration766WipeURLSources,"Migration766WipeURLSources"),__publicField(_Migration766WipeURLSources,"version",.766);let Migration766WipeURLSources=_Migration766WipeURLSources;const _Migration767ConvertVoluntaryFlaws=class extends MigrationBase{static{__name(this,"_Migration767ConvertVoluntaryFlaws")}async updateItem(source){if(source.type!=="ancestry")return;const system=source.system,oldFlaws=Object.values(system.voluntaryFlaws??{}).map(b=>b.selected).filter(a=>!!a),oldBoosts=Object.values(system.voluntaryBoosts??{}).map(b=>b.selected).filter(a=>!!a);(oldBoosts.length||oldFlaws.length)&&(system.voluntary={boost:oldBoosts.at(0)||null,flaws:oldFlaws}),system.voluntaryBoosts&&(delete system.voluntaryBoosts,delete system["-=voluntaryBoosts"]),system.voluntaryFlaws&&(delete system.voluntaryFlaws,delete system.voluntaryFlaws)}};__name2(_Migration767ConvertVoluntaryFlaws,"Migration767ConvertVoluntaryFlaws"),__publicField(_Migration767ConvertVoluntaryFlaws,"version",.767);let Migration767ConvertVoluntaryFlaws=_Migration767ConvertVoluntaryFlaws;const _Migration768AddNewAuras=class extends MigrationBase{static{__name(this,"_Migration768AddNewAuras")}constructor(){super(...arguments),__privateAdd(this,_auraOfLife,{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.feat-effects.FPuICuxBLiDaEbDX"}],key:"Aura",radius:15,slug:"aura-of-life"}),__privateAdd(this,_enlightenedPresence,{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.feat-effects.XM1AA8z5cHm8sJXM"}],key:"Aura",radius:15,slug:"enlightened-presence",traits:["emotion","mental"]}),__privateAdd(this,_eternalBlessing,[{domain:"all",key:"RollOption",option:"eternal-blessing-active",toggleable:!0,value:!0},{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.spell-effects.Gqy7K6FnbLtwGpud"}],key:"Aura",predicate:{all:["eternal-blessing-active"]},radius:15,slug:"eternal-blessing",traits:["enchantment","mental"]}]),__privateAdd(this,_marshalsAura,{effects:[{affects:"allies",events:["enter"],uuid:"Compendium.pf2e.feat-effects.Ru4BNABCZ0hUbX7S"}],key:"Aura",radius:10,slug:"marshals-aura",traits:["emotion","mental","visual"]})}async updateItem(source){if(!(source.type!=="feat"||source.system.rules.length>0))switch(source.system.slug){case"aura-of-life":source.system.rules=[deepClone(__privateGet(this,_auraOfLife))];break;case"enlightened-presence":source.system.rules=[deepClone(__privateGet(this,_enlightenedPresence))];break;case"eternal-blessing":source.system.rules=deepClone(__privateGet(this,_eternalBlessing));break;case"marshal-dedication":source.system.rules=[deepClone(__privateGet(this,_marshalsAura))];break}}};_auraOfLife=new WeakMap,_enlightenedPresence=new WeakMap,_eternalBlessing=new WeakMap,_marshalsAura=new WeakMap,__name2(_Migration768AddNewAuras,"Migration768AddNewAuras"),__publicField(_Migration768AddNewAuras,"version",.768);let Migration768AddNewAuras=_Migration768AddNewAuras;const _Migration769NoUniversalistFocusPool=class extends MigrationBase{static{__name(this,"_Migration769NoUniversalistFocusPool")}async updateItem(source){if(source.type==="feat"&&source.system.slug==="arcane-school"){const rule=source.system.rules.find(r=>r.key==="ActiveEffectLike"&&r.path==="system.resources.focus.max");rule&&(rule.predicate={not:["feature:universalist"]})}}};__name2(_Migration769NoUniversalistFocusPool,"Migration769NoUniversalistFocusPool"),__publicField(_Migration769NoUniversalistFocusPool,"version",.769);let Migration769NoUniversalistFocusPool=_Migration769NoUniversalistFocusPool;const _Migration770REDataToSystem=class extends MigrationBase{static{__name(this,"_Migration770REDataToSystem")}async updateActor(source){source.system=recursiveReplaceString(source.system,value=>value.replace(/@(actor|item)\.data\.data./g,"@$1.system.").replace(/@(actor|item)\.data./g,"@$1."))}async updateItem(source){source.system=recursiveReplaceString(source.system,value=>value.replace(/^data\.data\./,"system.").replace(/^data\./,"system.").replace(/"data\.data\./g,'"system.').replace(/"data\./g,'"system.').replace(/@(actor|item)\.data\.data./g,"@$1.system.").replace(/@(actor|item)\.data./g,"@$1.").replace(/\b(actor|item|rule)\|data\.data\./g,"$1|system.").replace(/\b(actor|item|rule)\|data\./g,"$1|system."))}};__name2(_Migration770REDataToSystem,"Migration770REDataToSystem"),__publicField(_Migration770REDataToSystem,"version",.77);let Migration770REDataToSystem=_Migration770REDataToSystem;const _Migration771SpellVariantsToSystem=class extends MigrationBase{static{__name(this,"_Migration771SpellVariantsToSystem")}async updateItem(source){if(source.type==="spell"){for(const overlayData of Object.values(source.system.overlays??{}))if(overlayData.overlayType==="override"){const maybeWithData=overlayData;maybeWithData.data&&(delete Object.assign(maybeWithData,{system:maybeWithData.data}).data,maybeWithData["-=data"]=null)}}}};__name2(_Migration771SpellVariantsToSystem,"Migration771SpellVariantsToSystem"),__publicField(_Migration771SpellVariantsToSystem,"version",.771);let Migration771SpellVariantsToSystem=_Migration771SpellVariantsToSystem;const _Migration772V10EmbeddedSpellData=class extends MigrationBase{static{__name(this,"_Migration772V10EmbeddedSpellData")}async preUpdateItem(source){if(source.type==="consumable"&&source.system.spell){const embeddedSpell=source.system.spell;embeddedSpell.data?.data?(source.system.spell=embeddedSpell.data,source.system.spell.system=embeddedSpell.data.data,source.system.spell.system.location.heightenedLevel=Number(embeddedSpell.data.heightenedLevel)||source.system.spell.system.level.value,embeddedSpell.data["-=data"]=null,delete embeddedSpell.data.data):embeddedSpell.data?.system?(source.system.spell=embeddedSpell.data,source.system.spell.system.location.heightenedLevel=Number(embeddedSpell.data.heightenedLevel)||source.system.spell.system.level.value):embeddedSpell.data===null&&(source.system.spell=null)}}};__name2(_Migration772V10EmbeddedSpellData,"Migration772V10EmbeddedSpellData"),__publicField(_Migration772V10EmbeddedSpellData,"version",.772);let Migration772V10EmbeddedSpellData=_Migration772V10EmbeddedSpellData;const _Migration773ReligiousSymbolUsage=class extends MigrationBase{static{__name(this,"_Migration773ReligiousSymbolUsage")}async updateItem(source){source.type==="equipment"&&source.system.slug?.startsWith("religious-symbol")&&(source.system.usage.value="held-in-one-hand")}};__name2(_Migration773ReligiousSymbolUsage,"Migration773ReligiousSymbolUsage"),__publicField(_Migration773ReligiousSymbolUsage,"version",.773);let Migration773ReligiousSymbolUsage=_Migration773ReligiousSymbolUsage;const _Migration774UnpersistCraftingEntries=class extends MigrationBase{static{__name(this,"_Migration774UnpersistCraftingEntries")}munitionsCrafterPredicate={all:["item:trait:alchemical"],any:["item:trait:bomb","item:subtype:ammo"]};async updateActor(source){if(source.type==="character"){const craftingData=source.system.crafting??{},craftingEntries=craftingData.entries??{},rules=source.items.flatMap(i=>i.system.rules);for(const rule of rules)rule.key!=="CraftingEntry"||typeof rule.selector!="string"||rule.selector.length===0||!rule.requiredTraits||(rule.preparedFormulas=craftingEntries[rule.selector]?.actorPreparedFormulas??[]);delete craftingData.entries,craftingData["-=entries"]=null}}async updateItem(source){const rules=source.system.rules,craftingEntryRules=rules.filter(r=>r.key==="CraftingEntry"&&Array.isArray(r.requiredTraits)),newCraftingEntryRules=craftingEntryRules.map(craftingEntryRule=>(craftingEntryRule.craftableItems=craftingEntryRule.selector==="munitionsCrafter"?this.munitionsCrafterPredicate:this.generatePredicateFromRequiredTraits(craftingEntryRule.requiredTraits||[]),delete craftingEntryRule.requiredTraits,craftingEntryRule));for(const craftingEntryRule of craftingEntryRules){const index=rules.indexOf(craftingEntryRule);rules.splice(index,1,newCraftingEntryRules.shift()),delete craftingEntryRule.requiredTraits}const craftingEntryAELikes=rules.filter(r=>r.key==="ActiveEffectLike"&&typeof r.path=="string"&&r.path.startsWith("system.crafting.entries.")),newCraftingEntryAELikes=craftingEntryAELikes.map(craftingEntryAELike=>(craftingEntryAELike.phase="beforeDerived",craftingEntryAELike));for(const craftingEntryAELike of craftingEntryAELikes){const index=rules.indexOf(craftingEntryAELike);rules.splice(index,1,newCraftingEntryAELikes.shift())}}generatePredicateFromRequiredTraits(requiredTraits){return requiredTraits.length===1?{all:requiredTraits[0].map(trait=>`item:trait:${trait}`)}:{any:requiredTraits.map(traits=>({and:traits.map(trait=>`item:trait:${trait}`)}))}}};__name2(_Migration774UnpersistCraftingEntries,"Migration774UnpersistCraftingEntries"),__publicField(_Migration774UnpersistCraftingEntries,"version",.774);let Migration774UnpersistCraftingEntries=_Migration774UnpersistCraftingEntries;const _Migration775AgileFinesseRanged=class extends MigrationBase{static{__name(this,"_Migration775AgileFinesseRanged")}constructor(){super(...arguments),__privateAdd(this,_findDamageDiceRE),__privateAdd(this,_isClassFeature4),__privateAdd(this,_athleticStrategist),__privateAdd(this,_deviseAStratagem),__privateAdd(this,_ruffianPredicate),__privateAdd(this,_sneakAttackPredicate)}async updateItem(source){switch(source.type){case"action":{if(source.system.slug==="sneak-attack"){const damageDiceRE=__privateMethod(this,_findDamageDiceRE,findDamageDiceRE_fn).call(this,source);isObject(damageDiceRE)&&damageDiceRE.predicate&&Array.isArray(damageDiceRE.predicate.all)&&damageDiceRE.predicate.all.some(s=>s instanceof Object&&"or"in s)&&(damageDiceRE.predicate=__privateGet(this,_sneakAttackPredicate,sneakAttackPredicate_get))}break}case"feat":switch(source.system.slug){case"athletic-strategist":{const index=source.system.rules.findIndex(r=>r.key==="FlatModifier");index!==-1&&(source.system.rules[index]=__privateGet(this,_athleticStrategist,athleticStrategist_get));break}case"devise-a-stratagem":{const index=source.system.rules.findIndex(r=>r.key==="FlatModifier");index!==-1&&(source.system.rules[index]=__privateGet(this,_deviseAStratagem,deviseAStratagem_get));break}case"ruffian":{const damageDiceRE=__privateMethod(this,_findDamageDiceRE,findDamageDiceRE_fn).call(this,source);damageDiceRE&&(damageDiceRE.predicate=__privateGet(this,_ruffianPredicate,ruffianPredicate_get));break}case"shadow-sneak-attack":case"sneak-attack":case"sneak-attacker":{const damageDiceRE=__privateMethod(this,_findDamageDiceRE,findDamageDiceRE_fn).call(this,source);if(damageDiceRE){const predicate=__privateGet(this,_sneakAttackPredicate,sneakAttackPredicate_get);__privateMethod(this,_isClassFeature4,isClassFeature_fn4).call(this,source)&&predicate.all?.unshift("class:rogue"),damageDiceRE.predicate=predicate}break}}}}};_findDamageDiceRE=new WeakSet,findDamageDiceRE_fn=__name2(function(source){return source.system.rules.find(r=>r.key==="DamageDice")??null},"#findDamageDiceRE"),_isClassFeature4=new WeakSet,isClassFeature_fn4=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),_athleticStrategist=new WeakSet,athleticStrategist_get=__name2(function(){return{ability:"int",key:"FlatModifier",predicate:{all:["class:investigator","devise-a-stratagem",{or:["action:disarm","action:grapple","action:shove","action:trip"]}],any:["weapon:trait:agile","weapon:trait:finesse",{and:["weapon:ranged",{not:"weapon:thrown-melee"}]},"weapon:base:sap"]},selector:"athletics",type:"ability"}},"#athleticStrategist"),_deviseAStratagem=new WeakSet,deviseAStratagem_get=__name2(function(){return{ability:"int",key:"FlatModifier",predicate:{all:["class:investigator","devise-a-stratagem"],any:["weapon:trait:agile","weapon:trait:finesse",{and:["weapon:ranged",{not:"weapon:thrown-melee"}]},"weapon:base:sap"]},selector:"attack-roll",type:"ability"}},"#deviseAStratagem"),_ruffianPredicate=new WeakSet,ruffianPredicate_get=__name2(function(){return{all:["target:condition:flat-footed","weapon:category:simple",{nor:[{and:["weapon:ranged",{not:"weapon:thrown-melee"}]},"weapon:trait:agile","weapon:trait:finesse"]}]}},"#ruffianPredicate"),_sneakAttackPredicate=new WeakSet,sneakAttackPredicate_get=__name2(function(){return{all:["target:condition:flat-footed"],any:["weapon:trait:agile","weapon:trait:finesse",{and:["weapon:ranged",{not:"weapon:thrown-melee"}]}]}},"#sneakAttackPredicate"),__name2(_Migration775AgileFinesseRanged,"Migration775AgileFinesseRanged"),__publicField(_Migration775AgileFinesseRanged,"version",.775);let Migration775AgileFinesseRanged=_Migration775AgileFinesseRanged;const _Migration776SlugifyConditionOverrides=class extends MigrationBase{static{__name(this,"_Migration776SlugifyConditionOverrides")}async updateItem(source){if(source.type!=="condition")return;const{system}=source;Array.isArray(system.overrides)&&system.overrides.every(o=>typeof o=="string")&&(system.overrides=system.overrides.map(o=>sluggify(o)))}};__name2(_Migration776SlugifyConditionOverrides,"Migration776SlugifyConditionOverrides"),__publicField(_Migration776SlugifyConditionOverrides,"version",.776);let Migration776SlugifyConditionOverrides=_Migration776SlugifyConditionOverrides;const _Migration777HandOfTheApprentice=class extends MigrationBase{static{__name(this,"_Migration777HandOfTheApprentice")}async updateItem(source){if(source.type==="feat"&&source.system.slug==="hand-of-the-apprentice"){const rule={key:"ActiveEffectLike",mode:"add",path:"system.resources.focus.max",value:1};source.system.rules=[rule]}}};__name2(_Migration777HandOfTheApprentice,"Migration777HandOfTheApprentice"),__publicField(_Migration777HandOfTheApprentice,"version",.777);let Migration777HandOfTheApprentice=_Migration777HandOfTheApprentice;const _Migration778RenameRetiredPackRefs=class extends MigrationBase{static{__name(this,"_Migration778RenameRetiredPackRefs")}async updateItem(source){const rename=__name2(text=>text.replace(/\bpf2e\.consumable-effects\b/g,"pf2e.equipment-effects").replace(/\bpf2e\.exploration-effects\b/g,"pf2e.other-effects").replace(/\bpf2e\.feature-effects\b/g,"pf2e.feat-effects").replace(/\bpf2e\.equipment-effects\.I9lfZUiCwMiGogVi\b/g,"pf2e.other-effects.I9lfZUiCwMiGogVi").replace(/\bpf2e\.equipment-effects\.Cover\b/g,"pf2e.other-effects.Effect: Cover"),"rename");source.system.rules=recursiveReplaceString(source.system.rules,rename),source.system.description=recursiveReplaceString(source.system.description,rename)}};__name2(_Migration778RenameRetiredPackRefs,"Migration778RenameRetiredPackRefs"),__publicField(_Migration778RenameRetiredPackRefs,"version",.778);let Migration778RenameRetiredPackRefs=_Migration778RenameRetiredPackRefs;const _Migration779EliteWeak=class extends MigrationBase{static{__name(this,"_Migration779EliteWeak")}async updateActor(source){if(!(source.type==="npc"&&source.system.traits.traits?.value))return;const traits=source.system.traits.traits,adjustment=traits.value.includes("elite")?"elite":traits.value.includes("weak")?"weak":null;adjustment&&(source.system.attributes.adjustment=adjustment,traits.value=traits.value.filter(trait=>trait!=="elite"&&trait!=="weak"))}};__name2(_Migration779EliteWeak,"Migration779EliteWeak"),__publicField(_Migration779EliteWeak,"version",.779);let Migration779EliteWeak=_Migration779EliteWeak;const _Migration780NumifySpeeds=class extends MigrationBase{static{__name(this,"_Migration780NumifySpeeds")}constructor(){super(...arguments),__privateAdd(this,_updateSpeed)}async updateActor(source){if(source.type!=="npc"&&source.type!=="character")return;const speeds=source.system.attributes.speed;speeds.value=__privateMethod(this,_updateSpeed,updateSpeed_fn).call(this,speeds.value),Array.isArray(speeds.otherSpeeds)||(speeds.otherSpeeds=[]);for(const movementType of speeds.otherSpeeds)movementType.value=__privateMethod(this,_updateSpeed,updateSpeed_fn).call(this,movementType.value)}};_updateSpeed=new WeakSet,updateSpeed_fn=__name2(function(speed){const numifiedValue=parseInt(String(speed),10);return Number.isNaN(numifiedValue)?25:numifiedValue},"#updateSpeed"),__name2(_Migration780NumifySpeeds,"Migration780NumifySpeeds"),__publicField(_Migration780NumifySpeeds,"version",.78);let Migration780NumifySpeeds=_Migration780NumifySpeeds;const _Migration781SuppressNoCrowbar=class extends MigrationBase{static{__name(this,"_Migration781SuppressNoCrowbar")}constructor(){super(...arguments),__privateAdd(this,_suppressNoCrowbar)}async updateItem(source){if(!source.system.slug)return;const isCrowbar=source.type==="equipment"&&/^crowbar(?:-levered)?$/.test(source.system.slug),isForcedEntry=source.type==="feat"&&source.system.slug==="forced-entry";(isCrowbar||isForcedEntry)&&!source.system.rules.some(r=>r.key==="AdjustModifier")&&source.system.rules.push(__privateGet(this,_suppressNoCrowbar,suppressNoCrowbar_get))}};_suppressNoCrowbar=new WeakSet,suppressNoCrowbar_get=__name2(function(){return{key:"AdjustModifier",selector:"athletics",slug:"no-crowbar",suppress:!0}},"#suppressNoCrowbar"),__name2(_Migration781SuppressNoCrowbar,"Migration781SuppressNoCrowbar"),__publicField(_Migration781SuppressNoCrowbar,"version",.781);let Migration781SuppressNoCrowbar=_Migration781SuppressNoCrowbar;const _Migration782UnnestActorTraits=class extends MigrationBase{static{__name(this,"_Migration782UnnestActorTraits")}async updateActor(source){const traits=source.system.traits;traits&&traits.traits&&Array.isArray(traits.traits.value)&&(traits.value=traits.traits.value,delete traits.traits,traits["-=traits"]=null)}};__name2(_Migration782UnnestActorTraits,"Migration782UnnestActorTraits"),__publicField(_Migration782UnnestActorTraits,"version",.782);let Migration782UnnestActorTraits=_Migration782UnnestActorTraits;const _Migration783RemoveClassSkillAELikes=class extends MigrationBase{static{__name(this,"_Migration783RemoveClassSkillAELikes")}async updateItem(source){source.type==="class"&&(source.system.rules=source.system.rules.filter(r=>!(r.key==="ActiveEffectLike"&&typeof r.path=="string"&&/^system.skills\.[a-z]{3}\.rank$/.test(r.path)&&r.value===1)))}};__name2(_Migration783RemoveClassSkillAELikes,"Migration783RemoveClassSkillAELikes"),__publicField(_Migration783RemoveClassSkillAELikes,"version",.783);let Migration783RemoveClassSkillAELikes=_Migration783RemoveClassSkillAELikes;const _Migration784CompBrowserPackSetting=class extends MigrationBase{static{__name(this,"_Migration784CompBrowserPackSetting")}async migrate(){const savedSettings=game.settings.get("pf2e","compendiumBrowserPacks");if(savedSettings instanceof String){const settings=JSON.parse(savedSettings.toString());await game.settings.set("pf2e","compendiumBrowserPacks",settings);const browser=game?.pf2e?.compendiumBrowser;browser&&(browser.settings=settings,browser.initCompendiumList())}}};__name2(_Migration784CompBrowserPackSetting,"Migration784CompBrowserPackSetting"),__publicField(_Migration784CompBrowserPackSetting,"version",.784);let Migration784CompBrowserPackSetting=_Migration784CompBrowserPackSetting;const _Migration785ABCKitItemUUIDs=class extends MigrationBase{static{__name(this,"_Migration785ABCKitItemUUIDs")}constructor(){super(...arguments),__privateAdd(this,_convertToUUIDs)}async updateItem(source){switch(source.type){case"ancestry":case"background":case"class":case"kit":__privateMethod(this,_convertToUUIDs,convertToUUIDs_fn).call(this,Object.values(source.system.items))}}};_convertToUUIDs=new WeakSet,convertToUUIDs_fn=__name2(function(references){for(const reference of references)reference.id&&reference.pack?reference.uuid=`Compendium.${reference.pack}.${reference.id}`:reference.id&&(reference.uuid=`Item.${reference.id}`),delete reference.id,delete reference.pack,reference["-=id"]=null,reference["-=pack"]=null,reference.items&&__privateMethod(this,_convertToUUIDs,convertToUUIDs_fn).call(this,Object.values(reference.items))},"#convertToUUIDs"),__name2(_Migration785ABCKitItemUUIDs,"Migration785ABCKitItemUUIDs"),__publicField(_Migration785ABCKitItemUUIDs,"version",.785);let Migration785ABCKitItemUUIDs=_Migration785ABCKitItemUUIDs;const _Migration786RemoveIdentifiedData=class extends MigrationBase{static{__name(this,"_Migration786RemoveIdentifiedData")}async updateItem(source){if(!isPhysicalData(source))return;const identification=source.system.identification??{};identification.identified&&(identification["-=identified"]=null)}};__name2(_Migration786RemoveIdentifiedData,"Migration786RemoveIdentifiedData"),__publicField(_Migration786RemoveIdentifiedData,"version",.786);let Migration786RemoveIdentifiedData=_Migration786RemoveIdentifiedData;const _Migration787ResolvablesToSystem=class extends MigrationBase{static{__name(this,"_Migration787ResolvablesToSystem")}async updateItem(source){source.system=recursiveReplaceString(source.system,value=>value.replace(/@(weapon|spell)\.data\.data./g,"@$1.system.").replace(/@(weapon|spell)\.data./g,"@$1."))}};__name2(_Migration787ResolvablesToSystem,"Migration787ResolvablesToSystem"),__publicField(_Migration787ResolvablesToSystem,"version",.787);let Migration787ResolvablesToSystem=_Migration787ResolvablesToSystem;const _Migration788UpdateTanglefootBags=class extends MigrationBase{static{__name(this,"_Migration788UpdateTanglefootBags")}constructor(){super(...arguments),__privateAdd(this,_getRules)}async updateItem(source){if(source.type==="weapon"&&source.system.slug?.startsWith("tanglefoot-bag-"))switch(source.system.damage.dice=0,source.system.slug){case"tanglefoot-bag-lesser":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Lesser");return}case"tanglefoot-bag-moderate":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Moderate");return}case"tanglefoot-bag-greater":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Greater");return}case"tanglefoot-bag-major":{source.system.rules=__privateMethod(this,_getRules,getRules_fn).call(this,"Major");return}}}};_getRules=new WeakSet,getRules_fn=__name2(function(type){return[{key:"Note",outcome:["success"],selector:"{item|_id}-attack",text:`PF2E.BombNotes.TanglefootBag.${type}.success`,title:"TYPES.Item.effect"},{key:"Note",outcome:["criticalSuccess"],selector:"{item|_id}-attack",text:`PF2E.BombNotes.TanglefootBag.${type}.criticalSuccess`,title:"TYPES.Item.effect"}]},"#getRules"),__name2(_Migration788UpdateTanglefootBags,"Migration788UpdateTanglefootBags"),__publicField(_Migration788UpdateTanglefootBags,"version",.788);let Migration788UpdateTanglefootBags=_Migration788UpdateTanglefootBags;const _Migration789UpdatePreciseStrike=class extends MigrationBase{static{__name(this,"_Migration789UpdatePreciseStrike")}constructor(){super(...arguments),__privateAdd(this,_preciseStrikeRules),__privateAdd(this,_finishingPrecisionRules)}async updateItem(source){if(source.type==="feat"){if(source.system.slug==="precise-strike")source.system.rules=__privateGet(this,_preciseStrikeRules,preciseStrikeRules_get);else if(source.system.slug==="finishing-precision"){const rules=source.system.rules.filter(r=>r.key==="GrantItem");source.system.rules=[...rules,...__privateGet(this,_finishingPrecisionRules,finishingPrecisionRules_get)]}}}};_preciseStrikeRules=new WeakSet,preciseStrikeRules_get=__name2(function(){return[{domain:"damage-roll",key:"RollOption",label:"PF2E.SpecificRule.PreciseStrike.Finisher",option:"finisher",toggleable:!0},{damageCategory:"precision",key:"FlatModifier",predicate:{all:["class:swashbuckler","self:effect:panache",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"],not:["finisher"]},selector:"strike-damage",slug:"precise-strike",value:{brackets:[{end:4,value:2},{end:8,start:5,value:3},{end:12,start:9,value:4},{end:16,start:13,value:5},{start:17,value:6}]}},{category:"precision",dieSize:"d6",key:"DamageDice",predicate:{all:["class:swashbuckler","self:effect:panache","finisher",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"]},selector:"strike-damage",slug:"finisher",value:{brackets:[{end:4,value:{diceNumber:2}},{end:8,start:5,value:{diceNumber:3}},{end:12,start:9,value:{diceNumber:4}},{end:16,start:13,value:{diceNumber:5}},{start:17,value:{diceNumber:6}}]}}]},"#preciseStrikeRules"),_finishingPrecisionRules=new WeakSet,finishingPrecisionRules_get=__name2(function(){return[{damageCategory:"precision",key:"FlatModifier",predicate:{all:["self:effect:panache",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"],not:["finisher"]},selector:"strike-damage",slug:"finishing-precision",value:1},{category:"precision",diceNumber:1,dieSize:"d6",key:"DamageDice",predicate:{all:["self:effect:panache","finisher",{or:["weapon:melee",{and:["feat:flying-blade","weapon:thrown","target:range-increment:1"]}]}],any:["weapon:trait:agile","weapon:trait:finesse"]},selector:"strike-damage",slug:"finishing-precision"}]},"#finishingPrecisionRules"),__name2(_Migration789UpdatePreciseStrike,"Migration789UpdatePreciseStrike"),__publicField(_Migration789UpdatePreciseStrike,"version",.789);let Migration789UpdatePreciseStrike=_Migration789UpdatePreciseStrike;const _Migration790MultipleClassDCs=class extends MigrationBase{static{__name(this,"_Migration790MultipleClassDCs")}constructor(){super(...arguments),__privateAdd(this,_isClassFeature5),__privateAdd(this,_otherClassDCs,new Map([["call-implement","thaumaturge"],["eerie-proclamation","ranger"],["stunning-fist","monk"],["ring-bell","thaumaturge"]]))}async updateActor(source){if(source.type!=="character")return;const customModifiers=source.system.customModifiers??{};customModifiers?.class&&(customModifiers["-=class"]=null)}async updateItem(source){if(__privateMethod(this,_isClassFeature5,isClassFeature_fn5).call(this,source)){const classSlug=source.system.traits.value.at(0);if(!classSlug)return;const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike");for(const aeLike of aeLikes)aeLike.path==="system.attributes.classDC.rank"&&(aeLike.path=`system.proficiencies.classDCs.${classSlug}.rank`)}const itemSlug=source.system.slug??"";if(__privateGet(this,_otherClassDCs).has(itemSlug)){const oldClassDCPattern=/\bsystem\.attributes\.classDC\b/,classSlug=__privateGet(this,_otherClassDCs).get(itemSlug),{description}=source.system;description.value=description.value.replace(oldClassDCPattern,`system.proficiencies.classDCs.${classSlug}`);const notes=source.system.rules.filter(r=>r.key==="Note"&&typeof r.text=="string");for(const note of notes)note.text=note.text.replace(oldClassDCPattern,`system.proficiencies.classDCs.${classSlug}`)}}};_otherClassDCs=new WeakMap,_isClassFeature5=new WeakSet,isClassFeature_fn5=__name2(function(source){return source.type==="feat"&&"featType"in source.system&&isObject(source.system.featType)&&source.system.featType.value==="classfeature"},"#isClassFeature"),__name2(_Migration790MultipleClassDCs,"Migration790MultipleClassDCs"),__publicField(_Migration790MultipleClassDCs,"version",.79);let Migration790MultipleClassDCs=_Migration790MultipleClassDCs;const _Migration791RuffianHands=class extends MigrationBase{static{__name(this,"_Migration791RuffianHands")}constructor(){super(...arguments),__privateAdd(this,_critSpec),__privateAdd(this,_hands)}async updateItem(source){if(!(source.type!=="feat"||!source.system.slug))switch(source.system.slug){case"ruffian":{source.system.rules.some(r=>r.key==="CriticalSpecialization")||source.system.rules.push(__privateGet(this,_critSpec,critSpec_get));break}case"healing-hands":{const hands=__privateGet(this,_hands,hands_get);hands.predicate={all:["item:slug:heal"]},source.system.rules=[hands];break}case"harming-hands":{const hands=__privateGet(this,_hands,hands_get);hands.predicate={all:["item:slug:harm"]},source.system.rules=[hands];break}}}};_critSpec=new WeakSet,critSpec_get=__name2(function(){return{key:"CriticalSpecialization",predicate:{all:["target:condition:flat-footed","weapon:category:simple",{lte:["weapon:damage:die:faces",8]}]}}},"#critSpec"),_hands=new WeakSet,hands_get=__name2(function(){return{key:"DamageDice",override:{dieSize:"d10"},selector:"spell-damage"}},"#hands"),__name2(_Migration791RuffianHands,"Migration791RuffianHands"),__publicField(_Migration791RuffianHands,"version",.791);let Migration791RuffianHands=_Migration791RuffianHands;const _Migration792RemoveTokenAELikes=class extends MigrationBase{static{__name(this,"_Migration792RemoveTokenAELikes")}async updateItem(source){const rules=source.system.rules;for(const rule of[...rules])rule.key==="ActiveEffectLike"&&typeof rule.path=="string"&&/^token\./.test(rule.path)&&rules.splice(rules.indexOf(rule),1)}};__name2(_Migration792RemoveTokenAELikes,"Migration792RemoveTokenAELikes"),__publicField(_Migration792RemoveTokenAELikes,"version",.792);let Migration792RemoveTokenAELikes=_Migration792RemoveTokenAELikes;const _Migration793MakePredicatesArrays=class extends MigrationBase{static{__name(this,"_Migration793MakePredicatesArrays")}constructor(){super(...arguments),__privateAdd(this,_convertLegacyData),__privateAdd(this,_isOldRawPredicate),__privateAdd(this,_isArrayChoiceSet),__privateAdd(this,_isObjectChoiceSet)}async updateActor(source){if("customModifiers"in source.system){isObject(source.system.customModifiers)||(source.system.customModifiers={});for(const modifier of Object.values(source.system.customModifiers).flat())modifier.predicate&&=[]}}async updateItem(source){const rules=source.system.rules;for(const rule of rules){if(__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.predicate)&&(rule.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.predicate)),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.definition)&&(rule.definition=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.definition)),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.allowedDrops)&&(rule.allowedDrops={label:rule.allowedDrops.label??void 0,predicate:__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.allowedDrops)}),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.predicate)&&(rule.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.predicate)),__privateMethod(this,_isArrayChoiceSet,isArrayChoiceSet_fn).call(this,rule))for(const choice of rule.choices)__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,choice.predicate)&&(choice.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,choice.predicate));else __privateMethod(this,_isObjectChoiceSet,isObjectChoiceSet_fn).call(this,rule)?(__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.choices.predicate)&&(rule.choices.predicate=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.choices.predicate)),__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.choices.postFilter)&&(rule.choices.postFilter=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.choices.postFilter))):__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.craftableItems)&&(rule.craftableItems=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.craftableItems));__privateMethod(this,_isOldRawPredicate,isOldRawPredicate_fn).call(this,rule.disabledIf)&&(rule.disabledIf=__privateMethod(this,_convertLegacyData,convertLegacyData_fn).call(this,rule.disabledIf))}}};_convertLegacyData=new WeakSet,convertLegacyData_fn=__name2(function(predicate){const keys2=Object.keys(predicate);return keys2.length===0?[]:keys2.length===1&&Array.isArray(predicate.all)?deepClone(predicate.all):keys2.length===1&&Array.isArray(predicate.any)&&predicate.any.length===1?deepClone(predicate.any):deepClone([predicate.all??[],Array.isArray(predicate.any)?{or:predicate.any}:[],Array.isArray(predicate.not)?predicate.not.length===1?{not:predicate.not[0]}:{nor:predicate.not}:[]].flat())},"#convertLegacyData"),_isOldRawPredicate=new WeakSet,isOldRawPredicate_fn=__name2(function(predicate){return!predicate||Array.isArray(predicate)||isObject(predicate)&&Array.isArray(predicate.predicate)?!1:predicate instanceof Object},"#isOldRawPredicate"),_isArrayChoiceSet=new WeakSet,isArrayChoiceSet_fn=__name2(function(rule){return rule.key==="ChoiceSet"&&Array.isArray(rule.choices)},"#isArrayChoiceSet"),_isObjectChoiceSet=new WeakSet,isObjectChoiceSet_fn=__name2(function(rule){return rule.key==="ChoiceSet"&&isObject(rule.choices)&&!Array.isArray(rule.choices)},"#isObjectChoiceSet"),__name2(_Migration793MakePredicatesArrays,"Migration793MakePredicatesArrays"),__publicField(_Migration793MakePredicatesArrays,"version",.793);let Migration793MakePredicatesArrays=_Migration793MakePredicatesArrays;const _Migration794AddWildShapeChoices=class extends MigrationBase{static{__name(this,"_Migration794AddWildShapeChoices")}constructor(){super(...arguments),__privateAdd(this,_shapeFeats,new Set(["VaIHQzOE5ibmbtqU","OWedlrKGsVZVkSnT","wNHUryoRzlfDCFAd","F0MYBfiyOD8YHq5t","I9rSWQyueWHQyNxe","p0jZhb8PSswUsZaz","Le30algCdKIsxmeK","54JzsYCx3uoj7Wlz"].map(id=>`Compendium.pf2e.feats-srd.${id}`)))}async updateItem(source){const sourceId=source.flags.core?.sourceId;if(source.type==="feat"&&sourceId&&__privateGet(this,_shapeFeats).has(sourceId)){const fromPack=await fromUuid(sourceId);fromPack instanceof FeatPF2e&&(source.system.rules=fromPack.toObject().system.rules)}}};_shapeFeats=new WeakMap,__name2(_Migration794AddWildShapeChoices,"Migration794AddWildShapeChoices"),__publicField(_Migration794AddWildShapeChoices,"version",.794);let Migration794AddWildShapeChoices=_Migration794AddWildShapeChoices;const _Migration795CleanupFlatFootedToggle=class extends MigrationBase{static{__name(this,"_Migration795CleanupFlatFootedToggle")}constructor(){super(...arguments),__privateAdd(this,_flatFootedToggle),__privateAdd(this,_isFlatFootedToggle)}async updateActor(source){source.flags.pf2e?.rollOptions&&(source.flags.pf2e["-=rollOptions"]=null)}async updateItem(source){if(source.type==="feat"||source.type==="action"&&source.system.slug==="sneak-attack")switch(source.system.slug){case"sneak-attack":case"laughing-shadow":case"shadow-sneak-attack":case"butterflys-sting":case"game-hunter-dedication":source.system.rules.some(r=>__privateMethod(this,_isFlatFootedToggle,isFlatFootedToggle_fn).call(this,r))||source.system.rules.push(__privateGet(this,_flatFootedToggle,flatFootedToggle_get))}}};_flatFootedToggle=new WeakSet,flatFootedToggle_get=__name2(function(){return{key:"RollOption",domain:"all",label:"PF2E.SpecificRule.TOTMToggle.FlatFooted",option:"target:condition:flat-footed",toggleable:"totm"}},"#flatFootedToggle"),_isFlatFootedToggle=new WeakSet,isFlatFootedToggle_fn=__name2(function(rule){return rule.key==="RollOption"&&rule.option==="target:condition:flat-footed"&&rule.toggleable==="totm"},"#isFlatFootedToggle"),__name2(_Migration795CleanupFlatFootedToggle,"Migration795CleanupFlatFootedToggle"),__publicField(_Migration795CleanupFlatFootedToggle,"version",.795);let Migration795CleanupFlatFootedToggle=_Migration795CleanupFlatFootedToggle;const _Migration796ItemGrantsToObjects=class extends MigrationBase{static{__name(this,"_Migration796ItemGrantsToObjects")}constructor(){super(...arguments),__privateAdd(this,_convertToEntry),__privateAdd(this,_modifyFlag)}async updateActor(source){for(const item of source.items){const systemFlags=item.flags.pf2e;!systemFlags?.itemGrants||!Array.isArray(systemFlags.itemGrants)||(systemFlags.itemGrants=systemFlags.itemGrants.reduce((grantsObject,grant)=>{if(typeof grant=="string"||grant instanceof Object){const[flag,grantSource]=__privateMethod(this,_convertToEntry,convertToEntry_fn).call(this,source,item,grant);if(flag!==null){const modifiedFlag=__privateMethod(this,_modifyFlag,modifyFlag_fn).call(this,grantsObject,flag);grantsObject[modifiedFlag]=grantSource}}return grantsObject},{}))}}};_convertToEntry=new WeakSet,convertToEntry_fn=__name2(function(actor,granter,grantedData){const grantedId=grantedData instanceof Object?grantedData.id:grantedData;return actor.items.some(i=>i._id===grantedId)?[sluggify(granter.name,{camel:"dromedary"}),{id:grantedId}]:[null,null]},"#convertToEntry"),_modifyFlag=new WeakSet,modifyFlag_fn=__name2(function(grantedItems,flag){const pattern=new RegExp(`^${flag}\\d*$`),nthGrant=Object.keys(grantedItems).filter(g=>pattern.test(g)).length;return nthGrant===0?flag:`${flag}${nthGrant+1}`},"#modifyFlag"),__name2(_Migration796ItemGrantsToObjects,"Migration796ItemGrantsToObjects"),__publicField(_Migration796ItemGrantsToObjects,"version",.796);let Migration796ItemGrantsToObjects=_Migration796ItemGrantsToObjects;const _Migration797MetagameSetting=class extends MigrationBase{static{__name(this,"_Migration797MetagameSetting")}visibilitySettings=["showDC","showResults"];settings=[...this.visibilitySettings,"tokenSetsNameVisibility","secretDamage","secretCondition","partyVision"];async migrate(){for(const setting of this.settings){const storage=game.settings.storage.get("world"),newKey=`metagame_${setting}`,oldValue=storage.getItem(`pf2e.metagame.${setting}`)??null,existingValueRaw=storage.getItem(`pf2e.${newKey}`)??null;if(oldValue!==null&&existingValueRaw!==null){const newValue=this.visibilitySettings.includes(setting)?!["gm","owner"].includes(oldValue):oldValue;game.settings.set("pf2e",newKey,newValue)}}}};__name2(_Migration797MetagameSetting,"Migration797MetagameSetting"),__publicField(_Migration797MetagameSetting,"version",.797);let Migration797MetagameSetting=_Migration797MetagameSetting;const _Migration798WeaponToItemStatements=class extends MigrationBase{static{__name(this,"_Migration798WeaponToItemStatements")}async updateItem(source){const rules=source.system.rules;for(const rule of rules)for(const property of["predicate","definition"]){const predicate=rule[property];Array.isArray(predicate)&&(rule[property]=recursiveReplaceString(predicate,s=>s.replace(/^weapon:/,"item:")))}}};__name2(_Migration798WeaponToItemStatements,"Migration798WeaponToItemStatements"),__publicField(_Migration798WeaponToItemStatements,"version",.798);let Migration798WeaponToItemStatements=_Migration798WeaponToItemStatements;const _Migration799RMRecallKnowledgeDuplicates=class extends MigrationBase{static{__name(this,"_Migration799RMRecallKnowledgeDuplicates")}constructor(){super(...arguments),__privateAdd(this,_oldIdsPattern,new RegExp("pf2e\\.actionspf2e\\.(?:".concat(["KygTSeDvsFoSO6HW","B0Eu3EfwIa9kyDEA","SeUolRoPzorFUAaI","eT1jXYvz2YH70Ovp","B2BpIZFHoF9Kjzpx","LZgjpWd0pL3vK9Q1","KUfLlXDWTcAWhl8l"].join("|")).concat(")"),"g"))}async updateItem(source){source.system.description.value??="",source.system.description.value=source.system.description.value.replace(__privateGet(this,_oldIdsPattern),"pf2e.actionspf2e.1OagaWtBpVXExToo")}};_oldIdsPattern=new WeakMap,__name2(_Migration799RMRecallKnowledgeDuplicates,"Migration799RMRecallKnowledgeDuplicates"),__publicField(_Migration799RMRecallKnowledgeDuplicates,"version",.799);let Migration799RMRecallKnowledgeDuplicates=_Migration799RMRecallKnowledgeDuplicates;const _Migration800SelfEffectPanacheRage=class extends MigrationBase{static{__name(this,"_Migration800SelfEffectPanacheRage")}async updateItem(source,actorSource){if(!(actorSource?._id==="bpTQfx4UixMV3Fja"||actorSource?.flags.core?.sourceId==="Compendium.pf2e.extinction-curse-bestiary.Actor.bpTQfx4UixMV3Fja"))for(const rule of source.system.rules)rule.predicate&&Array.isArray(rule.predicate)&&(rule.predicate=recursiveReplaceString(rule.predicate,s=>s.replace(/^(rage|panache)$/,"self:effect:$1")))}};__name2(_Migration800SelfEffectPanacheRage,"Migration800SelfEffectPanacheRage"),__publicField(_Migration800SelfEffectPanacheRage,"version",.8);let Migration800SelfEffectPanacheRage=_Migration800SelfEffectPanacheRage;const _Migration801ColorDarkvision=class extends MigrationBase{static{__name(this,"_Migration801ColorDarkvision")}constructor(){super(...arguments),__privateAdd(this,_colorDarkvision)}async updateItem(source){if(!source.system.slug)return;const isFetchling=source.type==="ancestry"&&source.system.slug==="fetchling",isResonantLight=source.type==="feat"&&source.system.slug==="resonant-reflection-reflection-of-light",getsColorDarkvision=isFetchling||isResonantLight,rules=source.system.rules;getsColorDarkvision&&!rules.some(r=>r.path==="flags.pf2e.colorDarkvision")&&source.system.rules.push(__privateGet(this,_colorDarkvision,colorDarkvision_get))}};_colorDarkvision=new WeakSet,colorDarkvision_get=__name2(function(){return{key:"ActiveEffectLike",path:"flags.pf2e.colorDarkvision",mode:"override",value:!0}},"#colorDarkvision"),__name2(_Migration801ColorDarkvision,"Migration801ColorDarkvision"),__publicField(_Migration801ColorDarkvision,"version",.801);let Migration801ColorDarkvision=_Migration801ColorDarkvision;const _Migration802StripFeatActionCategory=class extends MigrationBase{static{__name(this,"_Migration802StripFeatActionCategory")}async updateItem(source){if(source.type!=="feat")return;const feat=source.system;feat.actionCategory&&(delete feat.actionCategory,feat["-=actionCategory"]=null)}};__name2(_Migration802StripFeatActionCategory,"Migration802StripFeatActionCategory"),__publicField(_Migration802StripFeatActionCategory,"version",.802);let Migration802StripFeatActionCategory=_Migration802StripFeatActionCategory;const _Migration803NormalizeSpellArea=class extends MigrationBase{static{__name(this,"_Migration803NormalizeSpellArea")}constructor(){super(...arguments),__privateAdd(this,_isAreaType),__privateAdd(this,_hasDetails),__privateAdd(this,_AREA_TYPES,new Set(["burst","cone","cube","emanation","line","square"]))}async updateItem(source){if(source.type!=="spell")return;const area=source.system.area;area&&(area.value=Number(area.value),"areaType"in area&&__privateMethod(this,_isAreaType,isAreaType_fn).call(this,area.areaType)&&(area.type=area.areaType,delete area.areaType,area["-=areaType"]=null)),area?.value&&__privateMethod(this,_isAreaType,isAreaType_fn).call(this,area.type)||(source.system.area=null),"areasize"in source.system&&isObject(source.system.areasize)&&(__privateMethod(this,_hasDetails,hasDetails_fn).call(this,source.system.areasize.value)&&area&&(area.details=source.system.areasize.value),delete source.system.areasize,source.system["-=areasize"]=null)}};_AREA_TYPES=new WeakMap,_isAreaType=new WeakSet,isAreaType_fn=__name2(function(areaType){return typeof areaType=="string"&&areaType.length>0&&__privateGet(this,_AREA_TYPES).has(areaType)},"#isAreaType"),_hasDetails=new WeakSet,hasDetails_fn=__name2(function(details){return typeof details=="string"&&details.trim().length>0&&!/^\d+-foot (?:burst|cone|cube|emanation|line|square)$/.test(details)},"#hasDetails"),__name2(_Migration803NormalizeSpellArea,"Migration803NormalizeSpellArea"),__publicField(_Migration803NormalizeSpellArea,"version",.803);let Migration803NormalizeSpellArea=_Migration803NormalizeSpellArea;const _Migration804RemoveConsumableProperties=class extends MigrationBase{static{__name(this,"_Migration804RemoveConsumableProperties")}async updateItem(source){if(source.type!=="consumable")return;const system=source.system;system.uses&&(delete system.uses,system["-=uses"]=null),system.autoUse&&(delete system.autoUse,system["-=autoUse"]=null),"_deprecated"in system.charges&&(delete system.charges._deprecated,system.charges["-=deprecated"]=null),"_deprecated"in system.consume&&(delete system.consume._deprecated,system.consume["-=deprecated"]=null)}};__name2(_Migration804RemoveConsumableProperties,"Migration804RemoveConsumableProperties"),__publicField(_Migration804RemoveConsumableProperties,"version",.804);let Migration804RemoveConsumableProperties=_Migration804RemoveConsumableProperties;const _Migration805InlineDamageRolls=class extends MigrationBase{static{__name(this,"_Migration805InlineDamageRolls")}constructor(){super(...arguments),__privateAdd(this,_updateDamageFormula),__privateAdd(this,_pattern,/\[\[\/r .+?\]\]\]?(?:\{[^}]+\})?/g),__privateAdd(this,_damageTypeLabelPattern,(()=>{const dicePattern="[0-9]{1,2}d[0-9]{1,2}(?:\\s*[-+]\\s*[0-9]{1,3})?",typesUnion=["acid","bleed","bludgeoning","chaotic","cold","electricity","evil","fire","force","good","lawful","mental","negative","piercing","poison","positive","slashing","sonic","untyped"].join("|");return new RegExp(`^${dicePattern} (?:${typesUnion})(?: damage)?$`,"i")})())}async updateActor(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula,updateDamageFormula_fn).call(this,s))}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula,updateDamageFormula_fn).call(this,s))}async updateJournalEntry(source){source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_updateDamageFormula,updateDamageFormula_fn).call(this,s))}};_pattern=new WeakMap,_damageTypeLabelPattern=new WeakMap,_updateDamageFormula=new WeakSet,updateDamageFormula_fn=__name2(function(text){const skipStrings=["splash","precision","persistent","d20","#"];return text.replace(__privateGet(this,_pattern),match=>{const labelEndsWithDamage=match.toLowerCase().endsWith("damage}");if(skipStrings.some(s=>match.includes(s)))return match;const customLabel=/\{([^}]+)\}$/.exec(match)?.at(1),expressions=match.replace(/\{[^}]+\}$/,"").match(/\{[^}]+\}\[\w+\]/g)??[];if(expressions.length===0)return match;const instances=expressions.map(i=>i.trim().replace(/^\{([^}]+)\}\[([a-z]+)\]$/i,["+","-","*","/"].some(o=>i.includes(o))?"($1)[$2]":"$1[$2]").toLowerCase()),reassembled=instances.length===1?`[[/r ${instances[0]}]]`:`[[/r {${instances.join(",")}}]]`;return customLabel&&!__privateGet(this,_damageTypeLabelPattern).test(customLabel)?`${reassembled}{${customLabel}}`:labelEndsWithDamage?`${reassembled} damage`:reassembled})},"#updateDamageFormula"),__name2(_Migration805InlineDamageRolls,"Migration805InlineDamageRolls"),__publicField(_Migration805InlineDamageRolls,"version",.805);let Migration805InlineDamageRolls=_Migration805InlineDamageRolls;const _Migration806TorchImprovisedOtherTags=class extends MigrationBase{static{__name(this,"_Migration806TorchImprovisedOtherTags")}async updateItem(source){if(source.type==="equipment"&&source.system.slug==="torch"){const torchStrikeRE=source.system.rules.find(r=>r.key==="Strike"&&r.otherTags===void 0);torchStrikeRE&&(delete torchStrikeRE.traits,torchStrikeRE.otherTags=["improvised"])}}};__name2(_Migration806TorchImprovisedOtherTags,"Migration806TorchImprovisedOtherTags"),__publicField(_Migration806TorchImprovisedOtherTags,"version",.806);let Migration806TorchImprovisedOtherTags=_Migration806TorchImprovisedOtherTags;const _Migration807RMActivatedEffectFields=class extends MigrationBase{static{__name(this,"_Migration807RMActivatedEffectFields")}async updateItem(source){if(source.type==="consumable")for(const property of["activation","duration","range","target","uses"])property in source.system&&(delete source.system[property],source.system[`-=${property}`]=null)}};__name2(_Migration807RMActivatedEffectFields,"Migration807RMActivatedEffectFields"),__publicField(_Migration807RMActivatedEffectFields,"version",.807);let Migration807RMActivatedEffectFields=_Migration807RMActivatedEffectFields;const _Migration808CountDamageDice=class extends MigrationBase{static{__name(this,"_Migration808CountDamageDice")}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>s.replace(/\(?\b1\s*\+\s*@(item|weapon)(?:.system)?.runes.striking\)?/g,"@$1.system.damage.dice"))}};__name2(_Migration808CountDamageDice,"Migration808CountDamageDice"),__publicField(_Migration808CountDamageDice,"version",.808);let Migration808CountDamageDice=_Migration808CountDamageDice;const _Migration809AutomatonEnhancements=class extends MigrationBase{static{__name(this,"_Migration809AutomatonEnhancements")}constructor(){super(...arguments),__privateAdd(this,_automatonEnhancements)}async updateItem(source){const isAutomaton=source.type==="ancestry"&&source.system.slug==="automaton",rules=source.system.rules;isAutomaton&&!rules.some(r=>r.path==="flags.pf2e.automaton.enhancements")&&source.system.rules.push(__privateGet(this,_automatonEnhancements,automatonEnhancements_get))}};_automatonEnhancements=new WeakSet,automatonEnhancements_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.automaton.enhancements",priority:10,value:{greater:[],lesser:[]}}},"#automatonEnhancements"),__name2(_Migration809AutomatonEnhancements,"Migration809AutomatonEnhancements"),__publicField(_Migration809AutomatonEnhancements,"version",.809);let Migration809AutomatonEnhancements=_Migration809AutomatonEnhancements;const _Migration810LootDescriptionValue=class extends MigrationBase{static{__name(this,"_Migration810LootDescriptionValue")}async updateActor(source){if(source.type==="loot"){const details=source.system.details;details.description instanceof Object&&(details.description=String(details.description.value??""))}}};__name2(_Migration810LootDescriptionValue,"Migration810LootDescriptionValue"),__publicField(_Migration810LootDescriptionValue,"version",.81);let Migration810LootDescriptionValue=_Migration810LootDescriptionValue;const _Migration811InlineDamageRollsPersistent=class extends MigrationBase{static{__name(this,"_Migration811InlineDamageRollsPersistent")}constructor(){super(...arguments),__privateAdd(this,_updateDamageFormula2),__privateAdd(this,_conditionPattern,/(?<=\]\]|})(\s*@(?:UUID|Compendium)\[(?:Compendium\.)?pf2e\.conditionitems\.(?:Persistent Damage|lDVqvLKA6eF3Df60)\]\{[^}]+})/g),__privateAdd(this,_pattern2,/\[\[\/r ([^[\]]+(\[.*?\])?)\]\](\{\dd\d[^{}]*\})?/g)}async updateActor(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula2,updateDamageFormula_fn2).call(this,s))}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula2,updateDamageFormula_fn2).call(this,s))}async updateJournalEntry(source){source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_updateDamageFormula2,updateDamageFormula_fn2).call(this,s))}};_conditionPattern=new WeakMap,_pattern2=new WeakMap,_updateDamageFormula2=new WeakSet,updateDamageFormula_fn2=__name2(function(text){return text.replace(__privateGet(this,_conditionPattern)," damage").replace(__privateGet(this,_pattern2),(match,formula)=>{if(!match.includes("persistent"))return match;const hashStyle=formula.match(/([^#]+)#\s*persistent ([^#]+)/);if(hashStyle){const expression=hashStyle[1].trim(),damageType=hashStyle[2].trim(),expressionCleaned=["+","-","*","/"].some(o=>expression.includes(o))?`(${expression})`:expression;return match.replace(formula,`${expressionCleaned}[persistent,${damageType}]`)}const expressions=formula.match(/\{[^}]+\}\[[\w,]+\]/g)??[];if(expressions.length){const withoutLabel=match.replace(/\{\dd\d[^{}]*\}$/,""),instances=expressions.map(i=>i.replace(/^\{([^}]+)\}\[([a-z,]+)\]$/,["+","-","*","/"].some(o=>i.includes(o))?"($1)[$2]":"$1[$2]")),reassembled=instances.length===1?instances[0]:`{${instances.join(",")}}`;return withoutLabel.replace(formula,reassembled)}return match})},"#updateDamageFormula"),__name2(_Migration811InlineDamageRollsPersistent,"Migration811InlineDamageRollsPersistent"),__publicField(_Migration811InlineDamageRollsPersistent,"version",.811);let Migration811InlineDamageRollsPersistent=_Migration811InlineDamageRollsPersistent;const _Migration812RestructureIWR=class extends MigrationBase{static{__name(this,"_Migration812RestructureIWR")}constructor(){super(...arguments),__privateAdd(this,_getWR),__privateAdd(this,_parseExceptions),__privateAdd(this,_normalizeType),__privateAdd(this,_oldENmappings,{"PF2E.ResistanceException.Bludgeoning":"except bludgeoning","PF2E.ResistanceException.ForceGhostTouchDoubleNonMagical":"except force, or ghost touch; double resistance vs. non-magical","PF2E.ResistanceException.ForceGhostTouchNegativeDoubleNonMagical":"except force, ghost touch, or negative; double resistance vs. non-magical","PF2E.ResistanceException.ForceGhostTouchPositiveDoubleNonMagical":"except force, ghost touch, or positive; double resistance vs. non-magical"})}async updateActor(source){const traits=source.system.traits;if(!traits||source.type==="familiar")return;const{attributes}=source.system;if("ci"in traits&&("game"in globalThis||delete traits.ci,traits["-=ci"]=null),"di"in traits){const oldData=traits.di;if("game"in globalThis||delete traits.di,traits["-=di"]=null,isObject(oldData)&&"value"in oldData&&Array.isArray(oldData.value)&&oldData.value.length>0){const immunities=oldData.value.map(i=>__privateMethod(this,_normalizeType,normalizeType_fn).call(this,String(i))).filter(i=>setHasElement(IMMUNITY_TYPES,i)).map(i=>({type:i}));immunities.length>0&&(attributes.immunities=immunities)}}if("dv"in traits){const oldData=traits.dv;if("game"in globalThis||delete traits.dv,traits["-=dv"]=null,Array.isArray(oldData)&&oldData.length>0){const weaknesses=__privateMethod(this,_getWR,getWR_fn).call(this,oldData,WEAKNESS_TYPES).map(data=>{const weakness=pick(data,["type","value"]),exceptions=__privateMethod(this,_parseExceptions,parseExceptions_fn).call(this,String(data.exceptions??"")).exceptions.filter(e=>setHasElement(WEAKNESS_TYPES,e));return exceptions.length>0&&(weakness.exceptions=exceptions),weakness});weaknesses.length>0&&(attributes.weaknesses=weaknesses)}}if("dr"in traits){const oldData=traits.dr;if("game"in globalThis||delete traits.dr,traits["-=dr"]=null,Array.isArray(oldData)&&oldData.length>0){const resistances=__privateMethod(this,_getWR,getWR_fn).call(this,oldData,RESISTANCE_TYPES).map(data=>{const resistance=pick(data,["type","value"]),parsed=__privateMethod(this,_parseExceptions,parseExceptions_fn).call(this,String(data.exceptions??"")),exceptions=parsed.exceptions.filter(e=>setHasElement(RESISTANCE_TYPES,e));exceptions.length>0&&(resistance.exceptions=exceptions);const doubleVs=parsed.doubleVs.filter(e=>setHasElement(RESISTANCE_TYPES,e));return doubleVs.length>0&&(resistance.doubleVs=doubleVs),resistance});resistances.length>0&&(attributes.resistances=resistances)}}}async updateItem(source){if(source.type==="weapon"){const material=source.system.preciousMaterial??{};material.value=typeof material.value=="string"?sluggify(material.value):null,source.system.preciousMaterialGrade&&(source.system.preciousMaterialGrade.value||=null)}const iwrREs=source.system.rules.filter(r=>typeof r.key=="string"&&["Immunity","Weakness","Resistance"].includes(r.key)&&"type"in r&&typeof r.type=="string");for(const rule of iwrREs)if(rule.type=rule.type.startsWith("{")?rule.type:__privateMethod(this,_normalizeType,normalizeType_fn).call(this,rule.type),typeof rule.except=="string"){const exceptions=__privateMethod(this,_parseExceptions,parseExceptions_fn).call(this,rule.except).exceptions.filter(exception=>rule.key==="Immunity"?setHasElement(IMMUNITY_TYPES,exception):rule.key==="Weakness"?setHasElement(WEAKNESS_TYPES,exception):setHasElement(RESISTANCE_TYPES,exception));exceptions.length>0&&(rule.exceptions=exceptions),delete rule.except}const adjustStrikeREs=source.system.rules.filter(r=>r.key==="AdjustStrike"&&typeof r.value=="string");for(const rule of adjustStrikeREs)rule.value=rule.value.startsWith("{")||["property-runes","weapon-traits"].includes(rule.property)?rule.value:__privateMethod(this,_normalizeType,normalizeType_fn).call(this,rule.value)}};_getWR=new WeakSet,getWR_fn=__name2(function(maybeWR,typeSet){return maybeWR.filter(r=>isObject(r)&&typeof r.type=="string"&&typeof r.value=="number").map(wr=>(wr.type=__privateMethod(this,_normalizeType,normalizeType_fn).call(this,wr.type),wr.value=Math.abs(wr.value),wr)).filter(r=>setHasElement(typeSet,r.type))},"#getWR"),_oldENmappings=new WeakMap,_parseExceptions=new WeakSet,parseExceptions_fn=__name2(function(text){const normalized=(__privateGet(this,_oldENmappings)[text]??text).toLowerCase().replace("PF2E.TraitForce","force").replace("PF2E.TraitPositive","positive").replace("cold iron","cold-iron").replace("critical hits","critical-hits").replace("ghost touch","ghost-touch").replace("nonmagical","non-magical").replace("weapons shedding bright light","weapons-shedding-bright-light").replace("unarmed","unarmed-attacks").replace(/\bexcept\b/,"").trim().replace(/\s+/," ");if(!normalized)return{exceptions:[],doubleVs:[]};const doubleIndex=normalized.indexOf("double"),exceptions=(doubleIndex===-1?normalized:normalized.slice(0,doubleIndex)).split(/[,\s]+/).map(d=>sluggify(d)),doubleVs=normalized.slice(doubleIndex).split(/[,\s]+/).map(d=>sluggify(d));return{exceptions,doubleVs}},"#parseExceptions"),_normalizeType=new WeakSet,normalizeType_fn=__name2(function(text){switch(text=text.trim(),text){case"all":case"All":return"all-damage";case"arrow":return"arrow-vulnerability";case"axe":return"axe-vulnerability";case"coldiron":return"cold-iron";case"nonlethal":return"nonlethal-attacks";case"nonmagical-attacks":return"non-magical";case"protean anatomy":return"protean-anatomy";case"unarmed":return"unarmed-attacks";default:return sluggify(text)}},"#normalizeType"),__name2(_Migration812RestructureIWR,"Migration812RestructureIWR"),__publicField(_Migration812RestructureIWR,"version",.812);let Migration812RestructureIWR=_Migration812RestructureIWR;const _Migration813NormalizeColdIron=class extends MigrationBase{static{__name(this,"_Migration813NormalizeColdIron")}constructor(){super(...arguments),__privateAdd(this,_updateWeaponMaterialData),__privateAdd(this,_updateChoiceSet)}async updateItem(source){switch(source.type){case"melee":{const traits=source.system.traits;traits.value=traits.value.map(t=>t.replace(/^coldiron$/i,"cold-iron"));return}case"armor":case"weapon":{const preciousMaterial=source.system.preciousMaterial;if(typeof preciousMaterial?.value!="string")return;preciousMaterial.value&&=preciousMaterial.value.replace(/^coldiron$/i,"cold-iron"),source.type==="weapon"&&__privateMethod(this,_updateWeaponMaterialData,updateWeaponMaterialData_fn).call(this,source);return}}const choiceSets=source.system.rules.filter(r=>r.key==="ChoiceSet"&&"choices"in r&&Array.isArray(r.choices)&&r.choices.every(c=>isObject(c)&&"value"in c&&typeof c.value=="string"));for(const choiceSet of choiceSets)__privateMethod(this,_updateChoiceSet,updateChoiceSet_fn).call(this,choiceSet)}};_updateWeaponMaterialData=new WeakSet,updateWeaponMaterialData_fn=__name2(function(source){if(source.type!=="weapon"||!isObject(source.system.specific))return;const specificData=source.system.specific;specificData.value||(delete specificData.material,delete specificData.price,delete specificData.runes,specificData["-=material"]=null,specificData["-=price"]=null,specificData["-=runes"]=null);const material=specificData.material;material?.precious?(material.precious.type&&=material.precious?.type.replace(/^coldiron$/i,"cold-iron"),delete material.base,material["-=base"]=null):typeof material?.type=="string"&&typeof material.grade=="string"&&(material.precious={type:material.type.replace(/^coldiron$/i,"cold-iron"),grade:material.grade},delete material.type,delete material.grade,material["-=type"]=null,material["-=grade"]=null)},"#updateWeaponMaterialData"),_updateChoiceSet=new WeakSet,updateChoiceSet_fn=__name2(function(choiceSet){for(const choice of choiceSet.choices)/coldiron/i.test(String(choice.value))&&(choice.value="cold-iron");/coldiron/i.test(String(choiceSet.selection))&&(choiceSet.selection="cold-iron")},"#updateChoiceSet"),__name2(_Migration813NormalizeColdIron,"Migration813NormalizeColdIron"),__publicField(_Migration813NormalizeColdIron,"version",.813);let Migration813NormalizeColdIron=_Migration813NormalizeColdIron;const _Migration814CalculatedExpandedSplash=class extends MigrationBase{static{__name(this,"_Migration814CalculatedExpandedSplash")}async updateItem(source){if(source.type==="feat")switch(source.system.slug){case"calculated-splash":{const rules=[{key:"AdjustModifier",mode:"upgrade",predicate:[{not:"feat:expanded-splash"}],relabel:"{item|name}",selector:"alchemical-bomb-damage",slug:"splash",value:"@actor.abilities.int.mod"}];source.system.rules=rules;return}case"expanded-splash":{const rules=[{damageCategory:"splash",key:"FlatModifier",predicate:["item:trait:splash"],selector:"alchemical-bomb-damage",value:"@actor.abilities.int.mod"},{key:"Note",predicate:["item:trait:splash"],selector:"alchemical-bomb-damage",text:"The bomb deals splash damage to every creature within 10 feet of the target.",title:"{item|name}"}];source.system.rules=rules}}}};__name2(_Migration814CalculatedExpandedSplash,"Migration814CalculatedExpandedSplash"),__publicField(_Migration814CalculatedExpandedSplash,"version",.814);let Migration814CalculatedExpandedSplash=_Migration814CalculatedExpandedSplash;const _Migration815ConsumableDataCleanup=class extends MigrationBase{static{__name(this,"_Migration815ConsumableDataCleanup")}consumableKeys=new Set(["autoDestroy","baseItem","bulk","charges","consumableType","consume","containerId","description","equipped","equippedBulk","hardness","hp","identification","level","negateBulk","preciousMaterial","preciousMaterialGrade","price","quantity","rules","schema","size","slug","source","spell","stackGroup","temporary","traits","usage","weight"]);async updateItem(source){if(source.type!=="consumable")return;const systemData=source.system;for(const key of Object.keys(systemData)){const value=systemData[key];this.consumableKeys.has(key)?isObject(value)&&"_deprecated"in value&&(delete value._deprecated,value["-=_deprecated"]=null):(delete systemData[key],systemData[`-=${key}`]=null)}}};__name2(_Migration815ConsumableDataCleanup,"Migration815ConsumableDataCleanup"),__publicField(_Migration815ConsumableDataCleanup,"version",.815);let Migration815ConsumableDataCleanup=_Migration815ConsumableDataCleanup;const _Migration816AlchemistResearchFields=class extends MigrationBase{static{__name(this,"_Migration816AlchemistResearchFields")}constructor(){super(...arguments),__privateAdd(this,_bomberSetFlags),__privateAdd(this,_chirurgeonSetFlags),__privateAdd(this,_mutagenistSetFlags),__privateAdd(this,_toxicologistSetFlags)}async updateItem(source){if(!(source.type!=="feat"||!source.system.slug)&&!source.system.rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.alchemist"))switch(source.system.slug){case"bomber":{source.system.rules.push(__privateGet(this,_bomberSetFlags,bomberSetFlags_get));break}case"chirurgeon":{source.system.rules.push(__privateGet(this,_chirurgeonSetFlags,chirurgeonSetFlags_get));break}case"mutagenist":{source.system.rules.push(__privateGet(this,_mutagenistSetFlags,mutagenistSetFlags_get));break}case"toxicologist":{source.system.rules.push(__privateGet(this,_toxicologistSetFlags,toxicologistSetFlags_get));break}}}};_bomberSetFlags=new WeakSet,bomberSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.8QAFgy9U8PxEa7Dw",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.RGs4uR3CAvgbtBAA",perpetualInfusions:"Compendium.pf2e.classfeatures.DFQDtT1Van4fFEHi",perpetualPerfection:"Compendium.pf2e.classfeatures.xO90iBD8XNGyaCkz",perpetualPotency:"Compendium.pf2e.classfeatures.8rEVg03QJ71ic3PP"}}},"#bomberSetFlags"),_chirurgeonSetFlags=new WeakSet,chirurgeonSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.qC0Iz6SlG2i9gv6g",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.JJcaVijwRt9dsnac",perpetualInfusions:"Compendium.pf2e.classfeatures.fzvIe6FwwCuIdnjX",perpetualPerfection:"Compendium.pf2e.classfeatures.YByJ9O7oe8wxfbqs",perpetualPotency:"Compendium.pf2e.classfeatures.VS5vkqUQu4n7E28Y"}}},"#chirurgeonSetFlags"),_mutagenistSetFlags=new WeakSet,mutagenistSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.V4Jt7eDnJBLv5bDj",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.1BKdOJ0HNL6Eg3xw",perpetualInfusions:"Compendium.pf2e.classfeatures.Dug1oaVYejLmYEFt",perpetualPerfection:"Compendium.pf2e.classfeatures.CGetAmSbv06fW7GT",perpetualPotency:"Compendium.pf2e.classfeatures.mZFqRLYOQEqKA8ri"}}},"#mutagenistSetFlags"),_toxicologistSetFlags=new WeakSet,toxicologistSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.alchemist",value:{fieldDiscovery:"Compendium.pf2e.classfeatures.6zo2PJGYoig7nFpR",greaterFieldDiscovery:"Compendium.pf2e.classfeatures.tnqyQrhrZeDtDvcO",perpetualInfusions:"Compendium.pf2e.classfeatures.LlZ5R50z9j8jysZL",perpetualPerfection:"Compendium.pf2e.classfeatures.3R19zS7gERhEX87F",perpetualPotency:"Compendium.pf2e.classfeatures.JOdbVu14phvdjhaY"}}},"#toxicologistSetFlags"),__name2(_Migration816AlchemistResearchFields,"Migration816AlchemistResearchFields"),__publicField(_Migration816AlchemistResearchFields,"version",.816);let Migration816AlchemistResearchFields=_Migration816AlchemistResearchFields;const _Migration817FieldDiscoveryPredicates=class extends MigrationBase{static{__name(this,"_Migration817FieldDiscoveryPredicates")}async updateItem(source){const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike"&&"path"in r&&typeof r.path=="string"&&/^system.crafting.entries.\w+.fieldDiscovery$/.test(r.path)&&"value"in r&&typeof r.value=="string");for(const rule of aeLikes)switch(rule.value){case"bomb":rule.value=["item:base:alchemical-bomb"];break;case"elixir":rule.value=["item:trait:elixir","item:trait:healing"];break;case"mutagen":rule.value=["item:trait:mutagen"];break;case"poison":rule.value=["item:trait:alchemical","item:trait:poison"];break;default:rule.value=[`item:trait:${rule.value}`]}}};__name2(_Migration817FieldDiscoveryPredicates,"Migration817FieldDiscoveryPredicates"),__publicField(_Migration817FieldDiscoveryPredicates,"version",.817);let Migration817FieldDiscoveryPredicates=_Migration817FieldDiscoveryPredicates;const _Migration818BasicUndeadNegativeHealing=class extends MigrationBase{static{__name(this,"_Migration818BasicUndeadNegativeHealing")}constructor(){super(...arguments),__privateAdd(this,_needsRE)}async updateItem(source){if(source.type==="feat"&&__privateMethod(this,_needsRE,needsRE_fn).call(this,source)){const rule={key:"ActiveEffectLike",mode:"override",path:"system.attributes.hp.negativeHealing",value:!0};source.system.rules.push(rule)}}};_needsRE=new WeakSet,needsRE_fn=__name2(function(source){return source.system.slug==="basic-undead-benefits"&&!source.system.rules.some(r=>r.key==="ActiveEffectLike"&&"path"in r&&r.path==="system.attributes.hp.negativeHealing")},"#needsRE"),__name2(_Migration818BasicUndeadNegativeHealing,"Migration818BasicUndeadNegativeHealing"),__publicField(_Migration818BasicUndeadNegativeHealing,"version",.818);let Migration818BasicUndeadNegativeHealing=_Migration818BasicUndeadNegativeHealing;const _Migration819SpinTaleAdventureSpecific=class extends MigrationBase{static{__name(this,"_Migration819SpinTaleAdventureSpecific")}async updateItem(source){if(source.type==="feat"){const oldSpinTale="Compendium.pf2e.adventure-specific-actions.Spin Tale",newSpinTale="Compendium.pf2e.actionspf2e.Spin Tale",oldSpinTaleId="Compendium.pf2e.adventure-specific-actions.5gahZQXf3UVwATSC",newSpinTaleId="Compendium.pf2e.actionspf2e.hPZQ5vA9QHEPtjFW";source.system.description.value=source.system.description.value.replace(oldSpinTale,newSpinTale),source.system.description.value=source.system.description.value.replace(oldSpinTaleId,newSpinTaleId)}}};__name2(_Migration819SpinTaleAdventureSpecific,"Migration819SpinTaleAdventureSpecific"),__publicField(_Migration819SpinTaleAdventureSpecific,"version",.819);let Migration819SpinTaleAdventureSpecific=_Migration819SpinTaleAdventureSpecific;const _Migration820RemoveUnusedTraitsData=class extends MigrationBase{static{__name(this,"_Migration820RemoveUnusedTraitsData")}async updateItem(source){source.system.traits;const systemSource=source.system;systemSource.traits&&("custom"in systemSource.traits&&(delete systemSource.traits.custom,systemSource.traits["-=custom"]=null),(source.type==="spellcastingEntry"||source.type==="condition")&&(delete systemSource.traits,systemSource["-=traits"]=null))}};__name2(_Migration820RemoveUnusedTraitsData,"Migration820RemoveUnusedTraitsData"),__publicField(_Migration820RemoveUnusedTraitsData,"version",.82);let Migration820RemoveUnusedTraitsData=_Migration820RemoveUnusedTraitsData;const _Migration821InlineDamageRolls=class extends MigrationBase{static{__name(this,"_Migration821InlineDamageRolls")}constructor(){super(...arguments),__privateAdd(this,_cleanFormula),__privateAdd(this,_buildSplashFormula),__privateAdd(this,_buildDamageFormula),__privateAdd(this,_updateDamageFormula3),__privateAdd(this,_splashPattern1,/\[\[(\/b?r)\s*{([^}]*)}\[splash,\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g),__privateAdd(this,_splashPattern2,/\[\[(\/b?r)\s*([^[]*)\[splash,\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g),__privateAdd(this,_damagePatternSingle,/\[\[(\/b?r)\s*{([^}]*)}\[\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g),__privateAdd(this,_damagePatternPair,/\[\[(\/b?r)\s*{([^}]*)}\[\s*([^\]]*)\]\s*[+,]\s*{([^}]*)}\[\s*([^\]]*)\]\s*(#[^\]]*)?\]\]/g)}async updateActor(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula3,updateDamageFormula_fn3).call(this,s))}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_updateDamageFormula3,updateDamageFormula_fn3).call(this,s))}async updateJournalEntry(source){source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_updateDamageFormula3,updateDamageFormula_fn3).call(this,s))}};_splashPattern1=new WeakMap,_splashPattern2=new WeakMap,_damagePatternSingle=new WeakMap,_damagePatternPair=new WeakMap,_cleanFormula=new WeakSet,cleanFormula_fn=__name2(function(formula){return formula=formula.replace(/\s+/g,""),["+","-","*","/"].some(o=>formula.includes(o))?`(${formula})`:formula},"#cleanFormula"),_buildSplashFormula=new WeakSet,buildSplashFormula_fn=__name2(function(roll,formula,damage,tag){return formula=__privateMethod(this,_cleanFormula,cleanFormula_fn).call(this,formula),damage=damage.trim(),tag=tag?.trim()??"",tag.length>0?`[[${roll} (${formula}[splash])[${damage}] ${tag}]]`:`[[${roll} (${formula}[splash])[${damage}]]]`},"#buildSplashFormula"),_buildDamageFormula=new WeakSet,buildDamageFormula_fn=__name2(function(roll,parts,tag){if(tag=tag?.trim()??"",parts.length===1){const formula=__privateMethod(this,_cleanFormula,cleanFormula_fn).call(this,parts[0].formula),damage=parts[0].damage.trim();return tag.length>0?`[[${roll} ${formula}[${damage}] ${tag}]]`:`[[${roll} ${formula}[${damage}]]]`}else if(parts.length>1){const assembled=parts.map(p=>{const formula=__privateMethod(this,_cleanFormula,cleanFormula_fn).call(this,p.formula),damage=p.damage.trim();return`${formula}[${damage}]`}).join(",");return tag.length>0?`[[${roll} {${assembled}} ${tag}]]`:`[[${roll} {${assembled}}]]`}else return""},"#buildDamageFormula"),_updateDamageFormula3=new WeakSet,updateDamageFormula_fn3=__name2(function(text){return text=text.replace(__privateGet(this,_splashPattern1),(_,roll,formula,damage,tag)=>__privateMethod(this,_buildSplashFormula,buildSplashFormula_fn).call(this,roll,formula,damage,tag)),text=text.replace(__privateGet(this,_splashPattern2),(_,roll,formula,damage,tag)=>__privateMethod(this,_buildSplashFormula,buildSplashFormula_fn).call(this,roll,formula,damage,tag)),text=text.replace(__privateGet(this,_damagePatternSingle),(_,roll,formula,damage,tag)=>__privateMethod(this,_buildDamageFormula,buildDamageFormula_fn).call(this,roll,[{formula,damage}],tag)),text=text.replace(__privateGet(this,_damagePatternPair),(_,roll,formula1,damage1,formula2,damage2,tag)=>__privateMethod(this,_buildDamageFormula,buildDamageFormula_fn).call(this,roll,[{formula:formula1,damage:damage1},{formula:formula2,damage:damage2}],tag)),text},"#updateDamageFormula"),__name2(_Migration821InlineDamageRolls,"Migration821InlineDamageRolls"),__publicField(_Migration821InlineDamageRolls,"version",.821);let Migration821InlineDamageRolls=_Migration821InlineDamageRolls;const _Migration822BladeAllyConsolidation=class extends MigrationBase{static{__name(this,"_Migration822BladeAllyConsolidation")}constructor(){super(...arguments),__privateAdd(this,_rename)}async updateItem(source){source.system.description.value.includes("feat-effects")&&(source.system.description.value=__privateMethod(this,_rename,rename_fn).call(this,source.system.description.value))}};_rename=new WeakSet,rename_fn=__name2(function(text){return text.replace(/\bfeat-effects\.Effect: Blade Ally Anarchic Rune\b/g,"equipment-srd.Anarchic").replace(/\bfeat-effects\.xLXFK4mtzgAF4zvx\b/g,"equipment-srd.65YL6nk1jIzCWutt").replace(/\bfeat-effects\.Effect: Blade Ally Axiomatic Rune\b/g,"equipment-srd.Axiomatic").replace(/\bfeat-effects\.ZzE6jPbCyUqEqhcb\b/g,"equipment-srd.6xu6dPIaUZ7edKEB").replace(/\bfeat-effects\.Effect: Blade Ally Disrupting Rune\b/g,"equipment-srd.Disrupting").replace(/\bfeat-effects\.eippbzuocVM6ftcj\b/g,"equipment-srd.LwQb7ryTC8FlOXgX").replace(/\bfeat-effects\.Effect: Blade Ally Fearsome Rune\b/g,"equipment-srd.Fearsome").replace(/\bfeat-effects\.6LgJB4ypaSTWSJLu\b/g,"equipment-srd.P6v2AtJw7AUwaDzf").replace(/\bfeat-effects\.Effect: Blade Ally Flaming Rune\b/g,"equipment-srd.Flaming").replace(/\bfeat-effects\.YxYr18vleIt2t3RS\b/g,"equipment-srd.XszNvxnymWYRaoTp").replace(/\bfeat-effects\.Effect: Blade Ally Holy Rune\b/g,"equipment-srd.Holy").replace(/\bfeat-effects\.l98IthkklgLDJXIo\b/g,"equipment-srd.DH0kB9Wbr5pDeunX").replace(/\bfeat-effects\.Effect: Blade Ally Keen Rune\b/g,"equipment-srd.Keen").replace(/\bfeat-effects\.Gf7h44DcTB43464h\b/g,"equipment-srd.hg3IogR8ue2IWwgS").replace(/\bfeat-effects\.Effect: Blade Ally Unholy Rune\b/g,"equipment-srd.Unholy").replace(/\bfeat-effects\.rGSc2PtvU3mgm18S\b/g,"equipment-srd.gmMrJREf4JSHd2dZ").replace(/\bfeat-effects\.Effect: Blade Ally Ghost Touch Rune\b/g,"equipment-srd.Ghost Touch").replace(/\bfeat-effects\.Rgio0hasm2epEMfh\b/g,"equipment-srd.JQdwHECogcTzdd8R").replace(/\bfeat-effects\.Effect: Blade Ally Disrupting Rune (Greater)\b/g,"equipment-srd.Disrupting (Greater)").replace(/\bfeat-effects\.HjfIXg5btodThCTW\b/g,"equipment-srd.oVrVzML63VFvVfKk")},"#rename"),__name2(_Migration822BladeAllyConsolidation,"Migration822BladeAllyConsolidation"),__publicField(_Migration822BladeAllyConsolidation,"version",.822);let Migration822BladeAllyConsolidation=_Migration822BladeAllyConsolidation;const _Migration823HeritageAncestrySlug=class extends MigrationBase{static{__name(this,"_Migration823HeritageAncestrySlug")}async updateItem(source){if(source.type!=="heritage"||!source.system.ancestry||source.system.ancestry.slug)return;const ancestry=await fromUuid(source.system.ancestry.uuid);source.system.ancestry.slug=ancestry instanceof AncestryPF2e?ancestry.slug??sluggify(ancestry.name):sluggify(source.system.ancestry.name)}};__name2(_Migration823HeritageAncestrySlug,"Migration823HeritageAncestrySlug"),__publicField(_Migration823HeritageAncestrySlug,"version",.823);let Migration823HeritageAncestrySlug=_Migration823HeritageAncestrySlug;const _Migration824SneakAttackDamageSource=class extends MigrationBase{static{__name(this,"_Migration824SneakAttackDamageSource")}async updateItem(source){if(source.type==="feat")switch(source.system.slug){case"sneak-attack":{const rules=[{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.number",predicate:["class:rogue"],value:"ternary(lt(@actor.level, 5), 1, ternary(lt(@actor.level, 11), 2, ternary(lt(@actor.level, 17), 3, 4)))"},{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.faces",predicate:["class:rogue"],value:6},{category:"precision",diceNumber:"@actor.flags.pf2e.sneakAttackDamage.number",dieSize:"d{actor|flags.pf2e.sneakAttackDamage.faces}",key:"DamageDice",predicate:["target:condition:flat-footed",{or:["item:trait:agile","item:trait:finesse",{and:["item:ranged",{not:"item:thrown-melee"}]}]}],selector:"strike-damage"},{domain:"all",key:"RollOption",label:"PF2E.SpecificRule.TOTMToggle.FlatFooted",option:"target:condition:flat-footed",toggleable:"totm"}];source.system.rules=rules;return}case"ruffian":{const rules=[{category:"precision",diceNumber:"@actor.flags.pf2e.sneakAttackDamage.number",dieSize:"d{actor|flags.pf2e.sneakAttackDamage.faces}",key:"DamageDice",label:"PF2E.SpecificRule.SneakAttack",predicate:["target:condition:flat-footed","item:category:simple",{nor:[{and:["item:ranged",{not:"item:thrown-melee"}]},"item:trait:agile","item:trait:finesse"]}],selector:"strike-damage"},{key:"ActiveEffectLike",mode:"upgrade",path:"system.martial.medium.rank",value:1},{key:"ActiveEffectLike",mode:"upgrade",path:"system.skills.itm.rank",value:1},{key:"CriticalSpecialization",predicate:["target:condition:flat-footed","item:category:simple",{lte:["item:damage:die:faces",8]}]}];source.system.rules=rules;return}case"sneak-attacker":{const rules=[{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.number",value:1},{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.faces",value:"ternary(lt(@actor.level, 6), 4, 6)"},{key:"GrantItem",uuid:"Compendium.pf2e.classfeatures.Sneak Attack"}];source.system.rules=rules;return}case"butterflys-sting":{const rules=[{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.number",value:1},{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.sneakAttackDamage.faces",value:6},{key:"GrantItem",uuid:"Compendium.pf2e.classfeatures.Sneak Attack"},{domain:"all",key:"RollOption",label:"PF2E.SpecificRule.TOTMToggle.FlatFooted",option:"target:condition:flat-footed",toggleable:"totm"}];source.system.rules=rules;return}case"magical-trickster":{const rules=[{category:"precision",diceNumber:"@actor.flags.pf2e.sneakAttackDamage.number",dieSize:"d{actor|flags.pf2e.sneakAttackDamage.faces}",key:"DamageDice",predicate:["item:trait:attack","target:condition:flat-footed"],selector:"spell-damage"}];source.system.rules=rules;return}}}};__name2(_Migration824SneakAttackDamageSource,"Migration824SneakAttackDamageSource"),__publicField(_Migration824SneakAttackDamageSource,"version",.824);let Migration824SneakAttackDamageSource=_Migration824SneakAttackDamageSource;const _Migration825KhakkharaFengHuoLun=class extends MigrationBase{static{__name(this,"_Migration825KhakkharaFengHuoLun")}async updateItem(source){if(source.img.endsWith("icons/equipment/weapons/khakkara.webp")&&(source.img=source.img.replace("khakkara.webp","khakkhara.webp")),source.type==="weapon"){const fixBaseItemAndSlug=__name2((oldId,newId)=>{source.system.baseItem===oldId&&(source.system.baseItem=newId),source.system.slug===oldId&&(source.system.slug=newId)},"fixBaseItemAndSlug");fixBaseItemAndSlug("khakkara","khakkhara"),fixBaseItemAndSlug("wind-and-fire-wheel","feng-huo-lun")}else if(source.type==="feat"){const oldLink="@UUID[Compendium.pf2e.equipment-srd.Khakkara]",newLink="@UUID[Compendium.pf2e.equipment-srd.Khakkhara]";source.system.description.value=source.system.description.value.replace(oldLink,newLink);for(const rule of source.system.rules)rule.key==="ActiveEffectLike"&&"path"in rule&&rule.path==="system.martial.weapon-base-khakkara.rank"&&(rule.path="system.martial.weapon-base-khakkhara.rank")}}};__name2(_Migration825KhakkharaFengHuoLun,"Migration825KhakkharaFengHuoLun"),__publicField(_Migration825KhakkharaFengHuoLun,"version",.825);let Migration825KhakkharaFengHuoLun=_Migration825KhakkharaFengHuoLun;const _Migration826GutConditionData=class extends MigrationBase{static{__name(this,"_Migration826GutConditionData")}async updateItem(source){if(source.type!=="condition")return;const system=source.system,topLevel=["active","base","removable","hud","modifiers","sources","alsoApplies"];for(const key of topLevel)key in system&&(delete system[key],system[`-=${key}`]=null);const valueData=system.value;for(const key of["immutable","modifiers"])key in valueData&&(delete valueData[key],valueData[`-=${key}`]=null);const durationData=system.duration;for(const key of["perpetual","text"])key in durationData&&(delete durationData[key],durationData[`-=${key}`]=null);system.group||=null}};__name2(_Migration826GutConditionData,"Migration826GutConditionData"),__publicField(_Migration826GutConditionData,"version",.826);let Migration826GutConditionData=_Migration826GutConditionData;const _Migration827FixTVShieldTraits=class extends MigrationBase{static{__name(this,"_Migration827FixTVShieldTraits")}async updateItem(source){const traits=source.system.traits;if(isObject(traits)&&"value"in traits&&!Array.isArray(traits.value)&&(traits.value=[]),source.type==="armor")switch(source.system.slug){case"dart-shield":{source.system.traits.value=["launching-dart"];return}case"klar":{source.system.traits.value=["integrated-1d6-s-versatile-p"];return}case"meteor-shield":{source.system.traits.value=["shield-throw-30"];return}case"razor-disc":{source.system.traits.value=["integrated-1d6-s","shield-throw-20"];return}}}};__name2(_Migration827FixTVShieldTraits,"Migration827FixTVShieldTraits"),__publicField(_Migration827FixTVShieldTraits,"version",.827);let Migration827FixTVShieldTraits=_Migration827FixTVShieldTraits;const _Migration828PruneInvalidTraits=class extends MigrationBase{static{__name(this,"_Migration828PruneInvalidTraits")}async updateActor(source){const traits=source.system.traits;if(traits)switch(source.type){case"character":case"npc":{traits.value=traits.value.filter(t=>t in creatureTraits);return}case"hazard":{traits.value=traits.value.filter(t=>t in hazardTraits);return}case"vehicle":{traits.value=traits.value.filter(t=>t in vehicleTraits);return}}}async updateItem(source){const traits=source.system.traits;if(traits?.value)switch(source.type){case"action":{traits.value=traits.value.map(t=>t.replace(/^audible$/,"auditory").replace(/^concentration$/,"concentrate").replace(/^(interact|manipulation)$/i,"manipulate").replace(/^vocal$/,"verbal")).filter(t=>t in actionTraits);return}case"affliction":case"effect":{traits.value=traits.value.filter(t=>t in actionTraits||t in spellTraits);return}case"ancestry":{traits.value=traits.value.filter(t=>t in creatureTraits||["animal"].includes(t));return}case"armor":{traits.value=traits.value.map(t=>source.system.slug?.includes("helmsmans")?t.replace(/^shield-throw$/,"shield-throw-30"):source.system.slug?.includes("klar")?t.replace(/^integrated$/,"integrated-1d6-s-versatile-p"):t).filter(t=>t in armorTraits);return}case"backpack":case"equipment":{traits.value=traits.value.filter(t=>t in equipmentTraits);return}case"consumable":{traits.value=traits.value.filter(t=>t in consumableTraits);return}case"class":{traits.value=traits.value.filter(t=>t in classTraits);return}case"feat":{traits.value=traits.value.filter(t=>t in featTraits);return}case"melee":{traits.value=traits.value.filter(t=>t in npcAttackTraits);return}case"spell":{traits.value=traits.value.map(t=>t.replace(/^audible$/,"auditory")).filter(t=>t in spellTraits);return}case"weapon":{traits.value=traits.value.filter(t=>t in weaponTraits);return}}}};__name2(_Migration828PruneInvalidTraits,"Migration828PruneInvalidTraits"),__publicField(_Migration828PruneInvalidTraits,"version",.828);let Migration828PruneInvalidTraits=_Migration828PruneInvalidTraits;const _Migration829RMRitualEntries=class extends MigrationBase{static{__name(this,"_Migration829RMRitualEntries")}async updateActor(source){for(const item of source.items.filter(i=>i.type==="spellcastingEntry"))item.system.prepared.value==="ritual"&&(source.items.splice(source.items.indexOf(item),1),source.type==="npc"&&(source.system.spellcasting??={},source.system.spellcasting.rituals={dc:item.system.spelldc.dc}))}async updateItem(source){source.type==="spell"&&source.system.category.value==="ritual"&&source.system.location&&(source.system.location.value=null)}};__name2(_Migration829RMRitualEntries,"Migration829RMRitualEntries"),__publicField(_Migration829RMRitualEntries,"version",.829);let Migration829RMRitualEntries=_Migration829RMRitualEntries;const _Migration830BarbarianRework=class extends MigrationBase{static{__name(this,"_Migration830BarbarianRework")}constructor(){super(...arguments),__privateAdd(this,_removeLinks)}async updateItem(source){source.system.description.value=__privateMethod(this,_removeLinks,removeLinks_fn).call(this,source.system.description.value);for(const rule of source.system.rules)rule.key==="ActiveEffectLike"&&"path"in rule&&(rule.path==="system.custom.modifiers.barbarian-dedication-count"||rule.path==="flags.pf2e.rollOptions.all.barbarian-dedication")&&(rule.path="flags.pf2e.barbarian.archetypeFeatCount"),rule.key==="FlatModifier"&&rule.value==="3 * @actor.system.custom.modifiers.barbarian-dedication-count"&&(rule.value="3 * @actor.flags.pf2e.barbarian.archetypeFeatCount")}};_removeLinks=new WeakSet,removeLinks_fn=__name2(function(text){return text.replace("@UUID[Compendium.pf2e.classfeatures.vlRvOQS1HZZqSyh7]{Ape}","Ape").replace("@UUID[Compendium.pf2e.classfeatures.uGY2yddm8mZx8Yo2]{Bear}","Bear").replace("@UUID[Compendium.pf2e.classfeatures.31sPXwmEbbcvgsM9]{Bull}","Bull").replace("@UUID[Compendium.pf2e.classfeatures.vCNtX2LwlemhA3tu]{Cat}","Cat").replace("@UUID[Compendium.pf2e.classfeatures.RQUJgDjJODO775qb]{Deer}","Deer").replace("@UUID[Compendium.pf2e.classfeatures.CXZwt1e6ManeBaFV]{Frog}","Frog").replace("@UUID[Compendium.pf2e.classfeatures.OJmI1L4dhQfz8vze]{Shark}","Shark").replace("@UUID[Compendium.pf2e.classfeatures.pIYWMCNnYDQfSRQh]{Snake}","Snake").replace("@UUID[Compendium.pf2e.classfeatures.xX6KnYYgHlPGoTG6]{Wolf}","Wolf").replace("@UUID[Compendium.pf2e.classfeatures.VNbDNiWjARtGQQAs]{Black}","Black").replace("@UUID[Compendium.pf2e.classfeatures.RiOww9KMu06D7wtW]{Blue}","Blue").replace("@UUID[Compendium.pf2e.classfeatures.IezPDYlweTtwCqkT]{Green}","Green").replace("@UUID[Compendium.pf2e.classfeatures.hyHgLQCDMSrR4RfE]{Red}","Red").replace("@UUID[Compendium.pf2e.classfeatures.2esqOHCn4GcZ4zYD]{White}","White").replace("@UUID[Compendium.pf2e.classfeatures.b5rvKZQCfpgBenKJ]{Brass}","Brass").replace("@UUID[Compendium.pf2e.classfeatures.kdzIxHpzeRbdRqQA]{Bronze}","Bronze").replace("@UUID[Compendium.pf2e.classfeatures.1ZugTzJHsa94AZRW]{Copper}","Copper").replace("@UUID[Compendium.pf2e.classfeatures.3lxIGMbsPZLNEXQ7]{Gold}","Gold").replace("@UUID[Compendium.pf2e.classfeatures.Z2eWkfXblU0QxFx1]{Silver}","Silver").replace("@UUID[Compendium.pf2e.classfeatures.Ape Animal Instinct]{Ape}","Ape").replace("@UUID[Compendium.pf2e.classfeatures.Bear Animal Instinct]{Bear}","Bear").replace("@UUID[Compendium.pf2e.classfeatures.Bull Animal Instinct]{Bull}","Bull").replace("@UUID[Compendium.pf2e.classfeatures.Cat Animal Instinct]{Cat}","Cat").replace("@UUID[Compendium.pf2e.classfeatures.Deer Animal Instinct]{Deer}","Deer").replace("@UUID[Compendium.pf2e.classfeatures.Frog Animal Instinct]{Frog}","Frog").replace("@UUID[Compendium.pf2e.classfeatures.Shark Animal Instinct]{Shark}","Shark").replace("@UUID[Compendium.pf2e.classfeatures.Snake Animal Instinct]{Snake}","Snake").replace("@UUID[Compendium.pf2e.classfeatures.Wolf Animal Instinct]{Wolf}","Wolf").replace("@UUID[Compendium.pf2e.classfeatures.Black Dragon Instinct]{Black}","Black").replace("@UUID[Compendium.pf2e.classfeatures.Blue Dragon Instinct]{Blue}","Blue").replace("@UUID[Compendium.pf2e.classfeatures.Green Dragon Instinct]{Green}","Green").replace("@UUID[Compendium.pf2e.classfeatures.Red Dragon Instinct]{Red}","Red").replace("@UUID[Compendium.pf2e.classfeatures.White Dragon Instinct]{White}","White").replace("@UUID[Compendium.pf2e.classfeatures.Brass Dragon Instinct]{Brass}","Brass").replace("@UUID[Compendium.pf2e.classfeatures.Bronze Dragon Instinct]{Bronze}","Bronze").replace("@UUID[Compendium.pf2e.classfeatures.Copper Dragon Instinct]{Copper}","Copper").replace("@UUID[Compendium.pf2e.classfeatures.Gold Dragon Instinct]{Gold}","Gold").replace("@UUID[Compendium.pf2e.classfeatures.Silver Dragon Instinct]{Silver}","Silver")},"#removeLinks"),__name2(_Migration830BarbarianRework,"Migration830BarbarianRework"),__publicField(_Migration830BarbarianRework,"version",.83);let Migration830BarbarianRework=_Migration830BarbarianRework;const _Migration831ClericDoctrines=class extends MigrationBase{static{__name(this,"_Migration831ClericDoctrines")}constructor(){super(...arguments),__privateAdd(this,_cloisteredClericSetFlags),__privateAdd(this,_warpriestSetFlags)}async updateItem(source){if(!(source.type!=="feat"||!source.system.slug)&&!source.system.rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.cleric"))switch(source.system.slug){case"cloistered-cleric":{source.system.rules.push(__privateGet(this,_cloisteredClericSetFlags,cloisteredClericSetFlags_get));break}case"warpriest":{source.system.rules.push(__privateGet(this,_warpriestSetFlags,warpriestSetFlags_get));break}}}};_cloisteredClericSetFlags=new WeakSet,cloisteredClericSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.cleric",value:{firstDoctrine:"Compendium.pf2e.classfeatures.aiwxBj5MjnafCMyn",secondDoctrine:"Compendium.pf2e.classfeatures.sa7BWfnyCswAvBVa",thirdDoctrine:"Compendium.pf2e.classfeatures.s8WEmc4GGZSHSC7q",fourthDoctrine:"Compendium.pf2e.classfeatures.vxOf4LXZcqUG3P7a",fifthDoctrine:"Compendium.pf2e.classfeatures.n9W8MjjRgPpUTvWf",finalDoctrine:"Compendium.pf2e.classfeatures.DgGefatQ4v6xT6f9"}}},"#cloisteredClericSetFlags"),_warpriestSetFlags=new WeakSet,warpriestSetFlags_get=__name2(function(){return{key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.cleric",value:{firstDoctrine:"Compendium.pf2e.classfeatures.xxkszluN9icAiTO4",secondDoctrine:"Compendium.pf2e.classfeatures.D34mPo29r1J3DPaX",thirdDoctrine:"Compendium.pf2e.classfeatures.Zp81uTBItG1xlH4O",fourthDoctrine:"Compendium.pf2e.classfeatures.px3gVYp7zlEQIpcl",fifthDoctrine:"Compendium.pf2e.classfeatures.kmimy4VOaoEOgOiQ",finalDoctrine:"Compendium.pf2e.classfeatures.N1ugDqZlslxbp3Uy"}}},"#warpriestSetFlags"),__name2(_Migration831ClericDoctrines,"Migration831ClericDoctrines"),__publicField(_Migration831ClericDoctrines,"version",.831);let Migration831ClericDoctrines=_Migration831ClericDoctrines;const _Migration832ChoiceSetFlags=class extends MigrationBase{static{__name(this,"_Migration832ChoiceSetFlags")}async updateItem(source){const choiceSets=source.system.rules.filter(r=>r.key==="ChoiceSet"&&"flag"in r&&typeof r.flag=="string");for(const choiceSet of choiceSets){const originalFlag=choiceSet.flag;if(choiceSet.flag=sluggify(choiceSet.flag,{camel:"dromedary"}),choiceSet.flag!==originalFlag){console.log(`${originalFlag} ->> ${choiceSet.flag}`);const pattern=new RegExp(String.raw`\brulesSelections\.${originalFlag}\b`,"g");source.system.rules=source.system.rules.map(r=>r.key==="ChoiceSet"?r:recursiveReplaceString(r,s=>s.replace(pattern,`rulesSelections.${choiceSet.flag}`)))}}}};__name2(_Migration832ChoiceSetFlags,"Migration832ChoiceSetFlags"),__publicField(_Migration832ChoiceSetFlags,"version",.832);let Migration832ChoiceSetFlags=_Migration832ChoiceSetFlags;const _Migration833AddRogueToysFixPrecision=class extends MigrationBase{static{__name(this,"_Migration833AddRogueToysFixPrecision")}async updateItem(source){if(source.type!=="feat")return;const flatFootedId="game"in globalThis?"AJh5ex99aV6VTggg":"Flat-Footed";switch(source.system.slug){case"surprise-attack":{const rules=[{key:"EphemeralEffect",predicate:["encounter:round:1",{lt:["self:participant:initiative:rank","target:participant:initiative:rank"]},{or:["self:participant:initiative:stat:deception","self:participant:initiative:stat:stealth"]}],selectors:["strike-attack-roll","spell-attack-roll","strike-damage","attack-spell-damage"],uuid:`Compendium.pf2e.conditionitems.Item.${flatFootedId}`}];source.system.rules=rules;break}case"dread-striker":{const rules=[{key:"EphemeralEffect",predicate:["target:condition:frightened"],selectors:["strike-attack-roll","spell-attack-roll","strike-damage","attack-spell-damage"],uuid:`Compendium.pf2e.conditionitems.Item.${flatFootedId}`}];source.system.rules=rules;break}case"precision":{if(source.system.rules.some(r=>"damageType"in r&&r.damageType==="precision")){const rules=[{domain:"all",key:"RollOption",label:"PF2E.SpecificRule.Ranger.HuntersEdge.FirstAttack",option:"first-attack",toggleable:!0},{category:"precision",diceNumber:"ternary(lt(@actor.level, 11), 1, ternary(lt(@actor.level, 19), 2, 3))",dieSize:"d8",key:"DamageDice",predicate:["first-attack"],selector:"strike-damage"}];source.system.rules=rules}break}}}};__name2(_Migration833AddRogueToysFixPrecision,"Migration833AddRogueToysFixPrecision"),__publicField(_Migration833AddRogueToysFixPrecision,"version",.833);let Migration833AddRogueToysFixPrecision=_Migration833AddRogueToysFixPrecision;const FEAT_CATEGORIES=new Set(["ancestry","bonus","class","general","skill"]),FEATURE_CATEGORIES=new Set(["ancestryfeature","classfeature","curse","deityboon","pfsboon"]),FEAT_OR_FEATURE_CATEGORIES=new Set(["ancestry","ancestryfeature","bonus","class","classfeature","curse","deityboon","general","pfsboon","skill"]),_Migration834FeatCategories=class extends MigrationBase{static{__name(this,"_Migration834FeatCategories")}constructor(){super(...arguments),__privateAdd(this,_updateCategoryData)}async updateItem(source){source.type==="feat"&&__privateMethod(this,_updateCategoryData,updateCategoryData_fn).call(this,source.system);const choiceSets=source.system.rules.filter(r=>r.key==="ChoiceSet");for(const rule of choiceSets)isObject(rule.allowedDrops)&&"predicate"in rule.allowedDrops&&Array.isArray(rule.allowedDrops.predicate)&&(rule.allowedDrops.predicate=recursiveReplaceString(rule.allowedDrops.predicate,s=>s.replace(/\bfeat(?:ure)?-type\b/,"category"))),isObject(rule.choices)&&"query"in rule.choices&&typeof rule.choices.query=="string"&&(rule.choices.query=rule.choices.query.replace('"featType.value":"archetype"','"category":"class"').replace("featType.value","category"))}};_updateCategoryData=new WeakSet,updateCategoryData_fn=__name2(function(system){const{traits}=system;if("featType"in system&&isObject(system.featType)){const category=system.featType.value;delete system.featType,"game"in globalThis&&(system["-=featType"]=null),category==="archetype"?(system.category=system.traits.value.includes("skill")?"skill":"class",traits.value.includes("archetype")||(traits.value.push("archetype"),traits.value.sort())):setHasElement(FEAT_OR_FEATURE_CATEGORIES,category)&&(system.category=category)}setHasElement(FEAT_OR_FEATURE_CATEGORIES,system.category)||(system.category="bonus"),system.category==="skill"&&!traits.value.includes("archetype")&&!traits.value.includes("general")&&(system.traits.value.push("general"),system.traits.value.sort())},"#updateCategoryData"),__name2(_Migration834FeatCategories,"Migration834FeatCategories"),__publicField(_Migration834FeatCategories,"version",.834);let Migration834FeatCategories=_Migration834FeatCategories;const _Migration835InitiativeLongform=class extends MigrationBase{static{__name(this,"_Migration835InitiativeLongform")}async updateActor(actor){if(!("initiative"in actor.system.attributes))return;const initiative=actor.system.attributes.initiative;if(!initiative||!initiative.ability)return;const ability=initiative.ability;objectHasKey(SKILL_DICTIONARY,ability)?initiative.statistic=SKILL_DICTIONARY[ability]:initiative.statistic="perception",delete initiative.ability,initiative["-=ability"]=null}};__name2(_Migration835InitiativeLongform,"Migration835InitiativeLongform"),__publicField(_Migration835InitiativeLongform,"version",.835);let Migration835InitiativeLongform=_Migration835InitiativeLongform;const _Migration836EnergizingConsolidation=class extends MigrationBase{static{__name(this,"_Migration836EnergizingConsolidation")}constructor(){super(...arguments),__privateAdd(this,_rename2)}async updateItem(source){source.system.description.value.includes("equipment-effects")&&(source.system.description.value=__privateMethod(this,_rename2,rename_fn2).call(this,source.system.description.value))}};_rename2=new WeakSet,rename_fn2=__name2(function(text){const newEffectEnergizingRune="equipment-effects.R5ywXEYZFV1WBe8t";return text.replace("equipment-effects.ClsVhp5baFRjZQ23",newEffectEnergizingRune).replace("equipment-effects.68xcDyxsNgD3JddD",newEffectEnergizingRune).replace("equipment-effects.9BsFdrEc7hkPWgSd",newEffectEnergizingRune).replace("equipment-effects.ascxqSlMEN9R6OOy",newEffectEnergizingRune).replace("equipment-effects.4RnEUeYEzC919GZR",newEffectEnergizingRune)},"#rename"),__name2(_Migration836EnergizingConsolidation,"Migration836EnergizingConsolidation"),__publicField(_Migration836EnergizingConsolidation,"version",.836);let Migration836EnergizingConsolidation=_Migration836EnergizingConsolidation;const _Migration837MoveHazardBookSources=class extends MigrationBase{static{__name(this,"_Migration837MoveHazardBookSources")}async updateActor(source){if(source.type==="hazard"&&isObject(source.system.source)){const value=typeof source.system.source.value=="string"?source.system.source.value:"",author=typeof source.system.source.author=="string"?source.system.source.author:"";source.system.details.source={value,author},"game"in globalThis?source.system["-=source"]=null:delete source.system.source}}};__name2(_Migration837MoveHazardBookSources,"Migration837MoveHazardBookSources"),__publicField(_Migration837MoveHazardBookSources,"version",.837);let Migration837MoveHazardBookSources=_Migration837MoveHazardBookSources;const _Migration838StrikeAttackRollSelector=class extends MigrationBase{static{__name(this,"_Migration838StrikeAttackRollSelector")}async updateItem(source){Array.isArray(source.system.rules)||(source.system.rules=[]);for(const rule of source.system.rules)"selector"in rule&&(rule.selector==="mundane-attack"?rule.selector="strike-attack-roll":Array.isArray(rule.selector)&&(rule.selector=rule.selector.map(s=>s==="mundane-attack"?"strike-attack-roll":s)))}};__name2(_Migration838StrikeAttackRollSelector,"Migration838StrikeAttackRollSelector"),__publicField(_Migration838StrikeAttackRollSelector,"version",.838);let Migration838StrikeAttackRollSelector=_Migration838StrikeAttackRollSelector;const _Migration839ActionCategories=class extends MigrationBase{static{__name(this,"_Migration839ActionCategories")}async updateItem(source,actorSource){if(source.type!=="action")return;const system=source.system;if(system.actionCategory){const npcCategories=["offensive","defensive","interaction"],oldValue=system.actionCategory.value||null,mustBeNull=oldValue&&npcCategories.includes(oldValue)&&actorSource&&actorSource.type!=="npc";system.category=mustBeNull?null:oldValue,delete system.actionCategory,system["-=actionCategory"]=null}}};__name2(_Migration839ActionCategories,"Migration839ActionCategories"),__publicField(_Migration839ActionCategories,"version",.839);let Migration839ActionCategories=_Migration839ActionCategories;const _Migration840ArrayWrapPredicates=class extends MigrationBase{static{__name(this,"_Migration840ArrayWrapPredicates")}constructor(){super(...arguments),__privateAdd(this,_wrapPredicate)}async updateItem(source){for(const rule of source.system.rules)"predicate"in rule&&(rule.predicate=__privateMethod(this,_wrapPredicate,wrapPredicate_fn).call(this,rule.predicate)),"definition"in rule&&(rule.definition=__privateMethod(this,_wrapPredicate,wrapPredicate_fn).call(this,rule.definition))}};_wrapPredicate=new WeakSet,wrapPredicate_fn=__name2(function(predicate){if(Array.isArray(predicate))return predicate;const arrayWrapped=[predicate];return predicate&&PredicatePF2e.isValid(arrayWrapped)?arrayWrapped:void 0},"#wrapPredicate"),__name2(_Migration840ArrayWrapPredicates,"Migration840ArrayWrapPredicates"),__publicField(_Migration840ArrayWrapPredicates,"version",.84);let Migration840ArrayWrapPredicates=_Migration840ArrayWrapPredicates;const _Migration841V11UUIDFormat=class extends MigrationBase{static{__name(this,"_Migration841V11UUIDFormat")}constructor(){super(...arguments),__privateAdd(this,_replaceUUID),__privateAdd(this,_replaceUUIDsInLinks)}async updateActor(source){if(source.flags.core?.sourceId&&(source.flags.core.sourceId=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,source.flags.core.sourceId,"Actor")),source.type==="character"){if(isObject(source.system.crafting)&&Array.isArray(source.system.crafting.formulas))for(const formula of source.system.crafting.formulas)formula.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,formula.uuid,"Item")}else if(source.type==="npc"){const{details}=source.system;details.publicNotes&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.publicNotes),details.privateNotes&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.privateNotes)}else if(source.type==="hazard"){const{details}=source.system;details.reset&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.reset),details.description&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.description),details.routine&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.routine),details.disable&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,details.disable)}}async updateItem(source){if(source.flags.core?.sourceId&&(source.flags.core.sourceId=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,source.flags.core.sourceId,"Item")),source.system.rules=source.system.rules.map(rule=>("text"in rule&&typeof rule.text=="string"&&(rule.text=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,rule.text)),recursiveReplaceString(rule,s=>__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,s,"Item")))),itemIsOfType(source,"ancestry","background","class","kit")){const items=source.system.items;for(const entry of Object.values(items))if(entry.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,entry.uuid,"Item"),isObject(entry.items))for(const subentry of Object.values(entry.items))subentry.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,subentry.uuid,"Item")}else if(source.type==="heritage")source.system.ancestry?.uuid&&(source.system.ancestry.uuid=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,source.system.ancestry.uuid,"Item"));else if(source.type==="deity")for(const[key,spell]of Object.entries(source.system.spells))source.system.spells[Number(key)]=__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,spell);const{description}=source.system;description.value??="",description.value=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,description.value),description.value=description.value.replace(/Compendium\.pf2e\.journals\.(?!JournalEntry)/g,"Compendium.pf2e.journals.JournalEntry."),description.gm&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,description.gm)}async updateJournalEntry(source){for(const page of source.pages)page.text.content&&=__privateMethod(this,_replaceUUIDsInLinks,replaceUUIDsInLinks_fn).call(this,page.text.content)}};_replaceUUID=new WeakSet,replaceUUID_fn=__name2(function(uuid,explicitDocType){if(typeof uuid!="string"||!uuid.startsWith("Compendium."))return uuid;const documentType=(()=>{if(explicitDocType)return explicitDocType;if("game"in globalThis){const{collection}=foundry.utils.parseUuid(uuid)??{};return collection instanceof CompendiumCollection?collection.metadata.type??null:null}return null})();if(!documentType)return uuid;const parts=uuid.split(/\.(?! )/);if(parts.length!==4)return uuid;const[head,scope,pack,id]=parts;return`${head}.${scope}.${pack}.${documentType}.${id}`},"#replaceUUID"),_replaceUUIDsInLinks=new WeakSet,replaceUUIDsInLinks_fn=__name2(function(text){return typeof text!="string"?text:Array.from(text.matchAll(/(?<=@UUID\[)[^\]]+(?=\])/g)).reduce((replaced,[link])=>replaced.replace(link,s=>__privateMethod(this,_replaceUUID,replaceUUID_fn).call(this,s)),text)},"#replaceUUIDsInLinks"),__name2(_Migration841V11UUIDFormat,"Migration841V11UUIDFormat"),__publicField(_Migration841V11UUIDFormat,"version",.841);let Migration841V11UUIDFormat=_Migration841V11UUIDFormat;const _Migration842NumifyNumericSettings=class extends MigrationBase{static{__name(this,"_Migration842NumifyNumericSettings")}async migrate(){for(const setting of["staminaVariant","worldClock.timeConvention"]){const value=game.settings.storage.get("world").getItem(`pf2e.${setting}`);value!==null&&typeof value!="number"&&await game.settings.set("pf2e",setting,Number(value))}}};__name2(_Migration842NumifyNumericSettings,"Migration842NumifyNumericSettings"),__publicField(_Migration842NumifyNumericSettings,"version",.842);let Migration842NumifyNumericSettings=_Migration842NumifyNumericSettings;const _Migration843RMArmorCustomModifiers=class extends MigrationBase{static{__name(this,"_Migration843RMArmorCustomModifiers")}async updateActor(source){if(source.type==="character"&&source.system.customModifiers?.armor){const customModifiers=source.system.customModifiers;customModifiers["-=armor"]=null}}};__name2(_Migration843RMArmorCustomModifiers,"Migration843RMArmorCustomModifiers"),__publicField(_Migration843RMArmorCustomModifiers,"version",.843);let Migration843RMArmorCustomModifiers=_Migration843RMArmorCustomModifiers;const _Migration844DeityDomainUUIDs=class extends MigrationBase{static{__name(this,"_Migration844DeityDomainUUIDs")}constructor(){super(...arguments),__privateAdd(this,_updateUUIDs),__privateAdd(this,_idMap,[{oldId:"0cbxczrql4MwAHwV",name:"Glyph Domain",pageId:"9g1dNytABTpmmGkG"},{oldId:"1BU8deh48XZFclWl",name:"Healing Domain",pageId:"A7vErdGAweYsFcW8"},{oldId:"1NHV4ujqoR2JVWpY",name:"Travel Domain",pageId:"bTujFcUut9RX4GCy"},{oldId:"1aoUqGYDrdpnPWio",name:"Family Domain",pageId:"SAnmegCTIqGW9S7S"},{oldId:"41qaGiMit8nDP4xv",name:"Abomination Domain",pageId:"qMS6QepvY7UQQjcr"},{oldId:"6klWznsb0f2bNg3T",name:"Void Domain",pageId:"xLxrtbsj4acqgsyC"},{oldId:"8ITGLquhimrr9CNv",name:"Indulgence Domain",pageId:"GiuzDTtkQAgtGW6n"},{oldId:"8pPvbTMZLIsvCwQk",name:"Darkness Domain",pageId:"CM9ZqWwl7myKn2X1"},{oldId:"9blxcDLIRPWenK5f",name:"Plague Domain",pageId:"hGoWOjdsUz16oJUm"},{oldId:"9tsJg13xeJLGzzGV",name:"Undeath Domain",pageId:"RIlgBuWGfHC1rzYu"},{oldId:"AaY3BmDItGry4oac",name:"Decay Domain",pageId:"cAxBEZsej32riaY5"},{oldId:"B40VxP6oZ0mIR4PS",name:"Fate Domain",pageId:"EC2eB0JglDG5j1gT"},{oldId:"BlovCvjhk4Ag07w2",name:"Dreams Domain",pageId:"0wCEUwABKPdKPj8e"},{oldId:"FJ9D4qpeRhJvjHai",name:"Star Domain",pageId:"6bDpXy7pQdGrd2og"},{oldId:"HYe7Yv1fYUANVVI3",name:"Death Domain",pageId:"798PFdS8FmefcOl0"},{oldId:"HpZ4NQIqBRcFihyE",name:"Wealth Domain",pageId:"mJBp4KIszuqrmnp5"},{oldId:"J7K7kHoIE69558Su",name:"Freedom Domain",pageId:"5MjSsuKOLBoiL8FB"},{oldId:"KXFxeEyD6MmJ3a6V",name:"Naga Domain",pageId:"QzsUe3Rt3SifTQvb"},{oldId:"KzuJAIWdjwoPjHkc",name:"Secrecy Domain",pageId:"S1gyomjojgtCdxc3"},{oldId:"M7koZH0zimcMgRDb",name:"Destruction Domain",pageId:"AOQZjqgfafqqtHOB"},{oldId:"MRHDhBQvgJhDZ1zq",name:"Cities Domain",pageId:"QSk78hQR3zskMlq2"},{oldId:"MktBsoHR9HsKrbbr",name:"Zeal Domain",pageId:"DI3MYGIK8iEycanU"},{oldId:"NA4v0iwIPgkde8DP",name:"Ambition Domain",pageId:"yaMJsfYZmWJLqbFE"},{oldId:"NEI4MDBGNjEtOEIy",name:"Introspection Domain",pageId:"qjnUXickBOBDBu2N"},{oldId:"O1qeC0mIufSf3wv5",name:"Passion Domain",pageId:"ajCEExOaxuB4C1tY"},{oldId:"OsM8NfP408uB6yTi",name:"Wyrmkin Domain",pageId:"nuywscaiVGXLQpZ1"},{oldId:"PrFvU65ewfst69Mp",name:"Water Domain",pageId:"U8WVR6EDfmUaMCbu"},{oldId:"TpFgfwcWrfT8zVMP",name:"Pain Domain",pageId:"FtW1gtbHgO0KofPl"},{oldId:"WrmaTmOHojfhiENF",name:"Truth Domain",pageId:"lgsJz7mZ1OTe340e"},{oldId:"X7MkBRJGUIp91k6f",name:"Sorrow Domain",pageId:"5TqEbLR9QT3gJGe3"},{oldId:"Xs6XznYHOZyQ0hJl",name:"Tyranny Domain",pageId:"T0JHj79aGphlZ4Mt"},{oldId:"Y2kOBQydrsSqGCyn",name:"Magic Domain",pageId:"DS95vr2zmTsjsMhU"},{oldId:"YQ6IT8DgEpqvOREx",name:"Might Domain",pageId:"MOVMHZU1SfkhNN1K"},{oldId:"ZAx1RUB376BjNdlF",name:"Repose Domain",pageId:"CbsAiY68e8n5vVVN"},{oldId:"Ze2hoTyOQHbaQ6jD",name:"Air Domain",pageId:"T2y0vuYibZCL7CH0"},{oldId:"ZyFTUCbA0zYrzynD",name:"Creation Domain",pageId:"ydbCjJ9PPmRzZhDN"},{oldId:"a0fe0kFowMMwUFZa",name:"Nightmares Domain",pageId:"R20JXF43vU5RQyUj"},{oldId:"c9odhpRoKId5dXmn",name:"Perfection Domain",pageId:"Czi3XXuNOSE7ISpd"},{oldId:"dnljU1twPjH4KFgO",name:"Swarm Domain",pageId:"rd0jQwvTK4jpv95o"},{oldId:"fVfFKKvGocG2JM5q",name:"Toil Domain",pageId:"EQfZepZX6rxxBRqG"},{oldId:"fqr2OnTww3bAq0ae",name:"Sun Domain",pageId:"CkBvj5y1lAm1jnsc"},{oldId:"giUsAWI9NbpdeUzl",name:"Knowledge Domain",pageId:"0GwpYEjCHWyfQvgg"},{oldId:"i4UU3qCjIMwejIQF",name:"Delirium Domain",pageId:"tuThzOCvMLbRVba8"},{oldId:"jWmGQxJvKh5y5zfB",name:"Protection Domain",pageId:"Dx47K8wpx8KZUa9S"},{oldId:"l2EFJssJKu7rG77m",name:"Luck Domain",pageId:"L11XsA5G89xVKlDw"},{oldId:"mBvjWSvg7UYdS9TL",name:"Moon Domain",pageId:"Y3DFBCWiM9GBIlfl"},{oldId:"p5Q5RGl1lKgs5DZZ",name:"Soul Domain",pageId:"rtobUemb6vF2Yu3Y"},{oldId:"rIDXRIdb9m2E3qC6",name:"Earth Domain",pageId:"zkiLWWYzzqoxmN2J"},{oldId:"rIZ7OoG8c4Cct42M",name:"Vigil Domain",pageId:"StXN6IHR6evRaeXF"},{oldId:"udASTZy5jJWFCt5w",name:"Time Domain",pageId:"3P0NWwP3s7bIiidH"},{oldId:"unN0otycQZanf3va",name:"Duty Domain",pageId:"uGQKjk2w4whzomky"},{oldId:"uy8GUGIOmEUNqIhH",name:"Trickery Domain",pageId:"xJtbGqoz3BcCjUik"},{oldId:"v4SDXgCuPdZqhMeL",name:"Fire Domain",pageId:"egSErNozlL3HRK1y"},{oldId:"wCPGej4ZwdKCNtym",name:"Change Domain",pageId:"7xrNAgAnBqBgE3yM"},{oldId:"wPtGuF1bh4wvKE6Q",name:"Confidence Domain",pageId:"flmxRzGxN2rRNyxZ"},{oldId:"xYx8UD0JnFyBHGhJ",name:"Nature Domain",pageId:"wBhgIgt47v9uspp3"},{oldId:"y3TTKFLPbP09HZUW",name:"Cold Domain",pageId:"jq9O1tl76g2AzLOh"},{oldId:"ywn4ODaUt382Z3Nz",name:"Lightning Domain",pageId:"Kca7UPuMm44tOo9n"},{oldId:"zec5N7EnDJANGHmy",name:"Dust Domain",pageId:"6qTjtFWaBO5b60zJ"}])}async updateActor(source){source.type==="npc"&&(source.system.details.publicNotes&&=__privateMethod(this,_updateUUIDs,updateUUIDs_fn).call(this,source.system.details.publicNotes))}async updateItem(source){source.system.description.gm&&=__privateMethod(this,_updateUUIDs,updateUUIDs_fn).call(this,source.system.description.gm),source.system.description.value&&=__privateMethod(this,_updateUUIDs,updateUUIDs_fn).call(this,source.system.description.value)}};_updateUUIDs=new WeakSet,updateUUIDs_fn=__name2(function(text){return __privateGet(this,_idMap).reduce((oldText,data)=>{const pattern=new RegExp(String.raw`\bCompendium\.pf2e\.domains\.(?:JournalEntry?\.)?(?:${data.oldId}|${data.name})\](?:\{[^}]+})?`,"g");return oldText.replace(pattern,`Compendium.pf2e.journals.JournalEntry.EEZvDB1Z7ezwaxIr.JournalEntryPage.${data.pageId}]{${data.name}}`)},text)},"#updateUUIDs"),_idMap=new WeakMap,__name2(_Migration844DeityDomainUUIDs,"Migration844DeityDomainUUIDs"),__publicField(_Migration844DeityDomainUUIDs,"version",.844);let Migration844DeityDomainUUIDs=_Migration844DeityDomainUUIDs;const _Migration845EmptySpellConsumables=class extends MigrationBase{static{__name(this,"_Migration845EmptySpellConsumables")}async preUpdateItem(source){if(source.type==="consumable"){const spell=source.system.spell;isObject(spell)&&!["_id","name","type","system"].every(p=>p in spell)&&(source.system.spell=null)}}};__name2(_Migration845EmptySpellConsumables,"Migration845EmptySpellConsumables"),__publicField(_Migration845EmptySpellConsumables,"version",.845);let Migration845EmptySpellConsumables=_Migration845EmptySpellConsumables;const _Migration846SpellSchoolOptional=class extends MigrationBase{static{__name(this,"_Migration846SpellSchoolOptional")}async updateItem(source){if(source.type!=="spell")return;const system=source.system;system.school&&(source.system.traits.value=uniq(compact([...source.system.traits.value,system.school.value])),system["-=school"]=null,delete system.school)}};__name2(_Migration846SpellSchoolOptional,"Migration846SpellSchoolOptional"),__publicField(_Migration846SpellSchoolOptional,"version",.846);let Migration846SpellSchoolOptional=_Migration846SpellSchoolOptional;const _Migration847TempHPRuleEvents=class extends MigrationBase{static{__name(this,"_Migration847TempHPRuleEvents")}async updateItem(source){const rules=source.system.rules.filter(r=>r.key==="TempHP");for(const rule of rules)rule.onCreate!==void 0&&(rule.events??={},rule.events.onCreate=rule.onCreate,delete rule.onCreate),rule.onTurnStart!==void 0&&(rule.events??={},rule.events.onTurnStart=rule.onTurnStart,delete rule.onTurnStart)}};__name2(_Migration847TempHPRuleEvents,"Migration847TempHPRuleEvents"),__publicField(_Migration847TempHPRuleEvents,"version",.847);let Migration847TempHPRuleEvents=_Migration847TempHPRuleEvents;const _Migration848NumericArmorProperties=class extends MigrationBase{static{__name(this,"_Migration848NumericArmorProperties")}constructor(){super(...arguments),__privateAdd(this,_oldToNew,[["armor","acBonus"],["dex","dexCap"],["check","checkPenalty"],["speed","speedPenalty"],["strength","strength"]])}async updateItem(source){if(source.type==="armor")for(const[oldKey,newKey]of __privateGet(this,_oldToNew)){const oldProperty=source.system[oldKey],newProperty=isObject(source.system[newKey])?0:source.system[newKey]??0;if(isObject(oldProperty)&&newProperty===0)if(delete source.system[oldKey],oldKey==="strength"){const value=Number(oldProperty.value)||null;source.system[newKey]=value===null?null:Math.max(Math.floor((value-10)/2),0)}else tupleHasValue(["checkPenalty","speedPenalty"],newKey)?(source.system[newKey]=Number(oldProperty.value)||null,source.system[`-=${oldKey}`]=null):(source.system[newKey]=Number(oldProperty.value)||0,source.system[`-=${oldKey}`]=null)}}};_oldToNew=new WeakMap,__name2(_Migration848NumericArmorProperties,"Migration848NumericArmorProperties"),__publicField(_Migration848NumericArmorProperties,"version",.848);let Migration848NumericArmorProperties=_Migration848NumericArmorProperties;const _Migration849DeleteBrokenThreshold=class extends MigrationBase{static{__name(this,"_Migration849DeleteBrokenThreshold")}async updateItem(source){const hitPoints="hp"in source.system&&isObject(source.system.hp)?source.system.hp:null;isObject(hitPoints)&&"brokenThreshold"in hitPoints&&(delete hitPoints.brokenThreshold,hitPoints["-=brokenThreshold"]=null)}};__name2(_Migration849DeleteBrokenThreshold,"Migration849DeleteBrokenThreshold"),__publicField(_Migration849DeleteBrokenThreshold,"version",.849);let Migration849DeleteBrokenThreshold=_Migration849DeleteBrokenThreshold;const _Migration850FlatFootedToOffGuard=class extends MigrationBase{static{__name(this,"_Migration850FlatFootedToOffGuard")}constructor(){super(...arguments),__privateAdd(this,_replace),__privateAdd(this,_oldNamePattern,new RegExp(/\bFlat-Footed\b/g)),__privateAdd(this,_newName,"Off-Guard"),__privateAdd(this,_imgPattern,/(?<=systems\/pf2e\/icons\/conditions(?:-2)?\/)flat-?footed.webp$/i),__privateAdd(this,_aToAnUUIDPatern,/\ba(?= @UUID\[Compendium\.pf2e\.conditionitems\.Item\.(?:Flat-Footed|AJh5ex99aV6VTggg)\])/g)}async updateActor(source){source.type==="hazard"&&(source.system.details.routine&&=__privateMethod(this,_replace,replace_fn).call(this,source.system.details.routine)),"attributes"in source.system&&isObject$1(source.system.attributes)&&"immunities"in source.system.attributes&&(source.system.attributes.immunities=recursiveReplaceString(source.system.attributes.immunities,s=>__privateMethod(this,_replace,replace_fn).call(this,s)))}async updateItem(source){source.name=source.name.replace(__privateGet(this,_oldNamePattern),__privateGet(this,_newName)),source.img=source.img.replace(__privateGet(this,_imgPattern),"off-guard.webp"),source.system=recursiveReplaceString(source.system,s=>__privateMethod(this,_replace,replace_fn).call(this,s))}async updateJournalEntry(source){source.name!=="Remaster Changes"&&(source.name=source.name.replace(__privateGet(this,_oldNamePattern),__privateGet(this,_newName)),"img"in source&&typeof source.img=="string"&&(source.img=source.img.replace(__privateGet(this,_imgPattern),"off-guard.webp")),source.pages=recursiveReplaceString(source.pages,s=>__privateMethod(this,_replace,replace_fn).call(this,s)),"content"in source&&typeof source.content=="string"&&(source.content=__privateMethod(this,_replace,replace_fn).call(this,source.content)))}};_oldNamePattern=new WeakMap,_newName=new WeakMap,_imgPattern=new WeakMap,_aToAnUUIDPatern=new WeakMap,_replace=new WeakSet,replace_fn=__name2(function(text){return text.replace(__privateGet(this,_imgPattern),"off-guard.webp").replace(/^flat-footed$/,"off-guard").replace(/(?<=[:.])flat-footed\b/g,"off-guard").replace(/\.Flat-Footed\b/g,".Off-Guard").replace(/\bFlatFooted\b/g,"OffGuard").replace(/\.flatFootable\b/g,".offGuardable").replace(__privateGet(this,_oldNamePattern),"Off-Guard").replace(/\bflatfooted\b/g,"flat-footed").replace(/\ba flat-footed\b/g,"an off-guard").replace(__privateGet(this,_aToAnUUIDPatern),"an").replace(/\bFlat-footed\b/g,"Off-guard").replace(/\bflat-footed\b/g,"off-guard")},"#replace"),__name2(_Migration850FlatFootedToOffGuard,"Migration850FlatFootedToOffGuard"),__publicField(_Migration850FlatFootedToOffGuard,"version",.85);let Migration850FlatFootedToOffGuard=_Migration850FlatFootedToOffGuard;const _Migration851JustInnovationId=class extends MigrationBase{static{__name(this,"_Migration851JustInnovationId")}async updateItem(source){if(source.type!=="feat")return;source.system.rules=source.system.rules.map(r=>recursiveReplaceString(r,s=>s.replace("flags.pf2e.armorInnovationId","flags.pf2e.innovationId")));const hasAELike=source.system.rules.some(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.innovationId");if(source.system.slug==="weapon-innovation"&&!hasAELike){const reSource={key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.innovationId",value:"{item|flags.pf2e.itemGrants.weaponInnovation.id}"};source.system.rules.push(reSource)}else if(source.system.slug==="construct-innovation"&&!hasAELike){const reSource={key:"ActiveEffectLike",mode:"override",path:"flags.pf2e.innovationId",value:null};source.system.rules.push(reSource)}else if(source.system.slug==="inventor-weapon-expertise"&&!source.system.rules.some(r=>r.key==="CriticalSpecialization")){const reSource={key:"CriticalSpecialization",predicate:["feature:weapon-innovation","item:id:{actor|flags.pf2e.innovationId}"]};source.system.rules.push(reSource)}}};__name2(_Migration851JustInnovationId,"Migration851JustInnovationId"),__publicField(_Migration851JustInnovationId,"version",.851);let Migration851JustInnovationId=_Migration851JustInnovationId;const _Migration852AbilityScoresToModifiers=class extends MigrationBase{static{__name(this,"_Migration852AbilityScoresToModifiers")}async updateActor(source){if(source.type!=="character")return;if(source.system.abilities&&Object.keys(source.system.abilities).length>0){const abilityObjects=Object.values(source.system.abilities);for(const data of abilityObjects)typeof data.value=="number"&&(data.mod=Math.min(Math.max(Math.trunc((data.value-10)/2),-5),10)||0,delete data.value,data["-=value"]=null)}else if(source.system.abilities){const systemData=source.system;delete systemData.abilities,systemData["-=abilities"]=null}const build=source.system.build??{};build.abilities&&(build.attributes=build.abilities,delete build.abilities,build["-=abilities"]=null)}async updateItem(source){const apexRules=source.system.rules.filter(r=>r.key==="ActiveEffectLike"&&typeof r.path=="string"&&/^system\.abilities\..+\.value$/.test(r.path)&&typeof r.value=="number");for(const rule of apexRules)switch(rule.path=rule.path.replace(/\.value$/,".mod"),rule.mode){case"add":case"remove":case"subtract":rule.value=Math.min(Math.max(Math.trunc(rule.value/2),-5),10)||0;break;case"downgrade":case"override":case"upgrade":rule.value=Math.min(Math.max(Math.trunc((rule.value-10)/2),-5),10)||0;break}const otherRules=source.system.rules.filter(r=>"value"in r&&typeof r.value=="string"&&/\.abilities\.[a-z]{3}\.value\b/.test(r.value));for(const rule of otherRules)rule.value=rule.value.replace(/(?:floor\()?\(?@actor.abilities.([a-z]{3})\.value ?- ?10\) ?\/ ?2\)?/,"@actor.abilities.$1.mod").replace(/\s+/g," ").trim();if(source.system.slug==="thaumaturges-investiture"){source.system.rules=source.system.rules.filter(r=>r.key!=="ActiveEffectLike");const bracketedAELike={key:"ActiveEffectLike",mode:"upgrade",path:"system.resources.investiture.max",value:{brackets:[{end:4,start:4,value:14},{end:5,start:5,value:16},{end:6,start:6,value:18},{start:7,value:20}],field:"system.abilities.cha.mod"}};source.system.rules.push(bracketedAELike)}}};__name2(_Migration852AbilityScoresToModifiers,"Migration852AbilityScoresToModifiers"),__publicField(_Migration852AbilityScoresToModifiers,"version",.852);let Migration852AbilityScoresToModifiers=_Migration852AbilityScoresToModifiers;const _Migration853RemasterLanguages=class extends MigrationBase{static{__name(this,"_Migration853RemasterLanguages")}constructor(){super(...arguments),__privateAdd(this,_OLD_TO_NEW_LANGUAGES,new Map([["aquan","thalassic"],["auran","sussuran"],["ignan","pyric"],["sylvan","fey"],["terran","petran"]]))}async updateActor(source){const languages=source.system.traits?.languages??{};languages?.value&&(languages.value=languages.value.map(l=>__privateGet(this,_OLD_TO_NEW_LANGUAGES).get(l)??l).sort())}async updateItem(source){source.system=recursiveReplaceString(source.system,s=>__privateGet(this,_OLD_TO_NEW_LANGUAGES).get(s)??s),source.type==="ancestry"&&Array.isArray(source.system.additionalLanguages?.value)&&source.system.additionalLanguages.value.sort()}};_OLD_TO_NEW_LANGUAGES=new WeakMap,__name2(_Migration853RemasterLanguages,"Migration853RemasterLanguages"),__publicField(_Migration853RemasterLanguages,"version",.853);let Migration853RemasterLanguages=_Migration853RemasterLanguages;const _Migration854BracketedAbilityScoresToModifiers=class extends MigrationBase{static{__name(this,"_Migration854BracketedAbilityScoresToModifiers")}async updateItem(source){const aeLikes=source.system.rules.filter(r=>r.key==="ActiveEffectLike"&&typeof r.path=="string"&&/^system\.abilities\..+\.value$/.test(r.path)&&isObject(r.value)&&typeof r.value.field=="string"&&/^actor\|system\.abilities\.[a-z]{3}\.value$/.test(r.value.field)&&Array.isArray(r.value.brackets)&&r.value.brackets.every(b=>isObject(b)&&typeof b.value=="number"));for(const aeLike of aeLikes){aeLike.path=aeLike.path.replace(/\.value$/,".mod"),aeLike.value.field&&=aeLike.value.field.replace(/\.value$/,".mod");for(const bracket of aeLike.value.brackets)typeof bracket.start=="number"&&(bracket.start=Math.trunc((bracket.start-10)/2)),typeof bracket.end=="number"&&(bracket.end=Math.trunc((bracket.end-10)/2)),bracket.value=bracket.value/2}}};__name2(_Migration854BracketedAbilityScoresToModifiers,"Migration854BracketedAbilityScoresToModifiers"),__publicField(_Migration854BracketedAbilityScoresToModifiers,"version",.854);let Migration854BracketedAbilityScoresToModifiers=_Migration854BracketedAbilityScoresToModifiers;const _Migration855ApexEquipmentSystemData=class extends MigrationBase{static{__name(this,"_Migration855ApexEquipmentSystemData")}async updateItem(source){if(source.type!=="equipment"||!source.system.traits.value.includes("apex"))return;const attributeModPattern=/^system\.abilities\.([a-z]{3})\.mod$/,isApexRE=__name2(r=>r.key==="ActiveEffectLike"&&attributeModPattern.test(String(r.path)),"isApexRE"),apexAttribute=source.system.rules.flatMap(r=>isApexRE(r)?attributeModPattern.exec(String(r.path))?.at(1):[]).shift();setHasElement(ATTRIBUTE_ABBREVIATIONS,apexAttribute)&&(source.system.apex??={attribute:apexAttribute},source.system.rules=source.system.rules.filter(r=>!isApexRE(r)))}};__name2(_Migration855ApexEquipmentSystemData,"Migration855ApexEquipmentSystemData"),__publicField(_Migration855ApexEquipmentSystemData,"version",.855);let Migration855ApexEquipmentSystemData=_Migration855ApexEquipmentSystemData;const _Migration856NoSystemDotCustom=class extends MigrationBase{static{__name(this,"_Migration856NoSystemDotCustom")}async updateItem(source){source.system.rules=source.system.rules.map(r=>recursiveReplaceString(r,s=>s.replace(/\bsystem\.custom\.(?:modifiers\.)?([-a-z]+)/,(_match,group1)=>`flags.pf2e.${sluggify(group1,{camel:"dromedary"})}`)))}};__name2(_Migration856NoSystemDotCustom,"Migration856NoSystemDotCustom"),__publicField(_Migration856NoSystemDotCustom,"version",.856);let Migration856NoSystemDotCustom=_Migration856NoSystemDotCustom;const _Migration857WeaponSpecializationRE=class extends MigrationBase{static{__name(this,"_Migration857WeaponSpecializationRE")}async updateItem(source){const slug=source.system.slug??sluggify(source.name);source.type!=="feat"||!slug.includes("weapon-specialization")||slug.includes("eidolon-weapon-specialization")||source.system.rules.some(r=>r.slug==="weapon-specialization")||(slug.includes("greater-weapon-specialization")?source.system.rules.unshift({key:"AdjustModifier",mode:"multiply",relabel:"PF2E.GreaterWeaponSpecialization",selector:"strike-damage",slug:"weapon-specialization",value:2}):source.system.rules.unshift({hideIfDisabled:!0,key:"FlatModifier",label:"PF2E.WeaponSpecialization",predicate:[{gte:["item:proficiency:rank",2]}],selector:"strike-damage",slug:"weapon-specialization",value:2},{key:"AdjustModifier",mode:"upgrade",predicate:["item:proficiency:rank:3"],priority:0,selector:"strike-damage",slug:"weapon-specialization",value:3},{key:"AdjustModifier",mode:"upgrade",predicate:["item:proficiency:rank:4"],priority:0,selector:"strike-damage",slug:"weapon-specialization",value:4}))}};__name2(_Migration857WeaponSpecializationRE,"Migration857WeaponSpecializationRE"),__publicField(_Migration857WeaponSpecializationRE,"version",.857);let Migration857WeaponSpecializationRE=_Migration857WeaponSpecializationRE;const _Migration858FakeWeaponSpecialization=class extends MigrationBase{static{__name(this,"_Migration858FakeWeaponSpecialization")}constructor(){super(...arguments),__privateAdd(this,_testHasOption)}async updateItem(source){if(source.type!=="feat")return;const slug=source.system.slug??sluggify(source.name);slug==="greater-weapon-specialization-barbarian"&&!__privateMethod(this,_testHasOption,testHasOption_fn).call(this,source)?source.system.rules.push({domain:"all",key:"RollOption",option:"feature:greater-weapon-specialization"}):slug==="psychic-weapon-specialization"&&!__privateMethod(this,_testHasOption,testHasOption_fn).call(this,source)&&source.system.rules.push({domain:"all",key:"RollOption",option:"feature:weapon-specialization"})}};_testHasOption=new WeakSet,testHasOption_fn=__name2(function(source){return source.system.rules.some(r=>r.key==="RollOption"&&"option"in r&&["feature:greater-weapon-specialization","feature:weapon-specialization"].includes(String(r.option)))},"#testHasOption"),__name2(_Migration858FakeWeaponSpecialization,"Migration858FakeWeaponSpecialization"),__publicField(_Migration858FakeWeaponSpecialization,"version",.858);let Migration858FakeWeaponSpecialization=_Migration858FakeWeaponSpecialization;const _Migration859MaterialTypeGrade=class extends MigrationBase{static{__name(this,"_Migration859MaterialTypeGrade")}constructor(){super(...arguments),__privateAdd(this,_hasOldMaterialData)}async updateItem(source){if(itemIsOfType(source,"physical")&&__privateMethod(this,_hasOldMaterialData,hasOldMaterialData_fn).call(this,source)){const{preciousMaterial,preciousMaterialGrade}=source.system,type=setHasElement(PRECIOUS_MATERIAL_TYPES,preciousMaterial?.value)?preciousMaterial?.value??null:null,grade=setHasElement(PRECIOUS_MATERIAL_GRADES,preciousMaterialGrade?.value)?preciousMaterialGrade?.value??null:null;source.system.material={type,grade},"game"in globalThis?(source.system["-=preciousMaterial"]=null,source.system["-=preciousMaterialGrade"]=null):(delete source.system.preciousMaterial,delete source.system.preciousMaterialGrade)}}};_hasOldMaterialData=new WeakSet,hasOldMaterialData_fn=__name2(function(source){return"preciousMaterial"in source.system&&isObject(source.system.preciousMaterial)&&"preciousMaterialGrade"in source.system&&isObject(source.system.preciousMaterialGrade)},"#hasOldMaterialData"),__name2(_Migration859MaterialTypeGrade,"Migration859MaterialTypeGrade"),__publicField(_Migration859MaterialTypeGrade,"version",.859);let Migration859MaterialTypeGrade=_Migration859MaterialTypeGrade;const _Migration860RMGroup=class extends MigrationBase{static{__name(this,"_Migration860RMGroup")}async updateItem(source){itemIsOfType(source,"armor","condition","weapon")||!("group"in source.system)||("game"in globalThis?source.system["-=group"]=null:delete source.system.group)}};__name2(_Migration860RMGroup,"Migration860RMGroup"),__publicField(_Migration860RMGroup,"version",.86);let Migration860RMGroup=_Migration860RMGroup;const _Migration861AuraColorsToAppearance=class extends MigrationBase{static{__name(this,"_Migration861AuraColorsToAppearance")}async updateItem(source){const auraREs=source.system.rules.filter(r=>r.key==="Aura"&&"colors"in r&&isObject(r.colors));for(const rule of auraREs)rule.appearance={},typeof rule.colors?.border=="string"&&(rule.appearance.border={color:rule.colors.border}),typeof rule.colors?.fill=="string"&&(rule.appearance.highlight={color:rule.colors.fill}),delete rule.colors}};__name2(_Migration861AuraColorsToAppearance,"Migration861AuraColorsToAppearance"),__publicField(_Migration861AuraColorsToAppearance,"version",.861);let Migration861AuraColorsToAppearance=_Migration861AuraColorsToAppearance;const _Migration862SpecificMagicArmor=class extends MigrationBase{static{__name(this,"_Migration862SpecificMagicArmor")}constructor(){super(...arguments),__privateAdd(this,_resilientRuneValues,new Map([["",0],["resilient",1],["greaterResilient",3],["majorResilient",3]]))}async updateItem(source){if(source.type!=="armor"||source.system.category==="shield")return;switch(source.system.slug){case"power-suit":source.system.baseItem="power-suit";break;case"subterfuge-suit":source.system.baseItem;break;case"clothing-explorers":source.system.slug="explorers-clothing",source.name.endsWith("Clothing (Explorer's)")&&(source.name="Explorer's Clothing")}source.system.slug==="power-suit"&&(source.system.baseItem??="power-suit"),source.system.slug==="subterfuge-suit"&&(source.system.baseItem??="subterfuge-suit");const isMagical=!!(source.system.potencyRune.value||source.system.resiliencyRune.value),hasBaseAndSlug=!!(source.system.baseItem&&source.system.slug);isMagical&&hasBaseAndSlug&&source.system.baseItem!==source.system.slug&&(source.system.specific??={value:!0,material:source.system.material??null,runes:{potency:source.system.potencyRune?.value||1,resilient:__privateGet(this,_resilientRuneValues).get(source.system.resiliencyRune?.value??"")||0}})}};_resilientRuneValues=new WeakMap,__name2(_Migration862SpecificMagicArmor,"Migration862SpecificMagicArmor"),__publicField(_Migration862SpecificMagicArmor,"version",.862);let Migration862SpecificMagicArmor=_Migration862SpecificMagicArmor;const _Migration863FixMisspelledOrganaizationsProperty=class extends MigrationBase{static{__name(this,"_Migration863FixMisspelledOrganaizationsProperty")}async updateActor(source){if(source.type!=="character")return;const biography=source.system.details.biography;biography.organaizations!==void 0&&(biography.organizations=biography.organaizations,delete biography.organaizations,biography["-=organaizations"]=null)}};__name2(_Migration863FixMisspelledOrganaizationsProperty,"Migration863FixMisspelledOrganaizationsProperty"),__publicField(_Migration863FixMisspelledOrganaizationsProperty,"version",.863);let Migration863FixMisspelledOrganaizationsProperty=_Migration863FixMisspelledOrganaizationsProperty;const _Migration864RemoveWeaponMAP=class extends MigrationBase{static{__name(this,"_Migration864RemoveWeaponMAP")}async updateItem(source){if(source.type==="weapon"&&isObject(source.system.MAP)){const mapValue=-1*Number(source.system.MAP.value);if(mapValue<0&&mapValue!==-5){const rule={key:"MultipleAttackPenalty",selector:"{item|id}-attack",value:mapValue};source.system.rules.push(rule)}"game"in globalThis?source.system["-=MAP"]=null:delete source.system.MAP}}};__name2(_Migration864RemoveWeaponMAP,"Migration864RemoveWeaponMAP"),__publicField(_Migration864RemoveWeaponMAP,"version",.864);let Migration864RemoveWeaponMAP=_Migration864RemoveWeaponMAP;const _Migration865VitalityVoid=class extends MigrationBase{static{__name(this,"_Migration865VitalityVoid")}constructor(){super(...arguments),__privateAdd(this,_replaceStrings)}async updateActor(source){source.system=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.system),source.flags=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.flags)}async updateItem(source){source.system=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.system),source.flags=__privateMethod(this,_replaceStrings,replaceStrings_fn).call(this,source.flags)}};_replaceStrings=new WeakSet,replaceStrings_fn=__name2(function(data){return recursiveReplaceString(data,s=>s.replace(/^positive$/,"vitality").replace(/^negative$/,"void").replace(/^versatile-positive$/,"versatile-vitality").replace(/^versatile-negative$/,"versatile-void").replace(/\bpositive\]/g,"vitality]").replace(/\bnegative\]/g,"void]").replace(/\[positive\b/g,"[vitality").replace(/\[negative\b/g,"[void").replace(/\bRollFlavor\.positive\b/g,"RollFlavor.vitality").replace(/\bRollFlavor\.negative\b/g,"RollFlavor.void").replace(/\bTraitPositive\b/g,"TraitVitality").replace(/\bTraitNegative\b/g,"TraitVoid").replace(/\bTraitVersatilePositive\b/g,"TraitVersatileVitality").replace(/\bTraitVersatileNegative\b/g,"TraitVersatileVoid").replace(/\bnegative negative damage\b/,"void damage"))},"#replaceStrings"),__name2(_Migration865VitalityVoid,"Migration865VitalityVoid"),__publicField(_Migration865VitalityVoid,"version",.865);let Migration865VitalityVoid=_Migration865VitalityVoid;const _Migration866LinkToActorSizeAgain=class extends MigrationBase{static{__name(this,"_Migration866LinkToActorSizeAgain")}async updateActor(actorSource){SIZE_LINKABLE_ACTOR_TYPES.has(actorSource.type)||actorSource.prototypeToken.flags.pf2e&&(actorSource.prototypeToken.flags.pf2e.linkToActorSize=!1,actorSource.prototypeToken.flags.pf2e.autoscale=!1)}async updateToken(tokenSource,actor){!actor||SIZE_LINKABLE_ACTOR_TYPES.has(actor.type)||mergeObject(tokenSource.flags,{pf2e:{linkToActorSize:!1,autoscale:!1}})}};__name2(_Migration866LinkToActorSizeAgain,"Migration866LinkToActorSizeAgain"),__publicField(_Migration866LinkToActorSizeAgain,"version",.866);let Migration866LinkToActorSizeAgain=_Migration866LinkToActorSizeAgain;const _Migration867DamageRollDomainFix=class extends MigrationBase{static{__name(this,"_Migration867DamageRollDomainFix")}async updateItem(source){for(const rule of source.system.rules??[])"domain"in rule&&rule.domain==="damage-roll"&&(rule.domain="damage")}};__name2(_Migration867DamageRollDomainFix,"Migration867DamageRollDomainFix"),__publicField(_Migration867DamageRollDomainFix,"version",.867);let Migration867DamageRollDomainFix=_Migration867DamageRollDomainFix;const _Migration868StrikeRERange=class extends MigrationBase{static{__name(this,"_Migration868StrikeRERange")}async updateItem(source){const strikeREs=source.system.rules.filter(r=>r.key==="Strike");for(const rule of strikeREs)typeof rule.maxRange=="number"&&rule.range!==rule.maxRange/6?rule.range={max:rule.maxRange}:typeof rule.range=="number"&&(rule.range={increment:rule.range}),delete rule.maxRange}};__name2(_Migration868StrikeRERange,"Migration868StrikeRERange"),__publicField(_Migration868StrikeRERange,"version",.868);let Migration868StrikeRERange=_Migration868StrikeRERange;const _Migration869RefreshMightyBulwark=class extends MigrationBase{static{__name(this,"_Migration869RefreshMightyBulwark")}constructor(){super(...arguments),__privateAdd(this,_mightyBulwarkRules)}async updateItem(source){if(source.type==="feat"&&source.system.slug==="mighty-bulwark")source.system.rules=__privateGet(this,_mightyBulwarkRules,mightyBulwarkRules_get);else for(const rule of source.system.rules)"option"in rule&&rule.option==="self:armor:strength-requirement-met"&&(rule.option="armor:strength-requirement-met")}};_mightyBulwarkRules=new WeakSet,mightyBulwarkRules_get=__name2(function(){return[{key:"FlatModifier",predicate:["armor:trait:bulwark"],selector:"reflex",value:4},{key:"AdjustModifier",predicate:["armor:trait:bulwark"],selector:"reflex",slug:"dex",suppress:!0},{key:"AdjustModifier",selector:"reflex",slug:"bulwark",suppress:!0}]},"#mightyBulwarkRules"),__name2(_Migration869RefreshMightyBulwark,"Migration869RefreshMightyBulwark"),__publicField(_Migration869RefreshMightyBulwark,"version",.869);let Migration869RefreshMightyBulwark=_Migration869RefreshMightyBulwark;const _Migration870MartialToProficiencies=class extends MigrationBase{static{__name(this,"_Migration870MartialToProficiencies")}constructor(){super(...arguments),__privateAdd(this,_defensePathPattern,new RegExp(String.raw`system\.martial\.(?:${Array.from(ARMOR_CATEGORIES).join("|")})\.`))}async updateActor(source){if(source.type!=="character")return;const systemSource=source.system,oldData=isObject(systemSource.martial)&&Object.keys(systemSource.martial).length>0?systemSource.martial:{};for(const[key,data]of Object.entries(oldData))!data.rank||["simple","unarmed","unarmored"].includes(key)&&data.rank===1||(systemSource.proficiencies??={},setHasElement(ARMOR_CATEGORIES,key)?(systemSource.proficiencies.defenses??={},systemSource.proficiencies.defenses[key]={rank:data.rank}):(systemSource.proficiencies.attacks??={},systemSource.proficiencies.attacks[key]={custom:data.custom,rank:data.rank}));"game"in globalThis&&"martial"in systemSource?systemSource["-=martial"]=null:delete systemSource.martial}async updateItem(source){source.system.rules=source.system.rules.map(r=>recursiveReplaceString(r,text=>{const key=__privateGet(this,_defensePathPattern).test(text)?"defenses":"attacks";return text.replace(/\bsystem\.martial\./g,`system.proficiencies.${key}.`)}))}};_defensePathPattern=new WeakMap,__name2(_Migration870MartialToProficiencies,"Migration870MartialToProficiencies"),__publicField(_Migration870MartialToProficiencies,"version",.87);let Migration870MartialToProficiencies=_Migration870MartialToProficiencies;const _Migration871MigrateRollActionMacroParams=class extends MigrationBase{static{__name(this,"_Migration871MigrateRollActionMacroParams")}async updateMacro(source){if(source.type!=="script")return;const matches=source.command.matchAll(/game\.pf2e\.rollActionMacro\("(.+)".*"(.+)"\)/gm);for(const match of matches){if(match.length<3)continue;const[current,itemId,slug]=match;source.command=source.command.replace(current,`game.pf2e.rollActionMacro({ itemId: "${itemId}", slug: "${slug}" })`)}}};__name2(_Migration871MigrateRollActionMacroParams,"Migration871MigrateRollActionMacroParams"),__publicField(_Migration871MigrateRollActionMacroParams,"version",.871);let Migration871MigrateRollActionMacroParams=_Migration871MigrateRollActionMacroParams;const _Migration872MoveSchemaProperty=class extends MigrationBase{static{__name(this,"_Migration872MoveSchemaProperty")}constructor(){super(...arguments),__privateAdd(this,_mvSchema)}async updateActor(source){__privateMethod(this,_mvSchema,mvSchema_fn).call(this,source.system)}async updateItem(source){__privateMethod(this,_mvSchema,mvSchema_fn).call(this,source.system)}};_mvSchema=new WeakSet,mvSchema_fn=__name2(function(systemData){const migrations=systemData._migration??={version:null,previous:null};"schema"in systemData&&(systemData["-=schema"]=null,isObject(systemData.schema)&&typeof systemData.schema.version=="number"&&(migrations.version=systemData.schema.version))},"#mvSchema"),__name2(_Migration872MoveSchemaProperty,"Migration872MoveSchemaProperty"),__publicField(_Migration872MoveSchemaProperty,"version",.872);let Migration872MoveSchemaProperty=_Migration872MoveSchemaProperty;const _Migration873RemoveBonusBulkLimit=class extends MigrationBase{static{__name(this,"_Migration873RemoveBonusBulkLimit")}async updateActor(source){if(source.type!=="character"&&source.type!=="npc")return;const data=source.system;"bonusLimitBulk"in data.attributes&&(delete data.attributes.bonusLimitBulk,data.attributes["-=bonusLimitBulk"]=null),"bonusEncumbranceBulk"in data.attributes&&(delete data.attributes.bonusEncumbranceBulk,data.attributes["-=bonusEncumbranceBulk"]=null)}async updateItem(source){source.system.rules=recursiveReplaceString(source.system.rules,text=>text.replace(/^system\.attributes\.bonusEncumbranceBulk$/,"inventory.bulk.encumberedAfterAddend").replace(/^system\.attributes\.bonusLimitBulk$/,"inventory.bulk.maxAddend"))}};__name2(_Migration873RemoveBonusBulkLimit,"Migration873RemoveBonusBulkLimit"),__publicField(_Migration873RemoveBonusBulkLimit,"version",.873);let Migration873RemoveBonusBulkLimit=_Migration873RemoveBonusBulkLimit;const _Migration874MoveStaminaStuff=class extends MigrationBase{static{__name(this,"_Migration874MoveStaminaStuff")}async updateActor(source){if(source.type!=="character")return;const variantEnabled="game"in globalThis&&game.settings.storage.get("world").find(s=>s.key==="pf2e.staminaVariant")?.value!=='"0"'&&game.settings.get("pf2e","staminaVariant"),systemSource=source.system;if(isObject(systemSource.attributes.sp)){const value=Math.floor(Number(systemSource.attributes.sp.value))||0;value>0&&variantEnabled&&(systemSource.attributes.hp.sp={value}),delete systemSource.attributes.sp,systemSource.attributes["-=sp"]=null}if(isObject(systemSource.attributes.resolve)){const value=Math.floor(Number(systemSource.attributes.resolve.value))||0;value>0&&variantEnabled&&(systemSource.resources.resolve={value}),delete systemSource.attributes.resolve,systemSource.attributes["-=resolve"]=null}}async updateItem(source){source.system.rules=recursiveReplaceString(source.system.rules,text=>text.replace(/^system\.attributes\.sp\.max$/,"system.attributes.hp.sp.max").replace(/^system\.attributes\.resolve.max$/,"system.resources.resolve.max"))}async migrate(){const staminaVariant=game.settings.storage.get("world").find(s=>s.key==="pf2e.staminaVariant");["1",'"1"'].includes(staminaVariant?._source.value??"")?await game.settings.set("pf2e","staminaVariant",!0):staminaVariant&&await game.settings.set("pf2e","staminaVariant",!1),game.settings.storage.get("world").find(s=>s.key==="pf2e.proficiencyVariant")?._source.value==='"ProficiencyWithoutLevel"'?await game.settings.set("pf2e","proficiencyVariant",!0):staminaVariant&&await game.settings.set("pf2e","proficiencyVariant",!1)}};__name2(_Migration874MoveStaminaStuff,"Migration874MoveStaminaStuff"),__publicField(_Migration874MoveStaminaStuff,"version",.874);let Migration874MoveStaminaStuff=_Migration874MoveStaminaStuff;const _Migration875SetInnovationIdEarly=class extends MigrationBase{static{__name(this,"_Migration875SetInnovationIdEarly")}async updateItem(source){if(source.type!=="feat"||!["armor-innovation","weapon-innovation"].includes(source.system.slug??""))return;const aeLike=source.system.rules.find(r=>r.key==="ActiveEffectLike"&&r.path==="flags.pf2e.innovationId");aeLike&&(aeLike.priority=5)}};__name2(_Migration875SetInnovationIdEarly,"Migration875SetInnovationIdEarly"),__publicField(_Migration875SetInnovationIdEarly,"version",.875);let Migration875SetInnovationIdEarly=_Migration875SetInnovationIdEarly;const _Migration876FeatLevelTaken=class extends MigrationBase{static{__name(this,"_Migration876FeatLevelTaken")}async updateItem(source,actorSource){if(source.type!=="feat"||!setHasElement(FEAT_CATEGORIES,source.system.category))return;const location=source.system.location??"",background=actorSource?.items.find(i=>i.type==="background");if(location===background?._id)source.system.level.taken=1;else{const levelString=/^.+-(\d+)$/.exec(location)?.[1]??"NaN";levelString&&(source.system.level.taken=Number(levelString)||void 0)}const{category,traits}=source.system;category==="skill"&&!traits.value.includes("skill")?traits.value.push("skill"):category==="general"&&!traits.value.includes("general")&&traits.value.push("general"),traits.value.sort()}};__name2(_Migration876FeatLevelTaken,"Migration876FeatLevelTaken"),__publicField(_Migration876FeatLevelTaken,"version",.876);let Migration876FeatLevelTaken=_Migration876FeatLevelTaken;const _Migration877PublicationData=class extends MigrationBase{static{__name(this,"_Migration877PublicationData")}constructor(){super(...arguments),__privateAdd(this,_setPublicationData)}async updateActor(source){source.type!=="hazard"&&source.type!=="npc"&&source.type!=="vehicle"||(source.type==="vehicle"&&isObject$1(source.system.source)?(__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,source.system.source),"game"in globalThis?source.system["-=source"]=null:delete source.system.source):(source.type==="hazard"||source.type==="npc")&&isObject$1(source.system.details.source)&&(__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,source.system.details.source),"game"in globalThis?source.system.details["-=source"]=null:delete source.system.details.source))}async updateItem(source){if("details"in source.system&&isObject$1(source.system.details)){const oldDataInWrongPlace=source.system.details.source;isObject$1(oldDataInWrongPlace)&&typeof oldDataInWrongPlace.value=="string"&&(source.system.source={value:oldDataInWrongPlace.value.trim()}),"game"in globalThis?source.system["-=details"]=null:delete source.system.details}isObject$1(source.system.source)?(__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,source.system.source),"game"in globalThis?source.system["-=source"]=null:delete source.system.source):!source.system.publication&&!("game"in globalThis)&&__privateMethod(this,_setPublicationData,setPublicationData_fn).call(this,source.system,{})}};_setPublicationData=new WeakSet,setPublicationData_fn=__name2(function(systemSource,oldData){const title=typeof oldData.value=="string"?oldData.value.trim():"",authors=typeof oldData.author=="string"?oldData.author.trim():"",license=title==="Pathfinder Player Core"?"ORC":"OGL",remaster=["Pathfinder Player Core","Pathfinder Rage of Elements"].includes(title),publication={title,authors,license,remaster};isObject$1(systemSource.details)?systemSource.details.publication=publication:systemSource.publication=publication},"#setPublicationData"),__name2(_Migration877PublicationData,"Migration877PublicationData"),__publicField(_Migration877PublicationData,"version",.877);let Migration877PublicationData=_Migration877PublicationData;const _Migration878TakeABreather=class extends MigrationBase{static{__name(this,"_Migration878TakeABreather")}async updateMacro(source){source.type==="script"&&source.command.includes("console.log(resolve, sp)")&&(source.command="game.pf2e.actions.takeABreather();")}};__name2(_Migration878TakeABreather,"Migration878TakeABreather"),__publicField(_Migration878TakeABreather,"version",.878);let Migration878TakeABreather=_Migration878TakeABreather;const _Migration879DeviseAStratagemAndFriends=class extends MigrationBase{static{__name(this,"_Migration879DeviseAStratagemAndFriends")}async updateItem(source){if(source.type==="action"&&source.system.slug==="devise-a-stratagem"){const rules=[{domain:"all",key:"RollOption",option:"target:mark:devise-a-stratagem",toggleable:"totm"},{ability:"int",key:"FlatModifier",predicate:["class:investigator","target:mark:devise-a-stratagem",{or:["item:trait:agile","item:trait:finesse",{and:["item:ranged",{not:"item:thrown-melee"}]},"item:base:sap"]}],selector:"strike-attack-roll",type:"ability"}];source.system.rules=rules}else if(source.type==="feat"&&source.system.slug==="athletic-strategist"){const rule={ability:"int",key:"FlatModifier",predicate:["class:investigator","target:mark:devise-a-stratagem",{or:["action:disarm","action:grapple","action:shove","action:trip"]},{or:["item:trait:agile","item:trait:finesse",{and:["item:ranged",{not:"item:thrown-melee"}]},"item:base:sap",{and:["feat:takedown-expert","item:group:club","item:hands-held:1"]}]}],selector:"athletics",type:"ability"};source.system.rules=[rule]}else if(source.type==="feat"&&source.system.slug==="ongoing-strategy"){const rule={damageCategory:"precision",key:"FlatModifier",predicate:[["class:investigator",{not:"check:substitution:devise-a-stratagem"},{or:["item:trait:agile","item:trait:finesse",{and:["item:ranged",{not:"item:thrown-melee"}]},"item:base:sap",{and:["feat:takedown-expert","item:group:club","item:hands-held:1"]}]}]],selector:"strike-damage",value:{brackets:[{end:4,value:1},{end:8,start:5,value:2},{end:12,start:9,value:3},{end:16,start:13,value:4},{start:17,value:5}]}};source.system.rules=[rule]}else if(source.type==="feat"&&source.system.slug==="shared-stratagem"){const rule={key:"Note",predicate:["target:mark:devise-a-stratagem"],selector:"strike-attack-roll",text:"PF2E.SpecificRule.Investigator.SharedStratagem.Note",title:"{item|name}",outcome:["success","criticalSuccess"]};source.system.rules=[rule]}else if(source.type==="feat"&&source.system.slug==="takedown-expert"){const rule={ability:"int",key:"FlatModifier",predicate:["class:investigator","target:mark:devise-a-stratagem","item:hands-held:1"],selector:"club-group-attack-roll",type:"ability"};source.system.rules=[rule]}}};__name2(_Migration879DeviseAStratagemAndFriends,"Migration879DeviseAStratagemAndFriends"),__publicField(_Migration879DeviseAStratagemAndFriends,"version",.879);let Migration879DeviseAStratagemAndFriends=_Migration879DeviseAStratagemAndFriends;const _UserPF2e=class extends User{static{__name(this,"_UserPF2e")}prepareData(){super.prepareData(),canvas.ready&&canvas.tokens.controlled.length>0&&game.pf2e.effectPanel.refresh()}prepareBaseData(){super.prepareBaseData(),this.flags=mergeObject({pf2e:{settings:{showEffectPanel:!0,showCheckDialogs:!0,showDamageDialogs:!0,searchPackContents:!1,monochromeDarkvision:!0}}},this.flags)}get settings(){return this.flags.pf2e.settings}clearTargets(){this.updateTokenTargets()}_onUpdate(changed,options,userId){if(super._onUpdate(changed,options,userId),game.user.id!==userId)return;const keys2=Object.keys(flattenObject(changed));keys2.includes("flags.pf2e.settings.showEffectPanel")&&game.pf2e.effectPanel.refresh(),keys2.includes("flags.pf2e.settings.monochromeDarkvision")&&canvas.ready&&(canvas.scene?.reset(),canvas.perception.update({initializeVision:!0,refreshLighting:!0},!0))}};__name2(_UserPF2e,"UserPF2e");let UserPF2e=_UserPF2e;const _Migration880SplitShowDialogsSettings=class extends MigrationBase{static{__name(this,"_Migration880SplitShowDialogsSettings")}async migrate(){const userUpdates=game.users.contents.flatMap(user=>{const userSource=user._source,settings=userSource.flags.pf2e?.settings;return typeof settings?.showRollDialogs=="boolean"?(settings.showCheckDialogs=settings.showRollDialogs,settings.showDamageDialogs=settings.showRollDialogs,settings["-=showRollDialogs"]=null,{_id:user.id,"flags.pf2e":userSource.flags.pf2e??{}}):[]});if(await UserPF2e.updateDocuments(userUpdates),!game.settings.get("pf2e","seenLastStopMessage")){const content=await renderTemplate("systems/pf2e/templates/system/last-stop-message.hbs"),whisper=game.users.contents.flatMap(u=>u.isGM?u.id:[]);ChatMessage.create({content,whisper}),game.settings.set("pf2e","seenLastStopMessage",!0)}}};__name2(_Migration880SplitShowDialogsSettings,"Migration880SplitShowDialogsSettings"),__publicField(_Migration880SplitShowDialogsSettings,"version",.88);let Migration880SplitShowDialogsSettings=_Migration880SplitShowDialogsSettings;const Migrations=Object.freeze(Object.defineProperty({__proto__:null,Migration600Reach,Migration601SplitEffectCompendia,Migration602UpdateDiehardFeat,Migration603ResetQuickRollDefault,Migration604FixClassItem,Migration605CatchUpToTemplateJSON,Migration606SignatureSpells,Migration607MeleeItemDamageRolls,Migration608DeletePersistedKits,Migration609LootActorTraits,Migration610SetHeritageFeatType,Migration611UpdateToughnessMountainsStoutness,Migration612NormalizeRarities,Migration613RemoveAmmoCharges,Migration614NumifyMeleeBonuses,Migration615RemoveInstinctTrait,Migration616MigrateFeatPrerequisites,Migration617FixUserFlags,Migration618MigrateItemImagePaths,Migration619TraditionLowercaseAndRemoveWandScroll,Migration620RenameToWebp,Migration621RemoveConfigSpellSchools,Migration623NumifyPotencyRunes,Migration624RemoveTokenEffectIconFlags,Migration625EnsurePresenceOfSaves,Migration626UpdateSpellCategory,Migration627LowerCaseSpellSaves,Migration629SetBaseItems,Migration630FixTalismanSpelling,Migration631FixSenseRuleElementSelector,Migration632DeleteOrphanedSpells,Migration633DeleteUnidentifiedTraits,Migration634PurgeMartialItems,Migration635NumifyACAndQuantity,Migration636NumifyArmorData,Migration637CleanMeleeItems,Migration638SpellComponents,Migration639NormalizeLevelAndPrice,Migration640CantripsAreNotZeroLevel,Migration641SovereignSteelValue,Migration642TrackSchemaVersion,Migration643HazardLevel,Migration644SpellcastingCategory,Migration645TokenImageSize,Migration646UpdateInlineLinks,Migration647FixPCSenses,Migration648RemoveInvestedProperty,Migration649FocusToActor,Migration650StringifyWeaponProperties,Migration651EphemeralFocusPool,Migration652KillHalcyonTradition,Migration653AEstoREs,Migration654ActionTypeAndCount,Migration655CreatureTokenSizes,Migration656OtherFocusPoolSources,Migration657RemoveSetProperty,Migration658MonkUnarmoredProficiency,Migration659MultipleDamageRows,Migration660DerivedSpellTraits,Migration661NumifyVehicleDimensions,Migration662LinkToActorSizeDefaults,Migration663FixSpellDamage,Migration664DeleteCUBConditions,Migration665HandwrapsCorrections,Migration666UsageAndStowingContainers,Migration667HPSubProperties,Migration668ArmorSpeedPenalty,Migration669NPCAttackEffects,Migration670AncestryVision,Migration670NoCustomTrait,Migration671NoPCItemsOnNonPCs,Migration672RemoveNPCBaseProperties,Migration673RemoveBulwarkREs,Migration674StableHomebrewTagIDs,Migration675FlatModifierAEsToREs,Migration676ReplaceItemsWithRELikeAEs,Migration677RuleValueDataRefs,Migration678SeparateNPCAttackTraits,Migration679TowerShieldSpeedPenalty,Migration680SetWeaponHands,Migration681GiantLanguageToJotun,Migration682BiographyFields,Migration683FlavorTextToPublicNotes,Migration684RationsToConsumable,Migration685FixMeleeUsageTraits,Migration686HeroPointsToResources,Migration687FamiliarityAEsToREs,Migration688ClampSpellLevel,Migration689EncumberanceActiveEffects,Migration690InitiativeTiebreakItems,Migration691WeaponRangeAbilityCategoryGroup,Migration692CraftingEntryFeatReplacement,Migration693ArmorCategoryGroup,Migration694RetireSystemTokenSettings,Migration695SummonToSummoned,Migration696FlatAbilityModifiers,Migration697WeaponReachTrait,Migration698RemoveDerivedActorTraits,Migration699ItemDescriptionEmptyString,Migration700SingleClassFeatures,Migration701ModifierNameToSlug,Migration702REFormulasAtInstanceLevel,Migration703SpellDamageStructure,Migration704MartialProficiencyRE,Migration705GunslingerCatchUp,Migration706FormulasAtInstanceLevelEverythingElse,Migration707BracketedFormulasAtInstanceLevel,Migration708SpecificRuleLabel,Migration709REFormulasAtInstanceLevelRedux,Migration710RarityToString,Migration711HeritageItems,Migration712ActorShieldStructure,Migration713FistToStrikeRE,Migration714RangeIncrementREs,Migration715DangerousSorcery,Migration716StrikeDamageSelector,Migration717TakeFeatLimits,Migration718CarryType,Migration719ShrugFlanking,Migration720UpdateSpellDescriptions,Migration721SetReloadValues,Migration722CraftingSystemData,Migration723CumulativeItemBonuses,Migration724CraftingMaxItemLevel,Migration725QuickClimbREs,Migration726JournalSetting,Migration727TrimSelfRollOptions,Migration728FlattenPhysicalProperties,Migration729CumulativeItemBonusCleanup,Migration730DeruneHandwraps,Migration731TogglePropertyToRollOption,Migration732FixDedicationFeatTypes,Migration733ItemBonusFromEquipment,Migration734SpellLocationPropsAndSignature,Migration735FirearmAmmoAlchemical,Migration736RemoveBrokenThreshold,Migration737NormalizeRuleElementKeys,Migration738UpdateLaughingShadow,Migration739RecoveryCheckDC,Migration740MaxTakable,Migration741RollOptionToggleToItem,Migration742RMAbilityBoostLevels,Migration743FixWeaknessStructure,Migration744MigrateSpellHeighten,Migration745EffectTargetToChoiceSet,Migration746StandardizePricing,Migration747FixedHeightening,Migration748BatchConsumablePricing,Migration749AssuranceREs,Migration750FixCorruptedPrice,Migration751ResetRollOptions,Migration752StrikeVsWeaponTraits,Migration753WeaponReloadTimes,Migration754MightyBulwarkAdjustModifiers,Migration755GrantIdsToData,Migration756RMStoredResourceMaxes,Migration757HillockHalfling,Migration758PrunePCAttributes,Migration759CritSpecRE,Migration760SeparateNoteTitle,Migration761ShotRules,Migration762UpdateBackgroundItems,Migration763RestoreAnimalStrikeOptions,Migration764PanacheVivaciousREs,Migration765ChoiceOwnedItemTypes,Migration766WipeURLSources,Migration767ConvertVoluntaryFlaws,Migration768AddNewAuras,Migration769NoUniversalistFocusPool,Migration770REDataToSystem,Migration771SpellVariantsToSystem,Migration772V10EmbeddedSpellData,Migration773ReligiousSymbolUsage,Migration774UnpersistCraftingEntries,Migration775AgileFinesseRanged,Migration776SlugifyConditionOverrides,Migration777HandOfTheApprentice,Migration778RenameRetiredPackRefs,Migration779EliteWeak,Migration780NumifySpeeds,Migration781SuppressNoCrowbar,Migration782UnnestActorTraits,Migration783RemoveClassSkillAELikes,Migration784CompBrowserPackSetting,Migration785ABCKitItemUUIDs,Migration786RemoveIdentifiedData,Migration787ResolvablesToSystem,Migration788UpdateTanglefootBags,Migration789UpdatePreciseStrike,Migration790MultipleClassDCs,Migration791RuffianHands,Migration792RemoveTokenAELikes,Migration793MakePredicatesArrays,Migration794AddWildShapeChoices,Migration795CleanupFlatFootedToggle,Migration796ItemGrantsToObjects,Migration797MetagameSetting,Migration798WeaponToItemStatements,Migration799RMRecallKnowledgeDuplicates,Migration800SelfEffectPanacheRage,Migration801ColorDarkvision,Migration802StripFeatActionCategory,Migration803NormalizeSpellArea,Migration804RemoveConsumableProperties,Migration805InlineDamageRolls,Migration806TorchImprovisedOtherTags,Migration807RMActivatedEffectFields,Migration808CountDamageDice,Migration809AutomatonEnhancements,Migration810LootDescriptionValue,Migration811InlineDamageRollsPersistent,Migration812RestructureIWR,Migration813NormalizeColdIron,Migration814CalculatedExpandedSplash,Migration815ConsumableDataCleanup,Migration816AlchemistResearchFields,Migration817FieldDiscoveryPredicates,Migration818BasicUndeadNegativeHealing,Migration819SpinTaleAdventureSpecific,Migration820RemoveUnusedTraitsData,Migration821InlineDamageRolls,Migration822BladeAllyConsolidation,Migration823HeritageAncestrySlug,Migration824SneakAttackDamageSource,Migration825KhakkharaFengHuoLun,Migration826GutConditionData,Migration827FixTVShieldTraits,Migration828PruneInvalidTraits,Migration829RMRitualEntries,Migration830BarbarianRework,Migration831ClericDoctrines,Migration832ChoiceSetFlags,Migration833AddRogueToysFixPrecision,Migration834FeatCategories,Migration835InitiativeLongform,Migration836EnergizingConsolidation,Migration837MoveHazardBookSources,Migration838StrikeAttackRollSelector,Migration839ActionCategories,Migration840ArrayWrapPredicates,Migration841V11UUIDFormat,Migration842NumifyNumericSettings,Migration843RMArmorCustomModifiers,Migration844DeityDomainUUIDs,Migration845EmptySpellConsumables,Migration846SpellSchoolOptional,Migration847TempHPRuleEvents,Migration848NumericArmorProperties,Migration849DeleteBrokenThreshold,Migration850FlatFootedToOffGuard,Migration851JustInnovationId,Migration852AbilityScoresToModifiers,Migration853RemasterLanguages,Migration854BracketedAbilityScoresToModifiers,Migration855ApexEquipmentSystemData,Migration856NoSystemDotCustom,Migration857WeaponSpecializationRE,Migration858FakeWeaponSpecialization,Migration859MaterialTypeGrade,Migration860RMGroup,Migration861AuraColorsToAppearance,Migration862SpecificMagicArmor,Migration863FixMisspelledOrganaizationsProperty,Migration864RemoveWeaponMAP,Migration865VitalityVoid,Migration866LinkToActorSizeAgain,Migration867DamageRollDomainFix,Migration868StrikeRERange,Migration869RefreshMightyBulwark,Migration870MartialToProficiencies,Migration871MigrateRollActionMacroParams,Migration872MoveSchemaProperty,Migration873RemoveBonusBulkLimit,Migration874MoveStaminaStuff,Migration875SetInnovationIdEarly,Migration876FeatLevelTaken,Migration877PublicationData,Migration878TakeABreather,Migration879DeviseAStratagemAndFriends,Migration880SplitShowDialogsSettings},Symbol.toStringTag,{value:"Module"})),_MigrationList=class{static{__name(this,"_MigrationList")}static get latestVersion(){return Math.max(...__privateGet(this,_list).map(M=>M.version))}static constructAll(){return __privateGet(this,_list).map(M=>new M)}static constructFromVersion(version){const minVersion=Number(version)||MigrationRunner.RECOMMENDED_SAFE_VERSION;return __privateGet(this,_list).filter(M=>M.version>minVersion).map(M=>new M)}static constructRange(min,max=1/0){return __privateGet(this,_list).filter(M=>M.version>=min&&M.version<=max).map(M=>new M)}};_list=new WeakMap,__name2(_MigrationList,"MigrationList"),__privateAdd(_MigrationList,_list,Object.values(Migrations));let MigrationList=_MigrationList;const _WeaponDamagePF2e=class _WeaponDamagePF2e2{static{__name(this,"_WeaponDamagePF2e")}static async fromNPCAttack({attack,actor,actionTraits:actionTraits2=[],context}){const{baseDamage}=attack,secondaryInstances=Object.values(attack.system.damageRolls).map(this.npcDamageToWeaponDamage).filter(d=>!equals(d,baseDamage)),damageDice=[],modifiers=[],labelFromCategory={null:"",persistent:"",precision:"PF2E.Damage.Precision",splash:"PF2E.WeaponSplashDamageLabel"};for(const instance of secondaryInstances){const{damageType}=instance;instance.dice>0&&instance.die&&damageDice.push(new DamageDicePF2e({slug:"base",label:labelFromCategory[instance.category??"null"],selector:"damage",diceNumber:instance.dice,dieSize:instance.die,damageType:instance.damageType,category:instance.category})),instance.modifier&&modifiers.push(new ModifierPF2e({label:labelFromCategory[instance.category??"null"],modifier:instance.modifier,damageType,damageCategory:instance.category}))}return _WeaponDamagePF2e2.calculate({weapon:attack,actor,damageDice,modifiers,actionTraits:actionTraits2,context})}static async calculate({weapon,actor,damageDice=[],modifiers=[],actionTraits:actionTraits2=[],weaponPotency=null,context}){var _a;const{baseDamage}=weapon,{options}=context,domains=context.domains??[];if(baseDamage.die===null&&baseDamage.modifier>0)baseDamage.dice=0;else if(!weapon.dealsDamage)return null;const weaponTraits2=weapon.system.traits.value,materialTraits=weapon.isOfType("melee")?weapon.system.traits.value.filter(t=>t in CONFIG.PF2E.materialDamageEffects):[];for(const trait of weaponTraits2)options.add(trait);const isMelee=!!weapon.isMelee;if(options.add(isMelee?"melee":"ranged"),actor.isOfType("character","npc")){const strengthModValue=actor.abilities.str.mod,modifierValue=__privateMethod(_a=_WeaponDamagePF2e2,_strengthModToDamage2,strengthModToDamage_fn2).call(_a,weapon,domains.includes("str-damage"))?strengthModValue:weaponTraits2.some(t=>t==="propulsive")?strengthModValue<0?strengthModValue:Math.floor(strengthModValue/2):null;if(weapon.isOfType("weapon")&&typeof modifierValue=="number"){const strModifier=new ModifierPF2e({slug:"str",label:CONFIG.PF2E.abilities.str,ability:"str",modifier:modifierValue,type:"ability",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"str")});modifiers.push(strModifier)}}for(const rule of actor.rules.filter(r=>!r.ignored))rule.beforeRoll?.(domains,options);const splashDamage=weapon.isOfType("weapon")?Number(weapon.system.splashDamage?.value):0;if(splashDamage>0){const modifier=new ModifierPF2e({slug:"splash",label:"PF2E.WeaponSplashDamageLabel",modifier:splashDamage,damageCategory:"splash",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"splash")});modifiers.push(modifier)}if(weapon.isOfType("weapon")){weaponTraits2.includes("kickback")&&modifiers.push(new ModifierPF2e({slug:"kickback",label:CONFIG.PF2E.weaponTraits.kickback,modifier:1,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"kickback")}));const handsHeld=weapon.system.equipped.handsHeld??0,baseDieFaces=Number(baseDamage.die?.replace("d","")??"NaN"),twoHandSize=weaponTraits2.find(t=>t.startsWith("two-hand-"))?.replace("two-hand-",""),twoHandFaces=Number(twoHandSize?.replace("d","")??"NaN");if(handsHeld===2&&setHasElement(DAMAGE_DIE_FACES,twoHandSize)&&twoHandFaces>baseDieFaces&&(baseDamage.die=twoHandSize),weaponTraits2.find(t=>t.startsWith("scatter-"))&&baseDamage.die){const modifier=new ModifierPF2e({slug:"scatter",label:"PF2E.Damage.Scatter",modifier:baseDamage.dice,damageCategory:"splash",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"scatter")});modifiers.push(modifier)}const bonusDamage=Number(weapon.system.bonusDamage?.value);bonusDamage>0&&modifiers.push(new ModifierPF2e({label:"PF2E.WeaponBonusDamageLabel",modifier:bonusDamage}));const customDamage=weapon.system.property1,normalDice=customDamage.dice??0;if(normalDice>0){const damageType=customDamage.damageType||null;damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:"custom",label:"PF2E.WeaponCustomDamageLabel",diceNumber:normalDice,dieSize:customDamage.die,damageType}))}const critDice=customDamage.critDice??0;if(critDice>0){const damageType=customDamage.critDamageType||null;damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:"custom-critical",label:"PF2E.WeaponCustomDamageLabel",diceNumber:critDice,dieSize:customDamage.critDie,damageType,critical:!0}))}}const potency=weaponPotency?.bonus??0,strikingSynthetic=domains.flatMap(key=>actor.synthetics.striking[key]??[]).filter(wp=>wp.predicate.test(options)).reduce((highest,current)=>highest&&highest.bonus>current.bonus?highest:current,null);strikingSynthetic&&baseDamage.die&&(weapon.isOfType("melee")||strikingSynthetic.bonus>weapon.system.runes.striking)&&(damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:"striking",label:strikingSynthetic.label,diceNumber:strikingSynthetic.bonus})),weapon.isOfType("weapon")&&(weapon.system.damage.dice-=weapon.system.runes.striking,weapon.system.runes.striking=0));const critSpecEffect=(()=>{const critSpecs=actor.synthetics.criticalSpecalizations,standard=critSpecs.standard.reduceRight((result,cs)=>result??cs?.(weapon,options),null),alternate=critSpecs.alternate.reduceRight((result,cs)=>result??cs?.(weapon,options),null);return standard?alternate??standard:[]})();critSpecEffect.length>0&&options.add("critical-specialization"),modifiers.push(...critSpecEffect.filter(e=>e instanceof ModifierPF2e)),damageDice.push(...critSpecEffect.filter(e=>e instanceof DamageDicePF2e));const propertyRunes=weapon.system.runes.property;damageDice.push(...getPropertyRuneDice(propertyRunes,options));const propertyRuneAdjustments=getPropertyRuneModifierAdjustments(propertyRunes),ignoredResistances=propertyRunes.flatMap(r=>RUNE_DATA.weapon.property[r].damage?.ignoredResistances??[]);if(weaponTraits2.some(t=>t==="backstabber")&&options.has("target:condition:off-guard")){const modifier=new ModifierPF2e({label:CONFIG.PF2E.weaponTraits.backstabber,slug:"backstabber",modifier:potency>2?2:1,damageCategory:"precision",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"backstabber")});modifiers.push(modifier)}const traitLabels=CONFIG.PF2E.weaponTraits,deadlyTraits=weaponTraits2.filter(t=>t.startsWith("deadly-")),strikingDice=(()=>{if(weapon.isOfType("weapon")){const weaponStrikingDice=weapon.system.damage.dice-weapon._source.system.damage.dice;return strikingSynthetic&&strikingSynthetic.bonus>weaponStrikingDice?strikingSynthetic.bonus:weaponStrikingDice}else return strikingSynthetic?.bonus??0})();for(const slug of deadlyTraits){const diceNumber=(()=>{const baseNumber=Number(/-(\d)d\d{1,2}$/.exec(slug)?.at(1))||1;return strikingDice>1?strikingDice*baseNumber:baseNumber})();damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug,label:traitLabels[slug],damageType:baseDamage.damageType,diceNumber,dieSize:/-\d?(d\d{1,2})$/.exec(slug)?.at(1)??baseDamage.die,critical:!0}))}for(const trait of weaponTraits2.filter(t=>t.startsWith("fatal-d"))){const dieSize=trait.substring(trait.indexOf("-")+1);damageDice.push(new DamageDicePF2e({selector:`${weapon.id}-damage`,slug:trait,label:traitLabels[trait],damageType:baseDamage.damageType,diceNumber:1,dieSize,critical:!0,enabled:!0,override:{dieSize}}))}const runeNotes=propertyRunes.flatMap(r=>(RUNE_DATA.weapon.property[r].damage?.notes??[]).map(d=>new RollNotePF2e({selector:"strike-damage",...d})));context.notes=[runeNotes,critSpecEffect.filter(e=>e instanceof RollNotePF2e)].flat();const material=objectHasKey(CONFIG.PF2E.materialDamageEffects,weapon.system.material.type)?weapon.system.material.type:null,materials=new Set([materialTraits,material??[]].flat());for(const adjustment of actor.synthetics.strikeAdjustments)adjustment.adjustDamageRoll?.(weapon,{materials});for(const option of Array.from(materials).map(m=>`item:material:${m}`))options.add(option);for(const modifier of modifiers){const propRuneAdjustments=propertyRuneAdjustments.filter(a=>a.slug===modifier.slug),extractedAdjustments=extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,modifier.slug);modifier.adjustments.push(...propRuneAdjustments,...extractedAdjustments)}const baseUncategorized=(()=>{const diceNumber=baseDamage.die?baseDamage.dice:0;return diceNumber>0||baseDamage.modifier>0?{diceNumber,dieSize:baseDamage.die,modifier:baseDamage.modifier,damageType:baseDamage.damageType,category:"category"in baseDamage&&baseDamage.category==="persistent"?"persistent":null,materials:Array.from(materials)}:null})(),basePersistent=(()=>baseDamage.persistent?.faces?{diceNumber:baseDamage.persistent.number,dieSize:`d${baseDamage.persistent.faces}`,damageType:baseDamage.persistent.type,category:"persistent"}:baseDamage.persistent?.number?{modifier:baseDamage.persistent.number,damageType:baseDamage.persistent.type,category:"persistent"}:null)();if(!(baseUncategorized||basePersistent||splashDamage))return null;const base=compact([baseUncategorized,basePersistent]),extractOptions={test:options,resolvables:{weapon,target:context.target?.actor??null},injectables:{weapon}},extracted=processDamageCategoryStacking(base,{modifiers:[modifiers,extractModifiers(actor.synthetics,domains,extractOptions)].flat(),dice:extractDamageDice(actor.synthetics.damageDice,domains,extractOptions),test:options}),testedModifiers=extracted.modifiers;damageDice.push(...extracted.dice);const formulaData={base,dice:damageDice,maxIncreases:1,modifiers:testedModifiers,ignoredResistances};formulaData.base[0].diceNumber||formulaData.base[0].modifier||(formulaData.dice=formulaData.dice.filter(d=>![null,"precision"].includes(d.category)),formulaData.modifiers=formulaData.modifiers.filter(m=>![null,"precision"].includes(m.category)));const excludeFrom=weapon.isOfType("weapon")?weapon:null;if(__privateMethod(this,_excludeDamage,excludeDamage_fn).call(this,{actor,weapon:excludeFrom,modifiers:[...testedModifiers,...damageDice],options}),!context.skipDialog&&!await new DamageModifierDialog({formulaData,context}).resolve())return null;const computedFormulas={criticalFailure:null,failure:createDamageFormula(formulaData,DEGREE_OF_SUCCESS.FAILURE),success:createDamageFormula(formulaData,DEGREE_OF_SUCCESS.SUCCESS),criticalSuccess:createDamageFormula(formulaData,DEGREE_OF_SUCCESS.CRITICAL_SUCCESS)};return{name:`${game.i18n.localize("PF2E.DamageRoll")}: ${weapon.name}`,traits:(actionTraits2??[]).map(t=>t.name),materials:Array.from(materials),modifiers:[...modifiers,...damageDice],damage:{...formulaData,formula:mapValues(computedFormulas,formula=>formula?.formula??null),breakdown:mapValues(computedFormulas,formula=>formula?.breakdown??[])}}}static npcDamageToWeaponDamage(instance){const terms=parseTermsFromSimpleFormula(instance.damage),die=terms.find(t=>t.dice)?.dice,modifier=terms.find(t=>t.modifier)?.modifier??0;return{dice:die?.number??0,die:die?.faces?`d${die.faces}`:null,modifier,damageType:instance.damageType,persistent:null,category:instance.category}}};_excludeDamage=new WeakSet,excludeDamage_fn=__name2(function({actor,modifiers,weapon,options}){if(!weapon)return;const notIgnored=modifiers.filter(modifier=>!modifier.ignored);for(const rule of actor.rules)rule.applyDamageExclusion?.(weapon,notIgnored);for(const modifier of notIgnored)modifier.ignored=!modifier.predicate.test(options)},"#excludeDamage"),_strengthModToDamage2=new WeakSet,strengthModToDamage_fn2=__name2(function(weapon,strengthBased){return weapon.isOfType("weapon")&&strengthBased&&!weapon.traits.has("propulsive")},"#strengthModToDamage"),__privateAdd(_WeaponDamagePF2e,_excludeDamage),__privateAdd(_WeaponDamagePF2e,_strengthModToDamage2),__name2(_WeaponDamagePF2e,"WeaponDamagePF2e");let WeaponDamagePF2e=_WeaponDamagePF2e;async function resetActors(actors,{rerender=!0}={}){actors??=[game.actors.contents,game.scenes.contents.flatMap(s=>s.tokens.contents).flatMap(t=>t.actor??[])].flat();for(const actor of actors)actor.reset(),rerender&&actor.render();if(game.pf2e.effectPanel.refresh(),game.settings.get("pf2e","automation.effectExpiration")&&!game.settings.get("pf2e","automation.removeExpiredEffects")){const scenes=new Set(Array.from(actors).flatMap(a=>a.getActiveTokens(!1,!0)).flatMap(t=>t.scene));for(const scene of scenes)scene.reset(),scene.isView&&canvas.perception.update({initializeVision:!0},!0)}}__name(resetActors,"resetActors"),__name2(resetActors,"resetActors");function userColorForActor(actor){return(game.users.find(u=>u.character===actor)??game.users.players.find(u=>actor.testUserPermission(u,"OWNER"))??actor.primaryUpdater)?.color??"#43dfdf"}__name(userColorForActor,"userColorForActor"),__name2(userColorForActor,"userColorForActor");async function migrateActorSource(source){source.effects=[],["flags","items","system"].some(k=>k in source)||(source.system={_migration:{version:MigrationRunnerBase.LATEST_SCHEMA_VERSION}});const lowestSchemaVersion=Math.min(source.system?._migration?.version??MigrationRunnerBase.LATEST_SCHEMA_VERSION,...(source.items??[]).map(i=>i.system?._migration?.version??MigrationRunnerBase.LATEST_SCHEMA_VERSION)),tokenDefaults=deepClone(game.settings.get("core","defaultToken")),actor=new ActorProxyPF2e(mergeObject({prototypeToken:tokenDefaults},source));return await MigrationRunner.ensureSchemaVersion(actor,MigrationList.constructFromVersion(lowestSchemaVersion)),actor.toObject()}__name(migrateActorSource,"migrateActorSource"),__name2(migrateActorSource,"migrateActorSource");async function checkAreaEffects(){if(!canvas.ready||game.user!==this.primaryUpdater||this.isOfType("party"))return;const thisTokens=this.getActiveTokens(!0,!0),toDelete2=[],toKeep=[];for(const effect of this.itemTypes.effect){const auraData=effect.flags.pf2e.aura;if(!auraData?.removeOnExit)continue;const auraActor=await fromUuid(auraData.origin),aura=(auraActor?.getActiveTokens(!0,!0).shift()??null)?.auras.get(auraData.slug),auraEffectData=auraActor?.auras.get(auraData.slug)?.effects.find(e=>e.uuid===effect.sourceId&&auraAffectsActor(e,auraActor,this));for(const token of thisTokens)auraEffectData&&aura?.containsToken(token)?toKeep.push(effect.id):toDelete2.push(effect.id);thisTokens.length===0&&toDelete2.push(effect.id)}const finalToDelete=toDelete2.filter(id=>!toKeep.includes(id));finalToDelete.length>0&&await this.deleteEmbeddedDocuments("Item",finalToDelete)}__name(checkAreaEffects,"checkAreaEffects"),__name2(checkAreaEffects,"checkAreaEffects");function auraAffectsActor(data,origin,actor){return data.includesSelf&&origin===actor||data.affects==="allies"&&actor.isAllyOf(origin)||data.affects==="enemies"&&actor.isEnemyOf(origin)||data.affects==="all"&&actor!==origin}__name(auraAffectsActor,"auraAffectsActor"),__name2(auraAffectsActor,"auraAffectsActor");function setHitPointsRollOptions(actor){const hp=actor.hitPoints;if(!hp)return;actor.flags.pf2e.rollOptions.all[`hp-remaining:${hp.value}`]=!0;const percentRemaining=Math.floor(hp.value/hp.max*100);actor.flags.pf2e.rollOptions.all[`hp-percent:${percentRemaining}`]=!0}__name(setHitPointsRollOptions,"setHitPointsRollOptions"),__name2(setHitPointsRollOptions,"setHitPointsRollOptions");function calculateMAPs(item,{domains,options}){const slugAndLabel={slug:"multiple-attack-penalty",label:"PF2E.MultipleAttackPenalty"},baseMap=item.isOfType("action","melee","weapon")&&item.traits.has("agile")?{...slugAndLabel,map1:-4,map2:-8}:{...slugAndLabel,map1:-5,map2:-10},optionSet=options instanceof Set?options:new Set(options),maps=item.actor?.synthetics.multipleAttackPenalties??{},fromSynthetics=domains.flatMap(d=>maps[d]??[]).filter(p=>p.predicate?.test(optionSet)??!0).map(p=>({slug:baseMap.slug,label:p.label,map1:p.penalty,map2:p.penalty*2}));return[baseMap,...fromSynthetics].reduce((lowest,p)=>p.map1>lowest.map1?p:lowest)}__name(calculateMAPs,"calculateMAPs"),__name2(calculateMAPs,"calculateMAPs");function createEncounterRollOptions(actor){const encounter=game.ready?game.combat:null;if(!encounter?.started)return{};const participants=encounter.combatants.contents.filter(c=>typeof c.initiative=="number").sort((a,b)=>b.initiative-a.initiative),participant=actor.combatant;if(typeof participant?.initiative!="number"||!participants.includes(participant))return{};const initiativeRoll=Math.trunc(participant.initiative),initiativeRank=participants.indexOf(participant)+1,{initiativeStatistic}=participant.flags.pf2e,threat=encounter.metrics?.threat,numericThreat={trivial:0,low:1,moderate:2,severe:3,extreme:4}[threat??"trivial"],entries=[["encounter",!0],[`encounter:threat:${numericThreat}`,!!threat],[`encounter:threat:${threat}`,!!threat],[`encounter:round:${encounter.round}`,!0],[`encounter:turn:${Number(encounter.turn)+1}`,!0],["self:participant:own-turn",encounter.combatant===participant],[`self:participant:initiative:roll:${initiativeRoll}`,!0],[`self:participant:initiative:rank:${initiativeRank}`,!0],[`self:participant:initiative:stat:${initiativeStatistic}`,!!initiativeStatistic]].filter(([,value])=>!!value);return Object.fromEntries(entries)}__name(createEncounterRollOptions,"createEncounterRollOptions"),__name2(createEncounterRollOptions,"createEncounterRollOptions");function isOffGuardFromFlanking(target,origin){if(!target?.isOfType("creature"))return!1;const{flanking}=target.attributes;return flanking.flankable?typeof flanking.offGuardable=="number"?origin.level>flanking.offGuardable:flanking.offGuardable:!1}__name(isOffGuardFromFlanking,"isOffGuardFromFlanking"),__name2(isOffGuardFromFlanking,"isOffGuardFromFlanking");function getStrikeAttackDomains(weapon,proficiencyRank,baseRollOptions){const unarmedOrWeapon=weapon.category==="unarmed"?"unarmed":"weapon",meleeOrRanged=weapon.isMelee?"melee":"ranged",weaponSlug=weapon.slug??sluggify(weapon.name),domains=[weapon.baseType?`${weapon.baseType}-base-attack-roll`:[],weapon.group?`${weapon.group}-group-attack-roll`:[],weapon.system.traits.otherTags.map(t=>`${t}-tag-attack-roll`),`${weapon.id}-attack`,`${weaponSlug}-attack`,`${weaponSlug}-attack-roll`,`${unarmedOrWeapon}-attack-roll`,`${meleeOrRanged}-attack-roll`,`${meleeOrRanged}-strike-attack-roll`,"strike-attack-roll","attack-roll","attack","check","all"].flat();if(typeof proficiencyRank=="number"){const proficiencies=["untrained","trained","expert","master","legendary"];domains.push(`${proficiencies[proficiencyRank]}-attack`)}const{actor}=weapon;if(actor.isOfType("character","npc")){const defaultAttributeModifier=createAttributeModifier({actor,attribute:weapon.defaultAttribute,domains}),rollOptions=[...baseRollOptions,actor.getRollOptions(domains),weapon.getRollOptions("item")].flat(),weaponTraits2=weapon.traits,alternativeAttributeModifier=actor.isOfType("character")?weaponTraits2.has("finesse")?createAttributeModifier({actor,attribute:"dex",domains}):weaponTraits2.has("brutal")?createAttributeModifier({actor,attribute:"str",domains}):null:null,attributeModifier=compact([defaultAttributeModifier,alternativeAttributeModifier,...extractModifiers(weapon.actor.synthetics,domains,{resolvables:{weapon},test:rollOptions})]).filter(m=>m.type==="ability"&&m.enabled).reduce((best,candidate)=>candidate.modifier>best.modifier?candidate:best);domains.push(`${attributeModifier.ability}-attack`,`${attributeModifier.ability}-based`)}return uniq(domains).sort()}__name(getStrikeAttackDomains,"getStrikeAttackDomains"),__name2(getStrikeAttackDomains,"getStrikeAttackDomains");function getStrikeDamageDomains(weapon,proficiencyRank){const meleeOrRanged=weapon.isMelee?"melee":"ranged",slug=weapon.slug??sluggify(weapon.name),{actor,traits}=weapon,unarmedOrWeapon=traits.has("unarmed")?"unarmed":"weapon",domains=[`${weapon.id}-damage`,`${slug}-damage`,`${meleeOrRanged}-strike-damage`,`${meleeOrRanged}-damage`,`${unarmedOrWeapon}-damage`,"attack-damage","strike-damage","damage"];if(weapon.group&&domains.push(`${weapon.group}-weapon-group-damage`),weapon.baseType&&domains.push(`${weapon.baseType}-base-type-damage`),typeof proficiencyRank=="number"){const proficiencies=["untrained","trained","expert","master","legendary"];domains.push(`${proficiencies[proficiencyRank]}-damage`)}const baseType=CONFIG.PF2E.equivalentWeapons[weapon.baseType??""]??weapon.baseType;if(baseType&&!domains.includes(`${baseType}-damage`)&&domains.push(`${baseType}-damage`),actor.isOfType("character","npc")){const attributeModifier=[weapon.isMelee||weapon.isThrown&&!traits.has("splash")||traits.has("propulsive")?createAttributeModifier({actor,attribute:"str",domains}):null,...extractModifiers(actor.synthetics,domains,{resolvables:{weapon},test:[...actor.getRollOptions(domains),...weapon.getRollOptions("item")]}).filter(m=>!m.ignored&&m.type==="ability")].reduce((best,candidate)=>candidate&&best?candidate.value>best.value?candidate:best:candidate??best);attributeModifier&&domains.push(`${attributeModifier.ability}-damage`)}return uniq(domains).sort()}__name(getStrikeDamageDomains,"getStrikeDamageDomains"),__name2(getStrikeDamageDomains,"getStrikeDamageDomains");function strikeFromMeleeItem(item){const{actor,isMelee,isThrown}=item;if(!actor.isOfType("npc","hazard"))throw ErrorPF2e("Attempted to create melee-item strike statistic for non-NPC/hazard");const meleeOrRanged=isMelee?"melee":"ranged",baseOptions=new Set(compact([isThrown?"thrown":null,meleeOrRanged,...item.system.traits.value])),domains=getStrikeAttackDomains(item,actor.isOfType("npc")?1:null,baseOptions),{synthetics}=actor,modifiers=[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:item.attackModifier,adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,domains,"base")})];modifiers.push(...extractModifiers(synthetics,domains)),modifiers.push(...AttackTraitHelpers.createAttackModifiers({item}));const attackEffects=CONFIG.PF2E.attackEffects,additionalEffects=item.attackEffects.map(tag=>{const items=actor.items.contents,label=attackEffects[tag]??items.find(i=>(i.slug??sluggify(i.name))===tag)?.name??tag;return{tag,label}});for(const adjustment of synthetics.strikeAdjustments)adjustment.adjustWeapon?.(item);const initialRollOptions=new Set([...baseOptions,...actor.getRollOptions(domains),...item.getRollOptions("item")]),attackSlug=item.slug??sluggify(item.name),statistic=new StatisticModifier(attackSlug,modifiers,initialRollOptions),traitObjects=item.system.traits.value.map(t=>({name:t,label:CONFIG.PF2E.npcAttackTraits[t]??t,description:CONFIG.PF2E.traitsDescriptions[t]})),strike=mergeObject(statistic,{label:item.name,type:"strike",glyph:getActionGlyph({type:"action",value:1}),description:item.description,sourceId:item.id,attackRollType:item.isRanged?"PF2E.NPCAttackRanged":"PF2E.NPCAttackMelee",additionalEffects,item,weapon:item,traits:traitObjects,options:Array.from(baseOptions),variants:[],ready:!0,success:"",criticalSuccess:""});strike.breakdown=strike.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${signedInteger(m.value)}`).join(", ");const attackTrait={name:"attack",label:CONFIG.PF2E.featTraits.attack,description:CONFIG.PF2E.traitsDescriptions.attack},maps=calculateMAPs(item,{domains,options:initialRollOptions}),createMapModifier=__name2(prop=>new ModifierPF2e({slug:maps.slug,label:maps.label,modifier:maps[prop],adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,domains,maps.slug)}),"createMapModifier"),labels=[`${game.i18n.localize("PF2E.WeaponStrikeLabel")} ${signedInteger(strike.totalModifier)}`,...["map1","map2"].map(prop=>{const modifier=createMapModifier(prop);adjustModifiers([modifier],baseOptions);const penalty=modifier.ignored?0:modifier.value;return game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(strike.totalModifier+penalty),penalty})})];strike.variants=[null,...["map1","map2"].map(createMapModifier)].map((map2,mapIncreases)=>({label:labels[mapIncreases],roll:async(params={})=>{params.options??=[];const context=await actor.getCheckContext({item,viewOnly:params.getFormula??!1,statistic:strike,target:{token:params.target??game.user.targets.first()??null},defense:"armor",domains,options:new Set([...baseOptions,...params.options])});if(context.self.item.isRanged&&typeof context.target?.distance=="number"){const maxRange=item.range?.max??10;if(context.target.distance>maxRange)return ui.notifications.warn("PF2E.Action.Strike.OutOfRange",{localize:!0}),null}const otherModifiers=[map2??[],context.self.modifiers].flat(),title=game.i18n.format(item.isMelee?"PF2E.Action.Strike.MeleeLabel":"PF2E.Action.Strike.RangedLabel",{weapon:item.name}),notes=[actor.isOfType("npc")?await actor.getAttackEffects(item):[],extractNotes(context.self.actor.synthetics.rollNotes,domains)].flat(),rollTwice=params.rollTwice||extractRollTwice(context.self.actor.synthetics.rollTwice,domains,context.options),substitutions=extractRollSubstitutions(context.self.actor.synthetics.rollSubstitutions,domains,context.options),dosAdjustments=extractDegreeOfSuccessAdjustments(context.self.actor.synthetics,domains),check=new CheckModifier("strike",context.self.statistic??strike,otherModifiers),checkContext={type:"attack-roll",identifier:`${item.id}.${attackSlug}.${meleeOrRanged}`,action:"strike",title,actor:context.self.actor,token:context.self.token,item:context.self.item,target:context.target,damaging:context.self.item.dealsDamage,domains,options:context.options,traits:[attackTrait],notes,dc:params.dc??context.dc,mapIncreases,rollTwice,substitutions,dosAdjustments},roll=await CheckPF2e.roll(check,checkContext,params.event);if(roll)for(const rule of context.self.actor.rules.filter(r=>!r.ignored))await rule.afterRoll?.({roll,check,context:checkContext,domains,rollOptions:context.options});return roll}})),strike.roll=strike.attack=strike.variants[0].roll;const damageRoll=__name2(outcome=>async(params={})=>{const domains2=getStrikeDamageDomains(item,actor.isOfType("npc")?1:null),targetToken=params.target??game.user.targets.first()??null,context=await actor.getDamageRollContext({item,statistic:strike,target:{token:targetToken},viewOnly:params.getFormula??!1,domains:domains2,checkContext:params.checkContext,outcome,options:new Set([...baseOptions,...params.options??[]])});if(!context.self.item.dealsDamage&&!params.getFormula)return ui.notifications.warn("PF2E.ErrorMessage.WeaponNoDamage",{localize:!0}),null;const{self,target}=context,damageContext={type:"damage-roll",sourceType:"attack",self,target,outcome,options:context.options,domains:domains2,...eventToRollParams(params.event,{type:"damage"})};typeof params.mapIncreases=="number"&&(damageContext.mapIncreases=params.mapIncreases,damageContext.options.add(`map:increases:${params.mapIncreases}`)),params.getFormula&&(damageContext.skipDialog=!0);const damage=await WeaponDamagePF2e.fromNPCAttack({attack:context.self.item,actor:context.self.actor,actionTraits:[attackTrait],context:damageContext});if(!damage)return null;if(params.getFormula){const formula=damage.damage.formula[outcome];return formula?new DamageRoll(formula).formula:""}else return DamagePF2e.roll(damage,damageContext,params.callback)},"damageRoll");return strike.damage=damageRoll("success"),strike.critical=damageRoll("criticalSuccess"),strike}__name(strikeFromMeleeItem,"strikeFromMeleeItem"),__name2(strikeFromMeleeItem,"strikeFromMeleeItem");function getRangeIncrement(attackItem,distance){if(!attackItem.isOfType("action","melee","weapon"))return null;const{increment}=attackItem.range??{};return increment&&typeof distance=="number"?Math.max(Math.ceil(distance/increment),1):null}__name(getRangeIncrement,"getRangeIncrement"),__name2(getRangeIncrement,"getRangeIncrement");function calculateRangePenalty(actor,increment,selectors,rollOptions){if(!increment||increment===1)return null;const slug="range-penalty",modifier=new ModifierPF2e({label:"PF2E.RangePenalty",slug,type:"untyped",modifier:Math.max((increment-1)*-2,-12),predicate:[{nor:["ignore-range-penalty",{gte:["ignore-range-penalty",increment]}]}],adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,selectors,slug)});return modifier.test(rollOptions),modifier}__name(calculateRangePenalty,"calculateRangePenalty"),__name2(calculateRangePenalty,"calculateRangePenalty");function isReallyPC(actor){const traits=actor.traits;return actor.isOfType("character")&&!(traits.has("minion")||traits.has("eidolon"))}__name(isReallyPC,"isReallyPC"),__name2(isReallyPC,"isReallyPC");function findMatchingCheckContext(actor,params){if(params.viewOnly||!params.target?.token)return null;const paramsItem=params.item;return paramsItem?.isOfType("melee","weapon")?game.messages.contents.slice(-3).reverse().find(message=>{if(!message.rolls.some(r=>r instanceof CheckRoll)||message.actor?.uuid!==actor.uuid||params.target?.token!==message.target?.token.object)return!1;const messageItem=message.item;if(!messageItem?.isOfType("melee","weapon"))return!1;const paramsItemSlug=paramsItem.slug??sluggify(paramsItem.name),messageItemSlug=messageItem.slug??sluggify(messageItem.name);return paramsItemSlug===messageItemSlug&¶msItem.uuid===messageItem.uuid&¶msItem.isMelee===messageItem.isMelee})?.flags.pf2e.context??null:null}__name(findMatchingCheckContext,"findMatchingCheckContext"),__name2(findMatchingCheckContext,"findMatchingCheckContext");const _Statistic=class _Statistic2 extends BaseStatistic{static{__name(this,"_Statistic")}constructor(actor,data,config={}){data.modifiers??=[];const domains=data.domains??=[],attributeModifier=actor.isOfType("character")&&data.attribute?data.modifiers.find(m=>m.type==="ability"&&m.ability===data.attribute)??createAttributeModifier({actor,attribute:data.attribute,domains}):null,proficiencyModifier=actor.isOfType("character")?typeof data.rank=="number"?createProficiencyModifier({actor,rank:data.rank,domains}):data.rank==="untrained-level"?createProficiencyModifier({actor,rank:0,domains,addLevel:!0}):null:null,baseModifiers=compact([attributeModifier,proficiencyModifier]),activeSlugs=new Set(baseModifiers.map(m=>m.slug));data.modifiers=data.modifiers.filter(m=>!activeSlugs.has(m.slug)),data.modifiers.unshift(...baseModifiers),super(actor,data),__publicField(this,"attribute",null),__publicField(this,"rank",null),__publicField(this,"proficient",!0),__publicField(this,"base",null),__publicField(this,"lore"),__publicField(this,"config"),__privateAdd(this,_check,void 0),__privateAdd(this,_dc,void 0),this.attribute=data.attribute??null,typeof data.lore=="boolean"&&(this.lore=data.lore),this.rank=data.rank==="untrained-level"?0:data.rank??null,this.config=config,this.proficient=data.proficient===void 0?this.rank===null||this.rank>0:!!data.proficient,data.filter&&(this.modifiers=this.modifiers.filter(data.filter)),this.data.dc??={domains:[`${this.slug}-dc`]}}get attributeModifier(){return this.actor.isOfType("npc")?this.attribute?createAttributeModifier({actor:this.actor,attribute:this.attribute,domains:this.domains}):null:this.modifiers.find(m=>m.type==="ability"&&m.enabled&&m.ability===this.attribute)??null}get check(){return __privateGet(this,_check)??__privateSet(this,_check,new StatisticCheck(this,this.data,this.config))}get dc(){return __privateGet(this,_dc)??__privateSet(this,_dc,new StatisticDifficultyClass(this,this.data,this.config))}get mod(){return this.check.mod}get ability(){return foundry.utils.logCompatibilityWarning("`Statistic#ability` is deprecated. Use `Statistic#attribute` instead.",{since:"5.5.0",until:"6.0.0"}),this.attribute}createRollOptions(domains=this.domains,args={}){const{item,extraRollOptions,origin,target}=args,rollOptions=[];return domains.length>0&&rollOptions.push(...super.createRollOptions(domains)),typeof this.rank=="number"&&rollOptions.push(PROFICIENCY_RANK_OPTION[this.rank]),this.data.rollOptions&&rollOptions.push(...this.data.rollOptions),item&&(rollOptions.push(...item.getRollOptions("item")),item.actor&&item.actor.uuid!==this.actor.uuid&&rollOptions.push(...item.actor.getSelfRollOptions("origin")),(item.system.traits?.value??[]).includes("attack")&&rollOptions.push("trait:attack")),origin?rollOptions.push(...origin.getSelfRollOptions("origin")):target&&rollOptions.push(...target.getSelfRollOptions("target")),extraRollOptions&&rollOptions.push(...extraRollOptions),new Set(rollOptions.sort())}withRollOptions(options){const newOptions=mergeObject(this.config??{},options??{},{inplace:!1});return new _Statistic2(this.actor,deepClone(this.data),newOptions)}extend(data){function maybeMergeArrays(arr1,arr2){if(!(!arr1&&!arr2))return[...new Set([arr1??[],arr2??[]].flat())]}__name(maybeMergeArrays,"maybeMergeArrays"),__name2(maybeMergeArrays,"maybeMergeArrays");const result=mergeObject(deepClone(this.data),data);result.domains=maybeMergeArrays(this.domains,data.domains),result.modifiers=maybeMergeArrays(this.data.modifiers,data.modifiers),result.rollOptions=maybeMergeArrays(this.data.rollOptions,data.rollOptions),result.check&&this.data.check&&(result.check.domains=maybeMergeArrays(this.data.check.domains,data.check?.domains),result.check.modifiers=maybeMergeArrays(this.data.check.modifiers,data.check?.modifiers)),result.dc&&this.data.dc&&(result.dc.domains=maybeMergeArrays(this.data.dc.domains,data.dc?.domains),result.dc.modifiers=maybeMergeArrays(this.data.dc.modifiers,data.dc?.modifiers));const extended=new _Statistic2(this.actor,result,this.config);return extended.base=this,extended}roll(args={}){return this.check.roll(args)}getChatData(options={}){const{check,dc}=this.withRollOptions(options),{map1,map2}=options.item?calculateMAPs(options.item,{domains:check?.domains??[],options:check?.createRollOptions(options)??[]}):{map1:-5,map2:-10};return{slug:this.slug,label:this.label,rank:this.rank,check:{mod:check.mod,breakdown:check.breakdown,label:check.label,map1,map2},dc:{value:dc.value,breakdown:dc.breakdown}}}getTraceData(options={}){const{check,dc}=this,valueProp=options.value??"mod",[label,value,totalModifier,breakdown,modifiers]=valueProp==="mod"?[this.label,check.mod,check.mod,check.breakdown,check.modifiers]:[dc.label||this.label,dc.value,dc.value-10,dc.breakdown,dc.modifiers];return{slug:this.slug,label,value,totalModifier,dc:dc.value,breakdown,modifiers:modifiers.map(m=>m.toObject())}}};_check=new WeakMap,_dc=new WeakMap,__name2(_Statistic,"Statistic");let Statistic=_Statistic;const _StatisticCheck=class{static{__name(this,"_StatisticCheck")}constructor(parent,data,config={}){__privateAdd(this,_determineLabel),__publicField(this,"parent"),__publicField(this,"type"),__publicField(this,"label"),__publicField(this,"domains"),__publicField(this,"mod"),__publicField(this,"modifiers"),this.parent=parent,this.type=data.check?.type??"check",data.check=mergeObject(data.check??{},{type:this.type});const checkDomains=new Set(compact(["check",data.check.domains].flat()));this.type==="attack-roll"?(checkDomains.add("attack"),checkDomains.add("attack-roll"),checkDomains.add(`${this.parent.slug}-attack-roll`)):(checkDomains.add(`${this.parent.slug}-check`),this.type==="flat-check"&&(checkDomains.delete("check"),checkDomains.add("flat-check"))),data.check.domains=Array.from(checkDomains).sort(),this.domains=uniq(compact([data.domains,data.check.domains].flat())).sort(),this.label=__privateMethod(this,_determineLabel,determineLabel_fn).call(this,data);const{modifierAdjustments}=parent.actor.synthetics,parentModifiers=parent.modifiers.map(modifier=>{const clone=modifier.clone();return clone.adjustments.push(...extractModifierAdjustments(modifierAdjustments,data.check?.domains??[],clone.slug)),clone}),checkOnlyModifiers=[data.check?.modifiers??[],extractModifiers(parent.actor.synthetics,data.check?.domains??[])].flat().map(modifier=>(modifier.adjustments.push(...extractModifierAdjustments(parent.actor.synthetics.modifierAdjustments,parent.domains,this.parent.slug)),modifier)),rollOptions=parent.createRollOptions(this.domains,config);this.modifiers=[...parentModifiers,...checkOnlyModifiers.map(modifier=>modifier.clone({test:rollOptions}))],this.type==="flat-check"&&this.modifiers.length>0&&(console.error(ErrorPF2e("Flat checks cannot have modifiers.").message),this.modifiers=[]),this.mod=new StatisticModifier(this.label,this.modifiers,rollOptions).totalModifier}get actor(){return this.parent.actor}createRollOptions(args={}){return this.parent.createRollOptions(this.domains,args)}async roll(args={}){args.dc=typeof args.dc=="number"?{value:Math.trunc(args.dc)||0}:args.dc??null;const{rollMode,skipDialog}=(()=>{if(isObject(args)){const event=args.event?.originalEvent??args.event;if(event instanceof MouseEvent){const{rollMode:rollMode2,skipDialog:skipDialog2}=args;return mergeObject({rollMode:rollMode2,skipDialog:skipDialog2},eventToRollParams(event,{type:"check"}))}}return args})(),{domains}=this,token=args.token??this.actor.getActiveTokens(!1,!0).shift(),item=args.item??null,{origin}=args,targetToken=origin?null:(args.target?.getActiveTokens()??Array.from(game.user.targets)).find(t=>t.actor?.isOfType("creature"))??null,rollContext=await(()=>{const isValidAttacker=this.actor.isOfType("creature","hazard"),isTargetedCheck=this.domains.includes("spell-attack-roll")&&item?.isOfType("spell")||!["flat-check","saving-throw"].includes(this.type)&&!!(args.dc?.slug||"statistic"in(args.dc??{}))&&(!item||item.isOfType("action","feat","weapon"));return isValidAttacker&&isTargetedCheck?this.actor.getCheckContext({item:item?.isOfType("action","melee","spell","weapon")?item:null,domains,statistic:this,target:targetToken,defense:args.dc?.slug??"armor",melee:args.melee,options:new Set(args.extraRollOptions??[])}):null})(),selfActor=rollContext?.self.actor??this.actor,targetActor=origin?null:rollContext?.target?.actor??args.target??null,dc=typeof args.dc?.value=="number"?args.dc:rollContext?.dc??null,extraModifiers=this.type==="flat-check"?[]:compact([args.modifiers,rollContext?.self.modifiers].flat()),extraRollOptions=[...args.extraRollOptions??[],...rollContext?.options??[],`check:statistic:${this.parent.slug}`,`check:type:${this.type.replace(/-check$/,"")}`];this.parent.base&&extraRollOptions.push(`check:statistic:base:${this.parent.base.slug}`);const options=this.createRollOptions({...args,origin,target:targetActor,extraRollOptions}),notes=[...extractNotes(selfActor.synthetics.rollNotes,domains),...args.extraRollNotes??[]];for(const rule of selfActor.rules.filter(r=>!r.ignored))rule.beforeRoll?.(domains,options);const dosAdjustments=dc?extractDegreeOfSuccessAdjustments(selfActor.synthetics,domains):[];if((options.has("incapacitation")||options.has("item:trait:incapacitation"))&&dc){const effectLevel=item?.isOfType("spell")?2*item.rank:item?.isOfType("physical")?item.level:origin?.level??selfActor.level,amount=this.type==="saving-throw"&&selfActor.level>effectLevel?DEGREE_ADJUSTMENT_AMOUNTS.INCREASE:targetActor&&targetActor.level>effectLevel&&["attack-roll","spell-attack-roll","skill-check"].includes(this.type)?DEGREE_ADJUSTMENT_AMOUNTS.LOWER:null;amount&&dosAdjustments.push({adjustments:{all:{label:"PF2E.TraitIncapacitation",amount}}})}const mapIncreases=Math.clamped((args.attackNumber??1)-1,0,2);if(mapIncreases!==0)if(!item)console.warn("Missing item argument while calculating MAP during check");else{const maps=calculateMAPs(item,{domains,options}),penalty=maps[`map${mapIncreases}`];extraModifiers.push(new ModifierPF2e(maps.label,penalty,"untyped"))}const traits=args.traits?.map(t=>typeof t=="string"?traitSlugToObject(t,CONFIG.PF2E.actionTraits):t);for(const trait of traits??[])options.add(trait.name);const context={actor:selfActor,token,item,type:this.type,identifier:args.identifier,domains,target:rollContext?.target??null,dc,notes,options,action:args.action,damaging:args.damaging,rollMode,skipDialog,rollTwice:args.rollTwice||extractRollTwice(selfActor.synthetics.rollTwice,domains,options),substitutions:extractRollSubstitutions(selfActor.synthetics.rollSubstitutions,domains,options),dosAdjustments,traits,title:args.title?.trim()||args.label?.trim()||this.label,createMessage:args.createMessage??!0};typeof args.attackNumber=="number"&&(context.mapIncreases=mapIncreases,context.options?.add(`map:increases:${mapIncreases}`));const check=new CheckModifier(this.parent.slug,{modifiers:this.modifiers},extraModifiers),roll=await CheckPF2e.roll(check,context,null,args.callback);if(roll)for(const rule of selfActor.rules.filter(r=>!r.ignored))await rule.afterRoll?.({roll,check,context,domains,rollOptions:options});return roll}get breakdown(){return this.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.modifier<0?"":"+"}${m.modifier}`).join(", ")}};_determineLabel=new WeakSet,determineLabel_fn=__name2(function(data){const parentLabel=this.parent.label;if(data.check?.label)return game.i18n.localize(data.check?.label);if(this.domains.includes("spell-attack-roll"))return game.i18n.format("PF2E.SpellAttackWithTradition",{tradition:parentLabel});switch(this.type){case"skill-check":return game.i18n.format("PF2E.SkillCheckWithName",{skillName:parentLabel});case"saving-throw":return game.i18n.format("PF2E.SavingThrowWithName",{saveName:parentLabel});case"perception-check":return game.i18n.format("PF2E.PerceptionCheck");default:return parentLabel}},"#determineLabel"),__name2(_StatisticCheck,"StatisticCheck");let StatisticCheck=_StatisticCheck;const _StatisticDifficultyClass=class{static{__name(this,"_StatisticDifficultyClass")}parent;domains;label;modifiers;options;constructor(parent,data,options={}){this.parent=parent,this.domains=uniq(compact([data.domains,data.dc?.domains].flat())).sort(),this.label=data.dc?.label,this.options=parent.createRollOptions(this.domains,options);const{modifierAdjustments}=parent.actor.synthetics,parentModifiers=parent.modifiers.map(modifier=>{const clone=modifier.clone();return clone.adjustments.push(...extractModifierAdjustments(modifierAdjustments,data.dc?.domains??[],clone.slug)),clone}),dcOnlyModifiers=[data.dc?.modifiers??[],extractModifiers(parent.actor.synthetics,data.dc?.domains??[])].flat().map(modifier=>(modifier.adjustments.push(...extractModifierAdjustments(parent.actor.synthetics.modifierAdjustments,parent.domains,this.parent.slug)),modifier));this.modifiers=[...new StatisticModifier("",[...parentModifiers,...dcOnlyModifiers.map(m=>m.clone())],this.options).modifiers]}get value(){return 10+new StatisticModifier("",this.modifiers.map(m=>m.clone()),this.options).totalModifier}get breakdown(){const enabledMods=this.modifiers.filter(m=>m.enabled);return[game.i18n.localize("PF2E.DCBase")].concat(enabledMods.map(m=>`${m.label} ${signedInteger(m.modifier)}`)).join(", ")}toString(){return String(this.value)}};__name2(_StatisticDifficultyClass,"StatisticDifficultyClass");let StatisticDifficultyClass=_StatisticDifficultyClass;const _ArmorStatistic=class extends Statistic{static{__name(this,"_ArmorStatistic")}constructor(actor,data={}){data.rank??=1;const attribute=actor.isOfType("creature")?data.attribute??"dex":null,domains=attribute?["all",`${attribute}-based`]:["all"],fullData={...data,label:"TYPES.Item.armor",slug:"armor",attribute,domains,proficient:data.rank>0,dc:{label:"PF2E.ArmorClassLabel",domains:["ac"],modifiers:[]}};super(actor,fullData),__privateAdd(this,_createBonusesAndPenalties),__privateAdd(this,_createShieldBonus),__publicField(this,"details"),this.details=data.details??"";const dcModifiers=[...this.dc.modifiers,...__privateMethod(this,_createBonusesAndPenalties,createBonusesAndPenalties_fn).call(this)].map(m=>m.clone());this.dc.modifiers=[...new StatisticModifier("",dcModifiers,this.dc.options).modifiers]}get item(){return this.actor.isOfType("character")?this.actor.wornArmor:null}getTraceData(){return{...super.getTraceData({value:"dc"}),details:this.details,breakdown:this.dc.breakdown}}};_createBonusesAndPenalties=new WeakSet,createBonusesAndPenalties_fn=__name2(function(){const{actor}=this,armor=actor.isOfType("character")?actor.wornArmor:null,armorSlug=armor?.baseType??armor?.slug??sluggify(armor?.name??""),itemBonus=armor?new ModifierPF2e({label:armor.name,type:"item",slug:armorSlug,modifier:armor.acBonus,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,["all","ac"],armorSlug)}):null;return compact([itemBonus,createShoddyPenalty(actor,armor,this.dc.domains),__privateMethod(this,_createShieldBonus,createShieldBonus_fn).call(this)])},"#createBonusesAndPenalties"),_createShieldBonus=new WeakSet,createShieldBonus_fn=__name2(function(){const{actor}=this;if(!actor.isOfType("character","npc"))return null;const shieldData=actor.system.attributes.shield,slug="raised-shield";return shieldData.raised&&!shieldData.broken?new ModifierPF2e({label:shieldData.name,slug,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,["all","dex-based","ac"],slug),type:"circumstance",modifier:shieldData.ac}):null},"#createShieldBonus"),__name2(_ArmorStatistic,"ArmorStatistic");let ArmorStatistic=_ArmorStatistic;const _HitPointsStatistic=class extends BaseStatistic{static{__name(this,"_HitPointsStatistic")}constructor(actor,{baseMax=0}={}){const modifiers=actor.isOfType("character")?[createAttributeModifier({actor,attribute:"con",domains:["hp","con-based"]})]:[];super(actor,{slug:"hp",label:"PF2E.HitPointsHeader",domains:actor.isOfType("character","npc")?["con-based","hp"]:["hp"],modifiers}),__publicField(this,"value"),__publicField(this,"max"),__privateAdd(this,_baseMax,void 0),__publicField(this,"temp"),__publicField(this,"negativeHealing"),__publicField(this,"unrecoverable"),__publicField(this,"details"),__privateSet(this,_baseMax,baseMax),this.max=baseMax+new StatisticModifier("",this.modifiers.map(m=>m.clone())).totalModifier,this.value=Math.clamped(actor.system.attributes.hp.value,0,this.max),this.temp=actor.system.attributes.hp.temp,this.negativeHealing=actor.system.attributes.hp.negativeHealing,this.unrecoverable=actor.system.attributes.hp.unrecoverable,this.details=actor.system.attributes.hp.details||""}get breakdown(){return compact([__privateGet(this,_baseMax)>0?game.i18n.format("PF2E.MaxHitPointsBaseLabel",{base:__privateGet(this,_baseMax)}):null,...this.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${signedInteger(m.modifier)}`)]).join(", ")}getTraceData(){return{slug:this.slug,label:this.label,value:this.value,max:this.max,temp:this.temp,breakdown:this.breakdown,negativeHealing:this.negativeHealing,unrecoverable:this.unrecoverable,details:this.details,modifiers:this.modifiers.map(m=>m.toObject())}}};_baseMax=new WeakMap,__name2(_HitPointsStatistic,"HitPointsStatistic");let HitPointsStatistic=_HitPointsStatistic;const TRICK_MAGIC_SKILLS=["arcana","nature","occultism","religion"],TrickMagicTradition={arcana:"arcane",nature:"primal",occultism:"occult",religion:"divine"},traditionSkills={arcane:"arcana",divine:"religion",occult:"occultism",primal:"nature"},_TrickMagicItemEntry=class{static{__name(this,"_TrickMagicItemEntry")}id;actor;skill;statistic;attribute;get ability(){return foundry.utils.logCompatibilityWarning("`TrickMagicItemEntry#ability` is deprecated. Use `TrickMagicItemEntry#attribute` instead.",{since:"5.3.0",until:"6.0.0"}),this.attribute}tradition;constructor(actor,skill){if(!actor.isOfType("character"))throw ErrorPF2e("Trick magic entries may only be constructed with PCs");this.actor=actor,this.skill=skill,this.id=`trick-${this.skill}`;const attributes=actor.abilities,{attribute}=["int","wis","cha"].map(attribute2=>({attribute:attribute2,mod:attributes[attribute2].mod})).reduce((highest,next)=>next.mod>highest.mod?next:highest);this.attribute=attribute;const tradition=this.tradition=TrickMagicTradition[skill],selectors=[`${attribute}-based`,"all","spell-attack-dc"],attackSelectors=[`${tradition}-spell-attack`,"spell-attack","spell-attack-roll","attack","attack-roll"],saveSelectors=[`${tradition}-spell-dc`,"spell-dc"],skillRank=actor.skills[skill].rank,trickRank=skillRank===4?2:skillRank===3?1:0;this.statistic=new Statistic(actor,{slug:`trick-${tradition}`,label:CONFIG.PF2E.magicTraditions[tradition],attribute,rank:trickRank||"untrained-level",modifiers:extractModifiers(actor.synthetics,selectors),domains:selectors,check:{type:"attack-roll",modifiers:extractModifiers(actor.synthetics,attackSelectors),domains:attackSelectors},dc:{modifiers:extractModifiers(actor.synthetics,saveSelectors),domains:saveSelectors}})}get name(){return game.i18n.localize("PF2E.TrickMagicItemPopup.Title")}get sort(){return 0}get category(){return"items"}get spells(){return null}get isFlexible(){return!1}get isFocusPool(){return!1}get isInnate(){return!1}get isPrepared(){return!1}get isRitual(){return!1}get isSpontaneous(){return!1}canCast(){return!0}async cast(spell,options={}){const{rollMode,message}=options,castLevel=spell.computeCastRank(spell.rank);if(message!==!1)try{spell.trickMagicEntry=this,await spell.toMessage(void 0,{rollMode,data:{castLevel}})}finally{spell.trickMagicEntry=null}}async getSheetData(){return{id:this.id,name:this.name,statistic:this.statistic.getChatData(),tradition:this.tradition,category:"items",hasCollection:!1,sort:0,levels:[],spellPrepList:null}}};__name2(_TrickMagicItemEntry,"TrickMagicItemEntry");let TrickMagicItemEntry=_TrickMagicItemEntry;const _CriticalHitAndFumbleCards=class{static{__name(this,"_CriticalHitAndFumbleCards")}static handleDraw(message){if(message.isAuthor&&message.isContentVisible){const type=message.flags.pf2e.context?.type??"",firstDie=message.rolls.at(0)?.dice[0];firstDie&&firstDie.faces===20&&this.rollTypes.includes(type)&&(firstDie.total===20?this.automaticDraw("critTable"):firstDie.total===1&&this.automaticDraw("fumbleTable"))}}static automaticDraw(table){this.diceSoNice??=!!game.modules.get("dice-so-nice")?.active,this.diceSoNice?Hooks.once("diceSoNiceRollComplete",()=>{this.drawFromTable(table,!0)}):this.drawFromTable(table,!0)}static drawFromTable(table,automatic=!1){const tableId=table==="critTable"?"FTEpsIWWVrDj0jNG":"WzMGWMIrrPvSp75D";game.packs.get("pf2e.rollable-tables",{strict:!0}).getDocument(tableId).then(rollTable=>{rollTable.draw({displayChat:!1}).then(draw=>{const data={roll:draw.roll,messageData:{}};automatic&&!this.diceSoNice&&(data.messageData.sound=void 0),rollTable.toMessage(draw.results,data)})})}static appendButtons(message,$html){if(this.appendButtonsOption??=game.settings.get("pf2e","critFumbleButtons"),this.appendButtonsOption&&(message.isAuthor||game.user.isGM)&&message.isContentVisible){const type=message.flags.pf2e.context?.type??"";if(this.rollTypes.includes(type)){const critButton=$(``),fumbleButton=$(``),btnContainer1=$('');btnContainer1.append(critButton),btnContainer1.append(fumbleButton),critButton.on("click",event=>{event.stopPropagation(),this.drawFromTable("critTable"),event.currentTarget.blur()}),fumbleButton.on("click",event=>{event.stopPropagation(),this.drawFromTable("fumbleTable"),event.currentTarget.blur()}),$html.find(".dice-total").wrapInner('').append(btnContainer1)}}}};__name2(_CriticalHitAndFumbleCards,"CriticalHitAndFumbleCards"),__publicField(_CriticalHitAndFumbleCards,"rollTypes",["attack-roll","spell-attack-roll"]),__publicField(_CriticalHitAndFumbleCards,"diceSoNice"),__publicField(_CriticalHitAndFumbleCards,"appendButtonsOption");let CriticalHitAndFumbleCards=_CriticalHitAndFumbleCards;async function repair(options){const item=options.item??(options.uuid?await fromUuid(options.uuid):await SelectItemDialog.getItem("repair"));if(item&&!(item instanceof PhysicalItemPF2e)){ui.notifications.warn(game.i18n.format("PF2E.Actions.Repair.Warning.NotPhysicalItem",{item:item.name??""}));return}const dc=options.difficultyClass??(()=>{if(item){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant");return{label:game.i18n.format("PF2E.Actions.Repair.Labels.ItemLevelRepairDC",{level:item.level}),value:calculateDC(item.level,{proficiencyWithoutLevel}),visibility:"all"}}})(),targetItemOptions=Array.from(item?.traits??[]).map(trait=>`target:trait:${trait}`),slug=options?.skill??"crafting",rollOptions=["action:repair",...targetItemOptions],modifiers=options?.modifiers;ActionMacroHelpers.simpleRollActionCheck({actors:options.actors,actionGlyph:options.glyph,title:"PF2E.Actions.Repair.Title",checkContext:opts=>ActionMacroHelpers.defaultCheckContext(opts,{modifiers,rollOptions,slug}),content:async title=>{if(item){const templatePath="systems/pf2e/templates/system/actions/repair/item-heading-partial.hbs",templateData={item},content=await renderTemplate(templatePath,templateData);return title+content}},traits:["exploration","manipulate"],event:options.event,difficultyClass:dc,extraNotes:selector=>[ActionMacroHelpers.note(selector,"PF2E.Actions.Repair","criticalSuccess"),ActionMacroHelpers.note(selector,"PF2E.Actions.Repair","success"),ActionMacroHelpers.note(selector,"PF2E.Actions.Repair","criticalFailure")],createMessage:!1,callback:async result=>{const{actor}=result;if(item&&result.message instanceof ChatMessagePF2e&&actor.isOfType("creature")){const messageSource=result.message.toObject(),flavor=await(async()=>{const proficiencyRank=actor.skills.crafting.rank??0;if(result.outcome==="criticalSuccess"){const label="PF2E.Actions.Repair.Labels.RestoreItemHitPoints",restored=String(10+proficiencyRank*10);return renderRepairResult(item,"restore",label,restored)}else if(result.outcome==="success"){const label="PF2E.Actions.Repair.Labels.RestoreItemHitPoints",restored=String(5+proficiencyRank*5);return renderRepairResult(item,"restore",label,restored)}else if(result.outcome==="criticalFailure")return renderRepairResult(item,"roll-damage","PF2E.Actions.Repair.Labels.RollItemDamage","2d6");return""})();flavor&&(messageSource.flavor+=flavor),await ChatMessage.create(messageSource)}}}).catch(error=>{throw ui.notifications.error(error.message),error})}__name(repair,"repair"),__name2(repair,"repair");async function onRepairChatCardEvent(event,message,card){const itemUuid=card.dataset.itemUuid,item=await fromUuid(itemUuid??""),button=event.currentTarget;if(!(item instanceof PhysicalItemPF2e)||!(button instanceof HTMLElement))return;const repair2=button.dataset.repair,speaker=message&&ChatMessagePF2e.getSpeaker({actor:message.actor,alias:message.alias,token:message.token});if(repair2==="restore"){const value=Number(button.dataset.repairValue)||0,beforeRepair=item.system.hp.value,afterRepair=Math.min(item.system.hp.max,beforeRepair+value);await item.update({"system.hp.value":afterRepair});const content=game.i18n.format("PF2E.Actions.Repair.Chat.ItemRepaired",{itemName:item.name,repairedDamage:afterRepair-beforeRepair,afterRepairHitPoints:afterRepair,maximumHitPoints:item.system.hp.max});await ChatMessage.create({content,speaker})}else if(repair2==="roll-damage"){const roll=await Roll.create("2d6").evaluate({async:!0}),templatePath="systems/pf2e/templates/system/actions/repair/roll-damage-chat-message.hbs",flavor=await renderTemplate(templatePath,{damage:{dealt:Math.max(0,roll.total-item.system.hardness),rolled:roll.total},item});await roll.toMessage({flags:{pf2e:{suppressDamageButtons:!0}},flavor,speaker})}else if(repair2==="damage"){const hardness=Math.max(0,item.system.hardness),damage=(message?.rolls.at(0)?.total??0)-hardness;if(damage>0){const beforeDamage=item.system.hp.value,afterDamage=Math.max(0,item.system.hp.value-damage);await item.update({"system.hp.value":afterDamage});const content=game.i18n.format("PF2E.Actions.Repair.Chat.ItemDamaged",{itemName:item.name,damageDealt:beforeDamage-afterDamage,afterDamageHitPoints:afterDamage,maximumHitPoints:item.system.hp.max});await ChatMessage.create({content,speaker})}else{const templatePath="systems/pf2e/templates/system/actions/repair/roll-damage-chat-message.hbs",content=await renderTemplate(templatePath,{damage:{dealt:0,rolled:message?.rolls.at(0)?.total??0},item});await ChatMessage.create({content,speaker})}}}__name(onRepairChatCardEvent,"onRepairChatCardEvent"),__name2(onRepairChatCardEvent,"onRepairChatCardEvent");async function renderRepairResult(item,result,buttonLabel,value){const templatePath="systems/pf2e/templates/system/actions/repair/repair-result-partial.hbs",label=game.i18n.format(buttonLabel,{value});return renderTemplate(templatePath,{item,label,result,value})}__name(renderRepairResult,"renderRepairResult"),__name2(renderRepairResult,"renderRepairResult");const _ChatCards=class{static{__name(this,"_ChatCards")}static listen(message,html){const selector=["a[data-action], button[data-action]"].join(",");for(const button of htmlQueryAll(html,selector))button.addEventListener("click",async event=>__privateMethod(this,_onClickButton,onClickButton_fn).call(this,{message,event,html,button}))}};_lastClick=new WeakMap,_onClickButton=new WeakSet,onClickButton_fn=__name2(async function({message,event,html,button}){const currentTime=Date.now();if(currentTime-__privateGet(this,_lastClick)<500)return;__privateSet(this,_lastClick,currentTime);const action2=button.dataset.action??"",item=message.item,actor=item?.actor??message.actor;if(!actor||!game.user.isGM&&!actor.isOwner&&!["spell-save","expand-description"].includes(action2))return;const strikeAction=message._strike;if(strikeAction&&action2?.startsWith("strike-")){const context=message.rolls.some(r=>r instanceof CheckRoll)?message.flags.pf2e.context??null:null,mapIncreases=context&&"mapIncreases"in context&&tupleHasValue([0,1,2],context.mapIncreases)?context.mapIncreases:null,altUsage=context&&"altUsage"in context?context.altUsage:null,target=message.target?.token?.object??null,rollArgs={event,altUsage,mapIncreases,checkContext:context,target};switch(sluggify(action2??"")){case"strike-attack":strikeAction.variants[0].roll(rollArgs);return;case"strike-attack2":strikeAction.variants[1].roll(rollArgs);return;case"strike-attack3":strikeAction.variants[2].roll(rollArgs);return;case"strike-damage":{const method=button.dataset.outcome==="success"?"damage":"critical";strikeAction[method]?.(rollArgs);return}}}if(item){const spell=item.isOfType("spell")?item:item.isOfType("consumable")?item.embeddedSpell:null;switch(action2){case"spell-attack":return spell?.rollAttack(event);case"spell-attack-2":return spell?.rollAttack(event,2);case"spell-attack-3":return spell?.rollAttack(event,3);case"spell-damage":spell?.rollDamage(event);return;case"spell-save":return __privateMethod(this,_rollActorSaves,rollActorSaves_fn).call(this,{event,button,actor,item});case"affliction-save":item?.isOfType("affliction")&&item.rollRecovery();return;case"spell-counteract":spell?.rollCounteract(event);return;case"spell-template":return spell?.placeTemplate(message);case"spell-template-clear":{const templateIds=canvas.scene?.templates.filter(t=>t.message===message).map(t=>t.id)??[];button.disabled=!0,await canvas.scene?.deleteEmbeddedDocuments("MeasuredTemplate",templateIds),button.disabled=!1;return}case"spell-variant":{const castLevel=Number(htmlQuery(html,"div.chat-card")?.dataset.castLevel)||1,overlayIds=button.dataset.overlayIds?.split(",").map(id=>id.trim());if(overlayIds){const variantSpell=spell?.loadVariant({overlayIds,castLevel});if(variantSpell){const variantMessage=await variantSpell.toMessage(void 0,{create:!1,data:{castLevel}});if(variantMessage){const messageSource=variantMessage.toObject();await message.update(messageSource)}}}else if(spell){const originalMessage=await(spell?.original??spell).toMessage(void 0,{create:!1,data:{castLevel}});originalMessage&&await message.update(originalMessage.toObject())}return}case"consume":{if(item.isOfType("consumable"))item.consume();else if(item.isOfType("melee")){const consumable=actor.items.get(button.dataset.item??"");if(consumable?.isOfType("consumable")){const oldQuant=consumable.quantity,consumableString=game.i18n.localize("TYPES.Item.consumable"),toReplace=`${consumable.name} - ${consumableString} (${oldQuant})`;await consumable.consume();const currentQuant=oldQuant===1?0:consumable.quantity;let flavor=message.flavor.replace(toReplace,`${consumable.name} - ${consumableString} (${currentQuant})`);if(currentQuant===0){const buttonStr=`>${game.i18n.localize("PF2E.ConsumableUseLabel")}`;flavor=flavor?.replace(buttonStr," disabled"+buttonStr)}await message.update({flavor}),message.render(!0)}}return}case"expand-description":{const{description}=item,element=htmlClosest(button,".description");element&&(element.innerHTML=await TextEditor.enrichHTML(description,{async:!0,rollData:actor.getRollData()}),element.scrollIntoView({behavior:"smooth",block:"center"}));break}case"apply-effect":{button.disabled=!0;const target=fromUuidSync(button.dataset.targets??""),effect=item.isOfType("action","feat")&&item.system.selfEffect?await fromUuid(item.system.selfEffect.uuid):null;if(target instanceof ActorPF2e&&effect instanceof ItemPF2e&&effect.isOfType("effect")){await target.createEmbeddedDocuments("Item",[effect.clone().toObject()]);const parsedMessageContent=(()=>{const container=document.createElement("div");return container.innerHTML=message.content,container})(),buttons=htmlQuery(parsedMessageContent,".message-buttons");if(buttons){const span=createHTMLElement("span",{classes:["effect-applied"]}),anchor=effect.toAnchor({attrs:{draggable:"true"}}),locKey="PF2E.Item.Action.SelfAppliedEffect.Applied",statement=game.i18n.format(locKey,{effect:anchor.outerHTML});span.innerHTML=statement,buttons.replaceChildren(span),await message.update({content:parsedMessageContent.innerHTML})}}break}case"elemental-blast-damage":{if(!actor.isOfType("character"))return;const roll=message.rolls.find(r=>r instanceof CheckRoll&&r.options.action==="elemental-blast"),checkContext=roll?message.flags.pf2e.context??null:null,outcome=button.dataset.outcome==="success"?"success":"criticalSuccess",[element,damageType,meleeOrRanged,actionCost]=roll?.options.identifier?.split(".")??[];objectHasKey(elementTraits,element)&&objectHasKey(CONFIG.PF2E.damageTypes,damageType)&&await new ElementalBlast(actor).damage({element,damageType,melee:meleeOrRanged==="melee",actionCost:Number(actionCost)||1,checkContext,outcome,event})}}}else if(action2&&actor.isOfType("character","npc")){const buttonGroup=htmlClosest(button,".chat-card, .message-buttons"),physicalItem=await(async()=>{const itemUuid=buttonGroup?.dataset.itemUuid??"",maybeItem=await fromUuid(itemUuid);return maybeItem instanceof PhysicalItemPF2e?maybeItem:null})(),quantity=Number(buttonGroup?.dataset.craftingQuantity)||1;if(action2==="repair-item"&&buttonGroup)await onRepairChatCardEvent(event,message,buttonGroup);else if(physicalItem&&action2==="pay-crafting-costs"){const quantity2=Number(buttonGroup?.dataset.craftingQuantity)||1,craftingCost=CoinsPF2e.fromPrice(physicalItem.price,quantity2),coinsToRemove=button.classList.contains("full")?craftingCost:craftingCost.scale(.5);if(!await actor.inventory.removeCoins(coinsToRemove)){ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.InsufficientCoins"));return}if(isSpellConsumable(physicalItem.id)&&physicalItem.isOfType("consumable")){craftSpellConsumable(physicalItem,quantity2,actor),ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.PayAndReceive",{actorName:actor.name,cost:coinsToRemove.toString(),quantity:quantity2,itemName:physicalItem.name}),speaker:{alias:actor.name}});return}const itemObject=physicalItem.toObject();if(itemObject.system.quantity=quantity2,!await actor.addToInventory(itemObject,void 0)){ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.CantAddItem"));return}ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.LoseMaterials",{actorName:actor.name,cost:coinsToRemove.toString(),quantity:quantity2,itemName:physicalItem.name}),speaker:{alias:actor.name}})}else if(physicalItem&&action2==="lose-materials"){const coinsToRemove=CoinsPF2e.fromPrice(physicalItem.price,quantity).scale(.5).scale(.1);await actor.inventory.removeCoins(coinsToRemove)?ChatMessagePF2e.create({user:game.user.id,content:game.i18n.format("PF2E.Actions.Craft.Information.PayAndReceive",{actorName:actor.name,cost:coinsToRemove.toString()}),speaker:{alias:actor.name}}):ui.notifications.warn(game.i18n.localize("PF2E.Actions.Craft.Warning.InsufficientCoins"))}else if(action2==="receieve-crafting-item"&&physicalItem)return isSpellConsumable(physicalItem.id)&&physicalItem.isOfType("consumable")?craftSpellConsumable(physicalItem,quantity,actor):craftItem(physicalItem,quantity,actor)}},"#onClickButton"),_rollActorSaves=new WeakSet,rollActorSaves_fn=__name2(async function({event,button,actor,item}){if(canvas.tokens.controlled.length>0){const saveType=button.dataset.save;if(!tupleHasValue(SAVE_TYPES,saveType))throw ErrorPF2e(`"${saveType}" is not a recognized save type`);const dc=Number(button.dataset.dc??"NaN");for(const token of canvas.tokens.controlled){const save=token.actor?.saves?.[saveType];if(!save)return;save.check.roll({...eventToRollParams(event,{type:"check"}),dc:Number.isInteger(dc)?{value:Number(dc)}:null,item,origin:actor})}}else ui.notifications.error(game.i18n.localize("PF2E.UI.errorTargetToken"))},"#rollActorSaves"),__privateAdd(_ChatCards,_onClickButton),__privateAdd(_ChatCards,_rollActorSaves),__name2(_ChatCards,"ChatCards"),__privateAdd(_ChatCards,_lastClick,0);let ChatCards=_ChatCards;const DamageTaken={listen:async(message,html)=>{const damageTakenCard=htmlQuery(html,".damage-taken");if(!damageTakenCard)return;const settingEnabled=game.settings.get("pf2e","metagame_tokenSetsNameVisibility");if(!game.user.isGM&&settingEnabled&&message.token&&!message.token.playersCanSeeName){const nameElem=htmlQuery(damageTakenCard,".target-name");nameElem&&(nameElem.innerText=game.i18n.localize("PF2E.Actor.ApplyDamage.TheTarget"))}const iwrInfo=htmlQuery(damageTakenCard,".iwr");if(!iwrInfo)return;const iwrApplications=(()=>{try{const parsed=JSON.parse(iwrInfo?.dataset.applications??"null");return Array.isArray(parsed)&&parsed.every(a=>a instanceof Object&&"category"in a&&typeof a.category=="string"&&"type"in a&&typeof a.type=="string"&&"adjustment"in a&&typeof a.adjustment=="number")?parsed:null}catch{return null}})();iwrApplications&&$(iwrInfo).tooltipster({theme:"crb-hover",maxWidth:400,content:await renderTemplate("systems/pf2e/templates/chat/damage/iwr-breakdown.hbs",{applications:iwrApplications}),contentAsHTML:!0})}},DegreeOfSuccessHighlights={listen:(message,html)=>{if(htmlQueryAll(html,".pf2e-reroll-indicator").length>0)return;const firstRoll=message.rolls.at(0);if(!firstRoll||message.isDamageRoll)return;const firstDice=firstRoll.dice.at(0);if(!(firstDice instanceof Die&&firstDice.faces===20&&message.isContentVisible))return;const diceTotal=htmlQuery(html,".dice-total"),results=firstDice.results.filter(r=>r.active);results.every(r=>r.result===20)?diceTotal?.classList.add("success"):results.every(r=>r.result===1)&&diceTotal?.classList.add("failure")}},SetAsInitiative={listen:li=>{const message=game.messages.get(li.dataset.messageId??"",{strict:!0}),{context}=message.flags.pf2e;if(message.token&&(message.isAuthor&&!message.blind||game.user.isGM)&&(context?.type==="skill-check"||context?.type==="perception-check")){const btnContainer=document.createElement("span");btnContainer.classList.add("dmgBtn-container"),Object.assign(btnContainer.style,{position:"absolute",right:"0",bottom:"1px"});const setInitiativeButton=document.createElement("button");setInitiativeButton.classList.add("dice-total-setInitiative-btn"),Object.assign(setInitiativeButton.style,{width:"22px",height:"22px",fontSize:"10px",lineHeight:"1px"}),setInitiativeButton.title=game.i18n.localize("PF2E.ClickToSetInitiative"),setInitiativeButton.appendChild(fontAwesomeIcon("fa-swords",{style:"solid"})),btnContainer.appendChild(setInitiativeButton);const selector=message.isReroll?".pf2e-reroll-second .dice-total":".dice-total";li.querySelector(selector)?.appendChild(btnContainer),setInitiativeButton.addEventListener("click",async event=>{event.stopPropagation();const{actor,token}=message;if(!token){ui.notifications.error(game.i18n.format("PF2E.Encounter.NoTokenInScene",{actor:message.actor?.name??message.user?.name??""}));return}if(!actor)return;const combatant=await CombatantPF2e.fromActor(actor);if(!combatant)return;const value=message.rolls.at(0)?.total??0;await combatant.encounter.setInitiative(combatant.id,value),ui.notifications.info(game.i18n.format("PF2E.Encounter.InitiativeSet",{actor:actor.name,initiative:value}))})}}},_RollInspector=class extends Application{static{__name(this,"_RollInspector")}constructor(message,options={}){super(options),this.message=message}static get defaultOptions(){return{...super.defaultOptions,title:"PF2E.ChatRollDetails.Title",template:"systems/pf2e/templates/chat/roll-inspector.hbs",classes:["roll-inspector"],filters:[{inputSelector:"input[type=search]",contentSelector:".roll-options > ul"}],resizable:!0,width:600,height:420}}getData(){const{context}=this.message.flags.pf2e,rollOptions=(()=>{const allOptions=context?.options??[],topLevelOptions=allOptions.filter(option=>!option.includes(":")),remainingOptions=allOptions.filter(option=>option.includes(":"));return[...topLevelOptions.sort(),...remainingOptions.sort()]})(),modifiers=this.message.flags.pf2e.modifiers?.map(mod=>{const value="dieSize"in mod?`+${mod.diceNumber}${mod.dieSize}`:signedInteger(mod.modifier??0);return{...mod,value,critical:mod.critical!==null?game.i18n.localize(`PF2E.RuleEditor.General.CriticalBehavior.${mod.critical}`):null}})??[];return{context,domains:context?.domains?.sort()??[],modifiers,rollOptions}}_onSearchFilter(_event,query,_rgx,html){for(const row of htmlQueryAll(html,":scope > li"))row.hidden=query.length>0&&!row.innerText.includes(query)}};__name2(_RollInspector,"RollInspector");let RollInspector=_RollInspector;const _ChatMessagePF2e=class _ChatMessagePF2e2 extends ChatMessage{static{__name(this,"_ChatMessagePF2e")}constructor(data={},context={}){const expandedFlags=expandObject(data.flags??{});data.flags=mergeObject(expandedFlags,{core:{canPopout:expandedFlags.core?.canPopout??!0},pf2e:{}}),super(data,context),__privateAdd(this,_onHoverIn),__privateAdd(this,_onHoverOut)}get isDamageRoll(){const firstRoll=this.rolls.at(0);if(!firstRoll||firstRoll.terms.some(t=>t instanceof FateDie||t instanceof Coin))return!1;if(this.flags.pf2e.context?.type==="damage-roll")return!0;const isCheck=firstRoll instanceof CheckRoll||firstRoll.dice[0]?.faces===20,fromRollTable=!!this.flags.core.RollTable;return!(isCheck||fromRollTable)}get actor(){return _ChatMessagePF2e2.getSpeakerActor(this.speaker)}get target(){const context=this.flags.pf2e.context;if(!context)return null;const targetUUID="target"in context?context.target?.token:null;if(!targetUUID)return null;const match=/^Scene\.(\w+)\.Token\.(\w+)$/.exec(targetUUID??"")??[],token=game.scenes.get(match[1]??"")?.tokens.get(match[2]??""),actor=token?.actor;return actor?{actor,token}:null}get journalEntry(){const uuid=this.flags.pf2e.journalEntry;if(!uuid)return null;const entryId=/^JournalEntry.([A-Za-z0-9]{16})$/.exec(uuid)?.at(1);return game.journal.get(entryId??"")??null}get isCheckRoll(){return this.rolls[0]instanceof CheckRoll}get isReroll(){const context=this.flags.pf2e.context;return!!context&&"isReroll"in context&&!!context.isReroll}get isRerollable(){const roll=this.rolls[0];return!!(this.actor?.isOwner&&(this.isAuthor||this.isOwner)&&roll instanceof CheckRoll&&roll.isRerollable)}get item(){if(this.flags.pf2e.context?.type==="self-effect")return this.actor?.items.get(this.flags.pf2e.context.item)??null;const strike=this._strike;if(strike?.item)return strike.item;const item=(()=>{const domItem=this.getItemFromDOM();if(domItem)return domItem;const origin=this.flags.pf2e?.origin??null,match=/Item\.(\w+)/.exec(origin?.uuid??"")??[];return this.actor?.items.get(match?.[1]??"")??null})();if(!item)return null;const{tradition}=this.flags.pf2e?.casting??{},isCharacter=item.actor.isOfType("character");if(tradition&&item.isOfType("spell")&&!item.spellcasting&&isCharacter){const trick=new TrickMagicItemEntry(item.actor,traditionSkills[tradition]);item.trickMagicEntry=trick}if(item?.isOfType("spell")){const overlayIds=this.flags.pf2e.origin?.variant?.overlays,castLevel=this.flags.pf2e.origin?.castLevel??item.rank;return item.loadVariant({overlayIds,castLevel})??item}return item}get _strike(){const{actor}=this,identifier=this.rolls.find(r=>r instanceof CheckRoll)?.options.identifier??htmlQuery(document.body,`li.message[data-message-id="${this.id}"] [data-identifier]`)?.dataset.identifier,[itemId,slug,meleeOrRanged]=identifier?.split(".")??[null,null,null];if(!meleeOrRanged||!["melee","ranged"].includes(meleeOrRanged))return null;const strikeData=actor?.system.actions?.find(s=>s.slug===slug&&s.item.id===itemId),itemMeleeOrRanged=strikeData?.item.isMelee?"melee":"ranged";return meleeOrRanged===itemMeleeOrRanged?strikeData??null:strikeData?.altUsages?.find(u=>{const altUsageMeleeOrRanged=u.item.isMelee?"melee":"ranged";return meleeOrRanged===altUsageMeleeOrRanged})??null}getItemFromDOM(){const html=ui.chat.element[0],messageElem=htmlQuery(html,`#chat-log > li[data-message-id="${this.id}"]`),sourceString=htmlQuery(messageElem,".pf2e.item-card")?.dataset.embeddedItem??"null";try{const itemSource=JSON.parse(sourceString);return itemSource?new ItemProxyPF2e(itemSource,{parent:this.actor,fromConsumable:this.flags?.pf2e?.isFromConsumable}):null}catch{return null}}async showDetails(){this.flags.pf2e.context&&new RollInspector(this).render(!0)}get token(){if(!game.scenes)return null;const sceneId=this.speaker.scene??"",tokenId=this.speaker.token??"";return game.scenes.get(sceneId)?.tokens.get(tokenId)??null}getRollData(){const{actor,item}=this;return{...actor?.getRollData(),...item?.getRollData()}}async getHTML(){const{actor}=this;if(this.isContentVisible){const rollData=this.getRollData();this.flavor=await TextEditorPF2e.enrichHTML(this.flavor,{async:!0,rollData,processVisibility:!1})}const $html=await super.getHTML(),html=$html[0];!this.flags.pf2e.suppressDamageButtons&&this.isDamageRoll&&htmlQueryAll(html,".damage-application").forEach((buttons,index)=>{buttons.dataset.rollIndex=index.toString()}),UserVisibilityPF2e.process(html,{message:this}),await DamageTaken.listen(this,html),CriticalHitAndFumbleCards.appendButtons(this,$html),ChatCards.listen(this,html),InlineRollLinks.listen(html,this),DegreeOfSuccessHighlights.listen(this,html),canvas.ready&&SetAsInitiative.listen(html);const roll=this.rolls[0];if(actor?.isOwner&&roll instanceof DamageRoll&&roll.options.evaluatePersistent){const damageType=roll.instances.find(i=>i.persistent)?.type;if(damageType?this.actor?.getCondition(`persistent-damage-${damageType}`):null){const template="systems/pf2e/templates/chat/persistent-damage-recovery.hbs",section=parseHTML(await renderTemplate(template));html.querySelector(".message-content")?.append(section),html.dataset.actorIsTarget="true"}htmlQuery(html,"[data-action=recover-persistent-damage]")?.addEventListener("click",()=>{const{actor:actor2}=this;if(!actor2)return;const damageType2=roll.instances.find(i=>i.persistent)?.type;if(!damageType2)return;const condition2=actor2.getCondition(`persistent-damage-${damageType2}`);if(!condition2?.system.persistent){const damageTypeLocalized=game.i18n.localize(CONFIG.PF2E.damageTypes[damageType2]??damageType2),message=game.i18n.format("PF2E.Item.Condition.PersistentDamage.Error.DoesNotExist",{damageType:damageTypeLocalized});ui.notifications.warn(message);return}condition2.rollRecovery()})}return this.flags.pf2e.appliedDamage?.isReverted||this.actor?.isOwner||htmlQuery(html,"button[data-action=revert-damage]")?.remove(),html.addEventListener("mouseenter",event=>__privateMethod(this,_onHoverIn,onHoverIn_fn).call(this,event)),html.addEventListener("mouseleave",event=>__privateMethod(this,_onHoverOut,onHoverOut_fn).call(this,event)),UserVisibilityPF2e.processMessageSender(this,html),!actor&&this.content&&UserVisibilityPF2e.process(html,{document:this}),$html}_onCreate(data,options,userId){super._onCreate(data,options,userId),this.isRoll&&game.settings.get("pf2e","drawCritFumble")&&CriticalHitAndFumbleCards.handleDraw(this)}};_onHoverIn=new WeakSet,onHoverIn_fn=__name2(function(nativeEvent){if(!canvas.ready)return;const token=this.token?.object;token?.isVisible&&!token.controlled&&token.emitHoverIn(nativeEvent)},"#onHoverIn"),_onHoverOut=new WeakSet,onHoverOut_fn=__name2(function(nativeEvent){canvas.ready&&this.token?.object?.emitHoverOut(nativeEvent)},"#onHoverOut"),__name2(_ChatMessagePF2e,"ChatMessagePF2e");let ChatMessagePF2e=_ChatMessagePF2e;async function preImportJSON(document2,json2){const source=JSON.parse(json2);if(!isObject(source)||("data"in source&&("items"in source?ActorPF2e.migrateData(source):ItemPF2e.migrateData(source)),!isObject(source.system)))return null;const sourceSchemaVersion=Number(source.system?._migration?.version)||0,worldSchemaVersion=MigrationRunnerBase.LATEST_SCHEMA_VERSION;if(foundry.utils.isNewerVersion(sourceSchemaVersion,worldSchemaVersion))return ui.notifications.error(game.i18n.format("PF2E.ErrorMessage.CantImportTooHighVersion",{sourceName:game.i18n.localize("DOCUMENT.Actor"),sourceSchemaVersion,worldSchemaVersion})),null;const newDoc=new document2.constructor(source,{parent:document2.parent}),migrations=MigrationList.constructFromVersion(newDoc.schemaVersion);return await MigrationRunner.ensureSchemaVersion(newDoc,migrations),JSON.stringify(newDoc.toObject())}__name(preImportJSON,"preImportJSON"),__name2(preImportJSON,"preImportJSON");function combatantAndTokenDoc(document2){return document2 instanceof CombatantPF2e?{combatant:document2,tokenDoc:document2.token}:{combatant:document2.combatant,tokenDoc:document2}}__name(combatantAndTokenDoc,"combatantAndTokenDoc"),__name2(combatantAndTokenDoc,"combatantAndTokenDoc");async function processGrantDeletions(item,pendingItems){const{actor}=item,granter=actor.items.get(item.flags.pf2e.grantedBy?.id??""),parentGrant=Object.values(granter?.flags.pf2e.itemGrants??{}).find(g=>g.id===item.id),grants=Object.values(item.flags.pf2e.itemGrants);if(granter&&parentGrant?.onDelete==="restrict"&&!pendingItems.includes(granter)){ui.notifications.warn(game.i18n.format("PF2E.Item.RemovalPrevented",{item:item.name,preventer:granter.name})),pendingItems.splice(pendingItems.indexOf(item),1);return}for(const grant of grants){const grantee=actor.items.get(grant.id);if(grantee?.flags.pf2e.grantedBy?.id===item.id&&grantee.flags.pf2e.grantedBy.onDelete==="restrict"&&!pendingItems.includes(grantee)){ui.notifications.warn(game.i18n.format("PF2E.Item.RemovalPrevented",{item:item.name,preventer:grantee.name})),pendingItems.splice(pendingItems.indexOf(item),1);return}}granter&&parentGrant?.onDelete==="cascade"&&!pendingItems.includes(granter)&&(pendingItems.push(granter),await processGrantDeletions(granter,pendingItems));for(const grant of grants){const grantee=actor.items.get(grant.id);grantee?.flags.pf2e.grantedBy?.id===item.id&&grantee.flags.pf2e.grantedBy.onDelete==="cascade"&&!pendingItems.includes(grantee)&&(pendingItems.push(grantee),await processGrantDeletions(grantee,pendingItems))}const[key]=Object.entries(granter?.flags.pf2e.itemGrants??{}).find(([,g])=>g===parentGrant)??[null];granter&&key&&!pendingItems.includes(granter)&&await granter.update({[`flags.pf2e.itemGrants.-=${key}`]:null},{render:!1});for(const grant of grants){const grantee=actor.items.get(grant.id);grantee?.flags.pf2e.grantedBy?.id===item.id&&grantee.flags.pf2e.grantedBy.onDelete==="detach"&&!pendingItems.includes(grantee)&&await grantee.update({"flags.pf2e.-=grantedBy":null},{render:!1})}}__name(processGrantDeletions,"processGrantDeletions"),__name2(processGrantDeletions,"processGrantDeletions");const _ItemPF2e=class _ItemPF2e2 extends Item{static{__name(this,"_ItemPF2e")}static getDefaultArtwork(itemData){return{img:`systems/pf2e/icons/default-icons/${itemData.type}.svg`}}get slug(){return this.system.slug}get sourceId(){return this.flags.core?.sourceId??null}get schemaVersion(){return Number(this.system._migration?.version??this.system.schema?.version)||null}get description(){return this.system.description.value.trim()}get grantedBy(){return this.actor?.items.get(this.flags.pf2e.grantedBy?.id??"")??null}get inMemoryOnly(){return!this.collection.has(this.id)}static fromDropData(data,options){if("uuid"in data&&UUIDUtils.isItemUUID(data.uuid)){const item=fromUuidSync(data.uuid);item instanceof _ItemPF2e2&&item.parent&&!item.sourceId&&(item._source.flags=mergeObject(item._source.flags,{core:{sourceId:item.uuid}}),item.flags=mergeObject(item.flags,{core:{sourceId:item.uuid}}))}return super.fromDropData(data,options)}isOfType(...types){return types.some(t=>t==="physical"?setHasElement(PHYSICAL_ITEM_TYPES,this.type):this.type===t)}async delete(context={}){return this.actor?(await this.actor.deleteEmbeddedDocuments("Item",[this.id],context),this):super.delete(context)}getRollOptions(prefix=this.type){if(prefix.length===0)throw ErrorPF2e("`prefix` must be at least one character long");const slug=this.slug??sluggify(this.name),{value:traits=[],otherTags}=this.system.traits,traitOptions=(()=>{const damageType=Object.keys(CONFIG.PF2E.damageTypes).join("|"),diceOrNumber=/-(?:[0-9]*d)?[0-9]+(?:-min)?$/,versatile=new RegExp(`-(?:b|p|s|${damageType})$`),deannotated=traits.filter(t=>diceOrNumber.test(t)||versatile.test(t)).map(t=>t.replace(diceOrNumber,"").replace(versatile,""));return[traits,deannotated].flat().map(t=>`trait:${t}`)})(),options=[`${prefix}:id:${this.id}`,`${prefix}:${slug}`,`${prefix}:slug:${slug}`,...traitOptions.map(t=>`${prefix}:${t}`),...otherTags.map(t=>`${prefix}:tag:${t}`)];(this.isOfType("spell")||traits.some(t=>["magical",...MAGIC_TRADITIONS].includes(t)))&&options.push(`${prefix}:magical`);const level=this.isOfType("spell")?this.rank:this.system.level?.value??null;typeof level=="number"&&options.push(`${prefix}:level:${level}`);const itemType=this.isOfType("feat")&&this.isFeature?"feature":this.type;return prefix!==itemType&&options.unshift(`${prefix}:type:${itemType}`),options.sort()}getRollData(){return{...this.actor?.getRollData()??{actor:null},item:this}}async toMessage(event,{rollMode=void 0,create=!0,data={}}={}){if(!this.actor)throw ErrorPF2e(`Cannot create message for unowned item ${this.name}`);const template=`systems/pf2e/templates/chat/${sluggify(this.type)}-card.hbs`,token=this.actor.token,nearestItem=event?.currentTarget.closest(".item")??{},contextualData=Object.keys(data).length>0?data:nearestItem.dataset||{},templateData={actor:this.actor,tokenId:token?`${token.parent?.id}.${token.id}`:null,item:this,data:await this.getChatData(void 0,contextualData)},chatData={speaker:ChatMessagePF2e.getSpeaker({actor:this.actor,token:this.actor.getActiveTokens(!1,!0)[0]??null}),flags:{pf2e:{origin:this.getOriginData()}},type:CONST.CHAT_MESSAGE_TYPES.OTHER};return rollMode??=event?.ctrlKey||event?.metaKey?"blindroll":game.settings.get("core","rollMode"),["gmroll","blindroll"].includes(rollMode)&&(chatData.whisper=ChatMessagePF2e.getWhisperRecipients("GM").map(u=>u.id)),rollMode==="blindroll"&&(chatData.blind=!0),chatData.content=await renderTemplate(template,templateData),create?ChatMessagePF2e.create(chatData,{renderSheet:!1}):new ChatMessagePF2e(chatData)}async toChat(event){return this.toMessage(event,{create:!0})}_initialize(options){this.rules=[],super._initialize(options)}prepareData(){this.parent&&!this.parent.flags?.pf2e||super.prepareData()}prepareBaseData(){super.prepareBaseData();const{flags}=this;flags.pf2e=mergeObject(flags.pf2e??{},{rulesSelections:{}}),this.system.slug||=null,isObject(flags.pf2e.grantedBy)&&(flags.pf2e.grantedBy.onDelete??=this.isOfType("physical")?"detach":"cascade");const grants=flags.pf2e.itemGrants??={};for(const grant of Object.values(grants))isObject(grant)&&(grant.onDelete??="detach")}prepareRuleElements(options={}){if(!this.actor)throw ErrorPF2e("Rule elements may only be prepared from embedded items");return this.rules=this.actor.canHostRuleElements?RuleElements.fromOwnedItem({...options,parent:this}):[]}async refreshFromCompendium(options={}){if(!this.isOwned){ui.notifications.error("This utility may only be used on owned items");return}if(!this.sourceId?.startsWith("Compendium.")){ui.notifications.warn(`Item "${this.name}" has no compendium source.`);return}options.name??=!1;const currentSource=this.toObject(),latestSource=(await fromUuid(this.sourceId))?.toObject();if(latestSource){if(latestSource.type!==this.type){ui.notifications.error(`The compendium source for "${this.name}" is of a different type than what is present on this actor.`);return}}else{ui.notifications.warn(`The compendium source for "${this.name}" (source ID: ${this.sourceId}) was not found.`);return}const updates={img:latestSource.img,system:deepClone(latestSource.system)};if(options.name&&(updates.name=latestSource.name),updates.system.level&¤tSource.type==="feat"&&(updates.system.level={value:updates.system.level.value,taken:currentSource.system.level.taken}),isPhysicalData(currentSource)){const{containerId,quantity}=currentSource.system;mergeObject(updates,expandObject({"system.containerId":containerId,"system.quantity":quantity}))}else(currentSource.type==="feat"||currentSource.type==="spell")&&mergeObject(updates,expandObject({"system.location":currentSource.system.location}));if(currentSource.type==="weapon"||currentSource.type==="armor"){const materialAndRunes={"system.material":currentSource.system.material,"system.potencyRune":currentSource.system.potencyRune,"system.propertyRune1":currentSource.system.propertyRune1,"system.propertyRune2":currentSource.system.propertyRune2,"system.propertyRune3":currentSource.system.propertyRune3,"system.propertyRune4":currentSource.system.propertyRune4};currentSource.type==="weapon"?materialAndRunes["system.strikingRune"]=currentSource.system.strikingRune:materialAndRunes["system.resiliencyRune"]=currentSource.system.resiliencyRune,mergeObject(updates,expandObject(materialAndRunes))}await this.update(updates,{diff:!1,recursive:!1}),ui.notifications.info(`Item "${this.name}" has been refreshed.`)}getOriginData(){return{uuid:this.uuid,type:this.type}}async processChatData(htmlOptions={},data){if(data.properties=data.properties?.filter(property=>property!==null)??[],isItemSystemData(data)){const chatData=duplicate(data);return htmlOptions.rollData=mergeObject(this.getRollData(),htmlOptions.rollData??{}),chatData.description.value=await TextEditor.enrichHTML(chatData.description.value,{...htmlOptions,async:!0}),chatData}return data}async getChatData(htmlOptions={},_rollOptions2={}){if(!this.actor)throw ErrorPF2e(`Cannot retrieve chat data for unowned item ${this.name}`);const systemData={...this.system,traits:this.traitChatData()};return this.processChatData(htmlOptions,deepClone(systemData))}traitChatData(dictionary={}){return[...this.system.traits?.value??[]].sort().map(trait=>{const label=dictionary[trait]??trait,traitDescriptions2=CONFIG.PF2E.traitsDescriptions;return{value:trait,label,description:traitDescriptions2[trait]}})}static async createDialog(data={},context={}){const omittedTypes=["condition","spellcastingEntry","lore"];omittedTypes.push("affliction","book"),game.settings.get("pf2e","campaignType")!=="kingmaker"&&omittedTypes.push("campaignFeature");const original=game.system.documentTypes.Item;try{return game.system.documentTypes.Item=difference(original,omittedTypes),super.createDialog(data,{...context,classes:[...context.classes??[],"dialog-item-create"]})}finally{game.system.documentTypes.Item=original}}async importFromJSON(json2){const processed=await preImportJSON(this,json2);return processed?super.importFromJSON(processed):this}toDragData(){return{...super.toDragData(),itemType:this.type}}static async createDocuments(data=[],context={}){const sources=data.map(d=>d instanceof _ItemPF2e2?d.toObject():d);for(const source of[...sources]){if(source.effects=[],!Object.keys(source).some(k=>k.startsWith("flags")||k.startsWith("system"))){source.system={_migration:{version:MigrationRunnerBase.LATEST_SCHEMA_VERSION}};continue}const item=new CONFIG.Item.documentClass(source);await MigrationRunner.ensureSchemaVersion(item,MigrationList.constructFromVersion(item.schemaVersion)),data.splice(data.indexOf(source),1,item.toObject())}const actor=context.parent;if(!actor)return super.createDocuments(sources,context);const validTypes=actor.allowedItemTypes;validTypes.includes("physical")&&validTypes.push(...PHYSICAL_ITEM_TYPES,"kit");for(const source of sources)if(!validTypes.includes(source.type))return ui.notifications.error(game.i18n.format("PF2E.Item.CannotAddType",{type:game.i18n.localize(CONFIG.Item.typeLabels[source.type]??source.type.titleCase())})),[];const effectSources=sources.filter(s=>["affliction","condition","effect"].includes(s.type));for(const source of effectSources){const effect=new CONFIG.PF2E.Item.documentClasses[source.type](deepClone(source),{parent:actor}),isUnaffected=effect.isOfType("condition")&&!actor.isAffectedBy(effect),isImmune=actor.isImmuneTo(effect);if((isUnaffected||isImmune)&&(sources.splice(sources.indexOf(source),1),!(effect.isOfType("effect")&&effect.fromAura))){const locKey=isUnaffected?"PF2E.Damage.IWR.ActorIsUnaffected":"PF2E.Damage.IWR.ActorIsImmune",message=game.i18n.format(locKey,{actor:actor.name,effect:effect.name});ui.notifications.info(message)}}const preCreateDeletions=["ancestry","background","class","heritage","deity"].filter(type=>sources.some(s=>s.type===type)).flatMap(type=>actor.itemTypes[type]);if(preCreateDeletions.length){const idsToDelete=preCreateDeletions.map(i=>i.id);await actor.deleteEmbeddedDocuments("Item",idsToDelete,{render:!1})}const items=await(async()=>{async function getSimpleGrants(item){const granted=await item.createGrantedItems?.({size:context.parent?.size})??[];if(!granted.length)return[];const reparented=granted.map(i=>i.parent?i:new CONFIG.Item.documentClass(i._source,{parent:actor}));return[...reparented,...(await Promise.all(reparented.map(getSimpleGrants))).flat()]}__name(getSimpleGrants,"getSimpleGrants"),__name2(getSimpleGrants,"getSimpleGrants");const items2=sources.map(source=>(context.keepId||context.keepEmbeddedIds||(source._id=randomID()),new CONFIG.Item.documentClass(source,{parent:actor})));for(const item of[...items2]){const grants=await getSimpleGrants(item);grants.length&&(context.keepId=!0,items2.push(...grants))}return items2})(),outputSources=items.map(i=>i._source);for(const item of items){item.prepareActorData?.();const itemSource=item._source,rules=item.prepareRuleElements({suppressWarnings:!0});for(const rule of rules){const ruleSource=itemSource.system.rules[rules.indexOf(rule)];await rule.preCreate?.({itemSource,ruleSource,pendingItems:outputSources,tempItems:items,context})}}if(outputSources.some(i=>i.type==="class")){const classFeatures=outputSources.filter(i=>i.type==="feat"&&typeof i.system?.level?.value=="number"&&i.system.category==="classfeature"&&!i.flags?.pf2e?.grantedBy);for(const feature of classFeatures)feature.sort=classFeatures.indexOf(feature)*100*(feature.system.level?.value??1)}const nonKits=outputSources.filter(source=>source.type!=="kit");return super.createDocuments(nonKits,context)}static async deleteDocuments(ids=[],context={}){ids=Array.from(new Set(ids));const actor=context.parent;if(actor){const items=ids.flatMap(id=>actor.items.get(id)??[]),containers=items.filter(i=>i.isOfType("backpack"));for(const container of containers)await container.ejectContents();for(const item of[...items]){for(const rule of item.rules)await rule.preDelete?.({pendingItems:items,context});await processGrantDeletions(item,items)}ids=Array.from(new Set(items.map(i=>i.id))).filter(id=>actor.items.has(id))}return super.deleteDocuments(ids,context)}async _preCreate(data,options,user){if(this._source.system.traits.value?.sort(),this.actor?.isOfType("character")&&this.isOfType("ancestry","background","class","feat","heritage")){const hpMaxDifference=this.actor.clone({items:[...this.actor.items.toObject(),data]}).hitPoints.max-this.actor.hitPoints.max;if(hpMaxDifference!==0){const newHitPoints=this.actor.hitPoints.value+hpMaxDifference;await this.actor.update({"system.attributes.hp.value":newHitPoints},{render:!1,allowHPOverage:!0})}}return this._source.system.rules=this._source.system.rules.filter(r=>!r.removeUponCreate),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){if(changed.system?.description?.value===null&&(changed.system.description.value=""),changed.system?.level&&"value"in changed.system.level&&(changed.system.level.value=Math.max(0,Math.trunc(Number(changed.system.level.value)||0))),typeof changed.system?.slug=="string"&&(changed.system.slug=sluggify(changed.system.slug)||null),changed.system?.traits&&(Array.isArray(changed.system.traits.value)&&changed.system.traits.value.sort(),Array.isArray(changed.system.traits.otherTags)&&(changed.system.traits.otherTags=changed.system.traits.otherTags.map(t=>sluggify(t)).sort())),this.actor?.isOfType("character")&&this.isOfType("ancestry","background","class","feat","heritage")){const actorClone=this.actor.clone();actorClone.items.get(this.id,{strict:!0}).updateSource(changed,options),actorClone.reset();const hpMaxDifference=actorClone.hitPoints.max-this.actor.hitPoints.max;if(hpMaxDifference!==0){const newHitPoints=this.actor.hitPoints.value+hpMaxDifference;await this.actor.update({"system.attributes.hp.value":newHitPoints},{render:!1,allowHPOverage:!0})}}for(const rule of this.rules)await rule.preUpdate?.(changed);return super._preUpdate(changed,options,user)}_onCreate(data,options,userId){if(super._onCreate(data,options,userId),!(this.actor&&game.user.id===userId))return;this.actor.reset();const actorUpdates={};for(const rule of this.rules)rule.onCreate?.(actorUpdates);const updateKeys=Object.keys(actorUpdates);updateKeys.length>0&&!updateKeys.every(k=>k==="_id")&&this.actor.update(actorUpdates)}_onUpdate(data,options,userId){super._onUpdate(data,options,userId),game.ready&&game.items.get(this.id)===this&&ui.items.render()}_onDelete(options,userId){if(super._onDelete(options,userId),!(this.actor&&game.user.id===userId)||!(this.actor.isOfType("creature")&&this.canUserModify(game.user,"update")))return;const actorUpdates={};for(const rule of this.rules)rule.onDelete?.(actorUpdates);if(this.actor.isOfType("npc")&&["action","consumable"].includes(this.type)){const slug=this.slug??sluggify(this.name);if(this.actor.isToken){const promises=[];for(const item of this.actor.itemTypes.melee){const attackEffects=item.system.attackEffects.value;if(attackEffects.includes(slug)){const updatedEffects=attackEffects.filter(effect=>effect!==slug);promises.push(item.update({"system.attackEffects.value":updatedEffects}))}}promises.length>0&&Promise.allSettled(promises)}else{const itemUpdates=[];for(const attack of this.actor.itemTypes.melee){const attackEffects=attack.system.attackEffects.value;if(attackEffects.includes(slug)){const updatedEffects=attackEffects.filter(effect=>effect!==slug);itemUpdates.push({_id:attack.id,system:{attackEffects:{value:updatedEffects}}})}}itemUpdates.length>0&&mergeObject(actorUpdates,{items:itemUpdates})}}const updateKeys=Object.keys(actorUpdates);updateKeys.length>0&&!updateKeys.every(k=>k==="_id")&&this.actor.update(actorUpdates)}};__name2(_ItemPF2e,"ItemPF2e");let ItemPF2e=_ItemPF2e;const ItemProxyPF2e=new Proxy(ItemPF2e,{construct(_target2,args){const ItemClass=CONFIG.PF2E.Item.documentClasses[args[0]?.type]??ItemPF2e;return new ItemClass(...args)}}),DURATION_UNITS={rounds:6,minutes:60,hours:3600,days:86400};function calculateRemainingDuration(effect,durationData){if(durationData.unit==="encounter"){const isExpired=effect.system.expired;return{expired:!!isExpired,remaining:isExpired?0:1/0}}else if(durationData.unit==="unlimited"||!("start"in effect.system))return{expired:!1,remaining:1/0};const start=effect.system.start.value,{combatant}=game.combat??{},{unit,expiry}=durationData,duration=durationData.value*(DURATION_UNITS[durationData.unit]??0),addend=!combatant&&duration===0&&unit==="rounds"&&["turn-end","round-end"].includes(expiry??"")?1:0,remaining=start+duration+addend-game.time.worldTime,result={remaining,expired:remaining<=0};if(remaining===0&&combatant?.actor){const startInitiative=effect.system.start.initiative??0,currentInitiative=combatant.initiative??0,fightyActor=effect.actor?.isOfType("familiar")?effect.actor.master??effect.actor:effect.actor,atTurnStart=__name2(()=>startInitiative===currentInitiative&&combatant.actor===(effect.origin??fightyActor),"atTurnStart");result.expired=expiry==="turn-start"?atTurnStart():expiry==="turn-end"?currentInitiativestart:!1}return result}__name(calculateRemainingDuration,"calculateRemainingDuration"),__name2(calculateRemainingDuration,"calculateRemainingDuration");const _AbstractEffectPF2e=class _AbstractEffectPF2e2 extends ItemPF2e{static{__name(this,"_AbstractEffectPF2e")}get origin(){const originUUID=this.system.context?.origin.actor;if(!originUUID||originUUID===this.actor?.uuid)return this.actor;if(originUUID.startsWith("Scene.")){const tokenUUID=originUUID.replace(/\.Actor\..+$/,""),tokenDoc=fromUuidSync(tokenUUID);if(!(tokenDoc instanceof TokenDocumentPF2e))return null;const descriptor=Object.getOwnPropertyDescriptor(tokenDoc,"delta");return descriptor?.value instanceof ActorDelta?descriptor.value.syntheticActor??null:null}const actor=fromUuidSync(originUUID);return actor instanceof ActorPF2e?actor:null}get isIdentified(){return!0}get isLocked(){return!1}get fromSpell(){return this.system.fromSpell}get totalDuration(){const{duration}=this.system;return["unlimited","encounter"].includes(duration.unit)?1/0:duration.value*(DURATION_UNITS[duration.unit]??0)}get remainingDuration(){return calculateRemainingDuration(this,this.system.duration)}getRollOptions(prefix=this.type){const{origin}=this,originRollOptions=!!origin?.flags?.pf2e?.rollOptions?origin.getSelfRollOptions("origin").map(o=>`${prefix}:${o}`)??[]:[],{badge}=this,itemOrigin=this.grantedBy?.getRollOptions(`${prefix}:granter`)??[];return[...super.getRollOptions(prefix),...itemOrigin,...Object.entries({[`badge:type:${badge?.type}`]:!!badge,[`badge:value:${badge?.value}`]:!!badge,"from-spell":this.fromSpell}).filter(([,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`),...originRollOptions]}prepareBaseData(){super.prepareBaseData();const slug=this.slug??sluggify(this.name);this.rollOptionSlug=slug.replace(/^(?:[a-z]+-)?(?:effect|stance)-/,""),this.system.fromSpell??=!1}prepareActorData(){const actor=this.actor;if(!actor)throw ErrorPF2e("prepareActorData called from unembedded item");actor.rollOptions.all[`self:${this.type}:${this.rollOptionSlug}`]=!0;const badge=this.badge;if(typeof badge?.value=="number"){const values=actor.items.filter(i=>i instanceof _AbstractEffectPF2e2&&i.rollOptionSlug===this.rollOptionSlug).map(effect=>effect.badge?.value).filter(value=>typeof value=="number");badge.value>=Math.max(...values)&&(actor.rollOptions.all[`self:${this.type}:${this.rollOptionSlug}:${badge.value}`]=!0)}}_preCreate(data,options,user){return data.system.fromSpell??=(()=>{if((this.slug??sluggify(this.name)).startsWith("spell-effect-"))return!0;const originItem=fromUuidSync(this.system.context?.origin.item??"");return originItem instanceof ItemPF2e&&(originItem.isOfType("spell")||originItem.isOfType("affliction","condition","effect")&&originItem.fromSpell)})(),super._preCreate(data,options,user)}_onCreate(data,options,userId){super._onCreate(data,options,userId),this.handleChange({create:this})}_onDelete(options,userId){super._onDelete(options,userId),this.handleChange({delete:{name:this._source.name}})}handleChange(change){const skipFloatyText=this.isOfType("condition")&&!game.user.isGM&&!this.actor?.hasPlayerOwner&&game.settings.get("pf2e","metagame_secretCondition"),auraNotInCombat=this.flags.pf2e.aura&&!game.combat?.started,identified=game.user.isGM||this.isIdentified;if(!(skipFloatyText||!identified||auraNotInCombat)){if(this.isLocked||this.actor?.getActiveTokens().shift()?.showFloatyText(change),this.isOfType("condition"))for(const token of this.actor?.getActiveTokens()??[])token._onApplyStatusEffect(this.rollOptionSlug,!1);game.pf2e.StatusEffects.refresh()}}};__name2(_AbstractEffectPF2e,"AbstractEffectPF2e");let AbstractEffectPF2e=_AbstractEffectPF2e;const _ConditionManager=class _ConditionManager2{static{__name(this,"_ConditionManager")}static get conditionsSlugs(){return[...this.conditions.keys()].filter(k=>!k.startsWith("Compendium."))}static async initialize(force=!1){if(__privateGet(this,_initialized)||(this.conditions=new Map(this.CONDITION_SOURCES?.flatMap(source=>{const condition=new ConditionPF2e(source,{pack:"pf2e.conditionitems"});return[[condition.slug,condition],[condition.uuid,condition]]})??[]),delete this.CONDITION_SOURCES),(!__privateGet(this,_initialized)||force)&&game.i18n.lang!=="en"&&game.modules.get("babele")?.active){const localize=localizer("PF2E.condition");for(const condition of this.conditions.values())condition.name=condition._source.name=localize(`${condition.slug}.name`),condition.system.description.value=condition._source.system.description.value=localize(`${condition.slug}.rules`)}__privateSet(this,_initialized,!0)}static getCondition(slug,modifications={}){if(slug=sluggify(slug),!setHasElement(CONDITION_SLUGS,slug))return null;const condition=_ConditionManager2.conditions.get(slug)?.clone(modifications);if(!condition)throw ErrorPF2e("Unexpected failure looking up condition");return condition}static async updateConditionValue(itemId,actorOrToken,value){const actor=actorOrToken instanceof ActorPF2e?actorOrToken:actorOrToken.actor,condition=actor?.items.get(itemId);condition?.isOfType("condition")&&(value===0?await condition.delete():actor?.isOfType("creature")&&(tupleHasValue(["dying","wounded","doomed"],condition.slug)&&(value=Math.min(value,actor.attributes[condition.slug].max)),await condition.update({"system.value.value":value})))}};_initialized=new WeakMap,__name2(_ConditionManager,"ConditionManager"),__privateAdd(_ConditionManager,_initialized,!1),__publicField(_ConditionManager,"conditions",new Map),__publicField(_ConditionManager,"CONDITION_SOURCES",[{_id:"1wQY3JYyhMYeeV2G",img:"systems/pf2e/icons/conditions/observed.webp",name:"Observed",system:{description:{value:"

Anything in plain view is observed by you. If a creature takes measures to avoid detection, such as by using Stealth to @UUID[Compendium.pf2e.actionspf2e.Item.XMcnh4cSI32tljXa]{Hide}, it can become @UUID[Compendium.pf2e.conditionitems.Item.iU0fEDdBp3rXpTMC]{Hidden} or @UUID[Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf]{Undetected} instead of observed. If you have another precise sense instead of or in addition to sight, you might be able to observe a creature or object using that sense instead. You can observe a creature only with precise senses. When @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seeking} a creature using only imprecise senses, it remains hidden, rather than observed.

"},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"observed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G"}},effects:[]},{_id:"3uh1r86TzbQvosxv",img:"systems/pf2e/icons/conditions/doomed.webp",name:"Doomed",system:{description:{value:`

A powerful force has gripped your soul, calling you closer to death. Doomed always includes a value. The @UUID[Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1]{Dying} value at which you die is reduced by your doomed value. If your maximum dying value is reduced to 0, you instantly die. When you die, you're no longer doomed.

+

Your doomed value decreases by 1 each time you get a full night's rest.

`},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"doomed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.3uh1r86TzbQvosxv"}},effects:[]},{_id:"4D2KBtexWXa6oUMR",img:"systems/pf2e/icons/conditions/drained.webp",name:"Drained",system:{description:{value:`

When a creature successfully drains you of blood or life force, you become less healthy. Drained always includes a value. You take a status penalty equal to your drained value on Constitution-based checks, such as Fortitude saves. You also lose a number of Hit Points equal to your level (minimum 1) times the drained value, and your maximum Hit Points are reduced by the same amount. For example, if you're hit by an effect that inflicts drained 3 and you're a 3rd-level character, you lose 9 Hit Points and reduce your maximum Hit Points by 9. Losing these Hit Points doesn't count as taking damage.

+

Each time you get a full night's rest, your drained value decreases by 1. This increases your maximum Hit Points, but you don't immediately recover the lost Hit Points.

`},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"con-based",slug:"drained",type:"status",value:"-1 * @item.badge.value"},{key:"FlatModifier",selector:"hp",slug:"drained",type:"status",value:"min(-1 * @actor.level,-1) * @item.badge.value"},{key:"LoseHitPoints",reevaluateOnUpdate:!0,value:"max(1,@actor.level) * @item.badge.value"}],value:{isValued:!0,value:1},slug:"drained",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.4D2KBtexWXa6oUMR"}},effects:[]},{_id:"6dNUvdb1dhToNDj3",img:"systems/pf2e/icons/conditions/broken.webp",name:"Broken",system:{description:{value:`

Broken is a condition that affects objects. An object is broken when damage has reduced its Hit Points below its Broken Threshold. A broken object can't be used for its normal function, nor does it grant bonuses-with the exception of armor. Broken armor still grants its item bonus to AC, but it also imparts a status penalty to AC depending on its category: -1 for broken light armor, -2 for broken medium armor, or -3 for broken heavy armor.

A broken item still imposes penalties and limitations normally incurred by carrying, holding, or wearing it. For example, broken armor would still impose its Dexterity modifier cap, check penalty, and so forth.

-

If an effect makes an item broken automatically and the item has more HP than its Broken Threshold, that effect also reduces the item's current HP to the Broken Threshold.

`},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"broken",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.6dNUvdb1dhToNDj3"}},effects:[]},{_id:"6uEgoh53GbXuHpTF",img:"systems/pf2e/icons/conditions/paralyzed.webp",name:"Paralyzed",system:{description:{value:"

Your body is frozen in place. You have the @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} condition and can't act except to @UUID[Compendium.pf2e.actionspf2e.Item.1OagaWtBpVXExToo]{Recall Knowledge} and use actions that require only the use of your mind (as determined by the GM). Your senses still function, but only in the areas you can perceive without moving your body, so you can't @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} while paralyzed.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.canFlank",value:!1},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}],value:{isValued:!1,value:null},slug:"paralyzed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.6uEgoh53GbXuHpTF"}},effects:[]},{_id:"9evPzg9E6muFcoSk",img:"systems/pf2e/icons/conditions/unnoticed.webp",name:"Unnoticed",system:{description:{value:"

If you are unnoticed by a creature, that creature has no idea you are present at all. When you're unnoticed, you're also @UUID[Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf]{Undetected} by the creature. This condition matters for abilities that can be used only against targets totally unaware of your presence.

"},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"unnoticed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.9evPzg9E6muFcoSk"}},effects:[]},{_id:"9PR9y0bi4JPKnHPR",img:"systems/pf2e/icons/conditions/deafened.webp",name:"Deafened",system:{description:{value:"

You can't hear. You automatically critically fail Perception checks that require you to be able to hear. You take a -2 status penalty to Perception checks for initiative and checks that involve sound but also rely on other senses. If you perform an action with the auditory trait, you must succeed at a DC 5 flat check or the action is lost; attempt the check after spending the action but before any effects are applied. You are immune to auditory effects.

"},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"perception-initiative",slug:"deafened",type:"status",value:-2},{key:"Immunity",type:"auditory"}],value:{isValued:!1,value:null},slug:"deafened",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.9PR9y0bi4JPKnHPR"}},effects:[]},{_id:"9qGBRpbX9NEwtAAr",img:"systems/pf2e/icons/conditions/controlled.webp",name:"Controlled",system:{description:{value:"

Someone else is making your decisions for you, usually because you're being commanded or magically dominated. The controller dictates how you act and can make you use any of your actions, including attacks, reactions, or even @UUID[Compendium.pf2e.actionspf2e.Item.A72nHGUtNXgY5Ey9]{Delay}. The controller usually does not have to spend their own actions when controlling you.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"controlled",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.9qGBRpbX9NEwtAAr"}},effects:[]},{_id:"AdPVz7rbaVSRxHFg",img:"systems/pf2e/icons/conditions/fascinated.webp",name:"Fascinated",system:{description:{value:"

You are compelled to focus your attention on something, distracting you from whatever else is going on around you. You take a -2 status penalty to Perception and skill checks, and you can't use actions with the concentrate trait unless they or their intended consequences are related to the subject of your fascination (as determined by the GM). For instance, you might be able to @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} and @UUID[Compendium.pf2e.actionspf2e.Item.1OagaWtBpVXExToo]{Recall Knowledge} about the subject, but you likely couldn't cast a spell targeting a different creature. This condition ends if a creature uses hostile actions against you or any of your allies.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["perception","skill-check"],slug:"fascinated",type:"status",value:-2}],value:{isValued:!1,value:null},slug:"fascinated",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.AdPVz7rbaVSRxHFg"}},effects:[]},{_id:"AJh5ex99aV6VTggg",img:"systems/pf2e/icons/conditions/off-guard.webp",name:"Off-Guard",system:{description:{value:`

You're distracted or otherwise unable to focus your full attention on defense. You take a -2 circumstance penalty to AC. Some effects give you the off-guard condition only to certain creatures or against certain attacks. Others-especially conditions-can make you universally off-guard against everything. If a rule doesn't specify that the condition applies only to certain circumstances, it applies to all of them; for example, many effects simply say "The target is off-guard."

`},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"ac",slug:"off-guard",type:"circumstance",value:-2}],value:{isValued:!1,value:null},slug:"off-guard",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}},effects:[]},{_id:"D5mg6Tc7Jzrj6ro7",img:"systems/pf2e/icons/conditions/encumbered.webp",name:"Encumbered",system:{description:{value:"

You are carrying more weight than you can manage. While you're encumbered, you're @UUID[Compendium.pf2e.conditionitems.Item.i3OJZU2nk64Df3xm]{Clumsy 1} and take a 10-foot penalty to all your Speeds. As with all penalties to your Speed, this can't reduce your Speed below 5 feet.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"speed",slug:"encumbered",value:-10},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.i3OJZU2nk64Df3xm"}],value:{isValued:!1,value:null},slug:"encumbered",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.D5mg6Tc7Jzrj6ro7"}},effects:[]},{_id:"dfCMdR4wnpbYNTix",img:"systems/pf2e/icons/conditions/stunned.webp",name:"Stunned",system:{description:{value:`

You've become senseless. You can't act while stunned. Stunned usually includes a value, which indicates how many total actions you lose, possibly over multiple turns, from being stunned. Each time you regain actions (such as at the start of your turn), reduce the number you regain by your stunned value, then reduce your stunned value by the number of actions you lost. For example, if you were stunned 4, you would lose all 3 of your actions on your turn, reducing you to stunned 1; on your next turn, you would lose 1 more action, and then be able to use your remaining 2 actions normally. Stunned might also have a duration instead of a value, such as "stunned for 1 minute." In this case, you lose all your actions for the listed duration.

-

Stunned overrides @UUID[Compendium.pf2e.conditionitems.Item.xYTAsEpcJE1Ccni3]{Slowed}. If the duration of your stunned condition ends while you are slowed, you count the actions lost to the stunned condition toward those lost to being slowed. So, if you were stunned 1 and slowed 2 at the beginning of your turn, you would lose 1 action from stunned, and then lose only 1 additional action by being slowed, so you would still have 1 action remaining to use that turn.

`},duration:{value:0},group:null,overrides:["slowed"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"stunned",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.dfCMdR4wnpbYNTix"}},effects:[]},{_id:"DmAIPqOBomZ7H95W",img:"systems/pf2e/icons/conditions/concealed.webp",name:"Concealed",system:{description:{value:"

While you are concealed from a creature, such as in a thick fog, you are difficult for that creature to see. You can still be @UUID[Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G]{Observed}, but you're tougher to target. A creature that you're concealed from must succeed at a @Check[type:flat|dc:5] check when targeting you with an attack, spell, or other effect. Area effects aren't subject to this flat check. If the check fails, the attack, spell, or effect doesn't affect you.

"},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"concealed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.DmAIPqOBomZ7H95W"}},effects:[]},{_id:"dTwPJuKgBQCMxixg",img:"systems/pf2e/icons/conditions/petrified.webp",name:"Petrified",system:{description:{value:"

You have been turned to stone. You can't act, nor can you sense anything. You become an object with a Bulk double your normal Bulk (typically 12 for a petrified Medium creature or 6 for a petrified Small creature), AC 9, Hardness 8, and the same current Hit Points you had when alive. You don't have a Broken Threshold. When you're turned back into flesh, you have the same number of Hit Points you had as a statue. If the statue is destroyed, you immediately die. While petrified, your mind and body are in stasis, so you don't age or notice the passing of time.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"petrified",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.dTwPJuKgBQCMxixg"}},effects:[]},{_id:"e1XGnhKNSQIm5IXg",img:"systems/pf2e/icons/conditions/stupefied.webp",name:"Stupefied",system:{description:{value:"

Your thoughts and instincts are clouded. Stupefied always includes a value. You take a status penalty equal to this value on Intelligence-, Wisdom-, and Charisma-based checks and DCs, including Will saving throws, spell attack rolls, spell DCs, and skill checks that use these ability scores. Any time you attempt to @UUID[Compendium.pf2e.actionspf2e.Item.aBQ8ajvEBByv45yz]{Cast a Spell} while stupefied, the spell is disrupted unless you succeed at a flat check with a DC equal to 5 + your stupefied value.

"},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["cha-based","int-based","wis-based"],slug:"stupefied",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"stupefied",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.e1XGnhKNSQIm5IXg"}},effects:[]},{_id:"eIcWbB5o3pP6OIMe",img:"systems/pf2e/icons/conditions/immobilized.webp",name:"Immobilized",system:{description:{value:"

You can't use any action with the move trait. If you're immobilized by something holding you in place and an external force would move you out of your space, the force must succeed at a check against either the DC of the effect holding you in place or the relevant defense (usually Fortitude DC) of the monster holding you in place.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"immobilized",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe"}},effects:[]},{_id:"fBnFDH2MTzgFijKf",img:"systems/pf2e/icons/conditions/unconscious.webp",name:"Unconscious",system:{description:{value:`

You're sleeping, or you've been knocked out. You can't act. You take a -4 status penalty to AC, Perception, and Reflex saves, and you have the @UUID[Compendium.pf2e.conditionitems.Item.XgEqL1kFApUbl5Z2]{Blinded} and @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} conditions. When you gain this condition, you fall @UUID[Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60]{Prone} and drop items you are wielding or holding unless the effect states otherwise or the GM determines you're in a position in which you wouldn't.

+

If an effect makes an item broken automatically and the item has more HP than its Broken Threshold, that effect also reduces the item's current HP to the Broken Threshold.

`},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"broken",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.6dNUvdb1dhToNDj3"}},effects:[]},{_id:"6uEgoh53GbXuHpTF",img:"systems/pf2e/icons/conditions/paralyzed.webp",name:"Paralyzed",system:{description:{value:"

Your body is frozen in place. You have the @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} condition and can't act except to @UUID[Compendium.pf2e.actionspf2e.Item.1OagaWtBpVXExToo]{Recall Knowledge} and use actions that require only the use of your mind (as determined by the GM). Your senses still function, but only in the areas you can perceive without moving your body, so you can't @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} while paralyzed.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.canFlank",value:!1},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}],value:{isValued:!1,value:null},slug:"paralyzed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.6uEgoh53GbXuHpTF"}},effects:[]},{_id:"9evPzg9E6muFcoSk",img:"systems/pf2e/icons/conditions/unnoticed.webp",name:"Unnoticed",system:{description:{value:"

If you are unnoticed by a creature, that creature has no idea you are present at all. When you're unnoticed, you're also @UUID[Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf]{Undetected} by the creature. This condition matters for abilities that can be used only against targets totally unaware of your presence.

"},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"unnoticed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.9evPzg9E6muFcoSk"}},effects:[]},{_id:"9PR9y0bi4JPKnHPR",img:"systems/pf2e/icons/conditions/deafened.webp",name:"Deafened",system:{description:{value:"

You can't hear. You automatically critically fail Perception checks that require you to be able to hear. You take a -2 status penalty to Perception checks for initiative and checks that involve sound but also rely on other senses. If you perform an action with the auditory trait, you must succeed at a DC 5 flat check or the action is lost; attempt the check after spending the action but before any effects are applied. You are immune to auditory effects.

"},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"perception-initiative",slug:"deafened",type:"status",value:-2},{key:"Immunity",type:"auditory"}],value:{isValued:!1,value:null},slug:"deafened",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.9PR9y0bi4JPKnHPR"}},effects:[]},{_id:"9qGBRpbX9NEwtAAr",img:"systems/pf2e/icons/conditions/controlled.webp",name:"Controlled",system:{description:{value:"

Someone else is making your decisions for you, usually because you're being commanded or magically dominated. The controller dictates how you act and can make you use any of your actions, including attacks, reactions, or even @UUID[Compendium.pf2e.actionspf2e.Item.A72nHGUtNXgY5Ey9]{Delay}. The controller usually does not have to spend their own actions when controlling you.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"controlled",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.9qGBRpbX9NEwtAAr"}},effects:[]},{_id:"AdPVz7rbaVSRxHFg",img:"systems/pf2e/icons/conditions/fascinated.webp",name:"Fascinated",system:{description:{value:"

You are compelled to focus your attention on something, distracting you from whatever else is going on around you. You take a -2 status penalty to Perception and skill checks, and you can't use actions with the concentrate trait unless they or their intended consequences are related to the subject of your fascination (as determined by the GM). For instance, you might be able to @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} and @UUID[Compendium.pf2e.actionspf2e.Item.1OagaWtBpVXExToo]{Recall Knowledge} about the subject, but you likely couldn't cast a spell targeting a different creature. This condition ends if a creature uses hostile actions against you or any of your allies.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["perception","skill-check"],slug:"fascinated",type:"status",value:-2}],value:{isValued:!1,value:null},slug:"fascinated",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.AdPVz7rbaVSRxHFg"}},effects:[]},{_id:"AJh5ex99aV6VTggg",img:"systems/pf2e/icons/conditions/off-guard.webp",name:"Off-Guard",system:{description:{value:`

You're distracted or otherwise unable to focus your full attention on defense. You take a -2 circumstance penalty to AC. Some effects give you the off-guard condition only to certain creatures or against certain attacks. Others-especially conditions-can make you universally off-guard against everything. If a rule doesn't specify that the condition applies only to certain circumstances, it applies to all of them; for example, many effects simply say "The target is off-guard."

`},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"ac",slug:"off-guard",type:"circumstance",value:-2}],value:{isValued:!1,value:null},slug:"off-guard",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}},effects:[]},{_id:"D5mg6Tc7Jzrj6ro7",img:"systems/pf2e/icons/conditions/encumbered.webp",name:"Encumbered",system:{description:{value:"

You are carrying more weight than you can manage. While you're encumbered, you're @UUID[Compendium.pf2e.conditionitems.Item.i3OJZU2nk64Df3xm]{Clumsy 1} and take a 10-foot penalty to all your Speeds. As with all penalties to your Speed, this can't reduce your Speed below 5 feet.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"speed",slug:"encumbered",value:-10},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.i3OJZU2nk64Df3xm"}],value:{isValued:!1,value:null},slug:"encumbered",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.D5mg6Tc7Jzrj6ro7"}},effects:[]},{_id:"dfCMdR4wnpbYNTix",img:"systems/pf2e/icons/conditions/stunned.webp",name:"Stunned",system:{description:{value:`

You've become senseless. You can't act while stunned. Stunned usually includes a value, which indicates how many total actions you lose, possibly over multiple turns, from being stunned. Each time you regain actions (such as at the start of your turn), reduce the number you regain by your stunned value, then reduce your stunned value by the number of actions you lost. For example, if you were stunned 4, you would lose all 3 of your actions on your turn, reducing you to stunned 1; on your next turn, you would lose 1 more action, and then be able to use your remaining 2 actions normally. Stunned might also have a duration instead of a value, such as "stunned for 1 minute." In this case, you lose all your actions for the listed duration.

+

Stunned overrides @UUID[Compendium.pf2e.conditionitems.Item.xYTAsEpcJE1Ccni3]{Slowed}. If the duration of your stunned condition ends while you are slowed, you count the actions lost to the stunned condition toward those lost to being slowed. So, if you were stunned 1 and slowed 2 at the beginning of your turn, you would lose 1 action from stunned, and then lose only 1 additional action by being slowed, so you would still have 1 action remaining to use that turn.

`},duration:{value:0},group:null,overrides:["slowed"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"stunned",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.dfCMdR4wnpbYNTix"}},effects:[]},{_id:"DmAIPqOBomZ7H95W",img:"systems/pf2e/icons/conditions/concealed.webp",name:"Concealed",system:{description:{value:"

While you are concealed from a creature, such as in a thick fog, you are difficult for that creature to see. You can still be @UUID[Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G]{Observed}, but you're tougher to target. A creature that you're concealed from must succeed at a @Check[type:flat|dc:5] check when targeting you with an attack, spell, or other effect. Area effects aren't subject to this flat check. If the check fails, the attack, spell, or effect doesn't affect you.

"},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"concealed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.DmAIPqOBomZ7H95W"}},effects:[]},{_id:"dTwPJuKgBQCMxixg",img:"systems/pf2e/icons/conditions/petrified.webp",name:"Petrified",system:{description:{value:"

You have been turned to stone. You can't act, nor can you sense anything. You become an object with a Bulk double your normal Bulk (typically 12 for a petrified Medium creature or 6 for a petrified Small creature), AC 9, Hardness 8, and the same current Hit Points you had when alive. You don't have a Broken Threshold. When you're turned back into flesh, you have the same number of Hit Points you had as a statue. If the statue is destroyed, you immediately die. While petrified, your mind and body are in stasis, so you don't age or notice the passing of time.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"petrified",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.dTwPJuKgBQCMxixg"}},effects:[]},{_id:"e1XGnhKNSQIm5IXg",img:"systems/pf2e/icons/conditions/stupefied.webp",name:"Stupefied",system:{description:{value:"

Your thoughts and instincts are clouded. Stupefied always includes a value. You take a status penalty equal to this value on Intelligence-, Wisdom-, and Charisma-based checks and DCs, including Will saving throws, spell attack rolls, spell DCs, and skill checks that use these ability scores. Any time you attempt to @UUID[Compendium.pf2e.actionspf2e.Item.aBQ8ajvEBByv45yz]{Cast a Spell} while stupefied, the spell is disrupted unless you succeed at a flat check with a DC equal to 5 + your stupefied value.

"},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["cha-based","int-based","wis-based"],slug:"stupefied",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"stupefied",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.e1XGnhKNSQIm5IXg"}},effects:[]},{_id:"eIcWbB5o3pP6OIMe",img:"systems/pf2e/icons/conditions/immobilized.webp",name:"Immobilized",system:{description:{value:"

You can't use any action with the move trait. If you're immobilized by something holding you in place and an external force would move you out of your space, the force must succeed at a check against either the DC of the effect holding you in place or the relevant defense (usually Fortitude DC) of the monster holding you in place.

"},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"immobilized",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe"}},effects:[]},{_id:"fBnFDH2MTzgFijKf",img:"systems/pf2e/icons/conditions/unconscious.webp",name:"Unconscious",system:{description:{value:`

You're sleeping, or you've been knocked out. You can't act. You take a -4 status penalty to AC, Perception, and Reflex saves, and you have the @UUID[Compendium.pf2e.conditionitems.Item.XgEqL1kFApUbl5Z2]{Blinded} and @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} conditions. When you gain this condition, you fall @UUID[Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60]{Prone} and drop items you are wielding or holding unless the effect states otherwise or the GM determines you're in a position in which you wouldn't.

If you're unconscious because you're @UUID[Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1]{Dying}, you can't wake up while you have 0 Hit Points. If you are restored to 1 Hit Point or more via healing, you lose the dying and unconscious conditions and can act normally on your next turn.

If you are unconscious and at 0 Hit Points, but not dying, you naturally return to 1 Hit Point and awaken after sufficient time passes. The GM determines how long you remain unconscious, from a minimum of 10 minutes to several hours. If you receive healing during this time, you lose the unconscious condition and can act normally on your next turn.

If you're unconscious and have more than 1 Hit Point (typically because you are asleep or unconscious due to an effect), you wake up in one of the following ways. Each causes you to lose the unconscious condition.

@@ -289,31 +289,21 @@ for (const actor of actors) {
  • Someone shakes you awake with an @UUID[Compendium.pf2e.actionspf2e.Item.pvQ5rY2zrtPI614F]{Interact} action.
  • There's loud noise going on around you-though this isn't automatic. At the start of your turn, you automatically attempt a Perception check against the noise's DC (or the lowest DC if there is more than one noise), waking up if you succeed. If creatures are attempting to stay quiet around you, this Perception check uses their Stealth DCs. Some magical effects make you sleep so deeply that they don't allow you to attempt this Perception check.
  • If you are simply asleep, the GM decides you wake up either because you have had a restful night's sleep or something disrupted that rest.
  • -`},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["ac","perception","reflex"],slug:"unconscious",type:"status",value:-4},{key:"GrantItem",onDeleteActions:{grantee:"restrict"},uuid:"Compendium.pf2e.conditionitems.Item.XgEqL1kFApUbl5Z2"},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"},{allowDuplicate:!1,key:"GrantItem",onDeleteActions:{grantee:"restrict",granter:"detach"},uuid:"Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60"}],value:{isValued:!1,value:null},slug:"unconscious",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf"}},effects:[]},{_id:"fesd1n5eVhpCSS18",img:"systems/pf2e/icons/conditions/sickened.webp",name:"Sickened",system:{description:{value:`

    You feel ill. Sickened always includes a value. You take a status penalty equal to this value on all your checks and DCs. You can't willingly ingest anything-including elixirs and potions-while sickened.

    -

    You can spend a single action retching in an attempt to recover, which lets you immediately attempt a Fortitude save against the DC of the effect that made you sickened. On a success, you reduce your sickened value by 1 (or by 2 on a critical success).

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"all",slug:"sickened",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"sickened",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.fesd1n5eVhpCSS18"}},effects:[]},{_id:"fuG8dgthlDWfWjIA",img:"systems/pf2e/icons/conditions/indifferent.webp",name:"Indifferent",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is indifferent to a character doesn't really care one way or the other about that character. Assume a creature's attitude to a given character is indifferent unless specified otherwise.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","friendly","unfriendly","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"indifferent",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.fuG8dgthlDWfWjIA"}},effects:[]},{_id:"HL2l2VRSaQHu9lUw",img:"systems/pf2e/icons/conditions/fatigued.webp",name:"Fatigued",system:{description:{value:`

    You're tired and can't summon much energy. You take a -1 status penalty to AC and saving throws. While exploring, you can't choose an exploration activity.

    -

    You recover from fatigue after a full night's rest.

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["ac","saving-throw"],slug:"fatigued",type:"status",value:-1}],value:{isValued:!1,value:null},slug:"fatigued",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.HL2l2VRSaQHu9lUw"}},effects:[]},{_id:"I1ffBVISxLr2gC4u",img:"systems/pf2e/icons/conditions/unfriendly.webp",name:"Unfriendly",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is unfriendly to a character dislikes and specifically distrusts that character. The unfriendly creature won't accept @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Requests} from the character.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","friendly","indifferent","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"unfriendly",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.I1ffBVISxLr2gC4u"}},effects:[]},{_id:"i3OJZU2nk64Df3xm",img:"systems/pf2e/icons/conditions/clumsy.webp",name:"Clumsy",system:{description:{value:"

    Your movements become clumsy and inexact. Clumsy always includes a value. You take a status penalty equal to the condition value to Dexterity-based checks and DCs, including AC, Reflex saves, ranged attack rolls, and skill checks using Acrobatics, Stealth, and Thievery.

    "},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"dex-based",slug:"clumsy",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"clumsy",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.i3OJZU2nk64Df3xm"}},effects:[]},{_id:"iU0fEDdBp3rXpTMC",img:"systems/pf2e/icons/conditions/hidden.webp",name:"Hidden",system:{description:{value:`

    While you're hidden from a creature, that creature knows the space you're in but can't tell precisely where you are. You typically become hidden by using Stealth to @UUID[Compendium.pf2e.actionspf2e.Item.XMcnh4cSI32tljXa]{Hide}. When @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seeking} a creature using only imprecise senses, it remains hidden, rather than @UUID[Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G]{Observed}. A creature you're hidden from is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} to you, and it must succeed at a @Check[type:flat|dc:11] check when targeting you with an attack, spell, or other effect or it fails affect you. Area effects aren't subject to this flat check.

    -

    A creature might be able to use the seek action to try to observe you.

    `},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"hidden",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.iU0fEDdBp3rXpTMC"}},effects:[]},{_id:"j91X7x0XSomq8d60",img:"systems/pf2e/icons/conditions/prone.webp",name:"Prone",system:{description:{value:`

    You're lying on the ground. You are @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} and take a -2 circumstance penalty to attack rolls. The only move actions you can use while you're prone are @UUID[Compendium.pf2e.actionspf2e.Item.Tj055UcNm6UEgtCg]{Crawl} and @UUID[Compendium.pf2e.actionspf2e.Item.OdIUybJ3ddfL7wzj]{Stand}. Standing up ends the prone condition. You can @UUID[Compendium.pf2e.actionspf2e.Item.ust1jJSCZQUhBZIz]{Take Cover} while prone to hunker down and gain cover against ranged attacks, even if you don't have an object to get behind, gaining a +4 circumstance bonus to AC against ranged attacks (but you remain off-guard).

    -

    If you would be knocked prone while you're @UUID[Compendium.pf2e.actionspf2e.Item.pprgrYQ1QnIDGZiy]{Climbing} or @UUID[Compendium.pf2e.actionspf2e.Item.cS9nfDRGD83bNU1p]{Flying}, you fall. You can't be knocked prone when @UUID[Compendium.pf2e.actionspf2e.Item.c8TGiZ48ygoSPofx]{Swimming}.

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"attack-roll",slug:"prone",type:"circumstance",value:-2},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}],value:{isValued:!1,value:null},slug:"prone",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60"}},effects:[]},{_id:"kWc1fhmv9LBiTuei",img:"systems/pf2e/icons/conditions/grabbed.webp",name:"Grabbed",system:{description:{value:"

    You're held in place by another creature, giving you the @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} and @UUID[Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe]{Immobilized} conditions. If you attempt a manipulate action while grabbed, you must succeed at a @Check[type:flat|dc:5] check or it is lost; roll the check after spending the action, but before any effects are applied.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe"}],value:{isValued:!1,value:null},slug:"grabbed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei"}},effects:[]},{_id:"lDVqvLKA6eF3Df60",img:"systems/pf2e/icons/conditions/persistent-damage.webp",name:"Persistent Damage",system:{description:{value:'

    Persistent damage comes from effects like acid, being on fire, or many other situations. It appears as "X persistent [type] damage," where "X" is the amount of damage dealt and "[type]" is the damage type. Like normal damage, it can be doubled or halved based on the results of an attack roll or saving throw. Instead of taking persistent damage immediately, you take it at the end of each of your turns as long as you have the condition, rolling any damage dice anew each time. After you take persistent damage, roll a @Check[type:flat|dc:15] check to see if you recover from the persistent damage. If you succeed, the condition ends.

    '},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"persistent-damage",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.lDVqvLKA6eF3Df60"}},effects:[]},{_id:"MIRkyAjyBeXivMa7",img:"systems/pf2e/icons/conditions/enfeebled.webp",name:"Enfeebled",system:{description:{value:"

    You're physically weakened. Enfeebled always includes a value. When you are enfeebled, you take a status penalty equal to the condition value to Strength-based rolls and DCs, including Strength-based melee attack rolls, Strength-based damage rolls, and Athletics checks.

    "},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["str-based","str-damage"],slug:"enfeebled",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"enfeebled",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.MIRkyAjyBeXivMa7"}},effects:[]},{_id:"nlCjDvLMf2EkV2dl",img:"systems/pf2e/icons/conditions/quickened.webp",name:"Quickened",system:{description:{value:"

    You gain 1 additional action at the start of your turn each round. Many effects that make you quickened specify the types of actions you can use with this additional action. If you become quickened from multiple sources, you can use the extra action you've been granted for any single action allowed by any of the effects that made you quickened. Because quickened has its effect at the start of your turn, you don't immediately gain actions if you become quickened during your turn.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"quickened",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.nlCjDvLMf2EkV2dl"}},effects:[]},{_id:"sDPxOjQ9kx2RZE8D",img:"systems/pf2e/icons/conditions/fleeing.webp",name:"Fleeing",system:{description:{value:"

    You're forced to run away due to fear or some other compulsion. On your turn, you must spend each of your actions trying to escape the source of the fleeing condition as expediently as possible (such as by using move actions to flee, or opening doors barring your escape). The source is usually the effect or caster that gave you the condition, though some effects might define something else as the source. You can't @UUID[Compendium.pf2e.actionspf2e.Item.A72nHGUtNXgY5Ey9]{Delay} or @UUID[Compendium.pf2e.actionspf2e.Item.dLgAMt3TbkmLkUqE]{Ready} while fleeing.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"fleeing",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.sDPxOjQ9kx2RZE8D"}},effects:[]},{_id:"TBSHQspnbcqxsmjL",img:"systems/pf2e/icons/conditions/frightened.webp",name:"Frightened",system:{description:{value:"

    You're gripped by fear and struggle to control your nerves. The frightened condition always includes a value. You take a status penalty equal to this value to all your checks and DCs. Unless specified otherwise, at the end of each of your turns, the value of your frightened condition decreases by 1.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"all",slug:"frightened",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"frightened",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.TBSHQspnbcqxsmjL"}},effects:[]},{_id:"TkIyaNPgTZFBCCuh",img:"systems/pf2e/icons/conditions/dazzled.webp",name:"Dazzled",system:{description:{value:"

    Your eyes are overstimulated. If vision is your only precise sense, all creatures and objects are @UUID[Compendium.pf2e.conditionitems.Item.DmAIPqOBomZ7H95W]{Concealed} from you.

    "},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"dazzled",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.TkIyaNPgTZFBCCuh"}},effects:[]},{_id:"ud7gTLwPeklzYSXG",img:"systems/pf2e/icons/conditions/hostile.webp",name:"Hostile",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is hostile to a character actively seeks to harm that character. It doesn't necessarily attack, but it won't accept @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Requests} from the character.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","friendly","indifferent","unfriendly"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"hostile",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.ud7gTLwPeklzYSXG"}},effects:[]},{_id:"v44P3WUcU1j0115l",img:"systems/pf2e/icons/conditions/helpful.webp",name:"Helpful",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is helpful to a character wishes to actively aid that character. It will accept reasonable @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Requests} from that character, as long as such requests aren't at the expense of the helpful creature's goals or quality of life. If the character or one of their allies uses a hostile action against the creature, the creature gains a worse attitude condition depending on the severity of the hostile action, as determined by the GM.

    "},duration:{value:0},group:"attitudes",overrides:["friendly","indifferent","unfriendly","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"helpful",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.v44P3WUcU1j0115l"}},effects:[]},{_id:"v66R7FdOf11l94im",img:"systems/pf2e/icons/conditions/friendly.webp",name:"Friendly",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is friendly to a character likes that character. The character can attempt to @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Make a Request} of a friendly creature, and the friendly creature is likely to agree to a simple and safe request that doesn't cost it much to fulfill. If the character or one of their allies uses hostile actions against the creature, the creature gains a worse attitude condition depending on the severity of the hostile action, as determined by the GM.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","indifferent","unfriendly","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"friendly",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.v66R7FdOf11l94im"}},effects:[]},{_id:"VcDeM8A5oI6VqhbM",img:"systems/pf2e/icons/conditions/restrained.webp",name:"Restrained",system:{description:{value:"

    You're tied up and can barely move, or a creature has you pinned. You have the @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} and @UUID[Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe]{Immobilized} conditions, and you can't use any actions with the attack or manipulate traits except to attempt to @UUID[Compendium.pf2e.actionspf2e.Item.SkZAQRkLLkmBQNB9]{Escape} or @UUID[Compendium.pf2e.actionspf2e.Item.SjmKHgI7a5Z9JzBx]{Force Open} your bonds. Restrained overrides @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed}.

    "},duration:{value:0},group:null,overrides:["grabbed"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.canFlank",value:!1},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe"}],value:{isValued:!1,value:null},slug:"restrained",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.VcDeM8A5oI6VqhbM"}},effects:[]},{_id:"VRSef5y1LmL2Hkjf",img:"systems/pf2e/icons/conditions/undetected.webp",name:"Undetected",system:{description:{value:`

    When you are undetected by a creature, that creature cannot see you at all, has no idea what space you occupy, and can't target you, though you still can be affected by abilities that target an area. When you're undetected by a creature, that creature is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} to you.

    +`},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["ac","perception","reflex"],slug:"unconscious",type:"status",value:-4},{key:"GrantItem",onDeleteActions:{grantee:"restrict"},uuid:"Compendium.pf2e.conditionitems.Item.XgEqL1kFApUbl5Z2"},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"},{allowDuplicate:!1,key:"GrantItem",onDeleteActions:{grantee:"restrict",granter:"detach"},uuid:"Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60"}],value:{isValued:!1,value:null},slug:"unconscious",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf"}},effects:[]},{_id:"fesd1n5eVhpCSS18",img:"systems/pf2e/icons/conditions/sickened.webp",name:"Sickened",system:{description:{value:`

    You feel ill. Sickened always includes a value. You take a status penalty equal to this value on all your checks and DCs. You can't willingly ingest anything-including elixirs and potions-while sickened.

    +

    You can spend a single action retching in an attempt to recover, which lets you immediately attempt a Fortitude save against the DC of the effect that made you sickened. On a success, you reduce your sickened value by 1 (or by 2 on a critical success).

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"all",slug:"sickened",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"sickened",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.fesd1n5eVhpCSS18"}},effects:[]},{_id:"fuG8dgthlDWfWjIA",img:"systems/pf2e/icons/conditions/indifferent.webp",name:"Indifferent",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is indifferent to a character doesn't really care one way or the other about that character. Assume a creature's attitude to a given character is indifferent unless specified otherwise.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","friendly","unfriendly","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"indifferent",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.fuG8dgthlDWfWjIA"}},effects:[]},{_id:"HL2l2VRSaQHu9lUw",img:"systems/pf2e/icons/conditions/fatigued.webp",name:"Fatigued",system:{description:{value:`

    You're tired and can't summon much energy. You take a -1 status penalty to AC and saving throws. While exploring, you can't choose an exploration activity.

    +

    You recover from fatigue after a full night's rest.

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["ac","saving-throw"],slug:"fatigued",type:"status",value:-1}],value:{isValued:!1,value:null},slug:"fatigued",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.HL2l2VRSaQHu9lUw"}},effects:[]},{_id:"I1ffBVISxLr2gC4u",img:"systems/pf2e/icons/conditions/unfriendly.webp",name:"Unfriendly",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is unfriendly to a character dislikes and specifically distrusts that character. The unfriendly creature won't accept @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Requests} from the character.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","friendly","indifferent","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"unfriendly",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.I1ffBVISxLr2gC4u"}},effects:[]},{_id:"i3OJZU2nk64Df3xm",img:"systems/pf2e/icons/conditions/clumsy.webp",name:"Clumsy",system:{description:{value:"

    Your movements become clumsy and inexact. Clumsy always includes a value. You take a status penalty equal to the condition value to Dexterity-based checks and DCs, including AC, Reflex saves, ranged attack rolls, and skill checks using Acrobatics, Stealth, and Thievery.

    "},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"dex-based",slug:"clumsy",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"clumsy",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.i3OJZU2nk64Df3xm"}},effects:[]},{_id:"iU0fEDdBp3rXpTMC",img:"systems/pf2e/icons/conditions/hidden.webp",name:"Hidden",system:{description:{value:`

    While you're hidden from a creature, that creature knows the space you're in but can't tell precisely where you are. You typically become hidden by using Stealth to @UUID[Compendium.pf2e.actionspf2e.Item.XMcnh4cSI32tljXa]{Hide}. When @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seeking} a creature using only imprecise senses, it remains hidden, rather than @UUID[Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G]{Observed}. A creature you're hidden from is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} to you, and it must succeed at a @Check[type:flat|dc:11] check when targeting you with an attack, spell, or other effect or it fails affect you. Area effects aren't subject to this flat check.

    +

    A creature might be able to use the seek action to try to observe you.

    `},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"hidden",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.iU0fEDdBp3rXpTMC"}},effects:[]},{_id:"j91X7x0XSomq8d60",img:"systems/pf2e/icons/conditions/prone.webp",name:"Prone",system:{description:{value:`

    You're lying on the ground. You are @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} and take a -2 circumstance penalty to attack rolls. The only move actions you can use while you're prone are @UUID[Compendium.pf2e.actionspf2e.Item.Tj055UcNm6UEgtCg]{Crawl} and @UUID[Compendium.pf2e.actionspf2e.Item.OdIUybJ3ddfL7wzj]{Stand}. Standing up ends the prone condition. You can @UUID[Compendium.pf2e.actionspf2e.Item.ust1jJSCZQUhBZIz]{Take Cover} while prone to hunker down and gain cover against ranged attacks, even if you don't have an object to get behind, gaining a +4 circumstance bonus to AC against ranged attacks (but you remain off-guard).

    +

    If you would be knocked prone while you're @UUID[Compendium.pf2e.actionspf2e.Item.pprgrYQ1QnIDGZiy]{Climbing} or @UUID[Compendium.pf2e.actionspf2e.Item.cS9nfDRGD83bNU1p]{Flying}, you fall. You can't be knocked prone when @UUID[Compendium.pf2e.actionspf2e.Item.c8TGiZ48ygoSPofx]{Swimming}.

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"attack-roll",slug:"prone",type:"circumstance",value:-2},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}],value:{isValued:!1,value:null},slug:"prone",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.j91X7x0XSomq8d60"}},effects:[]},{_id:"kWc1fhmv9LBiTuei",img:"systems/pf2e/icons/conditions/grabbed.webp",name:"Grabbed",system:{description:{value:"

    You're held in place by another creature, giving you the @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} and @UUID[Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe]{Immobilized} conditions. If you attempt a manipulate action while grabbed, you must succeed at a @Check[type:flat|dc:5] check or it is lost; roll the check after spending the action, but before any effects are applied.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe"}],value:{isValued:!1,value:null},slug:"grabbed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei"}},effects:[]},{_id:"lDVqvLKA6eF3Df60",img:"systems/pf2e/icons/conditions/persistent-damage.webp",name:"Persistent Damage",system:{description:{value:'

    Persistent damage comes from effects like acid, being on fire, or many other situations. It appears as "X persistent [type] damage," where "X" is the amount of damage dealt and "[type]" is the damage type. Like normal damage, it can be doubled or halved based on the results of an attack roll or saving throw. Instead of taking persistent damage immediately, you take it at the end of each of your turns as long as you have the condition, rolling any damage dice anew each time. After you take persistent damage, roll a @Check[type:flat|dc:15] check to see if you recover from the persistent damage. If you succeed, the condition ends.

    '},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"persistent-damage",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.lDVqvLKA6eF3Df60"}},effects:[]},{_id:"MIRkyAjyBeXivMa7",img:"systems/pf2e/icons/conditions/enfeebled.webp",name:"Enfeebled",system:{description:{value:"

    You're physically weakened. Enfeebled always includes a value. When you are enfeebled, you take a status penalty equal to the condition value to Strength-based rolls and DCs, including Strength-based melee attack rolls, Strength-based damage rolls, and Athletics checks.

    "},duration:{value:0},group:"abilities",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:["str-based","str-damage"],slug:"enfeebled",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"enfeebled",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.MIRkyAjyBeXivMa7"}},effects:[]},{_id:"nlCjDvLMf2EkV2dl",img:"systems/pf2e/icons/conditions/quickened.webp",name:"Quickened",system:{description:{value:"

    You gain 1 additional action at the start of your turn each round. Many effects that make you quickened specify the types of actions you can use with this additional action. If you become quickened from multiple sources, you can use the extra action you've been granted for any single action allowed by any of the effects that made you quickened. Because quickened has its effect at the start of your turn, you don't immediately gain actions if you become quickened during your turn.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"quickened",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.nlCjDvLMf2EkV2dl"}},effects:[]},{_id:"sDPxOjQ9kx2RZE8D",img:"systems/pf2e/icons/conditions/fleeing.webp",name:"Fleeing",system:{description:{value:"

    You're forced to run away due to fear or some other compulsion. On your turn, you must spend each of your actions trying to escape the source of the fleeing condition as expediently as possible (such as by using move actions to flee, or opening doors barring your escape). The source is usually the effect or caster that gave you the condition, though some effects might define something else as the source. You can't @UUID[Compendium.pf2e.actionspf2e.Item.A72nHGUtNXgY5Ey9]{Delay} or @UUID[Compendium.pf2e.actionspf2e.Item.dLgAMt3TbkmLkUqE]{Ready} while fleeing.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"fleeing",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.sDPxOjQ9kx2RZE8D"}},effects:[]},{_id:"TBSHQspnbcqxsmjL",img:"systems/pf2e/icons/conditions/frightened.webp",name:"Frightened",system:{description:{value:"

    You're gripped by fear and struggle to control your nerves. The frightened condition always includes a value. You take a status penalty equal to this value to all your checks and DCs. Unless specified otherwise, at the end of each of your turns, the value of your frightened condition decreases by 1.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"all",slug:"frightened",type:"status",value:"-@item.badge.value"}],value:{isValued:!0,value:1},slug:"frightened",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.TBSHQspnbcqxsmjL"}},effects:[]},{_id:"TkIyaNPgTZFBCCuh",img:"systems/pf2e/icons/conditions/dazzled.webp",name:"Dazzled",system:{description:{value:"

    Your eyes are overstimulated. If vision is your only precise sense, all creatures and objects are @UUID[Compendium.pf2e.conditionitems.Item.DmAIPqOBomZ7H95W]{Concealed} from you.

    "},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"dazzled",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.TkIyaNPgTZFBCCuh"}},effects:[]},{_id:"ud7gTLwPeklzYSXG",img:"systems/pf2e/icons/conditions/hostile.webp",name:"Hostile",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is hostile to a character actively seeks to harm that character. It doesn't necessarily attack, but it won't accept @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Requests} from the character.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","friendly","indifferent","unfriendly"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"hostile",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.ud7gTLwPeklzYSXG"}},effects:[]},{_id:"v44P3WUcU1j0115l",img:"systems/pf2e/icons/conditions/helpful.webp",name:"Helpful",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is helpful to a character wishes to actively aid that character. It will accept reasonable @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Requests} from that character, as long as such requests aren't at the expense of the helpful creature's goals or quality of life. If the character or one of their allies uses a hostile action against the creature, the creature gains a worse attitude condition depending on the severity of the hostile action, as determined by the GM.

    "},duration:{value:0},group:"attitudes",overrides:["friendly","indifferent","unfriendly","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"helpful",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.v44P3WUcU1j0115l"}},effects:[]},{_id:"v66R7FdOf11l94im",img:"systems/pf2e/icons/conditions/friendly.webp",name:"Friendly",system:{description:{value:"

    This condition reflects a creature's disposition toward a particular character, and only supernatural effects (like a spell) can impose this condition on a PC. A creature that is friendly to a character likes that character. The character can attempt to @UUID[Compendium.pf2e.actionspf2e.Item.DCb62iCBrJXy0Ik6]{Make a Request} of a friendly creature, and the friendly creature is likely to agree to a simple and safe request that doesn't cost it much to fulfill. If the character or one of their allies uses hostile actions against the creature, the creature gains a worse attitude condition depending on the severity of the hostile action, as determined by the GM.

    "},duration:{value:0},group:"attitudes",overrides:["helpful","indifferent","unfriendly","hostile"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"friendly",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.v66R7FdOf11l94im"}},effects:[]},{_id:"VcDeM8A5oI6VqhbM",img:"systems/pf2e/icons/conditions/restrained.webp",name:"Restrained",system:{description:{value:"

    You're tied up and can barely move, or a creature has you pinned. You have the @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} and @UUID[Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe]{Immobilized} conditions, and you can't use any actions with the attack or manipulate traits except to attempt to @UUID[Compendium.pf2e.actionspf2e.Item.SkZAQRkLLkmBQNB9]{Escape} or @UUID[Compendium.pf2e.actionspf2e.Item.SjmKHgI7a5Z9JzBx]{Force Open} your bonds. Restrained overrides @UUID[Compendium.pf2e.conditionitems.Item.kWc1fhmv9LBiTuei]{Grabbed}.

    "},duration:{value:0},group:null,overrides:["grabbed"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.canFlank",value:!1},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.eIcWbB5o3pP6OIMe"}],value:{isValued:!1,value:null},slug:"restrained",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.VcDeM8A5oI6VqhbM"}},effects:[]},{_id:"VRSef5y1LmL2Hkjf",img:"systems/pf2e/icons/conditions/undetected.webp",name:"Undetected",system:{description:{value:`

    When you are undetected by a creature, that creature cannot see you at all, has no idea what space you occupy, and can't target you, though you still can be affected by abilities that target an area. When you're undetected by a creature, that creature is @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard} to you.

    A creature you're undetected by can guess which square you're in to try targeting you. It must pick a square and attempt an attack. This works like targeting a hidden creature (requiring a @Check[type:flat|dc:11] check), but the flat check and attack roll are rolled in secret by the GM, who doesn't reveal whether the attack missed due to failing the flat check, failing the attack roll, or choosing the wrong square.

    -

    A creature can use the @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} action to try to find you.

    `},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"undetected",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf"}},effects:[]},{_id:"XgEqL1kFApUbl5Z2",img:"systems/pf2e/icons/conditions/blinded.webp",name:"Blinded",system:{description:{value:"

    You can't see. All normal terrain is difficult terrain to you. You can't detect anything using vision. You automatically critically fail Perception checks that require you to be able to see, and if vision is your only precise sense, you take a -4 status penalty to Perception checks. You are immune to visual effects. Blinded overrides @UUID[Compendium.pf2e.conditionitems.Item.TkIyaNPgTZFBCCuh]{Dazzled}.

    "},duration:{value:0},group:"senses",overrides:["dazzled"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"perception",slug:"blinded",type:"status",value:-4},{key:"Immunity",type:"visual"}],value:{isValued:!1,value:null},slug:"blinded",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.XgEqL1kFApUbl5Z2"}},effects:[]},{_id:"xYTAsEpcJE1Ccni3",img:"systems/pf2e/icons/conditions/slowed.webp",name:"Slowed",system:{description:{value:"

    You have fewer actions. Slowed always includes a value. When you regain your actions at the start of your turn, reduce the number of actions you regain by your slowed value. Because slowed has its effect at the start of your turn, you don't immediately lose actions if you become slowed during your turn.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"slowed",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.xYTAsEpcJE1Ccni3"}},effects:[]},{_id:"yblD8fOR1J8rDwEQ",img:"systems/pf2e/icons/conditions/confused.webp",name:"Confused",system:{description:{value:`

    You don't have your wits about you, and you attack wildly. You are @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard}, you don't treat anyone as your ally (though they might still treat you as theirs), and you can't Delay, Ready, or use reactions.

    +

    A creature can use the @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} action to try to find you.

    `},duration:{value:0},group:"detection",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"undetected",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf"}},effects:[]},{_id:"XgEqL1kFApUbl5Z2",img:"systems/pf2e/icons/conditions/blinded.webp",name:"Blinded",system:{description:{value:"

    You can't see. All normal terrain is difficult terrain to you. You can't detect anything using vision. You automatically critically fail Perception checks that require you to be able to see, and if vision is your only precise sense, you take a -4 status penalty to Perception checks. You are immune to visual effects. Blinded overrides @UUID[Compendium.pf2e.conditionitems.Item.TkIyaNPgTZFBCCuh]{Dazzled}.

    "},duration:{value:0},group:"senses",overrides:["dazzled"],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"FlatModifier",selector:"perception",slug:"blinded",type:"status",value:-4},{key:"Immunity",type:"visual"}],value:{isValued:!1,value:null},slug:"blinded",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.XgEqL1kFApUbl5Z2"}},effects:[]},{_id:"xYTAsEpcJE1Ccni3",img:"systems/pf2e/icons/conditions/slowed.webp",name:"Slowed",system:{description:{value:"

    You have fewer actions. Slowed always includes a value. When you regain your actions at the start of your turn, reduce the number of actions you regain by your slowed value. Because slowed has its effect at the start of your turn, you don't immediately lose actions if you become slowed during your turn.

    "},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"slowed",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.xYTAsEpcJE1Ccni3"}},effects:[]},{_id:"yblD8fOR1J8rDwEQ",img:"systems/pf2e/icons/conditions/confused.webp",name:"Confused",system:{description:{value:`

    You don't have your wits about you, and you attack wildly. You are @UUID[Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg]{Off-Guard}, you don't treat anyone as your ally (though they might still treat you as theirs), and you can't Delay, Ready, or use reactions.

    You use all your actions to Strike or cast offensive cantrips, though the GM can have you use other actions to facilitate attack, such as draw a weapon, move so that a target is in reach, and so forth. Your targets are determined randomly by the GM. If you have no other viable targets, you target yourself, automatically hitting but not scoring a critical hit. If it's impossible for you to attack or cast spells, you babble incoherently, wasting your actions.

    -

    Each time you take damage from an attack or spell, you can attempt a @Check[type:flat|dc:11] to recover from your confusion and end the condition.

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.canFlank",value:!1},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}],value:{isValued:!1,value:null},slug:"confused",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.yblD8fOR1J8rDwEQ"}},effects:[]},{_id:"Yl48xTdMh3aeQYL2",img:"systems/pf2e/icons/conditions/wounded.webp",name:"Wounded",system:{description:{value:`

    You have been seriously injured. If you lose the @UUID[Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1]{Dying} condition and do not already have the wounded condition, you become wounded 1. If you already have the wounded condition when you lose the dying condition, your wounded condition value increases by 1. If you gain the dying condition while wounded, increase your dying condition value by your wounded value.

    -

    The wounded condition ends if someone successfully restores Hit Points to you with @UUID[Compendium.pf2e.actionspf2e.Item.1kGNdIIhuglAjIp9]{Treat Wounds}, or if you are restored to full Hit Points and rest for 10 minutes.

    `},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"wounded",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.Yl48xTdMh3aeQYL2"}},effects:[]},{_id:"yZRUzMqrMmfLu0V1",img:"systems/pf2e/icons/conditions/dying.webp",name:"Dying",system:{description:{value:`

    You are bleeding out or otherwise at death's door. While you have this condition, you are @UUID[Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf]{Unconscious}. Dying always includes a value, and if it ever reaches dying 4, you die. If you're dying, you must attempt a recovery check at the start of your turn each round to determine whether you get better or worse. Your dying condition increases by 1 if you take damage while dying, or by 2 if you take damage from an enemy's critical hit or a critical failure on your save.

    -

    If you lose the dying condition by succeeding at a recovery check and are still at 0 Hit Points, you remain unconscious, but you can wake up as described in that condition. You lose the dying condition automatically and wake up if you ever have 1 Hit Point or more. Any time you lose the dying condition, you gain the @UUID[Compendium.pf2e.conditionitems.Item.Yl48xTdMh3aeQYL2]{Wounded 1} condition, or increase your wounded condition value by 1 if you already have that condition.

    `},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"GrantItem",onDeleteActions:{grantee:"restrict"},uuid:"Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf"}],value:{isValued:!0,value:1},slug:"dying",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1"}},effects:[]},{_id:"zJxUflt9np0q4yML",img:"systems/pf2e/icons/conditions/invisible.webp",name:"Invisible",system:{description:{value:"

    While invisible, you can't be seen. You're @UUID[Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf]{Undetected} to everyone. Creatures can @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} to attempt to detect you; if a creature succeeds at its Perception check against your Stealth DC, you become @UUID[Compendium.pf2e.conditionitems.Item.iU0fEDdBp3rXpTMC]{Hidden} to that creature until you @UUID[Compendium.pf2e.actionspf2e.Item.VMozDqMMuK5kpoX4]{Sneak} to become undetected again. If you become invisible while someone can already see you, you start out hidden to the observer (instead of undetected) until you successfully sneak. You can't become @UUID[Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G]{Observed} while invisible except via special abilities or magic.

    "},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"invisible",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.zJxUflt9np0q4yML"}},effects:[]},{_id:"axtAzam8kiKbTD2c",img:"systems/pf2e/icons/conditions/malevolence.webp",name:"Malevolence",system:{active:!1,description:{value:`

    As the malevolence begins to take its hold on creatures, their body, minds, and souls become increasingly haunted by the supernatural force infesting Xarwin Manor. Malevolence is a special condition that can affect PCs who play in this adventure. The malevolence condition always includes a value. You take a status penalty equal to this value to all saving throws against effects generated by haunts and against all curse and possession effects. The malevolence condition can be reduced by restoration.

    +

    Each time you take damage from an attack or spell, you can attempt a @Check[type:flat|dc:11] to recover from your confusion and end the condition.

    `},duration:{value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"ActiveEffectLike",mode:"override",path:"system.attributes.flanking.canFlank",value:!1},{inMemoryOnly:!0,key:"GrantItem",uuid:"Compendium.pf2e.conditionitems.Item.AJh5ex99aV6VTggg"}],value:{isValued:!1,value:null},slug:"confused",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.yblD8fOR1J8rDwEQ"}},effects:[]},{_id:"Yl48xTdMh3aeQYL2",img:"systems/pf2e/icons/conditions/wounded.webp",name:"Wounded",system:{description:{value:`

    You have been seriously injured. If you lose the @UUID[Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1]{Dying} condition and do not already have the wounded condition, you become wounded 1. If you already have the wounded condition when you lose the dying condition, your wounded condition value increases by 1. If you gain the dying condition while wounded, increase your dying condition value by your wounded value.

    +

    The wounded condition ends if someone successfully restores Hit Points to you with @UUID[Compendium.pf2e.actionspf2e.Item.1kGNdIIhuglAjIp9]{Treat Wounds}, or if you are restored to full Hit Points and rest for 10 minutes.

    `},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!0,value:1},slug:"wounded",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.Yl48xTdMh3aeQYL2"}},effects:[]},{_id:"yZRUzMqrMmfLu0V1",img:"systems/pf2e/icons/conditions/dying.webp",name:"Dying",system:{description:{value:`

    You are bleeding out or otherwise at death's door. While you have this condition, you are @UUID[Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf]{Unconscious}. Dying always includes a value, and if it ever reaches dying 4, you die. If you're dying, you must attempt a recovery check at the start of your turn each round to determine whether you get better or worse. Your dying condition increases by 1 if you take damage while dying, or by 2 if you take damage from an enemy's critical hit or a critical failure on your save.

    +

    If you lose the dying condition by succeeding at a recovery check and are still at 0 Hit Points, you remain unconscious, but you can wake up as described in that condition. You lose the dying condition automatically and wake up if you ever have 1 Hit Point or more. Any time you lose the dying condition, you gain the @UUID[Compendium.pf2e.conditionitems.Item.Yl48xTdMh3aeQYL2]{Wounded 1} condition, or increase your wounded condition value by 1 if you already have that condition.

    `},duration:{value:0},group:"death",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[{key:"GrantItem",onDeleteActions:{grantee:"restrict"},uuid:"Compendium.pf2e.conditionitems.Item.fBnFDH2MTzgFijKf"}],value:{isValued:!0,value:1},slug:"dying",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.yZRUzMqrMmfLu0V1"}},effects:[]},{_id:"zJxUflt9np0q4yML",img:"systems/pf2e/icons/conditions/invisible.webp",name:"Invisible",system:{description:{value:"

    While invisible, you can't be seen. You're @UUID[Compendium.pf2e.conditionitems.Item.VRSef5y1LmL2Hkjf]{Undetected} to everyone. Creatures can @UUID[Compendium.pf2e.actionspf2e.Item.BlAOM2X92SI6HMtJ]{Seek} to attempt to detect you; if a creature succeeds at its Perception check against your Stealth DC, you become @UUID[Compendium.pf2e.conditionitems.Item.iU0fEDdBp3rXpTMC]{Hidden} to that creature until you @UUID[Compendium.pf2e.actionspf2e.Item.VMozDqMMuK5kpoX4]{Sneak} to become undetected again. If you become invisible while someone can already see you, you start out hidden to the observer (instead of undetected) until you successfully sneak. You can't become @UUID[Compendium.pf2e.conditionitems.Item.1wQY3JYyhMYeeV2G]{Observed} while invisible except via special abilities or magic.

    "},duration:{value:0},group:"senses",overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Core Rulebook"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},rules:[],value:{isValued:!1,value:null},slug:"invisible",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.conditionitems.Item.zJxUflt9np0q4yML"}},effects:[]},{_id:"axtAzam8kiKbTD2c",img:"systems/pf2e/icons/conditions/malevolence.webp",name:"Malevolence",system:{active:!1,description:{value:`

    As the malevolence begins to take its hold on creatures, their body, minds, and souls become increasingly haunted by the supernatural force infesting Xarwin Manor. Malevolence is a special condition that can affect PCs who play in this adventure. The malevolence condition always includes a value. You take a status penalty equal to this value to all saving throws against effects generated by haunts and against all curse and possession effects. The malevolence condition can be reduced by restoration.

    The malevolence can never increase above a value of 4. If an effect would increase a creature's malevolence value higher than 4, the creature is instead @UUID[Compendium.pf2e.conditionitems.Item.e1XGnhKNSQIm5IXg]{Stupefied 1} for 24 hours as the malevolence consumes a few of their random, short-term memories. A creature that has a malevolence 4 won't voluntarily leave the Xarwin Manor grounds.

    -

    Each time you get a full night's rest in a region not influenced by the malevolence condition, the value of your malevolence decreases by 1.

    `},duration:{perpetual:!1,text:"",value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Adventure: Malevolence"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},removable:!1,rules:[{key:"FlatModifier",predicate:[{or:["origin:trait:haunt","curse","possession"]}],selector:"saving-throw",slug:"malevolence",type:"status",value:"-@item.badge.value"}],value:{immutable:!1,isValued:!0,value:1},slug:"malevolence",_migration:{version:.878,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.campaign-effects.Item.axtAzam8kiKbTD2c"}},effects:[]}]);let ConditionManager=_ConditionManager;const EXPIRING_CONDITIONS=new Set(["frightened","sickened","drained","doomed","stunned","unconscious"]),_AfflictionPF2e=class extends AbstractEffectPF2e{static{__name(this,"_AfflictionPF2e")}constructor(source,context){throw super(source,context),ErrorPF2e("Affliction items are not available in production builds")}get badge(){return{type:"counter",value:this.stage,min:this.onsetDuration?0:1,max:this.maxStage,label:this.stage===0?game.i18n.localize("PF2E.Item.Affliction.OnsetLabel"):game.i18n.format("PF2E.Item.Affliction.Stage",{stage:this.stage})}}get stage(){return this.system.stage}get stageData(){return Object.values(this.system.stages).at(this.stage-1)??null}get maxStage(){return Object.keys(this.system.stages).length||1}async increase(){if(this.stage===this.maxStage)return;const stage=Math.min(this.maxStage,this.system.stage+1);await this.update({system:{stage}})}async decrease(){const stage=this.system.stage-1;if(stage===0){await this.delete();return}await this.update({system:{stage}})}get onsetDuration(){return this.system.onset?this.system.onset.value*(DURATION_UNITS[this.system.onset.unit]??0):0}get remainingStageDuration(){const stageDuration=this.stageData?.duration??{unit:"unlimited"};return calculateRemainingDuration(this,{...stageDuration,expiry:"turn-end"})}prepareBaseData(){super.prepareBaseData(),this.system.stage=Math.clamped(this.system.stage,this.badge.min,this.maxStage);for(const stage of Object.values(this.system.stages))for(const condition of Object.values(stage.conditions))condition.linked??=!0}getStageDamage(stage){const stageData=Object.values(this.system.stages).at(stage-1),base=[];for(const data of Object.values(stageData?.damage??{})){const{formula,type:damageType,category}=data,terms=parseTermsFromSimpleFormula(formula);base.push({terms,damageType,category:category??null})}if(!base.length)return null;try{const{formula,breakdown}=createDamageFormula({base,modifiers:[],dice:[],ignoredResistances:[]}),roll=new DamageRoll(formula),stageLabel=game.i18n.format("PF2E.Item.Affliction.Stage",{stage:this.stage});return{template:{name:`${this.name} - ${stageLabel}`,damage:{roll,breakdown},materials:[],traits:this.system.traits.value,modifiers:[]},context:{type:"damage-roll",sourceType:"save",outcome:"failure",domains:[],options:new Set,self:null}}}catch(err){console.error(err)}return null}async handleStageChange(){const actor=this.actor;if(!actor)return;const itemsToDelete=this.getLinkedItems().map(i=>i.id);await actor.deleteEmbeddedDocuments("Item",itemsToDelete);const currentStage=this.stageData;if(!currentStage)return;const conditionsToAdd=[],conditionsToUpdate={};for(const data of Object.values(currentStage.conditions??{})){const value=data.value??1,existing=(()=>{const allExisting=actor.conditions.bySlug(data.slug,{temporary:!1}),byAffliction=allExisting.find(i=>i.appliedBy===this);return byAffliction||(data.linked?null:maxBy(allExisting.filter(i=>!i.appliedBy&&!i.isLocked),c=>c.active?1/0:c.value??0))})();if(existing){existing.system.value.isValued&&(conditionsToUpdate[existing.id]={value,linked:!!data.linked});continue}const condition=ConditionManager.getCondition(data.slug);condition.updateSource({"flags.pf2e.grantedBy.id":this.id}),data.linked&&condition.updateSource({"system.references.parent.id":this.id}),condition.system.value.isValued&&value>1&&condition.updateSource({"system.value.value":data.value}),conditionsToAdd.push(condition)}const additions=conditionsToAdd.map(c=>c.toObject());await actor.createEmbeddedDocuments("Item",additions),await actor.updateEmbeddedDocuments("Item",Object.entries(conditionsToUpdate).map(([_id,data])=>({_id,"system.value.value":data.value,"flags.pf2e.grantedBy.id":this.id,...data.linked?{"system.references.parent.id":this.id}:{}}))),this.system.onset||await this.createStageMessage()}getLinkedItems(){return this.actor?this.actor.items.filter(i=>i.isOfType("condition")&&!EXPIRING_CONDITIONS.has(i.slug)&&i.flags.pf2e.grantedBy?.id===this.id&&i.system.references.parent?.id===this.id):[]}async createStageMessage(){if(!this.actor)return;const damage=this.getStageDamage(this.stage);if(damage){const{template,context}=damage;await DamagePF2e.roll(template,context)}}async _preCreate(data,options,user){if(this.isOwned){const initiative=this.origin?.combatant?.initiative??game.combat?.combatant?.initiative??null;this._source.system.start={value:game.time.worldTime+this.onsetDuration,initiative}}else data.system.stage=data.system.onset?0:1;return super._preCreate(data,options,user)}async _preUpdate(changed,options,user){const duration=changed.system?.duration;if(typeof duration?.unit=="string"&&!["unlimited","encounter"].includes(duration.unit)&&duration.value===-1&&(duration.value=1),!this.actor){const hasOnset=changed.system&&"-=onset"in changed.system?!1:!!(changed.system?.onset??this.system.onset);changed.system??={},changed.system.stage=hasOnset?0:1}return super._preUpdate(changed,options,user)}_onCreate(data,options,userId){super._onCreate(data,options,userId),game.user===this.actor?.primaryUpdater&&this.handleStageChange()}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId),changed.system?.stage&&game.user===this.actor?.primaryUpdater&&this.handleStageChange()}async rollRecovery(){if(!this.actor)return;const save=this.actor.saves?.[this.system.save.type];save&&(((await save.roll({dc:{value:this.system.save.value},extraRollOptions:this.getRollOptions("item")}))?.degreeOfSuccess??0)>=DegreeOfSuccess.SUCCESS?this.decrease():this.increase())}prepareActorData(){super.prepareActorData();const actor=this.actor;if(!actor)throw ErrorPF2e("prepareActorData called from unembedded item");this.system.onset&&(actor.rollOptions.all[`self:${this.type}:${this.rollOptionSlug}:onset`]=!0)}};__name2(_AfflictionPF2e,"AfflictionPF2e");let AfflictionPF2e=_AfflictionPF2e;const _ConditionPF2e=class extends AbstractEffectPF2e{static{__name(this,"_ConditionPF2e")}get badge(){return this.system.persistent?{type:"formula",value:this.system.persistent.formula,label:null}:this.system.value.value?{type:"counter",min:1,max:1/0,label:null,value:this.system.value.value}:null}get origin(){const grantingItem=this.actor?.items.get(this.flags.pf2e.grantedBy?.id??"");return grantingItem?.isOfType("affliction","effect")?grantingItem.origin:null}get key(){return this.system.persistent?`persistent-damage-${this.system.persistent.damageType}`:this.slug}get appliedBy(){const appliedById=this.system.references.parent?.id??this.flags.pf2e.grantedBy?.id??"";return this.actor?.items.get(appliedById)??this.actor?.conditions.get(appliedById)??null}get value(){return this.system.value.value}get isLocked(){const parentId=this.system.references.parent?.id??"";if(this.actor?.items.has(parentId)||this.actor?.conditions.has(parentId)||super.isLocked)return!0;const granterId=this.flags.pf2e.grantedBy?.id??"",granter=this.actor?.items.get(granterId)??this.actor?.conditions.get(granterId);return Object.values(granter?.flags.pf2e.itemGrants??{}).find(g=>g.id===this.id)?.onDelete==="restrict"}get isInHUD(){return this.slug in CONFIG.PF2E.statusEffects.conditions}get breakdown(){if(!this.active)return null;const list=uniq(compact(this.actor?.conditions.bySlug(this.slug).map(condition=>{const{appliedBy}=condition;return!appliedBy?.isOfType("condition")||appliedBy?.active?appliedBy:null})??[])).map(p=>reduceItemName(p.name)).sort((a,b)=>a.localeCompare(b,game.i18n.lang)).join(", ");return list?game.i18n.format("PF2E.EffectPanel.AppliedBy",{"condition-list":list}):null}get readonly(){return this.actor&&this.id?!this.actor.items.has(this.id):!1}getRollOptions(prefix=this.type){const options=super.getRollOptions(prefix);if(this.system.persistent){const{damageType}=this.system.persistent;options.push(`damage:type:${damageType}`,`${prefix}:damage:type:${damageType}`);const category=DamageCategorization.fromDamageType(damageType);category&&options.push(`damage:category:${category}`,`${prefix}:damage:category:${category}`)}return options.sort()}async increase(){await this.actor?.increaseCondition(this)}async decrease(){await this.actor?.decreaseCondition(this)}async onEndTurn(options={}){const{actor}=this,token=options?.token??actor?.token;!this.active||!actor||this.system.persistent&&(await this.system.persistent.damage.clone().evaluate({async:!0})).toMessage({speaker:ChatMessagePF2e.getSpeaker({actor,token}),flavor:`${this.name}`},{rollMode:"roll"})}async rollRecovery(){if(this.actor&&this.system.persistent){const{dc,damageType}=this.system.persistent;((await new Statistic(this.actor,{slug:"pd-recovery",label:game.i18n.format("PF2E.Item.Condition.PersistentDamage.Chat.RecoverLabel",{name:this.name}),check:{type:"flat-check"},domains:[]}).roll({dc:{value:dc},extraRollOptions:this.getRollOptions("item"),skipDialog:!0}))?.degreeOfSuccess??0)>=DegreeOfSuccess.SUCCESS&&this.actor.decreaseCondition(`persistent-damage-${damageType}`)}}prepareBaseData(){super.prepareBaseData(),this.active=!0;const systemData=this.system;systemData.value.value=systemData.value.isValued?Number(systemData.value.value)||1:null,systemData.duration=mergeObject(systemData.duration,{value:-1,unit:"unlimited",expiry:null}),typeof this.badge?.value=="number"&&(this.name=`${this.name} ${this.badge.value}`);const folder=CONFIG.PF2E.statusEffects.iconDir;if(this.img=`${folder}${this.slug}.webp`,systemData.persistent){const{formula,damageType}=systemData.persistent,fullFormula=`(${formula})[persistent,${damageType}]`,critRule=game.settings.get("pf2e","critRule")==="doubledamage"?"double-damage":"double-dice",roll=new DamageRoll(fullFormula,{},{evaluatePersistent:!0,critRule}),dc=game.user.isGM&&systemData.persistent.dc!==15?systemData.persistent.dc:null,localizationKey=`PF2E.Item.Condition.PersistentDamage.${dc!==null?"NameWithDC":"Name"}`;this.name=game.i18n.format(localizationKey,{formula,damageType:game.i18n.localize(CONFIG.PF2E.damageRollFlavors[damageType]??damageType),dc}),systemData.persistent.damage=roll,systemData.persistent.expectedValue=roll.expectedValue,this.img=PERSISTENT_DAMAGE_IMAGES[damageType]??this.img}}prepareSiblingData(){if(!this.actor)throw ErrorPF2e("prepareSiblingData may only be called from an embedded item");if(!this.active)return;const deactivate=__name2(condition=>{condition.active=!1,condition.system.references.overriddenBy.push({id:this.id,type:"condition"})},"deactivate"),conditions=this.actor.conditions.active;if(this.system.overrides.length>0){const overridden=conditions.filter(c=>this.system.overrides.includes(c.key));for(const condition of overridden)deactivate(condition)}const ofSameType=conditions.filter(c=>c!==this&&c.key===this.key);for(const condition of ofSameType)if(condition.slug==="persistent-damage"){const thisValue=this.system.persistent?.expectedValue??0,otherValue=condition.system.persistent?.expectedValue??0;thisValue>=otherValue&&deactivate(condition)}else(this.value===condition.value&&(!this.isLocked||condition.isLocked)||this.value&&condition.value&&this.value>condition.value)&&deactivate(condition)}prepareActorData(){if(super.prepareActorData(),this.actor.conditions.set(this.id,this),this.active&&this.system.persistent){const{damageType}=this.system.persistent;this.actor.rollOptions.all[`self:condition:persistent-damage:${damageType}`]=!0}}prepareRuleElements(options){return this.active?super.prepareRuleElements(options):[]}async _preUpdate(changed,options,user){return options.conditionValue=this.value,super._preUpdate(changed,options,user)}_onUpdate(changed,options,userId){if(super._onUpdate(changed,options,userId),!game.user.isGM&&!this.actor?.hasPlayerOwner&&game.settings.get("pf2e","metagame_secretCondition"))return;const[priorValue,newValue]=[options.conditionValue,this.value];if(!!priorValue&&!!newValue&&priorValue!==newValue&&!this.system.references.parent?.id){const change=newValue>priorValue?{create:this}:{delete:this};this.actor?.getActiveTokens().shift()?.showFloatyText(change)}game.pf2e.StatusEffects.refresh()}};__name2(_ConditionPF2e,"ConditionPF2e");let ConditionPF2e=_ConditionPF2e;const _EffectPF2e=class extends AbstractEffectPF2e{static{__name(this,"_EffectPF2e")}get badge(){return this.system.badge}get level(){return this.system.level.value}get traits(){return new Set(this.system.traits.value)}get isExpired(){return this.system.expired}get isAura(){return this.rules.some(r=>r.key==="Aura"&&!r.ignored)}get isIdentified(){return!this.system.unidentified}get fromAura(){return!!this.flags.pf2e.aura}prepareBaseData(){super.prepareBaseData();const{system}=this;["unlimited","encounter"].includes(system.duration.unit)?system.duration.expiry=null:system.duration.expiry||="turn-start",system.expired=this.remainingDuration.expired;const{badge}=this.system;badge&&(badge.type==="formula"?badge.label=null:(badge.min=badge.labels?1:badge.min??1,badge.max=badge.labels?.length??badge.max??1/0,badge.value=Math.clamped(badge.value,badge.min,badge.max),badge.label=badge.labels?.at(badge.value-1)?.trim()||null))}prepareRuleElements(options){if(game.settings.get("pf2e","automation.effectExpiration")&&this.isExpired&&this.actor?.items.has(this.id))for(const rule of this.system.rules)rule.ignored=!0;return super.prepareRuleElements(options)}async increase(){const badge=this.system.badge;if(badge?.type==="counter"&&!this.isExpired){const value=badge.value+1;await this.update({system:{badge:{value}}})}}async decrease(){if(this.system.badge?.type!=="counter"||this.isExpired){await this.delete();return}const value=this.system.badge.value-1;await this.update({system:{badge:{value}}})}getRollOptions(prefix=this.type){const slug=this.slug??sluggify(this.name),trimmedSlug=slug.replace(/^(?:spell-)?(?:effect|stance)-/,""),options=super.getRollOptions(prefix);return options.findSplice(o=>o===`${prefix}:${slug}`,`${prefix}:${trimmedSlug}`),options}async evaluateFormulaBadge(badge){const{actor}=this;if(!actor)throw ErrorPF2e("A formula badge can only be evaluated if part of an embedded effect");const roll=await new Roll(badge.value,this.getRollData()).evaluate({async:!0}),reevaluate=badge.reevaluate?{formula:badge.value,event:badge.reevaluate}:null,token=actor.getActiveTokens(!1,!0).shift(),speaker=ChatMessagePF2e.getSpeaker({actor,token});return roll.toMessage({flavor:reduceItemName(this.name),speaker}),{type:"value",value:roll.total,labels:badge.labels,reevaluate}}async _preCreate(data,options,user){if(this.isOwned){const initiative=this.origin?.combatant?.initiative??game.combat?.combatant?.initiative??null;this._source.system.start={value:game.time.worldTime,initiative}}const badge=data.system.badge;return this.actor&&badge?.type==="formula"&&badge.evaluate&&(this._source.system.badge=await this.evaluateFormulaBadge(badge)),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){const duration=changed.system?.duration;duration?.unit==="unlimited"?duration.expiry=null:typeof duration?.unit=="string"&&!["unlimited","encounter"].includes(duration.unit)&&(duration.expiry||="turn-start",duration.value===-1&&(duration.value=1));const currentBadge=this.system.badge,badgeChange=changed.system?.badge??null;if(badgeChange){const badgeTypeChanged=badgeChange?.type&&badgeChange.type!==currentBadge?.type,labels="labels"in badgeChange&&Array.isArray(badgeChange.labels)?badgeChange.labels:currentBadge?.labels;if(badgeTypeChanged)badgeChange.value=1;else if(currentBadge?.type==="counter"){const[minValue,maxValue]=(()=>{const configuredMin=Number(badgeChange.min??currentBadge.min),configuredMax=Number(badgeChange.max??currentBadge.max);return labels?[1,Math.min(labels.length,configuredMax)]:[configuredMin,configuredMax]})();if(typeof badgeChange.value=="number"&&badgeChange.value0}get handsHeld(){return this.system.equipped.carryType==="held"?this.system.equipped.handsHeld??1:0}get isWorn(){return this.system.equipped.carryType==="worn"}get price(){return this.system.price}get assetValue(){return CoinsPF2e.fromPrice(this.price,this.quantity)}get identificationStatus(){return this.system.identification.status}get isIdentified(){return this.system.identification.status==="identified"}get isAlchemical(){return this.traits.has("alchemical")}get isMagical(){const traits=this.traits;return["magical","arcane","primal","divine","occult"].some(t=>traits.has(t))}get isInvested(){return this.traits.has("invested")?this.isEquipped&&this.isIdentified&&this.system.equipped.invested===!0:null}get isCursed(){return this.traits.has("cursed")}get isTemporary(){return this.system.temporary}get isShoddy(){return this.system.traits.otherTags.includes("shoddy")}get isDamaged(){return this.system.hp.value>0&&this.system.hp.valuec.id===this.system.containerId)??null}get bulk(){const{value,per}=this.system.bulk,bulkRelevantQuantity=Math.floor(this.quantity/per),actorSize=this.actor?.isOfType("creature")?this.actor.size:null;return new Bulk({light:value}).convertToSize(this.size,actorSize??this.size).times(bulkRelevantQuantity)}get activations(){return Object.values(this.system.activations??{}).map(action2=>{const components=[];return action2.components.cast&&components.push(game.i18n.localize("PF2E.Item.Activation.Cast")),action2.components.command&&components.push(game.i18n.localize("PF2E.Item.Activation.Command")),action2.components.envision&&components.push(game.i18n.localize("PF2E.Item.Activation.Envision")),action2.components.interact&&components.push(game.i18n.localize("PF2E.Item.Activation.Interact")),{componentsLabel:components.join(", "),...action2}})}getRollOptions(prefix=this.type){const baseOptions=super.getRollOptions(prefix),{material}=this.system,physicalItemOptions=Object.entries({equipped:this.isEquipped,[`rarity:${this.rarity}`]:!0,uninvested:this.isInvested===!1,[`material:${material.type}`]:!!material.type}).filter(([_key,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`);return[baseOptions,physicalItemOptions].flat().sort()}_initialize(options){this._container=null,super._initialize(options)}prepareBaseData(){super.prepareBaseData();const systemData=this.system;systemData.containerId||=null,systemData.material.type||=null,systemData.material.grade||=null,systemData.stackGroup||=null,systemData.equippedBulk.value||=null,systemData.baseItem??=sluggify(systemData.stackGroup??"")||null,systemData.hp.brokenThreshold=Math.floor(systemData.hp.max/2),this.isEmbedded||(systemData.hp.value=Math.min(systemData.hp.value,systemData.hp.max)),typeof systemData.price.value=="string"&&(systemData.price.value=CoinsPF2e.fromString(systemData.price.value)),systemData.traits.value.includes("infused")&&(systemData.temporary=!0),systemData.price.value=new CoinsPF2e(systemData.temporary?{}:systemData.price.value),systemData.price.per=Math.max(1,systemData.price.per??1),this.system.usage=getUsageDetails(systemData.usage.value);const{equipped,usage}=this.system;equipped.handsHeld??=0,equipped.carryType??="worn",usage.type==="worn"&&usage.where&&(equipped.inSlot??=!1),this.actor?.isOfType("loot")&&(equipped.carryType="worn",equipped.inSlot=!1),systemData.bulk=organizeBulkData(this),this._container?.id!==this.system.containerId&&(this._container=null)}prepareDerivedData(){super.prepareDerivedData(),this.name=game.pf2e.system.generateItemName(this),this.system.identification.identified??={name:this.name,img:this.img,data:{description:{value:this.description}}};const{level,rarity,price}=computeLevelRarityPrice(this);this.system.level.value=level,this.system.traits.rarity=rarity,this.system.price.value=price;const mystifiedData=this.getMystifiedData(this.identificationStatus);this.name=mystifiedData.name,this.img=mystifiedData.img,this.system.description.value=mystifiedData.data.description.value,this.system.identification.unidentified=this.getMystifiedData("unidentified")}prepareSiblingData(){this.actor&&(this.isStowed&&(this.system.equipped.carryType="stowed",delete this.system.equipped.inSlot),this._container&&!this.actor.items.has(this._container.id)&&(this._container=this.system.containerId=null))}onPrepareSynthetics(){this.system.hp.value=Math.min(this.system.hp.value,this.system.hp.max)}isStackableWith(item){if(!(this!==item&&this.type===item.type&&this.name===item.name&&this.isIdentified===item.isIdentified&&![this,item].some(i=>i.isHeld||i.isOfType("backpack"))))return!1;const thisData=this.toObject().system,otherData=item.toObject().system;return thisData.quantity=otherData.quantity,thisData.equipped=otherData.equipped,thisData.containerId=otherData.containerId,thisData._migration=otherData._migration,thisData.identification=otherData.identification,equals(thisData,otherData)}async stackWith(targetItem){if(this.isStackableWith(targetItem)){const stackQuantity=this.quantity+targetItem.quantity;await this.delete({render:!1})&&await targetItem.update({"system.quantity":stackQuantity})}}async move({relativeTo,sortBefore,toContainer,toStack,render=!0}){if(!this.actor)throw ErrorPF2e("Tried to move an unonwned item!");if(toStack)return this.stackWith(toStack);const containerResolved=toContainer??relativeTo?.container,mainContainerUpdate=(()=>{if(containerResolved&&!isCycle(this,containerResolved)){const equipped={carryType:containerResolved.stowsItems?"stowed":"worn",handsHeld:0,inSlot:!1};return{system:{containerId:containerResolved?.id,equipped}}}return!containerResolved&&this.isInContainer?{system:{containerId:null,equipped:{carryType:"worn",handsHeld:0,inSlot:!1}}}:null})(),inventory=this.actor.inventory,siblings=(containerResolved?.contents.contents??inventory.contents).sort(sortBy(i=>i.sort));if(!sortBefore&&!siblings.length&&mainContainerUpdate){await this.update(mainContainerUpdate);return}const updates=SortingHelpers.performIntegerSort(this,{target:relativeTo,siblings,sortBefore}).map(s=>{const baseUpdate={_id:s.target.id,...s.update};return mainContainerUpdate&&s.target.id===this.id?mergeObject(baseUpdate,mainContainerUpdate):baseUpdate}),stowedOrUnstowed=!this.container&&!!containerResolved||this.container&&!containerResolved;await this.actor.updateEmbeddedDocuments("Item",updates,{render:stowedOrUnstowed||render})}getMystifiedData(status,_options){const mystifiedData=this.system.identification[status],name2=mystifiedData.name||this.generateUnidentifiedName(),img=mystifiedData.img||getUnidentifiedPlaceholderImage(this),description=mystifiedData.data.description.value||(()=>{if(status==="identified")return this.description;const itemType=this.generateUnidentifiedName({typeOnly:!0}),caseCorrect=__name2(noun=>game.i18n.lang.toLowerCase()==="de"?noun:noun.toLowerCase(),"caseCorrect");return game.i18n.format("PF2E.identification.UnidentifiedDescription",{item:caseCorrect(itemType)})})();return{name:name2,img,data:{description:{value:description}}}}async getChatData(){const{type,grade}=this.system.material,material=type&&grade?game.i18n.format("PF2E.Item.Weapon.MaterialAndRunes.MaterialOption",{type:game.i18n.localize(CONFIG.PF2E.preciousMaterials[type]),grade:game.i18n.localize(CONFIG.PF2E.preciousMaterialGrades[grade])}):null;return{rarity:{name:this.rarity,label:CONFIG.PF2E.rarityTraits[this.rarity],description:CONFIG.PF2E.traitsDescriptions[this.rarity]},description:{value:this.description},material}}async setIdentificationStatus(status){this.identificationStatus!==status&&await this.update({"system.identification.status":status,"system.identification.unidentified":this.getMystifiedData("unidentified")})}generateUnidentifiedName({typeOnly=!1}={}){const itemType=game.i18n.localize(`TYPES.Item.${this.type}`);return typeOnly?itemType:game.i18n.format("PF2E.identification.UnidentifiedItem",{item:itemType})}traitChatData(dictionary){const traitData=super.traitChatData(dictionary);for(const trait of traitData)if(trait.mystified=!this.isIdentified&&MystifiedTraits.has(trait.value),trait.excluded=trait.mystified&&!game.user.isGM,trait.excluded)delete trait.description;else if(trait.mystified){const gmNote=game.i18n.localize("PF2E.identification.TraitGMNote");trait.description=trait.description?`${gmNote} +

    Each time you get a full night's rest in a region not influenced by the malevolence condition, the value of your malevolence decreases by 1.

    `},duration:{perpetual:!1,text:"",value:0},group:null,overrides:[],publication:{license:"OGL",remaster:!1,title:"Pathfinder Adventure: Malevolence"},references:{children:[],immunityFrom:[],overriddenBy:[],overrides:[]},removable:!1,rules:[{key:"FlatModifier",predicate:[{or:["origin:trait:haunt","curse","possession"]}],selector:"saving-throw",slug:"malevolence",type:"status",value:"-@item.badge.value"}],value:{immutable:!1,isValued:!0,value:1},slug:"malevolence",_migration:{version:.88,previous:null}},type:"condition",flags:{core:{sourceId:"Compendium.pf2e.campaign-effects.Item.axtAzam8kiKbTD2c"}},effects:[]}]);let ConditionManager=_ConditionManager;const EXPIRING_CONDITIONS=new Set(["frightened","sickened","drained","doomed","stunned","unconscious"]),_AfflictionPF2e=class extends AbstractEffectPF2e{static{__name(this,"_AfflictionPF2e")}constructor(source,context){throw super(source,context),ErrorPF2e("Affliction items are not available in production builds")}get badge(){return{type:"counter",value:this.stage,min:this.onsetDuration?0:1,max:this.maxStage,label:this.stage===0?game.i18n.localize("PF2E.Item.Affliction.OnsetLabel"):game.i18n.format("PF2E.Item.Affliction.Stage",{stage:this.stage})}}get stage(){return this.system.stage}get stageData(){return Object.values(this.system.stages).at(this.stage-1)??null}get maxStage(){return Object.keys(this.system.stages).length||1}async increase(){if(this.stage===this.maxStage)return;const stage=Math.min(this.maxStage,this.system.stage+1);await this.update({system:{stage}})}async decrease(){const stage=this.system.stage-1;if(stage===0){await this.delete();return}await this.update({system:{stage}})}get onsetDuration(){return this.system.onset?this.system.onset.value*(DURATION_UNITS[this.system.onset.unit]??0):0}get remainingStageDuration(){const stageDuration=this.stageData?.duration??{unit:"unlimited"};return calculateRemainingDuration(this,{...stageDuration,expiry:"turn-end"})}prepareBaseData(){super.prepareBaseData(),this.system.stage=Math.clamped(this.system.stage,this.badge.min,this.maxStage);for(const stage of Object.values(this.system.stages))for(const condition of Object.values(stage.conditions))condition.linked??=!0}getStageDamage(stage){const stageData=Object.values(this.system.stages).at(stage-1),base=[];for(const data of Object.values(stageData?.damage??{})){const{formula,type:damageType,category}=data,terms=parseTermsFromSimpleFormula(formula);base.push({terms,damageType,category:category??null})}if(!base.length)return null;try{const{formula,breakdown}=createDamageFormula({base,modifiers:[],dice:[],ignoredResistances:[]}),roll=new DamageRoll(formula),stageLabel=game.i18n.format("PF2E.Item.Affliction.Stage",{stage:this.stage});return{template:{name:`${this.name} - ${stageLabel}`,damage:{roll,breakdown},materials:[],traits:this.system.traits.value,modifiers:[]},context:{type:"damage-roll",sourceType:"save",outcome:"failure",domains:[],options:new Set,self:null}}}catch(err){console.error(err)}return null}async handleStageChange(){const actor=this.actor;if(!actor)return;const itemsToDelete=this.getLinkedItems().map(i=>i.id);await actor.deleteEmbeddedDocuments("Item",itemsToDelete);const currentStage=this.stageData;if(!currentStage)return;const conditionsToAdd=[],conditionsToUpdate={};for(const data of Object.values(currentStage.conditions??{})){const value=data.value??1,existing=(()=>{const allExisting=actor.conditions.bySlug(data.slug,{temporary:!1}),byAffliction=allExisting.find(i=>i.appliedBy===this);return byAffliction||(data.linked?null:maxBy(allExisting.filter(i=>!i.appliedBy&&!i.isLocked),c=>c.active?1/0:c.value??0))})();if(existing){existing.system.value.isValued&&(conditionsToUpdate[existing.id]={value,linked:!!data.linked});continue}const condition=ConditionManager.getCondition(data.slug);condition.updateSource({"flags.pf2e.grantedBy.id":this.id}),data.linked&&condition.updateSource({"system.references.parent.id":this.id}),condition.system.value.isValued&&value>1&&condition.updateSource({"system.value.value":data.value}),conditionsToAdd.push(condition)}const additions=conditionsToAdd.map(c=>c.toObject());await actor.createEmbeddedDocuments("Item",additions),await actor.updateEmbeddedDocuments("Item",Object.entries(conditionsToUpdate).map(([_id,data])=>({_id,"system.value.value":data.value,"flags.pf2e.grantedBy.id":this.id,...data.linked?{"system.references.parent.id":this.id}:{}}))),this.system.onset||await this.createStageMessage()}getLinkedItems(){return this.actor?this.actor.items.filter(i=>i.isOfType("condition")&&!EXPIRING_CONDITIONS.has(i.slug)&&i.flags.pf2e.grantedBy?.id===this.id&&i.system.references.parent?.id===this.id):[]}async createStageMessage(){if(!this.actor)return;const damage=this.getStageDamage(this.stage);if(damage){const{template,context}=damage;await DamagePF2e.roll(template,context)}}async _preCreate(data,options,user){if(this.isOwned){const initiative=this.origin?.combatant?.initiative??game.combat?.combatant?.initiative??null;this._source.system.start={value:game.time.worldTime+this.onsetDuration,initiative}}else data.system.stage=data.system.onset?0:1;return super._preCreate(data,options,user)}async _preUpdate(changed,options,user){const duration=changed.system?.duration;if(typeof duration?.unit=="string"&&!["unlimited","encounter"].includes(duration.unit)&&duration.value===-1&&(duration.value=1),!this.actor){const hasOnset=changed.system&&"-=onset"in changed.system?!1:!!(changed.system?.onset??this.system.onset);changed.system??={},changed.system.stage=hasOnset?0:1}return super._preUpdate(changed,options,user)}_onCreate(data,options,userId){super._onCreate(data,options,userId),game.user===this.actor?.primaryUpdater&&this.handleStageChange()}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId),changed.system?.stage&&game.user===this.actor?.primaryUpdater&&this.handleStageChange()}async rollRecovery(){if(!this.actor)return;const save=this.actor.saves?.[this.system.save.type];save&&(((await save.roll({dc:{value:this.system.save.value},extraRollOptions:this.getRollOptions("item")}))?.degreeOfSuccess??0)>=DegreeOfSuccess.SUCCESS?this.decrease():this.increase())}prepareActorData(){super.prepareActorData();const actor=this.actor;if(!actor)throw ErrorPF2e("prepareActorData called from unembedded item");this.system.onset&&(actor.rollOptions.all[`self:${this.type}:${this.rollOptionSlug}:onset`]=!0)}};__name2(_AfflictionPF2e,"AfflictionPF2e");let AfflictionPF2e=_AfflictionPF2e;const _ConditionPF2e=class extends AbstractEffectPF2e{static{__name(this,"_ConditionPF2e")}get badge(){return this.system.persistent?{type:"formula",value:this.system.persistent.formula,label:null}:typeof this.system.value.value=="number"?{type:"counter",min:0,max:1/0,label:null,value:this.system.value.value}:null}get origin(){const grantingItem=this.actor?.items.get(this.flags.pf2e.grantedBy?.id??"");return grantingItem?.isOfType("affliction","effect")?grantingItem.origin:null}get key(){return this.system.persistent?`persistent-damage-${this.system.persistent.damageType}`:this.slug}get appliedBy(){const appliedById=this.system.references.parent?.id??this.flags.pf2e.grantedBy?.id??"";return this.actor?.items.get(appliedById)??this.actor?.conditions.get(appliedById)??null}get value(){return this.system.value.value}get isLocked(){const parentId=this.system.references.parent?.id??"";if(this.actor?.items.has(parentId)||this.actor?.conditions.has(parentId)||super.isLocked)return!0;const granterId=this.flags.pf2e.grantedBy?.id??"",granter=this.actor?.items.get(granterId)??this.actor?.conditions.get(granterId);return Object.values(granter?.flags.pf2e.itemGrants??{}).find(g=>g.id===this.id)?.onDelete==="restrict"}get isInHUD(){return this.slug in CONFIG.PF2E.statusEffects.conditions}get breakdown(){if(!this.active)return null;const list=uniq(compact(this.actor?.conditions.bySlug(this.slug).map(condition=>{const{appliedBy}=condition;return!appliedBy?.isOfType("condition")||appliedBy?.active?appliedBy:null})??[])).map(p=>reduceItemName(p.name)).sort((a,b)=>a.localeCompare(b,game.i18n.lang)).join(", ");return list?game.i18n.format("PF2E.EffectPanel.AppliedBy",{"condition-list":list}):null}get readonly(){return this.actor&&this.id?!this.actor.items.has(this.id):!1}getRollOptions(prefix=this.type){const options=super.getRollOptions(prefix);if(this.system.persistent){const{damageType}=this.system.persistent;options.push(`damage:type:${damageType}`,`${prefix}:damage:type:${damageType}`);const category=DamageCategorization.fromDamageType(damageType);category&&options.push(`damage:category:${category}`,`${prefix}:damage:category:${category}`)}return options.sort()}async increase(){await this.actor?.increaseCondition(this)}async decrease(){await this.actor?.decreaseCondition(this)}async onEndTurn(options={}){const{actor}=this,token=options?.token??actor?.token;!this.active||!actor||this.system.persistent&&(await this.system.persistent.damage.clone().evaluate({async:!0})).toMessage({speaker:ChatMessagePF2e.getSpeaker({actor,token}),flavor:`${this.name}`},{rollMode:"roll"})}async rollRecovery(){if(this.actor&&this.system.persistent){const{dc,damageType}=this.system.persistent;((await new Statistic(this.actor,{slug:"pd-recovery",label:game.i18n.format("PF2E.Item.Condition.PersistentDamage.Chat.RecoverLabel",{name:this.name}),check:{type:"flat-check"},domains:[]}).roll({dc:{value:dc},extraRollOptions:this.getRollOptions("item"),skipDialog:!0}))?.degreeOfSuccess??0)>=DegreeOfSuccess.SUCCESS&&this.actor.decreaseCondition(`persistent-damage-${damageType}`)}}prepareBaseData(){super.prepareBaseData(),this.active=!0;const systemData=this.system;systemData.value.value=systemData.value.isValued?Number(systemData.value.value)||1:null,systemData.duration=mergeObject(systemData.duration,{value:-1,unit:"unlimited",expiry:null}),typeof this.badge?.value=="number"&&(this.name=`${this.name} ${this.badge.value}`);const folder=CONFIG.PF2E.statusEffects.iconDir;if(this.img=`${folder}${this.slug}.webp`,systemData.persistent){const{formula,damageType}=systemData.persistent,fullFormula=`(${formula})[persistent,${damageType}]`,critRule=game.settings.get("pf2e","critRule")==="doubledamage"?"double-damage":"double-dice",roll=new DamageRoll(fullFormula,{},{evaluatePersistent:!0,critRule}),dc=game.user.isGM&&systemData.persistent.dc!==15?systemData.persistent.dc:null,localizationKey=`PF2E.Item.Condition.PersistentDamage.${dc!==null?"NameWithDC":"Name"}`;this.name=game.i18n.format(localizationKey,{formula,damageType:game.i18n.localize(CONFIG.PF2E.damageRollFlavors[damageType]??damageType),dc}),systemData.persistent.damage=roll,systemData.persistent.expectedValue=roll.expectedValue,this.img=PERSISTENT_DAMAGE_IMAGES[damageType]??this.img}}prepareSiblingData(){if(!this.actor)throw ErrorPF2e("prepareSiblingData may only be called from an embedded item");if(!this.active)return;const deactivate=__name2(condition=>{condition.active=!1,condition.system.references.overriddenBy.push({id:this.id,type:"condition"})},"deactivate"),conditions=this.actor.conditions.active;if(this.system.overrides.length>0){const overridden=conditions.filter(c=>this.system.overrides.includes(c.key));for(const condition of overridden)deactivate(condition)}const ofSameType=conditions.filter(c=>c!==this&&c.key===this.key);for(const condition of ofSameType)if(condition.slug==="persistent-damage"){const thisValue=this.system.persistent?.expectedValue??0,otherValue=condition.system.persistent?.expectedValue??0;thisValue>=otherValue&&deactivate(condition)}else(this.value===condition.value&&(!this.isLocked||condition.isLocked)||this.value&&condition.value&&this.value>condition.value)&&deactivate(condition)}prepareActorData(){if(super.prepareActorData(),this.actor.conditions.set(this.id,this),this.active&&this.system.persistent){const{damageType}=this.system.persistent;this.actor.rollOptions.all[`self:condition:persistent-damage:${damageType}`]=!0}}prepareRuleElements(options){return this.active?super.prepareRuleElements(options):[]}async _preUpdate(changed,options,user){return options.conditionValue=this.value,super._preUpdate(changed,options,user)}_onUpdate(changed,options,userId){if(super._onUpdate(changed,options,userId),!game.user.isGM&&!this.actor?.hasPlayerOwner&&game.settings.get("pf2e","metagame_secretCondition"))return;const[priorValue,newValue]=[options.conditionValue,this.value];if(!!priorValue&&!!newValue&&priorValue!==newValue&&!this.system.references.parent?.id){const change=newValue>priorValue?{create:this}:{delete:this};this.actor?.getActiveTokens().shift()?.showFloatyText(change)}game.pf2e.StatusEffects.refresh()}};__name2(_ConditionPF2e,"ConditionPF2e");let ConditionPF2e=_ConditionPF2e;const _EffectPF2e=class extends AbstractEffectPF2e{static{__name(this,"_EffectPF2e")}get badge(){return this.system.badge}get level(){return this.system.level.value}get traits(){return new Set(this.system.traits.value)}get isExpired(){return this.system.expired}get isAura(){return this.rules.some(r=>r.key==="Aura"&&!r.ignored)}get isIdentified(){return!this.system.unidentified}get fromAura(){return!!this.flags.pf2e.aura}prepareBaseData(){super.prepareBaseData();const{system}=this;["unlimited","encounter"].includes(system.duration.unit)?system.duration.expiry=null:system.duration.expiry||="turn-start",system.expired=this.remainingDuration.expired;const{badge}=this.system;badge&&(badge.type==="formula"?badge.label=null:(badge.min=badge.labels?1:badge.min??1,badge.max=badge.labels?.length??badge.max??1/0,badge.value=Math.clamped(badge.value,badge.min,badge.max),badge.label=badge.labels?.at(badge.value-1)?.trim()||null))}prepareRuleElements(options){if(game.settings.get("pf2e","automation.effectExpiration")&&this.isExpired&&this.actor?.items.has(this.id))for(const rule of this.system.rules)rule.ignored=!0;return super.prepareRuleElements(options)}async increase(){const badge=this.system.badge;if(badge?.type==="counter"&&!this.isExpired){const value=badge.value+1;await this.update({system:{badge:{value}}})}}async decrease(){if(this.system.badge?.type!=="counter"||this.isExpired){await this.delete();return}const value=this.system.badge.value-1;await this.update({system:{badge:{value}}})}getRollOptions(prefix=this.type){const slug=this.slug??sluggify(this.name),trimmedSlug=slug.replace(/^(?:spell-)?(?:effect|stance)-/,""),options=super.getRollOptions(prefix);return options.findSplice(o=>o===`${prefix}:${slug}`,`${prefix}:${trimmedSlug}`),options}async evaluateFormulaBadge(badge){const{actor}=this;if(!actor)throw ErrorPF2e("A formula badge can only be evaluated if part of an embedded effect");const roll=await new Roll(badge.value,this.getRollData()).evaluate({async:!0}),reevaluate=badge.reevaluate?{formula:badge.value,event:badge.reevaluate}:null,token=actor.getActiveTokens(!1,!0).shift(),speaker=ChatMessagePF2e.getSpeaker({actor,token});return roll.toMessage({flavor:reduceItemName(this.name),speaker}),{type:"value",value:roll.total,labels:badge.labels,reevaluate}}async _preCreate(data,options,user){if(this.isOwned){const initiative=this.origin?.combatant?.initiative??game.combat?.combatant?.initiative??null;this._source.system.start={value:game.time.worldTime,initiative}}const badge=data.system.badge;return this.actor&&badge?.type==="formula"&&badge.evaluate&&(this._source.system.badge=await this.evaluateFormulaBadge(badge)),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){const duration=changed.system?.duration;duration?.unit==="unlimited"?duration.expiry=null:typeof duration?.unit=="string"&&!["unlimited","encounter"].includes(duration.unit)&&(duration.expiry||="turn-start",duration.value===-1&&(duration.value=1));const currentBadge=this.system.badge,badgeChange=changed.system?.badge??null;if(badgeChange){const badgeTypeChanged=badgeChange?.type&&badgeChange.type!==currentBadge?.type,labels="labels"in badgeChange&&Array.isArray(badgeChange.labels)?badgeChange.labels:currentBadge?.labels;if(badgeTypeChanged)badgeChange.value=1;else if(currentBadge?.type==="counter"){const[minValue,maxValue]=(()=>{const configuredMin=Number(badgeChange.min??currentBadge.min),configuredMax=Number(badgeChange.max??currentBadge.max);return labels?[1,Math.min(labels.length,configuredMax)]:[configuredMin,configuredMax]})();if(typeof badgeChange.value=="number"&&badgeChange.value0}get handsHeld(){return this.system.equipped.carryType==="held"?this.system.equipped.handsHeld??1:0}get isWorn(){return this.system.equipped.carryType==="worn"}get price(){return this.system.price}get assetValue(){return CoinsPF2e.fromPrice(this.price,this.quantity)}get identificationStatus(){return this.system.identification.status}get isIdentified(){return this.system.identification.status==="identified"}get isAlchemical(){return this.traits.has("alchemical")}get isMagical(){const traits=this.traits;return["magical","arcane","primal","divine","occult"].some(t=>traits.has(t))}get isInvested(){return this.traits.has("invested")?this.isEquipped&&this.isIdentified&&this.system.equipped.invested===!0:null}get isCursed(){return this.traits.has("cursed")}get isTemporary(){return this.system.temporary}get isShoddy(){return this.system.traits.otherTags.includes("shoddy")}get isDamaged(){return this.system.hp.value>0&&this.system.hp.valuec.id===this.system.containerId)??null}get bulk(){const{value,per}=this.system.bulk,bulkRelevantQuantity=Math.floor(this.quantity/per),actorSize=this.actor?.isOfType("creature")?this.actor.size:null;return new Bulk({light:value}).convertToSize(this.size,actorSize??this.size).times(bulkRelevantQuantity)}get activations(){return Object.values(this.system.activations??{}).map(action2=>{const components=[];return action2.components.cast&&components.push(game.i18n.localize("PF2E.Item.Activation.Cast")),action2.components.command&&components.push(game.i18n.localize("PF2E.Item.Activation.Command")),action2.components.envision&&components.push(game.i18n.localize("PF2E.Item.Activation.Envision")),action2.components.interact&&components.push(game.i18n.localize("PF2E.Item.Activation.Interact")),{componentsLabel:components.join(", "),...action2}})}getRollOptions(prefix=this.type){const baseOptions=super.getRollOptions(prefix),{material}=this.system,physicalItemOptions=Object.entries({equipped:this.isEquipped,[`rarity:${this.rarity}`]:!0,uninvested:this.isInvested===!1,[`material:${material.type}`]:!!material.type}).filter(([_key,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`);return[baseOptions,physicalItemOptions].flat().sort()}_initialize(options){this._container=null,super._initialize(options)}prepareBaseData(){super.prepareBaseData();const systemData=this.system;systemData.containerId||=null,systemData.material.type||=null,systemData.material.grade||=null,systemData.stackGroup||=null,systemData.equippedBulk.value||=null,systemData.baseItem??=sluggify(systemData.stackGroup??"")||null,systemData.hp.brokenThreshold=Math.floor(systemData.hp.max/2),this.isEmbedded||(systemData.hp.value=Math.min(systemData.hp.value,systemData.hp.max)),typeof systemData.price.value=="string"&&(systemData.price.value=CoinsPF2e.fromString(systemData.price.value)),systemData.traits.value.includes("infused")&&(systemData.temporary=!0),systemData.price.value=new CoinsPF2e(systemData.temporary?{}:systemData.price.value),systemData.price.per=Math.max(1,systemData.price.per??1),this.system.usage=getUsageDetails(systemData.usage.value);const{equipped,usage}=this.system;equipped.handsHeld??=0,equipped.carryType??="worn",usage.type==="worn"&&usage.where&&(equipped.inSlot??=!1),this.actor?.isOfType("loot")&&(equipped.carryType="worn",equipped.inSlot=!1),systemData.bulk=organizeBulkData(this),this._container?.id!==this.system.containerId&&(this._container=null)}prepareDerivedData(){super.prepareDerivedData(),this.name=game.pf2e.system.generateItemName(this),this.system.identification.identified??={name:this.name,img:this.img,data:{description:{value:this.description}}};const{level,rarity,price}=computeLevelRarityPrice(this);this.system.level.value=level,this.system.traits.rarity=rarity,this.system.price.value=price;const mystifiedData=this.getMystifiedData(this.identificationStatus);this.name=mystifiedData.name,this.img=mystifiedData.img,this.system.description.value=mystifiedData.data.description.value,this.system.identification.unidentified=this.getMystifiedData("unidentified")}prepareSiblingData(){this.actor&&(this.isStowed&&(this.system.equipped.carryType="stowed",delete this.system.equipped.inSlot),this._container&&!this.actor.items.has(this._container.id)&&(this._container=this.system.containerId=null))}onPrepareSynthetics(){this.system.hp.value=Math.min(this.system.hp.value,this.system.hp.max)}isStackableWith(item){if(!(this!==item&&this.type===item.type&&this.name===item.name&&this.isIdentified===item.isIdentified&&![this,item].some(i=>i.isHeld||i.isOfType("backpack"))))return!1;const thisData=this.toObject().system,otherData=item.toObject().system;return thisData.quantity=otherData.quantity,thisData.equipped=otherData.equipped,thisData.containerId=otherData.containerId,thisData._migration=otherData._migration,thisData.identification=otherData.identification,equals(thisData,otherData)}async stackWith(targetItem){if(this.isStackableWith(targetItem)){const stackQuantity=this.quantity+targetItem.quantity;await this.delete({render:!1})&&await targetItem.update({"system.quantity":stackQuantity})}}async move({relativeTo,sortBefore,toContainer,toStack,render=!0}){if(!this.actor)throw ErrorPF2e("Tried to move an unonwned item!");if(toStack)return this.stackWith(toStack);const containerResolved=toContainer??relativeTo?.container,mainContainerUpdate=(()=>{if(containerResolved&&!isCycle(this,containerResolved)){const equipped={carryType:containerResolved.stowsItems?"stowed":"worn",handsHeld:0,inSlot:!1};return{system:{containerId:containerResolved?.id,equipped}}}return!containerResolved&&this.isInContainer?{system:{containerId:null,equipped:{carryType:"worn",handsHeld:0,inSlot:!1}}}:null})(),inventory=this.actor.inventory,siblings=(containerResolved?.contents.contents??inventory.contents).sort(sortBy(i=>i.sort));if(!sortBefore&&!siblings.length&&mainContainerUpdate){await this.update(mainContainerUpdate);return}const updates=SortingHelpers.performIntegerSort(this,{target:relativeTo,siblings,sortBefore}).map(s=>{const baseUpdate={_id:s.target.id,...s.update};return mainContainerUpdate&&s.target.id===this.id?mergeObject(baseUpdate,mainContainerUpdate):baseUpdate}),stowedOrUnstowed=!this.container&&!!containerResolved||this.container&&!containerResolved;await this.actor.updateEmbeddedDocuments("Item",updates,{render:stowedOrUnstowed||render})}getMystifiedData(status,_options){const mystifiedData=this.system.identification[status],name2=mystifiedData.name||this.generateUnidentifiedName(),img=mystifiedData.img||getUnidentifiedPlaceholderImage(this),description=mystifiedData.data.description.value||(()=>{if(status==="identified")return this.description;const itemType=this.generateUnidentifiedName({typeOnly:!0}),caseCorrect=__name2(noun=>game.i18n.lang.toLowerCase()==="de"?noun:noun.toLowerCase(),"caseCorrect");return game.i18n.format("PF2E.identification.UnidentifiedDescription",{item:caseCorrect(itemType)})})();return{name:name2,img,data:{description:{value:description}}}}async getChatData(){const{type,grade}=this.system.material,material=type&&grade?game.i18n.format("PF2E.Item.Weapon.MaterialAndRunes.MaterialOption",{type:game.i18n.localize(CONFIG.PF2E.preciousMaterials[type]),grade:game.i18n.localize(CONFIG.PF2E.preciousMaterialGrades[grade])}):null;return{rarity:{name:this.rarity,label:CONFIG.PF2E.rarityTraits[this.rarity],description:CONFIG.PF2E.traitsDescriptions[this.rarity]},description:{value:this.description},material}}async setIdentificationStatus(status){this.identificationStatus!==status&&await this.update({"system.identification.status":status,"system.identification.unidentified":this.getMystifiedData("unidentified")})}generateUnidentifiedName({typeOnly=!1}={}){const itemType=game.i18n.localize(`TYPES.Item.${this.type}`);return typeOnly?itemType:game.i18n.format("PF2E.identification.UnidentifiedItem",{item:itemType})}traitChatData(dictionary){const traitData=super.traitChatData(dictionary);for(const trait of traitData)if(trait.mystified=!this.isIdentified&&MystifiedTraits.has(trait.value),trait.excluded=trait.mystified&&!game.user.isGM,trait.excluded)delete trait.description;else if(trait.mystified){const gmNote=game.i18n.localize("PF2E.identification.TraitGMNote");trait.description=trait.description?`${gmNote} -${game.i18n.localize(trait.description)}`:gmNote}return traitData}async _preCreate(data,options,user){return this._source.system.equipped={carryType:"worn"},this.system.usage.type==="worn"&&!!this.system.usage.where&&this.actor?.isOfType("character")&&(this._source.system.equipped.inSlot=!1),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){if(typeof changed.system?.hp?.value=="number"?changed.system.hp.value=Math.clamped(changed.system.hp.value,0,this.system.hp.max):typeof changed.system?.hp?.max=="number"&&changed.system.hp.maxr.key==="ItemAlteration"&&r.property==="hp-max"&&r.itemType===this.type)??!1;if(actor&&hasHpChangeRules&&changed.system?.equipped?.carryType){const postUpdateHPMax=(()=>{const actorSource=actor.toObject(),itemSource=actorSource.items.find(i=>i._id===this.id)??{system:{}};itemSource.system=mergeObject(itemSource.system,deepClone(changed.system));const itemClone=new ActorProxyPF2e(actorSource).items.get(this.id,{strict:!0});return itemClone.isOfType("armor")?itemClone.system.hp.max:this.system.hp.max})();if(postUpdateHPMax!==this.system.hp.max){changed.system.hp??=deepClone(this._source.system.hp);const floorOrCeil=postUpdateHPMax>this.system.hp.max?Math.floor:Math.ceil;changed.system.hp.value=floorOrCeil(Math.clamped(this.system.hp.value*(postUpdateHPMax/this.system.hp.max),0,postUpdateHPMax))}}return super._preUpdate(changed,options,user)}};__name2(_PhysicalItemPF2e,"PhysicalItemPF2e");let PhysicalItemPF2e=_PhysicalItemPF2e;const _PhysicalItemSheetPF2e=class extends ItemSheetPF2e{static{__name(this,"_PhysicalItemSheetPF2e")}async getData(options){const sheetData=await super.getData(options),{item}=this,basePrice=new CoinsPF2e(item._source.system.price.value),priceAdjustment=(()=>{const baseCopperValue=basePrice.copperValue,derivedCopperValue=item.system.price.value.copperValue;return derivedCopperValue>baseCopperValue?"higher":derivedCopperValue{const basePrice2=new CoinsPF2e(baseData.system.price.value).scale(baseData.system.quantity).copperValue,derivedPrice=item.assetValue.copperValue;return basePrice2!==derivedPrice?game.i18n.format(hintText,{property:game.i18n.localize("PF2E.PriceLabel"),value:item.price.value.toString()}):null})();return{...sheetData,itemType:game.i18n.localize("PF2E.ItemTitle"),hasSidebar:!0,baseLevel:baseData.system.level.value,adjustedLevelHint,basePrice,priceAdjustment,adjustedPriceHint,actionTypes:CONFIG.PF2E.actionTypes,actionsNumber:CONFIG.PF2E.actionsNumber,bulkTypes:CONFIG.PF2E.bulkTypes,frequencies:CONFIG.PF2E.frequencies,sizes:CONFIG.PF2E.actorSizes,stackGroups:CONFIG.PF2E.stackGroups,usages:CONFIG.PF2E.usages,isPhysical:!0,activations,bulkDisabled:!!sheetData.data?.stackGroup?.trim()}}render(force,options){return!this.item.isIdentified&&!game.user.isGM?(ui.notifications.warn(this.item.description),this):super.render(force,options)}prepareMaterials(valuationData){const preciousMaterials2=CONFIG.PF2E.preciousMaterials,materials=Object.entries(valuationData).reduce((result,[materialKey,materialData])=>{const validGrades=[...PRECIOUS_MATERIAL_GRADES].filter(grade=>!!materialData[grade]);return validGrades.length&&(result[materialKey]={label:game.i18n.localize(preciousMaterials2[materialKey]),grades:Object.fromEntries(validGrades.map(grade=>[grade,{value:JSON.stringify({type:materialKey,grade}),label:game.i18n.localize(CONFIG.PF2E.preciousMaterialGrades[grade])}]))}),result},{});return{value:JSON.stringify(this.item.material),materials}}activateListeners($html){super.activateListeners($html),$html.find("[data-action=activation-add]").on("click",event=>{event.preventDefault();const id=randomID(16),action2={id,actionCost:{value:1,type:"action"},components:{command:!1,envision:!1,interact:!1,cast:!1},description:{value:""},traits:{value:[],custom:""}};this.item.update({[`system.activations.${id}`]:action2})}),$html.find("[data-action=activation-delete]").on("click",event=>{event.preventDefault();const id=$(event.target).closest("[data-activation-id]").attr("data-activation-id");Object.values(this.item.system.activations??[]).length===1&&id&&id in(this.item.system.activations??{})?this.item.update({"system.-=activations":null}):this.item.update({[`system.activations.-=${id}`]:null})}),$html.find("[data-action=activation-frequency-add]").on("click",event=>{const id=$(event.target).closest("[data-activation-id]").attr("data-activation-id");if(id&&id in(this.item.system.activations??{})){const per=CONFIG.PF2E.frequencies.day;this.item.update({[`system.activations.${id}.frequency`]:{value:1,max:1,per}})}}),$html.find("[data-action=activation-frequency-delete]").on("click",event=>{const id=$(event.target).closest("[data-activation-id]").attr("data-activation-id");id&&id in(this.item.system.activations??{})&&this.item.update({[`system.activations.${id}.-=frequency`]:null})})}async _updateObject(event,formData){const[materialType,materialGrade]=[formData["system.material.type"],formData["system.material.grade"]],typeIsValid=materialType===void 0||typeof materialType=="string"&&materialType in CONFIG.PF2E.preciousMaterials,gradeIsValid=materialGrade===void 0||typeof materialGrade=="string"&&materialGrade in CONFIG.PF2E.preciousMaterialGrades;(!typeIsValid||!gradeIsValid)&&(formData["system.material.type"]=null,formData["system.material.grade"]=null),"system.price.value"in formData&&(formData["system.price.value"]=CoinsPF2e.fromString(String(formData["system.price.value"])));const expanded=expandObject(formData);for(const action2 of Object.values(expanded.system?.activations??[])){const actionCost=action2.actionCost;if(actionCost){const isAction=actionCost.type==="action";actionCost.value||(actionCost.value=isAction?actionCost.value||1:null)}}return super._updateObject(event,flattenObject(expanded))}};__name2(_PhysicalItemSheetPF2e,"PhysicalItemSheetPF2e");let PhysicalItemSheetPF2e=_PhysicalItemSheetPF2e;const _ArmorPF2e=class extends PhysicalItemPF2e{static{__name(this,"_ArmorPF2e")}isStackableWith(item){return this.isEquipped||item.isEquipped?!1:super.isStackableWith(item)}get isShield(){return this.system.category==="shield"}get isArmor(){return!this.isShield}get isBarding(){return["light-barding","heavy-barding"].includes(this.category)}get baseType(){return this.system.baseItem??null}get group(){return this.system.group||null}get category(){return this.system.category}get dexCap(){return this.isShield?null:this.system.dexCap}get strength(){return this.isShield?null:this.system.strength}get checkPenalty(){return this.isShield?null:this.system.checkPenalty||null}get speedPenalty(){return this.system.speedPenalty||null}get acBonus(){return this.system.acBonus}get hitPoints(){return deepClone(this.system.hp)}get hardness(){return this.system.hardness}get isSpecific(){return this.system.specific?.value??!1}get isBroken(){const{hitPoints}=this;return hitPoints.max>0&&!this.isDestroyed&&hitPoints.value<=hitPoints.brokenThreshold}get isDestroyed(){const{hitPoints}=this;return hitPoints.max>0&&hitPoints.value===0}get isRaised(){return this.isShield&&this.actor?.isOfType("character","npc")?this.id===this.actor.attributes.shield.itemId&&this.actor.attributes.shield.raised:!1}getRollOptions(prefix="armor"){return[super.getRollOptions(prefix),Object.entries({[`category:${this.category}`]:!0,[`group:${this.group}`]:!!this.group,[`base:${this.baseType}`]:!!this.baseType,"rune:potency":this.system.runes.potency>0,"rune:resilient":this.system.runes.resilient>0}).filter(([,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`),this.system.runes.property.map(r=>`${prefix}:rune:property:${sluggify(r)}`)].flat().sort()}prepareBaseData(){super.prepareBaseData(),this.system.potencyRune.value||=null,this.system.resiliencyRune.value||=null,this.prepareRunes();const baseTraits=this.system.traits.value,fromRunes=this.system.runes.potency||this.system.runes.resilient?["invested","abjuration"]:[],hasTraditionTraits=baseTraits.some(t=>setHasElement(MAGIC_TRADITIONS,t)),magicTraits=fromRunes.length>0&&!hasTraditionTraits?["magical"]:[];this.system.traits.value=uniq([baseTraits,fromRunes,magicTraits].flat()).sort()}prepareDerivedData(){super.prepareDerivedData();const potencyRune=this.isArmor&&this.isInvested&&!AutomaticBonusProgression.isEnabled(this.actor)?this.system.runes.potency:0,baseArmor=Number(this.system.acBonus)||0;this.system.acBonus=this.isShield&&(this.isBroken||this.isDestroyed)?0:baseArmor+potencyRune}prepareRunes(){AutomaticBonusProgression.cleanupRunes(this);const{potencyRune,resiliencyRune,propertyRune1,propertyRune2,propertyRune3,propertyRune4}=this.system,runes=this.system.runes={potency:potencyRune.value??0,resilient:resilientRuneValues.get(resiliencyRune.value)??0,property:prunePropertyRunes([propertyRune1.value,propertyRune2.value,propertyRune3.value,propertyRune4.value],RUNE_DATA.armor.property),effects:[]},maxPropertySlots=getPropertySlots(this);runes.property.length=Math.min(runes.property.length,maxPropertySlots)}prepareActorData(){const{actor}=this;if(!actor)throw ErrorPF2e("This method may only be called from embedded items");if(this.isEquipped){if(this.isArmor)for(const rollOption of this.getRollOptions("armor"))actor.rollOptions.all[rollOption]=!0;this.setActorShieldData()}}onPrepareSynthetics(){super.onPrepareSynthetics(),this.setActorShieldData()}setActorShieldData(){const{actor}=this;if(!(this.isShield&&this.isEquipped&&actor?.heldShield===this)||!actor.isOfType("character","npc"))return;const{attributes}=actor;if(attributes.shield.itemId!==null)return;const{hitPoints}=this;attributes.shield={itemId:this.id,name:this.name,ac:this.acBonus,hp:hitPoints,hardness:this.hardness,brokenThreshold:hitPoints.brokenThreshold,raised:!1,broken:this.isBroken,destroyed:this.isDestroyed,icon:this.img},actor.rollOptions.all["self:shield:equipped"]=!0,this.isDestroyed?actor.rollOptions.all["self:shield:destroyed"]=!0:this.isBroken&&(actor.rollOptions.all["self:shield:broken"]=!0)}async getChatData(htmlOptions={}){const properties=[this.isArmor?CONFIG.PF2E.armorCategories[this.category]:CONFIG.PF2E.weaponCategories.martial,`${addSign(this.acBonus)} ${game.i18n.localize("PF2E.ArmorArmorLabel")}`,this.isArmor?`${this.system.dexCap||0} ${game.i18n.localize("PF2E.ArmorDexLabel")}`:null,this.isArmor?`${this.system.checkPenalty||0} ${game.i18n.localize("PF2E.ArmorCheckLabel")}`:null,this.speedPenalty?`${this.system.speedPenalty} ${game.i18n.localize("PF2E.ArmorSpeedLabel")}`:null];return this.processChatData(htmlOptions,{...await super.getChatData(),traits:this.traitChatData(CONFIG.PF2E.armorTraits),properties})}generateUnidentifiedName({typeOnly=!1}={typeOnly:!1}){const base=this.baseType?CONFIG.PF2E.baseArmorTypes[this.baseType]:null,group=this.group?CONFIG.PF2E.armorGroups[this.group]:null,fallback=this.isShield?"PF2E.ArmorTypeShield":"TYPES.Item.armor",itemType=game.i18n.localize(base??group??fallback);return typeOnly?itemType:game.i18n.format("PF2E.identification.UnidentifiedItem",{item:itemType})}async _preCreate(data,options,user){const{category}=this._source.system;return this._source.system.usage.value=category==="shield"?"held-in-one-hand":"wornarmor",super._preCreate(data,options,user)}async _preUpdate(changed,options,user){if(changed.system?.category){const usage={value:changed.system.category==="shield"?"held-in-one-hand":"wornarmor"};changed.system=mergeObject(changed.system,{usage})}changed.system?.acBonus!==void 0&&(changed.system.acBonus||=0),changed.system?.group!==void 0&&(changed.system.group||=null);const changedSpecific=changed.system?.specific??{};return changedSpecific.value===!0?(changedSpecific.material=deepClone(this._source.system.material),changedSpecific.runes={potency:Number(this._source.system.potencyRune.value)||0,resilient:resilientRuneValues.get(this._source.system.resiliencyRune.value)||0}):changedSpecific.value===!1&&(changedSpecific["-=material"]=null,changedSpecific["-=runes"]=null),super._preUpdate(changed,options,user)}};__name2(_ArmorPF2e,"ArmorPF2e");let ArmorPF2e=_ArmorPF2e;const _BookPF2e=class extends PhysicalItemPF2e{static{__name(this,"_BookPF2e")}};__name2(_BookPF2e,"BookPF2e");let BookPF2e=_BookPF2e;const _InventoryBulk=class _InventoryBulk2{static{__name(this,"_InventoryBulk")}constructor(actor){__privateAdd(this,_actorStrength),__publicField(this,"actor"),__privateAdd(this,_value,null),__publicField(this,"encumberedAfterAddend",0),__publicField(this,"maxAddend",0),this.actor=actor}get encumberedAfter(){return Math.floor(__privateGet(this,_actorStrength,actorStrength_get)+5+this.encumberedAfterAddend)}get encumberedAfterBreakdown(){const addend=this.encumberedAfterAddend,stat=game.i18n.localize(CONFIG.PF2E.abilities.str);return`5 + ${__privateGet(this,_actorStrength,actorStrength_get)} (${stat})`+(addend?` + ${addend}`:"")}get max(){return Math.floor(__privateGet(this,_actorStrength,actorStrength_get)+10+this.maxAddend)}get maxBreakdown(){const addend=this.maxAddend,stat=game.i18n.localize(CONFIG.PF2E.abilities.str);return`10 + ${__privateGet(this,_actorStrength,actorStrength_get)} (${stat})`+(addend?` + ${addend}`:"")}get value(){return __privateGet(this,_value)?__privateGet(this,_value):(__privateSet(this,_value,_InventoryBulk2.computeTotalBulk(this.actor.inventory.filter(i=>!i.isInContainer),this.actor.size)),__privateGet(this,_value))}get encumberedPercentage(){const totalTimes10=this.value.toLightBulk(),encumberedAtTimes10=this.encumberedAfter*10+10;return Math.floor(totalTimes10/encumberedAtTimes10*100)}get maxPercentage(){const totalTimes10=this.value.toLightBulk(),limitTimes10=this.max*10+10;return Math.floor(totalTimes10/limitTimes10*100)}get maxPercentageInteger(){return this.maxPercentage>100?100:this.maxPercentage}get isEncumbered(){return this.value.normal>this.encumberedAfter}get isOverMax(){return this.value.normal>this.max}get bulk(){return this.value.normal}static computeTotalBulk(items,actorSize){items=__privateMethod(this,_flattenNonStowing,flattenNonStowing_fn).call(this,items);const nonStackingItems=items.filter(i=>i.isOfType("backpack")||i.system.bulk.per===1&&i.system.baseItem),nonStackingIds=new Set(nonStackingItems.map(i=>i.id)),stackingItems=items.filter(i=>!nonStackingIds.has(i.id)),baseBulk=nonStackingItems.map(i=>i.bulk).reduce((first,second)=>first.plus(second),new Bulk),stackingBehaviors=stackingItems.map(item=>({per:item.system.bulk.per,item,group:item.system.baseItem,bulk:new Bulk({light:item.system.bulk.value}).convertToSize(item.size,actorSize)})),bulks=[...groupBy(stackingBehaviors,d=>`${d.group}-${d.per}-${d.bulk.toLightBulk()}`).values()].map(dataEntries=>{const{bulk,per}=dataEntries[0],quantity=dataEntries.map(entry=>entry.item.quantity).reduce((sum2,value)=>sum2+value,0),bulkRelevantQuantity=Math.floor(quantity/per);return bulk.times(bulkRelevantQuantity)});return baseBulk.plus(bulks.reduce((first,second)=>first.plus(second),new Bulk))}};_value=new WeakMap,_actorStrength=new WeakSet,actorStrength_get=__name2(function(){return this.actor.isOfType("character","npc")?this.actor.abilities.str.mod:1/0},"#actorStrength"),_flattenNonStowing=new WeakSet,flattenNonStowing_fn=__name2(function(items){return items.map(item=>item.isOfType("backpack")&&!item.stowsItems?__privateMethod(this,_flattenNonStowing,flattenNonStowing_fn).call(this,item.contents.contents):item).flat()},"#flattenNonStowing"),__privateAdd(_InventoryBulk,_flattenNonStowing),__name2(_InventoryBulk,"InventoryBulk");let InventoryBulk=_InventoryBulk;const _ActorInventory=class extends DelegatedCollection{static{__name(this,"_ActorInventory")}actor;bulk;constructor(actor,entries){super(entries?.map(entry=>[entry.id,entry])),this.actor=actor,this.bulk=new InventoryBulk(this.actor)}get coins(){return this.filter(i=>i.isOfType("treasure")&&i.isCoinage).map(item=>item.assetValue).reduce((first,second)=>first.add(second),new CoinsPF2e)}get totalWealth(){return this.filter(item=>game.user.isGM||item.isIdentified).map(item=>item.assetValue).reduce((first,second)=>first.add(second),new CoinsPF2e)}get invested(){return this.actor.isOfType("character")?{value:this.filter(item=>!!item.isInvested).length,max:this.actor.system.resources.investiture.max}:null}findStackableItem(item){const testItem=item instanceof PhysicalItemPF2e?item.clone():new ItemProxyPF2e(deepClone(item));if(!testItem.isOfType("physical"))return null;const stackCandidates=this.filter(i=>!i.isInContainer&&i.isStackableWith(testItem));if(stackCandidates.length===0)return null;if(stackCandidates.length>1){const notEquipped=stackCandidates.filter(item2=>!item2.isEquipped);return notEquipped.length>0?notEquipped[0]:stackCandidates[0]}else return stackCandidates[0]}async addCoins(coins,{combineStacks=!0}={}){const topLevelCoins=this.actor.itemTypes.treasure.filter(item=>combineStacks&&item.isCoinage),coinsByDenomination=groupBy(topLevelCoins,item=>item.denomination);for(const denomination of DENOMINATIONS){const quantity=coins[denomination]??0;if(quantity>0){const item=coinsByDenomination.get(denomination)?.at(0);if(item)await item.update({"system.quantity":item.quantity+quantity});else{const compendiumId=coinCompendiumIds[denomination],pack=game.packs.find(p=>p.collection==="pf2e.equipment-srd");if(!pack)throw ErrorPF2e("Unexpected error retrieving equipment compendium");const item2=(await pack.getDocument(compendiumId))?.clone();item2?.isOfType("treasure")&&(item2.updateSource({"system.quantity":quantity}),await this.actor.createEmbeddedDocuments("Item",[item2.toObject()]))}}}}async removeCoins(coins,{byValue=!0}={}){const coinsToRemove=new CoinsPF2e(coins),actorCoins=this.coins,coinsToAdd=new CoinsPF2e;if(byValue){let valueToRemoveInCopper=coinsToRemove.copperValue;if(valueToRemoveInCopper>actorCoins.copperValue)return!1;if(valueToRemoveInCopper%10>actorCoins.cp)coinsToAdd.cp=10,coinsToRemove.cp=valueToRemoveInCopper%10,valueToRemoveInCopper+=10-coinsToRemove.cp;else{coinsToRemove.cp=valueToRemoveInCopper%10,valueToRemoveInCopper-=coinsToRemove.cp;const newCopper=actorCoins.cp-coinsToRemove.cp,extraCopper=Math.min(valueToRemoveInCopper/10,Math.trunc(newCopper/10))*10;coinsToRemove.cp+=extraCopper,valueToRemoveInCopper-=extraCopper}if(valueToRemoveInCopper/10%10>actorCoins.sp)coinsToAdd.sp=10,coinsToRemove.sp=valueToRemoveInCopper/10%10,valueToRemoveInCopper+=100-coinsToRemove.sp*10;else{coinsToRemove.sp=valueToRemoveInCopper/10%10,valueToRemoveInCopper-=coinsToRemove.sp*10;const newSilver=actorCoins.sp-coinsToRemove.sp,extraSilver=Math.min(valueToRemoveInCopper/100,Math.trunc(newSilver/10))*10;coinsToRemove.sp+=extraSilver,valueToRemoveInCopper-=extraSilver*10}if(valueToRemoveInCopper/100%10>actorCoins.gp)coinsToAdd.gp=10,coinsToRemove.gp=valueToRemoveInCopper/100%10,valueToRemoveInCopper+=1e3-coinsToRemove.gp*100;else{coinsToRemove.gp=valueToRemoveInCopper/100%10,valueToRemoveInCopper-=coinsToRemove.gp*100;const newGold=actorCoins.gp-coinsToRemove.gp,extraGold=Math.min(valueToRemoveInCopper/1e3,Math.trunc(newGold/10))*10;coinsToRemove.gp+=extraGold,valueToRemoveInCopper-=extraGold*100}coinsToRemove.pp=valueToRemoveInCopper/1e3}const coinsToPull=actorCoins.add(coinsToAdd);if(!(coinsToRemove.pp<=coinsToPull.pp&&coinsToRemove.gp<=coinsToPull.gp&&coinsToRemove.sp<=coinsToPull.sp&&coinsToRemove.cp<=coinsToPull.cp))return!1;Object.values(coinsToAdd).some(value=>value!==0)&&await this.addCoins(coinsToAdd);const topLevelCoins=this.actor.itemTypes.treasure.filter(item=>item.isCoinage),coinsByDenomination=groupBy(topLevelCoins,item=>item.denomination);for(const denomination of DENOMINATIONS){let quantityToRemove=coinsToRemove[denomination];const coinItems=coinsByDenomination.get(denomination);if(quantityToRemove&&coinItems){const itemsToUpdate=[],itemsToDelete=[];for(const item of coinItems){if(quantityToRemove===0)break;if(item.quantity>quantityToRemove){itemsToUpdate.push({_id:item.id,"system.quantity":item.quantity-quantityToRemove}),quantityToRemove=0;break}else quantityToRemove-=item.quantity,itemsToDelete.push(item.id)}itemsToUpdate.length>0&&await this.actor.updateEmbeddedDocuments("Item",itemsToUpdate),itemsToDelete.length>0&&await this.actor.deleteEmbeddedDocuments("Item",itemsToDelete),quantityToRemove>0&&console.warn("Attempted to remove more coinage than exists")}}return!0}async sellAllTreasure(){const treasures=this.actor.itemTypes.treasure.filter(item=>!item.isCoinage),treasureIds=treasures.map(item=>item.id),coins=treasures.map(item=>item.assetValue).reduce((first,second)=>first.add(second),new CoinsPF2e);await this.actor.deleteEmbeddedDocuments("Item",treasureIds),await this.actor.inventory.addCoins(coins)}async add(item,options={}){if(options.stack&&item.isOfType("physical")){const stackableItem=this.findStackableItem(item._source);if(stackableItem){await stackableItem.update({"system.quantity":stackableItem.quantity+item.quantity});return}}await this.actor.createEmbeddedDocuments("Item",[item.toObject()])}};__name2(_ActorInventory,"ActorInventory");let ActorInventory=_ActorInventory;const _ContainerPF2e=class extends PhysicalItemPF2e{static{__name(this,"_ContainerPF2e")}contents=new Collection;get stowsItems(){return this.system.stowing}get isCollapsed(){return this.system.collapsed}get capacity(){return{value:InventoryBulk.computeTotalBulk(this.contents.contents,this.actor?.size??"med"),max:weightToBulk(this.system.bulkCapacity.value)||new Bulk}}get capacityPercentage(){const{value,max}=this.capacity;return Math.min(100,Math.floor(value.toLightBulk()/max.toLightBulk()*100))}get bulk(){const reduction=!this.traits.has("extradimensional")||!hasExtraDimensionalParent(this)?weightToBulk(this.system.negateBulk.value):new Bulk;return super.bulk.plus(this.capacity.value.minus(reduction??new Bulk))}prepareSiblingData(){this.contents=new Collection(this.actor.inventory.filter(i=>i.container?.id===this.id).map(item=>[item.id,item]))}async ejectContents(){if(!this.actor)return;const updates=this.contents.map(i=>({_id:i.id,"system.containerId":this.container?.id??null}));await this.actor.updateEmbeddedDocuments("Item",updates,{render:!1})}async getChatData(htmlOptions={}){return this.processChatData(htmlOptions,{...await super.getChatData(),traits:this.traitChatData(CONFIG.PF2E.equipmentTraits)})}};__name2(_ContainerPF2e,"ContainerPF2e");let ContainerPF2e=_ContainerPF2e;const _EquipmentPF2e=class extends PhysicalItemPF2e{static{__name(this,"_EquipmentPF2e")}get otherTags(){return new Set(this.system.traits.otherTags)}prepareBaseData(){super.prepareBaseData(),this.system.apex&&(this.traits.has("apex")?this.isInvested||(this.system.apex.selected=!1):delete this.system.apex)}prepareSiblingData(){if(super.prepareSiblingData(),!this.system.apex)return;const otherApexData=this.actor.itemTypes.equipment.flatMap(e=>e===this?[]:e.system.apex??[]);if(this.system.apex.selected||this.isInvested&&otherApexData.every(d=>!d.selected)){this.system.apex.selected=!0;for(const data of otherApexData)data.selected=!1}}prepareActorData(){const{actor}=this;actor?.isOfType("character")&&this.system.apex?.selected&&(actor.system.build.attributes.apex?this.system.apex.selected=!1:actor.system.build.attributes.apex=this.system.apex.attribute)}async getChatData(htmlOptions={}){return this.processChatData(htmlOptions,{...await super.getChatData(),traits:this.traitChatData(CONFIG.PF2E.equipmentTraits)})}generateUnidentifiedName({typeOnly=!1}={typeOnly:!1}){const identificationConfig=CONFIG.PF2E.identification,slotType=/book\b/.test(this.slug??"")?"Book":/\bring\b/.test(this.slug??"")?"Ring":this.system.usage.value?.replace(/^worn/,"").capitalize()??"",itemType=objectHasKey(identificationConfig.UnidentifiedType,slotType)?game.i18n.localize(identificationConfig.UnidentifiedType[slotType]):game.i18n.localize(identificationConfig.UnidentifiedType.Object);return typeOnly?itemType:game.i18n.format(identificationConfig.UnidentifiedItem,{item:itemType})}async _preCreate(data,options,user){return delete this._source.system.apex?.selected,super._preCreate(data,options,user)}async _preUpdate(changed,options,user){const changedTraits=changed.system?.traits?.value;return!(this._source.system.traits.value.includes("apex")&&(!Array.isArray(changedTraits)||changedTraits.includes("apex")))&&this._source.system.apex&&(delete changed.system?.apex,changed.system??={},changed.system=mergeObject(changed.system,{"-=apex":null})),super._preUpdate(changed,options,user)}};__name2(_EquipmentPF2e,"EquipmentPF2e");let EquipmentPF2e=_EquipmentPF2e;const _TreasurePF2e=class extends PhysicalItemPF2e{static{__name(this,"_TreasurePF2e")}get isCoinage(){return this.system.stackGroup==="coins"}get denomination(){if(!this.isCoinage)return null;const options=DENOMINATIONS.filter(denomination=>!!this.price.value[denomination]);return options.length===1?options[0]:null}prepareBaseData(){super.prepareBaseData(),this.isCoinage&&(this.system.size="med")}async getChatData(htmlOptions={}){const systemData=this.system,traits=this.traitChatData({});return this.processChatData(htmlOptions,{...systemData,traits})}};__name2(_TreasurePF2e,"TreasurePF2e");let TreasurePF2e=_TreasurePF2e;const _WeaponPF2e=class _WeaponPF2e2 extends PhysicalItemPF2e{static{__name(this,"_WeaponPF2e")}altUsageType=null;get isEquipped(){const{category,slug,traits}=this.system;return category==="unarmed"&&slug!=="handwraps-of-mighty-blows"?!0:super.isEquipped||this.handsHeld===1&&traits.value.some(t=>/^jousting-d\d{1,2}$/.test(t))}isStackableWith(item){if(this.category==="unarmed"||!item.isOfType("weapon")||item.category==="unarmed")return!1;const equippedButStackable=["bomb","dart"].includes(this.group??"");return(this.isEquipped||item.isEquipped)&&!equippedButStackable?!1:super.isStackableWith(item)}get baseType(){return this.system.baseItem}get group(){return this.system.group}get category(){return this.system.category}get defaultAttribute(){return this.system.attribute??(this.isRanged?"dex":"str")}get hands(){return{worngloves:"0","held-in-one-hand":"1","held-in-one-plus-hands":"1+","held-in-two-hands":"2"}[this.system.usage.value]??"1"}get maxRange(){return this.system.maxRange??(this.system.range?this.system.range*6:null)}get range(){const rangeIncrement=this.system.range,maxRange=this.system.maxRange;return maxRange?{increment:null,max:maxRange}:rangeIncrement?{increment:rangeIncrement,max:rangeIncrement*6}:null}get reload(){return this.system.reload.value||null}get isSpecific(){return this.system.specific?.value??!1}get isMelee(){return!this.isRanged}get isRanged(){return!!this.system.range}get isThrown(){return this.isRanged&&(this.baseType==="alchemical-bomb"||this.system.traits.value.includes("thrown"))}get isThrowable(){return this.isThrown||this.system.traits.value.some(t=>t.startsWith("thrown"))||!!this.system.meleeUsage?.traits.some(t=>t.startsWith("thrown"))}get isOversized(){return this.category!=="unarmed"&&!!this.parent?.system.traits?.size.isSmallerThan(this.size,{smallIsMedium:!0})}get baseDamage(){return{...deepClone(this.system.damage),damageType:this.system.traits.toggles.versatile.selection??this.system.traits.toggles.modular.selection??this.system.damage.damageType}}get dealsDamage(){const{baseDamage}=this;return baseDamage.dice>0||baseDamage.modifier>0||this.system.splashDamage.value>0||!!baseDamage.persistent?.number}get requiresAmmo(){return this.isRanged&&!this.isThrown&&![null,"-"].includes(this.reload)}get ammo(){const ammo=this.actor?.items.get(this.system.selectedAmmoId??"");return ammo?.isOfType("consumable","weapon")&&ammo.quantity>0?ammo:null}get otherTags(){return new Set(this.system.traits.otherTags)}isAmmoFor(weapon){return this.system.usage.canBeAmmo&&!weapon.system.traits.value.includes("repeating")}getRollOptions(prefix=this.type){const{baseDamage}=this,damage={category:DamageCategorization.fromDamageType(baseDamage.damageType),type:baseDamage.damageType,dice:{number:baseDamage.die?baseDamage.dice:0,faces:Number(baseDamage.die?.replace(/^d/,""))}},{actor}=this,isDeityFavored=!!(this.baseType&&actor?.isOfType("character")&&actor.deity?.favoredWeapons.includes(this.baseType)),thrownMelee=this.isThrown&&this.altUsageType==="thrown",baseTypeRollOptions=(()=>{const equivalentBases=CONFIG.PF2E.equivalentWeapons;return[this.baseType??[],equivalentBases[this.baseType??""]??[]].flat().reduce((types,t)=>({...types,[`base:${t}`]:!0}),{})})(),{persistent}=this.system.damage,propertyRunes=this.system.runes.property.map(p=>`rune:property:${sluggify(p)}`).reduce((statements,s)=>({...statements,[s]:!0}),{}),ammunitionRollOptions=(ammunition=>{const rollOptions={};if(ammunition){rollOptions[`ammo:id:${ammunition.id}`]=!0,rollOptions[`ammo:slug:${ammunition.slug}`]=!0,rollOptions[`ammo:level:${ammunition.level}`]=!0,rollOptions[`ammo:material:type:${ammunition.material.type}`]=!!ammunition.material.type,rollOptions[`ammo:material:grade:${ammunition.material.grade}`]=!!ammunition.material.grade;for(const trait of ammunition.traits)rollOptions[`ammo:trait:${trait}`]=!0}return rollOptions})(this.ammo),bulk=(()=>{const unitBulk=this.bulk.times(1/this.quantity);return unitBulk.isNegligible?"negligible":unitBulk.isLight?"light":unitBulk.toString()})(),rangeIncrement=this.range?.increment;return[super.getRollOptions(prefix),Object.entries({[`category:${this.category}`]:!0,[`group:${this.group}`]:!!this.group,...baseTypeRollOptions,[`base:${this.baseType}`]:!!this.baseType,[`bulk:${bulk}`]:!0,[`hands-held:${this.handsHeld}`]:this.isEquipped&&this.handsHeld>0,[`usage:hands:${this.hands}`]:this.hands!=="0",[`range-increment:${rangeIncrement}`]:!!rangeIncrement,[`reload:${this.reload}`]:!!this.reload,[`damage:type:${damage.type}`]:!0,[`damage:category:${damage.category}`]:!!damage.category,[`damage:die:number:${damage.dice.number}`]:!!damage.dice.faces,[`damage:die:faces:${damage.dice.faces}`]:!!damage.dice.faces,[`damage-dice:${damage.dice.number}`]:!!damage.dice.faces,[`damage:persistent:${persistent?.type}`]:!!persistent,"deity-favored":isDeityFavored,oversized:this.isOversized,melee:this.isMelee,ranged:this.isRanged,thrown:this.isThrown,"thrown-melee":thrownMelee,...propertyRunes,...ammunitionRollOptions}).filter(([,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`)].flat().sort()}prepareBaseData(){super.prepareBaseData();const systemData=this.system;systemData.category||="simple",systemData.group||=null,systemData.baseItem||=null,systemData.bonusDamage.value||=0,systemData.splashDamage.value||=0,systemData.potencyRune.value||=null,systemData.strikingRune.value||=null,systemData.propertyRune1.value||=null,systemData.propertyRune2.value||=null,systemData.propertyRune3.value||=null,systemData.propertyRune4.value||=null,setHasElement(ATTRIBUTE_ABBREVIATIONS,systemData.attribute)||(systemData.attribute=null);const reloadValue=systemData.reload.value||=null;systemData.reload.label=reloadValue?game.i18n.format("PF2E.Item.Weapon.Reload.LabelN",{value:CONFIG.PF2E.weaponReload[reloadValue]}):null,systemData.selectedAmmoId||=null,systemData.damage.die||=null,systemData.damage.modifier??=0,!systemData.damage.die&&systemData.damage.dice>0&&(systemData.damage.modifier||=systemData.damage.dice),this.isThrown&&!tupleHasValue(["-","0"],this.system.reload.value)&&(this.system.reload.value="-"),systemData.category==="unarmed"&&!systemData.traits.value.includes("unarmed")&&systemData.traits.value.push("unarmed");const traitSet=this.traits,mandatoryRanged=setHasElement(MANDATORY_RANGED_GROUPS,systemData.group)||traitSet.has("thrown");if(mandatoryRanged){this.system.range??=10;const{otherTags}=systemData.traits;this.group==="bow"&&setHasElement(CROSSBOW_WEAPONS,this.baseType)&&!otherTags.includes("crossbow")&&systemData.traits.otherTags.push("crossbow")}this.system.meleeUsage&&(this.system.meleeUsage.traits??=[],this.system.meleeUsage.traitToggles??={modular:null,versatile:null}),systemData.traits.toggles=new WeaponTraitToggles(this);const traitsArray=systemData.traits.value;systemData.category==="unarmed"&&!traitsArray.includes("unarmed")&&systemData.traits.value.push("unarmed"),!mandatoryRanged&&traitsArray.some(t=>/^thrown-\d+$/.test(t))&&(this.system.range=null),systemData.reload.consume=this.isMelee?null:this.reload!==null,systemData.usage.canBeAmmo=this._source.system.usage.canBeAmmo??!1,this.flags.pf2e.comboMeleeUsage??=!1,this.prepareRunes();const baseTraits=this.system.traits.value,{runes}=this.system,hasRunes=runes.potency>0||runes.striking>0||runes.property.length>0,magicTraits=baseTraits.some(t=>setHasElement(MAGIC_TRADITIONS,t))?["evocation"]:hasRunes?["evocation","magical"]:[];this.system.traits.value=uniq([baseTraits,magicTraits].flat()).sort(),this.flags.pf2e.attackItemBonus=this.system.runes.potency||this.system.bonus.value||0}prepareRunes(){AutomaticBonusProgression.cleanupRunes(this);const{potencyRune,strikingRune,propertyRune1,propertyRune2,propertyRune3,propertyRune4}=this.system,strikingRuneDice=new Map([["striking",1],["greaterStriking",2],["majorStriking",3]]),runes=this.system.runes={potency:potencyRune.value??0,striking:strikingRuneDice.get(strikingRune.value)??0,property:prunePropertyRunes([propertyRune1.value,propertyRune2.value,propertyRune3.value,propertyRune4.value],RUNE_DATA.weapon.property),effects:[]},maxPropertySlots=getPropertySlots(this);runes.property.length=Math.min(runes.property.length,maxPropertySlots);const{actor}=this,inherentDiceNumber=this.system.damage.die?this._source.system.damage.dice:0,strikingDice=AutomaticBonusProgression.isEnabled(actor)?AutomaticBonusProgression.getStrikingDice(actor?.level??0):this.system.runes.striking;this.system.damage.dice=inherentDiceNumber===1&&!this.flags.pf2e.battleForm?inherentDiceNumber+strikingDice:this.system.damage.dice}prepareDerivedData(){super.prepareDerivedData(),this.system.usage.canBeAmmo&&!this.isThrowable&&(this.system.usage.canBeAmmo=!1)}prepareSiblingData(){super.prepareSiblingData();const ammoRules=this.ammo?.system.rules.map(r=>({label:this.ammo?.name,...deepClone(r)}))??[];this.system.rules.push(...ammoRules)}async getChatData(htmlOptions={}){const traits=this.traitChatData(CONFIG.PF2E.weaponTraits),chatData=await super.getChatData(),rangeLabel=createActionRangeLabel(this.range),properties=compact([CONFIG.PF2E.weaponCategories[this.category],this.system.reload.label,rangeLabel]);return this.processChatData(htmlOptions,{...chatData,traits,properties})}getMystifiedData(status,{source=!1}={}){const mystifiedData=super.getMystifiedData(status);return source&&(mystifiedData.name=this._source.name),mystifiedData}generateUnidentifiedName({typeOnly=!1}={typeOnly:!1}){const base=this.baseType?CONFIG.PF2E.baseWeaponTypes[this.baseType]:null,group=this.group?CONFIG.PF2E.weaponGroups[this.group]:null,itemType=game.i18n.localize(base??group??"TYPES.Item.weapon");return typeOnly?itemType:game.i18n.format("PF2E.identification.UnidentifiedItem",{item:itemType})}getAltUsages({recurse=!0}={}){const meleeUsage=this.toMeleeUsage();return[this.toThrownUsage()??[],meleeUsage??[],recurse?meleeUsage?.toThrownUsage()??[]:[]].flat()}clone(data,context){const clone=super.clone(data,context);return context?.altUsage&&clone instanceof _WeaponPF2e2&&(clone.altUsageType=context.altUsage),clone}toThrownUsage(){const traits=this._source.system.traits.value,thrownTrait=traits.find(t=>/^thrown-\d{1,3}$/.test(t));if(this.isRanged||!thrownTrait)return null;const range=Number(/(\d{1,3})$/.exec(thrownTrait).at(1)),newTraits=deepClone(traits);newTraits.splice(newTraits.indexOf(thrownTrait),1,"thrown");const overlay={system:{range,traits:{value:newTraits}}};return this.clone(overlay,{keepId:!0,altUsage:"thrown"})}toMeleeUsage(){const{meleeUsage}=this.system;if(!meleeUsage||this.flags.pf2e.comboMeleeUsage)return null;const traitToggles={module:{selection:meleeUsage.traitToggles.modular},versatile:{selection:meleeUsage.traitToggles.versatile}},overlay={system:{damage:{damageType:meleeUsage.damage.type,dice:1,die:meleeUsage.damage.die},group:meleeUsage.group,range:null,reload:{value:null},traits:{value:meleeUsage.traits.concat("combination"),toggles:traitToggles},selectedAmmoId:null},flags:{pf2e:{comboMeleeUsage:!0}}};return this.clone(overlay,{keepId:!0,altUsage:"melee"})}toNPCAttacks({keepId=!1}={}){const{actor}=this;if(!actor.isOfType("npc"))throw ErrorPF2e("Melee items can only be generated for NPCs");const baseDamage=(()=>{const weaponDamage=this.baseDamage,ability=this.range?.increment&&!this.isThrown?"dex":"str",actorLevel=actor.system.details.level.base,dice=this.flags.pf2e.fixedAttack?weaponDamage.dice:[1,2,3,4].reduce((closest,dice2)=>Math.abs(dice2-Math.round((actorLevel+2)/4)){const fromAbility=actor.abilities[ability].mod,totalModifier=this.flags.pf2e.fixedAttack?weaponDamage.modifier:fromAbility+(actor.level>1?dice:0),sign=totalModifier<0?"-":"+";return totalModifier===0?"":[sign,Math.abs(totalModifier)].join("")})();return{damage:weaponDamage.die?`${dice}${weaponDamage.die}${constant}`:dice.toString(),damageType:weaponDamage.damageType,category:null}})(),fromPropertyRunes=this.system.runes.property.flatMap(r=>RUNE_DATA.weapon.property[r].damage?.dice??[]).map(d=>({damage:`${d.diceNumber}${d.dieSize}`,damageType:d.damageType??baseDamage.damageType,category:d.category??null})),reachTraitToNPCReach={tiny:null,sm:"reach-10",med:"reach-10",lg:"reach-15",huge:"reach-20",grg:"reach-25"},toAttackTraits=__name2(traits=>{const{increment:rangeIncrement,max:maxRange}=this.range??{},newTraits=traits.flatMap(t=>t==="reach"?reachTraitToNPCReach[this.size]??[]:t==="thrown"&&setHasElement(THROWN_RANGES,rangeIncrement)?`thrown-${rangeIncrement}`:t).filter(t=>!(t in CONFIG.PF2E.creatureTraits)&&!setHasElement(MAGIC_TRADITIONS,t)&&!setHasElement(MAGIC_SCHOOLS,t)&&!(t.startsWith("thrown")&&!this.isThrown)&&!(["grapple","finesse","shove","trip"].includes(t)&&this.isRanged)&&!(t==="brutal"&&this.isMelee)&&!(t==="combination"&&(this.isMelee||this.isThrown))&&!(t==="critical-fusion"&&this.isThrown)&&!["artifact","cursed"].includes(t));if(rangeIncrement&&!this.isThrown){const prefix=maxRange===rangeIncrement*6?"range-increment":"range";newTraits.push(`${prefix}-${rangeIncrement}`)}const sizeToReach=SIZE_TO_REACH[actor.size];this.isMelee&&sizeToReach!==5&&!newTraits.some(t=>t.startsWith("reach"))&&newTraits.push(`reach-${sizeToReach}`);const reloadTrait=`reload-${this.reload}`;return objectHasKey(CONFIG.PF2E.npcAttackTraits,reloadTrait)&&newTraits.push(reloadTrait),newTraits.sort()},"toAttackTraits"),persistentDamage=(()=>{const{persistent}=this.system.damage;return persistent?{damage:persistent.faces?`${persistent.number}d${persistent.faces}`:persistent.number.toString(),damageType:persistent.type,category:"persistent"}:[]})(),splashDamage=this.system.splashDamage.value?{damage:this.system.splashDamage.value.toString(),damageType:this.system.damage.damageType,category:"splash"}:[],source={_id:keepId?this.id:null,name:this._source.name,type:"melee",system:{weaponType:{value:this.isMelee?"melee":"ranged"},bonus:{value:this.flags.pf2e.fixedAttack||Math.round(1.5*this.actor.level+7)},damageRolls:[baseDamage,splashDamage,fromPropertyRunes,persistentDamage].flat().reduce((rolls,roll)=>mergeObject(rolls,{[randomID()]:roll}),{}),traits:{value:toAttackTraits(this.system.traits.value)},rules:deepClone(this._source.system.rules)},flags:{pf2e:{linkedWeapon:this.id}}},attack=new MeleePF2e(source,{parent:this.actor});return attack.category=this.category,attack.group=this.group,attack.baseType=this.baseType,[attack,...this.getAltUsages({recurse:!1}).flatMap(u=>u.toNPCAttacks())]}async consumeAmmo(){const{ammo}=this;if(ammo?.isOfType("consumable"))return ammo.consume();if(ammo?.isOfType("weapon")){if(!ammo.system.usage.canBeAmmo)throw ErrorPF2e("attempted to consume weapon not usable as ammunition");await ammo.update({"system.quantity":Math.max(ammo.quantity-1,0)})}}_preUpdate(changed,options,user){const traits=changed.system?.traits??{};return"value"in traits&&Array.isArray(traits.value)&&(traits.value=traits.value.filter(t=>t in CONFIG.PF2E.weaponTraits)),changed.system?.group!==void 0&&(changed.system.group||=null),super._preUpdate(changed,options,user)}_onDelete(options,userId){if(super._onDelete(options,userId),game.user.id===userId){const updates=this.actor?.itemTypes.melee.filter(a=>a.flags.pf2e.linkedWeapon===this.id).map(a=>({_id:a.id,"flags.pf2e.-=linkedWeapon":null}))??[];this.actor?.updateEmbeddedDocuments("Item",updates)}}};__name2(_WeaponPF2e,"WeaponPF2e");let WeaponPF2e=_WeaponPF2e;const _ABCItemPF2e=class extends ItemPF2e{static{__name(this,"_ABCItemPF2e")}get rarity(){return this.system.traits.rarity}getLinkedItems(){if(!this.actor||!objectHasKey(this.actor.itemTypes,this.type))return[];const existingABCIds=this.actor.itemTypes[this.type].map(i=>i.id);return this.actor.itemTypes.feat.filter(f=>existingABCIds.includes(f.system.location??""))}async createGrantedItems(options={}){const entries=Object.values(this.system.items);if(!entries.filter(entry=>!!entry.uuid).length)return[];const items=(await UUIDUtils.fromUUIDs(entries.map(e=>e.uuid))).map(i=>i.clone()),level=options.level??this.parent?.level;return items.flatMap(item=>{if(item instanceof FeatPF2e){if(item.category==="classfeature"){const level2=entries.find(e=>item.sourceId===e.uuid)?.level??item.level;item.updateSource({"system.level.value":level2})}return level!==void 0&&levelboost.value.length===1).map(boost=>boost.selected).filter(boost=>!!boost)}get lockedFlaws(){return Object.values(this.system.flaws).map(flaw=>flaw.selected).filter(flaw=>!!flaw)}getLinkedItems(){return this.actor?Array.from(new Set([...super.getLinkedItems(),...this.actor.itemTypes.feat.filter(f=>f.category==="ancestryfeature")])):[]}prepareBaseData(){super.prepareBaseData();for(const boost of Object.values(this.system.boosts))boost.value.length===1&&(boost.selected=boost.value[0]);for(const flaw of Object.values(this.system.flaws))flaw.value.length===1&&(flaw.selected=flaw.value[0])}prepareActorData(){const{actor}=this;if(!actor.isOfType("character")){console.error("PF2e System | Only a character can have an ancestry");return}actor.ancestry=this,actor.system.attributes.ancestryhp=this.hitPoints,this.logAutoChange("system.attributes.ancestryhp",this.hitPoints),actor.system.traits.size.value=this.size,this.logAutoChange("system.traits.size.value",this.size);const reach=SIZE_TO_REACH[this.size];actor.system.attributes.reach={base:reach,manipulate:reach},actor.system.attributes.speed.value=this.speed;const{build}=actor.system;if(this.system.alternateAncestryBoosts)build.attributes.boosts.ancestry.push(...this.system.alternateAncestryBoosts);else for(const target of["boosts","flaws"])for(const ability of Object.values(this.system[target]))ability.selected&&build.attributes[target].ancestry.push(ability.selected);if(this.system.voluntary){const{boost,flaws}=this.system.voluntary;boost&&build.attributes.boosts.ancestry.push(boost),build.attributes.flaws.ancestry.push(...flaws)}const innateLanguages=this.system.languages.value;for(const language of innateLanguages)actor.system.traits.languages.value.includes(language)||actor.system.traits.languages.value.push(language);const{senses:senses2}=actor.system.traits,{vision}=this.system;if(!(vision==="normal"||senses2.some(sense=>sense.type===vision))){senses2.push(new CreatureSensePF2e({type:vision,value:"",source:this.name}));const senseRollOptions=actor.rollOptions.sense??={};senseRollOptions[`self:${sluggify(vision)}:from-ancestry`]=!0}actor.system.traits.value.push(...this.traits);const slug=this.slug??sluggify(this.name);actor.system.details.ancestry={name:this.name,trait:slug,adopted:null,versatile:null,countsAs:[slug]},actor.rollOptions.all[`self:ancestry:${slug}`]=!0;for(const trait of this.traits)actor.rollOptions.all[`self:trait:${trait}`]=!0}getRollOptions(prefix=this.type){return[...super.getRollOptions(prefix),`${prefix}:rarity:${this.rarity}`]}};__name2(_AncestryPF2e,"AncestryPF2e");let AncestryPF2e=_AncestryPF2e;const _BackgroundPF2e=class extends ABCItemPF2e{static{__name(this,"_BackgroundPF2e")}get traits(){return new Set(this.system.traits.value)}prepareSiblingData(){if(Object.keys(this.system.items).length>0)return;const grantedSkillFeat=Object.values(this.flags.pf2e.itemGrants).flatMap(g=>this.actor.items.get(g.id)??[]).find(i=>i.isOfType("feat")&&i.category==="skill");grantedSkillFeat&&(this.system.items.GRANT={uuid:grantedSkillFeat.sourceId??grantedSkillFeat.uuid,img:grantedSkillFeat.img,name:grantedSkillFeat.name,level:1},grantedSkillFeat.system.level.taken=1,grantedSkillFeat.system.location=this.id)}prepareActorData(){if(!this.actor.isOfType("character")){console.error("Only a character can have a background");return}this.actor.background=this;const{build}=this.actor.system,boosts=Object.values(this.system.boosts);for(const boost of boosts)boost.selected&&build.attributes.boosts.background.push(boost.selected);const{trainedSkills}=this.system;if(trainedSkills.value.length===1){const key=trainedSkills.value[0],skill=this.actor.system.skills[key];skill.rank=Math.max(skill.rank,1)}}};__name2(_BackgroundPF2e,"BackgroundPF2e");let BackgroundPF2e=_BackgroundPF2e;const _ClassPF2e=class extends ABCItemPF2e{static{__name(this,"_ClassPF2e")}get attacks(){return this.system.attacks}get defenses(){return this.system.defenses}get classDC(){return this.system.classDC}get hpPerLevel(){return this.system.hp}get perception(){return this.system.perception}get savingThrows(){return this.system.savingThrows}get grantedFeatSlots(){const actorLevel=this.actor?.level??0,system=this.system,ancestryLevels=deepClone(system.ancestryFeatLevels.value);if(game.settings.get("pf2e","ancestryParagonVariant")){ancestryLevels.unshift({id:"ancestry-bonus",level:1,label:"1"});for(let level=3;level<=actorLevel;level+=4){const index=(level+1)/2;ancestryLevels.splice(index,0,level)}}return{ancestry:ancestryLevels,class:[...system.classFeatLevels.value],skill:[...system.skillFeatLevels.value],general:[...system.generalFeatLevels.value]}}getLinkedItems(){const{actor}=this;return actor?Array.from(new Set([...super.getLinkedItems(),...actor.itemTypes.feat.filter(f=>f.category==="classfeature"&&!(f.flags.pf2e.grantedBy&&actor.items.has(f.flags.pf2e.grantedBy.id)))])):[]}async createGrantedItems(options={}){const hasChoiceSet=__name2(f=>f.system.rules.some(re=>re.key==="ChoiceSet"),"hasChoiceSet");return(await super.createGrantedItems(options)).sort((a,b)=>{const[aLevel,bLevel]=[a.system.level.value,b.system.level.value];if(aLevel!==bLevel)return aLevel-bLevel;const[aHasSet,bHasSet]=[hasChoiceSet(a),hasChoiceSet(b)];return aHasSet!==bHasSet?aHasSet?-1:1:a.name.localeCompare(b.name,game.i18n.lang)})}prepareBaseData(){super.prepareBaseData();const{keyAbility}=this.system;keyAbility.selected??=keyAbility.value.length===1?keyAbility.value[0]:null}prepareActorData(){if(!this.actor?.isOfType("character")){console.error("Only a character can have a class");return}this.actor.class=this;const{attributes,build,details,proficiencies,saves,skills}=this.actor.system,slug=this.slug??sluggify(this.name);build.attributes.keyOptions=[...this.system.keyAbility.value],build.attributes.boosts.class=this.system.keyAbility.selected,attributes.classhp=this.hpPerLevel,attributes.perception.rank=Math.max(attributes.perception.rank,this.perception),this.logAutoChange("system.attributes.perception.rank",this.perception),details.keyability.value=(build.attributes.manual?details.keyability.value:build.attributes.boosts.class)??"str";const classDCs=proficiencies.classDCs;classDCs[slug]={label:this.name,rank:this.classDC,ability:details.keyability.value,primary:!0},this.logAutoChange(`system.proficiencies.classDCs.${slug}.rank`,this.classDC);const{attacks,defenses}=proficiencies;for(const category of WEAPON_CATEGORIES)attacks[category].rank=Math.max(attacks[category].rank,this.attacks[category]),this.logAutoChange(`system.proficiencies.attacks.${category}.rank`,this.attacks[category]);const nonBarding=Array.from(ARMOR_CATEGORIES).filter(c=>!["light-barding","heavy-barding"].includes(c));for(const category of nonBarding)defenses[category].rank=Math.max(defenses[category].rank,this.defenses[category]),this.logAutoChange(`system.proficiencies.defenses.${category}.rank`,this.defenses[category]);for(const saveType of SAVE_TYPES)saves[saveType].rank=Math.max(saves[saveType].rank,this.savingThrows[saveType]),this.logAutoChange(`system.saves.${saveType}.rank`,this.savingThrows[saveType]);for(const trainedSkill of this.system.trainedSkills.value)setHasElement(SKILL_ABBREVIATIONS,trainedSkill)&&(skills[trainedSkill].rank=Math.max(skills[trainedSkill].rank,1));details.class={name:this.name,trait:slug},this.actor.rollOptions.all[`class:${slug}`]=!0}};__name2(_ClassPF2e,"ClassPF2e");let ClassPF2e=_ClassPF2e;const _AbilityItemPF2e=class extends ItemPF2e{static{__name(this,"_AbilityItemPF2e")}range=null;get traits(){return new Set(this.system.traits.value)}get actionCost(){const actionType=this.system.actionType.value||"passive";return actionType==="passive"?null:{type:actionType,value:this.system.actions.value}}get frequency(){return this.system.frequency??null}prepareBaseData(){super.prepareBaseData(),this.actor&&this.system.frequency&&(this.system.frequency.value??=this.system.frequency.max),this.system.selfEffect??=null,this.system.actionType.value==="passive"&&(this.system.selfEffect=null)}getRollOptions(prefix=this.type){const options=super.getRollOptions(prefix);return(this.frequency||this.system.deathNote)&&options.push(`${prefix}:frequency:limited`),options}async getChatData(htmlOptions={}){const systemData=this.system,properties=[getActionTypeLabel(this.actionCost?.type,this.actionCost?.value)??[]].flat(),traits=this.traitChatData(CONFIG.PF2E.featTraits);return this.processChatData(htmlOptions,{...systemData,properties,traits})}async _preCreate(data,options,user){return this.parent||this._source.system.frequency&&this.updateSource({"system.frequency.-=value":null}),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){return typeof changed.system?.category=="string"&&(changed.system.category||=null),normalizeActionChangeData(this,changed),super._preUpdate(changed,options,user)}};__name2(_AbilityItemPF2e,"AbilityItemPF2e");let AbilityItemPF2e=_AbilityItemPF2e;const _TrickMagicItemPopup=class{static{__name(this,"_TrickMagicItemPopup")}constructor(item){if(__privateAdd(this,_initialize),__privateAdd(this,_handleTrickItem),__publicField(this,"item"),__publicField(this,"checkDC"),__privateAdd(this,_localize2,localizer("PF2E.TrickMagicItemPopup")),!item.isOfType("consumable"))throw ErrorPF2e("Unexpected item used for Trick Magic Item");if(!item.actor?.isOfType("character"))throw ErrorPF2e(__privateGet(this,_localize2).call(this,"InvalidActor"));this.item=item,this.actor=item.actor,this.checkDC=calculateTrickMagicItemCheckDC(item),__privateMethod(this,_initialize,initialize_fn).call(this)}};_localize2=new WeakMap,_initialize=new WeakSet,initialize_fn=__name2(async function(){const buttons=TRICK_MAGIC_SKILLS.filter(skill=>skill in this.checkDC).map(value=>({value,label:game.i18n.localize(`PF2E.Skill${value.capitalize()}`),modifier:this.actor.skills[value].check.mod})).reduce((accumulated,skill)=>{const button={icon:'',label:`${skill.label} (${skill.modifier<0?"":"+"}${skill.modifier})`,callback:()=>__privateMethod(this,_handleTrickItem,handleTrickItem_fn).call(this,skill.value)};return{...accumulated,[skill.value]:button}},{});new Dialog({title:__privateGet(this,_localize2).call(this,"Title"),content:`

    ${__privateGet(this,_localize2).call(this,"Label")}

    `,buttons},{classes:["dialog","trick-magic-item"],width:"auto"}).render(!0)},"#initialize"),_handleTrickItem=new WeakSet,handleTrickItem_fn=__name2(function(skill){this.actor.skills[skill].check.roll({extraRollOptions:["action:trick-magic-item"],dc:{value:this.checkDC[skill]??0},item:this.item});const trick=new TrickMagicItemEntry(this.actor,skill);this.item.castEmbeddedSpell(trick)},"#handleTrickItem"),__name2(_TrickMagicItemPopup,"TrickMagicItemPopup");let TrickMagicItemPopup=_TrickMagicItemPopup;const _ConsumablePF2e=class extends PhysicalItemPF2e{static{__name(this,"_ConsumablePF2e")}get otherTags(){return new Set(this.system.traits.otherTags)}get category(){return this.system.consumableType.value}get isAmmunition(){return this.category==="ammo"}get uses(){return{value:this.system.charges.value,max:this.system.charges.max}}get autoDestroy(){return this.system.autoDestroy.value}get embeddedSpell(){if(!this.actor)throw ErrorPF2e(`No owning actor found for "${this.name}" (${this.id})`);return this.system.spell?new SpellPF2e(deepClone(this.system.spell),{parent:this.actor,fromConsumable:!0}):null}get formula(){return this.system.consume.value.trim()||null}prepareBaseData(){if(super.prepareBaseData(),!!this.isAmmunition){for(const rule of this.system.rules)if(rule.key==="RollOption"&&"toggleable"in rule&&rule.toggleable){console.warn("Toggleable RollOption rule elements may not be added to ammunition"),this.system.rules=[];break}else if(["GrantItem","ChoiceSet"].includes(String(rule.key))){console.warn(`${rule.key} rule elements may not be added to ammunition`),this.system.rules=[];break}}}prepareRuleElements(){const rules=super.prepareRuleElements();for(const rule of rules)rule.ignored=!0;return rules}async getChatData(htmlOptions={},rollOptions={}){const traits=this.traitChatData(CONFIG.PF2E.consumableTraits),[consumableType,isUsable]=this.isIdentified?[game.i18n.localize(CONFIG.PF2E.consumableTypes[this.category]),!0]:[this.generateUnidentifiedName({typeOnly:!0}),!["other","scroll","talisman","tool","wand"].includes(this.category)],usesLabel=game.i18n.localize("PF2E.ConsumableChargesLabel"),fromFormula=!!rollOptions.fromFormula;return this.processChatData(htmlOptions,{...await super.getChatData(),traits,properties:this.isIdentified&&this.uses.max>1?[`${this.uses.value}/${this.uses.max} ${usesLabel}`]:[],usesCharges:this.uses.max>0,hasCharges:this.uses.max>0&&this.uses.value>0,consumableType,isUsable:fromFormula?!1:isUsable})}generateUnidentifiedName({typeOnly=!1}={typeOnly:!1}){const liquidOrSubstance=__name2(()=>this.traits.has("inhaled")||this.traits.has("contact")?"PF2E.identification.UnidentifiedType.Substance":"PF2E.identification.UnidentifiedType.Liquid","liquidOrSubstance"),itemType=game.i18n.localize(["drug","elixir","mutagen","oil","poison","potion"].includes(this.category)?liquidOrSubstance():["scroll","snare","ammo"].includes(this.category)?CONFIG.PF2E.consumableTypes[this.category]:"PF2E.identification.UnidentifiedType.Object");return typeOnly?itemType:game.i18n.format("PF2E.identification.UnidentifiedItem",{item:itemType})}getRollOptions(prefix=this.type){return[...super.getRollOptions(prefix),...Object.entries({[`category:${this.category}`]:!0}).filter(([,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`)]}isAmmoFor(weapon){if(!this.isAmmunition)return!1;if(!(weapon instanceof WeaponPF2e))return console.warn("Cannot load a consumable into a non-weapon"),!1;const{max}=this.uses;return weapon.system.traits.value.includes("repeating")?max>1:max<=1}async consume(){const{actor}=this;if(!actor)return;const{value,max}=this.uses;if(["scroll","wand"].includes(this.category)&&this.system.spell)if(actor.spellcasting.canCastConsumable(this))this.castEmbeddedSpell();else if(actor.itemTypes.feat.some(feat=>feat.slug==="trick-magic-item"))new TrickMagicItemPopup(this);else{const formatParams={actor:actor.name,spell:this.name},message=game.i18n.format("PF2E.LackCastConsumableCapability",formatParams);ui.notifications.warn(message);return}else{const key=max>1&&value===1?"UseExhausted":max>1?"UseMulti":"UseSingle",content=game.i18n.format(`PF2E.ConsumableMessage.${key}`,{name:this.name,current:value-1}),flags={pf2e:{origin:{sourceId:this.flags.core?.sourceId,uuid:this.uuid,type:this.type}}};if(this.category!=="ammo"){const speaker=ChatMessage.getSpeaker({actor});if(this.formula){const damageType=this.traits.has("vitality")?"vitality":this.traits.has("void")?"void":"untyped";new DamageRoll(`${this.formula}[${damageType}]`).toMessage({speaker,flavor:content,flags})}else ChatMessage.create({speaker,content,flags})}}const quantity=this.quantity;this.autoDestroy&&value<=1?quantity<=1?await this.delete():await this.update({"system.quantity":Math.max(quantity-1,0),"system.charges.value":max}):await this.update({"system.charges.value":Math.max(value-1,0)})}async castEmbeddedSpell(trickMagicItemData){const{actor}=this,spell=this.embeddedSpell;if(!actor||!spell)return;const entry=(()=>trickMagicItemData||actor.spellcasting.filter(e=>e instanceof SpellcastingEntryPF2e&&e.canCast(spell,{origin:this})).reduce((previous,current)=>{const previousDC=previous.statistic.dc.value;return current.statistic.dc.value>previousDC?current:previous}))();if(entry){const systemData=spell.system;entry instanceof SpellcastingEntryPF2e&&(systemData.location.value=entry.id),entry.cast(spell,{consume:!1})}}};__name2(_ConsumablePF2e,"ConsumablePF2e");let ConsumablePF2e=_ConsumablePF2e;const _DeityPF2e=class extends ItemPF2e{static{__name(this,"_DeityPF2e")}get category(){return this.system.category}get alignment(){return this.system.alignment.own}get favoredWeapons(){return[...this.system.weapons]}prepareBaseData(){if(super.prepareBaseData(),this.category==="philosophy"){const systemData=this.system;systemData.domains={primary:[],alternate:[]},systemData.font=[],systemData.spells={},systemData.weapons=[]}}prepareActorData(){if(!this.actor.isOfType("character")){this.delete({render:!1});return}this.actor.deity=this;const{deities}=this.actor.system.details,systemData=this.system;deities.primary={alignment:deepClone(systemData.alignment),skill:deepClone(systemData.skill),weapons:deepClone(systemData.weapons)};for(const domain of this.system.domains.primary){const label=CONFIG.PF2E.deityDomains[domain]?.label;deities.domains[domain]=label??domain;const apocryphaKey=`${domain}-apocryphal`;if(objectHasKey(CONFIG.PF2E.deityDomains,apocryphaKey)){const apocrypha=CONFIG.PF2E.deityDomains[apocryphaKey];deities.domains[apocryphaKey]=apocrypha.label}}const slug=this.slug??sluggify(this.name),prefix="deity:primary",actorRollOptions=this.actor.rollOptions;actorRollOptions.all.deity=!0,actorRollOptions.all[`${prefix}:${slug}`]=!0;for(const baseType of this.favoredWeapons)actorRollOptions.all[`${prefix}:favored-weapon:${baseType}`]=!0;this.alignment&&(actorRollOptions.all[`${prefix}:alignment:${this.alignment.toLowerCase()}`]=!0);const followerAlignments=(this.system.alignment.follower.length>0?this.system.alignment.follower:Array.from(ALIGNMENTS)).map(a=>a.toLowerCase());for(const alignment of followerAlignments)actorRollOptions.all[`${prefix}:alignment:follower:${alignment}`]=!0;actorRollOptions.all[`self:deity:${slug}`]=!0}setFavoredWeaponRank(){if(!this.actor.isOfType("character"))return;const favoredWeaponRank=this.actor.flags.pf2e.favoredWeaponRank;if(favoredWeaponRank>0){const attacks=this.actor.system.proficiencies.attacks;for(const baseType of this.favoredWeapons)attacks[`weapon-base-${baseType}`]={label:CONFIG.PF2E.baseWeaponTypes[baseType],rank:Math.max(Number(attacks[`weapon-base-${baseType}`]?.rank)||0,favoredWeaponRank)}}}getRollOptions(prefix=this.type){return[...super.getRollOptions(prefix),`${prefix}:category:${this.category}`].sort()}};__name2(_DeityPF2e,"DeityPF2e");let DeityPF2e=_DeityPF2e;function featCanHaveKeyOptions(feat){if(feat.category!=="classfeature"||feat.level!==1||feat.traits.size>1)return!1;const{grantedBy}=feat;return!grantedBy||grantedBy.isOfType("feat")&&grantedBy.category==="classfeature"}__name(featCanHaveKeyOptions,"featCanHaveKeyOptions"),__name2(featCanHaveKeyOptions,"featCanHaveKeyOptions");const _FeatPF2e=class extends ItemPF2e{static{__name(this,"_FeatPF2e")}get category(){return this.system.category}get level(){return this.system.level.value}get traits(){return new Set(this.system.traits.value)}get rarity(){return this.system.traits.rarity}get actionCost(){const actionType=this.system.actionType.value||"passive";return actionType==="passive"?null:{type:actionType,value:this.system.actions.value}}get frequency(){return this.system.frequency??null}get isFeature(){return setHasElement(FEATURE_CATEGORIES,this.category)}get isFeat(){return setHasElement(FEAT_CATEGORIES,this.category)}get onlyLevel1(){return this.system.onlyLevel1}get maxTakable(){return this.system.maxTakable}prepareBaseData(){super.prepareBaseData(),this.group=null,this.system.level.taken??=null,this.system.location||=null;const traits=this.system.traits.value;this.category==="general"&&!traits.includes("general")&&traits.push("general"),this.category==="skill"&&(traits.includes("skill")||traits.push("skill"),!traits.includes("general")&&!traits.includes("archetype")&&traits.push("general")),traits.includes("dedication")&&(this.system.category="class",traits.includes("archetype")||traits.push("archetype")),this.system.traits.value.includes("lineage")&&(this.system.onlyLevel1=!0),this.system.maxTakable??=1/0,this.system.onlyLevel1&&(this.system.maxTakable=1),this.actor&&this.system.frequency&&(this.system.frequency.value??=this.system.frequency.max),this.system.subfeatures=mergeObject({keyOptions:[]},this.system.subfeatures??{}),this.system.selfEffect??=null,this.system.actionType.value==="passive"&&(this.system.selfEffect=null)}prepareActorData(){const{actor}=this,prefix=this.isFeature?"feature":"feat",slug=this.slug??sluggify(this.name);actor.rollOptions.all[`${prefix}:${slug}`]=!0;const{subfeatures}=this.system;featCanHaveKeyOptions(this)||(subfeatures.keyOptions=[]),actor.isOfType("character")&&subfeatures.keyOptions.length>0&&(actor.system.build.attributes.keyOptions=uniq([...actor.system.build.attributes.keyOptions,...subfeatures.keyOptions]))}prepareSiblingData(){this.grants=Object.values(this.flags.pf2e.itemGrants).flatMap(grant=>{const item=this.actor?.items.get(grant.id);return item?.isOfType("feat")&&!item.system.location||item?.isOfType("heritage")?[item]:[]});for(const grant of this.grants.filter(g=>g.isOfType("feat")))grant.system.level.taken=this.system.level.taken}async getChatData(htmlOptions={}){const levelLabel=game.i18n.format("PF2E.LevelN",{level:this.level}),actionTypeLabel=getActionTypeLabel(this.actionCost?.type,this.actionCost?.value),properties=actionTypeLabel?[levelLabel,actionTypeLabel]:[levelLabel],traits=this.traitChatData(CONFIG.PF2E.featTraits);return this.processChatData(htmlOptions,{...this.system,properties,traits})}getRollOptions(prefix="feat"){return prefix=prefix==="feat"&&this.isFeature?"feature":prefix,compact([...super.getRollOptions(prefix).filter(o=>!o.endsWith("level:0")),`${prefix}:category:${this.category}`,this.isFeat?`${prefix}:rarity:${this.rarity}`:null,this.frequency?`${prefix}:frequency:limited`:null])}async _preCreate(data,options,user){return this.parent||(this._source.system.location=null,delete this._source.system.level.taken,this._source.system.frequency&&delete this._source.system.frequency.value),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){typeof changed.system?.location=="string"&&(changed.system.location||=null),normalizeActionChangeData(this,changed);const traits=changed.system?.traits?.value;return this.isFeature&&changed.system?(changed.system.onlyLevel1=!1,changed.system.maxTakable=1,this.category!=="ancestry"&&Array.isArray(traits)&&traits.findSplice(t=>t==="lineage")):(Array.isArray(traits)&&traits.includes("lineage")||changed.system?.onlyLevel1)&&mergeObject(changed,{system:{maxTakable:1}}),super._preUpdate(changed,options,user)}_onCreate(data,options,userId){if(super._onCreate(data,options,userId),!(this.isOwner&&this.actor?.isOfType("character")&&this.isFeat))return;const actorItemNames={actor:this.actor.name,item:this.name};if(this.onlyLevel1&&this.actor.level>1){const formatParams={...actorItemNames,actorLevel:this.actor.level},warning=game.i18n.format("PF2E.Item.Feat.Warning.TakenAfterLevel1",formatParams);ui.notifications.warn(warning)}if(this.flags.pf2e.grantedBy)return;const slug=this.slug??sluggify(this.name),timesTaken=this.actor.itemTypes.feat.filter(f=>f.slug===slug).length,{maxTakable}=this;if(maxTakable===1&×Taken>1)ui.notifications.warn(game.i18n.format("PF2E.Item.Feat.Warning.TakenMoreThanOnce",actorItemNames));else if(timesTaken>maxTakable){const formatParams={...actorItemNames,maxTakable,timesTaken};ui.notifications.warn(game.i18n.format("PF2E.Item.Feat.Warning.TakenMoreThanMax",formatParams))}}};__name2(_FeatPF2e,"FeatPF2e");let FeatPF2e=_FeatPF2e;const _HeritagePF2e=class extends ItemPF2e{static{__name(this,"_HeritagePF2e")}get traits(){return new Set(this.system.traits.value)}get rarity(){return this.system.traits.rarity}get isVersatile(){return!this.system.ancestry}prepareActorData(){if(!this.actor.isOfType("character"))throw ErrorPF2e("heritage embedded on non-character");(this.actor.itemTypes.heritage.length===1||!this.grantedBy)&&(this.actor.heritage=this),this.actor.system.traits.value.push(...this.traits);const slug=this.slug??sluggify(this.name);this.actor.system.details.heritage={name:this.name,trait:slug in CONFIG.PF2E.ancestryTraits?slug:null},this.isVersatile&&this.actor.system.details.ancestry?.countsAs.push(slug),this.actor.rollOptions.all[`heritage:${slug}`]=!0,this.actor.rollOptions.all[`self:heritage:${slug}`]=!0}getRollOptions(prefix=this.type){const ancestryOrVersatile=this.system.ancestry?`ancestry:${this.system.ancestry.slug}`:"versatile";return[...super.getRollOptions(prefix),`${prefix}:${ancestryOrVersatile}`]}};__name2(_HeritagePF2e,"HeritagePF2e");let HeritagePF2e=_HeritagePF2e;const KINGDOM_CATEGORY_DATA={"army-tactic":{behavior:"feat",levelLabel:"PF2E.Kingmaker.Feature.Tactic"},"army-war-action":{behavior:"activity"},"kingdom-feat":{behavior:"feat"},"kingdom-feature":{behavior:"feature"},"kingdom-activity":{behavior:"activity"}},KINGMAKER_CATEGORY_TYPES=Object.keys(KINGDOM_CATEGORY_DATA),KINGMAKER_CATEGORIES=mapToObj(KINGMAKER_CATEGORY_TYPES,type=>[type,`PF2E.Kingmaker.Feature.Categories.${type}`]),_CampaignFeaturePF2e=class extends ItemPF2e{static{__name(this,"_CampaignFeaturePF2e")}get category(){return this.system.category}get level(){return this.behavior!=="activity"?this.system.level?.value??0:null}get traits(){return new Set(this.system.traits.value)}get actionCost(){const actionType=this.system.actionType.value||"passive";return actionType==="passive"?null:{type:actionType,value:this.system.actions.value}}get frequency(){return this.system.frequency??null}get isAction(){return this.behavior==="activity"}get isFeature(){return this.behavior==="feature"}get isFeat(){return this.behavior==="feat"}prepareBaseData(){super.prepareBaseData();const categoryData=KINGDOM_CATEGORY_DATA[this.category]??Object.values(KINGDOM_CATEGORY_DATA)[0];this.behavior=categoryData.behavior,this.group=null,this.levelLabel=categoryData.levelLabel??(this.isFeat?"PF2E.Item.Feat.LevelLabel":"PF2E.LevelLabel"),this.actor&&this.system.frequency&&(this.system.frequency.value??=this.system.frequency.max)}prepareActorData(){const prefix=this.isFeature?"feature":this.isFeat?"feat":null;if(prefix){const slug=this.slug??sluggify(this.name);this.actor.rollOptions.all[`${prefix}:${slug}`]=!0}}prepareSiblingData(){const itemGrants=this.flags.pf2e.itemGrants;this.grants=Object.values(itemGrants).flatMap(grant=>{const item=this.actor?.items.get(grant.id);return item?.isOfType("campaignFeature")?[item]:[]})}getRollOptions(prefix=null){return prefix??=this.isFeature?"feature":this.isFeat?"feat":"action",compact([...super.getRollOptions(prefix).filter(o=>!o.endsWith("level:0")),`${prefix}:category:${this.category}`,this.isAction?`action:${this.slug}`:null])}async _preCreate(data,options,user){return this.parent||(this.updateSource({"system.location":null}),this._source.system.frequency&&this.updateSource({"system.frequency.-=value":null})),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){if(typeof changed.system?.location=="string"&&(changed.system.location||=null),normalizeActionChangeData(this,changed),changed.system&&changed.system.category){const system=changed.system,category=tupleHasValue(KINGMAKER_CATEGORY_TYPES,changed.system.category)?changed.system.category:KINGMAKER_CATEGORY_TYPES[0];if(KINGDOM_CATEGORY_DATA[category].behavior==="activity")system["-=level"]=null;else{const level=system.level?.value??this.system.level?.value??0;system.level={value:level}}}await super._preUpdate(changed,options,user)}};__name2(_CampaignFeaturePF2e,"CampaignFeaturePF2e");let CampaignFeaturePF2e=_CampaignFeaturePF2e;const _KitPF2e=class _KitPF2e2 extends ItemPF2e{static{__name(this,"_KitPF2e")}get entries(){return Object.values(this.system.items)}get price(){return{value:new CoinsPF2e(this.system.price.value),per:this.system.price.per??1}}async createGrantedItems(options={}){const size=new ActorSizePF2e({value:options.size??"med",smallIsMedium:!0}).value,entries=options.entries??this.entries,itemUUIDs=entries.map(e=>e.uuid),items=await UUIDUtils.fromUUIDs(itemUUIDs);if(entries.length!==items.length)throw ErrorPF2e(`Some items from ${this.name} were not found`);return items.every(i=>i instanceof ItemPF2e&&!i.parent)?items.reduce(async(promise,item,index)=>{const prepared=await promise,clone=item.clone({_id:randomID(),system:{size}},{keepId:!0}),entry=entries[index];if(clone.isOfType("physical")&&clone.updateSource({"system.quantity":entry.quantity,"system.containerId":options.containerId}),clone.isOfType("backpack")&&entry.items){const contents=await this.createGrantedItems({entries:Object.values(entry.items),containerId:clone.id,size});prepared.push(clone,...contents)}else if(clone instanceof _KitPF2e2){const inflatedKit=await clone.createGrantedItems({containerId:options.containerId,size});prepared.push(...inflatedKit)}else clone instanceof PhysicalItemPF2e&&prepared.push(clone);return prepared},[]):[]}async _preUpdate(changed,options,user){if(!changed.system)return await super._preUpdate(changed,options,user);if(isObject(changed.system.price)){const price=changed.system.price;for(const denomination of DENOMINATIONS)price[denomination]===0&&(price["-=denomination"]=null)}return super._preUpdate(changed,options,user)}};__name2(_KitPF2e,"KitPF2e");let KitPF2e=_KitPF2e;const _LorePF2e=class extends ItemPF2e{static{__name(this,"_LorePF2e")}};__name2(_LorePF2e,"LorePF2e");let LorePF2e=_LorePF2e;const _DicePF2e=class{static{__name(this,"_DicePF2e")}_rolled;terms;static async d20Roll({event,item=null,parts,data,template,title,speaker,flavor,onClose,dialogOptions,rollMode=game.settings.get("core","rollMode"),rollType=""}){const userSettingQuickD20Roll=!game.user.settings.showRollDialogs,_roll=__name2(async(rollParts,adv,$form)=>{let flav=flavor instanceof Function?flavor(rollParts,data):title;adv===1?(rollParts[0]=["2d20kh"],flav=game.i18n.format("PF2E.Roll.FortuneTitle",{title})):adv===-1&&(rollParts[0]=["2d20kl"],flav=game.i18n.format("PF2E.Roll.MisfortuneTitle",{title})),$form&&(data.itemBonus=$form.find("[name=itemBonus]").val()),(!data.itemBonus||data.itemBonus===0)&&rollParts.indexOf("@itemBonus")!==-1&&rollParts.splice(rollParts.indexOf("@itemBonus"),1),$form&&(data.statusBonus=$form.find("[name=statusBonus]").val()),(!data.statusBonus||data.statusBonus===0)&&rollParts.indexOf("@statusBonus")!==-1&&rollParts.splice(rollParts.indexOf("@statusBonus"),1),$form&&(data.circumstanceBonus=$form.find("[name=circumstanceBonus]").val()),(!data.circumstanceBonus||data.circumstanceBonus===0)&&rollParts.indexOf("@circumstanceBonus")!==-1&&rollParts.splice(rollParts.indexOf("@circumstanceBonus"),1);const roll=await new Roll(rollParts.join("+"),data).roll({async:!0}),origin=item?{uuid:item.uuid,type:item.type}:null;return roll.toMessage({speaker,flavor:flav,flags:{pf2e:{context:{type:rollType},origin}}},{rollMode:$form?$form.find("[name=rollMode]").val():rollMode}),roll},"_roll");if(parts.unshift("1d20"),userSettingQuickD20Roll&&!event.altKey&&!(event.ctrlKey||event.metaKey)&&!event.shiftKey||!userSettingQuickD20Roll&&event.shiftKey)return _roll(parts,0);if(event.ctrlKey||event.metaKey)return rollMode="blindroll",_roll(parts,0);if(event.shiftKey||!userSettingQuickD20Roll){parts.indexOf("@circumstanceBonus")===-1&&(parts=parts.concat(["@circumstanceBonus"])),parts.indexOf("@itemBonus")===-1&&(parts=parts.concat(["@itemBonus"])),parts.indexOf("@statusBonus")===-1&&(parts=parts.concat(["@statusBonus"])),template=template||"systems/pf2e/templates/chat/roll-dialog.hbs";const dialogData={data,rollMode,formula:parts.join(" + "),rollModes:CONFIG.Dice.rollModes},content=await renderTemplate(template,dialogData);let roll;return new Promise(resolve=>{new Dialog({title,content,buttons:{advantage:{label:game.i18n.localize("PF2E.Roll.Fortune"),callback:async html=>{roll=await _roll(parts,1,html)}},normal:{label:game.i18n.localize("PF2E.Roll.Normal"),callback:async html=>{roll=await _roll(parts,0,html)}},disadvantage:{label:game.i18n.localize("PF2E.Roll.Misfortune"),callback:async html=>{roll=await _roll(parts,-1,html)}}},default:game.i18n.localize("PF2E.Roll.Normal"),close:html=>{onClose&&onClose(html,parts,data),resolve(roll)}},dialogOptions).render(!0)})}else return _roll(parts,0)}alter(add2,multiply){const rgx=new RegExp(DiceTerm.REGEXP,"g");if(this._rolled)throw ErrorPF2e("You may not alter a Roll which has already been rolled");return this.terms=this.terms?.map(t=>t.replace(rgx,(_match,nd,d,mods)=>(nd=nd*(multiply||1)+(add2||0),mods=mods||"",`${nd}d${d}${mods}`))),this}};__name2(_DicePF2e,"DicePF2e");let DicePF2e=_DicePF2e;function simplifyFormula(formula){if(formula==="0")return formula;const fixedFormula=formula.replace(/^\s*-\s+/,"-").replace(/\s*\+\s*-\s*/g," - "),roll=new Roll(fixedFormula);if(!roll.terms.every(t=>[" - "," + "].includes(t.expression)||t instanceof Die||t instanceof NumericTerm))return fixedFormula;const terms=parseTermsFromSimpleFormula(roll);return createSimpleFormula(terms)}__name(simplifyFormula,"simplifyFormula"),__name2(simplifyFormula,"simplifyFormula");const _MeleePF2e=class extends ItemPF2e{static{__name(this,"_MeleePF2e")}get traits(){return new Set(this.system.traits.value)}get isMelee(){return this.system.weaponType.value==="melee"}get isRanged(){return this.system.weaponType.value==="ranged"}get isThrown(){return this.isRanged&&this.system.traits.value.some(t=>t.startsWith("thrown"))}get defaultAttribute(){const{traits}=this;return this.isMelee?traits.has("finesse")?"dex":"str":traits.has("brutal")?"str":"dex"}get attackModifier(){return Number(this.system.bonus.value)||0}get reach(){if(this.isRanged)return null;const reachTrait=this.system.traits.value.find(t=>/^reach-\d+$/.test(t));return reachTrait?Number(reachTrait.replace("reach-","")):SIZE_TO_REACH[this.actor?.size??"med"]}get range(){if(this.isMelee)return null;const specifiedMaxRange=(()=>{const rangeTrait=this.system.traits.value.find(t=>/^range-\d+$/.test(t)),range=Number(rangeTrait?.replace(/\D/g,"")||"NaN");return Number.isInteger(range)?range:null})(),rangeIncrement=(()=>{if(specifiedMaxRange)return null;const incrementTrait=this.system.traits.value.find(t=>/^(?:range-increment|thrown)-\d+$/.test(t));return Number(incrementTrait?.replace(/\D/g,""))||10})();return specifiedMaxRange?{increment:null,max:specifiedMaxRange}:rangeIncrement?{increment:rangeIncrement,max:rangeIncrement*6}:null}get baseDamage(){const instance=Object.values(this.system.damageRolls).shift();return instance?WeaponDamagePF2e.npcDamageToWeaponDamage(instance):{dice:0,die:null,modifier:0,damageType:"untyped",persistent:null,category:null}}get dealsDamage(){const{baseDamage}=this;return baseDamage.dice>0||baseDamage.modifier>0||!!baseDamage.persistent?.number||Object.values(this.system.damageRolls).some(d=>d.category==="splash")}get attackEffects(){return this.system.attackEffects.value}get isMagical(){const{traits}=this;return["magical","arcane","primal","divine","occult"].some(t=>traits.has(t))}get linkedWeapon(){const item=this.actor?.items.get(this.flags.pf2e.linkedWeapon??"");return item?.isOfType("weapon")?item:null}_initialize(options){this.category=this.group=this.baseType=null,super._initialize(options)}prepareBaseData(){super.prepareBaseData(),this.system.material={type:null,grade:null};for(const attackDamage of Object.values(this.system.damageRolls))attackDamage.category||=null,attackDamage.damageType==="bleed"&&(attackDamage.category="persistent")}prepareSiblingData(){const{linkedWeapon}=this,isUnarmed=this.traits.has("unarmed");this.category=isUnarmed?"unarmed":linkedWeapon?.category??null,this.group=isUnarmed?"brawling":this.linkedWeapon?.group??null,this.baseType=tupleHasValue(["claw","fist","jaws"],this.slug)?this.slug:this.linkedWeapon?.baseType??null}prepareActorData(){if(!this.actor?.isOfType("npc"))return;const damageInstances=Object.values(this.system.damageRolls);for(const instance of Object.values(this.system.damageRolls)){try{instance.damage=new Roll(instance.damage)._formula}catch{const message=`Unable to parse damage formula on NPC attack ${this.name}`;console.warn(`PF2e System | ${message}`),instance.damage="1d4"}const{isElite,isWeak}=this.actor;if((isElite||isWeak)&&damageInstances.indexOf(instance)===0){const adjustment=isElite?2:-2;instance.damage=simplifyFormula(`${instance.damage} + ${adjustment}`)}else instance.damage=new Roll(instance.damage)._formula}}getRollOptions(prefix=this.type){const baseOptions=super.getRollOptions(prefix),{damageType}=this.baseDamage,damageCategory=DamageCategorization.fromDamageType(damageType),rangeIncrement=this.range?.increment,otherOptions=Object.entries({equipped:!0,melee:this.isMelee,ranged:this.isRanged,thrown:this.isThrown,[`category:${this.category}`]:!!this.category,[`group:${this.group}`]:!!this.group,[`base:${this.baseType}`]:!!this.baseType,[`range-increment:${rangeIncrement}`]:!!rangeIncrement,[`damage:type:${damageType}`]:!0,[`damage:category:${damageCategory}`]:!!damageCategory}).filter(([,isTrue])=>isTrue).map(([key])=>`${prefix}:${key}`);return[baseOptions,otherOptions].flat().sort()}async toMessage(_event,{create=!0}={}){if(!create)return;const strike=this.actor?.system.actions?.find(s=>s.item===this);return strike?game.pf2e.rollActionMacro({itemId:this.id,slug:strike.slug}):void 0}};__name2(_MeleePF2e,"MeleePF2e");let MeleePF2e=_MeleePF2e;const _SpellOverlayCollection=class extends Collection{static{__name(this,"_SpellOverlayCollection")}constructor(spell,entries){super(Object.entries(entries??{})),this.spell=spell}get overrideVariants(){return[...this.entries()].reduce((result,[overlayId,data])=>{if(data.overlayType==="override"){const spell=this.spell.loadVariant({overlayIds:[overlayId]});if(spell)return[...result,spell]}return result},[])}getType(overlayId){return this.get(overlayId,{strict:!0}).overlayType}async create(overlayType,options={renderSheet:!1}){const id=randomID();switch(overlayType){case"override":if(await this.spell.update({[`system.overlays.${id}`]:{_id:id,sort:this.overrideVariants.length+1,overlayType:"override"}}),options.renderSheet){const variantSpell=this.spell.loadVariant({overlayIds:[id]});variantSpell&&variantSpell.sheet.render(!0)}break}}async updateOverride(variantSpell,data,options){variantSpell.updateSource(data,options);const variantSource=variantSpell.toObject(),originSource=this.spell.toObject(),difference2=diffObject(originSource,variantSource);return Object.keys(difference2).length===0||(delete difference2.system?.description,difference2.overlayType="override",await this.spell.update({[`system.overlays.-=${variantSpell.id}`]:null},{render:!1}),await this.spell.update({[`system.overlays.${variantSpell.id}`]:difference2}),variantSpell.sheet.rendered&&variantSpell.sheet.render(!0)),variantSpell}async deleteOverlay(overlayId){this.verifyOverlayId(overlayId),await this.spell.update({[`system.overlays.-=${overlayId}`]:null}),this.delete(overlayId)}verifyOverlayId(overlayId){if(!this.has(overlayId))throw ErrorPF2e(`Spell ${this.spell.name} (${this.spell.uuid}) does not have an overlay with id: ${overlayId}`)}};__name2(_SpellOverlayCollection,"SpellOverlayCollection");let SpellOverlayCollection=_SpellOverlayCollection;const _SpellPF2e=class _SpellPF2e2 extends ItemPF2e{static{__name(this,"_SpellPF2e")}isFromConsumable;trickMagicEntry=null;constructor(data,context={}){super(data,context),this.isFromConsumable=!!context.fromConsumable}get baseRank(){return this.system.level.value}get baseLevel(){return this.baseRank}get rank(){if(!this.actor)return this.baseRank;const isAutoHeightened=this.isCantrip||this.isFocusSpell,fixedHeightenedRank=this.system.location.autoHeightenLevel||this.spellcasting?.system?.autoHeightenLevel.value||null;return(isAutoHeightened?fixedHeightenedRank||Math.ceil(this.actor.level/2)||null:this.system.location.heightenedLevel||null)||this.baseRank}get level(){return this.rank}get traits(){return new Set(this.system.traits.value)}get rarity(){return this.system.traits.rarity}get castingTraits(){const{components}=this;return[getActionIcon(this.system.time.value,null)===null?"exploration":[],components.verbal?"concentrate":[],["focus","material","somatic"].some(c=>components[c])?"manipulate":[]].flat()}get school(){return this.system.traits.value.find(t=>setHasElement(MAGIC_SCHOOLS,t))??null}get traditions(){return this.spellcasting?.tradition?new Set([this.spellcasting.tradition]):new Set(this.system.traditions.value)}get spellcasting(){const spellcastingId=this.system.location.value;return this.trickMagicEntry?this.trickMagicEntry:this.actor?.spellcasting.find(e=>e.id===spellcastingId)??null}get isAttack(){return this.traits.has("attack")||this.system.spellType.value==="attack"}get isCantrip(){return this.traits.has("cantrip")&&!this.isRitual}get isFocusSpell(){return this.system.category.value==="focus"}get isRitual(){return this.system.category.value==="ritual"}get attribute(){return this.spellcasting?.attribute??"cha"}get ability(){return foundry.utils.logCompatibilityWarning("`SpellPF2e#ability` is deprecated. Use `SpellPF2e#attribute` instead.",{since:"5.3.0",until:"6.0.0"}),this.attribute}get components(){const components=this.system.components,results=[];return components.focus&&results.push(game.i18n.localize("PF2E.SpellComponentShortF")),components.material&&results.push(game.i18n.localize("PF2E.SpellComponentShortM")),components.somatic&&results.push(game.i18n.localize("PF2E.SpellComponentShortS")),components.verbal&&results.push(game.i18n.localize("PF2E.SpellComponentShortV")),{...components,value:results.join("")}}get unlimited(){return this.isCantrip}get isVariant(){return!!this.original}get hasVariants(){return this.overlays.size>0}get range(){return null}get uuid(){return this.isVariant?this.original.uuid:super.uuid}computeCastRank(slotRank){return(this.isCantrip||this.isFocusSpell)&&this.actor?this.rank:Math.max(this.baseRank,slotRank??this.rank)}getRollData(rollOptions={}){const spellLevel=Number(rollOptions?.castLevel)||null,castLevel=Math.max(this.baseRank,spellLevel||this.rank);if(spellLevel&&castLevel!==this.rank)return this.clone({"system.location.heightenedLevel":castLevel}).getRollData();const rollData=super.getRollData();return this.actor?.isOfType("character","npc")&&(rollData.mod=this.actor.abilities[this.attribute].mod),rollData.castLevel=castLevel,rollData.heighten=Math.max(0,castLevel-this.baseRank),rollData}async getDamage(damageOptions={skipDialog:!0}){if(!Object.keys(this.system.damage.value).length||!this.actor)return null;const castLevel=this.rank,rollData=this.getRollData({castLevel}),base=[];for(const[id,damage]of Object.entries(this.system.damage.value??{})){if(!DamageRoll.validate(damage.value))return console.error(`Failed to parse damage formula "${damage.value}"`),null;const terms=parseTermsFromSimpleFormula(damage.value,{rollData}),heightening=this.system.heightening;if(heightening?.type==="interval"&&heightening.interval){const scalingFormula=heightening.damage[id],partCount=Math.floor((castLevel-this.baseRank)/heightening.interval);if(scalingFormula&&partCount>0){const scalingTerms=parseTermsFromSimpleFormula(scalingFormula,{rollData});for(let i=0;i0&&!base.length&&this.actor.isOfType("npc")&&this.actor.attributes.adjustment){const value=this.unlimited?2:4;terms.push({dice:null,modifier:this.actor.isElite?value:-value})}const damageType=damage.type.value,category=damage.type.subtype||null,materials=damage.type.categories;base.push({terms:combinePartialTerms(terms),damageType,category,materials})}if(!base.length)return null;const{actor,attribute}=this,checkStatistic=this.spellcasting?.statistic,domains=compact(["damage","spell-damage",`${this.id}-damage`,this.traits.has("attack")?["attack-damage","attack-spell-damage"]:null,checkStatistic?.base?`${checkStatistic?.base.slug}-damage`:null]).flat(),options=new Set([...actor?.getRollOptions(domains)??[],...damageOptions.target?.getSelfRollOptions("target")??[],...this.getRollOptions("item"),...this.traits]),context={type:"damage-roll",sourceType:this.isAttack?"attack":"save",outcome:this.isAttack?"success":null,domains,options,self:{actor:this.actor,item:this,statistic:null,token:this.actor.token,modifiers:[]},rollMode:damageOptions.rollMode},modifiers=[],damageDice=[];if(actor.system.abilities){const attributes=actor.system.abilities,attributeModifiers=Object.entries(this.system.damage.value).filter(([,d])=>d.applyMod).map(([k,d])=>new ModifierPF2e({label:CONFIG.PF2E.abilities[attribute],slug:`ability-${k}`,type:"untyped",modifier:attributes[attribute].mod,damageType:d.type.value,damageCategory:d.type.subtype||null,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,`ability-${k}`)})),extractOptions={resolvables:{spell:this,target:damageOptions.target??null},test:options},extracted=processDamageCategoryStacking(base,{modifiers:[attributeModifiers,extractModifiers(actor.synthetics,domains,extractOptions)].flat(),dice:extractDamageDice(actor.synthetics.damageDice,domains,extractOptions),test:options});modifiers.push(...extracted.modifiers),damageDice.push(...extracted.dice)}const formulaData={base,modifiers,dice:damageDice,ignoredResistances:[]};applyDamageDiceOverrides(base,damageDice);const{formula,breakdown}=createDamageFormula(formulaData),roll=new DamageRoll(formula);return{template:{name:this.name,damage:{roll,breakdown},materials:roll.materials,traits:this.castingTraits,modifiers},context}}loadVariant(options={}){if(this.original)return this.original.loadVariant(options);const{castLevel,overlayIds}=options,appliedOverlays=new Map,heightenEntries=this.getHeightenLayers(castLevel),overlays=overlayIds?.map(id=>({id,data:this.overlays.get(id,{strict:!0})}))??[],overrides=(()=>{if(!heightenEntries.length&&!overlays.length)return castLevel!==this.rank?mergeObject(this.toObject(),{system:{location:{heightenedLevel:castLevel}}}):null;let source=this.toObject();if(overlays.map(overlay=>overlay.data.overlayType).filter(type=>type==="override").length>1)throw ErrorPF2e(`Error loading variant of Spell ${this.name} (${this.uuid}). Cannot apply multiple override overlays.`);for(const{id,data}of overlays){switch(data.overlayType){case"override":{delete source.system.overlays,source.system.rules=[],source=mergeObject(source,data,{overwrite:!0});break}}appliedOverlays.set(data.overlayType,id)}for(const overlay of heightenEntries)mergeObject(source.system,overlay.system);const currentRank=source.system.location.heightenedLevel??source.system.level.value;return castLevel&&castLevel!==currentRank&&(source.system.location.heightenedLevel=castLevel),source})();if(!overrides)return null;const fromConsumable=this.isFromConsumable,variant=new _SpellPF2e2(overrides,{parent:this.actor,fromConsumable});return variant.original=this,variant.appliedOverlays=appliedOverlays,variant.trickMagicEntry=this.trickMagicEntry,variant.system.traits.value=Array.from(new Set([...variant.traits,...variant.traditions])),variant}getHeightenLayers(rank){const heightening=this.system.heightening;return heightening?.type!=="fixed"?[]:Object.entries(heightening.levels).map(([rank2,system])=>({level:Number(rank2),system})).filter(system=>!rank||rank>=system.level).sort((first,second)=>first.level-second.level)}createTemplate(message){const templateConversion={burst:"circle",cone:"cone",cube:"rect",emanation:"circle",line:"ray",rect:"rect",square:"rect"},{area}=this.system;if(!area)throw ErrorPF2e("Attempted to create template with non-area spell");const areaType=templateConversion[area.type],templateData={t:areaType,distance:Number(area.value)/5*(canvas.dimensions?.distance??0),fillColor:game.user.color,flags:{pf2e:{messageId:message?.id,origin:{name:this.name,slug:this.slug,traits:deepClone(this.system.traits.value),...this.getOriginData()}}}};switch(areaType){case"ray":templateData.width=CONFIG.MeasuredTemplate.defaults.width*(canvas.dimensions?.distance??1);break;case"cone":templateData.angle=CONFIG.MeasuredTemplate.defaults.angle;break;case"rect":{const distance=templateData.distance??0;templateData.distance=Math.hypot(distance,distance),templateData.width=distance,templateData.direction=45;break}}const templateDoc=new MeasuredTemplateDocumentPF2e(templateData,{parent:canvas.scene});return new MeasuredTemplatePF2e(templateDoc)}placeTemplate(message){this.createTemplate(message).drawPreview()}prepareBaseData(){super.prepareBaseData(),this.system.location.value||=null,this.isEmbedded||this.system.traits.value.push(...this.system.traditions.value),this.system.level.value=Math.clamped(this.system.level.value,1,10)||1,this.system.area?.value?(this.system.area.value=Number(this.system.area.value)||5,this.system.area.type||="burst"):this.system.area=null,this.isRitual&&(this.system.location.value="rituals");for(const formula of Object.values(this.system.damage.value))formula.value=formula.value?.trim()||"0";if(this.system.heightening?.type==="fixed")for(const heighten of Object.values(this.system.heightening.levels))for(const formula of Object.values(heighten.damage?.value??{}))formula.value=formula.value?.trim()||"0";else if(this.system.heightening?.type==="interval")for(const key of Object.keys(this.system.heightening.damage))this.system.heightening.damage[key]=this.system.heightening.damage[key]?.trim()||"0";this.overlays=new SpellOverlayCollection(this,this.system.overlays)}prepareSiblingData(){this.system.traits.value.push(...this.traditions),this.spellcasting?.isInnate&&mergeObject(this.system.location,{uses:{value:1,max:1}},{overwrite:!1})}getRollOptions(prefix=this.type){const options=new Set(["magical",`${prefix}:rank:${this.rank}`]);!!(this.spellcasting?.isPrepared||this.spellcasting?.isSpontaneous)&&!this.isCantrip&&!this.isFromConsumable&&options.add(`${prefix}:spell-slot`),this.system.duration.value||options.add(`${prefix}:duration:0`),this.unlimited||options.add(`${prefix}:frequency:limited`);const damageValues=Object.values(this.system.damage.value);for(const damage of damageValues){damage.type&&(options.add(`${prefix}:damage:${damage.type.value}`),options.add(`${prefix}:damage:type:${damage.type.value}`));const category=DamageCategorization.fromDamageType(damage.type.value);category&&options.add(`${prefix}:damage:category:${category}`),damage.type.subtype==="persistent"&&options.add(`${prefix}:damage:persistent:${damage.type.value}`)}const isAreaEffect=!!this.system.area?.value;isAreaEffect&&options.add("area-effect"),damageValues.length>0&&this.system.spellType.value!=="heal"&&(options.add("damaging-effect"),isAreaEffect&&options.add("area-damage"));for(const trait of this.traits)options.add(trait);const spellcastingOptions=this.spellcasting?.getRollOptions?.("spellcasting")??[];for(const option of spellcastingOptions)options.add(option);return super.getRollOptions(prefix).concat([...options])}async toMessage(event,{create=!0,data,rollMode}={}){const domData=htmlClosest(event?.currentTarget,".item")?.dataset,castData=mergeObject(data??{},domData??{}),castLevel=Number(castData.castLevel??"");if(castLevel&&castLevel!==this.rank)return this.loadVariant({castLevel})?.toMessage(event,{create,data,rollMode});const message=await super.toMessage(event,{create:!1,data:castData,rollMode});if(!message)return;const messageSource=message.toObject(),flags=messageSource.flags.pf2e,entry=this.spellcasting;if(entry?.statistic){const tradition=Array.from(this.traditions).at(0);if(flags.casting={id:entry.id,tradition:entry.tradition??tradition??"arcane"},this.system.spellType.value==="save"||this.system.save.value!==""){const dc=entry.statistic.withRollOptions({item:this}).dc;flags.context={type:"spell-cast",domains:dc.domains,options:[...dc.options],rollMode}}}return flags.isFromConsumable=this.isFromConsumable,create?ChatMessagePF2e.create(messageSource,{renderSheet:!1}):(message.updateSource(messageSource),message)}async getChatData(htmlOptions={},rollOptions={}){if(!this.actor)throw ErrorPF2e(`Cannot retrieve chat data for unowned spell ${this.name}`);const slotRank=Number(rollOptions.slotLevel)||this.rank,castLevel=Number(rollOptions.castLevel)||this.computeCastRank(slotRank);if(!this.isVariant){const variant=this.loadVariant({castLevel});if(variant)return variant.getChatData(htmlOptions,rollOptions)}const variants=this.overlays.overrideVariants.map(variant=>({actions:getActionIcon(variant.system.time.value,null),name:variant.name,overlayIds:[...variant.appliedOverlays.values()],sort:variant.sort})).sort((a,b)=>a.sort-b.sort),rollData=htmlOptions.rollData??this.getRollData({castLevel});rollData.item??=this;const localize=game.i18n.localize.bind(game.i18n),systemData=this.system,options={...htmlOptions,rollData},description=await TextEditor.enrichHTML(this.description,{...options,async:!0}),spellcasting=this.spellcasting;if(!spellcasting)return console.warn(`PF2e System | Orphaned spell ${this.name} (${this.id}) on actor ${this.actor.name} (${this.actor.id})`),{...systemData};const statistic=spellcasting?.statistic;if(!statistic&&!this.isRitual)return console.warn(`PF2e System | Spell ${this.name} is missing a statistic to cast with (${this.id}) on actor ${this.actor.name} (${this.actor.id})`),{...systemData};const statisticChatData=statistic?.getChatData({item:this}),spellDC=statisticChatData?.dc.value,isSave=systemData.spellType.value==="save"||!!systemData.save.value,damage=await this.getDamage(),hasDamage=!!damage,saveType=systemData.save.value?game.i18n.localize(CONFIG.PF2E.saves[systemData.save.value]):null,saveKey=systemData.save.basic?"PF2E.SaveDCLabelBasic":"PF2E.SaveDCLabel",saveLabel=(()=>{if(!(spellDC&&saveType))return null;const localized=game.i18n.format(saveKey,{dc:spellDC,type:saveType}),tempElement=createHTMLElement("div",{innerHTML:localized}),visibility=game.settings.get("pf2e","metagame_showDC")?"all":"owner";return TextEditorPF2e.convertXMLNode(tempElement,"dc",{visibility,whose:null}),tempElement.innerHTML})(),isHeal=systemData.spellType.value==="heal",damageLabel=localize(isHeal?"PF2E.SpellTypeHeal":"PF2E.DamageLabel"),[areaSize,areaType,areaUnit]=systemData.area?[Number(systemData.area.value),game.i18n.localize(CONFIG.PF2E.areaTypes[systemData.area.type]),game.i18n.localize("PF2E.Foot")]:[null,null,null],area=areaSize&&areaType&&areaUnit?game.i18n.format("PF2E.SpellArea",{areaSize,areaUnit,areaType}).trim():null,{baseRank}=this,heightened=castLevel-baseRank,rankLabel=(()=>{const type=this.isCantrip?localize("PF2E.TraitCantrip"):localize(CONFIG.PF2E.spellCategories[this.system.category.value]);return game.i18n.format("PF2E.ItemLevel",{type,level:castLevel})})(),properties=[heightened?game.i18n.format("PF2E.SpellLevelBase",{level:ordinal(baseRank)}):null,heightened?game.i18n.format("PF2E.SpellLevelHeightened",{heightened}):null,this.isRitual?null:`${localize("PF2E.SpellComponentsLabel")}: ${this.components.value}`,systemData.range.value?`${localize("PF2E.SpellRangeLabel")}: ${systemData.range.value}`:null,systemData.target.value?`${localize("PF2E.SpellTargetLabel")}: ${systemData.target.value}`:null,area,systemData.time.value?`${localize("PF2E.SpellTimeLabel")}: ${systemData.time.value}`:null,systemData.duration.value?`${localize("PF2E.SpellDurationLabel")}: ${systemData.duration.value}`:null].filter(p=>p!==null),spellTraits2=this.traitChatData(CONFIG.PF2E.spellTraits),original=this.original??this,item=this.isFromConsumable?JSON.stringify(original.toObject(!1)):void 0;return{...systemData,description:{value:description},isAttack:this.isAttack,isSave,check:this.isAttack&&statisticChatData?statisticChatData.check:void 0,save:{...statisticChatData?.dc??{},type:systemData.save.value,label:saveLabel},hasDamage,castLevel,rankLabel,damageLabel,formula:damage?.template.damage.roll.formula,properties,spellTraits:spellTraits2,traits:spellTraits2,actionTraits:this.castingTraits.map(t=>traitSlugToObject(t,CONFIG.PF2E.actionTraits)),areaSize,areaType,areaUnit,item,variants}}async rollAttack(event,attackNumber=1,context={}){const statistic=this.spellcasting?.statistic;if(statistic)await statistic.check.roll({...eventToRollParams(event),...context,item:this,attackNumber});else throw ErrorPF2e("Spell points to location that is not a spellcasting type")}async rollDamage(event,mapIncreases){const element=htmlClosest(event.currentTarget,"*[data-cast-level]"),castLevel=Number(element?.dataset.castLevel)||this.rank;if(!this.isVariant){const variant=this.loadVariant({castLevel});if(variant)return variant.rollDamage(event)}const targetToken=Array.from(game.user.targets).find(t=>t.actor?.isOfType("creature","hazard","vehicle"))??null,spellDamage=await this.getDamage({target:targetToken?.actor,...eventToRollParams(event)});if(!spellDamage)return null;const{template,context}=spellDamage;return typeof mapIncreases=="number"&&(context.mapIncreases=mapIncreases,context.options.add(`map:increases:${mapIncreases}`)),DamagePF2e.roll(template,context)}async rollCounteract(event){if(event=event instanceof Event?event:event?.originalEvent,!this.actor?.isOfType("character","npc"))return null;if(!this.spellcasting?.statistic?.attribute)return console.warn(ErrorPF2e(`Spell ${this.name} (${this.uuid}) is missing a statistic with which to counteract.`).message),null;const localize=localizer("PF2E.Item.Spell.Counteract"),statistic=new Statistic(this.actor,{slug:"counteract",label:localize("Label"),attribute:this.spellcasting.attribute,rank:this.spellcasting.statistic.rank??0}),domain="counteract-check",notes=[new RollNotePF2e({selector:domain,text:localize("Hint")}),...DEGREE_OF_SUCCESS_STRINGS.map(degreeString=>{const counteractRank={criticalFailure:0,failure:this.rank,success:this.rank+1,criticalSuccess:this.rank+3}[degreeString];return new RollNotePF2e({selector:domain,title:`PF2E.Check.Result.Degree.Check.${degreeString}`,text:localize(degreeString,{rank:counteractRank}),outcome:[degreeString]})})],traits=this.system.traits.value,{check}=statistic.extend({domains:[domain],rollOptions:traits});return check.roll({...eventToRollParams(event),label:game.i18n.localize("PF2E.Check.Specific.Counteract"),extraRollNotes:notes,traits})}getOriginData(){const flag=super.getOriginData();return flag.castLevel=this.rank,this.isVariant&&this.appliedOverlays&&(flag.variant={overlays:[...this.appliedOverlays.values()]}),flag}async update(data,options={}){return this.original&&this.appliedOverlays.has("override")&&this.sheet.rendered?this.original.overlays.updateOverride(this,data,options):super.update(data,options)}async _preCreate(data,options,user){return this._source.system.location.value||=null,this._source.system.category.value==="ritual"&&(this._source.system.location.value=null),super._preCreate(data,options,user)}async _preUpdate(changed,options,user){const result=await super._preUpdate(changed,options,user);if(result===!1)return result;const diff=options.diff??=!0;if(changed.system?.level){const{level}=changed.system;level.value=Math.clamped(Math.trunc(Number(level.value)||1),1,10)}const uses=changed.system?.location?.uses;if(uses){const currentUses=uses.value??this.system.location.uses?.value??1,currentMax=uses.max??this.system.location.uses?.max;uses.value=Math.clamped(Number(currentUses),0,Number(currentMax))}const newLocation=changed.system?.location?.value,locationChanged=typeof newLocation=="string"&&newLocation!==this.system.location.value;if(diff&&(!this.actor||locationChanged)){const system=changed.system??={},locationUpdates=system.location=this.actor?system.location??{}:{value:""},keys2=Object.keys(this.system.location).filter(k=>k!=="value"&&!(k in locationUpdates));for(const key of keys2)locationUpdates[`-=${key}`]=null}}};__name2(_SpellPF2e,"SpellPF2e");let SpellPF2e=_SpellPF2e;const _RitualSpellcasting=class{static{__name(this,"_RitualSpellcasting")}actor;spells;constructor(actor,rituals){this.actor=actor,this.spells=new SpellCollection(this);for(const ritual of rituals)this.spells.set(ritual.id,ritual)}get id(){return"rituals"}get name(){return game.i18n.localize("PF2E.Actor.Creature.Spellcasting.Rituals")}get sort(){return Math.max(0,...this.actor.itemTypes.spellcastingEntry.map(e=>e.sort))+10}get category(){return"ritual"}get tradition(){return null}get isFlexible(){return!1}get isFocusPool(){return!1}get isInnate(){return!1}get isPrepared(){return!1}get isRitual(){return!0}get isSpontaneous(){return!1}canCast(spell){return spell.isRitual}async cast(spell,options={}){if(!spell.isRitual)throw ErrorPF2e("Attempted to cast non-ritual from `RitualSpellcasting`");await spell.toMessage(void 0,{rollMode:options.rollMode})}async getSheetData(){return{id:this.id,name:this.name,statistic:null,tradition:null,category:this.category,isRitual:!0,hasCollection:!0,sort:this.sort,...await this.spells.getSpellData()}}};__name2(_RitualSpellcasting,"RitualSpellcasting");let RitualSpellcasting=_RitualSpellcasting;const _SpellCollection=class extends Collection{static{__name(this,"_SpellCollection")}constructor(entry){if(!entry.actor)throw ErrorPF2e("a spell collection must have an associated actor");super(),__privateAdd(this,_assertEntryIsDocument),__privateAdd(this,_getRitualData),__publicField(this,"entry"),__publicField(this,"actor"),this.entry=entry,this.actor=entry.actor}get id(){return this.entry.id}get highestRank(){const highestSpell=Math.max(...this.map(s=>s.rank)),actorSpellRank=Math.ceil((this.actor?.level??0)/2);return Math.min(10,Math.max(highestSpell,actorSpellRank))}async addSpell(spell,options={}){const{actor}=this;if(!actor.isOfType("creature"))throw ErrorPF2e("Spellcasting entries can only exist on creatures");const canHeighten=!(spell.isCantrip||spell.isFocusSpell||spell.isRitual)&&(this.entry.isSpontaneous||this.entry.isInnate),heightenedRank=canHeighten?options.slotLevel??spell.rank:spell.baseRank;if(spell.system.location.value===this.id&&spell.rank===heightenedRank)return null;if(spell.isFocusSpell&&!this.entry.isFocusPool){const focusTypeLabel=game.i18n.format("PF2E.SpellFocusLabel");return ui.notifications.warn(game.i18n.format("PF2E.Item.Spell.Warning.WrongSpellType",{spellType:focusTypeLabel})),null}if(spell.baseRank>heightenedRank&&this.id===spell.system.location?.value){const targetRankLabel=game.i18n.format("PF2E.SpellLevel",{level:ordinal(heightenedRank)}),baseLabel=game.i18n.format("PF2E.SpellLevel",{level:ordinal(spell.baseRank)});ui.notifications.warn(game.i18n.format("PF2E.Item.Spell.Warning.InvalidLevel",{name:spell.name,targetLevel:targetRankLabel,baseLevel:baseLabel}))}const heightenedUpdate=canHeighten&&heightenedRank>=spell.baseRank?{"system.location.heightenedLevel":heightenedRank}:{};if(spell.actor===actor)return spell.update({"system.location.value":this.id,...heightenedUpdate});{const source=spell.clone({"system.location.value":this.id,...heightenedUpdate}).toObject(),created=(await actor.createEmbeddedDocuments("Item",[source])).shift();return created instanceof SpellPF2e?created:null}}async prepareSpell(spell,slotRank,spellSlot){if(__privateMethod(this,_assertEntryIsDocument,assertEntryIsDocument_fn).call(this,this.entry),spell.baseRank>slotRank&&!(slotRank===0&&spell.isCantrip)){const targetLevelLabel=game.i18n.format("PF2E.SpellLevel",{level:ordinal(slotRank)}),baseLabel=game.i18n.format("PF2E.SpellLevel",{level:ordinal(spell.baseRank)});return ui.notifications.warn(game.i18n.format("PF2E.Item.Spell.Warning.InvalidLevel",{name:spell.name,targetLevel:targetLevelLabel,baseLevel:baseLabel})),this.entry}CONFIG.debug.hooks&&console.debug(`PF2e System | Updating location for spell ${spell.name} to match spellcasting entry ${this.id}`);const key=`system.slots.slot${slotRank}.prepared.${spellSlot}`,updates={[key]:{id:spell.id}},slot=this.entry.system.slots[`slot${slotRank}`].prepared[spellSlot];return slot&&(slot.prepared!==void 0&&(updates[`${key}.-=prepared`]=null),slot.name!==void 0&&(updates[`${key}.-=name`]=null)),this.entry.update(updates)}unprepareSpell(slotRank,spellSlot){__privateMethod(this,_assertEntryIsDocument,assertEntryIsDocument_fn).call(this,this.entry),CONFIG.debug.hooks===!0&&console.debug(`PF2e System | Updating spellcasting entry ${this.id} to remove spellslot ${spellSlot} for spell rank ${slotRank}`);const key=`system.slots.slot${slotRank}.prepared.${spellSlot}`;return this.entry.update({[key]:{name:game.i18n.localize("PF2E.SpellSlotEmpty"),id:null,prepared:!1,expended:!1}})}setSlotExpendedState(slotRank,spellSlot,isExpended){__privateMethod(this,_assertEntryIsDocument,assertEntryIsDocument_fn).call(this,this.entry);const key=`system.slots.slot${slotRank}.prepared.${spellSlot}.expended`;return this.entry.update({[key]:isExpended})}async getSpellData(){const{actor}=this;if(!actor.isOfType("character","npc"))throw ErrorPF2e("Spellcasting entries can only exist on characters and npcs");if(this.entry instanceof RitualSpellcasting)return __privateMethod(this,_getRitualData,getRitualData_fn).call(this);__privateMethod(this,_assertEntryIsDocument,assertEntryIsDocument_fn).call(this,this.entry);const results=[],spells=this.contents.sort((s1,s2)=>(s1.sort||0)-(s2.sort||0)),signatureSpells=spells.filter(s=>s.system.location.signature),isFlexible=this.entry.isFlexible;if(this.entry.isPrepared&&this.entry instanceof SpellcastingEntryPF2e)for(let rank=0;rank<=this.highestRank;rank++){const data=this.entry.system.slots[`slot${rank}`],active=[];if((this.entry.system.showSlotlessLevels.value||data.max>0)&&(rank===0||!isFlexible)){const maxPrepared=Math.max(data.max,0);active.push(...Array(maxPrepared).fill(null));for(const[key,value]of Object.entries(data.prepared)){const spell=value.id?this.get(value.id):null;spell&&(active[Number(key)]={castLevel:spell.computeCastRank(rank),spell,expended:!!value.expended})}}results.push({label:rank===0?"PF2E.TraitCantrip":CONFIG.PF2E.spellLevels[rank],level:rank,uses:{value:rank>0&&isFlexible?data.value||0:void 0,max:data.max},isCantrip:rank===0,active})}else if(this.entry.isFocusPool){const cantrips=spells.filter(spell=>spell.isCantrip),leveled=spells.filter(spell=>!spell.isCantrip);if(cantrips.length){const active=cantrips.map(spell=>({spell}));results.push({label:"PF2E.Actor.Creature.Spellcasting.Cantrips",level:0,isCantrip:!0,active})}if(leveled.length){const active=leveled.map(spell=>({spell}));results.push({label:actor.type==="character"?"PF2E.Focus.Spells":"PF2E.Focus.Pool",level:Math.max(1,Math.ceil(actor.level/2)),isCantrip:!1,uses:actor.system.resources.focus??{value:0,max:0},active})}}else{const alwaysShowHeader=!this.entry.isRitual,spellsByLevel=groupBy(spells,spell=>spell.isCantrip?0:spell.rank);for(let rank=0;rank<=this.highestRank;rank++){const data=this.entry.system.slots[`slot${rank}`],spells2=spellsByLevel.get(rank)??[];if(alwaysShowHeader||spells2.length){const uses=this.entry.isSpontaneous&&rank!==0?{value:data.value,max:data.max}:void 0,active=spells2.map(spell=>({spell,expended:this.entry.isInnate&&!spell.system.location.uses?.value,uses:this.entry.isInnate&&!spell.unlimited?spell.system.location.uses:void 0})),hideForSpontaneous=this.entry.isSpontaneous&&uses?.max===0&&active.length===0,hideForInnate=this.entry.isInnate&&active.length===0;if(!this.entry.system.showSlotlessLevels.value&&(hideForSpontaneous||hideForInnate))continue;results.push({label:rank===0?"PF2E.TraitCantrip":CONFIG.PF2E.spellLevels[rank],level:rank,isCantrip:rank===0,uses,active})}}}if(this.entry.isSpontaneous||isFlexible){for(const spell of signatureSpells)for(const result of results){if(spell.baseRank>result.level||!this.entry.system.showSlotlessLevels.value&&result.uses?.max===0)continue;const existing=result.active.find(a=>a?.spell.id===spell.id);if(existing)existing.signature=!0;else if(result.uses?.max){const castLevel=result.level;result.active.push({spell,castLevel,signature:!0,virtual:!0})}}for(const result of results)if(result.level>0&&result.uses?.value===0&&result.uses.max>0)for(const slot of result.active)slot&&(slot.expended=!0)}const flexibleAvailable=(()=>{if(!isFlexible)return null;const totalSlots=results.filter(result=>!result.isCantrip).map(rank=>rank.uses?.max||0).reduce((first,second)=>first+second,0);return{value:signatureSpells.length,max:totalSlots}})();return{levels:results,flexibleAvailable,spellPrepList:this.getSpellPrepList(spells)}}getSpellPrepList(spells){if(!this.entry.isPrepared)return{};const spellPrepList={},spellsByRank=groupBy(spells,spell=>spell.isCantrip?0:spell.baseRank);for(let rank=0;rank<=this.highestRank;rank++)spellPrepList[rank]=spellsByRank.get(rank)?.map(spell=>({spell,signature:this.entry.isFlexible&&spell.system.location.signature}))??[];return Object.values(spellPrepList).some(s=>!!s.length)?spellPrepList:null}};_assertEntryIsDocument=new WeakSet,assertEntryIsDocument_fn=__name2(function(entry){if(!(entry instanceof ItemPF2e))throw ErrorPF2e("`this#entry` is not a `SpellcastingEntryPF2e`")},"#assertEntryIsDocument"),_getRitualData=new WeakSet,getRitualData_fn=__name2(async function(){const groupedByRank=groupBy(Array.from(this.values()),s=>s.rank);return{levels:Array.from(groupedByRank.entries()).sort(([a],[b])=>a-b).map(([level,spells])=>({label:CONFIG.PF2E.spellLevels[level],level,isCantrip:!1,active:spells.map(spell=>({spell}))})),spellPrepList:null}},"#getRitualData"),__name2(_SpellCollection,"SpellCollection");let SpellCollection=_SpellCollection;const _SpellcastingEntryPF2e=class extends ItemPF2e{static{__name(this,"_SpellcastingEntryPF2e")}get attribute(){return this.system.ability.value||"cha"}get ability(){return foundry.utils.logCompatibilityWarning("`SpellcastingEntryPF2e#ability` is deprecated. Use `SpellcastingEntryPF2e#attribute` instead.",{since:"5.3.0",until:"6.0.0"}),this.attribute}get tradition(){const defaultTradition=this.system.prepared.value==="items"?null:"arcane",tradition=this.system.tradition.value;return setHasElement(MAGIC_TRADITIONS,tradition)?tradition:defaultTradition}get category(){return this.system.prepared.value}get rank(){return this.system.proficiency.value??0}get isPrepared(){return this.system.prepared.value==="prepared"}get isFlexible(){return this.isPrepared&&!!this.system.prepared.flexible}get isSpontaneous(){return this.system.prepared.value==="spontaneous"}get isInnate(){return this.system.prepared.value==="innate"}get isFocusPool(){return this.system.prepared.value==="focus"}get isRitual(){return!1}get highestLevel(){return this.spells?.highestRank??0}get showSlotlessLevels(){return this.system.showSlotlessLevels.value}prepareBaseData(){super.prepareBaseData(),this.system.proficiency.slug||=this.system.tradition.value,this.system.proficiency.value=Math.max(1,this.system.proficiency.value),this.system.prepared.flexible??=!1,this.system.prepared.validItems||=null,this.actor&&(this.statistic=new Statistic(this.actor,{slug:this.slug??sluggify(this.name),label:"PF2E.Actor.Creature.Spellcasting.InvalidProficiency",check:{type:"check"}}))}prepareSiblingData(){if(!this.actor||this.system.prepared.value==="items")this.spells=null;else{this.spells=new SpellCollection(this);const spells=this.actor.itemTypes.spell.filter(i=>i.system.location.value===this.id);for(const spell of spells)this.spells.set(spell.id,spell);this.actor.spellcasting.collections.set(this.spells.id,this.spells)}}prepareActorData(){const actor=this.actor,tradition=this.tradition;if(actor.isOfType("character")&&!this.isInnate&&tradition){const proficiency=actor.system.proficiencies.traditions[tradition],rank=this.system.proficiency.value;proficiency.rank=Math.max(rank,proficiency.rank)}}prepareStatistic(){const actor=this.actor;if(!actor)return;const{attribute,tradition}=this,slug=this.slug??sluggify(`${this.name}-spellcasting`),baseDomains=["all",`${attribute}-based`,"spell-attack-dc"],checkDomains=[`${tradition}-spell-attack`,"spell-attack","spell-attack-roll","attack","attack-roll"],dcDomains=[`${tradition}-spell-dc`,"spell-dc"];if(actor.isOfType("character")){if(this.isInnate){const allRanks=Object.values(actor.traditions).map(t=>t.rank??0);this.system.proficiency.value=Math.max(1,this.rank,...allRanks)}const baseStat=actor.getStatistic(this.system.proficiency.slug);if(!baseStat)return;this.system.ability.value=baseStat.attribute??this.system.ability.value,this.system.proficiency.value=Math.max(this.rank,baseStat.rank??0),this.statistic=baseStat.extend({slug,attribute:this.attribute,rank:this.rank,rollOptions:this.getRollOptions("spellcasting"),domains:baseDomains,check:{type:"attack-roll",domains:checkDomains},dc:{domains:dcDomains}})}else if(actor.isOfType("npc")){const adjustment=actor.isElite?2:actor.isWeak?-2:0,baseMod=Number(this.system?.spelldc?.value??0)+adjustment,baseDC=Number(this.system?.spelldc?.dc??0)+adjustment;this.statistic=new Statistic(actor,{slug,attribute:this.attribute,label:CONFIG.PF2E.magicTraditions[tradition??"arcane"],domains:baseDomains,rollOptions:this.getRollOptions("spellcasting"),check:{type:"attack-roll",domains:checkDomains,modifiers:[new ModifierPF2e("PF2E.ModifierTitle",baseMod,"untyped")]},dc:{domains:dcDomains,modifiers:[new ModifierPF2e("PF2E.ModifierTitle",baseDC-10,"untyped")]}})}else throw ErrorPF2e(`Actor type ${actor.type} does not support spellcasting entries`);const stat=actor.isOfType("npc")?{value:this.statistic.dc.value}:{value:this.statistic.dc.value,rank:this.statistic.rank??0},attributes=actor.system.attributes;stat.value>attributes.classOrSpellDC.value&&(attributes.classOrSpellDC=stat),(!attributes.spellDC||stat.value>attributes.spellDC.value)&&(attributes.spellDC=stat)}getLinkedItems(){return this.actor?.itemTypes.spell.filter(i=>i.system.location.value===this.id)??[]}canCast(spell,{origin}={}){if(this.system.prepared.value==="items")return origin?this.system.prepared.validItems==="scroll"?origin.traits.has("scroll"):!0:!1;const isSpellcastingFeature=this.isPrepared||this.isSpontaneous;if(origin&&!isSpellcastingFeature||!this.spells)return!1;const matchesTradition=this.tradition&&spell.traditions.has(this.tradition),isInSpellList=this.spells.some(s=>s.slug===spell.slug);return matchesTradition||isInSpellList}async cast(spell,options={}){const consume=options.consume??!0,message=options.message??!0,slotRank=options.level??spell.rank,valid=!consume||spell.isCantrip||await this.consume(spell,slotRank,options.slot);if(message&&valid){const castRank=spell.computeCastRank(slotRank);await spell.toMessage(void 0,{rollMode:options.rollMode,data:{castLevel:castRank}})}}async consume(spell,rank,slot){const actor=this.actor;if(!actor?.isOfType("character","npc"))throw ErrorPF2e("Spellcasting entries require an actor");if(this.isRitual)return!0;if(spell.isVariant&&(spell=spell.original),this.isFocusPool&&actor.isOfType("character","npc")){const currentPoints=actor.system.resources.focus?.value??0;return currentPoints>0?(await actor.update({"system.resources.focus.value":currentPoints-1}),!0):(ui.notifications.warn(game.i18n.localize("PF2E.Focus.NotEnoughFocusPointsError")),!1)}const rankLabel=game.i18n.localize(CONFIG.PF2E.spellLevels[rank]),slotKey=goesToEleven(rank)?`slot${rank}`:"slot0";if(this.system.slots===null||!this.spells)return!1;if(this.isPrepared&&!this.isFlexible){const preparedData=this.system.slots[slotKey].prepared;if(slot??=Number(Object.entries(preparedData).filter(([_,slot2])=>slot2.id===spell.id&&!slot2.expended).at(0)?.[0]),!Number.isInteger(slot))throw ErrorPF2e("Slot not given for prepared spell, and no alternative slot was found");return preparedData[slot].expended??!1?(ui.notifications.warn(game.i18n.format("PF2E.SpellSlotExpendedError",{name:spell.name})),!1):(await this.spells.setSlotExpendedState(rank,slot,!0),!0)}if(this.isInnate){const remainingUses=spell.system.location.uses?.value||0;return remainingUses<=0?(ui.notifications.warn(game.i18n.format("PF2E.SpellSlotExpendedError",{name:spell.name})),!1):(await spell.update({"system.location.uses.value":remainingUses-1}),!0)}const slots=this.system.slots[slotKey];return slots.value>0?(await this.update({[`system.slots.${slotKey}.value`]:slots.value-1}),!0):(ui.notifications.warn(game.i18n.format("PF2E.SpellSlotNotEnoughError",{name:spell.name,level:rankLabel})),!1)}async addSpell(spell,options){return this.spells?.addSpell(spell,options)??null}async prepareSpell(spell,slotRank,spellSlot){return this.spells?.prepareSpell(spell,slotRank,spellSlot)??null}async unprepareSpell(spellLevel,slotRank){return this.spells?.unprepareSpell(spellLevel,slotRank)??null}async setSlotExpendedState(slotRank,spellSlot,isExpended){return this.spells?.setSlotExpendedState(slotRank,spellSlot,isExpended)??null}async getSheetData(){if(!this.actor?.isOfType("character","npc"))throw ErrorPF2e("Spellcasting entries can only exist on characters and npcs");const spellCollectionData=await this.spells?.getSpellData()??{levels:[],spellPrepList:null};return{id:this.id,name:this.name,sort:this.sort,attribute:this.attribute,statistic:this.statistic.getChatData(),tradition:this.tradition,category:this.system.prepared.value,isPrepared:this.isPrepared,isSpontaneous:this.isSpontaneous,isFlexible:this.isFlexible,isInnate:this.isInnate,isFocusPool:this.isFocusPool,isRitual:this.isRitual,hasCollection:!!this.spells,showSlotlessLevels:this.showSlotlessLevels,...spellCollectionData}}getRollOptions(prefix="spellcasting"){return[`${prefix}:${this.attribute}`,`${prefix}:${this.tradition}`,`${prefix}:${this.system.prepared.value}`]}async _preUpdate(changed,options,user){if(changed.system?.slots)for(const key of[0,1,2,3,4,5,6,7,8,9,10]){const slotKey=`slot${key}`,slotData=changed.system.slots[slotKey];if(slotData&&("max"in slotData&&(slotData.max=Math.max(Number(slotData.max)||0,0)),"value"in slotData)){const max="max"in slotData?Number(slotData?.max)||0:this.system.slots[slotKey].max;slotData.value=Math.clamped(Number(slotData.value),0,max)}}return super._preUpdate(changed,options,user)}getSpellData(){return this.getSheetData()}};__name2(_SpellcastingEntryPF2e,"SpellcastingEntryPF2e");let SpellcastingEntryPF2e=_SpellcastingEntryPF2e;function applyIWR(actor,roll,rollOptions){if(actor.isDead)return{finalDamage:0,applications:[],persistent:[]};if(!game.settings.get("pf2e","automation.iwr"))return{finalDamage:roll.total,applications:[],persistent:roll.instances.filter(i=>i.persistent&&!i.options.evaluatePersistent)};const{immunities,weaknesses,resistances}=actor.attributes,instances=roll.instances,persistent=[],ignoredResistances=(roll.options.ignoredResistances??[]).map(ir=>new Resistance({type:ir.type,value:ir.max??1/0})),nonDamageWeaknesses=weaknesses.filter(w=>NON_DAMAGE_WEAKNESSES.has(w.type)&&instances.some(i=>w.test([...i.formalDescription,...rollOptions]))),damageWeaknesses=weaknesses.filter(w=>!nonDamageWeaknesses.includes(w)),applications=instances.flatMap(instance=>{const formalDescription=new Set([...instance.formalDescription,...rollOptions]),wasIncreased=instance.total<=0&&typeof roll.options.increasedFrom=="number",isFirst=instances.indexOf(instance)===0,instanceTotal=wasIncreased&&isFirst?1:Math.max(instance.total,0);if(!actor.isAffectedBy(instance.type))return[{category:"unaffected",type:instance.type,adjustment:-1*instanceTotal}];const immunity=immunities.find(i=>i.test(formalDescription));if(immunity)return[{category:"immunity",type:immunity.label,adjustment:-1*instanceTotal}];const critImmunity=immunities.find(i=>i.type==="critical-hits"),critImmunityApplies=roll.options.degreeOfSuccess===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS&&!!critImmunity?.test([...formalDescription,"damage:component:critical"]),critImmuneTotal=critImmunityApplies&&roll.options.degreeOfSuccess===DEGREE_OF_SUCCESS.CRITICAL_SUCCESS?instance.critImmuneTotal:instanceTotal,instanceApplications=[];critImmunity&&critImmuneTotali.type==="precision"),precisionDamage=Math.min(instance.componentTotal("precision"),critImmuneTotal);if(precisionDamage>0&&precisionImmunity?.test([...formalDescription,"damage:component:precision"])){const adjustedPrecisionDamage=critImmunityApplies?Math.floor(precisionDamage/2):precisionDamage,adjustment2=-1*Math.min(critImmuneTotal,adjustedPrecisionDamage);instanceApplications.push({category:"immunity",type:precisionImmunity.applicationLabel,adjustment:adjustment2})}const afterImmunities=Math.max(instanceTotal+instanceApplications.reduce((sum2,a)=>sum2+a.adjustment,0),0);if(instance.persistent&&!instance.options.evaluatePersistent&&persistent.push(instance),afterImmunities===0)return instanceApplications;const mainWeaknesses=damageWeaknesses.filter(w=>w.test(formalDescription)),splashWeakness=instance.componentTotal("splash")?weaknesses.find(w=>w.type==="splash-damage")??null:null,precisionWeakness=precisionDamage>0?weaknesses.find(r=>r.type==="precision"):null,highestWeakness=compact([...mainWeaknesses,precisionWeakness,splashWeakness]).reduce((highest,w)=>w&&!highest||w&&highest&&w.value>highest.value?w:highest,null);highestWeakness&&instanceApplications.push({category:"weakness",type:highestWeakness.applicationLabel,adjustment:highestWeakness.value});const afterWeaknesses=afterImmunities+(highestWeakness?.value??0),applicableResistances=resistances.filter(r=>r.test(formalDescription)).map(r=>({label:r.applicationLabel,value:r.getDoubledValue(formalDescription),ignored:ignoredResistances.some(ir=>ir.test(formalDescription))})),precisionResistance=(()=>{const resistance=precisionDamage>0?resistances.find(r=>r.type==="precision"):null;return resistance?{label:resistance.applicationLabel,value:Math.min(resistance.value,precisionDamage),ignored:!1}:null})();precisionResistance&&applicableResistances.push(precisionResistance);const highestResistance=applicableResistances.filter(r=>!r.ignored).reduce((highest,r)=>r&&!highest||r&&highest&&r.value>highest.value?r:highest,null),highestIgnored=applicableResistances.filter(r=>r.ignored).reduce((highest,r)=>r&&!highest||r&&highest&&r.value>highest.value?r:highest,null);return highestResistance?.value?instanceApplications.push({category:"resistance",type:highestResistance.label,adjustment:-1*Math.min(afterWeaknesses,highestResistance.value),ignored:!1}):highestIgnored&&instanceApplications.push({category:"resistance",type:ignoredResistances.find(ir=>ir.test(formalDescription)).typeLabel,adjustment:0,ignored:!0}),instanceApplications}).concat(...nonDamageWeaknesses.map(w=>({category:"weakness",type:w.typeLabel,adjustment:w.value}))).sort((a,b)=>{if(a.category===b.category)return 0;switch(a.category){case"unaffected":return-1;case"immunity":return b.type==="unaffected"?1:-1;case"weakness":return["unaffected","immunity"].includes(b.category)?1:-1;default:return 1}}),adjustment=applications.reduce((sum2,a)=>sum2+a.adjustment,0);return{finalDamage:Math.max(roll.total+adjustment,0),applications,persistent}}__name(applyIWR,"applyIWR"),__name2(applyIWR,"applyIWR");const _ActorConditions=class{static{__name(this,"_ActorConditions")}constructor(){__privateAdd(this,_idMap2,new Collection),__privateAdd(this,_slugMap,new Collection)}get active(){return __privateGet(this,_idMap2).filter(c=>c.active)}get stored(){return __privateGet(this,_idMap2).filter(c=>!c.inMemoryOnly)}get clumsy(){return this.bySlug("clumsy",{active:!0}).shift()??null}get doomed(){return this.bySlug("doomed",{active:!0}).shift()??null}get drained(){return this.bySlug("drained",{active:!0}).shift()??null}get dying(){return this.bySlug("dying",{active:!0}).shift()??null}get enfeebled(){return this.bySlug("enfeebled",{active:!0}).shift()??null}get frightened(){return this.bySlug("frightened",{active:!0}).shift()??null}get sickened(){return this.bySlug("sickened",{active:!0}).shift()??null}get slowed(){return this.bySlug("slowed",{active:!0}).shift()??null}get stunned(){return this.bySlug("stunned",{active:!0}).shift()??null}get stupefied(){return this.bySlug("stupefied",{active:!0}).shift()??null}get wounded(){return this.bySlug("wounded",{active:!0}).shift()??null}[Symbol.iterator](){return __privateGet(this,_idMap2).values()}get(key,{strict=!1,active=null,temporary=null}={}){const condition=__privateGet(this,_idMap2).get(key,{strict});if(!(active===!0&&!condition?.active)&&!(active===!1&&condition?.active)&&!(temporary===!0&&condition?.actor.items.has(key))&&!(temporary===!1&&!condition?.actor.items.has(key)))return condition}has(id){return __privateGet(this,_idMap2).has(id)}set(id,condition){__privateGet(this,_idMap2).set(id,condition);const listBySlug=__privateGet(this,_slugMap).get(condition.slug)??[];return listBySlug.push(condition),__privateGet(this,_slugMap).set(condition.slug,listBySlug),this}filter(condition){return __privateGet(this,_idMap2).filter(condition)}some(condition){return __privateGet(this,_idMap2).some(condition)}every(condition){return __privateGet(this,_idMap2).contents.every(condition)}map(transformer){return __privateGet(this,_idMap2).map(transformer)}flatMap(transformer){return __privateGet(this,_idMap2).contents.flatMap(transformer)}delete(){return!1}bySlug(slug,{active=null,temporary=null}={}){return(__privateGet(this,_slugMap).get(slug)??[]).filter(condition=>{const activeFilterSatisfied=active===!0?condition.active:active===!1?!condition.active:!0,temporaryFilterSatisfied=temporary===!0?!condition.actor.items.has(condition.id):temporary===!1?condition.actor.items.has(condition.id):!0;return activeFilterSatisfied&&temporaryFilterSatisfied})}};_idMap2=new WeakMap,_slugMap=new WeakMap,__name2(_ActorConditions,"ActorConditions");let ActorConditions=_ActorConditions;var VisionLevels=(VisionLevels2=>(VisionLevels2[VisionLevels2.BLINDED=0]="BLINDED",VisionLevels2[VisionLevels2.NORMAL=1]="NORMAL",VisionLevels2[VisionLevels2.LOWLIGHT=2]="LOWLIGHT",VisionLevels2[VisionLevels2.DARKVISION=3]="DARKVISION",VisionLevels2))(VisionLevels||{});const _ItemTransfer=class _ItemTransfer2{static{__name(this,"_ItemTransfer")}constructor(source,target,quantity,containerId){__privateAdd(this,_getActor),__privateAdd(this,_getSource),__privateAdd(this,_getTarget),__privateAdd(this,_sendMessage),__privateAdd(this,_messageFlavor),__privateAdd(this,_templatePaths,{flavor:"./systems/pf2e/templates/chat/action/flavor.hbs",content:"./systems/pf2e/templates/chat/action/content.hbs"}),this.source=source,this.target=target,this.quantity=quantity,this.containerId=containerId}async request(){var _a;const gamemaster=game.users.find(u=>u.isGM&&u.active);if(!gamemaster){const source=__privateMethod(this,_getSource,getSource_fn).call(this),target=__privateMethod(this,_getTarget,getTarget_fn).call(this),loot=[source,target].find(a=>a?.isLootableBy(game.user)&&!a.isOwner);if(!loot)throw ErrorPF2e("Unexpected missing actor");ui.notifications.error(game.i18n.format("PF2E.loot.GMSupervisionError",{loot:__privateMethod(_a=_ItemTransfer2,_tokenName,tokenName_fn).call(_a,loot)}));return}console.debug(`PF2e System | Requesting item transfer from GM ${gamemaster.name}`),game.socket.emit("system.pf2e",{request:"itemTransfer",data:this})}async enact(requester){if(!game.user.isGM)throw ErrorPF2e("Unauthorized item transfer");console.debug("PF2e System | Enacting item transfer");const sourceActor=__privateMethod(this,_getSource,getSource_fn).call(this),sourceItem=sourceActor?.inventory.find(i=>i.id===this.source.itemId),targetActor=__privateMethod(this,_getTarget,getTarget_fn).call(this);if(!(sourceActor?.isLootableBy(game.user)&&sourceItem&&targetActor?.isLootableBy(game.user)))throw ErrorPF2e("Failed sanity check during item transfer");const targetItem=await sourceActor.transferItemToActor(targetActor,sourceItem,this.quantity,this.containerId),sourceIsLoot=sourceActor.isOfType("loot")&&sourceActor.system.lootSheetType==="Loot";!sourceItem&&sourceIsLoot||__privateMethod(this,_sendMessage,sendMessage_fn).call(this,requester,sourceActor,targetActor,targetItem)}};_templatePaths=new WeakMap,_getActor=new WeakSet,getActor_fn=__name2(function(tokenId,actorId){return typeof tokenId=="string"?canvas.tokens.placeables.find(t=>t.id===tokenId)?.actor??null:game.actors.get(actorId)??null},"#getActor"),_getSource=new WeakSet,getSource_fn=__name2(function(){return __privateMethod(this,_getActor,getActor_fn).call(this,this.source.tokenId,this.source.actorId)},"#getSource"),_getTarget=new WeakSet,getTarget_fn=__name2(function(){return __privateMethod(this,_getActor,getActor_fn).call(this,this.target.tokenId,this.target.actorId)},"#getTarget"),_tokenName=new WeakSet,tokenName_fn=__name2(function(document2){return"items"in document2?document2.isOfType("party")?game.i18n.localize("PF2E.loot.PartyStash"):document2.token?document2.token.name:document2.prototypeToken?.name??document2.name:document2.character?canvas.tokens.placeables.find(t=>t.actor?.id===document2.id)?.name??document2.character?.name:document2.name},"#tokenName"),_sendMessage=new WeakSet,sendMessage_fn=__name2(async function(requester,sourceActor,targetActor,item){var _a;const localize=localizer("PF2E.loot");if(!item)if(sourceActor.isOfType("loot")&&sourceActor.system.lootSheetType==="Merchant"){const message=localize("InsufficientFundsMessage"),content2=await renderTemplate(__privateGet(this,_templatePaths).content,{imgPath:targetActor.img,message:game.i18n.format(message,{buyer:targetActor.name})}),flavor2=await __privateMethod(this,_messageFlavor,messageFlavor_fn).call(this,sourceActor,targetActor,localize("BuySubtitle"));await ChatMessage.create({user:requester.id,speaker:{alias:__privateMethod(_a=_ItemTransfer,_tokenName,tokenName_fn).call(_a,targetActor)},type:CONST.CHAT_MESSAGE_TYPES.EMOTE,flavor:flavor2,content:content2});return}else throw ErrorPF2e("Unexpected item-transfer failure");const[speaker,subtitle,formatArgs]=(()=>{var _a2,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r,_s,_t,_u,_v;const isMerchant=__name2(actor=>actor.isOfType("loot")&&actor.isMerchant,"isMerchant"),isWhat=__name2(actor=>({isCharacter:actor.testUserPermission(requester,"OWNER")&&actor.isOfType("character"),isMerchant:isMerchant(actor),isNPC:actor.isOfType("npc")&&actor.isLootableBy(requester)&&!actor.testUserPermission(requester,"OWNER"),isLoot:(actor.isOfType("party")||actor.isOfType("loot"))&&actor.isLootableBy(requester)&&!actor.testUserPermission(requester,"OWNER")&&!isMerchant(actor)}),"isWhat"),source=isWhat(sourceActor),target=isWhat(targetActor);if(source.isCharacter&&target.isLoot)return[__privateMethod(_a2=_ItemTransfer,_tokenName,tokenName_fn).call(_a2,sourceActor),localize("DepositSubtitle"),[localize("DepositMessage"),{depositor:__privateMethod(_b=_ItemTransfer,_tokenName,tokenName_fn).call(_b,sourceActor),container:__privateMethod(_c=_ItemTransfer,_tokenName,tokenName_fn).call(_c,targetActor)}]];if(source.isCharacter&&target.isMerchant)return[__privateMethod(_d=_ItemTransfer,_tokenName,tokenName_fn).call(_d,sourceActor),localize("GiveSubtitle"),[localize("GiveMessage"),{giver:__privateMethod(_e=_ItemTransfer,_tokenName,tokenName_fn).call(_e,sourceActor),recipient:__privateMethod(_f=_ItemTransfer,_tokenName,tokenName_fn).call(_f,targetActor)}]];if(source.isCharacter&&target.isNPC)return[__privateMethod(_g=_ItemTransfer,_tokenName,tokenName_fn).call(_g,sourceActor),localize("PlantSubtitle"),[localize("PlantMessage"),{planter:__privateMethod(_h=_ItemTransfer,_tokenName,tokenName_fn).call(_h,sourceActor),corpse:__privateMethod(_i=_ItemTransfer,_tokenName,tokenName_fn).call(_i,targetActor)}]];if(source.isLoot&&target.isCharacter)return[__privateMethod(_j=_ItemTransfer,_tokenName,tokenName_fn).call(_j,targetActor),localize("TakeSubtitle"),[localize("TakeMessage"),{taker:__privateMethod(_k=_ItemTransfer,_tokenName,tokenName_fn).call(_k,targetActor),container:__privateMethod(_l=_ItemTransfer,_tokenName,tokenName_fn).call(_l,sourceActor)}]];if(source.isNPC&&target.isCharacter)return[__privateMethod(_m=_ItemTransfer,_tokenName,tokenName_fn).call(_m,targetActor),localize("LootSubtitle"),[localize("LootMessage"),{looter:__privateMethod(_n=_ItemTransfer,_tokenName,tokenName_fn).call(_n,targetActor),corpse:__privateMethod(_o=_ItemTransfer,_tokenName,tokenName_fn).call(_o,sourceActor)}]];if([source,target].every(actor=>actor.isLoot||actor.isNPC))return[requester.character?.name??requester.name,localize("TransferSubtitle"),[localize("TransferMessage"),{transferrer:requester.character?.name??requester.name,fromContainer:__privateMethod(_p=_ItemTransfer,_tokenName,tokenName_fn).call(_p,sourceActor),toContainer:__privateMethod(_q=_ItemTransfer,_tokenName,tokenName_fn).call(_q,targetActor)}]];if(source.isLoot&&target.isMerchant)return[requester.character?.name??requester.name,localize("GiveSubtitle"),[localize("GiveMessage"),{seller:requester.character?.name??requester.name,buyer:__privateMethod(_r=_ItemTransfer,_tokenName,tokenName_fn).call(_r,targetActor)}]];if(source.isMerchant&&target.isCharacter)return[__privateMethod(_s=_ItemTransfer,_tokenName,tokenName_fn).call(_s,sourceActor),localize("SellSubtitle"),[localize("SellMessage"),{seller:__privateMethod(_t=_ItemTransfer,_tokenName,tokenName_fn).call(_t,sourceActor),buyer:__privateMethod(_u=_ItemTransfer,_tokenName,tokenName_fn).call(_u,targetActor)}]];if(source.isMerchant&&target.isLoot)return[requester.character?.name??requester.name,localize("SellSubtitle"),[localize("SellMessage"),{seller:__privateMethod(_v=_ItemTransfer,_tokenName,tokenName_fn).call(_v,sourceActor),buyer:requester.character?.name??requester.name}]];throw ErrorPF2e("Unexpected item-transfer failure")})(),formatProperties=formatArgs[1];if(!formatProperties)throw ErrorPF2e("Unexpected item-transfer failure");formatProperties.quantity=this.quantity,formatProperties.item=item.name;const content=await renderTemplate(__privateGet(this,_templatePaths).content,{imgPath:item.img,message:game.i18n.format(...formatArgs).replace(/\b1 × /,"")}),flavor=await __privateMethod(this,_messageFlavor,messageFlavor_fn).call(this,sourceActor,targetActor,subtitle);await ChatMessage.create({user:requester.id,speaker:{alias:speaker},type:CONST.CHAT_MESSAGE_TYPES.EMOTE,flavor,content})},"#sendMessage"),_messageFlavor=new WeakSet,messageFlavor_fn=__name2(async function(sourceActor,targetActor,subtitle){const glyph=getActionGlyph(sourceActor.isOfType("loot")&&targetActor.isOfType("loot")?2:1),action2={title:"PF2E.Actions.Interact.Title",subtitle,glyph},traits=[{name:"manipulate",label:CONFIG.PF2E.featTraits.manipulate,description:CONFIG.PF2E.traitsDescriptions.manipulate}];return await renderTemplate(__privateGet(this,_templatePaths).flavor,{action:action2,traits})},"#messageFlavor"),__privateAdd(_ItemTransfer,_tokenName),__name2(_ItemTransfer,"ItemTransfer");let ItemTransfer=_ItemTransfer;const _ActorSpellcasting=class extends Collection{static{__name(this,"_ActorSpellcasting")}constructor(actor,entries){super(entries.map(entry=>[entry.id,entry])),this.actor=actor;for(const entry of entries)entry.spells&&this.collections.set(entry.spells.id,entry.spells)}collections=new Collection;get regular(){return this.filter(e=>e instanceof SpellcastingEntryPF2e)}get ritual(){const ritualCasting=this.collections.get("rituals")?.entry;return ritualCasting instanceof RitualSpellcasting?ritualCasting:null}get spellcastingFeatures(){return this.regular.filter(e=>e.isPrepared||e.isSpontaneous)}canCastConsumable(item){const spell=item.embeddedSpell;return!!spell&&this.some(e=>e.canCast(spell,{origin:item}))}refocus(options={}){if(!options.all)throw ErrorPF2e("Actors do not currently support regular refocusing");if(this.actor.isOfType("character","npc")){const focus=this.actor.system.resources.focus,rechargeFocus=focus?.max&&focus.value{if(!(entry instanceof SpellcastingEntryPF2e))return[];if(entry.isFocusPool||!entry.spells)return[];if(entry.isInnate)return entry.spells.map(spell=>{const value=spell.system.location.uses?.max??1;return{_id:spell.id,"system.location.uses.value":value}});const slots=entry.system.slots;let updated=!1;for(const slot of Object.values(slots))if(entry.isPrepared&&!entry.isFlexible)for(const preparedSpell of Object.values(slot.prepared))preparedSpell.expended&&(preparedSpell.expended=!1,updated=!0);else slot.valueu.active),primaryPlayer=this.isToken?null:activeUsers.find(u=>u.character?.id===this.id);return primaryPlayer||(game.users.filter(u=>this.canUserModify(u,"update")).sort((a,b)=>a.id>b.id?1:-1).shift()??null)}get abilities(){return null}get attributes(){return this.system.attributes}get hitPoints(){const{hp}=this.system.attributes;return hp?{value:hp.value,max:hp.max,temp:hp.temp,unrecoverable:hp.unrecoverable,negativeHealing:hp.negativeHealing}:null}get traits(){return new Set(this.system.traits?.value??[])}get level(){return this.system.details.level.value}get size(){return this.system.traits?.size.value??"med"}get dimensions(){const size=this.system.traits?.size??new ActorSizePF2e({value:"med"});return{length:size.length,width:size.width,height:Math.min(size.length,size.width)}}get canSee(){return!0}get canAct(){return!0}get canAttack(){return!1}get isDead(){const deathIcon=game.settings.get("pf2e","deathIcon");if(this.token)return this.token.overlayEffect===deathIcon;const tokens=this.getActiveTokens(!0,!0);return tokens.length>0&&tokens.every(t=>t.overlayEffect===deathIcon)}get modeOfBeing(){const{traits}=this,isPC=isReallyPC(this);return traits.has("undead")&&!traits.has("eidolon")?"undead":traits.has("construct")&&!isPC&&!traits.has("eidolon")?"construct":"living"}get visionLevel(){return VisionLevels.NORMAL}get emitsSound(){return!1}get rollOptions(){return this.flags.pf2e.rollOptions}get heldShield(){return null}get hardness(){return 0}get canHostRuleElements(){return!0}get alliance(){return this.system.details.alliance}get combatant(){return game.combat?.combatants.find(c=>c.actor?.uuid===this.uuid)??null}get temporaryEffects(){const fromConditions=this.conditions.active.map(c=>new TokenEffect(c)),fromEffects=this.itemTypes.effect.filter(e=>e.system.tokenIcon?.show&&(e.isIdentified||game.user.isGM)).map(e=>new TokenEffect(e));return[super.temporaryEffects,fromConditions,fromEffects,this.synthetics.tokenEffectIcons].flat()}isOfType(...types){return types.some(t=>t==="creature"?tupleHasValue(CREATURE_ACTOR_TYPES,this.type):this.type===t)}isAllyOf(actor){return this.alliance!==null&&this!==actor&&this.alliance===actor.alliance}isEnemyOf(actor){return this.alliance!==null&&actor.alliance!==null&&this.alliance!==actor.alliance}isImmuneTo(effect){const item=typeof effect=="string"?null:"parent"in effect?effect:new ItemProxyPF2e(effect),statements=new Set(item?item.getRollOptions("item"):["item:type:condition",`item:slug:${effect}`]);return this.attributes.immunities.some(i=>i.test(statements))}isAffectedBy(damage){const damageType=objectHasKey(CONFIG.PF2E.damageTypes,damage)?damage:damage.isOfType("condition")?damage.system.persistent?.damageType??null:null;if(!setHasElement(UNAFFECTED_TYPES,damageType))return!0;const{traits}=this;return{good:traits.has("evil"),evil:traits.has("good"),lawful:traits.has("chaotic"),chaotic:traits.has("lawful"),vitality:!!this.attributes.hp?.negativeHealing,void:!(this.modeOfBeing==="construct"||this.attributes.hp?.negativeHealing),bleed:this.modeOfBeing==="living",spirit:!(this.modeOfBeing==="undead"&&traits.has("mindless")||this.itemTypes.effect.some(e=>e.traits.has("possession")))}[damageType]}getStatistic(slug){return["armor","ac"].includes(slug)?this.armorClass?.parent??null:tupleHasValue(SAVE_TYPES,slug)?this.saves?.[slug]??null:this.skills&&objectHasKey(this.skills,slug)?this.skills[slug]??null:this.synthetics.statistics.get(slug)??null}getSelfRollOptions(prefix="self"){const{rollOptions}=this;return Object.keys(rollOptions.all).flatMap(o=>o.startsWith("self:")&&rollOptions.all[o]?o.replace(/^self/,prefix):[])}getReach(_options){return 0}getContextualClone(rollOptions,ephemeralEffects=[]){const rollOptionsAll=rollOptions.reduce((options,option)=>({...options,[option]:!0}),{}),applicableEffects=ephemeralEffects.filter(e=>!this.isImmuneTo(e));return this.clone({items:[deepClone(this._source.items),applicableEffects].flat(),flags:{pf2e:{rollOptions:{all:rollOptionsAll}}}},{keepId:!0})}async applyAreaEffects(aura,origin){if(game.user!==this.primaryUpdater||this.isOfType("party")||!this.allowedItemTypes.includes("effect"))return;const toCreate=[],rollOptions=aura.effects.some(e=>e.predicate.length>0)?new Set([...origin.actor.getRollOptions(),...this.getSelfRollOptions("target")]):new Set([]);for(const data of aura.effects.filter(e=>e.predicate.test(rollOptions)))if(!this.itemTypes.effect.some(e=>e.sourceId===data.uuid)&&auraAffectsActor(data,origin.actor,this)){const effect=await fromUuid(data.uuid);if(!(effect instanceof ItemPF2e&&effect.isOfType("affliction","effect"))){console.warn(`Effect from ${data.uuid} not found`);continue}const flags={core:{sourceId:effect.uuid},pf2e:{aura:{slug:aura.slug,origin:origin.actor.uuid,removeOnExit:data.removeOnExit}}},source=mergeObject(effect.toObject(),{flags});source.system.level.value=aura.level??source.system.level.value,source.system.duration.unit="unlimited",source.system.duration.expiry=null,source.system.traits.value.length===0&&source.system.traits.value.push(...aura.traits),source.system.context={target:null,origin:{actor:origin.actor.uuid,token:origin.token.uuid,item:null,spellcasting:null},roll:null},toCreate.push(source)}toCreate.length>0&&await this.createEmbeddedDocuments("Item",toCreate)}static async createDialog(data={},context={}){const omittedTypes=[],original=game.system.documentTypes.Actor;try{if(game.system.documentTypes.Actor=difference(original,omittedTypes),context.types){const validTypes=context.types??[];validTypes.includes("creature")&&validTypes.push(...CREATURE_ACTOR_TYPES),game.system.documentTypes.Actor=game.system.documentTypes.Actor.filter(type=>tupleHasValue(validTypes,type))}return super.createDialog(data,context)}finally{game.system.documentTypes.Actor=original}}static async createDocuments(data=[],context={}){const sources=data.map(d=>d instanceof _ActorPF2e2?d.toObject():d);for(const source of[...sources]){const linkable=SIZE_LINKABLE_ACTOR_TYPES.has(source.type),linkToActorSize=linkable&&(source.prototypeToken?.flags?.pf2e?.linkToActorSize??!0),autoscale=linkable&&(source.prototypeToken?.flags?.pf2e?.autoscale??(linkToActorSize&&game.settings.get("pf2e","tokens.autoscale"))),merged=mergeObject(source,{ownership:source.ownership??{default:CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE},prototypeToken:{flags:{pf2e:{linkToActorSize,autoscale}}}}),dimensionMap={familiar:.5,vehicle:2};switch(merged.prototypeToken.height??=dimensionMap[source.type]??1,merged.prototypeToken.width??=merged.prototypeToken.height,merged.type){case"character":case"familiar":merged.ownership.default=CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,merged.prototypeToken.actorLink=!0,merged.prototypeToken.sight={enabled:!0};break;case"loot":merged.ownership.default=CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,merged.prototypeToken.actorLink=!0,merged.prototypeToken.sight={enabled:!1};break;case"party":merged.ownership.default=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,merged.prototypeToken.actorLink=!0,merged.prototypeToken.sight={enabled:!0,range:1};break}const migrated=await migrateActorSource(source);sources.splice(sources.indexOf(source),1,migrated)}return super.createDocuments(sources,context)}static async updateDocuments(updates=[],context={}){for(const changed of updates)await processPreUpdateActorHooks(changed,{pack:context.pack??null});return super.updateDocuments(updates,context)}_initialize(options){this.constructed??=!1,this._itemTypes=null,this.rules=[],this.initiative=null,this.armorClass=null,this.conditions=new ActorConditions,this.auras=new Map;const preparationWarnings=new Set;this.synthetics={criticalSpecalizations:{standard:[],alternate:[]},damageDice:{damage:[]},degreeOfSuccessAdjustments:{},dexterityModifierCaps:[],modifierAdjustments:{all:[],damage:[]},modifiers:{all:[],damage:[]},movementTypes:{},multipleAttackPenalties:{},ephemeralEffects:{},rollNotes:{},rollSubstitutions:{},rollTwice:{},senses:[],statistics:new Map,strikeAdjustments:[],strikes:new Map,striking:{},tokenMarks:new Map,toggles:[],tokenEffectIcons:[],tokenOverrides:{},weaponPotency:{},preparationWarnings:{add:warning=>preparationWarnings.add(warning),flush:foundry.utils.debounce(()=>{for(const warning of preparationWarnings)console.warn(warning);preparationWarnings.clear()},10)}},super._initialize(options),game._documentsReady&&this.synthetics.preparationWarnings.flush()}_initializeSource(source,options){const initialized=super._initializeSource(source,options);if(options?.pack&&initialized._id){const uuid=`Compendium.${options.pack}.${initialized._id}`,art=game.pf2e.system.moduleArt.map.get(uuid)??{};return mergeObject(initialized,art)}return initialized}prepareData(){super.prepareData();const spellcasting=this.itemTypes.spellcastingEntry,traditionBased=spellcasting.filter(s=>setHasElement(MAGIC_TRADITIONS,s.system.proficiency.slug)),nonTraditionBased=spellcasting.filter(s=>!traditionBased.includes(s));for(const entry of traditionBased)entry.prepareStatistic();for(const rule of this.rules)rule.afterPrepareData?.();for(const entry of nonTraditionBased)entry.prepareStatistic();if(this.attributes.flanking.offGuardable&&this.isImmuneTo("off-guard")&&(this.attributes.flanking.offGuardable=!1),this.preparePrototypeToken(),this.constructed&&canvas.ready){const thisTokenIsControlled=canvas.tokens.controlled.some(t=>t.document===this.parent||t.document.actorLink&&t.actor===this);(game.user.character===this||thisTokenIsControlled)&&game.pf2e.effectPanel.refresh()}}prepareBaseData(){super.prepareBaseData(),this.system.autoChanges={},this.system.attributes.flanking={canFlank:!1,canGangUp:[],flankable:!1,offGuardable:!1};const{attributes,details}=this.system;attributes.hp&&=mergeObject(attributes.hp,{negativeHealing:!1,unrecoverable:0}),attributes.immunities=attributes.immunities?.map(i=>new Immunity(i))??[],attributes.weaknesses=attributes.weaknesses?.map(w=>new Weakness(w))??[],attributes.resistances=attributes.resistances?.map(r=>new Resistance(r))??[],details.level.value=Math.floor(details.level.value)||0;const traits=this.system.traits;traits?.size&&(traits.size=new ActorSizePF2e(traits.size)),this.flags.pf2e=mergeObject(this.flags.pf2e??{},{rollOptions:{all:{[`self:type:${this.type}`]:!0,...createEncounterRollOptions(this)}},trackedItems:{}})}prepareEmbeddedDocuments(){for(const item of this.items)item.reset();const physicalItems=this.items.filter(i=>i.isOfType("physical"));this.inventory=new ActorInventory(this,physicalItems),this.spellcasting=(()=>{const rituals=this.itemTypes.spell.filter(s=>s.isRitual).sort((a,b)=>a.sort-b.sort),spellcastingEntries=[this.itemTypes.spellcastingEntry,rituals.length>0?new RitualSpellcasting(this,rituals):[]].flat();return new ActorSpellcasting(this,spellcastingEntries)})();for(const effect of this.itemTypes.effect)game.pf2e.effectTracker.register(effect);this.prepareDataFromItems()}prepareDataFromItems(){for(const item of this.items)item.prepareSiblingData?.(),item.prepareActorData?.();this.rules=this.prepareRuleElements()}prepareRuleElements(){return sortBy$1(this.items.contents,i=>i instanceof AbstractEffectPF2e).flatMap(item=>item.prepareRuleElements()).filter(rule=>!rule.ignored).sort((elementA,elementB)=>elementA.priority-elementB.priority)}prepareSynthetics(){for(const rule of this.rules.filter(r=>!r.ignored))try{rule.beforePrepareData?.()}catch(error){const ruleName=game.i18n.localize(`PF2E.RuleElement.${rule.key}`);console.error(`PF2e | Failed to execute onBeforePrepareData on rule element ${ruleName}.`,error)}for(const item of this.items)item.onPrepareSynthetics?.()}prepareDerivedData(){const{rollOptions}=this;for(const trait of this.traits)rollOptions.all[`self:trait:${trait}`]=!0}preparePrototypeToken(){this.prototypeToken.flags=mergeObject({pf2e:{linkToActorSize:SIZE_LINKABLE_ACTOR_TYPES.has(this.type)}},this.prototypeToken.flags),TokenDocumentPF2e.assignDefaultImage(this.prototypeToken),TokenDocumentPF2e.prepareSize(this.prototypeToken)}async getRollContext(params){const[selfToken,targetToken]=canvas.ready&&!params.viewOnly?[canvas.tokens.controlled.find(t=>t.actor===this)??this.getActiveTokens().shift()??null,params.target?.token??params.target?.actor?.getActiveTokens().shift()??null]:[null,null],isAttackAction=["attack","attack-roll","attack-damage"].some(d=>params.domains.includes(d)),isMelee=!!(params.melee||params.item?.isOfType("weapon","melee")&¶ms.item.isMelee),reach=isMelee&¶ms.item?.isOfType("action","weapon","melee")?this.getReach({action:"attack",weapon:params.item}):this.getReach({action:"attack"}),isFlankingAttack=!!(isAttackAction&&isMelee&&typeof reach=="number"&&targetToken?.actor&&selfToken?.isFlanking(targetToken,{reach})),originEphemeralEffects=await extractEphemeralEffects({affects:"origin",origin:this,target:params.target?.actor??targetToken?.actor??null,item:params.item??null,domains:params.domains,options:[...params.options,...params.item?.getRollOptions("item")??[]]}),tokenMarkOption=(()=>{const tokenMark=targetToken?this.synthetics.tokenMarks.get(targetToken.document.uuid):null;return tokenMark?`target:mark:${tokenMark}`:null})(),selfActor=params.viewOnly||!targetToken?.actor?this:this.getContextualClone(compact([Array.from(params.options),targetToken.actor.getSelfRollOptions("target"),tokenMarkOption,isFlankingAttack?"self:flanking":null].flat()),originEphemeralEffects),isStrike=params.statistic instanceof StatisticModifier,strikeActions=isStrike?selfActor.system.actions?.flatMap(a=>[a,a.altUsages??[]].flat())??[]:[],statistic=params.viewOnly?params.statistic:isStrike?strikeActions.find(action2=>params.item?.id!==action2.item.id||params?.item.name!==action2.item.name?!1:params.item.isOfType("melee")&&action2.item.isOfType("melee")?!0:params.item.isOfType("weapon")&&action2.item.isOfType("weapon")&¶ms.item.isMelee===action2.item.isMelee)??params.statistic:params.statistic,selfItem=(()=>{if(selfActor===this)return params.item??null;if(statistic&&"item"in statistic&&statistic.item instanceof ItemPF2e&&statistic.item.isOfType("action","melee","spell","weapon"))return statistic.item;const itemClone=selfActor.items.get(params.item?.id??"");return itemClone?.isOfType("melee","spell","weapon")?itemClone:params.item??null})(),itemOptions=selfItem?.getRollOptions("item")??[],traitSlugs=[isAttackAction?"attack":[],isStrike&&selfItem?.isOfType("weapon")&&selfItem.baseType==="alchemical-bomb"?"manipulate":[]].flat();if(selfItem?.isOfType("weapon","melee"))for(const adjustment of this.synthetics.strikeAdjustments)adjustment.adjustTraits?.(selfItem,traitSlugs);const traits=traitSlugs.map(t=>traitSlugToObject(t,CONFIG.PF2E.actionTraits)),distance=selfToken&&targetToken?selfToken.distanceTo(targetToken):null,[originDistance,targetDistance]=typeof distance=="number"?[`origin:distance:${distance}`,`target:distance:${distance}`]:[null,null],getTargetRollOptions=__name2(actor=>{const targetOptions=actor?.getSelfRollOptions("target")??[];return targetToken&&(targetOptions.push("target"),tokenMarkOption&&targetOptions.push(tokenMarkOption)),targetOptions.sort()},"getTargetRollOptions"),targetRollOptions=getTargetRollOptions(targetToken?.actor),targetEphemeralEffects=await extractEphemeralEffects({affects:"target",origin:selfActor,target:targetToken?.actor??null,item:selfItem,domains:params.domains,options:[...params.options,...itemOptions,...targetRollOptions]});if(isFlankingAttack&&isOffGuardFromFlanking(targetToken.actor,selfActor)){const name2=game.i18n.localize("PF2E.Item.Condition.Flanked"),condition=game.pf2e.ConditionManager.getCondition("off-guard",{name:name2});targetEphemeralEffects.push(condition.toObject())}const targetActor=params.viewOnly?null:(params.target?.actor??targetToken?.actor)?.getContextualClone([...selfActor.getSelfRollOptions("origin"),...params.options,...itemOptions,...originDistance?[originDistance]:[]],targetEphemeralEffects)??null,rollOptions=new Set(compact([...params.options,...selfActor.getRollOptions(params.domains),...targetActor?getTargetRollOptions(targetActor):targetRollOptions,...itemOptions,isAttackAction?"attack":null]).sort());targetDistance&&rollOptions.add(targetDistance);const rangeIncrement=selfItem?getRangeIncrement(selfItem,distance):null;rangeIncrement&&rollOptions.add(`target:range-increment:${rangeIncrement}`);const self={actor:selfActor,token:selfToken?.document??null,statistic,item:selfItem,modifiers:[]},target=targetActor&&targetToken&&distance!==null?{actor:targetActor,token:targetToken.document,distance,rangeIncrement}:null;return{options:rollOptions,self,target,traits}}async getCheckContext(params){const context=await this.getRollContext(params),targetActor=context.target?.actor,rangeIncrement=context.target?.rangeIncrement??null,rangePenalty=calculateRangePenalty(this,rangeIncrement,params.domains,context.options);rangePenalty&&context.self.modifiers.push(rangePenalty);const dcData=(()=>{const{domains,defense}=params,scope=domains.includes("attack")?"attack":"check",statistic=targetActor?.getStatistic(defense)?.dc;return statistic?{scope,statistic,slug:defense,value:statistic.value}:null})();return{...context,dc:dcData}}async getDamageRollContext(params){params.checkContext??=findMatchingCheckContext(this,params),params.outcome&¶ms.options.add(`check:outcome:${sluggify(params.outcome)}`);const substitution=params.checkContext?.substitutions.find(s=>s.selected);return substitution&¶ms.options.add(`check:substitution:${substitution.slug}`),this.getRollContext(params)}async toggleRollOption(domain,option,itemId=null,value,suboption=null){return value=typeof itemId=="boolean"?itemId:value??!this.rollOptions[domain]?.[option],typeof itemId=="string"?this.items.get(itemId,{strict:!0}).rules.find(r=>r instanceof RollOptionRuleElement&&r.domain===domain&&r.option===option)?.toggle(value,suboption)??null:this.rules.find(r=>r instanceof RollOptionRuleElement&&r.domain===domain&&r.option===option)?.toggle(value,suboption)??null}async modifyTokenAttribute(attribute,value,isDelta=!1,isBar){const token=this.getActiveTokens(!0,!0).shift(),{hitPoints}=this;if(!!(attribute==="attributes.hp"&&hitPoints&&(isDelta||value===0&&token?.combatant))&&token){const damage=isDelta?-1*value:hitPoints.value-value;return this.applyDamage({damage,token})}return super.modifyTokenAttribute(attribute,value,isDelta,isBar)}async applyDamage({damage,token,item,rollOptions=new Set,skipIWR=!1,shieldBlockRequest=!1,breakdown=[],notes=[]}){const{hitPoints}=this;if(!hitPoints)return this;const result=typeof damage=="number"?{finalDamage:Math.trunc(damage),applications:[],persistent:[]}:skipIWR?{finalDamage:damage.total,applications:[],persistent:[]}:applyIWR(this,damage,rollOptions),{finalDamage}=result,localize=localizer("PF2E.Actor.ApplyDamage"),actorShield=this.isOfType("character","npc")?this.attributes.shield:null,shieldBlock=actorShield&&shieldBlockRequest?(()=>actorShield.broken?(ui.notifications.warn(game.i18n.format("PF2E.Actions.RaiseAShield.ShieldIsBroken",{actor:token.name,shield:actorShield.name})),!1):actorShield.destroyed?(ui.notifications.warn(game.i18n.format("PF2E.Actions.RaiseAShield.ShieldIsDestroyed",{actor:token.name,shield:actorShield.name})),!1):actorShield.raised?!0:(ui.notifications.warn(localize("ShieldNotRaised",{actor:token.name})),!1))():!1,shieldHardness=shieldBlock?actorShield?.hardness??0:0,damageAbsorbedByShield=finalDamage>0?Math.min(shieldHardness,finalDamage):0,{heldShield}=this,blockingShield=heldShield?.id===actorShield?.itemId?heldShield:null,currentShieldHP=blockingShield?blockingShield._source.system.hp.value:actorShield?.hp.value??0,shieldDamage=shieldBlock?Math.min(currentShieldHP,Math.abs(finalDamage)-damageAbsorbedByShield):0,baseActorHardness=this.hardness,effectiveActorHardness=(()=>{const damageHasAdamantine=typeof damage=="number"?!1:damage.materials.includes("adamantine"),materialGrade=item?.isOfType("weapon")&&item.system.material.type==="adamantine"?item.system.material.grade??"standard":"standard",itemHardness={low:0,standard:10,high:13}[materialGrade];return damageHasAdamantine&&itemHardness>=baseActorHardness?Math.floor(baseActorHardness/2):baseActorHardness})(),damageAbsorbedByActor=finalDamage>0?Math.min(finalDamage-damageAbsorbedByShield,effectiveActorHardness):0;if(damageAbsorbedByActor>0){const typeLabel=effectiveActorHardness===baseActorHardness?"PF2E.Damage.Hardness.Full":"PF2E.Damage.Hardness.Half";result.applications.push({category:"reduction",type:game.i18n.localize(typeLabel),adjustment:-1*damageAbsorbedByActor})}const hpUpdate=this.calculateHealthDelta({hp:hitPoints,sp:this.isOfType("character")?this.attributes.hp.sp:null,delta:finalDamage-damageAbsorbedByShield-damageAbsorbedByActor}),hpDamage=hpUpdate.totalApplied,preUpdateSource=this.toObject();if(blockingShield&&shieldDamage>0&&await blockingShield.update({"system.hp.value":Math.max(blockingShield._source.system.hp.value-shieldDamage,0)},{render:hpDamage===0}),hpDamage!==0){const updated=await this.update(hpUpdate.updates,{damageTaken:hpDamage}),deadAtZero=["npcsOnly","both"].includes(game.settings.get("pf2e","automation.actorsDeadAtZero")),toggleDefeated=updated.isDead&&(hpDamage>=0&&!token.combatant?.isDefeated||hpDamage<0&&!!token.combatant?.isDefeated);updated.isOfType("npc")&&deadAtZero&&toggleDefeated&&token.combatant?.toggleDefeated()}const hpStatement=(()=>finalDamage-damageAbsorbedByActor===0?localize("TakesNoDamage"):finalDamage>0?damageAbsorbedByShield>0?hpDamage>0?localize("DamagedForNShield"):localize("ShieldAbsorbsAll"):localize("DamagedForN"):hpDamage<0?localize("HealedForN"):localize("AtFullHealth"))(),updatedShield=this.isOfType("character","npc")?this.attributes.shield:null,shieldStatement=updatedShield&&shieldDamage>0?updatedShield.broken?localize("ShieldDamagedForNBroken"):updatedShield.destroyed?localize("ShieldDamagedForNDestroyed"):localize("ShieldDamagedForN"):null,statements=(()=>{const concatenated=[hpStatement,shieldStatement].filter(s=>!!s).map(s=>game.i18n.format(s,{actor:token.name.replace(/[<>]/g,""),hpDamage:Math.abs(hpDamage),absorbedDamage:damageAbsorbedByShield,shieldDamage})).join(" "),tempElem=document.createElement("div");return tempElem.innerHTML=concatenated,TextEditorPF2e.convertXMLNode(tempElem,"actor",{whose:null,classes:["target-name"]}),tempElem.innerHTML})(),deparenthesize=__name2(formula=>formula.replace(/^\(([^)]+)\)$/,"$1"),"deparenthesize"),persistentDamage=result.persistent.map(instance=>{const condition=game.pf2e.ConditionManager.getCondition("persistent-damage").toObject();return condition.system.persistent={formula:deparenthesize(instance.head.expression),damageType:instance.type,dc:15},condition}),persistentCreated=persistentDamage.length>0?await this.createEmbeddedDocuments("Item",persistentDamage):[],canUndoDamage=!!(hpDamage||shieldDamage||persistentCreated.length),content=await renderTemplate("systems/pf2e/templates/chat/damage/damage-taken.hbs",{breakdown,notes,statements,persistent:persistentCreated.map(p=>p.system.persistent.damage.formula),iwr:{applications:result.applications,visibility:this.hasPlayerOwner?"all":"gm"},canUndoDamage}),flavor=await(async()=>{if(breakdown.length||notes.length)return renderTemplate("systems/pf2e/templates/chat/damage/damage-taken-flavor.hbs",{breakdown,notes})})(),appliedDamage=canUndoDamage?{uuid:this.uuid,isHealing:hpDamage<0,shield:shieldDamage!==0?{id:actorShield?.itemId??"",damage:shieldDamage}:null,persistent:persistentCreated.map(c=>c.id),updates:Object.entries(hpUpdate.updates).map(([path,newValue])=>{const preUpdateValue=getProperty(preUpdateSource,path);if(typeof preUpdateValue=="number"){const difference2=preUpdateValue-newValue;return difference2===0?[]:{path,value:difference2}}return[]}).flat()}:null;return await ChatMessagePF2e.create({speaker:ChatMessagePF2e.getSpeaker({token}),flags:{pf2e:{appliedDamage}},flavor,content,type:CONST.CHAT_MESSAGE_TYPES.OTHER,whisper:game.settings.get("pf2e","metagame_secretDamage")&&!token.actor?.hasPlayerOwner?ChatMessagePF2e.getWhisperRecipients("GM").map(u=>u.id):[]}),this}async undoDamage(appliedDamage){const{updates,shield,persistent}=appliedDamage,actorUpdates={};for(const update of updates){const currentValue=getProperty(this,update.path);typeof currentValue=="number"&&(actorUpdates[update.path]=currentValue+update.value)}if(shield){const item=this.inventory.get(shield.id);item&&(actorUpdates.items=[{_id:shield.id,"system.hp.value":item.hitPoints.value+shield.damage}])}const updateCount=Object.keys(actorUpdates).length;if(persistent.length&&await this.deleteEmbeddedDocuments("Item",persistent,{render:updateCount===0}),updateCount){const{hitPoints}=this,damageTaken=hitPoints&&typeof actorUpdates["system.attributes.hp.value"]=="number"?hitPoints.value-actorUpdates["system.attributes.hp.value"]:0;this.update(actorUpdates,{damageTaken,damageUndo:!0})}}isLootableBy(user){return this.canUserModify(user,"update")}async transferItemToActor(targetActor,item,quantity,containerId,newStack=!1){if(!(item instanceof PhysicalItemPF2e))throw ErrorPF2e("Only physical items (with quantities) can be transfered between actors");const container=targetActor.inventory.get(containerId??"");if(!(!container||container instanceof ContainerPF2e))throw ErrorPF2e("containerId refers to a non-container");if(__name2((source,target)=>{const bothAreOwned=source.isOwner&&target.isOwner,sourceIsOwnedOrLoot=source.isLootableBy(game.user),targetIsOwnedOrLoot=target.isLootableBy(game.user);return!bothAreOwned&&sourceIsOwnedOrLoot&&targetIsOwnedOrLoot},"gmMustTransfer")(this,targetActor)){const source={tokenId:this.token?.id,actorId:this.id,itemId:item.id},target={tokenId:targetActor.token?.id,actorId:targetActor.id};return await new ItemTransfer(source,target,quantity,container?.id).request(),null}if(!this.canUserModify(game.user,"update"))return ui.notifications.error(game.i18n.localize("PF2E.ErrorMessage.CantMoveItemSource")),null;if(!targetActor.canUserModify(game.user,"update"))return ui.notifications.error(game.i18n.localize("PF2E.ErrorMessage.CantMoveItemDestination")),null;quantity=Math.min(quantity,item.quantity);const newQuantity=item.quantity-quantity;newQuantity<1?await item.delete():await item.update({"system.quantity":newQuantity});const newItemData=item.toObject();return newItemData.system.quantity=quantity,newItemData.system.equipped.carryType="worn",hasInvestedProperty(newItemData)&&(newItemData.system.equipped.invested=item.traits.has("invested")?!1:null),targetActor.addToInventory(newItemData,container,newStack)}async addToInventory(itemSource,container,newStack){const stackItem=this.inventory.findStackableItem(itemSource);if(!newStack&&stackItem&&stackItem.type!=="backpack"){const stackQuantity=stackItem.quantity+itemSource.system.quantity;return await stackItem.update({"system.quantity":stackQuantity}),stackItem}const result=await ItemPF2e.create(itemSource,{parent:this});if(!result)return null;const movedItem=this.inventory.get(result.id);return movedItem?(await this.stowOrUnstow(movedItem,container),movedItem):null}async stowOrUnstow(item,container){if(!container)await item.update({"system.containerId":null,"system.equipped.carryType":"worn","system.equipped.handsHeld":0,"system.equipped.inSlot":!1});else if(!isCycle(item,container)){const carryType=container.stowsItems?"stowed":"worn";await item.update({"system.containerId":container.id,"system.equipped.carryType":carryType,"system.equipped.handsHeld":0,"system.equipped.inSlot":!1})}}calculateHealthDelta(args){const updates={},{hp,sp,delta}=args,appliedToTemp=(()=>{if(!hp.temp||delta<=0)return 0;const applied=Math.min(hp.temp,delta);return updates["system.attributes.hp.temp"]=Math.max(hp.temp-applied,0),applied})(),appliedToSP=(()=>{if(!(!!sp&&game.settings.get("pf2e","staminaVariant"))||delta<=0)return 0;const remaining=delta-appliedToTemp,applied=Math.min(sp.value,remaining);return updates["system.attributes.hp.sp.value"]=Math.max(sp.value-applied,0),applied})(),appliedToHP=(()=>{const remaining=delta-appliedToTemp-appliedToSP,applied=remaining>0?Math.min(hp.value,remaining):Math.max(hp.value-hp.max,remaining);return updates["system.attributes.hp.value"]=Math.max(hp.value-applied,0),applied})(),totalApplied=appliedToTemp+appliedToSP+appliedToHP;return{updates,totalApplied}}getRollOptions(domains=[]){const withAll=Array.from(new Set(["all",...domains])),{rollOptions}=this,toReturn=new Set;for(const domain of withAll)for(const[option,value]of Object.entries(rollOptions[domain]??{}))value&&toReturn.add(option);return Array.from(toReturn).sort()}getRollData(){const rollData={actor:this};for(const prop of["abilities","attributes","details","skills","saves"])Object.defineProperty(rollData,prop,{get:()=>(foundry.utils.logCompatibilityWarning(`@${prop} is deprecated`,{since:"5.0.1",until:"6"}),objectHasKey(this.system,prop)?deepClone(this.system[prop]):null)});return rollData}getCondition(slugOrKey,{all=!1}={}){const conditions=this.conditions.filter(c=>c.key===slugOrKey||c.slug===slugOrKey);return all?conditions.sort((conditionA,conditionB)=>{const[valueA,valueB]=[conditionA.value??0,conditionB.value??0];return valueA>valueB?-1:valueAc.active)??null}hasCondition(...slugs){return slugs.some(s=>this.conditions.bySlug(s,{active:!0}).length>0)}async decreaseCondition(conditionSlug,{forceRemove}={forceRemove:!1}){const condition=typeof conditionSlug=="string"?this.getCondition(conditionSlug):conditionSlug;if(!condition)return;if(condition.slug==="persistent-damage"){const matching=this.conditions.stored.filter(c=>c.key===condition.key).map(c=>c.id);await this.deleteEmbeddedDocuments("Item",matching);return}const value=typeof condition.value=="number"?Math.max(condition.value-1,0):null;value!==null&&!forceRemove?await game.pf2e.ConditionManager.updateConditionValue(condition.id,this,value):await this.deleteEmbeddedDocuments("Item",[condition.id])}async increaseCondition(conditionSlug,{min,max=Number.MAX_SAFE_INTEGER,value}={}){if(value&&(min=max=value),conditionSlug==="persistent-damage")return await new PersistentDamageDialog(this).render(!0),null;const existing=(()=>{if(typeof conditionSlug!="string")return conditionSlug;const conditions=this.conditions.stored;return value?conditions.find(c=>c.slug===conditionSlug&&!c.isLocked):conditions.find(c=>c.slug===conditionSlug&&c.active)})();if(existing){const conditionValue=(()=>{if(existing.value===null)return null;if(min&&max&&min>max)throw ErrorPF2e(`min (${min}) > max (${max})`);return min&&max?Math.clamped(existing.value+1,min,max):max?Math.min(existing.value+1,max):existing.value+1})();return conditionValue===null||conditionValue>(max??0)?null:(await game.pf2e.ConditionManager.updateConditionValue(existing.id,this,conditionValue),existing)}else if(typeof conditionSlug=="string"){const conditionSource=game.pf2e.ConditionManager.getCondition(conditionSlug).toObject(),conditionValue=typeof conditionSource?.system.value.value=="number"&&min&&max?Math.clamped(conditionSource.system.value.value,min,max):null;return conditionSource.system.value.value=conditionValue,(await this.createEmbeddedDocuments("Item",[conditionSource])).shift()??null}return null}async toggleCondition(conditionSlug){if(!setHasElement(CONDITION_SLUGS,conditionSlug))throw ErrorPF2e(`Unrecognized condition: ${conditionSlug}`);this.hasCondition(conditionSlug)?await this.decreaseCondition(conditionSlug,{forceRemove:!0}):await this.increaseCondition(conditionSlug)}async importFromJSON(json2){const processed=await preImportJSON(this,json2);return processed?super.importFromJSON(processed):this}_applyDefaultTokenSettings(data,options){const diff=super._applyDefaultTokenSettings(data,options);return this._source.prototypeToken.texture.src===CONST.DEFAULT_TOKEN&&(this._source.prototypeToken.texture.src=_ActorPF2e2.getDefaultArtwork(data).texture.src),diff}async _preUpdate(changed,options,user){const changedHP=changed.system?.attributes?.hp,currentHP=this.hitPoints;if(!options.damageTaken&&this.hasPlayerOwner&&typeof changedHP?.value=="number"&¤tHP){const damageTaken=-1*(changedHP.value-currentHP.value),levelChanged=!!changed.system?.details&&"level"in changed.system.details;damageTaken&&!levelChanged&&(options.damageTaken=damageTaken)}return super._preUpdate(changed,options,user)}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId);const hideFromUser=!this.hasPlayerOwner&&!game.user.isGM&&game.settings.get("pf2e","metagame_secretDamage");if(options.damageTaken&&!hideFromUser){const tokens=this.getActiveTokens();for(const token of tokens)token.showFloatyText(-1*options.damageTaken)}if(canvas.ready&&changed.system?.details&&"alliance"in changed.system.details)for(const token of this.getActiveTokens(!0,!0))token.reset();const currentHP=this.hitPoints?.value??0,hpChange=Number(changed.system?.attributes?.hp?.value)||0;if(currentHP>0&&hpChange>0&&this.isDead){const{combatant}=this;if(combatant)combatant.toggleDefeated({to:!1});else for(const tokenDoc of this.getActiveTokens(!1,!0))tokenDoc.update({overlayEffect:""})}}_updateDependentTokens(update,options){if(game.release.build>305)return super._updateDependentTokens(update,options);const tokens=game.scenes.map(s=>s.tokens.filter(t=>t.actorId===this.id)).flat();for(const token of tokens)token._onUpdateBaseActor(update,options)}_onDelete(options,userId){for(const effect of this.itemTypes.effect)game.pf2e.effectTracker.unregister(effect);super._onDelete(options,userId)}_onEmbeddedDocumentChange(){super._onEmbeddedDocumentChange(),this.synthetics.preparationWarnings.flush()}};__name2(_ActorPF2e,"ActorPF2e");let ActorPF2e=_ActorPF2e;const ActorProxyPF2e=new Proxy(ActorPF2e,{construct(_target2,args){return new CONFIG.PF2E.Actor.documentClasses[args[0].type](...args)}}),_CreaturePF2e=class extends ActorPF2e{static{__name(this,"_CreaturePF2e")}get creatureTypes(){return this.system.traits.value.filter(t=>t in CONFIG.PF2E.creatureTypes).sort()}get alignment(){return this.system.details.alignment.value}get rarity(){return this.system.traits.rarity}get allowedItemTypes(){return[...super.allowedItemTypes,"affliction"]}getReach({action:action2="interact",weapon=null}={}){const baseReach=this.attributes.reach.base,weaponReach=weapon?.isOfType("melee")?weapon.reach:null;if(action2==="interact"||this.type==="familiar")return baseReach;if(typeof weaponReach=="number")return weaponReach;{const traitsFromItems=(weapon?[{item:weapon,ready:!0}]:this.system.actions??[]).filter(a=>a.ready).map(a=>new Set(a.item.system.traits?.value??[]));if(traitsFromItems.length===0)return baseReach;const reaches=traitsFromItems.map(traits=>{if(setHasElement(traits,"reach"))return baseReach+5;const reachNPattern=/^reach-\d{1,3}$/;return Number([...traits].find(t=>reachNPattern.test(t))?.replace("reach-",""))||baseReach});return Math.max(...reaches)}}get visionLevel(){const{senses:senses2}=this.system.traits;if(!(Array.isArray(senses2)&&senses2.every(s=>isObject(s)&&"type"in s&&typeof s.type=="string")))return VisionLevels.NORMAL;const senseTypes=new Set(senses2.map(sense=>sense.type));return this.getCondition("blinded")?VisionLevels.BLINDED:senseTypes.has("darkvision")||senseTypes.has("greaterDarkvision")?VisionLevels.DARKVISION:senseTypes.has("lowLightVision")?VisionLevels.LOWLIGHT:VisionLevels.NORMAL}get hasDarkvision(){return this.visionLevel===VisionLevels.DARKVISION&&!this.hasCondition("blinded")}get hasLowLightVision(){return this.visionLevel>=VisionLevels.LOWLIGHT&&!this.hasCondition("blinded")}get canSee(){return canvas.scene?this.visionLevel===VisionLevels.BLINDED?!1:canvas.scene.lightLevel>LightLevels.DARKNESS||this.hasDarkvision:!0}get canAct(){const traits=this.system.traits.value;return(!this.isDead||traits.some(t=>t==="eidolon"))&&!this.hasCondition("paralyzed","stunned","unconscious")}get canAttack(){return this.type!=="familiar"&&this.canAct}get isDead(){const{hitPoints}=this;return hitPoints.max>0&&hitPoints.value===0&&!this.hasCondition("dying","unconscious")?!0:!!(this.token??this.getActiveTokens(!1,!0).shift())?.hasStatusEffect("dead")}get emitsSound(){return this.system.attributes.emitsSound}get isSpellcaster(){const{itemTypes}=this;return itemTypes.spellcastingEntry.length>0&&itemTypes.spell.length>0}get wornArmor(){return this.itemTypes.armor.find(armor=>armor.isEquipped&&armor.isArmor)??null}get heldShield(){const heldShields=this.itemTypes.armor.filter(armor=>armor.isEquipped&&armor.isShield);return heldShields.length===0?null:heldShields.slice(0,-1).reduce((bestShield,shield)=>{if(bestShield===shield)return bestShield;const withBetterAC=bestShield.acBonus>shield.acBonus?bestShield:shield.acBonus>bestShield.acBonus?shield:null,withMoreHP=bestShield.hitPoints.value>shield.hitPoints.value?bestShield:shield.hitPoints.value>bestShield.hitPoints.value?shield:null,withBetterHardness=bestShield.hardness>shield.hardness?bestShield:shield.hardness>bestShield.hardness?shield:null;return withBetterAC??withMoreHP??withBetterHardness??bestShield},heldShields.slice(-1)[0])}getStatistic(slug){return slug==="perception"?this.perception:tupleHasValue(["spell","spell-attack"],slug)?this.spellcasting.contents.flatMap(sc=>sc.statistic??[]).sort((a,b)=>b.mod-a.mod).shift()??null:slug==="spell-dc"?this.spellcasting.contents.flatMap(sc=>sc.statistic??[]).sort((a,b)=>b.dc.value-a.dc.value).shift()??null:this.spellcasting.contents.flatMap(sc=>sc.statistic??[]).find(s=>s.slug===slug)??super.getStatistic(slug)}_initialize(options){this.parties??=new Set,super._initialize(options)}prepareData(){super.prepareData();for(const party of this.parties)party.reset({actor:!0})}prepareBaseData(){super.prepareBaseData(),this.flags.pf2e.rollOptions.all["self:creature"]=!0;const attributes=this.system.attributes;attributes.hardness??={value:0},attributes.flanking.canFlank=!0,attributes.flanking.flankable=!0,attributes.flanking.offGuardable=!0,attributes.reach={base:0,manipulate:0},attributes.speed=mergeObject({total:0,value:0},attributes.speed??{}),attributes.initiative&&(attributes.initiative.tiebreakPriority=this.hasPlayerOwner?2:1);const customModifiers=this.system.customModifiers??={};for(const selector of Object.keys(customModifiers))customModifiers[selector]=customModifiers[selector].map(rawModifier=>new ModifierPF2e(rawModifier));this.isOfType("character","npc")&&(this.system.attributes.shield={itemId:null,name:game.i18n.localize("PF2E.ArmorTypeShield"),ac:0,hp:{value:0,max:0},brokenThreshold:0,hardness:0,raised:!1,broken:!1,destroyed:!1,icon:"systems/pf2e/icons/actions/raise-a-shield.webp"}),attributes.doomed={value:0,max:3},attributes.dying={value:0,max:4,recoveryDC:10},attributes.wounded={value:0,max:3},setImmunitiesFromTraits(this)}prepareEmbeddedDocuments(){super.prepareEmbeddedDocuments();for(const rule of this.rules)rule.onApplyActiveEffects?.();for(const changeEntries of Object.values(this.system.autoChanges))changeEntries.sort((a,b)=>Number(a.level)>Number(b.level)?1:-1);this.rollOptions.all[`self:mode:${this.modeOfBeing}`]=!0}prepareDerivedData(){super.prepareDerivedData();const{attributes}=this,reachFromSize=SIZE_TO_REACH[this.size];attributes.reach.base=Math.max(attributes.reach.base,reachFromSize),attributes.reach.manipulate=Math.max(attributes.reach.manipulate,attributes.reach.base,reachFromSize);const alignmentTraits2=(()=>{const{alignment}=this;return[["LG","NG","CG"].includes(alignment)?"good":[],["LE","NE","CE"].includes(alignment)?"evil":[],["LG","LN","LE"].includes(alignment)?"lawful":[],["CG","CN","CE"].includes(alignment)?"chaotic":[]].flat()})(),{rollOptions}=this;for(const trait of alignmentTraits2)this.system.traits.value.push(trait),rollOptions.all[`self:trait:${trait}`]=!0;this.isSpellcaster&&(rollOptions.all["self:caster"]=!0),this.hitPoints.negativeHealing&&(rollOptions.all["self:negative-healing"]=!0),rollOptions.all["self:armored"]=!!this.wornArmor&&this.wornArmor.category!=="unarmored",attributes.shield?.raised&&!attributes.shield.broken&&!attributes.shield.destroyed&&(this.rollOptions.all["self:shield:raised"]=!0),this.system.attributes.emitsSound=!this.isDead,this.prepareSynthetics();const sizeIndex=SIZES.indexOf(this.size),sizeSlug=SIZE_SLUGS[sizeIndex];rollOptions.all[`self:size:${sizeIndex}`]=!0,rollOptions.all[`self:size:${sizeSlug}`]=!0,attributes.wounded.max=Math.max(0,attributes.dying.max-1),attributes.doomed.max=attributes.dying.max;for(const conditionSlug of["doomed","wounded","dying"]){const condition=this.conditions.bySlug(conditionSlug,{active:!0}).at(0),status=attributes[conditionSlug];conditionSlug==="dying"&&(status.max-=attributes.doomed.value),status.value=Math.min(condition?.value??0,status.max)}imposeEncumberedCondition(this)}prepareSynthetics(){super.prepareSynthetics();for(const[selector,modifiers]of Object.entries(this.system.customModifiers))(this.synthetics.modifiers[selector]??=[]).push(...modifiers.map(m=>()=>m))}async adjustCarryType(item,{carryType,handsHeld=0,inSlot=!1}){const{usage}=item.system;if(carryType==="stowed"){const container=item.actor.itemTypes.backpack.find(c=>c!==item.container&&!isCycle(item,c));container&&await item.actor.stowOrUnstow(item,container)}else{const equipped={carryType,handsHeld:carryType==="held"?handsHeld:0,inSlot:usage.type==="worn"&&usage.where?inSlot:void 0},updates=[];if(isEquipped(usage,equipped)&&item instanceof ArmorPF2e&&item.isArmor){const wornArmors=this.itemTypes.armor.filter(a=>a!==item&&a.isEquipped&&a.isArmor);for(const armor of wornArmors)updates.push({_id:armor.id,system:{equipped:{inSlot:!1}}})}updates.push({_id:item.id,system:{containerId:null,equipped}}),await this.updateEmbeddedDocuments("Item",updates)}}async addCustomModifier(stat,label,value,type){if(stat=stat==="armor"?"ac":stat,!this.isOfType("character","npc"))return;if(stat.length===0)throw ErrorPF2e("A custom modifier's statistic must be a non-empty string");if(label.length===0)throw ErrorPF2e("A custom modifier's label must be a non-empty string");const modifiers=(this.toObject().system.customModifiers??{})[stat]??[];if(!modifiers.some(m=>m.label===label)){const modifierType=setHasElement(MODIFIER_TYPES,type)?type:"untyped",modifier=new ModifierPF2e({label,modifier:value,type:modifierType,custom:!0}).toObject();await this.update({[`system.customModifiers.${stat}`]:[...modifiers,modifier]})}}async removeCustomModifier(stat,slug){if(stat=stat==="armor"?"ac":stat,stat.length===0)throw ErrorPF2e("A custom modifier's statistic must be a non-empty string");const modifiers=(this.toObject().system.customModifiers??{})[stat]??[];if(modifiers.length!==0)if(typeof slug=="string"){const withRemoved=modifiers.filter(m=>m.slug!==slug);await this.update({[`system.customModifiers.${stat}`]:withRemoved})}else throw ErrorPF2e("Custom modifiers can only be removed by slug (string) or index (number)")}async rollRecovery(event){const{dying}=this.attributes;if(!dying?.value)return null;const localize=localizer("PF2E.Recovery"),recoveryDC=dying.recoveryDC,dc={label:localize("rollingDescription",{dying:dying.value,dc:"{dc}"}),value:recoveryDC+dying.value,visible:!0},notes=[new RollNotePF2e({selector:"all",text:localize("critSuccess"),outcome:["criticalSuccess"]}),new RollNotePF2e({selector:"all",text:localize("success"),outcome:["success"]}),new RollNotePF2e({selector:"all",text:localize("failure"),outcome:["failure"]}),new RollNotePF2e({selector:"all",text:localize("critFailure"),outcome:["criticalFailure"]})];return new Statistic(this,{slug:"dying-recovery",label:"PF2E.Check.Specific.Recovery",check:{type:"flat-check"}}).roll({...eventToRollParams(event),dc,extraRollNotes:notes})}prepareSenses(data,synthetics){const preparedSenses=data.map(datum=>new CreatureSensePF2e(datum));for(const{sense,predicate,force}of synthetics.senses){if(predicate&&!predicate.test(this.getRollOptions(["all","sense"])))continue;const existing=preparedSenses.find(oldSense=>oldSense.type===sense.type);existing?force?preparedSenses.findSplice(oldSense=>oldSense===existing,sense):(sense.isMoreAcuteThan(existing)&&(existing.acuity=sense.acuity),sense.hasLongerRangeThan(existing)&&(existing.value=sense.value)):preparedSenses.push(sense)}return preparedSenses}prepareSpeed(movementType){const systemData=this.system;if(movementType==="land"){const domains=["speed","all-speeds",`${movementType}-speed`],rollOptions=this.getRollOptions(domains),landSpeed=systemData.attributes.speed;landSpeed.value=Number(landSpeed.value)||0;const fromSynthetics=(this.synthetics.movementTypes[movementType]??[]).flatMap(d=>d()??[]);landSpeed.value=Math.max(landSpeed.value,...fromSynthetics.map(s=>s.value));const modifiers=extractModifiers(this.synthetics,domains),stat=mergeObject(new StatisticModifier(`${movementType}-speed`,modifiers,rollOptions),landSpeed,{overwrite:!1}),typeLabel=game.i18n.localize("PF2E.SpeedTypesLand"),otherData={type:"land",label:game.i18n.format("PF2E.SpeedLabel",{type:typeLabel})};this.rollOptions.all["speed:land"]=!0;const merged=mergeObject(stat,otherData);return Object.defineProperties(merged,{total:{get(){return stat.value+stat.totalModifier}},breakdown:{get(){return[`${game.i18n.format("PF2E.SpeedBaseLabel",{type:typeLabel})} ${stat.value}`,...stat.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.signedValue}`)].join(", ")}}}),merged}else{const fastest=(()=>{const{otherSpeeds}=systemData.attributes.speed,existing=otherSpeeds.filter(s=>s.type===movementType),fromSynthetics=(this.synthetics.movementTypes[movementType]??[]).map(d=>d()??[]).flat();return[...existing,...fromSynthetics]})().reduce((best,speed2)=>best?speed2?.value>best.value?speed2:best:speed2,null);if(!fastest)return null;const domains=fastest.derivedFromLand?[`${movementType}-speed`]:["speed","all-speeds",`${movementType}-speed`],rollOptions=this.getRollOptions(domains),label=game.i18n.localize(CONFIG.PF2E.speedTypes[movementType]),speed={type:movementType,label,value:fastest.value};fastest.source&&(speed.source=fastest.source),this.rollOptions.all[`speed:${movementType}`]=!0;const modifiers=extractModifiers(this.synthetics,domains),stat=new StatisticModifier(`${movementType}-speed`,modifiers,rollOptions),merged=mergeObject(stat,speed,{overwrite:!1});return Object.defineProperties(merged,{total:{get(){return speed.value+stat.totalModifier}},breakdown:{get(){return[`${game.i18n.format("PF2E.SpeedBaseLabel",{type:speed.label})} ${speed.value}`].concat(stat.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.modifier<0?"":"+"}${m.modifier}`)).join(", ")}}}),merged}}deleteEmbeddedDocuments(embeddedName,ids,context){if(embeddedName==="Item"){const linked=ids.map(id=>this.items.get(id)).flatMap(item=>item?.getLinkedItems?.()??[]);ids.push(...linked.map(item=>item.id))}return super.deleteEmbeddedDocuments(embeddedName,[...new Set(ids)],context)}async _preUpdate(changed,options,user){const currentHP=this.hitPoints,changedHP=changed.system?.attributes?.hp;typeof changedHP?.value=="number"&&(changedHP.value=options.allowHPOverage?Math.max(0,changedHP.value):Math.clamped(changedHP.value,0,Math.max(currentHP.max-currentHP.unrecoverable,0)));const focusUpdate=changed.system?.resources?.focus;if(focusUpdate&&this.system.resources){typeof focusUpdate.max=="number"&&(focusUpdate.max=Math.clamped(focusUpdate.max,0,3));const updatedPoints=Number(focusUpdate.value??this.system.resources.focus?.value)||0,enforcedMax=(Number(focusUpdate.max)||this.system.resources.focus?.max)??0;focusUpdate.value=Math.clamped(updatedPoints,0,enforcedMax),this.isToken&&(options.diff=!1)}return super._preUpdate(changed,options,user)}_onDelete(options,userId){super._onDelete(options,userId);for(const party of this.parties){const updater=party.primaryUpdater;game.user===updater?party.removeMembers(this.uuid):updater||(party.reset(),ui.actors.render())}}};__name2(_CreaturePF2e,"CreaturePF2e");let CreaturePF2e=_CreaturePF2e;const _CharacterFeats=class extends Collection{static{__name(this,"_CharacterFeats")}constructor(actor){super(),__privateAdd(this,_findBestLocation),__publicField(this,"bonus"),this.actor=actor;const classFeatSlots=actor.class?.grantedFeatSlots;this.bonus=new FeatGroup(actor,{id:"bonus",label:"PF2E.FeatBonusHeader"}),this.createGroup({id:"ancestryfeature",label:"PF2E.FeaturesAncestryHeader",supported:["ancestryfeature"]}),this.createGroup({id:"classfeature",label:"PF2E.FeaturesClassHeader",supported:["classfeature"]});const ancestryTraitsFilter=actor.system.details.ancestry?.countsAs.map(t=>getVanillaOrHomebrewTrait(t)).flatMap(t=>t?`traits-${t}`:[])??[];this.createGroup({id:"ancestry",label:"PF2E.FeatAncestryHeader",featFilter:ancestryTraitsFilter,supported:["ancestry"],slots:classFeatSlots?.ancestry??[]});const classSlug=actor.class?actor.class.slug??sluggify(actor.class.name):null,classTrait=getVanillaOrHomebrewTrait(classSlug),classFeatFilter=classTrait?this.actor.level<2?[`traits-${classTrait}`]:this.actor.itemTypes.feat.some(f=>f.traits.has("dedication"))?[`traits-${classTrait}`,"traits-archetype"]:[`traits-${classTrait}`,"traits-dedication"]:[];this.createGroup({id:"class",label:"PF2E.FeatClassHeader",featFilter:classFeatFilter,supported:["class"],slots:classFeatSlots?.class??[]});const evenLevels=new Array(actor.level).fill(0).map((_,idx)=>idx+1).filter(idx=>idx%2===0);game.settings.get("pf2e","dualClassVariant")&&this.createGroup({id:"dualclass",label:"PF2E.FeatDualClassHeader",supported:["class"],slots:[1,...evenLevels]}),game.settings.get("pf2e","freeArchetypeVariant")&&this.createGroup({id:"archetype",label:"PF2E.FeatArchetypeHeader",supported:["class"],slots:evenLevels,featFilter:this.actor.itemTypes.feat.some(f=>f.traits.has("dedication"))?["traits-archetype"]:["traits-dedication"]});const backgroundSkillFeats=actor.background&&Object.keys(actor.background.system.items??{}).length>0?{id:actor.background.id,level:1,label:game.i18n.localize("PF2E.FeatBackgroundShort")}:null;this.createGroup({id:"skill",label:"PF2E.FeatSkillHeader",supported:["skill"],slots:compact([backgroundSkillFeats,classFeatSlots?.skill].flat())}),this.createGroup({id:"general",label:"PF2E.FeatGeneralHeader",supported:["general","skill"],slots:classFeatSlots?.general??[]}),game.settings.get("pf2e","campaignFeats")&&this.createGroup({id:"campaign",label:"PF2E.FeatCampaignHeader"})}createGroup(options){return this.set(options.id,new FeatGroup(this.actor,options))}async insertFeat(feat,slotData){const alreadyHasFeat=this.actor.items.has(feat.id);if(isBoonOrCurse(feat))return alreadyHasFeat?[]:this.actor.createEmbeddedDocuments("Item",[feat.toObject()]);const groupId=slotData?.groupId??"",{group,slotId}=this.get(groupId)?.isFeatValid(feat)?{group:this.get(groupId),slotId:slotData?.slotId??null}:__privateMethod(this,_findBestLocation,findBestLocation_fn).call(this,feat,{requested:groupId}),isFeatValidInSlot=!!group?.isFeatValid(feat);if(groupId!=="bonus"&&!group){const badGroup=this.get(groupId);if(badGroup)return ui.notifications.warn(game.i18n.format("PF2E.Item.Feat.Warning.InvalidCategory",{item:feat.name,category:game.i18n.format(badGroup.label)})),[]}return alreadyHasFeat&&feat.system.location&&!isFeatValidInSlot?this.actor.updateEmbeddedDocuments("Item",[{_id:feat.id,"system.location":null}]):group?.insertFeat(feat,slotId)??this.bonus.insertFeat(feat)}assignToSlots(){const groupsBySlot=this.contents.filter(g=>g.slotted).reduce((previous,current)=>{for(const slot of Object.keys(current.slots))previous[slot]=current;return previous},{}),feats=this.actor.itemTypes.feat.sort((f1,f2)=>f1.sort-f2.sort);for(const feat of feats.filter(f=>!isBoonOrCurse(f))){if(feat.flags.pf2e.grantedBy&&!feat.system.location){const granter=this.actor.items.get(feat.flags.pf2e.grantedBy.id);if(granter?.isOfType("feat")&&granter.grants.includes(feat))continue}const location=feat.system.location??"";(groupsBySlot[location]??this.get(location)??this.get(feat.category))?.assignFeat(feat)||this.bonus.assignFeat(feat)}this.get("classfeature").feats.sort((a,b)=>(a.feat?.level||0)-(b.feat?.level||0))}};_findBestLocation=new WeakSet,findBestLocation_fn=__name2(function(feat,{requested}){if(feat.isFeature)return{group:this.get(feat.category)??null,slotId:null};if(requested==="bonus")return{group:null,slotId:null};const validGroups=this.filter(c=>c.isFeatValid(feat)&&!c.isFull),group=validGroups.at(0);if(validGroups.length===1&&group){const slotId=group.slotted?Object.values(group.slots).find(slot=>!slot?.feat)?.id??null:null;return{group,slotId}}return{group:null,slotId:null}},"#findBestLocation"),__name2(_CharacterFeats,"CharacterFeats");let CharacterFeats=_CharacterFeats;const _FeatGroup=class{static{__name(this,"_FeatGroup")}constructor(actor,options){__privateAdd(this,_getChildSlots),__publicField(this,"actor"),__publicField(this,"id"),__publicField(this,"label"),__publicField(this,"feats",[]),__publicField(this,"slotted",!1),__publicField(this,"featFilter"),__publicField(this,"supported",[]),__publicField(this,"slots",{}),this.actor=actor;const maxLevel=options.level??actor.level;if(this.id=options.id,this.label=options.label,this.supported=options.supported??[],this.featFilter=Array.from(new Set([this.supported.map(s=>`category-${s}`),options.featFilter??[]].flat())),options.slots){this.slotted=!0;for(const slotOption of options.slots){const slotData=typeof slotOption=="number"?{id:`${this.id}-${slotOption}`,level:slotOption,label:slotOption.toString()}:typeof slotOption=="string"?{id:`${this.id}-${sluggify(slotOption)}`,level:null,label:slotOption}:slotOption;if(typeof slotData.level=="number"&&slotData.level>maxLevel)continue;const slot={...slotData,level:slotData.level??null,children:[]};this.feats.push(slot),this.slots[slot.id]=slot}}}get isFull(){return this.slotted&&Object.values(this.slots).every(s=>!!s?.feat)}assignFeat(feat){const slotId=feat.isOfType("feat")&&feat.system.location===this.id?feat.system.level.taken?.toString()??"":feat.system.location??"",slot=this.slots[slotId];if(!slot&&this.slotted)return!1;if(slot?.feat)return console.debug(`PF2e System | Multiple feats with same index: ${feat.name}, ${slot.feat.name}`),!1;const childSlots=__privateMethod(this,_getChildSlots,getChildSlots_fn).call(this,feat);if(slot)slot.feat=feat,slot.children=childSlots;else{const label=feat.category==="classfeature"?feat.system.level?.value.toString()??null:null;this.feats.push({feat,label,children:childSlots})}return feat.group=this,!0}isFeatValid(feat){return this.supported.length===0||tupleHasValue(this.supported,feat.category)}async insertFeat(feat,slotId=null){const slot=this.slots[slotId??""],location=slot?.id??null,existing=this.actor.items.filter(i=>isFeatLike(i)).filter(i=>i.system.location===location),isFeatValidInSlot=this.isFeatValid(feat),alreadyHasFeat=this.actor.items.has(feat.id),changed=[];if(!alreadyHasFeat&&(isFeatValidInSlot||!location)){const source=mergeObject(feat.toObject(),{system:{location}});changed.push(...await this.actor.createEmbeddedDocuments("Item",[source]));const label=game.i18n.localize(this.label);ui.notifications.info(game.i18n.format("PF2E.Item.Feat.Info.Added",{item:feat.name,category:label}))}const locationUpdates=this.slotted?existing.map(f=>({_id:f.id,"system.location":null,..."taken"in(feat._source.system.level??{})?{"system.level.-=taken":null}:{}})):[];return alreadyHasFeat&&isFeatValidInSlot&&locationUpdates.push({_id:feat.id,"system.location":location,...slot?.level&&feat.isOfType("feat")?{"system.level.taken":slot.level}:{}}),locationUpdates.length>0&&changed.push(...await this.actor.updateEmbeddedDocuments("Item",locationUpdates)),changed}};_getChildSlots=new WeakSet,getChildSlots_fn=__name2(function(feat){return feat?.isOfType("feat")?feat.grants.map(grant=>({id:grant.id,label:null,level:grant.system.level?.taken??null,feat:grant,children:__privateMethod(this,_getChildSlots,getChildSlots_fn).call(this,grant)})):[]},"#getChildSlots"),__name2(_FeatGroup,"FeatGroup");let FeatGroup=_FeatGroup;function getVanillaOrHomebrewTrait(slug){return(slug??"")in CONFIG.PF2E.featTraits?slug:`hb_${slug}`in CONFIG.PF2E.featTraits?`hb_${slug}`:null}__name(getVanillaOrHomebrewTrait,"getVanillaOrHomebrewTrait"),__name2(getVanillaOrHomebrewTrait,"getVanillaOrHomebrewTrait");function isBoonOrCurse(feat){return["pfsboon","deityboon","curse"].includes(feat.category)}__name(isBoonOrCurse,"isBoonOrCurse"),__name2(isBoonOrCurse,"isBoonOrCurse");function isFeatLike(item){return"category"in item&&"location"in item.system&&"isFeat"in item&&"isFeature"in item}__name(isFeatLike,"isFeatLike"),__name2(isFeatLike,"isFeatLike");const CHARACTER_SHEET_TABS=["character","actions","inventory","spellcasting","crafting","proficiencies","feats","effects","biography","pfs"],_CharacterPF2e=class extends CreaturePF2e{static{__name(this,"_CharacterPF2e")}get allowedItemTypes(){const buildItems=["ancestry","heritage","background","class","deity","feat"];return[...super.allowedItemTypes,...buildItems,"physical","spellcastingEntry","spell","action","lore"]}get keyAttribute(){return this.system.details.keyability.value||"str"}get keyAbility(){return foundry.utils.logCompatibilityWarning("`CharacterPF2e#keyAbility` is deprecated. Use `CharacterPF2e#keyAttribute` instead.",{since:"5.2.0",until:"6.0.0"}),this.keyAttribute}get abilities(){return deepClone(this.system.abilities)}get handsFree(){const heldItems=this.inventory.filter(i=>i.isHeld);return Math.clamped(2-sumBy(heldItems,i=>i.traits.has("free-hand")?0:i.handsHeld),0,2)}get handsReallyFree(){const heldItems=this.inventory.filter(i=>i.isHeld);return Math.clamped(2-sumBy(heldItems,i=>i.handsHeld),0,2)}get hitPoints(){return{...super.hitPoints,recoveryMultiplier:this.system.attributes.hp.recoveryMultiplier,recoveryAddend:this.system.attributes.hp.recoveryAddend}}get heroPoints(){return deepClone(this.system.resources.heroPoints)}getStatistic(slug){if(tupleHasValue(["class","class-dc","classDC"],slug))return this.classDC;if(setHasElement(MAGIC_TRADITIONS,slug))return this.traditions[slug];if(slug==="class-spell"){const highestClass=Object.values(this.classDCs).sort((a,b)=>b.mod-a.mod).shift(),highestSpell=this.spellcasting.contents.flatMap(s=>s.statistic??[]).sort((a,b)=>b.mod-a.mod).shift();return compact([highestClass,highestSpell]).sort((a,b)=>b.mod-a.mod).shift()??null}return this.classDCs[slug]??super.getStatistic(slug)}async getCraftingFormulas(){const{formulas}=this.system.crafting;formulas.sort((a,b)=>(a.sort??0)-(b.sort??0));const formulaMap=new Map(formulas.map(data=>[data.uuid,data]));return(await UUIDUtils.fromUUIDs(formulas.map(f=>f.uuid))).filter(i=>i instanceof ItemPF2e&&i.isOfType("physical")).map(item=>{const{dc,batchSize,deletable}=formulaMap.get(item.uuid)??{deletable:!1};return new CraftingFormula(item,{dc,batchSize,deletable})})}async getCraftingEntries(formulas){const craftingFormulas=formulas??await this.getCraftingFormulas();return Object.values(this.system.crafting.entries).filter(entry=>CraftingEntry.isValid(entry)).map(entry=>new CraftingEntry(this,craftingFormulas,entry))}async getCraftingEntry(selector){const craftingFormulas=await this.getCraftingFormulas(),craftingEntryData=this.system.crafting.entries[selector];return CraftingEntry.isValid(craftingEntryData)?new CraftingEntry(this,craftingFormulas,craftingEntryData):null}async performDailyCrafting(){const entries=(await this.getCraftingEntries()).filter(e=>e.isDailyPrep),reagentCost=entries.filter(e=>e.isAlchemical).reduce((sum2,entry)=>sum2+entry.reagentCost,0),reagentValue=(this.system.resources.crafting.infusedReagents.value||0)-reagentCost;if(reagentValue<0){ui.notifications.warn(game.i18n.localize("PF2E.CraftingTab.Alerts.MissingReagents"));return}else await this.update({"system.resources.crafting.infusedReagents.value":reagentValue});for(const item of this.inventory)item.system.temporary&&await item.delete();for(const entry of entries)for(const formula of entry.preparedCraftingFormulas){const itemSource=formula.item.toObject();itemSource.system.quantity=formula.quantity,itemSource.system.temporary=!0,itemSource.system.size=this.ancestry?.size==="tiny"?"tiny":"med",entry.isAlchemical&&(itemSource.type==="consumable"||itemSource.type==="weapon"||itemSource.type==="equipment")&&itemSource.system.traits.value.push("infused"),await this.addToInventory(itemSource)}}_initialize(options){this.familiar??=null,super._initialize(options)}prepareData(){super.prepareData(),game.ready&&this.familiar&&game.actors.has(this.familiar.id)&&this.familiar.reset({fromMaster:!0})}prepareBaseData(){super.prepareBaseData(),this.parties.size||(this.system.exploration=[]);const{flags}=this;flags.pf2e.favoredWeaponRank=0,flags.pf2e.freeCrafting??=!1,flags.pf2e.quickAlchemy??=!1,flags.pf2e.sheetTabs=mergeObject(CHARACTER_SHEET_TABS.reduce((tabs,tab)=>({...tabs,[tab]:!0}),{}),flags.pf2e.sheetTabs??{}),flags.pf2e.showBasicUnarmed??=!0;const isGradual=game.settings.get("pf2e","gradualBoostsVariant"),allowedBoosts=[1,5,10,15,20].reduce((result,level)=>{const allowed=(()=>this.level===0&&level===1?4:isGradual?4-Math.clamped(level-this.level,0,4):this.level>=level?4:0)();return result[level]=allowed,result},{}),manualAttributes=Object.keys(this.system.abilities??{}).length>0;this.system.abilities=mapToObj(Array.from(ATTRIBUTE_ABBREVIATIONS),a=>[a,mergeObject({mod:0},this.system.abilities?.[a]??{})]);const systemData=this.system,existingBoosts=systemData.build?.attributes?.boosts,isABP=game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(this);systemData.build={attributes:{manual:manualAttributes,keyOptions:[],boosts:{ancestry:[],background:[],class:null,1:existingBoosts?.[1]?.slice(0,allowedBoosts[1])??[],5:existingBoosts?.[5]?.slice(0,allowedBoosts[5])??[],10:existingBoosts?.[10]?.slice(0,allowedBoosts[10])??[],15:existingBoosts?.[15]?.slice(0,allowedBoosts[15])??[],20:existingBoosts?.[20]?.slice(0,allowedBoosts[20])??[]},allowedBoosts,flaws:{ancestry:[]},apex:isABP?systemData.build?.attributes?.apex??null:null}},systemData.saves=mergeObject(mapToObj(SAVE_TYPES,t=>[t,{rank:0,ability:SAVING_THROW_DEFAULT_ATTRIBUTES[t]}]),systemData.saves??{});const{details}=this.system;for(const property of["ancestry","heritage","background","class","deity"])this[property]=null,property==="deity"?details.deities={primary:null,secondary:null,domains:{}}:property!=="background"&&(details[property]=null);details.alliance=ALLIANCES.has(details.alliance)?details.alliance:this.hasPlayerOwner?"party":"opposition";const attributes=this.system.attributes;attributes.ac={},attributes.polymorphed=!1,attributes.battleForm=!1,attributes.classDC=null,attributes.spellDC=null,attributes.classOrSpellDC={rank:0,value:0};const perception=attributes.perception??={ability:"wis",rank:0};perception.ability="wis",perception.rank??=0;const hitPoints=this.system.attributes.hp;hitPoints.recoveryMultiplier=1,hitPoints.recoveryAddend=0,attributes.ancestryhp=0,attributes.classhp=0;const{skills}=this.system;for(const key of SKILL_ABBREVIATIONS){const skill=skills[key];skill.ability=SKILL_EXPANDED[SKILL_DICTIONARY[key]].attribute,skill.armor=["dex","str"].includes(skill.ability)}attributes.familiarAbilities={value:0},systemData.proficiencies={...systemData.proficiencies,classDCs:{},traditions:Array.from(MAGIC_TRADITIONS).reduce((accumulated,t)=>({...accumulated,[t]:{rank:0}}),{})};const{resources}=this.system;resources.heroPoints.max=3,resources.investiture={value:0,max:10},resources.focus=mergeObject({value:0,max:0},resources.focus??{}),resources.focus.max=0,resources.focus.cap=3,resources.crafting=mergeObject({infusedReagents:{value:0,max:0}},resources.crafting??{}),resources.crafting.infusedReagents.max=0,this.system.traits.size=new ActorSizePF2e({value:"med"});const attacks=systemData.proficiencies.attacks??={};for(const category of WEAPON_CATEGORIES)attacks[category]={rank:attacks[category]?.rank??0,custom:!!attacks[category]?.custom,immutable:!!attacks[category]?.custom};const homebrewCategories=game.settings.get("pf2e","homebrew.weaponCategories").map(tag=>tag.id);for(const category of homebrewCategories)attacks[category]??={rank:0,custom:!!attacks[category]?.custom,immutable:!!attacks[category]?.custom};const defenses=systemData.proficiencies.defenses??={};for(const category of ARMOR_CATEGORIES)defenses[category]={rank:defenses[category]?.rank??0,immutable:["light-barding","heavy-barding"].includes(category)};systemData.crafting=mergeObject({formulas:[],entries:{}},systemData.crafting??{});for(const formula of this.system.crafting.formulas)formula.deletable=!0;this.rollOptions.all[`self:level:${this.level}`]=!0}prepareEmbeddedDocuments(){super.prepareEmbeddedDocuments();for(const attribute of Object.values(this.system.abilities))attribute.mod=Math.trunc(attribute.mod)||0;this.setNumericRollOptions(),this.deity?.setFavoredWeaponRank()}prepareDataFromItems(){super.prepareDataFromItems(),this.setAttributeModifiers()}prepareDerivedData(){super.prepareDerivedData(),imposeOversizedWeaponCondition(this);const systemData=this.system,{synthetics}=this;if(game.pf2e.variantRules.AutomaticBonusProgression.concatModifiers(this),systemData.details.xp.pct=Math.min(Math.round(systemData.details.xp.value*100/systemData.details.xp.max),99.5),systemData.pfs.levelBump){const params={slug:"level-bump",label:"PF2E.PFS.LevelBump",modifier:1};this.synthetics.modifiers.all.push(()=>new ModifierPF2e(params)),this.synthetics.modifiers.damage.push(()=>new ModifierPF2e(params))}{const ancestryHP=systemData.attributes.ancestryhp,classHP=systemData.attributes.classhp,hitPoints=systemData.attributes.hp,modifiers=[new ModifierPF2e("PF2E.AncestryHP",ancestryHP,"untyped")];if(game.settings.get("pf2e","staminaVariant")){const halfClassHp=Math.floor(classHP/2);systemData.attributes.hp.sp={value:systemData.attributes.hp.sp?.value??0,max:(halfClassHp+systemData.abilities.con.mod)*this.level},systemData.resources.resolve={value:systemData.resources.resolve?.value??0,max:systemData.abilities[systemData.details.keyability.value].mod},modifiers.push(new ModifierPF2e("PF2E.ClassHP",halfClassHp*this.level,"untyped"))}else{modifiers.push(new ModifierPF2e("PF2E.ClassHP",classHP*this.level,"untyped")),delete systemData.resources.resolve;const conHP=systemData.abilities.con.mod*Math.max(this.level,1);modifiers.push(new ModifierPF2e({slug:"hp-con",label:"PF2E.AbilityCon",ability:"con",type:"ability",modifier:conHP,adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,["con-based"],"hp-con")}))}const hpRollOptions=this.getRollOptions(["hp"]);modifiers.push(...extractModifiers(synthetics,["hp"],{test:hpRollOptions}));const perLevelRollOptions=this.getRollOptions(["hp-per-level"]);modifiers.push(...extractModifiers(synthetics,["hp-per-level"],{test:perLevelRollOptions}).map(clone=>(clone.modifier*=this.level,clone)));const stat=mergeObject(new StatisticModifier("hp",modifiers),hitPoints,{overwrite:!1});if(systemData.pfs.levelBump){const hitPointsBump=Math.max(10,stat.totalModifier*.1);stat.push(new ModifierPF2e("PF2E.PFS.LevelBump",hitPointsBump,"untyped"))}stat.max=stat.totalModifier,stat.value=Math.min(stat.value,stat.max),stat.breakdown=stat.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.modifier<0?"":"+"}${m.modifier}`).join(", "),systemData.attributes.hp=stat,setHitPointsRollOptions(this)}this.prepareFeats(),this.prepareSaves(),this.prepareMartialProficiencies(),this.perception=new Statistic(this,{slug:"perception",label:"PF2E.PerceptionLabel",attribute:"wis",rank:systemData.attributes.perception.rank,domains:["perception","wis-based","all"],check:{type:"perception-check"}}),systemData.attributes.perception=mergeObject(systemData.attributes.perception,this.perception.getTraceData({value:"mod"})),this.skills=this.prepareSkills(),this.system.traits.senses=this.prepareSenses(this.system.traits.senses,synthetics),this.traditions=Array.from(MAGIC_TRADITIONS).reduce((traditions,tradition)=>(traditions[tradition]=new Statistic(this,{slug:tradition,label:CONFIG.PF2E.magicTraditions[tradition],rank:systemData.proficiencies.traditions[tradition].rank,domains:["all","spell-attack-dc"],check:{type:"check",domains:[`${tradition}-spell-attack`]},dc:{domains:[`${tradition}-spell-dc`]}}),traditions),{}),this.classDC=null,this.classDCs={};for(const[slug,classDC]of Object.entries(systemData.proficiencies.classDCs)){const statistic=this.prepareClassDC(slug,classDC);systemData.proficiencies.classDCs[slug]=mergeObject(classDC,statistic.getTraceData({value:"dc"})),this.classDCs[slug]=statistic,classDC.primary&&(this.classDC=statistic)}systemData.attributes.classDC=Object.values(systemData.proficiencies.classDCs).find(c=>c.primary)??null,systemData.attributes.classDC&&(systemData.attributes.classOrSpellDC=pick$1(systemData.attributes.classDC,["rank","value"]));const armorStatistic=this.createArmorStatistic();this.armorClass=armorStatistic.dc,systemData.attributes.ac=armorStatistic.getTraceData();const{heldShield}=this;if(heldShield?.speedPenalty){const speedPenalty=new ModifierPF2e(heldShield.name,heldShield.speedPenalty,"untyped");speedPenalty.predicate.push({not:"self:shield:ignore-speed-penalty"}),this.synthetics.modifiers.speed??=[],this.synthetics.modifiers.speed.push(()=>speedPenalty)}const speeds=systemData.attributes.speed=this.prepareSpeed("land");speeds.otherSpeeds=["burrow","climb","fly","swim"].flatMap(m=>this.prepareSpeed(m)??[]),systemData.actions=this.prepareStrikes(),this.flags.pf2e.highestWeaponDamageDice=Math.max(...systemData.actions.filter(s=>s.ready).map(s=>s.item.system.damage.dice),0),this.initiative=new ActorInitiative(this),this.system.attributes.initiative=this.initiative.getTraceData();const{focus,crafting}=this.system.resources;focus.max=Math.floor(Math.clamped(focus.max,0,focus.cap)),crafting.infusedReagents.max=Math.floor(crafting.infusedReagents.max)||0,crafting.infusedReagents.value=Math.clamped(crafting.infusedReagents.value,0,crafting.infusedReagents.max),focus.max===0&&this.spellcasting.regular.some(entry=>entry.isFocusPool)&&(focus.max=1),systemData.attributes.familiarAbilities.value>0&&(this.rollOptions.all["self:has-familiar"]=!0)}setAttributeModifiers(){const{build}=this.system;if(!build.attributes.manual){for(const section of["ancestry","background","class",1,5,10,15,20]){const boosts=build.attributes.boosts[section];if(typeof boosts=="string"){const ability=this.system.abilities[boosts];ability.mod+=ability.mod>=4?.5:1}else if(Array.isArray(boosts))for(const abbrev of boosts){const ability=this.system.abilities[abbrev];ability.mod+=ability.mod>=4?.5:1}const flaws=section==="ancestry"?build.attributes.flaws[section]:[];for(const abbrev of flaws){const ability=this.system.abilities[abbrev];ability.mod-=1}}const isABP=game.pf2e.variantRules.AutomaticBonusProgression.isEnabled(this);if(build.attributes.apex&&(!isABP||this.level>=17)){const attribute=this.system.abilities[build.attributes.apex];attribute.mod=Math.max(attribute.mod+1,4)}}for(const ability of Object.values(this.system.abilities))ability.mod=Math.clamped(ability.mod,-5,10),ability.base=Math.trunc(ability.mod)}setNumericRollOptions(){const rollOptionsAll=this.rollOptions.all,perceptionRank=this.system.attributes.perception.rank;rollOptionsAll[`perception:rank:${perceptionRank}`]=!0;for(const key of ATTRIBUTE_ABBREVIATIONS){const mod=this.abilities[key].mod;rollOptionsAll[`attribute:${key}:mod:${mod}`]=!0}for(const key of SKILL_ABBREVIATIONS){const rank=this.system.skills[key].rank;rollOptionsAll[`skill:${key}:rank:${rank}`]=!0}for(const key of WEAPON_CATEGORIES){const rank=this.system.proficiencies.attacks[key].rank;rollOptionsAll[`attack:${key}:rank:${rank}`]=!0}for(const key of ARMOR_CATEGORIES){const rank=this.system.proficiencies.defenses[key].rank;rollOptionsAll[`defense:${key}:rank:${rank}`]=!0}for(const key of SAVE_TYPES){const rank=this.system.saves[key].rank;rollOptionsAll[`save:${key}:rank:${rank}`]=!0}const{handsFree,handsReallyFree}=this;this.attributes.handsFree=handsFree,rollOptionsAll[`hands-free:${handsFree}`]=!0,rollOptionsAll[`hands-free:but-really:${handsReallyFree}`]=!0}createArmorStatistic(){const{synthetics,wornArmor}=this;this.system.proficiencies.defenses["light-barding"].rank||=this.traits.has("animal")&&!isReallyPC(this)?Math.max(this.system.proficiencies.defenses["light-barding"].rank,1):0;const modifiers=[],dexCapSources=[{value:1/0,source:""},...synthetics.dexterityModifierCaps];wornArmor&&dexCapSources.push({value:Number(wornArmor.dexCap??0),source:wornArmor.name});const dexCap=dexCapSources.reduce((lowest,candidate)=>lowest.value>candidate.value?candidate:lowest),dexModifier=createAttributeModifier({actor:this,attribute:"dex",domains:["all","ac","dex-based"],max:dexCap.value}),attributeModifier=modifiers.filter(m=>m.type==="ability"&&!!m.ability).reduce((best,modifier)=>modifier.modifier>best.modifier?modifier:best,dexModifier),proficiency=Object.entries(this.system.proficiencies.defenses).filter(([key,proficiency2])=>wornArmor?wornArmor.category===key?!0:proficiency2.definition?.test(wornArmor.getRollOptions("item"))??!1:key==="unarmored").map(([_k,v])=>v).reduce((best,p)=>p.rank>best.rank?p:best,{rank:0});return new ArmorStatistic(this,{rank:proficiency.rank,attribute:attributeModifier.ability,modifiers:[attributeModifier]})}prepareSaves(){const systemData=this.system,{wornArmor}=this,saves={};for(const saveType of SAVE_TYPES){const save=systemData.saves[saveType],saveName=game.i18n.localize(CONFIG.PF2E.saves[saveType]),modifiers=[],selectors=[saveType,`${save.ability}-based`,"saving-throw","all"];if(wornArmor?.system.resiliencyRune.value){const resilientBonus=getResilientBonus(wornArmor.system);resilientBonus>0&&wornArmor.isInvested&&modifiers.push(new ModifierPF2e(wornArmor.name,resilientBonus,"item"))}if(saveType==="reflex"&&wornArmor?.traits.has("bulwark")){const slug="bulwark",bulwarkModifier=new ModifierPF2e({slug,type:"untyped",label:CONFIG.PF2E.armorTraits.bulwark,modifier:3,predicate:["damaging-effect"],adjustments:extractModifierAdjustments(this.synthetics.modifierAdjustments,selectors,slug)});modifiers.push(bulwarkModifier),(this.synthetics.modifierAdjustments[saveType]??=[]).push({slug:"dex",test:options=>new PredicatePF2e("damaging-effect").test(options),suppress:!0})}const stat=new Statistic(this,{slug:saveType,label:saveName,attribute:save.ability,rank:save.rank,modifiers,domains:selectors,check:{type:"saving-throw"}});saves[saveType]=stat,this.system.saves[saveType]=mergeObject(this.system.saves[saveType],stat.getTraceData())}this.saves=saves}prepareSkills(){const systemData=this.system,{synthetics,wornArmor}=this,skills=Array.from(SKILL_ABBREVIATIONS).reduce((builtSkills,shortForm)=>{const skill=systemData.skills[shortForm],longForm=SKILL_DICTIONARY[shortForm],label=CONFIG.PF2E.skillList[longForm]??longForm,domains=[longForm,`${skill.ability}-based`,"skill-check",`${skill.ability}-skill-check`,"all"],modifiers=[],strengthRequirement=wornArmor?.strength;if(typeof strengthRequirement=="number"&&this.system.abilities.str.mod>=strengthRequirement)for(const selector of["skill-check","initiative"]){const rollOptions=this.rollOptions[selector]??={};rollOptions["armor:strength-requirement-met"]=!0}if(skill.armor&&typeof wornArmor?.checkPenalty=="number"){const slug="armor-check-penalty",armorCheckPenalty=new ModifierPF2e({slug,label:"PF2E.ArmorCheckPenalty",modifier:wornArmor.checkPenalty,type:"untyped",adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,domains,slug)});armorCheckPenalty.predicate.push({nor:["attack","armor:ignore-check-penalty"]}),["acrobatics","athletics"].includes(longForm)?armorCheckPenalty.predicate.push({nor:["armor:strength-requirement-met","armor:trait:flexible"]}):longForm==="stealth"&&wornArmor.traits.has("noisy")?armorCheckPenalty.predicate.push({nand:["armor:strength-requirement-met","armor:ignore-noisy-penalty"]}):armorCheckPenalty.predicate.push({not:"armor:strength-requirement-met"}),modifiers.push(armorCheckPenalty)}longForm==="athletics"&&modifiers.push(createForceOpenPenalty(this,domains));const statistic=new Statistic(this,{slug:longForm,label,rank:skill.rank,attribute:skill.ability,domains,modifiers,lore:!1,check:{type:"skill-check"}});return builtSkills[longForm]=statistic,this.system.skills[shortForm]=mergeObject(this.system.skills[shortForm],statistic.getTraceData()),builtSkills},{});for(const loreItem of this.itemTypes.lore){const longForm=sluggify(loreItem.name),rank=loreItem.system.proficient.value,domains=[longForm,"int-based","skill-check","lore-skill-check","int-skill-check","all"],statistic=new Statistic(this,{slug:longForm,label:loreItem.name,rank,attribute:"int",domains,lore:!0,check:{type:"skill-check"}});skills[longForm]=statistic,this.system.skills[longForm]={armor:!1,ability:"int",rank,lore:!0,itemID:loreItem.id,...statistic.getTraceData()}}return skills}prepareSpeed(movementType){const statistic=super.prepareSpeed(movementType);if(!statistic)return null;const{wornArmor}=this,basePenalty=wornArmor?.speedPenalty??0,strength=this.system.abilities.str.mod,requirement=wornArmor?.strength??strength,penaltyValue=strength>=requirement?Math.min(basePenalty+5,0):basePenalty,derivedFromLand=!!("derivedFromLand"in statistic&&statistic.derivedFromLand),modifierName=wornArmor?.name??"PF2E.ArmorSpeedLabel",slug="armor-speed-penalty",armorPenalty=penaltyValue&&!derivedFromLand?new ModifierPF2e({slug,label:modifierName,modifier:penaltyValue,type:"untyped",predicate:new PredicatePF2e({not:"armor:ignore-speed-penalty"}),adjustments:extractModifierAdjustments(this.synthetics.modifierAdjustments,["all-speeds","speed",`${movementType}-speed`],slug)}):null;armorPenalty&&(statistic.push(armorPenalty),statistic.calculateTotal(new Set(this.getRollOptions(["all-speeds","speed",`${movementType}-speed`]))));const hinderingPenalty=createHinderingPenalty(this);return hinderingPenalty&&statistic.push(hinderingPenalty),statistic}prepareFeats(){this.pfsBoons=[],this.deityBoonsCurses=[],this.feats=new CharacterFeats(this);const campaignFeatSections=game.settings.get("pf2e","campaignFeatSections");for(const section of campaignFeatSections)this.feats.createGroup(section);this.feats.assignToSlots();const feats=this.itemTypes.feat.filter(f=>["pfsboon","deityboon","curse"].includes(f.category)).sort((f1,f2)=>f1.sort-f2.sort);for(const feat of feats)feat.category==="pfsboon"?this.pfsBoons.push(feat):this.deityBoonsCurses.push(feat)}prepareClassDC(slug,classDC){classDC.ability??="str",classDC.rank??=0,classDC.primary??=!1;const classNames=CONFIG.PF2E.classTraits;return classDC.label=classDC.label??classNames[slug]??slug.titleCase(),new Statistic(this,{slug,label:classDC.label,attribute:classDC.ability,rank:classDC.rank,domains:["class",slug,`${classDC.ability}-based`,"all"],check:{type:"check"}})}prepareStrikes({includeBasicUnarmed=!0}={}){const{itemTypes,synthetics}=this,handwrapsSlug="handwraps-of-mighty-blows",handwraps=itemTypes.weapon.find(w=>w.slug===handwrapsSlug&&w.category==="unarmed"&&w.isEquipped),unarmedRunes=(()=>{const{potencyRune,strikingRune,propertyRune1,propertyRune2,propertyRune3,propertyRune4}=handwraps?._source.system??{};return handwraps?.isInvested?deepClone({potencyRune,strikingRune,propertyRune1,propertyRune2,propertyRune3,propertyRune4}):null})(),basicUnarmed=includeBasicUnarmed?(()=>{const source={_id:"xxPF2ExUNARMEDxx",name:game.i18n.localize("PF2E.WeaponTypeUnarmed"),type:"weapon",img:"icons/skills/melee/unarmed-punch-fist.webp",system:{slug:"basic-unarmed",category:"unarmed",baseItem:null,bonus:{value:0},damage:{dice:1,die:"d4",damageType:"bludgeoning"},equipped:{carryType:"worn",inSlot:!0,handsHeld:0},group:"brawling",traits:{value:["agile","finesse","nonlethal","unarmed"]},usage:{value:"worngloves"},...unarmedRunes??{}}};return new WeaponPF2e(source,{parent:this})})():null;if(unarmedRunes)for(const[slug,weapon]of synthetics.strikes.entries()){weapon.category==="unarmed"&&synthetics.strikes.set(slug,weapon.clone({system:unarmedRunes},{keepId:!0}));const clone=synthetics.strikes.get(slug);clone.name=clone._source.name}const ammos=[...itemTypes.consumable.filter(i=>i.category==="ammo"&&!i.isStowed),...itemTypes.weapon.filter(w=>w.system.usage.canBeAmmo)],homebrewCategoryTags=game.settings.get("pf2e","homebrew.weaponCategories"),offensiveCategories=[...WEAPON_CATEGORIES,...homebrewCategoryTags.map(tag=>tag.id)];return[itemTypes.weapon.filter(w=>w.slug!==handwrapsSlug),Array.from(synthetics.strikes.values()),basicUnarmed??[]].flat().map(w=>this.prepareStrike(w,{categories:offensiveCategories,ammos})).sort((a,b)=>a.label.toLocaleLowerCase(game.i18n.lang).replace(/[-0-9\s]/g,"").localeCompare(b.label.toLocaleLowerCase(game.i18n.lang).replace(/[-0-9\s]/gi,""),game.i18n.lang)).sort((a,b)=>a.slug==="basic-unarmed"?1:b.slug==="basic-unarmed"?-1:0).sort((a,b)=>a.ready!==b.ready?(a.ready?0:1)-(b.ready?0:1):0)}prepareStrike(weapon,options){const{synthetics}=this,modifiers=[],systemData=this.system,{categories}=options,ammos=options.ammos??[],strikeAdjustments=[synthetics.strikeAdjustments,getPropertyRuneStrikeAdjustments(weapon.system.runes.property)].flat();for(const adjustment of strikeAdjustments)adjustment.adjustWeapon?.(weapon);const weaponRollOptions=weapon.getRollOptions("item"),weaponTraits2=weapon.traits,{proficiencies}=systemData,categoryRank=proficiencies.attacks[weapon.category]?.rank??0,groupRank=proficiencies.attacks[`weapon-group-${weapon.group}`]?.rank??0,baseWeapon=CONFIG.PF2E.equivalentWeapons[weapon.baseType??""]??weapon.baseType,baseWeaponRank=proficiencies.attacks[`weapon-base-${baseWeapon}`]?.rank??0,equivalentCategories=Object.values(proficiencies.attacks).flatMap(p=>p&&"sameAs"in p&&(p.definition?.test(weaponRollOptions)??!0)?`item:category:${p.sameAs}`:[]),weaponProficiencyOptions=new Set(weaponRollOptions.concat(equivalentCategories)),syntheticRanks=compact(Object.values(proficiencies.attacks)).filter(p=>p.immutable&&(p.definition?.test(weaponProficiencyOptions)??!0)).map(p=>p.rank),proficiencyRank=Math.max(categoryRank,groupRank,baseWeaponRank,...syntheticRanks),meleeOrRanged=weapon.isMelee?"melee":"ranged",baseOptions=new Set(["action:strike",`item:proficiency:rank:${proficiencyRank}`,...weaponTraits2,meleeOrRanged]),attackDomains=getStrikeAttackDomains(weapon,proficiencyRank,baseOptions),{defaultAttribute}=weapon;modifiers.push(createAttributeModifier({actor:this,attribute:defaultAttribute,domains:attackDomains})),weapon.isMelee&&weaponTraits2.has("finesse")&&modifiers.push(createAttributeModifier({actor:this,attribute:"dex",domains:attackDomains})),weapon.isRanged&&weaponTraits2.has("brutal")&&modifiers.push(createAttributeModifier({actor:this,attribute:"str",domains:attackDomains})),modifiers.push(createProficiencyModifier({actor:this,rank:proficiencyRank,domains:attackDomains}));const initialRollOptions=new Set([...baseOptions,...this.getRollOptions(attackDomains),...weaponRollOptions]),attackRollNotes=extractNotes(synthetics.rollNotes,attackDomains),ABP=game.pf2e.variantRules.AutomaticBonusProgression;if(weapon.group==="bomb"&&!ABP.isEnabled(this)){const attackBonus=Number(weapon.system.bonus?.value)||0;attackBonus!==0&&modifiers.push(new ModifierPF2e("PF2E.ItemBonusLabel",attackBonus,"item"))}const weaponPotency=(()=>{const potency=attackDomains.flatMap(key=>deepClone(synthetics.weaponPotency[key]??[])).filter(wp=>wp.predicate.test(initialRollOptions));return weapon.system.runes.potency&&potency.push({label:"PF2E.Item.Weapon.Rune.Potency",bonus:weapon.system.runes.potency,type:"item",predicate:new PredicatePF2e}),potency.length>0?potency.reduce((highest,current)=>highest.bonus>current.bonus?highest:current):null})();weaponPotency&&(modifiers.push(new ModifierPF2e(weaponPotency.label,weaponPotency.bonus,weaponPotency.type)),!weapon.isMagical&&(weaponPotency.type==="item"||!ABP.isEnabled(weapon.actor))&&weapon.system.traits.value.push("magical"),weapon.flags.pf2e.attackItemBonus=weaponPotency.bonus);const shoddyPenalty=createShoddyPenalty(this,weapon,attackDomains);shoddyPenalty&&modifiers.push(shoddyPenalty),modifiers.push(...PCAttackTraitHelpers.createAttackModifiers({item:weapon,domains:attackDomains}),...extractModifiers(synthetics,attackDomains,{injectables:{weapon},resolvables:{weapon}}));const auxiliaryActions=[],isRealItem=this.items.has(weapon.id);if(weapon.system.traits.toggles.modular.options.length>0&&auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"Modular"})),isRealItem&&weapon.category!=="unarmed"){const traitsArray=weapon.system.traits.value,hasFatalAimTrait=traitsArray.some(t=>t.startsWith("fatal-aim")),hasTwoHandTrait=traitsArray.some(t=>t.startsWith("two-hand")),{usage}=weapon.system,canWield2H=usage.type==="held"&&usage.hands===2||hasFatalAimTrait||hasTwoHandTrait;switch(weapon.carryType){case"held":{weapon.handsHeld===2?auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Release",purpose:"Grip",hands:1})):weapon.handsHeld===1&&canWield2H&&auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"Grip",hands:2})),auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"Sheathe",hands:0})),auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Release",purpose:"Drop",hands:0}));break}case"worn":{canWield2H&&auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"Draw",hands:2})),auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"Draw",hands:1}));break}case"stowed":{auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"Retrieve",hands:1}));break}case"dropped":{canWield2H&&auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"PickUp",hands:2})),auxiliaryActions.push(new WeaponAuxiliaryAction({weapon,action:"Interact",purpose:"PickUp",hands:1}));break}}}const weaponSlug=weapon.slug??sluggify(weapon.name),flavor=this.getStrikeDescription(weapon),rollOptions=[...this.getRollOptions(attackDomains),...weaponRollOptions,...weaponTraits2,meleeOrRanged],strikeStat=new StatisticModifier(weaponSlug,modifiers,rollOptions),altUsages=weapon.getAltUsages().map(w=>this.prepareStrike(w,{categories})),versatileLabel=__name2(damageType=>{switch(damageType){case"bludgeoning":return CONFIG.PF2E.weaponTraits["versatile-b"];case"piercing":return CONFIG.PF2E.weaponTraits["versatile-p"];case"slashing":return CONFIG.PF2E.weaponTraits["versatile-s"];default:return CONFIG.PF2E.weaponTraits[`versatile-${damageType}`]??CONFIG.PF2E.damageTypes[damageType]}},"versatileLabel"),ready2=weapon.isEquipped||weapon.isThrown&&weapon.reload==="0"&&weapon.isWorn&&this.handsReallyFree>0,action2=mergeObject(strikeStat,{label:weapon.name,imageUrl:weapon.img,quantity:weapon.quantity,ready:ready2,domains:attackDomains,visible:weapon.slug!=="basic-unarmed"||this.flags.pf2e.showBasicUnarmed,glyph:"A",item:weapon,type:"strike",...flavor,options:Array.from(baseOptions),traits:[],weaponTraits:Array.from(weaponTraits2).map(t=>traitSlugToObject(t,CONFIG.PF2E.npcAttackTraits)).sort((a,b)=>a.label.localeCompare(b.label)),variants:[],selectedAmmoId:weapon.system.selectedAmmoId,altUsages,auxiliaryActions,versatileOptions:weapon.system.traits.toggles.versatile.options.map(o=>({value:o,selected:weapon.system.traits.toggles.versatile.selection===o,label:versatileLabel(o),glyph:DAMAGE_TYPE_ICONS[o]}))});if(action2.versatileOptions.length>0&&action2.versatileOptions.unshift({value:weapon.system.damage.damageType,selected:weapon.system.traits.toggles.versatile.selection===null,label:CONFIG.PF2E.damageTypes[weapon.system.damage.damageType],glyph:DAMAGE_TYPE_ICONS[weapon.system.damage.damageType]}),weapon.requiresAmmo){const compatible=ammos.filter(a=>a.isAmmoFor(weapon)),incompatible=ammos.filter(a=>!a.isAmmoFor(weapon)),{ammo}=weapon,selected=ammo?{id:ammo.id,compatible:ammo.isAmmoFor(weapon)}:null;action2.ammunition={compatible,incompatible,selected}}const actionTraits2=["attack",weapon.baseType==="alchemical-bomb"?"manipulate":[]].flat();for(const adjustment of synthetics.strikeAdjustments)adjustment.adjustTraits?.(weapon,actionTraits2);action2.traits=actionTraits2.map(t=>traitSlugToObject(t,CONFIG.PF2E.actionTraits)),action2.breakdown=action2.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.modifier<0?"":"+"}${m.modifier}`).join(", ");const maps=calculateMAPs(weapon,{domains:attackDomains,options:initialRollOptions}),createMapModifier=__name2(prop=>new ModifierPF2e({slug:maps.slug,label:maps.label,modifier:maps[prop],adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,attackDomains,maps.slug)}),"createMapModifier"),createMapLabel=__name2(prop=>{const modifier=createMapModifier(prop);adjustModifiers([modifier],new Set(rollOptions));const penalty=modifier.ignored?0:modifier.value;return game.i18n.format("PF2E.MAPAbbreviationValueLabel",{value:signedInteger(action2.totalModifier+penalty),penalty})},"createMapLabel"),labels=[()=>signedInteger(action2.totalModifier),()=>createMapLabel("map1"),()=>createMapLabel("map2")],checkModifiers=[(statistic,otherModifiers)=>new CheckModifier("strike",statistic,otherModifiers),(statistic,otherModifiers)=>new CheckModifier("strike-map1",statistic,[...otherModifiers,createMapModifier("map1")]),(statistic,otherModifiers)=>new CheckModifier("strike-map2",statistic,[...otherModifiers,createMapModifier("map2")])];action2.variants=[0,1,2].map(mapIncreases=>({get label(){return labels[mapIncreases]()},roll:async(params={})=>{if(params.options??=[],params.consumeAmmo??=weapon.requiresAmmo,weapon.requiresAmmo&¶ms.consumeAmmo&&!weapon.ammo)return ui.notifications.warn(game.i18n.format("PF2E.Strike.Ranged.NoAmmo",{weapon:weapon.name,actor:this.name})),null;const context=await this.getCheckContext({item:weapon,domains:attackDomains,statistic:action2,target:{token:params.target??game.user.targets.first()??null},defense:"armor",options:new Set([...baseOptions,...params.options]),viewOnly:params.getFormula});if(context.self.item.isRanged&&typeof context.target?.distance=="number"){const maxRange=context.self.item.range?.max??10;if(context.target.distance>maxRange)return ui.notifications.warn("PF2E.Action.Strike.OutOfRange",{localize:!0}),null}for(const rule of this.rules.filter(r=>!r.ignored))rule.beforeRoll?.(attackDomains,context.options);const dc=params.dc??context.dc,rollTwice=params.rollTwice||extractRollTwice(synthetics.rollTwice,attackDomains,context.options),substitutions=extractRollSubstitutions(synthetics.rollSubstitutions,attackDomains,context.options),title=game.i18n.format(weapon.isMelee?"PF2E.Action.Strike.MeleeLabel":"PF2E.Action.Strike.RangedLabel",{weapon:weapon.name}),checkContext={type:"attack-roll",identifier:`${weapon.id}.${weaponSlug}.${meleeOrRanged}`,action:"strike",title,actor:context.self.actor,token:context.self.token,target:context.target,item:context.self.item,altUsage:params.altUsage??null,damaging:context.self.item.dealsDamage,domains:attackDomains,options:context.options,notes:attackRollNotes,dc,traits:context.traits,rollTwice,substitutions,dosAdjustments:extractDegreeOfSuccessAdjustments(synthetics,attackDomains),mapIncreases};if(params.consumeAmmo&&!this.consumeAmmo(context.self.item,params))return null;const check=checkModifiers[mapIncreases](context.self.statistic??action2,context.self.modifiers),roll=await CheckPF2e.roll(check,checkContext,params.event,params.callback);if(roll)for(const rule of this.rules.filter(r=>!r.ignored))await rule.afterRoll?.({roll,check,context:checkContext,domains:attackDomains,rollOptions:context.options});return roll}})),action2.attack=action2.roll=action2.variants[0].roll;for(const method of["damage","critical"])action2[method]=async(params={})=>{const domains=getStrikeDamageDomains(weapon,proficiencyRank);params.options=new Set(params.options??[]);const targetToken=params.target??game.user.targets.first()??null,context=await this.getDamageRollContext({item:weapon,viewOnly:params.getFormula??!1,statistic:action2,target:{token:targetToken},domains,outcome:method==="damage"?"success":"criticalSuccess",options:new Set([...baseOptions,...params.options]),checkContext:params.checkContext});if(!context.self.item.dealsDamage)return params.getFormula?"":(ui.notifications.warn("PF2E.ErrorMessage.WeaponNoDamage",{localize:!0}),null);const outcome=method==="damage"?"success":"criticalSuccess",{self,target,options:options2}=context,damageContext={type:"damage-roll",sourceType:"attack",self,target,outcome,options:options2,domains,...eventToRollParams(params.event)};typeof params.mapIncreases=="number"&&(damageContext.mapIncreases=params.mapIncreases,damageContext.options.add(`map:increases:${params.mapIncreases}`)),params.getFormula&&(damageContext.skipDialog=!0);const damage=await WeaponDamagePF2e.calculate({weapon:context.self.item,actor:context.self.actor,actionTraits:context.traits,weaponPotency,context:damageContext});if(!damage)return null;if(params.getFormula){const formula=damage.damage.formula[outcome];return formula?new DamageRoll(formula).formula:""}else return DamagePF2e.roll(damage,damageContext,params.callback)};return action2}getStrikeDescription(weapon){const flavor={description:"PF2E.Strike.Default.Description",criticalSuccess:"PF2E.Strike.Default.CriticalSuccess",success:"PF2E.Strike.Default.Success"},traits=weapon.traits;return traits.has("unarmed")?(flavor.description="PF2E.Strike.Unarmed.Description",flavor.success="PF2E.Strike.Unarmed.Success"):[...traits].some(trait=>trait.startsWith("thrown-")||trait==="combination")?(flavor.description="PF2E.Strike.Combined.Description",flavor.success="PF2E.Strike.Combined.Success"):weapon.isMelee?(flavor.description="PF2E.Strike.Melee.Description",flavor.success="PF2E.Strike.Melee.Success"):(flavor.description="PF2E.Strike.Ranged.Description",flavor.success="PF2E.Strike.Ranged.Success"),flavor}async getRollContext(params){const context=await super.getRollContext(params);return params.statistic instanceof StatisticModifier&&context.self.item?.isOfType("weapon")&&PCAttackTraitHelpers.adjustWeapon(context.self.item),context}consumeAmmo(weapon,params){const ammo=weapon.ammo;if(ammo){if(ammo.quantity<1)return ui.notifications.warn(game.i18n.localize("PF2E.ErrorMessage.NotEnoughAmmo")),!1;{const existingCallback=params.callback;return params.callback=async roll=>{existingCallback?.(roll),await weapon.consumeAmmo()},!0}}else return!0}prepareMartialProficiencies(){for(const key of["attacks","defenses"]){const proficiencies=this.system.proficiencies[key],linkedProficiencies=Object.values(proficiencies).filter(p=>!!p?.sameAs&&p.sameAs in proficiencies);for(const proficiency of linkedProficiencies){const category=proficiencies[proficiency.sameAs??""];proficiency.rank=(()=>{const maxRankIndex=PROFICIENCY_RANKS.indexOf(proficiency.maxRank??"legendary");return Math.min(category?.rank??0,maxRankIndex)})()}const allProficiencies=Object.entries(proficiencies);for(const[_key,proficiency]of allProficiencies){if(!proficiency)continue;const duplicates=allProficiencies.flatMap(([k,p])=>p&&proficiency!==p&&proficiency.rank>=p.rank&&"definition"in proficiency&&"definition"in p&&proficiency.sameAs===p.sameAs&&equals(p.definition??[],[...proficiency.definition??[]])?k:[]);for(const duplicate2 of duplicates)delete proficiencies[duplicate2];const proficiencyBonus=createProficiencyModifier({actor:this,rank:proficiency.rank,domains:[]});proficiency.value=proficiencyBonus.value,proficiency.breakdown=`${proficiencyBonus.label} ${signedInteger(proficiencyBonus.value)}`}}}async toggleInvested(itemId){const item=this.inventory.get(itemId);if(!item?.traits.has("invested"))throw ErrorPF2e("Unexpected error toggling item investment");const invested=item.isInvested;if(!invested&&!item.isEquipped){const newCarryType=item.system.usage.type==="carried"?"worn":item.system.usage.type;await this.adjustCarryType(item,{carryType:newCarryType,handsHeld:item.system.usage.hands,inSlot:!0})}return!!await item.update({"system.equipped.invested":!invested})}async addAttackProficiency(key){const currentProficiencies=this.system.proficiencies.attacks;if(key in currentProficiencies)return;const newProficiency={rank:1,custom:!0};await this.update({[`system.proficiencies.attacks.${key}`]:newProficiency})}async _preUpdate(changed,options,user){const systemData=this.system;if(typeof changed.system?.resources?.crafting?.infusedReagents?.value=="number"&&(changed.system.resources.crafting.infusedReagents.value=Math.max(0,Math.floor(changed.system.resources.crafting.infusedReagents.value))||0),changed.system?.details?.level||changed.system?.build?.attributes){const level=changed.system?.details?.level;typeof level?.value=="number"&&(level.value=Math.clamped(Number(level.value)||0,0,30)||0);const hpMaxDifference=this.clone(changed).hitPoints.max-this.hitPoints.max;if(hpMaxDifference!==0){options.allowHPOverage=!0;const currentHP=this.hitPoints.value,newHP=Math.max(currentHP+hpMaxDifference,currentHP===0?0:1);changed.system=mergeObject(changed.system??{},{attributes:{hp:{value:newHP}}})}}game.settings.get("pf2e","staminaVariant")&&(changed.system?.attributes?.hp?.sp&&(changed.system.attributes.hp.sp.value=Math.floor(Math.clamped(changed.system.attributes.hp.sp?.value??0,0,systemData.attributes.hp.sp?.max??0))||0),changed.system?.resources?.resolve&&(changed.system.resources.resolve.value=Math.floor(Math.clamped(changed.system.resources.resolve.value??0,0,systemData.resources.resolve?.max??0))||0));const xp=changed.system?.details?.xp??{};typeof xp.value=="number"&&(xp.value=Math.max(xp.value,0)),typeof xp.max=="number"&&(xp.max=Math.max(xp.max,1));const newLevel=changed.system?.details?.level?.value??this.level,actorClass=this.class;if(actorClass&&newLevel!==this.level){const current=this.itemTypes.feat.filter(feat=>feat.category==="classfeature");if(newLevel>this.level){const classFeaturesToCreate=(await actorClass.createGrantedItems({level:newLevel})).filter(feature=>feature.system.level.value>this.level&&!current.some(currentFeature=>currentFeature.sourceId===feature.flags.core?.sourceId)).map(i=>i.toObject());await this.createEmbeddedDocuments("Item",classFeaturesToCreate,{keepId:!0,render:!1})}else if(newLevelf.level>newLevel&&!f.grantedBy).map(f=>f.id);await this.deleteEmbeddedDocuments("Item",classFeaturestoDelete,{render:!1})}}for(const property of["playerNumber","characterNumber"])if(typeof changed.system?.pfs?.[property]=="number"){const[min,max]=property==="playerNumber"?[1,9999999]:[2001,9999];changed.system.pfs[property]=Math.clamped(changed.system.pfs[property]||0,min,max)}else changed.system?.pfs&&changed.system.pfs[property]!==null&&(changed.system.pfs[property]=this.system.pfs[property]??null);return super._preUpdate(changed,options,user)}async toggleAttributeManagement(){if(Object.keys(this._source.system.abilities??{}).length===0){const baseAbilities=Array.from(ATTRIBUTE_ABBREVIATIONS).reduce((accumulated,abbrev)=>({...accumulated,[abbrev]:{value:10}}),{});await this.update({"system.abilities":baseAbilities})}else await this.update({"system.-=abilities":null})}};__name2(_CharacterPF2e,"CharacterPF2e");let CharacterPF2e=_CharacterPF2e;const _FamiliarPF2e=class extends CreaturePF2e{static{__name(this,"_FamiliarPF2e")}get allowedItemTypes(){return[...super.allowedItemTypes,"action"]}get master(){if(!game.ready||!this.system.master.id)return null;const master=game.actors.get(this.system.master.id??"");return master?.isOfType("character")?(master.familiar??=this,master):null}get masterAttributeModifier(){return this.system.master.ability||="cha",this.master?.system.abilities[this.system.master.ability].mod??0}get masterAbilityModifier(){return this.masterAttributeModifier}get combatant(){return this.master?.combatant??null}reset({fromMaster=!1}={}){super.reset(),fromMaster&&this.sheet.render()}prepareBaseData(){const systemData=this.system;systemData.details.level={value:0},systemData.traits={value:["minion"],senses:[{type:"lowLightVision",label:CONFIG.PF2E.senses.lowLightVision,value:""}],size:new ActorSizePF2e({value:"tiny"})},super.prepareBaseData();const isItemBonus=new PredicatePF2e(["bonus:type:item"]);this.synthetics.modifierAdjustments.all.push({slug:null,test:options=>isItemBonus.test(options),suppress:!0}),systemData.details.alignment={value:"N"},systemData.attributes.flanking.canFlank=!1,systemData.attributes.perception={},systemData.attributes.speed={value:25,label:game.i18n.localize("PF2E.SpeedTypesLand"),otherSpeeds:[]},systemData.skills={},systemData.saves={fortitude:{},reflex:{},will:{}},systemData.traits=mergeObject(systemData.traits,{dv:[],di:[],dr:[]});const{master}=this;systemData.details.level.value=master?.level??0,this.rollOptions.all[`self:level:${this.level}`]=!0,systemData.details.alliance=master?.alliance??"party",master&&(this.flags.pf2e.rollOptions.all=mergeObject(this.flags.pf2e.rollOptions.all,createEncounterRollOptions(master)))}prepareRuleElements(){return this.master?super.prepareRuleElements():[]}prepareDerivedData(){super.prepareDerivedData();const{master}=this,systemData=this.system,{attributes,traits}=systemData;traits.value=[...this.traits].sort();const{level,masterAttributeModifier}=this,masterLevel=game.settings.get("pf2e","proficiencyVariant")?0:level,{synthetics}=this,speeds=attributes.speed=this.prepareSpeed("land");speeds.otherSpeeds=["burrow","climb","fly","swim"].flatMap(m=>this.prepareSpeed(m)??[]);const hitPoints=new HitPointsStatistic(this,{baseMax:level*5});this.system.attributes.hp=hitPoints.getTraceData(),setHitPointsRollOptions(this);const masterModifier=master?new ModifierPF2e({label:"PF2E.Actor.Familiar.Master.ArmorClass",slug:"base",modifier:master.armorClass.modifiers.filter(m=>m.enabled&&!["status","circumstance"].includes(m.type)).reduce((total,modifier)=>total+modifier.value,0)}):null,statistic=new ArmorStatistic(this,{modifiers:compact([masterModifier])});this.armorClass=statistic.dc,systemData.attributes.ac=statistic.getTraceData(),this.saves=SAVE_TYPES.reduce((partialSaves,saveType)=>{const source=master?.saves[saveType]?.modifiers.filter(m=>!["status","circumstance"].includes(m.type))??[],totalMod=applyStackingRules(source),attribute=CONFIG.PF2E.savingThrowDefaultAttributes[saveType],selectors=[saveType,`${attribute}-based`,"saving-throw","all"],stat=new Statistic(this,{slug:saveType,label:game.i18n.localize(CONFIG.PF2E.saves[saveType]),domains:selectors,modifiers:[new ModifierPF2e(`PF2E.MasterSavingThrow.${saveType}`,totalMod,"untyped")],check:{type:"saving-throw"}});return{...partialSaves,[saveType]:stat}},{}),this.system.saves=SAVE_TYPES.reduce((partial,saveType)=>({...partial,[saveType]:this.saves[saveType].getTraceData()}),{}),traits.senses=this.prepareSenses(this.system.traits.senses,synthetics),this.attackStatistic=new Statistic(this,{slug:"attack-roll",label:"PF2E.Familiar.AttackRoll",modifiers:[new ModifierPF2e("PF2E.MasterLevel",masterLevel,"untyped")],check:{type:"attack-roll"}}),this.system.attack=this.attackStatistic.getTraceData();{const domains=["perception","wis-based","all"],modifiers=[new ModifierPF2e("PF2E.MasterLevel",masterLevel,"untyped"),new ModifierPF2e(`PF2E.MasterAbility.${systemData.master.ability}`,masterAttributeModifier,"untyped")];this.perception=new Statistic(this,{slug:"perception",label:"PF2E.PerceptionLabel",domains,modifiers,check:{type:"perception-check"}}),systemData.attributes.perception=mergeObject(systemData.attributes.perception,this.perception.getTraceData({value:"mod"}))}this.skills=Array.from(SKILL_ABBREVIATIONS).reduce((builtSkills,shortForm)=>{const longForm=SKILL_DICTIONARY[shortForm],modifiers=[new ModifierPF2e("PF2E.MasterLevel",masterLevel,"untyped")];if(["acr","ste"].includes(shortForm)){const label2=`PF2E.MasterAbility.${systemData.master.ability}`;modifiers.push(new ModifierPF2e(label2,masterAttributeModifier,"untyped"))}const attribute=SKILL_EXPANDED[longForm].attribute,domains=[longForm,`${attribute}-based`,"skill-check","all"],label=CONFIG.PF2E.skills[shortForm]??longForm,statistic2=new Statistic(this,{slug:longForm,label,attribute,domains,modifiers,lore:!1,check:{type:"skill-check"}});return builtSkills[longForm]=statistic2,this.system.skills[shortForm]=statistic2.getTraceData(),builtSkills},{})}_onDelete(options,userId){this.master&&(this.master.familiar=null),super._onDelete(options,userId)}};__name2(_FamiliarPF2e,"FamiliarPF2e");let FamiliarPF2e=_FamiliarPF2e;const identifySkills=new Map([["aberration",["occultism"]],["animal",["nature"]],["astral",["occultism"]],["beast",["arcana","nature"]],["celestial",["religion"]],["construct",["arcana","crafting"]],["dragon",["arcana"]],["elemental",["arcana","nature"]],["ethereal",["occultism"]],["fey",["nature"]],["fiend",["religion"]],["fungus",["nature"]],["humanoid",["society"]],["monitor",["religion"]],["ooze",["occultism"]],["plant",["nature"]],["spirit",["occultism"]],["undead",["religion"]]]);function toKnowledgeDC(dc,rarity,loreAdjustment="normal"){const rarityAdjustment=rarityToDCAdjustment(rarity),start=combineDCAdjustments(rarityAdjustment,loreAdjustment),progression=createDifficultyScale(dc,start);return{dc:adjustDC(dc,start),progression,start}}__name(toKnowledgeDC,"toKnowledgeDC"),__name2(toKnowledgeDC,"toKnowledgeDC");function creatureIdentificationDCs(creature,{proficiencyWithoutLevel=!1}={}){const{level,rarity}=creature,dc=calculateDC(level,{proficiencyWithoutLevel}),traits=creature.system.traits.value;return{skills:Array.from(new Set(traits.flatMap(t=>identifySkills.get(t)??[]))),standard:toKnowledgeDC(dc,rarity,"normal"),lore:[toKnowledgeDC(dc,rarity,"easy"),toKnowledgeDC(dc,rarity,"very-easy")]}}__name(creatureIdentificationDCs,"creatureIdentificationDCs"),__name2(creatureIdentificationDCs,"creatureIdentificationDCs");const _NPCPF2e=class extends CreaturePF2e{static{__name(this,"_NPCPF2e")}get allowedItemTypes(){return[...super.allowedItemTypes,"physical","spellcastingEntry","spell","action","melee","lore"]}get baseLevel(){return this._source.system.details.level.value}get abilities(){return deepClone(this.system.abilities)}get description(){return this.system.details.publicNotes}get hardness(){return Math.abs(this.system.attributes.hardness?.value??0)}get isElite(){return this.attributes.adjustment==="elite"}get isWeak(){return this.attributes.adjustment==="weak"}get identificationDCs(){const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant");return creatureIdentificationDCs(this,{proficiencyWithoutLevel})}get isLootable(){const npcsAreLootable=game.settings.get("pf2e","automation.lootableNPCs");return this.isDead&&(npcsAreLootable||this.flags.pf2e.lootable)}get visible(){return super.visible&&this.prototypeToken.actorLink||this.permission>=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER}canUserModify(user,action2){return super.canUserModify(user,action2)||action2==="update"&&this.isLootable}prepareBaseData(){super.prepareBaseData(),this.flags.pf2e.lootable??=!1;const systemData=this.system;systemData.actions=[];for(const key of SAVE_TYPES)systemData.saves[key].ability=CONFIG.PF2E.savingThrowDefaultAttributes[key];const{attributes,details}=systemData;attributes.perception.ability="wis",attributes.reach={base:SIZE_TO_REACH[this.size],manipulate:SIZE_TO_REACH[this.size]},details.alliance===void 0&&(details.alliance=this.hasPlayerOwner?"party":"opposition"),attributes.hp.negativeHealing=systemData.traits.value.includes("undead"),attributes.flanking.flankable=!systemData.traits.value.includes("troop");const{level}=details;level.base=Math.clamped(level.value,-1,100),level.value=this.isElite?level.base+1:this.isWeak?level.base-1:level.base,this.rollOptions.all[`self:level:${level.value}`]=!0,attributes.spellDC=null,attributes.classDC=(()=>{const proficiencyWithoutLevel=game.settings.get("pf2e","proficiencyVariant"),levelBasedDC=calculateDC(level.base,{proficiencyWithoutLevel,rarity:this.rarity});return{value:this.isElite?levelBasedDC+2:this.isWeak?levelBasedDC-2:levelBasedDC}})(),attributes.classOrSpellDC={value:attributes.classDC.value},this.system.spellcasting=mergeObject({rituals:{dc:0}},this.system.spellcasting??{})}prepareDerivedData(){super.prepareDerivedData();const{system}=this,{synthetics}=this,{modifierAdjustments}=synthetics,baseLevel=this.system.details.level.base;this.synthetics.modifiers.hp??=[],this.isElite?(modifierAdjustments.all.push({slug:"base",getNewValue:base=>base+2,test:()=>!0}),this.synthetics.modifiers.hp.push(()=>new ModifierPF2e("PF2E.NPC.Adjustment.EliteLabel",this.getHpAdjustment(baseLevel,"elite"),"untyped"))):this.isWeak&&(modifierAdjustments.all.push({slug:"base",getNewValue:base=>base-2,test:()=>!0}),this.synthetics.modifiers.hp.push(()=>new ModifierPF2e("PF2E.NPC.Adjustment.WeakLabel",this.getHpAdjustment(baseLevel,"weak")*-1,"untyped"))),system.details.level.base=baseLevel;for(const ability of Object.values(this.system.abilities))ability.mod=Math.trunc(Number(ability.mod))||0;{const base=system.attributes.hp.max,modifiers=[extractModifiers(this.synthetics,["hp"],{test:this.getRollOptions(["hp"])}),extractModifiers(this.synthetics,["hp-per-level"],{test:this.getRollOptions(["hp-per-level"])}).map(modifier=>(modifier.modifier*=this.level,modifier))].flat(),hpData=deepClone(system.attributes.hp),stat=mergeObject(new StatisticModifier("hp",modifiers),hpData,{overwrite:!1});stat.base=base,stat.max=stat.max+stat.totalModifier,stat.value=Math.min(stat.value,stat.max),stat.breakdown=[game.i18n.format("PF2E.MaxHitPointsBaseLabel",{base}),...stat.modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${m.modifier<0?"":"+"}${m.modifier}`)].join(", "),system.attributes.hp=stat,setHitPointsRollOptions(this)}const speeds=system.attributes.speed=this.prepareSpeed("land");speeds.otherSpeeds=["burrow","climb","fly","swim"].flatMap(m=>this.prepareSpeed(m)??[]);const armorStatistic=new ArmorStatistic(this,{modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:system.attributes.ac.value-10,adjustments:extractModifierAdjustments(modifierAdjustments,["all","ac","dex-based"],"base")})],details:system.attributes.ac.details});this.armorClass=armorStatistic.dc,this.system.attributes.ac=armorStatistic.getTraceData(),this.prepareSaves();{const domains=["perception","wis-based","all"];this.perception=new Statistic(this,{slug:"perception",label:"PF2E.PerceptionLabel",attribute:"wis",domains,modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:system.attributes.perception.value,adjustments:extractModifierAdjustments(modifierAdjustments,domains,"base")})],check:{type:"perception-check"}}),system.attributes.perception=mergeObject(system.attributes.perception,this.perception.getTraceData({value:"mod"}))}this.skills=this.prepareSkills();const generatedMelee=Array.from(synthetics.strikes.values()).flatMap(w=>w.toNPCAttacks({keepId:!0}));for(const item of[...this.itemTypes.melee,...generatedMelee])system.actions.push(strikeFromMeleeItem(item));this.initiative=new ActorInitiative(this),this.system.attributes.initiative=this.initiative.getTraceData()}prepareSaves(){const systemData=this.system,{modifierAdjustments}=this.synthetics,saves={};for(const saveType of SAVE_TYPES){const save=systemData.saves[saveType],saveName=game.i18n.localize(CONFIG.PF2E.saves[saveType]),base=save.value,ability=save.ability,domains=[saveType,`${ability}-based`,"saving-throw","all"],stat=new Statistic(this,{slug:saveType,label:saveName,domains,modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:base,adjustments:extractModifierAdjustments(modifierAdjustments,domains,"base")})],check:{type:"saving-throw"}});saves[saveType]=stat,mergeObject(this.system.saves[saveType],stat.getTraceData()),systemData.saves[saveType].base=base}this.saves=saves}prepareSkills(){const{system}=this,{modifierAdjustments}=this.synthetics;system.skills={};function createTrace(stat,item){const{attribute,shortForm}=objectHasKey(SKILL_EXPANDED,stat.slug)?SKILL_EXPANDED[stat.slug]:{attribute:"int",shortForm:stat.slug};system.skills[shortForm]={...stat.getTraceData(),base:item?.system.mod.value,isLore:!!stat.lore,itemID:item?.id,ability:attribute,visible:stat.proficient,variants:Object.values(item?.system.variants??{})}}__name(createTrace,"createTrace"),__name2(createTrace,"createTrace");const skills={};for(const skill of SKILL_LONG_FORMS){const{attribute,shortForm}=SKILL_EXPANDED[skill],domains=[skill,`${attribute}-based`,"skill-check",`${attribute}-skill-check`,"all"],name2=game.i18n.localize(`PF2E.Skill${SKILL_DICTIONARY[shortForm].capitalize()}`),statistic=new Statistic(this,{slug:skill,label:name2,attribute,domains,modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:system.abilities[attribute].mod,adjustments:extractModifierAdjustments(modifierAdjustments,domains,"base")})],lore:!1,proficient:!1,check:{type:"skill-check"}});skills[skill]=statistic,createTrace(statistic)}for(const item of this.itemTypes.lore){const skill=sluggify(item.name),attribute=objectHasKey(SKILL_EXPANDED,skill)?SKILL_EXPANDED[skill].attribute:"int",label=objectHasKey(CONFIG.PF2E.skillList,skill)?CONFIG.PF2E.skillList[skill]:item.name,base=item.system.mod.value,domains=[skill,`${attribute}-based`,"skill-check","lore-skill-check",`${attribute}-skill-check`,"all"],statistic=new Statistic(this,{slug:skill,label,attribute,lore:!objectHasKey(SKILL_EXPANDED,skill),domains,modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:base,adjustments:extractModifierAdjustments(modifierAdjustments,domains,"base")})],check:{type:"skill-check"}});skills[skill]=statistic,createTrace(statistic,item)}return skills}async getAttackEffects(attack){const notes=[];attack.description&¬es.push(new RollNotePF2e({selector:"all",visibility:"gm",text:attack.description}));const formatItemName=__name2(item=>{if(item.isOfType("consumable")){const button=createHTMLElement("button",{dataset:{action:"consume",item:item.id}});return button.style.width="auto",button.style.lineHeight="14px",button.innerHTML=game.i18n.localize("PF2E.ConsumableUseLabel"),`${item.name} - ${game.i18n.localize("TYPES.Item.consumable")} (${item.quantity}) ${button.outerHTML}`}return item.name},"formatItemName"),formatNoteText=__name2(item=>{const rollData=item.getRollData();return TextEditor.enrichHTML(item.description,{rollData,async:!0})},"formatNoteText");for(const attackEffect of attack.attackEffects){const item=this.items.find(i=>i.type!=="melee"&&(i.slug??sluggify(i.name))===sluggify(attackEffect));if(item){const note=new RollNotePF2e({selector:"all",visibility:"gm",title:formatItemName(item),text:await formatNoteText(item)});notes.push(note)}else{const packItem=(await game.packs.get("pf2e.bestiary-ability-glossary-srd",{strict:!0}).getDocuments({system:{slug:attackEffect}}))[0];if(packItem instanceof ItemPF2e){const note=new RollNotePF2e({selector:"all",visibility:"gm",title:formatItemName(packItem),text:await formatNoteText(packItem)});notes.push(note)}}}return notes}getHpAdjustment(level,adjustment){if(adjustment==="elite"){if(level>=20)return 30;if(level<=19&&level>=5)return 20;if(level<=4&&level>=2)return 15;if(level<=1)return 10}else if(adjustment==="weak"){if(level>=21)return 30;if(level<=20&&level>=6)return 20;if(level<=5&&level>=3)return 15;if(level===1||level===2)return 10}return 0}async applyAdjustment(adjustment){const{isElite,isWeak}=this;if(isElite&&adjustment==="elite"||isWeak&&adjustment==="weak"||!isElite&&!isWeak&&!adjustment)return;const currentHPAdjustment=(()=>isElite?this.getHpAdjustment(this.baseLevel,"elite"):isWeak?this.getHpAdjustment(this.baseLevel,"weak"):0)(),newHPAdjustment=this.getHpAdjustment(this.baseLevel,adjustment),currentHP=this.system.attributes.hp.value,maxHP=this.system.attributes.hp.max,newHP=(()=>{if(isElite){if(adjustment==="weak")return currentHP-currentHPAdjustment-newHPAdjustment;if(!adjustment)return currentHP-currentHPAdjustment}else if(isWeak){if(adjustment==="elite")return this.system.attributes.hp.max=maxHP+currentHPAdjustment+newHPAdjustment,currentHP+currentHPAdjustment+newHPAdjustment;if(!adjustment)return this.system.attributes.hp.max=maxHP+currentHPAdjustment,currentHP+currentHPAdjustment}else{if(adjustment==="elite")return this.system.attributes.hp.max=currentHP+newHPAdjustment,currentHP+newHPAdjustment;if(adjustment==="weak")return currentHP-newHPAdjustment}return currentHP})();await this.update({"system.attributes.hp.value":Math.max(0,newHP),"system.attributes.adjustment":adjustment})}variantClone(params){const source=this._source,changes={name:params.name??this.name,system:{details:{publicNotes:params.description??source.system.details.publicNotes}},img:params.img?.actor??source.img,prototypeToken:{texture:{src:params.img?.token??source.prototypeToken.texture.src}}};return this.clone(changes,{save:params.save,keepId:params.keepId})}};__name2(_NPCPF2e,"NPCPF2e");let NPCPF2e=_NPCPF2e;const _HazardPF2e=class extends ActorPF2e{static{__name(this,"_HazardPF2e")}get allowedItemTypes(){return[...super.allowedItemTypes,"action","melee"]}get rarity(){return this.system.traits.rarity}get isComplex(){return this.system.details.isComplex}get hardness(){return Math.abs(this.system.attributes.hardness)}get hasDefenses(){return!!(this.hitPoints?.max||this.attributes.ac.value)}get canAttack(){return this.itemTypes.melee.length>0}get emitsSound(){const{emitsSound}=this.system.attributes;return!this.isDead&&typeof emitsSound=="boolean"?emitsSound:!!game.combats.active?.started&&game.combats.active.combatants.some(c=>c.actor===this)}isAffectedBy(effect){const damageType=objectHasKey(CONFIG.PF2E.damageTypes,effect)?effect:isObject(effect)?effect.system.persistent?.damageType??null:null;return!this.system.attributes.hasHealth&&damageType?!1:super.isAffectedBy(effect)}prepareBaseData(){super.prepareBaseData();const{attributes,details}=this.system;if(attributes.hp.negativeHealing=!1,attributes.hp.brokenThreshold=Math.floor(attributes.hp.max/2),attributes.hasHealth=attributes.hp.max>0,attributes.immunities.some(i=>i.type==="object-immunities")||attributes.immunities.unshift(new Immunity({type:"object-immunities",source:"TYPES.Actor.hazard"})),this.isComplex){attributes.stealth.value??=0;const partialAttributes=this.system.attributes;partialAttributes.initiative={statistic:"stealth",tiebreakPriority:this.hasPlayerOwner?2:1}}details.alliance=null}prepareDerivedData(){super.prepareDerivedData();const{system}=this;if(this.prepareSynthetics(),setHitPointsRollOptions(this),this.skills={stealth:new Statistic(this,{slug:"stealth",label:CONFIG.PF2E.skillList.stealth,domains:["stealth","dex-based","skill-check","dex-skill-check","all"],modifiers:[new ModifierPF2e({label:"PF2E.ModifierTitle",slug:"base",type:"untyped",modifier:system.attributes.stealth.value??0})],check:{type:"skill-check"}})},system.attributes.initiative&&(this.initiative=new ActorInitiative(this),system.attributes.initiative=this.initiative.getTraceData()),this.hasDefenses){const baseModifier=new ModifierPF2e({slug:"base",label:"PF2E.BaseModifier",modifier:system.attributes.ac.value-10}),statistic=new ArmorStatistic(this,{rank:1,modifiers:[baseModifier]});this.armorClass=statistic.dc,system.attributes.ac=statistic.getTraceData()}this.saves=this.prepareSaves(),this.system.actions=this.itemTypes.melee.map(m=>strikeFromMeleeItem(m))}prepareSaves(){const{system}=this;return SAVE_TYPES.reduce((saves,saveType)=>{const save=system.saves[saveType],saveName=game.i18n.localize(CONFIG.PF2E.saves[saveType]),base=save.value,ability=CONFIG.PF2E.savingThrowDefaultAttributes[saveType];if(!base)return saves;const selectors=[saveType,`${ability}-based`,"saving-throw","all"],stat=new Statistic(this,{slug:saveType,label:saveName,domains:selectors,modifiers:[new ModifierPF2e("PF2E.BaseModifier",base,"untyped"),...extractModifiers(this.synthetics,selectors)],check:{type:"saving-throw"}});return mergeObject(this.system.saves[saveType],stat.getTraceData()),saves[saveType]=stat,saves},{})}};__name2(_HazardPF2e,"HazardPF2e");let HazardPF2e=_HazardPF2e;const _LootPF2e=class extends ActorPF2e{static{__name(this,"_LootPF2e")}armorClass=null;get allowedItemTypes(){return["physical"]}get isLoot(){return this.system.lootSheetType==="Loot"}get isMerchant(){return this.system.lootSheetType==="Merchant"}get hiddenWhenEmpty(){return this.isLoot&&this.system.hiddenWhenEmpty}get canHostRuleElements(){return!1}get canAct(){return!1}isAffectedBy(){return!1}get visible(){return this.permission>=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER}canUserModify(user,action2){return action2==="update"?this.permission>=CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED:super.canUserModify(user,action2)}async transferItemToActor(targetActor,item,quantity,containerId,newStack=!1){if(!(this.isOwner&&targetActor.isOwner))return super.transferItemToActor(targetActor,item,quantity,containerId,newStack);if(this.isMerchant&&item.isOfType("physical")){const itemValue=CoinsPF2e.fromPrice(item.price,quantity);if(await targetActor.inventory.removeCoins(itemValue))return await item.actor.inventory.addCoins(itemValue),super.transferItemToActor(targetActor,item,quantity,containerId,newStack);if(this.isLoot)throw ErrorPF2e("Loot transfer failed");return null}return super.transferItemToActor(targetActor,item,quantity,containerId,newStack)}async toggleTokenHiding(){if(!this.hiddenWhenEmpty||!this.isOwner)return;const hiddenStatus=this.items.size===0,promises=game.scenes.map(s=>[s,s.tokens.filter(t=>t.actor===this)]).map(([scene,tokenDocs])=>scene.updateEmbeddedDocuments("Token",tokenDocs.map(tokenDoc=>({_id:tokenDoc.id,hidden:hiddenStatus}))));await Promise.allSettled(promises)}prepareDerivedData(){this.rules=[],super.prepareDerivedData()}_onCreate(data,options,userId){game.user.id===userId&&this.toggleTokenHiding(),super._onCreate(data,options,userId)}_onUpdate(changed,options,userId){game.user.id===userId&&changed.system?.hiddenWhenEmpty!==void 0&&this.toggleTokenHiding(),super._onUpdate(changed,options,userId)}_onCreateDescendantDocuments(parent,collection,documents,result,options,userId){game.user.id===userId&&this.toggleTokenHiding(),super._onCreateDescendantDocuments(parent,collection,documents,result,options,userId)}_onDeleteDescendantDocuments(parent,collection,documents,ids,options,userId){game.user.id===userId&&this.toggleTokenHiding(),super._onDeleteDescendantDocuments(parent,collection,documents,ids,options,userId)}};__name2(_LootPF2e,"LootPF2e");let LootPF2e=_LootPF2e;const{DataModel:DataModel$1}=foundry.abstract,_InvalidCampaign=class extends DataModel$1{static{__name(this,"_InvalidCampaign")}type="invalid";actor;options;constructor(actor,options){super(),this.actor=actor,this.options=options}static defineSchema(){return{}}createSidebarButtons(){const icon=createHTMLElement("a",{children:[fontAwesomeIcon("warning",{fixedWidth:!0})]});return icon.title=game.i18n.localize("PF2E.Actor.Party.InvalidCampaign.Hint"),game.user.isGM?icon.addEventListener("click",()=>{new Dialog({title:game.i18n.format("PF2E.Actor.Party.InvalidCampaign.Title",{party:this.actor.name}),content:game.i18n.format(`PF2E.Actor.Party.InvalidCampaign.Message.${this.options.reason}`,{current:this.actor.system.campaign?.type??"",...this.options}),buttons:{yes:{icon:fontAwesomeIcon("trash").outerHTML,label:game.i18n.localize("Yes"),callback:async()=>{await this.actor.update({"system.-=campaign":null}),ui.sidebar.render()}},cancel:{icon:fontAwesomeIcon("times").outerHTML,label:game.i18n.localize("Cancel")}}}).render(!0)}):icon.style.pointerEvents="none",[icon]}};__name2(_InvalidCampaign,"InvalidCampaign");let InvalidCampaign=_InvalidCampaign;function resolveKingdomBoosts(entry,choices){const notFreeBoosts=entry.boosts.filter(b=>b!=="free");return uniq([notFreeBoosts,choices].flat()).filter(b=>b!==entry.flaw).slice(0,entry.boosts.length)}__name(resolveKingdomBoosts,"resolveKingdomBoosts"),__name2(resolveKingdomBoosts,"resolveKingdomBoosts");function calculateKingdomCollectionData(kingdom){const commodityTypes=["luxuries","lumber","ore","stone"];return{formula:`${kingdom.resources.dice.number}d${kingdom.resources.dice.faces}`,commodities:mapToObj(commodityTypes,type=>{const value=kingdom.resources.workSites[type];return[type,value.value+value.resource*2]})}}__name(calculateKingdomCollectionData,"calculateKingdomCollectionData"),__name2(calculateKingdomCollectionData,"calculateKingdomCollectionData");const KINGDOM_ABILITIES=["culture","economy","loyalty","stability"],KINGDOM_LEADERSHIP=["ruler","counselor","general","emissary","magister","treasurer","viceroy","warden"],KINGDOM_COMMODITIES=["food","luxuries","lumber","ore","stone"],KINGDOM_SKILLS=["agriculture","arts","boating","defense","engineering","exploration","folklore","industry","intrigue","magic","politics","scholarship","statecraft","trade","warfare","wilderness"],KINGDOM_LEADERSHIP_ABILITIES={ruler:"loyalty",counselor:"culture",general:"stability",emissary:"loyalty",magister:"culture",treasurer:"economy",viceroy:"economy",warden:"stability"},KINGDOM_SKILL_ABILITIES={agriculture:"stability",arts:"culture",boating:"economy",defense:"stability",engineering:"stability",exploration:"economy",folklore:"culture",industry:"economy",intrigue:"loyalty",magic:"culture",politics:"loyalty",scholarship:"culture",statecraft:"loyalty",trade:"economy",warfare:"loyalty",wilderness:"stability"},KINGDOM_ABILITY_LABELS=mapToObj(KINGDOM_ABILITIES,a=>[a,`PF2E.Kingmaker.Abilities.${a}`]),KINGDOM_COMMODITY_LABELS=mapToObj(KINGDOM_COMMODITIES,c=>[c,`PF2E.Kingmaker.Kingdom.Commodity.${c}`]),KINGDOM_RUIN_LABELS={culture:"PF2E.Kingmaker.Kingdom.Ruin.corruption",economy:"PF2E.Kingmaker.Kingdom.Ruin.crime",stability:"PF2E.Kingmaker.Kingdom.Ruin.decay",loyalty:"PF2E.Kingmaker.Kingdom.Ruin.strife"},KINGDOM_SKILL_LABELS=mapToObj(KINGDOM_SKILLS,a=>[a,`PF2E.Kingmaker.Skills.${a}`]),CONTROL_DC_BY_LEVEL=[14,15,16,18,20,22,23,24,26,27,28,30,31,32,34,35,36,38,39,40],KINGDOM_SIZE_DATA={1:{faces:4,type:"territory",controlMod:0,storage:4},10:{faces:6,type:"province",controlMod:1,storage:8},25:{faces:8,type:"state",controlMod:2,storage:12},50:{faces:10,type:"country",controlMod:3,storage:16},100:{faces:12,type:"dominion",controlMod:4,storage:20}},KINGDOM_SETTLEMENT_TYPES=["village","town","city","metropolis"],KINGDOM_SETTLEMENT_TYPE_LABELS=mapToObj(KINGDOM_SETTLEMENT_TYPES,size=>[size,`PF2E.Kingmaker.Settlement.Type.${size}`]),KINGDOM_SETTLEMENT_TYPE_DATA={village:{blocks:1,population:[0,400],level:[1,1],consumption:1,maxItemBonus:1,influence:0},town:{blocks:4,population:[401,2e3],level:[2,4],consumption:2,maxItemBonus:1,influence:1},city:{blocks:9,population:[2001,25e3],level:[5,9],consumption:4,maxItemBonus:2,influence:2},metropolis:{blocks:1/0,population:[25001,1/0],level:[10,1/0],consumption:6,maxItemBonus:3,influence:3}},vacancyLabel=__name2(role=>game.i18n.format("PF2E.Kingmaker.Kingdom.VacantRole",{role:game.i18n.localize(`PF2E.Kingmaker.Kingdom.LeadershipRole.${role}`)}),"vacancyLabel"),VACANCY_PENALTIES={ruler:()=>({modifiers:{"kingdom-check":[{slug:"vacancy-ruler",label:vacancyLabel("ruler"),modifier:-1}],"control-dc":[{slug:"vacancy-ruler",label:vacancyLabel("ruler"),modifier:2}]}}),counselor:()=>({modifiers:{"culture-based":[{slug:"vacancy",label:vacancyLabel("counselor"),modifier:-1}]}}),general:()=>({modifiers:{warfare:[{slug:"vacancy",label:vacancyLabel("general"),modifier:0}]},adjustments:{warfare:[{slug:"vacancy",test:()=>!0,relabel:vacancyLabel("general"),getNewValue:()=>-4}]}}),emissary:()=>({modifiers:{"loyalty-based":[{slug:"vacancy",label:vacancyLabel("emissary"),modifier:-1}]}}),magister:()=>({modifiers:{warfare:[{slug:"vacancy",label:vacancyLabel("magister"),modifier:0}]},adjustments:{warfare:[{slug:"vacancy",test:()=>!0,relabel:vacancyLabel("magister"),getNewValue:()=>-4}]}}),treasurer:()=>({modifiers:{"economy-based":[{slug:"vacancy",label:vacancyLabel("treasurer"),modifier:-1}]}}),viceroy:()=>({modifiers:{"stability-based":[{slug:"vacancy",label:vacancyLabel("viceroy"),modifier:-1}]}}),warden:()=>({modifiers:{"kingdom-check":[{slug:"vacancy",label:vacancyLabel("warden"),modifier:0}]},adjustments:{"kingdom-check":[{slug:"vacancy",test:options=>[...options].includes("region"),relabel:vacancyLabel("warden"),getNewValue:()=>-4}]}})};function getKingdomCHGData(){const localize=localizer("PF2E.Kingmaker");return{charter:{conquest:{name:localize("Charter.conquest.Name"),description:localize("Charter.conquest.Description"),img:"/icons/weapons/swords/sword-guard-steel-green.webp",boosts:["loyalty","free"],flaw:"culture"},expansion:{name:localize("Charter.expansion.Name"),description:localize("Charter.expansion.Description"),img:"/icons/skills/trades/woodcutting-logging-axe-stump.webp",boosts:["culture","free"],flaw:"stability"},exploration:{name:localize("Charter.exploration.Name"),description:localize("Charter.exploration.Description"),img:"/icons/tools/navigation/map-chart-tan.webp",boosts:["stability","free"],flaw:"economy"},grant:{name:localize("Charter.grant.Name"),description:localize("Charter.grant.Description"),img:"/icons/skills/trades/academics-merchant-scribe.webp",boosts:["economy","free"],flaw:"loyalty"},open:{name:localize("Charter.open.Name"),description:localize("Charter.open.Description"),img:"/icons/sundries/documents/document-sealed-brown-red.webp",boosts:["free"],flaw:null}},heartland:{forestOrSwamp:{name:localize("Heartland.forestOrSwamp.Name"),description:localize("Heartland.forestOrSwamp.Description"),img:"/icons/environment/wilderness/tree-oak.webp",boosts:["culture"]},hillOrPlain:{name:localize("Heartland.hillOrPlain.Name"),description:localize("Heartland.hillOrPlain.Description"),img:"/icons/environment/creatures/horses.webp",boosts:["loyalty"]},lakeOrRiver:{name:localize("Heartland.lakeOrRiver.Name"),description:localize("Heartland.lakeOrRiver.Description"),img:"/icons/environment/settlement/bridge-stone.webp",boosts:["economy"]},mountainOrRuins:{name:localize("Heartland.mountainOrRuins.Name"),description:localize("Heartland.mountainOrRuins.Description"),img:"/icons/environment/wilderness/cave-entrance-mountain.webp",boosts:["stability"]}},government:{despotism:{name:localize("Government.despotism.Name"),description:localize("Government.despotism.Description"),img:"/icons/environment/settlement/pyramid.webp",boosts:["stability","economy","free"],skills:["intrigue","warfare"],feat:"Compendium.pf2e.kingmaker-features.Item.WGpkcIChjIk1i0q0"},feudalism:{name:localize("Government.feudalism.Name"),description:localize("Government.feudalism.Description"),img:"/icons/environment/settlement/watchtower-cliff.webp",boosts:["stability","culture","free"],skills:["defense","trade"],feat:"Compendium.pf2e.kingmaker-features.Item.JYY8vQxPe9AIGTvv"},oligarchy:{name:localize("Government.oligarchy.Name"),description:localize("Government.oligarchy.Description"),img:"/icons/environment/settlement/house-manor.webp",boosts:["loyalty","economy","free"],skills:["arts","industry"],feat:"Compendium.pf2e.kingmaker-features.Item.9dkyZ7r1z7loOxI7"},republic:{name:localize("Government.republic.Name"),description:localize("Government.republic.Description"),img:"/icons/environment/settlement/gazebo.webp",boosts:["stability","economy","free"],skills:["engineering","politics"],feat:"Compendium.pf2e.kingmaker-features.Item.BChcBEZpcqMnLISC"},thaumocracy:{name:localize("Government.thaumocracy.Name"),description:localize("Government.thaumocracy.Description"),img:"/icons/environment/settlement/wizard-castle.webp",boosts:["economy","culture","free"],skills:["folklore","magic"],feat:"Compendium.pf2e.kingmaker-features.Item.nDDEbrWj2JouxlRw"},yeomanry:{name:localize("Government.yeomanry.Name"),description:localize("Government.yeomanry.Description"),img:"/icons/environment/settlement/house-farmland-small.webp",boosts:["loyalty","culture","free"],skills:["agriculture","wilderness"],feat:"Compendium.pf2e.kingmaker-features.Item.WFng3pxgEAdpdy1p"}}}}__name(getKingdomCHGData,"getKingdomCHGData"),__name2(getKingdomCHGData,"getKingdomCHGData");const KINGDOM_TRAITS=["commerce","leadership","region","civic","army"],_KingdomSheetPF2e=class extends ActorSheetPF2e{static{__name(this,"_KingdomSheetPF2e")}constructor(actor,options){super(actor,options),__privateAdd(this,_prepareSettlement),__privateAdd(this,_activateSettlementEvents),__privateAdd(this,_getFeatSlotData2),__publicField(this,"selectedFilter",null),__publicField(this,"focusElement",null),__privateAdd(this,_editingSettlements,{})}get kingdom(){const campaign=this.actor.campaign;if(!(campaign instanceof Kingdom))throw this.close(),ErrorPF2e("Only actors with kingdom data is supported");return campaign}get title(){return this.kingdom.name}static get defaultOptions(){const options=super.defaultOptions;return{...options,classes:[...options.classes,"kingdom"],width:720,height:620,template:"systems/pf2e/templates/actors/party/kingdom/sheet.hbs",scrollY:[...options.scrollY,".tab.active",".tab.active .content",".sidebar"],tabs:[{navSelector:"form > nav",contentSelector:".container",initial:"main"}]}}_getHeaderButtons(){const buttons=super._getHeaderButtons();return game.user.isGM&&buttons.unshift({label:"JOURNAL.ActionShow",class:"show-sheet",icon:"fas fa-eye",onclick:()=>{const users=game.users.filter(u=>!u.isSelf);game.socket.emit("system.pf2e",{request:"showSheet",users:users.map(u=>u.uuid),document:this.actor.uuid,options:{campaign:!0,tab:this._tabs[0].active}})}}),buttons}async getData(options){const data=await super.getData(options),kingdom=this.kingdom,settlementEntries=pipe(Object.entries(this.kingdom.settlements),filter(entry=>!!entry[1]),sortBy$1(entry=>entry[1].sort));return{...data,actor:this.actor,kingdom:this.kingdom,nationTypeLabel:game.i18n.localize(`PF2E.Kingmaker.Kingdom.NationType.${kingdom.nationType}`),abilities:KINGDOM_ABILITIES.map(slug=>({...this.kingdom.abilities[slug],slug,label:game.i18n.localize(KINGDOM_ABILITY_LABELS[slug]),ruinLabel:game.i18n.localize(KINGDOM_RUIN_LABELS[slug])})),commodities:KINGDOM_COMMODITIES.map(type=>({...kingdom.resources.commodities[type],type,label:game.i18n.localize(KINGDOM_COMMODITY_LABELS[type]),workSites:{label:game.i18n.localize(`PF2E.Kingmaker.WorkSites.${type}.Name`),description:game.i18n.localize(`PF2E.Kingmaker.WorkSites.${type}.Description`),hasResource:["lumber","ore","stone"].includes(type),value:kingdom.resources.workSites[type].value,resource:kingdom.resources.workSites[type].resource}})),resourceDice:{...kingdom.resources.dice,icon:fontAwesomeIcon(`dice-d${kingdom.resources.dice.faces}`).outerHTML,bonusAdjustment:getAdjustment(kingdom.resources.dice.bonus,kingdom._source.resources.dice.bonus).adjustmentClass,penaltyAdjustment:getAdjustment(kingdom.resources.dice.penalty,kingdom._source.resources.dice.penalty).adjustmentClass},leadership:KINGDOM_LEADERSHIP.map(slug=>{const data2=this.kingdom.leadership[slug],document2=fromUuidSync(data2.uuid??""),actor=document2 instanceof ActorPF2e?document2:null;return{...data2,slug,label:game.i18n.localize(`PF2E.Kingmaker.Kingdom.LeadershipRole.${slug}`),actor,img:actor?.prototypeToken.texture.src??actor?.img??ActorPF2e.DEFAULT_ICON,abilityLabel:game.i18n.localize(KINGDOM_ABILITY_LABELS[KINGDOM_LEADERSHIP_ABILITIES[slug]]),penaltyLabel:game.i18n.localize(`PF2E.Kingmaker.Kingdom.VacancyPenalty.${slug}`)}}),actions:sortBy$1(kingdom.activities,a=>a.name).map(item=>({item,traits:createSheetTags(CONFIG.PF2E.kingmakerTraits,item.system.traits.value.filter(t=>t!=="downtime"))})),skills:sortBy$1(Object.values(this.kingdom.skills),s=>s.label),feats:[kingdom.features,kingdom.feats,kingdom.bonusFeats],actionFilterChoices:KINGDOM_TRAITS.map(trait=>({label:game.i18n.localize(CONFIG.PF2E.kingmakerTraits[trait]),value:trait,selected:!1})),settlements:await Promise.all(settlementEntries.map(async([id,data2])=>__privateMethod(this,_prepareSettlement,prepareSettlement_fn).call(this,id,data2))),eventText:await TextEditor.enrichHTML(kingdom.event.text,{async:!0,rollData:this.actor.getRollData()}),settlementTypes:KINGDOM_SETTLEMENT_TYPE_LABELS,abilityLabels:KINGDOM_ABILITY_LABELS,skillLabels:KINGDOM_SKILL_LABELS}}activateListeners($html){super.activateListeners($html);const html=$html[0];this.focusElement&&(htmlQuery(html,this.focusElement)?.focus(),this.focusElement=null);for(const openSheetLink of htmlQueryAll(html,"[data-action=open-sheet]")){const actorUUID=htmlClosest(openSheetLink,"[data-actor-uuid]")?.dataset.actorUuid,actor=fromUuidSync(actorUUID??"");openSheetLink.addEventListener("click",()=>actor?.sheet.render(!0))}for(const button of htmlQueryAll(html,"[data-action=builder]")){const tab=button.dataset.tab??null;button.addEventListener("click",()=>{new KingdomBuilder(this.kingdom).render(!0,{tab})})}const{fame}=this.kingdom.resources,famePips=htmlQuery(html,"[data-action=adjust-fame]");famePips?.addEventListener("click",async()=>{const newValue=Math.min(fame.value+1,fame.max);await this.kingdom.update({"resources.fame.value":newValue})}),famePips?.addEventListener("contextmenu",async event=>{event.preventDefault();const newValue=Math.max(fame.value-1,0);await this.kingdom.update({"resources.fame.value":newValue})});for(const leader of htmlQueryAll(html,".leader[data-role]")){const{role,uuid}=leader.dataset;if(htmlQuery(leader,"[data-action=remove-leader]")?.addEventListener("click",()=>{this.kingdom.update({[`leadership.${role}`]:null})}),uuid)for(const clickable of htmlQueryAll(leader,"[data-action=open-sheet]"))clickable.addEventListener("click",()=>fromUuid(uuid).then(a=>a?.sheet.render(!0)));const vacantEl=htmlQuery(leader,".vacant[title]");if(vacantEl){const lines=vacantEl.title.split(/;\s*/).map(l=>createHTMLElement("li",{children:[l]})),content=createHTMLElement("ul",{children:lines});$(vacantEl).tooltipster({content,contentAsHTML:!0,side:"right",theme:"crb-hover"})}}for(const rollableStat of htmlQueryAll(html,".rollable")){const statSlug=htmlClosest(rollableStat,"[data-statistic]")?.dataset.statistic;statSlug&&rollableStat.addEventListener("click",event=>{this.actor.getStatistic(statSlug)?.roll(eventToRollParams(event))})}htmlQuery(html,"[data-action=collect]")?.addEventListener("click",async()=>{ChatMessagePF2e.create({speaker:{...ChatMessagePF2e.getSpeaker(this.actor),alias:this.kingdom.name},content:await renderTemplate("systems/pf2e/templates/actors/party/kingdom/collection.hbs",{...calculateKingdomCollectionData(this.kingdom)})})}),this.filterActions(this.selectedFilter,{instant:!0}),htmlQuery(html,".filters")?.addEventListener("click",event=>{const filterButton=htmlClosest(event.target,".choice");filterButton&&this.filterActions(filterButton.dataset.slug??null)}),$html.find("[data-tooltip-content]").tooltipster({trigger:"click",arrow:!1,contentAsHTML:!0,debug:!1,interactive:!0,side:["right","bottom"],theme:"crb-hover",minWidth:120});for(const customModifierEl of htmlQueryAll(html,".modifiers-tooltip")){const stat=customModifierEl.dataset.stat;if(!stat)continue;for(const removeButton of htmlQueryAll(customModifierEl,"[data-action=remove-modifier]")){const slug=removeButton.dataset.slug??"";removeButton.addEventListener("click",()=>{this.kingdom.removeCustomModifier(stat,slug)})}const modifierValueEl=htmlQuery(customModifierEl,".add-modifier input[type=number]");htmlQuery(customModifierEl,"[data-action=increment]")?.addEventListener("click",()=>{modifierValueEl?.stepUp()}),htmlQuery(customModifierEl,"[data-action=decrement]")?.addEventListener("click",()=>{modifierValueEl?.stepDown()}),htmlQuery(customModifierEl,"[data-action=create-custom-modifier]")?.addEventListener("click",()=>{const modifier=modifierValueEl?.valueAsNumber||1,type=htmlQuery(customModifierEl,".add-modifier-type")?.value??"",label=htmlQuery(customModifierEl,".add-modifier-name")?.value?.trim()??game.i18n.localize(`PF2E.ModifierType.${type}`);if(!setHasElement(MODIFIER_TYPES,type)){ui.notifications.error("Type is required.");return}this.kingdom.addCustomModifier(stat,{label,modifier,type})})}htmlQuery(html,"[data-action=add-settlement]")?.addEventListener("click",()=>{const id=randomID(16);__privateGet(this,_editingSettlements)[id]=!0,this.focusElement=`[name="settlements.${id}.name"]`,this.kingdom.update({[`settlements.${id}`]:{}})});for(const settlementElement of htmlQueryAll(html,".settlement"))__privateMethod(this,_activateSettlementEvents,activateSettlementEvents_fn).call(this,settlementElement);for(const link of htmlQueryAll(html,"[data-action=browse-feats]")){const maxLevel=Number(link.dataset.level)||this.kingdom.level;link.addEventListener("click",async()=>{const compendiumTab=game.pf2e.compendiumBrowser.tabs.campaignFeature,filter2=await compendiumTab.getFilterData(),levels=filter2.sliders.level;levels.values.max=Math.min(maxLevel,levels.values.upperLimit),levels.isExpanded=levels.values.max!==levels.values.upperLimit,filter2.checkboxes.category.options["kingdom-feat"].selected=!0,filter2.checkboxes.category.selected.push("kingdom-feat"),filter2.checkboxes.category.isExpanded=!0,compendiumTab.open(filter2)})}htmlQuery(html,"[data-action=random-event]")?.addEventListener("click",()=>{new Statistic(this.actor,{slug:"random-event",label:"Random Kingdom Event",check:{type:"flat-check"}}).roll({dc:this.kingdom.event.dc})}),htmlQuery(html,"[data-action=reset-event-dc]")?.addEventListener("click",()=>{this.kingdom.update({event:{dc:16}})});const settlementList=htmlQuery(html,".settlement-list");settlementList&&Sortable.create(settlementList,{...SORTABLE_DEFAULTS,handle:".drag-handle",onEnd:event=>{const settlements=this.kingdom.settlements,settlementsWithIds=Object.entries(settlements).map(([id,value])=>({id,...value})),settlement=settlementsWithIds.find(s=>s.id===event.item.dataset.settlementId),newIndex=event.newDraggableIndex;if(!settlement||newIndex===void 0){this.render();return}const siblings=sortBy$1(settlementsWithIds.filter(s=>s!==settlement),s=>s.sort);siblings.splice(newIndex,0,settlement);const updates=mapToObj.indexed(siblings,(s,index)=>[`settlements.${s.id}.sort`,index]);this.kingdom.update(updates)}})}filterActions(trait,options={}){const html=this.element.get(0),duration=.4;this.selectedFilter=trait;const animateElement=__name2((element,visible)=>{options.instant?element.hidden=!visible:visible&&element.hidden?gsap.fromTo(element,{height:0,opacity:0,hidden:!1},{height:"auto",opacity:1,duration}):!visible&&!element.hidden&&gsap.to(element,{height:0,duration,opacity:0,paddingTop:0,paddingBottom:0,margin:0,clearProps:"all",onComplete:()=>{element.hidden=!0,this.itemRenderer.toggleSummary(element,{visible:!1,instant:!0})}})},"animateElement");for(const action2 of this.kingdom.activities){const element=htmlQuery(html,`[data-item-id="${action2.id}"]`),visible=!trait||tupleHasValue(action2.system.traits.value,trait);element&&animateElement(element,visible)}for(const summary of htmlQueryAll(html,".phase-summary"))animateElement(summary,summary.dataset.phase===trait);for(const choice of htmlQueryAll(html,".filters .choice")){const active=choice.dataset.slug?choice.dataset.slug===trait:trait===null;choice.classList.toggle("active",active)}const actionsList=htmlQuery(html,".actions-list");actionsList&&(actionsList.scrollTop=0)}async _onDropItem(event,data){const item=await ItemPF2e.fromDropData(data);if(!item)throw ErrorPF2e("Unable to create item from drop data!");if(this.actor.uuid===item.parent?.uuid)return super._onDropItem(event,data);if(item?.isOfType("campaignFeature")&&(item.isFeat||item.isFeature)){const slotData=__privateMethod(this,_getFeatSlotData2,getFeatSlotData_fn2).call(this,event)??{groupId:"bonus",slotId:null};return(slotData.groupId==="bonus"?this.kingdom.bonusFeats:this.kingdom.feats).insertFeat(item,slotData.slotId)}return super._onDropItem(event,data)}async _onSortItem(event,itemSource){const item=this.actor.items.get(itemSource._id);if(item?.isOfType("campaignFeature")&&(item.isFeat||item.isFeature)){const featSlot=__privateMethod(this,_getFeatSlotData2,getFeatSlotData_fn2).call(this,event);if(!featSlot)return[];const group=featSlot.groupId==="bonus"?this.kingdom.bonusFeats:this.kingdom.feats,resorting=item.group===group&&!group?.slotted;if(group?.slotted&&!featSlot.slotId)return[];if(!resorting)return group.insertFeat(item,featSlot.slotId)}return super._onSortItem(event,itemSource)}async _onDropActor(event,data){await super._onDropActor(event,data);const actor=fromUuidSync(data.uuid),closestLeader=htmlClosest(event.target,".leader[data-role]");if(actor instanceof CreaturePF2e&&closestLeader){const role=String(closestLeader.dataset.role),uuid=actor.uuid;this.kingdom.update({leadership:{[role]:{uuid}}})}}_disableFields(form){for(const gmOnlyField of htmlQueryAll(form,"input, textarea, [data-access=owner]"))gmOnlyField instanceof HTMLTextAreaElement?gmOnlyField.readOnly=!0:(gmOnlyField instanceof HTMLInputElement||gmOnlyField instanceof HTMLButtonElement)&&(gmOnlyField.disabled=!0)}async _updateObject(_event,formData){if(!this.actor.id)return;const data=expandObject(formData);for(const abilitySlug of KINGDOM_ABILITIES){const ability=data.abilities?.[abilitySlug];ability?.penalty&&(ability.penalty=-Math.abs(ability.penalty))}return this.kingdom.update(data)}};_editingSettlements=new WeakMap,_prepareSettlement=new WeakSet,prepareSettlement_fn=__name2(async function(id,settlement){const data=KINGDOM_SETTLEMENT_TYPE_DATA[settlement.type],levelRange=data.level[1]===1/0?`${data.level[0]}+`:data.level[0]===data.level[1]?String(data.level[0]):data.level.join("-"),populationRange=data.population[1]===1/0?`${data.population[0]}+`:data.population.join("-");return{...settlement,id,description:await TextEditor.enrichHTML(settlement.description,{async:!0,rollData:this.actor.getRollData()}),editing:__privateGet(this,_editingSettlements)[id]??!1,blocks:data.blocks===1/0?"10+":data.blocks,populationRange,levelRange,typeLabel:KINGDOM_SETTLEMENT_TYPE_LABELS[settlement.type],storage:KINGDOM_COMMODITIES.map(type=>({type,value:settlement.storage[type],label:game.i18n.localize(KINGDOM_COMMODITY_LABELS[type])}))}},"#prepareSettlement"),_activateSettlementEvents=new WeakSet,activateSettlementEvents_fn=__name2(function(settlementElement){const id=settlementElement.dataset.settlementId??null;if(id===null)return;const rerenderSettlement=__name2(async()=>{const settlement=this.kingdom.settlements[id];if(!settlement)return;const newHTML=await renderTemplate("systems/pf2e/templates/actors/party/kingdom/partials/settlement.hbs",{...await this.getData(),settlement:await __privateMethod(this,_prepareSettlement,prepareSettlement_fn).call(this,id,settlement)}),newElement=createHTMLElement("div",{innerHTML:newHTML}).firstElementChild;newElement instanceof HTMLElement&&(newElement.classList.toggle("expanded",settlementElement.classList.contains("expanded")),settlementElement.replaceWith(newElement),__superGet(_KingdomSheetPF2e.prototype,this,"activateListeners").call(this,$(newElement)),__privateMethod(this,_activateSettlementEvents,activateSettlementEvents_fn).call(this,newElement),__privateGet(this,_editingSettlements)[id]&&!newElement.classList.contains("expanded")&&this.itemRenderer.toggleSummary(newElement,{visible:!0}))},"rerenderSettlement");htmlQuery(settlementElement,"[data-action=edit-settlement]")?.addEventListener("click",()=>{__privateGet(this,_editingSettlements)[id]=!0,rerenderSettlement()}),htmlQuery(settlementElement,"[data-action=finish-settlement]")?.addEventListener("click",async()=>{__privateGet(this,_editingSettlements)[id]=!1,await this.saveEditor(`settlements.${id}.description`),rerenderSettlement()}),htmlQuery(settlementElement,"[data-action=delete-settlement]")?.addEventListener("click",async event=>{const settlement=this.kingdom.settlements[id];if(!settlement)return;(event?.ctrlKey||await Dialog.confirm({title:game.i18n.localize("PF2E.DeleteItemTitle"),content:`

    ${game.i18n.format("PF2E.DeleteQuestion",{name:`"${settlement.name}"`})}

    `}))&&this.kingdom.update({[`settlements.-=${id}`]:null})})},"#activateSettlementEvents"),_getFeatSlotData2=new WeakSet,getFeatSlotData_fn2=__name2(function(event){const groupId=event.target?.closest("[data-category-id]")?.dataset.categoryId,slotId=event.target?.closest("[data-slot-id]")?.dataset.slotId;return typeof groupId=="string"?{slotId,groupId}:null},"#getFeatSlotData"),__name2(_KingdomSheetPF2e,"KingdomSheetPF2e");let KingdomSheetPF2e=_KingdomSheetPF2e;const KINGDOM_BUILD_CATEGORIES=["charter","heartland","government"],KINGDOM_BOOST_LEVELS=[1,5,10,15,20],_KingdomBuilder=class _KingdomBuilder2 extends FormApplication{static{__name(this,"_KingdomBuilder")}constructor(kingdom){super(kingdom),__privateAdd(this,_prepareAbilityBuilder),__publicField(this,"selected",{charter:null,heartland:null,government:null}),kingdom.actor.apps[this.appId]=this}static get defaultOptions(){return{...super.defaultOptions,classes:["sheet","kingdom-builder"],title:game.i18n.localize("PF2E.Kingmaker.KingdomBuilder.Title"),template:"systems/pf2e/templates/actors/party/kingdom/builder.hbs",width:560,height:"auto",submitOnChange:!0,closeOnSubmit:!1,tabs:[{navSelector:"form > nav",contentSelector:".container",initial:"main"}]}}static showToPlayers(options){const users=game.users.filter(u=>!u.isSelf);game.socket.emit("system.pf2e",{request:"showSheet",users:users.map(u=>u.uuid),document:options.uuid,options:{campaign:"builder",tab:options.tab}})}get id(){return`kingdom-builder-${this.actor.id}`}get kingdom(){return this.object}get actor(){return this.object.actor}get isEditable(){return this.actor.isOwner}_getHeaderButtons(){const buttons=super._getHeaderButtons();return game.user.isGM&&(buttons.unshift({label:"JOURNAL.ActionShow",class:"show-sheet",icon:"fa-solid fa-eye",onclick:()=>{_KingdomBuilder2.showToPlayers({uuid:this.actor.uuid,tab:this._tabs[0].active})}}),this.kingdom.active==="building"&&buttons.unshift({label:"PF2E.Kingmaker.KingdomBuilder.CancelCreation",class:"cancel",icon:"fa-solid fa-times",onclick:async()=>{await this.kingdom.update({active:!1})}})),buttons}async getData(){const database=getKingdomCHGData(),getActiveForCategory=__name2(category=>{const active=this.kingdom.build[category];return active?active?.id??Object.entries(database[category]).find(([_,entry])=>entry?.name===active.name)?.[0]??null:null},"getActiveForCategory");for(const category of KINGDOM_BUILD_CATEGORIES)this.selected[category]??=getActiveForCategory(category);const categories=await pipe(KINGDOM_BUILD_CATEGORIES,map(async category=>{const selected=this.selected[category],entries=database[category],buildEntry=entries[selected??""]??Object.values(entries)[0],featItem=await(async()=>{try{return buildEntry?.feat?await fromUuid(buildEntry.feat):null}catch(ex){return console.error(ex),null}})(),result={selected,active:getActiveForCategory(category),buildEntry,featLink:featItem?await TextEditor.enrichHTML(featItem.link,{async:!0}):null,stale:!equals(buildEntry,this.kingdom.build[category])};return[category,result]}),items=>Promise.all(items).then(result=>fromPairs(result))),{build}=this.kingdom,finished=!!(build.charter&&build.heartland&&build.government);return{options:{editable:this.isEditable},kingdom:this.kingdom,database,categories,abilityLabels:KINGDOM_ABILITY_LABELS,skillLabels:KINGDOM_SKILL_LABELS,build:__privateMethod(this,_prepareAbilityBuilder,prepareAbilityBuilder_fn).call(this),finished}}activateListeners($html){super.activateListeners($html);const html=$html[0];for(const categoryEl of htmlQueryAll(html,"[data-category]")){const category=categoryEl.dataset.category??null;if(!tupleHasValue(KINGDOM_BUILD_CATEGORIES,category))continue;for(const choiceElement of htmlQueryAll(categoryEl,".choice"))choiceElement.addEventListener("click",evt=>{const slug=htmlClosest(evt.target,"[data-slug]")?.dataset.slug;category&&objectHasKey(this.selected,category)&&(this.selected[category]=slug??null,this.render())});const saveCategory=__name2(async()=>{const database=getKingdomCHGData(),id=this.selected[category]??"",selected=database[category][id];selected&&(this.selected[category]=null,await this.kingdom.update({[`build.${category}`]:{id,...selected},[`build.boosts.${category}`]:[]}))},"saveCategory");htmlQuery(categoryEl,"[data-action=set]")?.addEventListener("click",()=>{saveCategory()}),htmlQuery(categoryEl,"[data-action=save-and-continue]")?.addEventListener("click",async event=>{event.preventDefault(),event.stopPropagation(),await saveCategory();const activeTab=this._tabs[0].active,idx=KINGDOM_BUILD_CATEGORIES.indexOf(activeTab),newTab=KINGDOM_BUILD_CATEGORIES[idx+1]??"ability";this._tabs[0].activate(newTab,{triggerCallback:!0})})}for(const button of htmlQueryAll(html,".ability-builder [data-section] .boost")){const sectionId=htmlClosest(button,"[data-section]")?.dataset.section,ability=htmlClosest(button,"[data-ability]")?.dataset.ability;!tupleHasValue(KINGDOM_ABILITIES,ability)||!tupleHasValue(KINGDOM_BUILD_CATEGORIES,sectionId)||button.addEventListener("click",()=>{const object=this.kingdom[sectionId],current=this.kingdom.build.boosts[sectionId],maxBoosts=object?.boosts.length;if(!object)return;const boosts=(current.includes(ability)?current.filter(a=>a!==ability):[...current,ability]).filter(a=>!object.boosts.includes(a)&&object.flaw!==a).slice(0,maxBoosts);this.kingdom.update({[`build.boosts.${sectionId}`]:boosts})})}for(const button of htmlQueryAll(html,".ability-builder [data-level] .boost")){const level=Number(htmlClosest(button,"[data-level]")?.dataset.level),ability=htmlClosest(button,"[data-ability]")?.dataset.ability;!tupleHasValue(KINGDOM_ABILITIES,ability)||!tupleHasValue(KINGDOM_BOOST_LEVELS,level)||button.addEventListener("click",()=>{const current=this.kingdom.build.boosts[level],boosts=(current.includes(ability)?current.filter(a=>a!==ability):[...current,ability]).slice(0,2);this.kingdom.update({[`build.boosts.${level}`]:boosts})})}htmlQuery(html,"[data-action=complete]")?.addEventListener("click",async()=>{this.close(),await this.kingdom.update({active:!0}),await this.kingdom.importActivities(),new KingdomSheetPF2e(this.actor).render(!0)})}async _updateObject(_event,formData){if(this.actor.id)return this.object.update(formData)}async _render(force,options){if(this.kingdom.active===!1){this.close({force:!0});return}await super._render(force,options),options?.tab&&this._tabs.at(0)?.activate(options.tab,{triggerCallback:!0})}};_prepareAbilityBuilder=new WeakSet,prepareAbilityBuilder_fn=__name2(function(){function createButtons(){return Array.from(KINGDOM_ABILITIES).reduce((accumulated,ability)=>(accumulated[ability]={ability},accumulated),{})}__name(createButtons,"createButtons"),__name2(createButtons,"createButtons");const choices=this.kingdom.build.boosts,mainBoosts=mapToObj(KINGDOM_BUILD_CATEGORIES,prop=>{const buildItem=this.kingdom[prop];if(!buildItem)return[prop,null];const buttons=createButtons(),selectedChoices=objectHasKey(choices,prop)?choices[prop]:[],boosts=resolveKingdomBoosts(buildItem,selectedChoices),remaining=Math.max(0,buildItem.boosts.length-boosts.length);for(const ability of KINGDOM_ABILITIES){const selected=boosts.includes(ability);ability===buildItem.flaw?buttons[ability].flaw={selected:!0,locked:!0}:(selected||buildItem.boosts.includes("free"))&&(buttons[ability].boost={selected,locked:buildItem.boosts.includes(ability),disabled:!selected&&!remaining})}return[prop,{buttons,remaining}]}),levelBoosts=mapToObj(KINGDOM_BOOST_LEVELS,level=>{const eligible=this.kingdom.level>=level,buttons=createButtons(),boosts=this.kingdom.build.boosts[level],remaining=eligible?Math.max(0,2-boosts.length):0;for(const ability of KINGDOM_ABILITIES){const selected=boosts.includes(ability)&&eligible;buttons[ability].boost={selected,disabled:!selected&&!remaining}}return[level,{buttons,remaining,eligible}]});return{...mainBoosts,levelBoosts}},"#prepareAbilityBuilder"),__name2(_KingdomBuilder,"KingdomBuilder");let KingdomBuilder=_KingdomBuilder;const{fields}=foundry.data;function buildKingdomCHGSchema(){return{id:new fields.StringField({required:!1,initial:void 0,blank:!1}),name:new fields.StringField({required:!0,nullable:!1,blank:!1}),img:new fields.StringField({required:!0,nullable:!1}),description:new fields.StringField({required:!0,nullable:!1}),boosts:new fields.ArrayField(new fields.StringField({choices:[...KINGDOM_ABILITIES,"free"],nullable:!1}))}}__name(buildKingdomCHGSchema,"buildKingdomCHGSchema"),__name2(buildKingdomCHGSchema,"buildKingdomCHGSchema");const KINGDOM_BUILD_SCHEMA={manual:new fields.BooleanField({required:!0,nullable:!1,initial:!1}),charter:new fields.SchemaField({...buildKingdomCHGSchema(),flaw:new fields.StringField({choices:KINGDOM_ABILITIES,required:!0,nullable:!0})},{nullable:!0,initial:null}),heartland:new fields.SchemaField(buildKingdomCHGSchema(),{nullable:!0,initial:null}),government:new fields.SchemaField({...buildKingdomCHGSchema(),skills:new fields.ArrayField(new fields.StringField({required:!0,nullable:!1,choices:KINGDOM_SKILLS})),feat:new fields.StringField({required:!0,nullable:!0})},{nullable:!0,initial:null}),skills:new fields.SchemaField(mapToObj(KINGDOM_SKILLS,skill=>{const schema=new fields.SchemaField({rank:new fields.NumberField({initial:0,min:0,max:4,required:!0,nullable:!1})});return[skill,schema]})),boosts:new fields.SchemaField(mapToObj(["charter","heartland","government","1","5","10","15","20"],category=>{const schema=new fields.ArrayField(new fields.StringField({choices:KINGDOM_ABILITIES,nullable:!1}));return[category,schema]}))},KINGDOM_RESOURCES_SCHEMA={dice:new fields.SchemaField({number:new fields.NumberField,faces:new fields.NumberField,bonus:new fields.NumberField({required:!0,nullable:!1,initial:0}),penalty:new fields.NumberField({required:!0,nullable:!1,initial:0})}),fame:new fields.SchemaField({value:new fields.NumberField({required:!0,nullable:!1,initial:0}),max:new fields.NumberField({required:!0,nullable:!1,initial:3})}),commodities:new fields.SchemaField(mapToObj(KINGDOM_COMMODITIES,type=>{const schema=new fields.SchemaField({value:new fields.NumberField({required:!0,nullable:!1,initial:0}),max:new fields.NumberField({required:!0,nullable:!1,initial:0})});return[type,schema]})),points:new fields.NumberField({min:0,required:!1,nullable:!1,initial:0}),workSites:new fields.SchemaField(mapToObj(["food","luxuries","lumber","ore","stone"],type=>{const schema=new fields.SchemaField({value:new fields.NumberField({required:!1,nullable:!1,min:0,initial:0}),resource:new fields.NumberField({required:!1,nullable:!1,min:0,initial:0})});return[type,schema]}))},KINGDOM_SETTLEMENT_SCHEMA={name:new fields.StringField({required:!0,blank:!0,nullable:!1,initial:""}),type:new fields.StringField({required:!1,nullable:!1,choices:KINGDOM_SETTLEMENT_TYPES,initial:"village"}),level:new fields.NumberField({min:1,initial:1,max:30,nullable:!1}),overcrowded:new fields.BooleanField,description:new fields.StringField({required:!1,nullable:!1,blank:!0,initial:""}),sort:new fields.IntegerSortField,consumption:new fields.SchemaField({base:new fields.NumberField({required:!1,nullable:!1,initial:0}),reduction:new fields.NumberField({required:!1,nullable:!1,initial:0}),total:new fields.NumberField({required:!1,nullable:!1,initial:0})}),storage:new fields.SchemaField(mapToObj(["food","luxuries","lumber","ore","stone"],type=>{const schema=new fields.NumberField({required:!1,nullable:!1,min:0,initial:0});return[type,schema]}))},KINGDOM_SCHEMA={type:new fields.StringField({choices:["kingmaker"],required:!0,nullable:!1,initial:"kingmaker"}),active:new DataUnionField([new StrictStringField({required:!1,nullable:!1,choices:["building"],initial:void 0}),new StrictBooleanField({initial:!1,required:!1,nullable:!1})],{required:!1,nullable:!1,initial:!1}),name:new fields.StringField({required:!0,nullable:!1,initial:""}),img:new fields.FilePathField({categories:["IMAGE"],required:!0,nullable:!1,initial:"systems/pf2e/icons/default-icons/kingdom.svg"}),capital:new fields.StringField({initial:"",required:!0}),size:new fields.NumberField({initial:1,min:1,required:!0,nullable:!1}),level:new fields.NumberField({required:!0,nullable:!1,min:1,max:20,initial:1}),xp:new fields.SchemaField({value:new fields.NumberField({required:!0,nullable:!1,initial:0}),max:new fields.NumberField({required:!0,nullable:!1,initial:1e3})}),aspiration:new fields.StringField({choices:["fame","infamy"],required:!0,nullable:!1,initial:"fame"}),abilities:new fields.SchemaField(mapToObj(KINGDOM_ABILITIES,ability=>{const schema=new fields.SchemaField({value:new fields.NumberField({initial:10,required:!1,nullable:!1}),mod:new fields.NumberField({initial:0,required:!1,nullable:!1}),ruin:new fields.SchemaField({value:new fields.NumberField({required:!0,nullable:!1,initial:0}),max:new fields.NumberField({required:!0,nullable:!1,initial:10})}),penalty:new fields.NumberField({initial:0,required:!1,nullable:!1})});return[ability,schema]})),build:new fields.SchemaField(KINGDOM_BUILD_SCHEMA),customModifiers:new fields.ObjectField({initial:{}}),leadership:new fields.SchemaField(mapToObj(KINGDOM_LEADERSHIP,role=>{const schema=new fields.SchemaField({uuid:new fields.StringField({required:!1,nullable:!0,initial:null}),vacant:new fields.BooleanField({initial:!0}),invested:new fields.BooleanField({required:!1,initial:!1})});return[role,schema]})),resources:new fields.SchemaField(KINGDOM_RESOURCES_SCHEMA),settlements:new RecordField(new fields.StringField({required:!0,nullable:!1,blank:!1}),new fields.SchemaField(KINGDOM_SETTLEMENT_SCHEMA,{required:!0}),{required:!1,nullable:!1,initial:{}}),consumption:new fields.SchemaField({base:new fields.NumberField({required:!1,nullable:!1,initial:0}),settlement:new fields.NumberField({min:0,initial:0}),army:new fields.NumberField({min:0,initial:0}),value:new fields.NumberField({min:0,initial:0})}),unrest:new fields.SchemaField({value:new fields.NumberField({integer:!0,min:0,max:99,required:!1,nullable:!1,initial:0}),anarchyThreshold:new fields.NumberField({integer:!0,required:!1,nullable:!1,initial:20})}),event:new fields.SchemaField({dc:new fields.NumberField({required:!1,nullable:!1,min:0,max:20,initial:16}),text:new fields.StringField({required:!1,nullable:!1,blank:!0,initial:""})}),module:new fields.ObjectField({required:!1,initial:{}})},{DataModel}=foundry.abstract,_Kingdom=class extends DataModel{static{__name(this,"_Kingdom")}static defineSchema(){return KINGDOM_SCHEMA}get actor(){return this.parent}get extraItemTypes(){return["campaignFeature","effect"]}get activities(){return this.actor.itemTypes.campaignFeature.filter(k=>k.category==="kingdom-activity")}get charter(){return this.build.charter}get heartland(){return this.build.heartland}get government(){return this.build.government}createSidebarButtons(){if(!this.active&&!game.user.isGM)return[];const hoverIcon=this.active==="building"?"wrench":this.active?null:"plus",icon=createHTMLElement("a",{classes:["create-button"],children:compact([fontAwesomeIcon("crown"),hoverIcon?fontAwesomeIcon(hoverIcon):null]),dataset:{tooltip:game.i18n.localize(`PF2E.Kingmaker.SIDEBAR.${this.active===!0?"OpenSheet":"CreateKingdom"}`)}});return icon.addEventListener("click",async event=>{if(event.stopPropagation(),!this.active)await Dialog.confirm({title:game.i18n.localize("PF2E.Kingmaker.KingdomBuilder.Title"),content:`

    ${game.i18n.localize("PF2E.Kingmaker.KingdomBuilder.ActivationMessage")}

    `})&&(await this.update({active:"building"}),KingdomBuilder.showToPlayers({uuid:this.actor.uuid}),new KingdomBuilder(this).render(!0));else{const type=this.active===!0?null:"builder";this.renderSheet({type})}}),[icon]}async collect(){const{formula,commodities}=calculateKingdomCollectionData(this),roll=await new Roll(formula).evaluate({async:!0});await roll.toMessage({flavor:game.i18n.localize("PF2E.Kingmaker.Kingdom.Resources.Points"),speaker:{...ChatMessagePF2e.getSpeaker(this.actor),alias:this.name}},{rollMode:"publicroll"}),this.update({resources:{points:roll.total,commodities:mapValues$1(commodities,(incoming,type)=>{const current=this.resources.commodities[type];return{value:Math.min(current.value+incoming,current.max)}})}})}async addCustomModifier(stat,data){if(stat.length===0)throw ErrorPF2e("A custom modifier's statistic must be a non-empty string");if(data.label.length===0)throw ErrorPF2e("A custom modifier's label must be a non-empty string");const modifiers=(this.toObject().customModifiers??{})[stat]??[];if(!modifiers.some(m=>m.label===data.label)){data.type=setHasElement(MODIFIER_TYPES,data.type)?data.type:"untyped";const modifier=new ModifierPF2e({...data,custom:!0}).toObject();await this.update({[`customModifiers.${stat}`]:[...modifiers,modifier]})}}async removeCustomModifier(stat,slug){if(stat.length===0)throw ErrorPF2e("A custom modifier's statistic must be a non-empty string");const modifiers=(this.toObject().customModifiers??{})[stat]??[];if(modifiers.length!==0)if(typeof slug=="string"){const withRemoved=modifiers.filter(m=>m.slug!==slug);await this.update({[`customModifiers.${stat}`]:withRemoved})}else throw ErrorPF2e("Custom modifiers can only be removed by slug (string) or index (number)")}async update(data){const expanded=expandObject(data),updateData=mergeObject(expanded,expanded.system?.campaign??{});delete updateData.system,await this.actor.update({"system.campaign":updateData}),updateData.level&&await this.updateFeatures(updateData.level)}prepareBaseData(){const{synthetics}=this.actor,{build}=this;if(!build.manual){for(const ability of KINGDOM_ABILITIES)this.abilities[ability].value=10;for(const category of["charter","heartland","government"]){const data=build[category],chosen=build.boosts[category];if(!data)continue;"flaw"in data&&data.flaw&&(this.abilities[data.flaw].value-=2);const activeBoosts=resolveKingdomBoosts(data,chosen);for(const ability of activeBoosts)this.abilities[ability].value+=this.abilities[ability].value>=18?1:2}const activeLevels=[1,5,10,15,20].filter(l=>this.level>=l);for(const level of activeLevels){const chosen=build.boosts[level].slice(0,2);for(const ability of chosen)this.abilities[ability].value+=this.abilities[ability].value>=18?1:2}}for(const ability of KINGDOM_ABILITIES)this.abilities[ability].mod=(this.abilities[ability].value-10)/2;if(build.government&&build.government.skills.length>0)for(const skill of build.government.skills)build.skills[skill].rank=Math.max(1,build.skills[skill].rank);const customModifiers=this.customModifiers??={};for(const selector of Object.keys(customModifiers)){const modifiers=customModifiers[selector]=customModifiers[selector].map(rawModifier=>new ModifierPF2e(rawModifier));(synthetics.modifiers[selector]??=[]).push(...modifiers.map(m=>()=>m))}const sizeData=Object.entries(KINGDOM_SIZE_DATA).findLast(([size])=>this.size>=Number(size))?.[1]??KINGDOM_SIZE_DATA[1];this.nationType=sizeData.type,this.resources.dice.faces=sizeData.faces,sizeData.controlMod&&(synthetics.modifiers["control-dc"]??=[]).push(()=>new ModifierPF2e({slug:"size",label:"Size Modifier",modifier:sizeData.controlMod}));for(const ability of KINGDOM_ABILITIES){const penalty=this.abilities[ability].penalty;penalty&&(synthetics.modifiers[`${ability}-based`]??=[]).push(()=>new ModifierPF2e({slug:"ruin",type:"item",label:KINGDOM_RUIN_LABELS[ability],modifier:penalty}))}for(const role of KINGDOM_LEADERSHIP){const data=this.leadership[role],actor=fromUuidSync(data.uuid??"");if(actor instanceof ActorPF2e?actor.hasPlayerOwner||(data.vacant=!1):data.vacant=!0,data.vacant){const penalties=VACANCY_PENALTIES[role]();for(const[selector,entries]of Object.entries(penalties.adjustments??{}))(synthetics.modifierAdjustments[selector]??=[]).push(...entries);for(const[selector,entries]of Object.entries(penalties.modifiers??{}))(synthetics.modifiers[selector]??=[]).push(...entries.map(e=>()=>new ModifierPF2e(e)))}if(data.invested){const ability=KINGDOM_LEADERSHIP_ABILITIES[role];(synthetics.modifiers[`${ability}-skill-check`]??=[]).push(()=>new ModifierPF2e({slug:"invested",label:"PF2E.Kingmaker.Kingdom.Invested",type:"status",modifier:1}))}}if(this.unrest.value>0){const modifier=-([1,5,10,15].findLastIndex(t=>this.unrest.value>=t)+1);(synthetics.modifiers["kingdom-check"]??=[]).push(()=>new ModifierPF2e({slug:"unrest",label:"PF2E.Kingmaker.Kingdom.Unrest",type:"status",modifier}))}const settlements=compact(Object.values(this.settlements));for(const settlement of settlements){if(!settlement)continue;const typeData=KINGDOM_SETTLEMENT_TYPE_DATA[settlement.type];settlement.consumption.base=typeData.consumption,settlement.consumption.total=Math.max(0,typeData.consumption-settlement.consumption.reduction)}for(const[type,value]of Object.entries(this.resources.commodities)){const settlementStorage=sumBy(settlements,s=>s.storage[type]);value.max=sizeData.storage+settlementStorage}}prepareDerivedData(){const{synthetics}=this.actor,{consumption,resources}=this;resources.dice.number=Math.max(0,this.level+4+resources.dice.bonus-resources.dice.penalty);const settlements=compact(Object.values(this.settlements));consumption.settlement=sumBy(settlements,s=>s.consumption.total);const computedConsumption=consumption.base+consumption.settlement+consumption.army-this.resources.workSites.food.value;consumption.value=Math.max(0,computedConsumption);const controlMod=CONTROL_DC_BY_LEVEL[Math.clamped(this.level-1,0,19)]-10;this.control=new Statistic(this.actor,{slug:"control",label:"PF2E.Kingmaker.Kingdom.ControlDC",domains:["control-dc"],modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:controlMod})]}),this.skills=mapToObj(KINGDOM_SKILLS,skill=>{const ability=KINGDOM_SKILL_ABILITIES[skill],abilityMod=this.abilities[ability].mod,rank=this.build.skills[skill].rank,domains=["kingdom-check",`${ability}-based`,`${ability}-skill-check`,skill],statistic=new Statistic(this.actor,{slug:skill,rank,label:KINGDOM_SKILL_LABELS[skill],domains,modifiers:[new ModifierPF2e({slug:ability,label:KINGDOM_ABILITY_LABELS[ability],modifier:abilityMod,type:"ability",adjustments:extractModifierAdjustments(synthetics.modifierAdjustments,domains,ability)}),createProficiencyModifier({actor:this.actor,rank,domains,level:this.level})],check:{type:"skill-check"}});return[skill,statistic]});const evenLevels=new Array(this.level).fill(0).map((_,idx)=>idx+1).filter(idx=>idx%2===0);this.features=new FeatGroup(this.actor,{id:"features",label:"Kingdom Features",level:this.level}),this.feats=new FeatGroup(this.actor,{id:"kingdom",label:"Kingdom Feats",slots:[{id:"government",label:"G"},...evenLevels],featFilter:["traits-kingdom"],level:this.level}),this.bonusFeats=new FeatGroup(this.actor,{id:"bonus",label:"PF2E.FeatBonusHeader",featFilter:["traits-kingdom"],level:this.level});const allFeatures=this.actor.itemTypes.campaignFeature,features=sortBy$1(allFeatures.filter(f=>f.isFeature),f=>f.level??1,f=>f.name),feats=sortBy$1(allFeatures.filter(f=>f.isFeat),f=>f.sort);for(const feature of features)this.features.assignFeat(feature);for(const feat of feats)this.feats.assignFeat(feat)||this.bonusFeats.assignFeat(feat)}getRollOptions(){const prefix="kingdom";return compact([this.unrest.value?`${prefix}:unrest:${this.unrest.value}`:null])}getRollData(){return{kingdom:this}}async importActivities({skipDialog=!1}={}){const pack=game.packs.get("pf2e.kingmaker-features");if(!pack)throw ErrorPF2e("Could not load kingdom features compendium");await this.updateFeatures(this.level);const documents=(await pack.getDocuments({type:"campaignFeature"})).filter(d=>d instanceof ItemPF2e&&d.isOfType("campaignFeature")).filter(d=>d.system.category==="kingdom-activity"),actor=this.actor,createData=documents.filter(d=>!actor.items.some(i=>i.sourceId===d.uuid)).map(d=>d.toObject()),incomingDataByUUID=mapToObj(documents,d=>[d.uuid,d.toObject(!0)]),updateData=compact(actor.itemTypes.campaignFeature.map(d=>{const incoming=d.sourceId&&incomingDataByUUID[d.sourceId];if(!incoming)return null;const data=pick$1(incoming,["name","img","system"]),diff=diffObject(d.toObject(!0),data);return isEmpty(diff)?null:{_id:d.id,...diff}}));!updateData.length&&!createData.length||!skipDialog&&!await Dialog.confirm({title:game.i18n.localize("PF2E.Kingmaker.Kingdom.ImportDialog.Title"),content:game.i18n.format("PF2E.Kingmaker.Kingdom.ImportDialog.Content",{added:createData.length,updated:updateData.length})})||(await this.actor.updateEmbeddedDocuments("Item",updateData),await this.actor.createEmbeddedDocuments("Item",createData))}async updateFeatures(level){const featuresToDelete=this.actor.itemTypes.campaignFeature.filter(f=>f.isFeature).filter(f=>(f.level??0)>level).map(f=>f.id),featuresToAdd=await(async()=>{const pack=game.packs.get("pf2e.kingmaker-features");return pack?(await pack.getDocuments({type:"campaignFeature"})).filter(d=>d instanceof ItemPF2e&&d.isOfType("campaignFeature")).filter(d=>d.system.category==="kingdom-feature").filter(d=>level>=(d.level??0)).filter(d=>!this.actor.items.some(i=>i.sourceId===d.uuid)).map(i=>i.toObject()):(console.error("PF2E System | Could not load kingdom features compendium"),[])})();await this.actor.deleteEmbeddedDocuments("Item",featuresToDelete),await this.actor.createEmbeddedDocuments("Item",featuresToAdd)}getStatistic(slug){return this.skills&&objectHasKey(this.skills,slug)?this.skills[slug]??null:null}renderSheet(options={}){options.type==="builder"?new KingdomBuilder(this).render(!0):new KingdomSheetPF2e(this.actor).render(!0,{tab:options.tab})}_preUpdate(changed){const actor=this.actor,feat=changed.build?.government?.feat;feat&&(console.log("Replacing feat"),fromUuid(feat).then(async f=>{if(!(f instanceof CampaignFeaturePF2e))return;const currentGovernmentFeat=actor.itemTypes.campaignFeature.find(f2=>f2.system.location==="government"),newFeat=f.clone({"system.location":"government"});await currentGovernmentFeat?.delete(),await actor.createEmbeddedDocuments("Item",[newFeat.toObject()])}))}};__name2(_Kingdom,"Kingdom");let Kingdom=_Kingdom;const _PartyPF2e=class extends ActorPF2e{static{__name(this,"_PartyPF2e")}armorClass=null;get active(){return game.actors.party===this}get baseAllowedItemTypes(){return["physical"]}get allowedItemTypes(){return[...this.baseAllowedItemTypes,...this.campaign?.extraItemTypes??[]]}get canAct(){return!1}canUserModify(user,action2){return super.canUserModify(user,action2)||action2==="update"&&this.members.some(m=>m.canUserModify(user,action2))}isAffectedBy(){return!1}validate(options){if(!super.validate(options))return!1;const changes=options?.changes??{};return!(changes.system?.campaign&&!this.campaign?.validate({...options,changes:changes.system.campaign}))}updateSource(data,options){if(!this.campaign)return super.updateSource(data,options);const expanded=expandObject(data??{}),campaignDiff=expanded?.system?.campaign?this.campaign.updateSource(expanded.system.campaign,options):{},diff=super.updateSource(data,options);return isEmpty(campaignDiff)?diff:mergeObject(diff,campaignDiff)}prepareRuleElements(){return this.items.contents.filter(item=>!item.isOfType("physical")).flatMap(item=>item.prepareRuleElements()).filter(rule=>!rule.ignored).sort((elementA,elementB)=>elementA.priority-elementB.priority)}_initialize(options){super._initialize(options),Object.defineProperty(this.system,"campaign",{writable:!0,enumerable:!1})}prepareBaseData(){this.system.details.level={value:0},super.prepareBaseData(),this.members=this.system.details.members.map(m=>fromUuidSync(m.uuid)).filter(a=>a instanceof ActorPF2e&&a.isOfType("creature")).sort(sortBy(a=>a.name));for(const member of this.members)member?.parties.add(this);const campaignType=game.settings.get("pf2e","campaignType");if(campaignType!=="none"){const typeMatches=this.system.campaign?.type===campaignType;if(this.system.campaign&&!typeMatches)this.campaign=new InvalidCampaign(this,{campaignType,reason:"mismatch"});else try{this.campaign?.type!==campaignType?this.campaign=new Kingdom(deepClone(this._source.system.campaign),{parent:this}):(Kingdom.cleanData(this.campaign._source),this.campaign.reset()),this.campaign.prepareBaseData?.(),this.system.campaign=this.campaign}catch(err){console.error(err),this.campaign=new InvalidCampaign(this,{campaignType,reason:"error"})}}else this.campaign=null;const partyLevel=Math.round(meanBy(this.members.filter(m=>m.isOfType("character")),m=>m.level));this.system.details.level.value=partyLevel}prepareEmbeddedDocuments(){super.prepareEmbeddedDocuments();for(const rule of this.rules)rule.onApplyActiveEffects?.()}prepareDerivedData(){super.prepareDerivedData();const travelSpeed=Math.min(...this.members.map(m=>m.attributes.speed.total));this.attributes.speed={total:travelSpeed},this.prepareSynthetics(),this.campaign?.prepareDerivedData?.()}async addMembers(...membersToAdd){const existing=this.system.details.members.filter(d=>this.members.some(m=>m.uuid===d.uuid)),existingUUIDs=new Set(existing.map(data=>data.uuid)),newMembers=membersToAdd.filter(a=>a.uuid.startsWith("Actor.")&&!existingUUIDs.has(a.uuid));for(const member of newMembers){const allianceUpdate=member.isOfType("character","npc")?{"system.details.alliance":member._source.system.details.alliance??"party"}:{};await member.update({folder:null,...allianceUpdate})}const members=[...existing,...newMembers.map(m=>({uuid:m.uuid}))];await this.update({system:{details:{members}}}),await resetActors(newMembers)}async removeMembers(...remove2){const uuids=remove2.map(d=>typeof d=="string"?d:d.uuid),members=this.system.details.members.filter(d=>this.members.some(m=>m.uuid===d.uuid)).filter(m=>!tupleHasValue(uuids,m.uuid));await this.update({system:{details:{members}}})}async addToCombat(options={}){const promises=this.members.map(a=>CombatantPF2e.fromActor(a,!0,{combat:options.combat}));return(await Promise.all(promises)).filter(c=>!!c)}getRollOptions(domains){return super.getRollOptions(domains).concat(this.campaign?.getRollOptions?.()??[])}getRollData(){return mergeObject(super.getRollData(),this.campaign?.getRollData?.()??{})}reset({actor=!1}={}){actor?this._resetAndRerenderDebounced():super.reset()}getStatistic(slug){const statistic=super.getStatistic(slug);return statistic||(this.campaign?.getStatistic?.(slug)??null)}_resetAndRerenderDebounced=foundry.utils.debounce(()=>{super.reset(),this.sheet.render(!1,{actor:!0})},50);async _preUpdate(changed,options,user){const members=this.members,newMemberUUIDs=changed?.system?.details?.members?.map(m=>m?.uuid);if(newMemberUUIDs){const deletedMembers=members.filter(m=>m?.uuid&&!newMemberUUIDs.includes(m.uuid));options.removedMembers=deletedMembers.map(m=>m.uuid)}return changed.system?.campaign&&this.campaign&&this.campaign.type!=="invalid"&&(changed.system.campaign.type=this.campaign.type,this.campaign._preUpdate?.(changed.system.campaign)),super._preUpdate(changed,options,user)}_onUpdate(changed,options,userId){super._onUpdate(changed,options,userId);const removedCreatures=(options.removedMembers??[]).map(uuid=>fromUuidSync(uuid)).filter(a=>a instanceof ActorPF2e&&a.isOfType("creature"));for(const actor of removedCreatures)actor.parties.delete(this);if(resetActors(removedCreatures),changed.system?.details?.members&&game.combat)for(const encounter of game.combats)encounter.reset(),ui.combat.render();game.ready&&changed.system?.campaign&&game.actors.get(this.id)===this&&ui.actors.render()}_onDelete(options,userId){super._onDelete(options,userId);for(const member of this.members)member.parties.delete(this);resetActors(this.members),ui.actors.saveActivePartyFolderState()}};__name2(_PartyPF2e,"PartyPF2e");let PartyPF2e=_PartyPF2e;const _VehiclePF2e=class extends ActorPF2e{static{__name(this,"_VehiclePF2e")}get allowedItemTypes(){return[...super.allowedItemTypes,"physical","action"]}get dimensions(){return{length:this.system.details.space.long,width:this.system.details.space.wide,height:this.system.details.space.high}}get hardness(){return this.system.attributes.hardness}getTokenDimensions(dimensions=this.dimensions){return{width:Math.max(Math.round(dimensions.width/5),1),height:Math.max(Math.round(dimensions.length/5),1)}}prepareBaseData(){super.prepareBaseData(),this.system.details.alliance=null;const{size}=this.system.traits,{dimensions}=this;if(size.length=dimensions.length,size.width=dimensions.width,this.prototypeToken.flags?.pf2e?.linkToActorSize){const{width,height}=this.getTokenDimensions();this.prototypeToken.width=width,this.prototypeToken.height=height}}prepareEmbeddedDocuments(){super.prepareEmbeddedDocuments();for(const rule of this.rules)rule.onApplyActiveEffects?.()}prepareDerivedData(){if(super.prepareDerivedData(),this.prepareSynthetics(),this.hasCondition("broken"))for(const selector of["ac","saving-throw"]){const modifiers=this.synthetics.modifiers[selector]??=[],brokenModifier=new ModifierPF2e({slug:"broken",label:"PF2E.ConditionTypeBroken",modifier:-2,adjustments:extractModifierAdjustments(this.synthetics.modifierAdjustments,[selector],"broken")});modifiers.push(()=>brokenModifier)}const{attributes}=this,hitPoints=new HitPointsStatistic(this,{baseMax:attributes.hp.max});attributes.hp=mergeObject(hitPoints.getTraceData(),{brokenThreshold:Math.floor(hitPoints.max/2)}),setHitPointsRollOptions(this);const armorStatistic=new ArmorStatistic(this,{modifiers:[new ModifierPF2e({slug:"base",label:"PF2E.ModifierTitle",modifier:this.system.attributes.ac.value-10,adjustments:extractModifierAdjustments(this.synthetics.modifierAdjustments,["all","ac"],"base")})]});this.armorClass=armorStatistic.dc,this.system.attributes.ac=armorStatistic.getTraceData(),this.prepareSaves()}prepareSaves(){const{synthetics}=this,slug="fortitude",domains=[slug,"saving-throw","all"],modifiers=[new ModifierPF2e({label:"PF2E.ModifierTitle",slug,type:"untyped",modifier:this.system.saves.fortitude.value}),...extractModifiers(synthetics,domains)],fortitude=new Statistic(this,{slug:"fortitude",label:CONFIG.PF2E.saves.fortitude,modifiers,domains,check:{type:"saving-throw"}});this.saves={fortitude},this.system.saves.fortitude=mergeObject(this.system.saves.fortitude,fortitude.getTraceData())}async _preUpdate(changed,options,user){const result=await super._preUpdate(changed,options,user);if(result===!1)return result;if(this.prototypeToken.flags?.pf2e?.linkToActorSize){const{space}=this.system.details,spaceUpdates={width:changed.system?.details?.space?.wide??space.wide,length:changed.system?.details?.space?.long??space.long},tokenDimensions=this.getTokenDimensions(spaceUpdates);if(changed.prototypeToken=mergeObject(changed.prototypeToken??{},tokenDimensions),canvas.scene){const updates=this.getActiveTokens().filter(token=>token.document.linkToActorSize).map(token=>({_id:token.id,...tokenDimensions}));await TokenDocumentPF2e.updateDocuments(updates,{parent:canvas.scene})}}}};__name2(_VehiclePF2e,"VehiclePF2e");let VehiclePF2e=_VehiclePF2e;function extractModifiers(synthetics,selectors,options={}){const{modifierAdjustments,modifiers:syntheticModifiers}=synthetics,modifiers=Array.from(new Set(selectors)).flatMap(s=>syntheticModifiers[s]??[]).flatMap(d=>d(options)??[]);for(const modifier of modifiers)modifier.adjustments=extractModifierAdjustments(modifierAdjustments,selectors,modifier.slug);return modifiers}__name(extractModifiers,"extractModifiers"),__name2(extractModifiers,"extractModifiers");function extractModifierAdjustments(adjustmentsRecord,selectors,slug){return Array.from(new Set(selectors.flatMap(s=>adjustmentsRecord[s]??[]))).filter(a=>[slug,null].includes(a.slug))}__name(extractModifierAdjustments,"extractModifierAdjustments"),__name2(extractModifierAdjustments,"extractModifierAdjustments");function extractNotes(rollNotes,selectors){return selectors.flatMap(s=>(rollNotes[s]??[]).map(n=>n.clone()))}__name(extractNotes,"extractNotes"),__name2(extractNotes,"extractNotes");function extractDamageDice(deferredDice,selectors,options){return selectors.flatMap(s=>deferredDice[s]??[]).flatMap(d=>d(options)??[])}__name(extractDamageDice,"extractDamageDice"),__name2(extractDamageDice,"extractDamageDice");function processDamageCategoryStacking(base,options){const{dice}=options,groupedModifiers=groupBy$1(options.modifiers,m=>m.category==="persistent"?"persistent":"main"),modifiers=[...new StatisticModifier("damage",groupedModifiers.main??[],options.test).modifiers,...new StatisticModifier("persistent",groupedModifiers.persistent??[],options.test).modifiers],allPersistent=base.length>0&&base.every(b=>b.category==="persistent");return{modifiers:allPersistent?modifiers.filter(m=>m.category==="persistent"):modifiers,dice:allPersistent?dice.filter(m=>m.category==="persistent"):dice}}__name(processDamageCategoryStacking,"processDamageCategoryStacking"),__name2(processDamageCategoryStacking,"processDamageCategoryStacking");async function extractEphemeralEffects({affects,origin,target,item,domains,options}){if(!(origin&&target))return[];const[effectsFrom,effectsTo]=affects==="target"?[origin,target]:[target,origin],fullOptions=[...options,effectsFrom.getRollOptions(domains),effectsTo.getSelfRollOptions(affects)].flat(),resolvables=item?item.isOfType("spell")?{spell:item}:{weapon:item}:{};return(await Promise.all(domains.flatMap(s=>effectsFrom.synthetics.ephemeralEffects[s]?.[affects]??[]).map(d=>d({test:fullOptions,resolvables})))).flatMap(e=>e??[])}__name(extractEphemeralEffects,"extractEphemeralEffects"),__name2(extractEphemeralEffects,"extractEphemeralEffects");function extractRollTwice(rollTwices,selectors,options){const twices=selectors.flatMap(s=>rollTwices[s]??[]).filter(rt=>rt.predicate?.test(options)??!0);return twices.length===0||twices.some(rt=>rt.keep==="higher")&&twices.some(rt=>rt.keep==="lower")?!1:twices.at(0)?.keep==="higher"?"keep-higher":"keep-lower"}__name(extractRollTwice,"extractRollTwice"),__name2(extractRollTwice,"extractRollTwice");function extractRollSubstitutions(substitutions,domains,rollOptions){return domains.flatMap(d=>deepClone(substitutions[d]??[])).filter(s=>s.predicate?.test(rollOptions)??!0)}__name(extractRollSubstitutions,"extractRollSubstitutions"),__name2(extractRollSubstitutions,"extractRollSubstitutions");function extractDegreeOfSuccessAdjustments(synthetics,selectors){return Object.values(pick(synthetics.degreeOfSuccessAdjustments,selectors)).flat()}__name(extractDegreeOfSuccessAdjustments,"extractDegreeOfSuccessAdjustments"),__name2(extractDegreeOfSuccessAdjustments,"extractDegreeOfSuccessAdjustments");function isBracketedValue(value){return isObject(value)&&Array.isArray(value.brackets)}__name(isBracketedValue,"isBracketedValue"),__name2(isBracketedValue,"isBracketedValue");async function processPreUpdateActorHooks(changed,{pack}){const actorId=String(changed._id),actor=pack?await game.packs.get(pack)?.getDocument(actorId):game.actors.get(actorId);if(!(actor instanceof ActorPF2e))return;const rules=actor.rules.filter(r=>!!r.preUpdateActor);if(rules.length===0)return;actor.flags.pf2e.rollOptions=actor.clone(changed,{keepId:!0}).flags.pf2e.rollOptions;const createDeletes=(await Promise.all(rules.map(r=>actor.items.has(r.item.id)?r.preUpdateActor():new Promise(()=>({create:[],delete:[]}))))).reduce((combined,cd)=>({create:[...combined.create,...cd.create],delete:Array.from(new Set([...combined.delete,...cd.delete]))}),{create:[],delete:[]});createDeletes.delete=createDeletes.delete.filter(id=>actor.items.has(id)),await actor.createEmbeddedDocuments("Item",createDeletes.create,{keepId:!0,render:!1}),await actor.deleteEmbeddedDocuments("Item",createDeletes.delete,{render:!1})}__name(processPreUpdateActorHooks,"processPreUpdateActorHooks"),__name2(processPreUpdateActorHooks,"processPreUpdateActorHooks");const PROFICIENCY_RANK_OPTION=["proficiency:untrained","proficiency:trained","proficiency:expert","proficiency:master","proficiency:legendary"];function ensureProficiencyOption(options,rank){rank>=0&&options.add(`skill:rank:${rank}`).add(PROFICIENCY_RANK_OPTION[rank])}__name(ensureProficiencyOption,"ensureProficiencyOption"),__name2(ensureProficiencyOption,"ensureProficiencyOption");const MODIFIER_TYPES=new Set(["ability","circumstance","item","potency","proficiency","status","untyped"]),_ModifierPF2e=class _ModifierPF2e2{static{__name(this,"_ModifierPF2e")}constructor(...args){__publicField(this,"slug"),__publicField(this,"label"),__publicField(this,"modifier"),__privateAdd(this,_originalValue,void 0),__publicField(this,"type"),__publicField(this,"ability"),__publicField(this,"adjustments"),__publicField(this,"force"),__publicField(this,"enabled"),__publicField(this,"ignored"),__publicField(this,"rule"),__publicField(this,"source"),__publicField(this,"custom"),__publicField(this,"damageType"),__publicField(this,"damageCategory"),__publicField(this,"predicate"),__publicField(this,"critical"),__publicField(this,"traits"),__publicField(this,"hideIfDisabled"),__publicField(this,"kind");const params=__name2(args2=>typeof args2[0]=="string","isLegacyParams")(args)?{label:args[0],modifier:args[1],type:args[2]??"untyped",enabled:args[3],ignored:args[4],source:args[5]}:args[0];if(this.label=game.i18n.localize(params.label??params.name),this.slug=sluggify(params.slug??this.label),__privateSet(this,_originalValue,this.modifier=params.modifier),this.type=setHasElement(MODIFIER_TYPES,params.type)?params.type:"untyped",this.ability=params.ability??null,this.force=params.force??!1,this.adjustments=deepClone(params.adjustments??[]),this.enabled=params.enabled??!0,this.ignored=params.ignored??!1,this.custom=params.custom??!1,this.source=params.source??null,this.predicate=new PredicatePF2e(params.predicate??[]),this.traits=deepClone(params.traits??[]),this.hideIfDisabled=params.hideIfDisabled??!1,this.modifier=params.modifier,this.rule=params.rule??null,Object.defineProperty(this,"rule",{enumerable:!1}),this.damageType=objectHasKey(CONFIG.PF2E.damageTypes,params.damageType)?params.damageType:null,this.damageCategory=this.damageType==="bleed"?"persistent":params.damageCategory??null,this.critical=this.damageCategory==="splash"?!!params.critical:params.critical??null,this.kind=(()=>this.modifier>=0&&!["ability","untyped"].includes(this.type)?"bonus":this.modifier<0&&this.type!=="ability"?"penalty":"modifier")(),this.force&&this.type==="untyped")throw ErrorPF2e("A forced modifier must have a type")}get category(){return this.damageCategory}get value(){return this.kind==="penalty"&&this.modifier===0?-this.modifier:this.modifier}get signedValue(){return this.modifier===0&&this.kind==="penalty"?signedInteger(-this.modifier):signedInteger(this.modifier)}clone(options={}){const clone=this.modifier===__privateGet(this,_originalValue)?new _ModifierPF2e2(this):new _ModifierPF2e2({...this,modifier:__privateGet(this,_originalValue)});return options.test&&clone.test(options.test),clone}getRollOptions(){const options=["slug","type","value"].map(p=>`${this.kind}:${p}:${this[p]}`);return this.type==="ability"&&this.ability&&options.push(`modifier:ability:${this.ability}`),new Set(options)}test(options){if(this.predicate.length===0)return;const rollOptions=this.rule?[...options,...this.rule.item.getRollOptions("parent")]:options;this.ignored=!this.predicate.test(rollOptions)}toObject(){return duplicate({...this,item:void 0})}toString(){return this.label}};_originalValue=new WeakMap,__name2(_ModifierPF2e,"ModifierPF2e");let ModifierPF2e=_ModifierPF2e;function createAttributeModifier({actor,attribute,domains,max}){const withAttributeBased=domains.includes(`${attribute}-based`)?domains:[...domains,`${attribute}-based`],modifierValue=actor.abilities[attribute].mod,cappedValue=Math.min(modifierValue,max??modifierValue);return new ModifierPF2e({slug:attribute,label:CONFIG.PF2E.abilities[attribute],modifier:cappedValue,type:"ability",ability:attribute,adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,withAttributeBased,attribute)})}__name(createAttributeModifier,"createAttributeModifier"),__name2(createAttributeModifier,"createAttributeModifier");function createProficiencyModifier({actor,rank,domains,level,addLevel}){rank=Math.clamped(rank,0,4),addLevel??=rank>0;const pwolVariant=game.settings.get("pf2e","proficiencyVariant"),baseBonuses=pwolVariant?[game.settings.get("pf2e","proficiencyUntrainedModifier"),game.settings.get("pf2e","proficiencyTrainedModifier"),game.settings.get("pf2e","proficiencyExpertModifier"),game.settings.get("pf2e","proficiencyMasterModifier"),game.settings.get("pf2e","proficiencyLegendaryModifier")]:[0,2,4,6,8],addedLevel=addLevel&&!pwolVariant?level??actor.level:0,bonus=baseBonuses[rank]+addedLevel;return new ModifierPF2e({slug:"proficiency",label:`PF2E.ProficiencyLevel${rank}`,modifier:bonus,type:"proficiency",adjustments:extractModifierAdjustments(actor.synthetics.modifierAdjustments,domains,"proficiency")})}__name(createProficiencyModifier,"createProficiencyModifier"),__name2(createProficiencyModifier,"createProficiencyModifier");const HIGHER_BONUS=__name2((a,b)=>a.modifier>=b.modifier,"HIGHER_BONUS"),LOWER_PENALTY=__name2((a,b)=>a.modifier<=b.modifier,"LOWER_PENALTY");function applyStacking(best,modifier,isBetter){const existing=best[modifier.type];return existing===void 0?(modifier.enabled=!0,best[modifier.type]=modifier,modifier.modifier):isBetter(modifier,existing)?(existing.enabled=!1,modifier.enabled=!0,best[modifier.type]=modifier,modifier.modifier-existing.modifier):(modifier.enabled=!1,0)}__name(applyStacking,"applyStacking"),__name2(applyStacking,"applyStacking");function applyStackingRules(modifiers){let total=0;const highestBonus={},lowestPenalty={},abilityModifiers=modifiers.filter(m=>m.type==="ability"&&!m.ignored),bestAbility=abilityModifiers.reduce((best,modifier)=>best===null||modifier.force?modifier:best.force?best:modifier.modifier>best.modifier?modifier:best,null);for(const modifier of abilityModifiers)modifier.ignored=modifier!==bestAbility;for(const modifier of modifiers){if(modifier.ignored){modifier.enabled=!1;continue}if(modifier.type==="untyped"){modifier.enabled=!0,total+=modifier.modifier;continue}modifier.modifier<0?total+=applyStacking(lowestPenalty,modifier,LOWER_PENALTY):total+=applyStacking(highestBonus,modifier,HIGHER_BONUS)}return total}__name(applyStackingRules,"applyStackingRules"),__name2(applyStackingRules,"applyStackingRules");const _StatisticModifier=class{static{__name(this,"_StatisticModifier")}slug;_modifiers;breakdown="";notes;constructor(slug,modifiers=[],rollOptions=new Set){rollOptions=rollOptions instanceof Set?rollOptions:new Set(rollOptions),this.slug=slug;const seen=modifiers.reduce((result,modifier)=>((!result[modifier.slug]?.enabled||Math.abs(modifier.modifier)>Math.abs(result[modifier.slug].modifier))&&(result[modifier.slug]=modifier),result),{});this._modifiers=Object.values(seen),this.calculateTotal(rollOptions)}get modifiers(){return[...this._modifiers]}push(modifier){const existingIdx=this._modifiers.findIndex(o=>o.slug===modifier.slug),existing=this._modifiers[existingIdx];return existing?Math.abs(modifier.modifier)>Math.abs(existing.modifier)&&(this._modifiers[existingIdx]=modifier,this.calculateTotal()):(this._modifiers.push(modifier),this.calculateTotal()),this._modifiers.length}unshift(modifier){return this._modifiers.find(o=>o.slug===modifier.slug)===void 0&&(this._modifiers.unshift(modifier),this.calculateTotal()),this._modifiers.length}delete(modifierSlug){const toDelete2=typeof modifierSlug=="object"?modifierSlug:this._modifiers.find(modifier=>modifier.slug===modifierSlug),wasDeleted=toDelete2&&this._modifiers.includes(toDelete2)?!!this._modifiers.findSplice(modifier=>modifier===toDelete2):!1;return wasDeleted&&this.calculateTotal(),wasDeleted}calculateTotal(rollOptions=new Set){if(rollOptions.size>0){for(const modifier of this._modifiers)modifier.test(rollOptions);adjustModifiers(this._modifiers,rollOptions)}applyStackingRules(this._modifiers),this.totalModifier=this._modifiers.filter(m=>m.enabled).reduce((total,m)=>total+m.modifier,0)}};__name2(_StatisticModifier,"StatisticModifier");let StatisticModifier=_StatisticModifier;function adjustModifiers(modifiers,rollOptions){for(const modifier of[...modifiers].sort((a,b)=>Math.abs(b.value)-Math.abs(a.value))){const adjustments=modifier.adjustments.filter(a=>a.test([...rollOptions,...modifier.getRollOptions()]));if(adjustments.some(a=>a.suppress)){modifier.ignored=!0;continue}const resolvedAdjustment=adjustments.reduce((resolved,adjustment)=>{const newValue=adjustment.getNewValue?.(resolved.value)??resolved.value;return newValue!==resolved.value&&(resolved.value=newValue,resolved.relabel=adjustment.relabel??null),resolved},{value:modifier.modifier,relabel:null});modifier.modifier=resolvedAdjustment.value,resolvedAdjustment.relabel&&(modifier.label=game.i18n.localize(resolvedAdjustment.relabel)),modifier.damageType=adjustments.reduce((damageType,adjustment)=>adjustment.getDamageType?.(damageType)??damageType,modifier.damageType)}}__name(adjustModifiers,"adjustModifiers"),__name2(adjustModifiers,"adjustModifiers");const _CheckModifier=class extends StatisticModifier{static{__name(this,"_CheckModifier")}constructor(slug,statistic,modifiers=[],rollOptions=new Set){const baseModifiers=statistic.modifiers.map(m=>"clone"in m?m.clone():new ModifierPF2e(m));super(slug,baseModifiers.concat(modifiers),rollOptions)}};__name2(_CheckModifier,"CheckModifier");let CheckModifier=_CheckModifier;const _DamageDicePF2e=class _DamageDicePF2e2{static{__name(this,"_DamageDicePF2e")}selector;slug;label;diceNumber;dieSize;critical;category;damageType;override;ignored;enabled;custom;predicate;constructor(params){if(params.selector)this.selector=params.selector;else throw ErrorPF2e("`selector` is mandatory");if(this.label=game.i18n.localize(params.label??""),this.slug=sluggify(params.slug??this.label),!this.slug)throw ErrorPF2e("A DiceModifier must have a slug");this.diceNumber=params.diceNumber??0,this.dieSize=params.dieSize??null,this.damageType=params.damageType??null,this.category=params.category??null,this.override=params.override??null,this.custom=params.custom??!1,this.category=tupleHasValue(["persistent","precision","splash"],params.category)?params.category:this.damageType==="bleed"?"persistent":null,this.critical=this.category==="splash"?!!params.critical:params.critical??null,this.predicate=params.predicate instanceof PredicatePF2e?params.predicate:new PredicatePF2e(params.predicate??[]),this.enabled=params.enabled??this.predicate.test([]),this.ignored=params.ignored??!this.enabled}test(options){this.enabled=this.predicate.test(options),this.ignored=!this.enabled}clone(){return new _DamageDicePF2e2(this)}toObject(){return{...this,predicate:deepClone([...this.predicate])}}};__name2(_DamageDicePF2e,"DamageDicePF2e");let DamageDicePF2e=_DamageDicePF2e;function isCheckContextFlag(flag){return!!flag&&!tupleHasValue(["damage-roll","spell-cast"],flag.type)}__name(isCheckContextFlag,"isCheckContextFlag"),__name2(isCheckContextFlag,"isCheckContextFlag");async function createSelfEffectMessage(item){if(!item.system.selfEffect)throw ErrorPF2e(["Only actions with self-applied effects can be passed to `ActorPF2e#useAction`.","Support will be expanded at a later time."].join(" "));const{actor,actionCost}=item,token=actor.getActiveTokens(!0,!0).shift()??null,speaker=ChatMessagePF2e.getSpeaker({actor,token}),flavor=await renderTemplate("systems/pf2e/templates/chat/action/flavor.hbs",{action:{glyph:getActionGlyph(actionCost),title:item.name},item,traits:item.system.traits.value.map(t=>traitSlugToObject(t,CONFIG.PF2E.actionTraits))}),previewLength=100,descriptionPreview=(()=>{if(item.actor.pack)return null;const tempDiv=document.createElement("div"),documentTypes=[...CONST.DOCUMENT_LINK_TYPES,"Compendium","UUID"],linkPattern=new RegExp(`@(${documentTypes.join("|")})\\[([^#\\]]+)(?:#([^\\]]+))?](?:{([^}]+)})?`,"g");return tempDiv.innerHTML=item.description.replace(linkPattern,(_match,...args)=>args[3]),tempDiv.innerText.slice(0,previewLength)})(),description={full:descriptionPreview&&descriptionPreview.length!!t.actor).map(t=>t.document);if(tokens.length===0){ui.notifications.error("PF2E.UI.errorTargetToken",{localize:!0});return}const shieldBlockRequest=CONFIG.PF2E.chatDamageButtonShieldToggle,roll=message.rolls.at(rollIndex);if(!(roll instanceof DamageRoll))throw ErrorPF2e("Unexpected error retrieving damage roll");let damage=multiplier<0?multiplier*roll.total+addend:roll.alter(multiplier,addend);const messageRollOptions=[...message.flags.pf2e.context?.options??[]],originRollOptions=messageRollOptions.filter(o=>o.startsWith("self:")).map(o=>o.replace(/^self/,"origin")),messageItem=message.item;for(const token of tokens){if(!token.actor)continue;messageRollOptions.some(o=>o.startsWith("target"))||messageRollOptions.push(...token.actor.getSelfRollOptions("target"));const domain=multiplier>0?"damage-received":"healing-received",ephemeralEffects=multiplier>0?await extractEphemeralEffects({affects:"target",origin:message.actor,target:token.actor,item:message.item,domains:[domain],options:messageRollOptions}):[],contextClone=token.actor.getContextualClone(originRollOptions,ephemeralEffects),applicationRollOptions=new Set([...messageRollOptions.filter(o=>!/^(?:self|target):/.test(o)),...originRollOptions,...contextClone.getSelfRollOptions()]),outcome=message.flags.pf2e.context?.outcome,breakdown=[],rolls=[];if(typeof damage=="number"&&damage<0){const critical=outcome==="criticalSuccess",resolvables=(()=>messageItem?.isOfType("spell")?{spell:messageItem}:messageItem?.isOfType("weapon")?{weapon:messageItem}:{})(),damageDice=extractDamageDice(contextClone.synthetics.damageDice,[domain],{resolvables,test:applicationRollOptions}).filter(d=>(d.critical===null||d.critical===critical)&&d.predicate.test(applicationRollOptions));for(const dice of damageDice){const formula=`${dice.diceNumber}${dice.dieSize}[${dice.label}]`,roll2=await new Roll(formula).evaluate({async:!0});roll2._formula=`${dice.diceNumber}${dice.dieSize}`,await roll2.toMessage({flags:{pf2e:{suppressDamageButtons:!0}},flavor:dice.label,speaker:ChatMessage.getSpeaker({token})}),breakdown.push(`${dice.label} ${dice.diceNumber}${dice.dieSize}`),rolls.push(roll2)}rolls.length&&(damage-=rolls.map(roll2=>roll2.total).reduce((previous,current)=>previous+current));const modifiers=extractModifiers(contextClone.synthetics,[domain],{resolvables}).filter(m=>(m.critical===null||m.critical===critical)&&m.predicate.test(applicationRollOptions));damage-=applyStackingRules(modifiers??[]),breakdown.push(...modifiers.filter(m=>m.enabled).map(m=>`${m.label} ${signedInteger(m.modifier)}`))}const hasDamage=typeof damage=="number"?damage!==0:damage.total!==0,notes=(()=>hasDamage?extractNotes(contextClone.synthetics.rollNotes,[domain]).filter(n=>(!outcome||n.outcome.length===0||n.outcome.includes(outcome))&&n.predicate.test(applicationRollOptions)).map(note=>note.text):[])();await contextClone.applyDamage({damage,token,item:message.item,skipIWR:multiplier<=0,rollOptions:applicationRollOptions,shieldBlockRequest,breakdown,notes})}toggleOffShieldBlock(message.id)}__name(applyDamageFromMessage,"applyDamageFromMessage"),__name2(applyDamageFromMessage,"applyDamageFromMessage");function shiftAdjustDamage(message,multiplier,rollIndex){new Dialog({title:game.i18n.localize("PF2E.UI.shiftModifyDamageTitle"),content:`
    -
    - - -
    - -