Compare commits
102 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5715da67de | |||
| a2a723a49f | |||
| deb1cc55fa | |||
| 93cbd4eb01 | |||
| 17b2747130 | |||
| 4677df4b80 | |||
| e0916f4845 | |||
| 1cc28b18a1 | |||
| 0c365665c0 | |||
| e730729493 | |||
| 53c33c888d | |||
| 692bcb3b4b | |||
| 4d0f601c7c | |||
| c0a46c7bef | |||
| 04923cc449 | |||
| 4beb01118a | |||
| e06e297540 | |||
| 8d5aac56d1 | |||
| 45c98308fb | |||
| 9896a811f8 | |||
| fd18fcf0bd | |||
| 7928d17ea9 | |||
| 5a873b4e6e | |||
| cac380ca5e | |||
| 792694f6ac | |||
| e644daff99 | |||
| 3b88f4c8eb | |||
| a2fbabedce | |||
| 23084f4cb4 | |||
| 65b3989099 | |||
| a73459ea87 | |||
| c8a439c2f3 | |||
| 311cb768b9 | |||
| 61a8cb40a4 | |||
| ca4a3b6523 | |||
| ec8b34044b | |||
| c7048e6c32 | |||
| 3a610b71e2 | |||
| 9c06d9ceea | |||
| a6cdd01ec8 | |||
| 0a4148abaa | |||
| 95a71cb6e2 | |||
| 97f738c57d | |||
| 5ed6c55e0d | |||
| 7b621f8be1 | |||
| 64c3b8cad2 | |||
| 298239c3aa | |||
| ee632ee088 | |||
| bf6e1050d9 | |||
| c2a93cbd86 | |||
| 862e0c3ca5 | |||
| 20345f1605 | |||
| c11e029b92 | |||
| 886bced193 | |||
| 584985ede8 | |||
| a4c51710ec | |||
| 1abe31b3c8 | |||
| ddae4ad4b0 | |||
| 5186b26408 | |||
| e84c0127bb | |||
| 5892e6148d | |||
| e8ad547844 | |||
| 897916553c | |||
| 9c3d73501a | |||
| d977cff4e4 | |||
| 56ada5e1d9 | |||
| 7c35c1bb9c | |||
| b2c47b6841 | |||
| fbbc5eecfa | |||
| 1d346db6c0 | |||
| 0e417ca6cb | |||
| 47a0250f2a | |||
| f4074855d6 | |||
| 4dbce12b5a | |||
| e29930d0b7 | |||
| 45b2d0d3b7 | |||
| e164cb6ed4 | |||
| fe70f8796d | |||
| bf3fe1e7c8 | |||
| 4408ca8971 | |||
| 73b70ca47f | |||
| 2e44ddf786 | |||
| 235f91f08c | |||
| d7bb255968 | |||
| 06ae94b837 | |||
| 8fe7cf519d | |||
| 2452cb605e | |||
| f7b7e00ccb | |||
| 2111d117e2 | |||
| 5fcdc8d2f3 | |||
| 305edfa775 | |||
| 0ab17ffe3d | |||
| cf7c469655 | |||
| da34a79555 | |||
| b301758881 | |||
| 10c7630663 | |||
| cbbdb35faa | |||
| b4ee703fdc | |||
| 24ad39dc6f | |||
| dc82906983 | |||
| edb3f0dffb | |||
| c725793b46 |
@@ -0,0 +1,4 @@
|
||||
*.pyc
|
||||
*__pycache__/
|
||||
*.log
|
||||
*.tmp
|
||||
@@ -0,0 +1,9 @@
|
||||
*out
|
||||
*logs
|
||||
*actions
|
||||
*notifications
|
||||
*tools
|
||||
plugins
|
||||
user_trunk.yaml
|
||||
user.yaml
|
||||
tmp
|
||||
@@ -0,0 +1,2 @@
|
||||
[settings]
|
||||
profile=black
|
||||
@@ -0,0 +1,2 @@
|
||||
# Prettier friendly markdownlint config (all formatting rules disabled)
|
||||
extends: markdownlint/style/prettier
|
||||
@@ -0,0 +1,5 @@
|
||||
# Generic, formatter-friendly config.
|
||||
select = ["B", "D3", "E", "F"]
|
||||
|
||||
# Never enforce `E501` (line length violations). This should be handled by formatters.
|
||||
ignore = ["E501"]
|
||||
@@ -0,0 +1,35 @@
|
||||
# This file controls the behavior of Trunk: https://docs.trunk.io/cli
|
||||
# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
|
||||
version: 0.1
|
||||
cli:
|
||||
version: 1.25.0
|
||||
# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
|
||||
plugins:
|
||||
sources:
|
||||
- id: trunk
|
||||
ref: v1.7.3
|
||||
uri: https://github.com/trunk-io/plugins
|
||||
# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
|
||||
runtimes:
|
||||
enabled:
|
||||
- node@22.16.0
|
||||
- python@3.10.8
|
||||
# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
|
||||
lint:
|
||||
enabled:
|
||||
- bandit@1.8.6
|
||||
- black@25.9.0
|
||||
- checkov@3.2.486
|
||||
- git-diff-check
|
||||
- isort@7.0.0
|
||||
- markdownlint@0.45.0
|
||||
- prettier@3.6.2
|
||||
- ruff@0.14.1
|
||||
- trufflehog@3.90.11
|
||||
actions:
|
||||
disabled:
|
||||
- trunk-announce
|
||||
- trunk-check-pre-push
|
||||
- trunk-fmt-pre-commit
|
||||
enabled:
|
||||
- trunk-upgrade-available
|
||||
@@ -0,0 +1,737 @@
|
||||
# Release 0.3 Notes
|
||||
|
||||
History compiled from newest to oldest commit. Release-tagged commits are highlighted.
|
||||
|
||||
### 0.3
|
||||
- Date: 2025-10-29
|
||||
- Commit: f2a10ef4
|
||||
- Summary: 0.3
|
||||
- Files: version.nfo
|
||||
|
||||
### sync: nucleares_monitor v1.17
|
||||
- Date: 2025-10-29
|
||||
- Commit: 17b27471
|
||||
- Summary: sync: nucleares_monitor v1.17
|
||||
- Files: nucleares_monitor/version.nfo
|
||||
|
||||
### sync: help_scripts v0.4
|
||||
- Date: 2025-10-29
|
||||
- Commit: 4677df4b
|
||||
- Summary: sync: help_scripts v0.4
|
||||
- Files: help_scripts/sync_foundry_module.py, help_scripts/version.nfo, nucleares_monitor/control_board_monitor.py, nucleares_monitor/tests/test_arrange_windows.py, nucleares_monitor/tests/test_arrangement_fixes.py, nucleares_monitor/tests/test_high_priority_fixes.py (+4 more)
|
||||
|
||||
### Update of conf
|
||||
- Date: 2025-10-22
|
||||
- Commit: e0916f48
|
||||
- Summary: Update of conf
|
||||
- Files: .trunk/.gitignore, .trunk/configs/.isort.cfg, .trunk/configs/.markdownlint.yaml, .trunk/configs/ruff.toml, .trunk/trunk.yaml
|
||||
|
||||
### v 1.17 interim
|
||||
- Date: 2025-10-21
|
||||
- Commit: 1cc28b18
|
||||
- Summary: v 1.17 interim
|
||||
- Files: nucleares_monitor/control_board_monitor.py, requirements.txt, test_arrange_windows.py, test_arrangement_fixes.py
|
||||
|
||||
### gitignore
|
||||
- Date: 2025-10-21
|
||||
- Commit: 0c365665
|
||||
- Summary: gitignore
|
||||
- Files: .gitignore
|
||||
|
||||
### v 1.17
|
||||
- Date: 2025-10-21
|
||||
- Commit: e7307294
|
||||
- Summary: v 1.17
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.16-interim2
|
||||
- Date: 2025-10-21
|
||||
- Commit: 53c33c88
|
||||
- Summary: 1.16-interim2
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.16-interim
|
||||
- Date: 2025-10-21
|
||||
- Commit: 692bcb3b
|
||||
- Summary: 1.16-interim
|
||||
- Files: nucleares_monitor/control_board_monitor.py, nucleares_monitor/version.nfo
|
||||
|
||||
### v 1.15
|
||||
- Date: 2025-10-20
|
||||
- Commit: 4d0f601c
|
||||
- Summary: v 1.15
|
||||
- Files: nucleares_monitor/control_board_monitor.py, nucleares_monitor/mon.json
|
||||
|
||||
### 1.14
|
||||
- Date: 2025-10-20
|
||||
- Commit: c0a46c7b
|
||||
- Summary: 1.14
|
||||
- Files: nucleares_monitor/control_board_monitor.py, nucleares_monitor/mon.json, nucleares_monitor/stab_ion.json
|
||||
|
||||
### 1.13
|
||||
- Date: 2025-10-20
|
||||
- Commit: 04923cc4
|
||||
- Summary: 1.13
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.12
|
||||
- Date: 2025-10-20
|
||||
- Commit: 4beb0111
|
||||
- Summary: 1.12
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.11
|
||||
- Date: 2025-10-20
|
||||
- Commit: e06e2975
|
||||
- Summary: 1.11
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.10
|
||||
- Date: 2025-10-20
|
||||
- Commit: 8d5aac56
|
||||
- Summary: 1.10
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.9
|
||||
- Date: 2025-10-20
|
||||
- Commit: 45c98308
|
||||
- Summary: 1.9
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.8
|
||||
- Date: 2025-10-20
|
||||
- Commit: 9896a811
|
||||
- Summary: 1.8
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.7
|
||||
- Date: 2025-10-20
|
||||
- Commit: fd18fcf0
|
||||
- Summary: 1.7
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.6
|
||||
- Date: 2025-10-20
|
||||
- Commit: 7928d17e
|
||||
- Summary: 1.6
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.5
|
||||
- Date: 2025-10-20
|
||||
- Commit: 5a873b4e
|
||||
- Summary: 1.5
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.4
|
||||
- Date: 2025-10-20
|
||||
- Commit: cac380ca
|
||||
- Summary: 1.4
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.3
|
||||
- Date: 2025-10-20
|
||||
- Commit: 792694f6
|
||||
- Summary: 1.3
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.2
|
||||
- Date: 2025-10-20
|
||||
- Commit: e644daff
|
||||
- Summary: 1.2
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.1
|
||||
- Date: 2025-10-20
|
||||
- Commit: 3b88f4c8
|
||||
- Summary: 1.1
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 1.0
|
||||
- Date: 2025-10-20
|
||||
- Commit: a2fbabed
|
||||
- Summary: 1.0
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.9
|
||||
- Date: 2025-10-20
|
||||
- Commit: 23084f4c
|
||||
- Summary: 0.9
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.8
|
||||
- Date: 2025-10-20
|
||||
- Commit: 65b39890
|
||||
- Summary: 0.8
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.7
|
||||
- Date: 2025-10-20
|
||||
- Commit: a73459ea
|
||||
- Summary: 0.7
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.6
|
||||
- Date: 2025-10-20
|
||||
- Commit: c8a439c2
|
||||
- Summary: 0.6
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.4
|
||||
- Date: 2025-10-20
|
||||
- Commit: 311cb768
|
||||
- Summary: 0.4
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.3
|
||||
- Date: 2025-10-20
|
||||
- Commit: 61a8cb40
|
||||
- Summary: 0.3
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
### 0.1
|
||||
- Date: 2025-10-20
|
||||
- Commit: ca4a3b65
|
||||
- Summary: 0.1
|
||||
- Files: nucleares_monitor/control_board_monitor.py
|
||||
|
||||
## RELEASE 0.2
|
||||
### sync: nucleares_monitor v0.1
|
||||
- Date: 2025-10-11
|
||||
- Commit: ec8b3404
|
||||
- Tags: 0.2
|
||||
- Summary: sync: nucleares_monitor v0.1
|
||||
- Files: nucleares_monitor/control_board_monitor.py, nucleares_monitor/version.nfo
|
||||
|
||||
### sync: investigation-board_v13 v0.2
|
||||
- Date: 2025-10-09
|
||||
- Commit: c7048e6c
|
||||
- Summary: sync: investigation-board_v13 v0.2
|
||||
- Files: investigation-board_v13/investigation-board/module.json, investigation-board_v13/investigation-board/scripts/investigation-board.js, investigation-board_v13/version.nfo
|
||||
|
||||
### sync: wg-voidships-builder v1.4.13
|
||||
- Date: 2025-10-09
|
||||
- Commit: 3a610b71
|
||||
- Summary: sync: wg-voidships-builder v1.4.13
|
||||
- Files: wg-voidships-builder/module.json
|
||||
|
||||
### sync: investigation-board_v13 v0.1
|
||||
- Date: 2025-10-09
|
||||
- Commit: 9c06d9ce
|
||||
- Summary: sync: investigation-board_v13 v0.1
|
||||
- Files: investigation-board_v13/version.nfo
|
||||
|
||||
### sync: help_scripts v0.3
|
||||
- Date: 2025-10-09
|
||||
- Commit: a6cdd01e
|
||||
- Summary: sync: help_scripts v0.3
|
||||
- Files: help_scripts/version.nfo
|
||||
|
||||
### sync: foundry v0.2
|
||||
- Date: 2025-10-09
|
||||
- Commit: 0a4148ab
|
||||
- Summary: sync: foundry v0.2
|
||||
- Files: foundry/availability.csv, foundry/components_supplemental_xenos_archeotech.csv, foundry/starship_weapons.csv, foundry/version.nfo, help_scripts/generate_manifests.py, help_scripts/generate_manifestsv2.py (+17 more)
|
||||
|
||||
### sync: wg-voidships_doc v0.2
|
||||
- Date: 2025-09-19
|
||||
- Commit: 95a71cb6
|
||||
- Summary: sync: wg-voidships_doc v0.2
|
||||
- Files: wg-voidships_doc/version.nfo
|
||||
|
||||
### sync: wg-voidships-journal v1.0.2
|
||||
- Date: 2025-09-19
|
||||
- Commit: 97f738c5
|
||||
- Summary: sync: wg-voidships-journal v1.0.2
|
||||
- Files: wg-voidships-journal/module.json
|
||||
|
||||
### sync: wg-voidships-builder v1.4.12
|
||||
- Date: 2025-09-19
|
||||
- Commit: 5ed6c55e
|
||||
- Summary: sync: wg-voidships-builder v1.4.12
|
||||
- Files: wg-voidships-builder/module.json
|
||||
|
||||
### sync: gk-greyknight v0.6.5.3
|
||||
- Date: 2025-09-19
|
||||
- Commit: 7b621f8b
|
||||
- Summary: sync: gk-greyknight v0.6.5.3
|
||||
- Files: wg-greyknights/module.json
|
||||
|
||||
### sync: help_scripts v0.2
|
||||
- Date: 2025-09-19
|
||||
- Commit: 64c3b8ca
|
||||
- Summary: sync: help_scripts v0.2
|
||||
- Files: help_scripts/version.nfo
|
||||
|
||||
### sync: foundry v0.1
|
||||
- Date: 2025-09-19
|
||||
- Commit: 298239c3
|
||||
- Summary: sync: foundry v0.1
|
||||
- Files: foundry/all_hulls.csv, foundry/components_supplemental_xenos_archeotech.csv, foundry/essential_components.csv, foundry/starship_weapons.csv, foundry/version.nfo, foundry/wg-voidship-hulls copy.db (+6 more)
|
||||
|
||||
### sync: help_scripts v0.1
|
||||
- Date: 2025-09-19
|
||||
- Commit: ee632ee0
|
||||
- Summary: sync: help_scripts v0.1
|
||||
- Files: help_scripts/sync_foundry_module.py, help_scripts/version.nfo
|
||||
|
||||
### Cleanup part one
|
||||
- Date: 2025-09-19
|
||||
- Commit: bf6e1050
|
||||
- Summary: Cleanup part one
|
||||
- Files: foundry.zip, help_scripts/import.py, help_scripts/patch_hulls.py, help_scripts/patch_voidships.py, help_scripts/sound.py, help_scripts/sync_foundry_module.py (+8 more)
|
||||
|
||||
### sync: wg-voidships-builder v1.4.11
|
||||
- Date: 2025-09-19
|
||||
- Commit: c2a93cbd
|
||||
- Summary: sync: wg-voidships-builder v1.4.11
|
||||
- Files: wg-voidships-builder/module.json, wg-voidships-builder/packs/wg-voidship-items.db, wg-voidships-builder/scripts/voidship-actor.js
|
||||
|
||||
### sync: wg-voidships-builder v1.4.10
|
||||
- Date: 2025-09-19
|
||||
- Commit: 862e0c3c
|
||||
- Summary: sync: wg-voidships-builder v1.4.10
|
||||
- Files: wg-voidships-builder/module.json, wg-voidships-builder/sync_foundry_module.py
|
||||
|
||||
### sync: wg-voidships-builder v1.4.9
|
||||
- Date: 2025-09-19
|
||||
- Commit: 20345f16
|
||||
- Summary: sync: wg-voidships-builder v1.4.9
|
||||
- Files: wg-voidships-builder/module.json, wg-voidships-builder/packs/wg-voidship-items.db, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/sync_foundry_module.py
|
||||
|
||||
### aaa
|
||||
- Date: 2025-09-19
|
||||
- Commit: c11e029b
|
||||
- Summary: aaa
|
||||
- Files: wg-voidships-builder/packs/patch_voidships.py, wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/packs/wg-voidship-hulls.db.bak, wg-voidships-builder/packs/wg-voidship-items.db, wg-voidships-builder/packs/wg-voidship-items.db.bak, wg-voidships-builder/sync_foundry_module.py
|
||||
|
||||
### updt
|
||||
- Date: 2025-09-19
|
||||
- Commit: 886bced1
|
||||
- Summary: updt
|
||||
- Files: wg-voidships-builder/packs/wg-voidship-archeotech.db, wg-voidships-builder/packs/wg-voidship-xenos.db, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/templates/voidship-sheet.hbs
|
||||
|
||||
### Working version
|
||||
- Date: 2025-09-18
|
||||
- Commit: 584985ed
|
||||
- Summary: Working version
|
||||
- Files: wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/packs/wg-voidship-items.db, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/templates/voidship-sheet.hbs, wg-voidships-builder/wg-voidships-builder.zip
|
||||
|
||||
### aaa
|
||||
- Date: 2025-09-18
|
||||
- Commit: a4c51710
|
||||
- Summary: aaa
|
||||
- Files: wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/packs/wg-voidship-items.db, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/templates/voidship-sheet.hbs, wg-voidships-builder/wg-voidships-builder.zip
|
||||
|
||||
### 111
|
||||
- Date: 2025-09-18
|
||||
- Commit: 1abe31b3
|
||||
- Summary: 111
|
||||
- Files: foundry/wg-voidship-hulls copy.db, wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/packs/wg-voidship-items.db, wg-voidships-builder/sample_universe.json, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/scripts/voidships.js (+1 more)
|
||||
|
||||
### asd
|
||||
- Date: 2025-09-18
|
||||
- Commit: ddae4ad4
|
||||
- Summary: asd
|
||||
- Files: wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/scripts/voidships.js
|
||||
|
||||
### test
|
||||
- Date: 2025-09-18
|
||||
- Commit: 5186b264
|
||||
- Summary: test
|
||||
- Files: wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/templates/voidship-sheet.hbs
|
||||
|
||||
### 1
|
||||
- Date: 2025-09-18
|
||||
- Commit: e84c0127
|
||||
- Summary: 1
|
||||
- Files: wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/scripts/voidships.js, wg-voidships-builder/templates/voidship-sheet.hbs
|
||||
|
||||
### aaa
|
||||
- Date: 2025-09-18
|
||||
- Commit: 5892e614
|
||||
- Summary: aaa
|
||||
- Files: wg-voidships-builder/module.json, wg-voidships-builder/scripts/voidship-actor.js, wg-voidships-builder/templates/voidship-sheet.hbs
|
||||
|
||||
### 11
|
||||
- Date: 2025-09-18
|
||||
- Commit: e8ad5478
|
||||
- Summary: 11
|
||||
- Files: foundry.zip, wg-greyknights.0.6.4.9.zip, wg-voidships-builder.1.4.8.zip
|
||||
|
||||
### ss
|
||||
- Date: 2025-09-18
|
||||
- Commit: 89791655
|
||||
- Summary: ss
|
||||
- Files: foundry/Aegis Power Armour.json, foundry/Aegis Terminator Armour.json, foundry/Grey Knight Archetype.json, foundry/fvtt-Actor-aquila-lander-Qz0AG5vJU9HrYtxk.json, foundry/fvtt-Actor-cobra-class-destroyer-(renegade)-jPYz63kXVprYFXMi.json, foundry/fvtt-Actor-cobra-class-destroyer-b518e981d69324aa.json (+26 more)
|
||||
|
||||
### More context files
|
||||
- Date: 2025-09-18
|
||||
- Commit: 9c3d7350
|
||||
- Summary: More context files
|
||||
- Files: wg-greyknights/foundry/Aegis Power Armour.json, wg-greyknights/foundry/Aegis Terminator Armour.json, wg-greyknights/foundry/Grey Knight Archetype.json, wg-greyknights/foundry/fvtt-Actor-aquila-lander-Qz0AG5vJU9HrYtxk.json, wg-greyknights/foundry/fvtt-Actor-cobra-class-destroyer-(renegade)-jPYz63kXVprYFXMi.json, wg-greyknights/foundry/fvtt-Actor-cobra-class-destroyer-b518e981d69324aa.json (+13 more)
|
||||
|
||||
### Final final final
|
||||
- Date: 2025-09-18
|
||||
- Commit: d977cff4
|
||||
- Summary: Final final final
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/ui-gkpanel.js
|
||||
|
||||
### Final
|
||||
- Date: 2025-09-18
|
||||
- Commit: 56ada5e1
|
||||
- Summary: Final
|
||||
- Files: wg-greyknights/LICENSE, wg-greyknights/README.txt, wg-greyknights/icons/placeholder.txt, wg-greyknights/manifest.json, wg-greyknights/packs/daemonhunters.db, wg-greyknights/packs/gk-items-060.db (+4 more)
|
||||
|
||||
### cleanup
|
||||
- Date: 2025-09-18
|
||||
- Commit: 7c35c1bb
|
||||
- Summary: cleanup
|
||||
- Files: wg-greyknights/content/Daemonhunters/Abilities/Aegis of Titan.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight (General).json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Justicar.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Paladin.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Purgation Marine.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Purifier.json (+20 more)
|
||||
|
||||
### Import gk-greyknight-0.6.4.8.zip do wg-greyknights (2025-08-25T13:36:01Z)
|
||||
- Date: 2025-08-25
|
||||
- Commit: b2c47b68
|
||||
- Summary: Import gk-greyknight-0.6.4.8.zip do wg-greyknights (2025-08-25T13:36:01Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import gk-greyknight-0.6.4.5.zip do wg-greyknights (2025-08-23T20:41:27Z)
|
||||
- Date: 2025-08-23
|
||||
- Commit: fbbc5eec
|
||||
- Summary: Import gk-greyknight-0.6.4.5.zip do wg-greyknights (2025-08-23T20:41:27Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import gk-greyknight-0.6.4.4.zip do wg-greyknights (2025-08-23T20:15:27Z)
|
||||
- Date: 2025-08-23
|
||||
- Commit: 1d346db6
|
||||
- Summary: Import gk-greyknight-0.6.4.4.zip do wg-greyknights (2025-08-23T20:15:27Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import gk-greyknight-0.6.4.3.zip do wg-greyknights (2025-08-23T19:48:54Z)
|
||||
- Date: 2025-08-23
|
||||
- Commit: 0e417ca6
|
||||
- Summary: Import gk-greyknight-0.6.4.3.zip do wg-greyknights (2025-08-23T19:48:54Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import gk-greyknight-0.6.4.2.zip do wg-greyknights (2025-08-23T19:35:08Z)
|
||||
- Date: 2025-08-23
|
||||
- Commit: 47a0250f
|
||||
- Summary: Import gk-greyknight-0.6.4.2.zip do wg-greyknights (2025-08-23T19:35:08Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import gk-greyknight-0.6.4.1-patch.zip do wg-greyknights (2025-08-23T19:02:02Z)
|
||||
- Date: 2025-08-23
|
||||
- Commit: f4074855
|
||||
- Summary: Import gk-greyknight-0.6.4.1-patch.zip do wg-greyknights (2025-08-23T19:02:02Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import gk-greyknight-0.6.4-patch.zip do wg-greyknights (2025-08-23T19:01:42Z)
|
||||
- Date: 2025-08-23
|
||||
- Commit: 4dbce12b
|
||||
- Summary: Import gk-greyknight-0.6.4-patch.zip do wg-greyknights (2025-08-23T19:01:42Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/auto-loadout.js
|
||||
|
||||
### Import 0.6.1.stable.gk.zip do wg-greyknights (2025-08-22T17:44:46Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: e29930d0
|
||||
- Summary: Import 0.6.1.stable.gk.zip do wg-greyknights (2025-08-22T17:44:46Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/helpers.js
|
||||
|
||||
### Import wng-daemonhunters-0.6.4.2.zip do wg-greyknights (2025-08-22T17:26:07Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: 45b2d0d3
|
||||
- Summary: Import wng-daemonhunters-0.6.4.2.zip do wg-greyknights (2025-08-22T17:26:07Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/daemonhunters.db, wg-greyknights/scripts/auto-gk-archetype.js
|
||||
|
||||
### Import wng-daemonhunters-0.6.4.1.zip do wg-greyknights (2025-08-22T17:07:40Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: e164cb6e
|
||||
- Summary: Import wng-daemonhunters-0.6.4.1.zip do wg-greyknights (2025-08-22T17:07:40Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/daemonhunters.db, wg-greyknights/scripts/auto-gk-archetype.js
|
||||
|
||||
### Import gk-greyknight-0.6.3.zip do wg-greyknights (2025-08-22T12:08:07Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: fe70f879
|
||||
- Summary: Import gk-greyknight-0.6.3.zip do wg-greyknights (2025-08-22T12:08:07Z)
|
||||
- Files: wg-greyknights/module.json, wg-greyknights/packs/gk-items.db
|
||||
|
||||
### Import gk-greyknight-0.6.1.zip do wg-greyknights (2025-08-22T11:40:25Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: bf3fe1e7
|
||||
- Summary: Import gk-greyknight-0.6.1.zip do wg-greyknights (2025-08-22T11:40:25Z)
|
||||
- Files: wg-greyknights/README.txt, wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.6.0.zip do wg-greyknights (2025-08-22T11:09:50Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: 4408ca89
|
||||
- Summary: Import gk-greyknight-0.6.0.zip do wg-greyknights (2025-08-22T11:09:50Z)
|
||||
- Files: wg-greyknights/README.txt, wg-greyknights/module.json, wg-greyknights/packs/gk-items-060.db, wg-greyknights/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.5.3.zip do wg-greyknights (2025-08-22T10:31:14Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: 73b70ca4
|
||||
- Summary: Import gk-greyknight-0.5.3.zip do wg-greyknights (2025-08-22T10:31:14Z)
|
||||
- Files: wg-greyknights/README.txt, wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-last_stable.zip do wg-greyknights (2025-08-22T10:21:33Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: 2e44ddf7
|
||||
- Summary: Import gk-greyknight-last_stable.zip do wg-greyknights (2025-08-22T10:21:33Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.5.1-patch/packs/gk-items.db, wg-greyknights/module.json, wg-greyknights/packs/gk-items.db, wg-greyknights/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.5.2-patch.zip do wg-greyknights (2025-08-22T10:04:48Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: 235f91f0
|
||||
- Summary: Import gk-greyknight-0.5.2-patch.zip do wg-greyknights (2025-08-22T10:04:48Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.7-patch/module.json.patch.json, wg-greyknights/gk-greyknight-0.5.2-patch/module.json.patch.json, wg-greyknights/gk-greyknight-0.5.2-patch/packs/gk-items-051.db
|
||||
|
||||
### Import gk-greyknight-0.5.1-patch.zip do wg-greyknights (2025-08-22T09:46:13Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: d7bb2559
|
||||
- Summary: Import gk-greyknight-0.5.1-patch.zip do wg-greyknights (2025-08-22T09:46:13Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.5.0-patch/packs/gk-items.db, wg-greyknights/gk-greyknight-0.5.1-patch/packs/gk-items.db
|
||||
|
||||
### Import gk-greyknight-0.5.0-patch.zip do wg-greyknights (2025-08-22T00:06:01Z)
|
||||
- Date: 2025-08-22
|
||||
- Commit: 06ae94b8
|
||||
- Summary: Import gk-greyknight-0.5.0-patch.zip do wg-greyknights (2025-08-22T00:06:01Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.5.0-patch/packs/gk-items.db
|
||||
|
||||
### Import gk-greyknight-0.4.9-patch.zip do wg-greyknights (2025-08-21T23:12:29Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 8fe7cf51
|
||||
- Summary: Import gk-greyknight-0.4.9-patch.zip do wg-greyknights (2025-08-21T23:12:29Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.9-patch/packs/gk-items.db, wg-greyknights/gk-greyknight-0.4.9-patch/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.4.8-patch.zip do wg-greyknights (2025-08-21T22:49:35Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 2452cb60
|
||||
- Summary: Import gk-greyknight-0.4.8-patch.zip do wg-greyknights (2025-08-21T22:49:35Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.8-patch/packs/gk-items.db
|
||||
|
||||
### Import gk-greyknight-0.4.7-patch.zip do wg-greyknights (2025-08-21T22:41:13Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: f7b7e00c
|
||||
- Summary: Import gk-greyknight-0.4.7-patch.zip do wg-greyknights (2025-08-21T22:41:13Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.7-patch/module.json.patch.json, wg-greyknights/gk-greyknight-0.4.7-patch/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.4.6-patch.zip do wg-greyknights (2025-08-21T22:23:55Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 2111d117
|
||||
- Summary: Import gk-greyknight-0.4.6-patch.zip do wg-greyknights (2025-08-21T22:23:55Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.6-patch/packs/gk-items.db, wg-greyknights/gk-greyknight-0.4.6-patch/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.4.5-patch.zip do wg-greyknights (2025-08-21T22:05:46Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 5fcdc8d2
|
||||
- Summary: Import gk-greyknight-0.4.5-patch.zip do wg-greyknights (2025-08-21T22:05:46Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.5-patch/packs/gk-items.db, wg-greyknights/gk-greyknight-0.4.5-patch/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.4.4-patch.zip do wg-greyknights (2025-08-21T21:44:57Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 305edfa7
|
||||
- Summary: Import gk-greyknight-0.4.4-patch.zip do wg-greyknights (2025-08-21T21:44:57Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.2-patch/scripts/auto-loadout.js, wg-greyknights/gk-greyknight-0.4.4-patch/module.json.patch.json, wg-greyknights/gk-greyknight-0.4.4-patch/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.4.3-patch.zip do wg-greyknights (2025-08-21T21:34:22Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 0ab17ffe
|
||||
- Summary: Import gk-greyknight-0.4.3-patch.zip do wg-greyknights (2025-08-21T21:34:22Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.3-patch/packs/gk-items.db
|
||||
|
||||
### Import gk-greyknight-0.4.2-patch.zip do wg-greyknights (2025-08-21T21:19:36Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: cf7c4696
|
||||
- Summary: Import gk-greyknight-0.4.2-patch.zip do wg-greyknights (2025-08-21T21:19:36Z)
|
||||
- Files: wg-greyknights/gk-greyknight-0.4.2-patch/module.json.patch.json, wg-greyknights/gk-greyknight-0.4.2-patch/packs/gk-items.db, wg-greyknights/gk-greyknight-0.4.2-patch/scripts/auto-loadout.js, wg-greyknights/scripts/auto-loadout.js
|
||||
|
||||
### Import gk-greyknight-0.4.1.zip do wg-greyknights (2025-08-21T20:56:51Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: da34a795
|
||||
- Summary: Import gk-greyknight-0.4.1.zip do wg-greyknights (2025-08-21T20:56:51Z)
|
||||
- Files: wg-greyknights/README.txt, wg-greyknights/module.json
|
||||
|
||||
### Import gk-greyknight-compendium-0.4.0.zip do wg-greyknights (2025-08-21T20:43:39Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: b3017588
|
||||
- Summary: Import gk-greyknight-compendium-0.4.0.zip do wg-greyknights (2025-08-21T20:43:39Z)
|
||||
- Files: wg-greyknights/README.txt, wg-greyknights/docs/README.txt, wg-greyknights/module.json, wg-greyknights/packs/gk-items.db
|
||||
|
||||
### Import wrath-and-glory-gk-0.3.0.zip do wg-greyknights (2025-08-21T20:13:12Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 10c76306
|
||||
- Summary: Import wrath-and-glory-gk-0.3.0.zip do wg-greyknights (2025-08-21T20:13:12Z)
|
||||
- Files: wg-greyknights/content/Daemonhunters/Abilities/Aegis of Titan.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight (General).json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Justicar.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Paladin.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Purgation Marine.json, wg-greyknights/content/Daemonhunters/Archetypes/Grey Knight Purifier.json (+13 more)
|
||||
|
||||
### Import wrath-and-glory-gk-0.2.1.zip do wg-greyknights (2025-08-21T20:13:04Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: cbbdb35f
|
||||
- Summary: Import wrath-and-glory-gk-0.2.1.zip do wg-greyknights (2025-08-21T20:13:04Z)
|
||||
- Files: wg-greyknights/docs/README.txt, wg-greyknights/manifest.json, wg-greyknights/module.json
|
||||
|
||||
### Import wrath-and-glory-gk-0.2.0.zip do wg-greyknights (2025-08-21T20:12:55Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: b4ee703f
|
||||
- Summary: Import wrath-and-glory-gk-0.2.0.zip do wg-greyknights (2025-08-21T20:12:55Z)
|
||||
- Files: wg-greyknights/README.txt, wg-greyknights/docs/README.txt, wg-greyknights/foundry/items/Aegis Power Armour.json, wg-greyknights/foundry/items/Aegis Terminator Armour.json, wg-greyknights/foundry/items/Aegis of Titan.json, wg-greyknights/foundry/items/Grey Knight Archetype.json (+8 more)
|
||||
|
||||
### Import gk-greyknight-0.1.0.zip do wg-greyknights (2025-08-21T19:51:05Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: 24ad39dc
|
||||
- Summary: Import gk-greyknight-0.1.0.zip do wg-greyknights (2025-08-21T19:51:05Z)
|
||||
- Files: wg-greyknights/LICENSE, wg-greyknights/README.txt, wg-greyknights/foundry/actors/gk-incognito.json, wg-greyknights/foundry/actors/gk-power-armour.json, wg-greyknights/foundry/actors/gk-terminator.json, wg-greyknights/foundry/fvtt-Item-ability-aegis-of-titan_v5.json (+10 more)
|
||||
|
||||
### Import GK_Foundry_Macros_Fix_v5.zip do wg-greyknights (2025-08-21T19:30:33Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: dc829069
|
||||
- Summary: Import GK_Foundry_Macros_Fix_v5.zip do wg-greyknights (2025-08-21T19:30:33Z)
|
||||
- Files: wg-greyknights/macro/macro-gk-auto-loadout-on-archetype.js, wg-greyknights/macros/macro-gk-auto-loadout-on-archetype.js, wg-greyknights/macros/macro-gk-glow-toggle.js, wg-greyknights/macros/macro-gk-import-world-items-FIXED.js, wg-greyknights/macros/macro-gk-loadout-manager.js
|
||||
|
||||
### Import GK_Foundry_GreyKnight_v5.zip do wg-greyknights (2025-08-21T19:02:44Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: edb3f0df
|
||||
- Summary: Import GK_Foundry_GreyKnight_v5.zip do wg-greyknights (2025-08-21T19:02:44Z)
|
||||
- Files: wg-greyknights/foundry/fvtt-Item-ability-aegis-of-titan_v5.json, wg-greyknights/foundry/fvtt-Item-aegis-power-armour_v2.json, wg-greyknights/foundry/fvtt-Item-archetype-grey-knight_v5.json, wg-greyknights/foundry/fvtt-Item-gk-armour-integrated-storm-bolter_v2.json, wg-greyknights/foundry/fvtt-Item-nemesis-force-halberd_v4.json, wg-greyknights/foundry/fvtt-Item-terminator-aegis-gk_v4.json (+4 more)
|
||||
|
||||
### Import Grey_Knight_WrathAndGlory_FoundryPack.zip do wg-greyknights (2025-08-21T17:10:55Z)
|
||||
- Date: 2025-08-21
|
||||
- Commit: c725793b
|
||||
- Summary: Import Grey_Knight_WrathAndGlory_FoundryPack.zip do wg-greyknights (2025-08-21T17:10:55Z)
|
||||
- Files: wg-greyknights/foundry/fvtt-Actor-grey-knight-FRESH.json, wg-greyknights/foundry/fvtt-Item-ability-aegis-of-titan.json, wg-greyknights/foundry/fvtt-Item-aegis-psychic-hood-gk_v2.json, wg-greyknights/foundry/fvtt-Item-archetype-grey-knight_v2.json, wg-greyknights/foundry/fvtt-Item-nemesis-force-halberd.json, wg-greyknights/foundry/fvtt-Item-pilgrim-astartes-plate.json (+2 more)
|
||||
|
||||
## RELEASE 0.1
|
||||
### a
|
||||
- Date: 2025-09-17
|
||||
- Commit: ddb82921
|
||||
- Tags: 0.1
|
||||
- Summary: a
|
||||
- Files: import.py
|
||||
|
||||
### aa
|
||||
- Date: 2025-09-17
|
||||
- Commit: 541ef488
|
||||
- Summary: aa
|
||||
- Files: import.py
|
||||
|
||||
### aa
|
||||
- Date: 2025-09-17
|
||||
- Commit: e256c731
|
||||
- Summary: aa
|
||||
- Files: import.py, wg-greyknights/module.json
|
||||
|
||||
### Rename
|
||||
- Date: 2025-09-17
|
||||
- Commit: e284eceb
|
||||
- Summary: Rename
|
||||
- Files: wg-voidships-builder/LICENSE, wg-voidships-builder/journal/README.md, wg-voidships-builder/module.json, wg-voidships-builder/packs/wg-voidship-archeotech.db, wg-voidships-builder/packs/wg-voidship-hulls.db, wg-voidships-builder/packs/wg-voidship-items.db (+5 more)
|
||||
|
||||
### Done
|
||||
- Date: 2025-09-17
|
||||
- Commit: 355e4ab7
|
||||
- Summary: Done
|
||||
- Files: wg-voidships-foundry/packs/wg-voidship-items.db, wg-voidships-foundry/packs/wg-voidship-macros.db, wg-voidships-foundry/packs/wg-voidships-items.db
|
||||
|
||||
### asss
|
||||
- Date: 2025-09-17
|
||||
- Commit: 06297a9e
|
||||
- Summary: asss
|
||||
- Files: wg-voidships-foundry/packs/wg-voidship-items.db, wg-voidships-foundry/packs/wg-voidship-macros.db
|
||||
|
||||
### 12
|
||||
- Date: 2025-09-16
|
||||
- Commit: 1c80b743
|
||||
- Summary: 12
|
||||
- Files: wg-voidships-foundry/packs/wg-voidship-archeotech.db, wg-voidships-foundry/packs/wg-voidship-items.db, wg-voidships-foundry/packs/wg-voidship-macros.db, wg-voidships-foundry/packs/wg-voidship-xenos.db, wg-voidships-foundry/packs/wg-voidships-macros.db
|
||||
|
||||
### dd
|
||||
- Date: 2025-09-16
|
||||
- Commit: 22e4553c
|
||||
- Summary: dd
|
||||
- Files: wg-voidships-foundry/journal/README.md, wg-voidships-foundry/packs/wg-voidship-hulls.db, wg-voidships-foundry/packs/wg-voidship-items.db, wg-voidships-foundry/packs/wg-voidship-macros.db, wg-voidships-foundry/packs/wg-voidship-xenos.db, wg-voidships-foundry/packs/wg-voidship-xewnos.db (+1 more)
|
||||
|
||||
### 11
|
||||
- Date: 2025-09-16
|
||||
- Commit: e34f3a22
|
||||
- Summary: 11
|
||||
- Files: wg-voidships-foundry/module.json, wg-voidships-foundry/packs/wg-voidship-archeotech.db, wg-voidships-foundry/packs/wg-voidship-xewnos.db, wg-voidships-foundry/packs/wg-voidships-items.db, wg-voidships-foundry/patch_hulls.py
|
||||
|
||||
### ASaa
|
||||
- Date: 2025-09-16
|
||||
- Commit: 5511acfb
|
||||
- Summary: ASaa
|
||||
- Files: sound.py, wg-voidships-foundry.zip, wg-voidships-foundry/module.json, wg-voidships-foundry/packs/wg-voidship-hulls.db, wg-voidships-foundry/packs/wg-voidships-actors.db, wg-voidships-foundry/packs/wg-voidships-items.db (+3 more)
|
||||
|
||||
### sss
|
||||
- Date: 2025-08-29
|
||||
- Commit: db350588
|
||||
- Summary: sss
|
||||
- Files: wg-voidships-foundry/journal/README.md, wg-voidships-foundry/module.json, wg-voidships-foundry/packs/wg-voidships-items.db
|
||||
|
||||
### 0.1
|
||||
- Date: 2025-08-29
|
||||
- Commit: 987eef4f
|
||||
- Summary: 0.1
|
||||
- Files: wg-voidships-foundry/LICENSE, wg-voidships-foundry/journal/README.md, wg-voidships-foundry/module.json, wg-voidships-foundry/packs/wg-voidships-actors.db, wg-voidships-foundry/packs/wg-voidships-macros.db, wg-voidships-foundry/packs/wg-voidships-tables.db (+1 more)
|
||||
|
||||
### Module import
|
||||
- Date: 2025-08-27
|
||||
- Commit: 7465a79a
|
||||
- Summary: Module import
|
||||
- Files: wg-voidships-journal.1.0.zip, wg-voidships-journal/LICENSE, wg-voidships-journal/README.md, wg-voidships-journal/module.json, wg-voidships-journal/packs/wg-voidships-docs.db, wg-voidships.1.0.1.zip (+3 more)
|
||||
|
||||
### Voidships - Ship - part 2
|
||||
- Date: 2025-08-27
|
||||
- Commit: 18a3ef3c
|
||||
- Summary: Voidships - Ship - part 2
|
||||
- Files: wg-voidships/voidship-docs-journal-import.json, wg-voidships_doc/wg-voidhsips_of_gilead_doc/Voidships_WG_ships2.html
|
||||
|
||||
### fix
|
||||
- Date: 2025-08-27
|
||||
- Commit: 769d568d
|
||||
- Summary: fix
|
||||
- Files: wg-voidships_doc/wg-voidhsips_of_gilead_doc/Voidships_WG_ships.html
|
||||
|
||||
### V 1.0.1 release candidate start of v 1.1.0 development
|
||||
- Date: 2025-08-27
|
||||
- Commit: 62989221
|
||||
- Summary: V 1.0.1 release candidate start of v 1.1.0 development
|
||||
- Files: wg-voidships.1.0.1.zip, wg-voidships_doc/wg-voidhsips_of_gilead_doc/ships.html
|
||||
|
||||
## RELEASE 1.0.2-
|
||||
### v 1.0.2
|
||||
- Date: 2025-08-26
|
||||
- Commit: b4728cf1
|
||||
- Tags: 1.0.2-
|
||||
- Summary: v 1.0.2
|
||||
- Files: wg-voidships/LICENSE.txt, wg-voidships/README.md, wg-voidships/module.json, wg-voidships/packs/campaign-silica-animus.db, wg-voidships/packs/ships-of-gilead-v3.db, wg-voidships/packs/voidships-catalogue-v3.db (+7 more)
|
||||
|
||||
### fx - vs 1.0.1
|
||||
- Date: 2025-08-26
|
||||
- Commit: f3f689b0
|
||||
- Summary: fx - vs 1.0.1
|
||||
- Files: wg-voidships_doc/Voidships_WG_Catalogue.html, wg-voidships_doc/Voidships_WG_Catalogue_critical_hits.html, wg-voidships_doc/Voidships_WG_Construction.html, wg-voidships_doc/Voidships_WG_Rules.html
|
||||
|
||||
## RELEASE voidships-1.0
|
||||
### Voidships rules v.1.0
|
||||
- Date: 2025-08-26
|
||||
- Commit: 4ed12c28
|
||||
- Tags: voidships-1.0
|
||||
- Summary: Voidships rules v.1.0
|
||||
- Files: wg-voidships_doc/Voidships_WG_Catalogue_v3.html, wg-voidships_doc/Voidships_WG_Construction_RT_v3.html, wg-voidships_doc/Voidships_WG_Rules_v3.html
|
||||
|
||||
### v2
|
||||
- Date: 2025-08-26
|
||||
- Commit: 1fbe8bb7
|
||||
- Summary: v2
|
||||
- Files: wg-voidships_doc/Voidships_WG_Rules_v3.html
|
||||
|
||||
### v2
|
||||
- Date: 2025-08-26
|
||||
- Commit: 5af5f455
|
||||
- Summary: v2
|
||||
- Files: wg-voidships_doc/Voidships_WG_Catalogue_v3.html, wg-voidships_doc/Voidships_WG_Construction_RT_v3.html, wg-voidships_doc/Voidships_WG_Rules_v3.html
|
||||
|
||||
### Initial commit voidships
|
||||
- Date: 2025-08-26
|
||||
- Commit: 0368c130
|
||||
- Summary: Initial commit voidships
|
||||
- Files: wg-voidships/LICENSE.txt, wg-voidships/README.md, wg-voidships/module.json, wg-voidships/packs/campaign-silica-animus.db, wg-voidships/packs/ships-of-gilead-v3.db, wg-voidships/packs/voidships-catalogue-v3.db (+6 more)
|
||||
@@ -0,0 +1 @@
|
||||
0.1
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "Aegis Power Armour",
|
||||
"type": "armor",
|
||||
"img": "icons/svg/shield.svg",
|
||||
"system": {
|
||||
"keywords": [
|
||||
"GREY KNIGHTS",
|
||||
"INQUISITION",
|
||||
"DAEMONHUNTERS",
|
||||
"ORDO MALLEUS"
|
||||
],
|
||||
"effects": [
|
||||
"Aegis Warding (toggleable barrier; visual runes glow)",
|
||||
"Psychic Hood Integration (+dice to Deny the Witch)"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "Aegis Terminator Armour",
|
||||
"type": "armor",
|
||||
"img": "icons/svg/shield.svg",
|
||||
"system": {
|
||||
"keywords": [
|
||||
"GREY KNIGHTS",
|
||||
"INQUISITION",
|
||||
"DAEMONHUNTERS",
|
||||
"ORDO MALLEUS"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "Grey Knight",
|
||||
"type": "archetype",
|
||||
"img": "icons/svg/book.svg",
|
||||
"system": {
|
||||
"keywords": [
|
||||
"GREY KNIGHTS",
|
||||
"INQUISITION",
|
||||
"DAEMONHUNTERS",
|
||||
"ORDO MALLEUS"
|
||||
],
|
||||
"wargear": [
|
||||
"Nemesis Force Halberd",
|
||||
"Aegis Power Armour",
|
||||
"Grey Knight Armour Integrated Storm Bolter"
|
||||
],
|
||||
"notes": "Innate: +1 vs Corruption; +1 additional vs Corruption when equipped with Aegis armour. Adds Aegis of Titan ability."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
hull_name,class_type,speed,manoeuvrability,detection,hull_integrity,armour,turret_rating,space,sp,weapon_capacity,special_rules_notes,length_km,beam_km,mass_megatonnes,crew,acceleration_g,summary_3_sentences
|
||||
Jericho-class Pilgrim Vessel,Transport,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,1.8,0.45,UNKN,"≈19,300",3.5,"Pielgrzymkowiec zaprojektowany do długich, samowystarczalnych rejsów z wiernymi i ładunkiem sakralnym; tani w utrzymaniu, ale nie jest okrętem wojennym. Najczęściej służy rodowodom, sektom i zakonnikom do żeglugi „z wiarą przez pustkę”. Po modyfikacjach bywa trzonem taniej, szerokozakresowej logistyki dynastii Rogue Tradera."
|
||||
Vagabond-class Merchant Trader,Transport,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,1.9,0.45,UNKN,"≈24,000",4.0,"Klasyczny „koń roboczy” kupców—dużo ładowni, oszczędne systemy i przyzwoity zasięg. Odporny na trudy dzikich szlaków, ale w walce raczej ucieka niż wygrywa wymianę ognia. Popularny wśród niezależnych domów i dynastii rozpoczynających ekspansję."
|
||||
Viper-class Scout Sloop,Transport/Scout,11,+28,+15,22,15,1,20,25,Dorsal 1,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Ekstremalnie szybki i zwinny zwiadowca do rozpoznania i patroli. Minimalne uzbrojenie rekompensuje mobilnością i świetną elektroniką. Idealny do kurierki, sondowania przejść i „pierwszego kontaktu”."
|
||||
Carrack-class Transport,Transport,4,+10,+10,40,17,1,45,35,"Prow 1, Dorsal 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Stary, pojemny wół roboczy—wozi wszystko, wszędzie, byle powoli. Często przerabiany na „filtry” dla kontrabandy i szarej logistyki. Lubiany przez dynastie wolące pewność i ładowność zamiast osiągów."
|
||||
Goliath-class Factory Ship,Transport/Industrial,3,−5,+5,55,17,1,65,40,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Mobilna fabryka z potężnymi warsztatami i ciągami przetwórczymi. Sprawdza się w długich operacjach poza liniami zaopatrzenia. Powolny, ale strategicznie bezcenny dla kolonizacji i kampanii przemysłowych."
|
||||
Universe-class Mass Conveyor,Transport/Mass Conveyor,2,−10,+10,70,18,1,100,52,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Gigant do przerzutu olbrzymich mas ludzi i towarów—„miasteczko w pustce”. Prawie nie walczy; jego ochroną jest eskorta i dystans. Kręgosłup wielkich przedsięwzięć kolonizacyjnych i krucjat logistycznych.
|
||||
Hazeroth-class Privateer,Raider,10,+23,+12,32,14,1,35,30,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Szybki korsarz z Hazeroth Abyss—pozbywa się pancerza i ładowni na rzecz napędu. Ucieka, jeśli nie może wygrać. Ulubieniec prywaterskich kapitanów i klanów pirackich."
|
||||
Havoc-class Merchant Raider,Raider,9,+25,+10,30,16,1,40,35,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"„Szklana armata”—mocny bitewnie, kruchy w obronie. Znakomity do szybkich uderzeń na frachtowce. W rękach zdolnego kapitana groźny nawet dla fregat."
|
||||
Iconoclast-class Destroyer,Destroyer,10,+25,+10,30,15,1,35,30,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Agresywny niszczyciel flot reaverów i renegatów. Potężny pęd, lekki pancerz—walczy z pozycji przewagi lub nie walczy wcale. Częsty trzon watah pirackich."
|
||||
Meritech Shrike-class Raider,Raider,10,+22,+15,35,16,1,40,35,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Dziedzictwo wojen Merate—szybkie rojujące rajdery o „pirackiej” filozofii walki. Znakomite do wilczych stad i polowań na eskorty. Znane z bezwzględności i przebiegłych modernizacji.
|
||||
Cobra-class Destroyer,Destroyer,10,+30,+10,30,15,1,35,30,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Najmniejszy pełnoprawny okręt Marynarki—zabójczy nosiciel torped. W wilczych stadach rozrywa linię wroga i znika. Ulubiony „budżetowy” wybór dynastii, które przerabiają wyrzutnie na ładownie."
|
||||
Sword-class Frigate,Frigate,8,+20,+15,35,18,2,40,40,Dorsal 2,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Niezawodny, wszechstronny eskortowiec; „miecz” we flocie i u Traderów. Sprawdzone systemy, celne lasy, solidne napędy. Często przerabiany na frachtowóz-raidera."
|
||||
Tempest-class Strike Frigate,Frigate,8,+20,+15,35,19,2,40,40,Dorsal 2,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Uderzeniowa fregata zaprojektowana do silnych, krótkich starć. Minimalne przerwy ogniowe, maksymalizacja siły salwy. Doskonała jako „młot” w parze z „mieczem” Swordów."
|
||||
Firestorm-class Frigate,Frigate,7,+20,+15,38,18,1,40,41,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,„Miecz z lancą”—Sword z przebudową na potężną lancę dziobową. Świetna kontra na inne eskorty dzięki zasięgowi lancy. Rzadziej wybierana przez Traderów ze względu na mniejszą ładowność.
|
||||
Turbulent-class Heavy Frigate,Heavy Frigate,7,+18,+15,40,20,1,42,42,Dorsal 2,Hot Drives: +2 Power to each drive component; Antiquated Comms: −5 to Command (setting-specific note).,UNKN,UNKN,UNKN,UNKN,UNKN,"Rzadki „ciężki” eskorta—gorące generatory kosztem anachronicznych systemów łączności. Słynie z agresywnej służby i „szczęścia” w bitwach. Dla Traderów: świetny, jeśli priorytetem jest bitewna odporność."
|
||||
Dauntless-class Light Cruiser,Light Cruiser,7,+15,+20,60,19,1,60,55,"Prow 1, Port 1, Starboard 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Oczy i uszy flot—zasięg, zapasy, „duża lanca z przodu”. Łączy zwrotność fregaty z siłą lekkiego krążownika. Idealny „lider” skrzydeł eskorckich."
|
||||
Endeavour-class Light Cruiser,Light Cruiser,6,+12,+15,60,20,2,58,57,"Prow 2 (1 torpedo), Port 1, Starboard 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Nowocześniejszy „bulterier” flot—torpedowy specjalista o zbalansowanym uzbrojeniu. Stanowi bazę dla wariantów Endurance/Defiant (lanca/carrier) w doktrynie BFG. W RT świetny dla Traderów nastawionych na bitwy liniowe.
|
||||
Defiant-class Light Cruiser,Light Cruiser/Carrier,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Launch Bays (light carrier configuration),UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Lekki lotniskowiec—wyjątkowo cenny do zwiadu, projekcji siły i osłony konwojów. Wymaga ochrony, bo sam ma „krótsze zęby”. Daje Rogue Traderowi elastyczność operacyjną dzięki Furies/Starhawks."
|
||||
Secutor-class Monitor-Cruiser,Monitor Cruiser,6,+15,+30,52,20,UNKN,56,UNKN,"Prow 1, Port 1, Starboard 1",Void Shields: 1 (explicit); Mechanicus pattern.,UNKN,UNKN,UNKN,UNKN,UNKN,"Mechanicusowy „czapnik”—długie czujniki, metodyczne polowanie, mniejsza prędkość. Pogardzany przez część Marynarki, ale lubiany przez Magosów za stabilność platformy. Idealny do patroli i „czystek” sektora."
|
||||
Lathe-class Monitor-Cruiser,Monitor Cruiser,5,+12,+15,63,20,1,60,55,"Dorsal 1, Prow 1, Port 1, Starboard 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Ultra-samowystarczalny „flotowy traktor” Mechanicus—wolniejszy, za to pancerniejszy od typowych LCs. Znakomity w długich rejsach bez doków. Platforma do eksploracji „głębokiej pustki”."
|
||||
Lunar-class Cruiser,Cruiser,5,+10,+10,70,20,2,75,60,"Prow 1, Port 2, Starboard 2",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Kręgosłup flot; bardzo wszechstronny i łatwiejszy w budowie. Traderzy zwykle zdejmują torpedy pod dodatkowe ładownie. Świetny kompromis między siłą ognia a adaptacyjnością.
|
||||
Tyrant-class Cruiser,Cruiser,5,+10,+10,70,20,2,77,61,"Prow 1, Port 2, Starboard 2",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Krążownik „superfired plasma”—nacisk na daleki ogień makrobaterii. Wersje retro-fit często sięgają po odzyskane dalekosiężne uzbrojenie. Lubiany przez Traderów, którzy chcą siać ogień z dystansu."
|
||||
Carnage-class Cruiser,Cruiser (Traitor),5,+12,+12,65,19,2,72,58,"Prow 1, Port 2, Starboard 2",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Klasyk sił Archenemesis—„śnieżyca makroognia” po kosztach pancerza. Groźny, gdy trzyma dystans i przewagę liczebną. W rękach renegatów bywa jądrem ich „linii bojowej”."
|
||||
Overlord-class Battlecruiser,Battlecruiser,5,+10,+10,70,20,2,78,64,"Prow 1, Port 2, Starboard 2, Dorsal 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Klasyczny ciężki „dowódca dywizjonu”—zbalansowana, dalekosiężna artyleria i torpedy. Bardzo „marynarski” w doktrynie i dobrze znosi ogień kontrbateryjny. Dla Traderów—prestiż i miażdżąca siła projekcji."
|
||||
Mars-class Battlecruiser,Battlecruiser/Carrier,5,+10,+10,70,20,2,54,71,"Prow 1, Port 2, Starboard 2, Dorsal 1; Pre-fitted 2× Jovian Launch Bays",Often fitted with Nova Cannon; carrier-focused; pre-installed launch bays.,UNKN,UNKN,UNKN,UNKN,UNKN,"„Wszystkomający” pancernik liniowy—Nova Cannon + lotnictwo + lancy = kontrola teatru działań. Rzadki, trudny do modernizacji (hangary i gniazdo Novy są „na stałe”). W rękach bogatej dynastii to pływająca forteca i duma rodowa."
|
||||
Falchion-class Frigate,Frigate,8,+17,+14,36,18,1,34,42,"Prow 1 (pre-equipped Voss-pattern Torpedo Tubes; half ammo; +1 Power), Dorsal 2",Torpedo Specialist: Prow slot occupied by Voss-pattern Torpedo Tubes (cannot be removed); half usual ammunition capacity; space already accounted; ship must provide 1 Power to this Component.,UNKN,UNKN,UNKN,UNKN,UNKN,"Nowa klasa torpedowej fregaty przeznaczona do dalekiego zwiadu w Halo Stars. Marynarka podchodzi do niej chłodno, ale Rogue Traderzy chętnie wykorzystują jej potencjał. Fabrycznie uzbrojona w wyrzutnię torped Voss o ograniczonej amunicji."
|
||||
Claymore-class Corvette,Corvette,8,+18,+12,30,17,1,38,38,Dorsal 2,UNKN,1.4,0.3,5.9,"≈21,000",4.6,"Typowa korweta—wytrzymała, łatwa w naprawach i użytkowa, wolniejsza od rajderów, mocniej opancerzona. Budowane masowo w czasie wojen (m.in. podczas Krucjaty Angewina), często odstawiane do rezerwy lub sprzedawane Traderom. Ulubione jako tanie, powszechne eskorty dla konwojów i transportów."
|
||||
|
@@ -0,0 +1,9 @@
|
||||
Type,SP Tier,Availability
|
||||
Supplemental,1,Scarce
|
||||
Essential,Base,Scarce
|
||||
Supplemental,2,Rare
|
||||
Essential,Base+1 SP,Rare
|
||||
Supplemental,3,Very Rare
|
||||
Essential,Base+2 SP,Very Rare
|
||||
Archeotech,Any,Extremely Rare
|
||||
Xenotech,Any,Near Unique
|
||||
|
@@ -0,0 +1,170 @@
|
||||
Category,Component,Appropriate Hull Types,Power,Space,SP,Notes / Effects,Source
|
||||
Supplemental,Augmented Retro-Thrusters,All,2,0,0,Improves turning/decels (core rules).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Armoured Prow,All,0,0,1,Reinforced prow; ramming/front armour interactions.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Armour Plating,All,1,1,2,Additional armour plating.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Auto-Temple,All,1,1,0,Automated shrine; morale/Creed bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Barracks,All,2,4,2,Troop capacity; boarding bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Brig,All,1,1,1,Cells for prisoners; NPC/social modifiers.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Cargo Hold and Lighter Bay,All,1,2,1,Cargo space + small craft (lighters).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Casemate Main Weapon Mounts,All,2,2,1,Weapon mount modification (main).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Casemate Weapon Mounts,All,1,1,0,Weapon mount modification (secondary).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Chimera Pattern Defensive Armour,All,0,1,1,Defensive armour scheme.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Compartmentalized Cargo Hold,All,2,4,1,Segmented holds; safer cargo.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Combat Jet Batteries (Lance),All,12,6,2,Lance-type casemate batteries.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Combat Macrocannon Broadsides,All,8,6,2,Macrobattery broadside (combat).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Combat Void Shield Array,All,0,1,2,Combat-optimised void shields.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Command Bridge,All,1,1,2,Bridge variant with command bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Defense System,All,1,1,1,General defensive array.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Deflector Array (Lance),All,8,4,1,Lance deflector battery.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Deep Void Augur Array,All,4,0,0,Long-range augury.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Ekthir Pattern Hole-Moulded Void Shield Array,All,0,2,0,Hull-moulded void shield.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Extended Supply Vaults,All,0,1,1,Extended supplies; endurance.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Fibre Optic Wire Weave,All,0,0,1,Reinforced wiring; harder to disable.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Forward Landing Bay,All,2,1,0,Forward-position launch bay.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Gothic Class Five Torpedo Tubes,All,2,3,2,Torpedo tubes (size V).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Gothic Class Six Torpedo Tubes,All,2,4,3,Torpedo tubes (size VI).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Gryphonne Pattern Viper Drive,All,2,2,3,Thruster/drive upgrade.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Gyro-Stabilised Targeting Matrix,All,2,1,1,Targeting cogitators; gunnery bonus.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Hecuter Auger Array,All,4,0,0,Advanced augurs.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Heavy Stormport,All,1,4,1,Large docking port.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Heavy Clan-Kin Quarters,All,2,3,1,Upgraded clan-kin quarters.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Hymnocular Beam System,All,1,1,1,Psychoacoustic broadcast; intimidation.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Landing Bay,All,1,1,0,Standard launch bay.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Librarium Vault,All,1,1,1,Archives; inquiry bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Luxury Passenger Quarters,All,1,1,2,Passenger comfort; profit/morale.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Main Cargo Hold,All,0,4,1,Primary cargo storage.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Main Hangar Bay,All,1,1,0,Central hangar/launch bay.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Mausoleum,All,1,1,1,Honours the dead; morale effects.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Mezoa Pattern Armoured Prow,All,0,0,2,Reinforced prow (Mezoa).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Murder Servitors,All,1,2,1,Boarding servitors; Hit & Run bonus.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Observation Dome,All,0,1,1,Observation blister; social bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Plasma Broadsides,All,6,6,2,Plasma macrobattery broadside.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Plasma Accelerated Torpedo Tubes,All,3,4,2,PAT torpedo tubes.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Plasma Battery,All,2,1,2,Plasma macrobattery.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Plasma Flare Shield,All,1,0,1,Plasma flare countermeasures.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Repair Deck,All,3,3,1,Onboard repair facility.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Salvage Systems,All,1,3,1,Recovery & salvage gear.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Strategic Countermeasure Array,All,1,1,1,EW countermeasures.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Temple-Shrine to the God-Emperor,All,1,1,1,Shrine; morale/Creed bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Tenebro-Maze,All,0,1,0,Labyrinthine passages; boarding defense.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Teleportation Array,All,1,1,1,Hit & Run vs targets with shields down (see ItS).,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Vaulted Ceilings,All,0,0,1,Grand interiors; social bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,Warrior Chamber/Training Hall,All,2,2,1,Training facility; boarding bonuses.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Supplemental,X-470 Ultimo Array,All,1,0,1,Advanced augurs.,FFG Drydock: Table 1-4 Supplemental Components
|
||||
Xenos,Holofield,Eldar Ships,UNKN,UNKN,UNKN,Attacks vs ship: −40 to hit (−20 macrobatteries); −30 to detect; no Void Shields; always active unless destroyed.,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Solar Sails (Small/Standard),Eldar Ships,UNKN,UNKN,UNKN,Speed modifier by solar orientation; 90° turns regardless of hull size; may interrupt Manoeuvre for Shooting.,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Solar Sails (Large/Extra-Large),Eldar Ships,UNKN,UNKN,UNKN,As above; fitted to LC+ Eldar hulls; sometimes provide surplus power.,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Warp-Plotter,Eldar Ships,UNKN,UNKN,UNKN,Eldar navigation augmentation; essential on Eldar hulls.,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Eldar Life Sustainer,Eldar Ships,UNKN,UNKN,UNKN,Eldar-specific life sustainer (essential).,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Eldar Crew Quarters,Eldar Ships,UNKN,UNKN,UNKN,Eldar-specific crew quarters (essential).,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Eldar Sensor Array,Eldar Ships,UNKN,UNKN,UNKN,Eldar augur array (essential).,Battlefleet Koronus (Eldar sections)
|
||||
Xenos,Defensive Holofield (Torpedoes),Eldar Ships,UNKN,UNKN,UNKN,Eldar torpedoes negate Turret bonuses; Seeking rules.,Battlefleet Koronus (Eldar sections)
|
||||
Archeotech,Castellan Shield,All (unless noted),UNKN,UNKN,UNKN,"Counts as Void Shield; once per enemy Strategic Turn, Enginseer Test to double shields temporarily.",Into the Storm (Archeotech Components)
|
||||
Archeotech,Castellan Shield Array,All (unless noted),UNKN,2,UNKN,Counts as two Void Shields; same fail-safes; increased Space.,Into the Storm (Archeotech Components)
|
||||
Archeotech,Cogitator Interlink,All (unless noted),UNKN,UNKN,UNKN,Crew Rating +5 due to augmented cogitators.,Into the Storm (Archeotech Components)
|
||||
Archeotech,Energistic Conversion Matrix,All (unless noted),UNKN,UNKN,UNKN,Divert Power to Speed as Free Action (limit +5 Speed); can depower Components.,Into the Storm (Archeotech Components)
|
||||
Archeotech,Empyrean Mantle,All (unless noted),UNKN,0,UNKN,External; Silent Running detection is two steps harder; +50 EP to Criminal objectives.,Into the Storm (Archeotech Components)
|
||||
Archeotech,Teleportarium (Teleportation Array),All (unless noted),1,1,1,Enables Hit & Run vs targets with Void Shields down; per ItS usage rules.,Into the Storm (Archeotech Components)
|
||||
Category,Component,Appropriate Hull Types,Power,Space,SP,Notes / Effects,Source
|
||||
Cargo Holds and Passenger Compartments,Cargo Hold and Lighter Bay,Raider/Frigate/Light Cruiser/Cruiser,1,2,1,Standard cargo + lighter bay,Table 8-5
|
||||
Cargo Holds and Passenger Compartments,Compartmentalized Cargo Hold,Raider/Frigate/Light Cruiser/Cruiser,2,5,1,Segmented holds; safer cargo,Table 8-5
|
||||
Cargo Holds and Passenger Compartments,Main Cargo Hold,Transports,2,4,1,Primary cargo storage,Table 8-5
|
||||
Cargo Holds and Passenger Compartments,Luxury Passenger Quarters,All Ships,2,1,1,Passenger comfort/morale,Table 8-5
|
||||
Cargo Holds and Passenger Compartments,Barracks,All Ships,2,4,2,Troop capacity; boarding bonus,Table 8-5
|
||||
|
||||
Augments and Enhancements,Augmented Retro-thrusters,Raider/Frigate,3,0,2,Improved decel/turn,Table 8-5
|
||||
Augments and Enhancements,Augmented Retro-thrusters,Transports/Light Cruisers,4,0,2,Improved decel/turn,Table 8-5
|
||||
Augments and Enhancements,Augmented Retro-thrusters,Cruisers,5,0,2,Improved decel/turn,Table 8-5
|
||||
Augments and Enhancements,Reinforced Interior Bulkheads,Transports/Raiders/Frigates,0,2,2,Structural survivability,Table 8-5
|
||||
Augments and Enhancements,Reinforced Interior Bulkheads,Light Cruisers/Cruisers,0,3,2,Structural survivability,Table 8-5
|
||||
Augments and Enhancements,Armour Plating†,Transports/Raiders/Frigates,0,1,2,"† Once per vessel",Table 8-5
|
||||
Augments and Enhancements,Armour Plating†,Light Cruisers/Cruisers,0,2,2,"† Once per vessel",Table 8-5
|
||||
Augments and Enhancements,Armoured Prow†,Cruisers,0,4,2,"† Once per vessel",Table 8-5
|
||||
Augments and Enhancements,Tenebro-Maze†,Transports/Raiders/Frigates,1,2,2,"† Once per vessel",Table 8-5
|
||||
Augments and Enhancements,Tenebro-Maze†,Light Cruisers/Cruisers,2,3,2,"† Once per vessel",Table 8-5
|
||||
|
||||
Additional Facilities,Extended Supply Vaults,All Ships,1,4,2,Extended endurance,Table 8-5
|
||||
Additional Facilities,Crew Reclamation Facility,All Ships,1,1,1,Reclaims crew losses,Table 8-5
|
||||
Additional Facilities,Munitorium,Transports/Raiders/Frigates,2,3,2,Ordnance logistics,Table 8-5
|
||||
Additional Facilities,Munitorium,Light Cruisers/Cruisers,3,4,2,Ordnance logistics,Table 8-5
|
||||
Additional Facilities,Temple-shrine to the God Emperor,All Ships,1,1,1,Morale/Creed benefits,Table 8-5
|
||||
Additional Facilities,Librarium Vault,All Ships,1,1,1,Archives/intel,Table 8-5
|
||||
Additional Facilities,Trophy Room,All Ships,1,1,1,Social/renown,Table 8-5
|
||||
Additional Facilities,Observation Dome,All Ships,0,1,1,Observation/social,Table 8-5
|
||||
Additional Facilities,Murder-Servitors,All Ships,1,1,2,Boarding bonus,Table 8-5
|
||||
|
||||
Cargo and Passenger Compartments,Brig,All Ships,1,1,1,Prison cells,Table 1-10
|
||||
Cargo and Passenger Compartments,Ship’s Stores,Light Cruisers/Cruisers,1,5,2,Spares & supplies,Table 1-10
|
||||
Cargo and Passenger Compartments,Ship’s Stores,Transports/Grand Cruisers,1,10,2,Spares & supplies,Table 1-10
|
||||
|
||||
Augments and Enhancements,Defensive Countermeasures†,All Ships,1,1,2,"† Once per vessel",Table 1-10
|
||||
Augments and Enhancements,Flak Turrets†,All Ships,1,1,1,"† Once per vessel",Table 1-10
|
||||
Augments and Enhancements,Field Bracing,All Ships,"1-3",1,2,Variable power by scope,Table 1-10
|
||||
Augments and Enhancements,Fire Suppression System†,Transports/Raiders/Frigates,1,1,2,"† Once per vessel",Table 1-10
|
||||
Augments and Enhancements,Fire Suppression System†,Light Cruisers/Cruisers,2,2,2,"† Once per vessel",Table 1-10
|
||||
Augments and Enhancements,Fire Suppression System†,Grand Cruisers,3,3,2,"† Once per vessel",Table 1-10
|
||||
Augments and Enhancements,Lux Net,All Ships,"10 generated",2,2,Generates Power; special rules,Table 1-10
|
||||
Augments and Enhancements,Minelayer Bay,Transports/Light Cruisers/Cruisers,1,4,1,Deploys mines,Table 1-10
|
||||
Augments and Enhancements,Power Ram†,Light Cruisers/Cruisers,2,0,2,"† Once per vessel",Table 1-10
|
||||
|
||||
Additional Facilities,Cloudmining Facility†,Transports,3,4,1,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Hydraphuran Jamming System†,All Ships,4,0,1,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Manufactorum†,Light Cruisers/Cruisers,2,1,2,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Medicae Deck†,All Ships,2,1,1,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Melodium†,All Ships,1,1,1,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Plasma Scoop†,Raiders/Frigates,2,3,3,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Plasma Scoop†,Light Cruisers/Cruisers,3,4,3,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Pilot’s Chamber†,All Ships,1,1,1,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Salvage Systems†,Transport/Light Cruiser/Cruiser,5,3,3,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Small Craft Repair Deck†,Light Cruisers/Cruisers,2,2,1,"† Once per vessel",Table 1-10
|
||||
Additional Facilities,Spacedock Piers†,Transports (50+ Space)/Grand Cruisers,7,14,4,"† Once per vessel",Table 1-10
|
||||
|
||||
Cargo Holds and Passenger Compartments,Shadowblind Bays,All Ships,3,4,2,Stealth berths,Table 4-3
|
||||
Cargo Holds and Passenger Compartments,Xenos Habitats,All Ships,2,1,1,Accommodations for xenos,Table 4-3
|
||||
|
||||
Augments and Enhancements,Auxiliary Plasma Banks,Transports/Raiders/Frigates,"8 generated",5,1,Generates Power; special rules,Table 4-3
|
||||
Augments and Enhancements,Auxiliary Plasma Banks,Light Cruisers/Cruisers,"10 generated",6,1,Generates Power; special rules,Table 4-3
|
||||
Augments and Enhancements,Drop Pod Launch Bays,All Ships,1,3,2,Assault insertion bays,Table 4-3
|
||||
Augments and Enhancements,Empyrean Mantle,Transports/Raiders/Frigates,3,0,2,External; stealth vs detection,Table 4-3
|
||||
Augments and Enhancements,Empyrean Mantle,Light Cruisers/Cruisers,5,0,2,External; stealth vs detection,Table 4-3
|
||||
Augments and Enhancements,Reinforced Prow,Transports/Raiders/Frigates,0,2,1,Strengthened prow,Table 4-3
|
||||
Augments and Enhancements,Reinforced Prow,Light Cruisers/Cruisers,0,3,1,Strengthened prow,Table 4-3
|
||||
|
||||
Additional Facilities,Arboretum,Transports/Raiders/Frigates,2,2,1,Life-supporting gardens,Table 4-3
|
||||
Additional Facilities,Arboretum,Light Cruisers/Cruisers,2,3,1,Life-supporting gardens,Table 4-3
|
||||
Additional Facilities,Asteroid Mining Facility,All Ships,6,10,3,Onboard mining/refinery,Table 4-3
|
||||
Additional Facilities,Astropathic Choir-chambers,All Ships,1,1,1,Astropathic communications,Table 4-3
|
||||
Additional Facilities,Broadband Hymn-casters,All Ships,3,0,1,Long-range vox-hymn projectors,Table 4-3
|
||||
Category,Component,Appropriate Hull Types,Power,Space,SP,Notes / Effects,Source
|
||||
Archeotech,Castellan Shield,All Ships,5,1,2,Archeotech void-shield variant.,Table 4-4
|
||||
Archeotech,Castellan Shield Array,Cruisers,7,2,2,Counts as multiple shields; archeotech array.,Table 4-4
|
||||
Archeotech,Cogitator Interlink†,All Ships,1,1,2,"† Once per vessel; advanced cogitator network.",Table 4-4
|
||||
Archeotech,Energistic Conversion Matrix†,All Ships,1,1,1,"† Once per vessel; convert Power to Speed per rules.",Table 4-4
|
||||
Archeotech,Gyro-stabilisation Matrix†,All Ships,1,1,1,"† Once per vessel; enhanced targeting stabilisation.",Table 4-4
|
||||
Archeotech,Staravar Laser Macrobattery,All Ships,4,4,2,Archeotech laser macrobattery (see weapon statline in Table 4-5),Table 4-4
|
||||
Archeotech,Star-flare Lance,Light Cruisers/Cruisers,12,6,3,Archeotech lance (see weapon statline in Table 4-5),Table 4-4
|
||||
|
||||
Archeotech,Cypra-pattern Class 1 Drive,Transports,"30 Generated",10,2,Archeotech plasma drive.,Table 1-11
|
||||
Archeotech,Cypra-pattern Class 2 Drive,Raiders/Frigates,"40 Generated",12,2,Archeotech plasma drive.,Table 1-11
|
||||
Archeotech,Jovian-pattern Nova Cannon,Cruisers,6,7,5,Component entry for Nova Cannon mount (see weapon on Table 1-12),Table 1-11
|
||||
Archeotech,Plasma Accelerated Torpedo Tubes,All Ships,2,6,2,Archeotech torpedo tubes (see weapon on Table 1-12),Table 1-11
|
||||
Archeotech,Warp Antenna,All Ships,1,1,2,Archeotech warp comms augment.,Table 1-11
|
||||
Archeotech,Warp Sextant,All Ships,4,1,2,Archeotech warp navigation aid.,Table 1-11
|
||||
|
||||
Archeotech,Ancient Life Sustainer,Transports/Raiders/Frigates,2,1,2,Archeotech life support.,Table 8-6
|
||||
Archeotech,Ancient Life Sustainer,Light Cruisers/Cruisers,2,2,2,Archeotech life support.,Table 8-6
|
||||
Archeotech,Modifified Jovian Pattern Class 1 Drive,Transports,"35 Generated",4,3,Archeotech/modified drive.,Table 8-6
|
||||
Archeotech,Modifified Lathe Pattern Class 1 Drive,Transports,"40 Generated",8,3,Archeotech/modified drive.,Table 8-6
|
||||
Archeotech,Modifified Jovian Pattern Class 2 Drive,Raiders/Frigates,"45 Generated",6,3,Archeotech/modified drive.,Table 8-6
|
||||
Archeotech,Modifified Jovian Pattern Class 3 Drive,Light Cruisers,"60 Generated",8,3,Archeotech/modified drive.,Table 8-6
|
||||
Archeotech,Modifified Jovian Pattern Class 4 Drive,Cruisers,"75 Generated",10,3,Archeotech/modified drive.,Table 8-6
|
||||
Archeotech,Bridge of Antiquity,Transports/Raiders/Frigates,1,1,2,Archeotech bridge.,Table 8-6
|
||||
Archeotech,Bridge of Antiquity,Light Cruisers/Cruisers,2,1,2,Archeotech bridge.,Table 8-6
|
||||
Archeotech,Auto-stabilised Logis-targeter,All ships,5,0,2,Archeotech targeting augmentation.,Table 8-6
|
||||
Archeotech,Teleportarium,All ships,1,1,1,Archeotech teleport array (component entry),Table 8-6
|
||||
Xenotech,Ghost Field,All ships,8,4,3,Xenos equivalent of advanced stealth shielding.,Table 8-7
|
||||
Xenotech,Shard Cannon Battery,All ships,0,3,2,Xenos macrobattery analogue.,Table 8-7
|
||||
Xenotech,Runecaster,All ships,0,1,2,Xenos augury/warding device.,Table 8-7
|
||||
Xenotech,Micro Laser Defence Grid,All ships,2,0,2,Xenos PD grid.,Table 8-7
|
||||
Xenotech,Gravity Sails,Transports/Raiders/Frigates,3,0,3,Ancient gravity sail rig.,Table 8-7
|
||||
Xenotech,Gravity Sails,Light cruisers/Cruisers,5,0,3,Ancient gravity sail rig.,Table 8-7
|
||||
|
@@ -0,0 +1,22 @@
|
||||
component_name,category,hull_sizes,power,space,sp,availability,summary,notes,book_sources,needs_review
|
||||
Jovian-pattern Class 2 Drive,Plasma Drive,Raider/Frigate,UNKN,UNKN,UNKN,UNKN,Standard napęd plazmowy dla rajderów i fregat; wysoka niezawodność i przyzwoita moc.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Jovian-pattern Class 3 Drive,Plasma Drive,Cruiser,UNKN,UNKN,UNKN,UNKN,"Skalowany wariant Joviana dla krążowników, zapewnia zasilanie dla cięższych platform.",Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Strelov 1 Warp Engine,Warp Engine,Raider/Frigate,UNKN,UNKN,UNKN,UNKN,"Podstawowy silnik warp dla lekkich kadłubów, stabilny i szeroko dostępny.",Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Strelov 2 Warp Engine,Warp Engine,Cruiser,UNKN,UNKN,UNKN,UNKN,Udoskonalony Strelov dla krążowników; typowy standard Marynarki.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Miloslav H-616.b Warp Engine,Warp Engine,Raider/Frigate/Cruiser,UNKN,UNKN,UNKN,UNKN,Szybsza nawigacja w Immaterium kosztem zwiększonych wymagań; preferowany przez śmiałych Traderów.,Wariant alternatywny względem Strelov; kompatybilność zależna od tonażu.,BFK,check_table;check_desc
|
||||
Geller Field,Geller Field,All (RF/C),UNKN,UNKN,UNKN,UNKN,Osłona antydemoniczna utrzymująca realspace wewnątrz statku podczas skoku warp.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Warpsbane-pattern Geller Field,Geller Field,All (RF/C),UNKN,UNKN,UNKN,UNKN,Ulepszona ochrona przed zjawiskami warp i intruzją bytów niefizycznych.,Rzadki/Archeotech wariant; instalacja zamiast standardowego pola.,BFK,check_table;check_desc
|
||||
Single Void Shield Array,Void Shield,Raider/Frigate,UNKN,UNKN,UNKN,UNKN,Bazowa osłona próżniowa; chroni przed pierwszym trafieniem w rundzie.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Multiple Void Shield Array,Void Shield,Cruiser,UNKN,UNKN,UNKN,UNKN,Wzmocniona osłona z wieloma generatorami; lepsza odporność salwowa.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
|
||||
Repulsor Shield Array,Void Shield,Cruiser,UNKN,UNKN,UNKN,UNKN,Zaawansowana odmiana maksymalizująca odbicie energii kinetycznej.,Rzadki/Specjalny; wymaga weryfikacji parametrów.,ItS/BFK,check_table;check_desc
|
||||
Combat Bridge,Bridge,All (RF/C),UNKN,UNKN,UNKN,UNKN,Mostek bojowy optymalizujący działania taktyczne i ogień okrętu.,Essential; alternatywa dla Commerce/Armoured.,Core,check_table;check_desc
|
||||
Commerce Bridge,Bridge,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Mostek handlowy, systemy administracyjne i ładunkowe kosztem efektywności bojowej.",Essential; alternatywa dla Combat/Armoured.,Core,check_table;check_desc
|
||||
Armoured Command Bridge,Bridge,All (RF/C),UNKN,UNKN,UNKN,UNKN,Silnie opancerzony mostek dowodzenia umożliwiający przetrwanie ciężkiego ostrzału.,Essential; alternatywa dla Combat/Commerce.,Core,check_table;check_desc
|
||||
Vitae Pattern Life Sustainers,Life Sustainers,All (RF/C),UNKN,UNKN,UNKN,UNKN,Standardowe podtrzymanie życia o dobrej wydajności przy umiarkowanych kosztach.,UNKN,Core,check_table;check_desc
|
||||
Clemency-pattern Life Sustainers,Life Sustainers,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Ulepszone systemy oczyszczania, lepsze warunki bytowe dla załogi.",UNKN,Core,check_table;check_desc
|
||||
Voidsmen Quarters,Crew Quarters,All (RF/C),UNKN,UNKN,UNKN,UNKN,Standardowe koszary dla załogi; kompromis między komfortem a pojemnością.,UNKN,Core,check_table;check_desc
|
||||
Clan-Kin Quarters,Crew Quarters,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Tradycyjne, klaustrofobiczne zabudowy klanowe zwiększające lojalność kosztem komfortu.",UNKN,Core,check_table;check_desc
|
||||
Luxury Passenger Quarters,Crew Quarters,All (RF/C),UNKN,UNKN,UNKN,UNKN,Luksusowe kwatery dla VIP-ów i pasażerów; poprawiają reputację i morale.,UNKN,Core/ItS,check_table;check_desc
|
||||
M-201.b Active Augur Array,Auger Array,All (RF/C),UNKN,UNKN,UNKN,UNKN,Aktywne sensory długiego zasięgu; dobre wykrywanie i śledzenie celów.,UNKN,Core,check_table;check_desc
|
||||
W-240 Passive Detection Array,Auger Array,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Pasywny pakiet nasłuchu i skanowania; cichsze, lecz słabsze wykrywanie.",UNKN,Core,check_table;check_desc
|
||||
Deep Void Augur Array,Auger Array,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Wysokoczułe układy do pracy w głębokiej pustce, przydatne w eksploracji.",UNKN,Core/BFK,check_table;check_desc
|
||||
|
@@ -0,0 +1,415 @@
|
||||
{
|
||||
"folder": "Kgk6Zo2oRvw9N5ii",
|
||||
"name": "Aquila Lander",
|
||||
"type": "vehicle",
|
||||
"img": "modules/wng-core/assets/tokens/rogue-trader-dynasties.webp",
|
||||
"system": {
|
||||
"complement": {
|
||||
"pilot": 1,
|
||||
"crew": 0,
|
||||
"passenger": 7,
|
||||
"list": []
|
||||
},
|
||||
"mnvr": 7,
|
||||
"rarity": "rare",
|
||||
"value": 14,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "flyer"
|
||||
},
|
||||
{
|
||||
"name": "hover"
|
||||
},
|
||||
{
|
||||
"name": "reliable"
|
||||
},
|
||||
{
|
||||
"name": "sealed"
|
||||
},
|
||||
{
|
||||
"name": "turboBoost",
|
||||
"rating": "6"
|
||||
}
|
||||
]
|
||||
},
|
||||
"combat": {
|
||||
"size": "gargantuan",
|
||||
"speed": 120,
|
||||
"wounds": {
|
||||
"value": 0,
|
||||
"bonus": 0,
|
||||
"max": 14
|
||||
},
|
||||
"resilience": {
|
||||
"bonus": 0,
|
||||
"total": 12
|
||||
},
|
||||
"defence": {
|
||||
"bonus": 0
|
||||
},
|
||||
"fly": 0
|
||||
},
|
||||
"notes": "<p>The Aquila Lander is the vessel of choice for Gilead dignitaries when they travel between ships or make planetary landings. It is lightly armed and relies on speed to ensure the safety of its valuable passengers.</p><p></p><p>The <strong>Aquila</strong> can replace its @UUID[Compendium.wng-core.items.Item.ut6nsTPR0xL4mfET]{Heavy Bolter} with either an @UUID[Compendium.wng-core.items.Item.9DfD3HEoGmpIWLoC]{Autocannon} or a @UUID[Compendium.wng-cos.items.Item.XtRh1VndguW93hzA]{Multi-Laser}.</p>",
|
||||
"settings": {
|
||||
"hidePassengers": false
|
||||
}
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Aquila Lander",
|
||||
"displayName": 20,
|
||||
"actorLink": false,
|
||||
"appendNumber": false,
|
||||
"prependAdjective": false,
|
||||
"texture": {
|
||||
"src": "modules/wng-core/assets/tokens/rogue-trader-dynasties.webp",
|
||||
"scaleX": 1,
|
||||
"scaleY": 1,
|
||||
"offsetX": 0,
|
||||
"offsetY": 0,
|
||||
"rotation": 0,
|
||||
"anchorX": 0.5,
|
||||
"anchorY": 0.5,
|
||||
"fit": "contain",
|
||||
"tint": "#ffffff",
|
||||
"alphaThreshold": 0.75
|
||||
},
|
||||
"width": 4,
|
||||
"height": 4,
|
||||
"lockRotation": false,
|
||||
"rotation": 0,
|
||||
"alpha": 1,
|
||||
"disposition": 0,
|
||||
"displayBars": 20,
|
||||
"bar1": {
|
||||
"attribute": "combat.wounds"
|
||||
},
|
||||
"bar2": {
|
||||
"attribute": null
|
||||
},
|
||||
"light": {
|
||||
"alpha": 0.5,
|
||||
"angle": 360,
|
||||
"bright": 0,
|
||||
"coloration": 1,
|
||||
"dim": 0,
|
||||
"attenuation": 0.5,
|
||||
"luminosity": 0.5,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"shadows": 0,
|
||||
"animation": {
|
||||
"type": null,
|
||||
"speed": 5,
|
||||
"intensity": 5,
|
||||
"reverse": false
|
||||
},
|
||||
"darkness": {
|
||||
"min": 0,
|
||||
"max": 1
|
||||
},
|
||||
"negative": false,
|
||||
"priority": 0,
|
||||
"color": null
|
||||
},
|
||||
"sight": {
|
||||
"enabled": false,
|
||||
"range": 0,
|
||||
"angle": 360,
|
||||
"visionMode": "basic",
|
||||
"attenuation": 0.1,
|
||||
"brightness": 0,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"color": null
|
||||
},
|
||||
"detectionModes": [],
|
||||
"flags": {},
|
||||
"randomImg": false,
|
||||
"occludable": {
|
||||
"radius": 0
|
||||
},
|
||||
"ring": {
|
||||
"enabled": false,
|
||||
"colors": {
|
||||
"ring": null,
|
||||
"background": null
|
||||
},
|
||||
"effects": 1,
|
||||
"subject": {
|
||||
"scale": 1,
|
||||
"texture": null
|
||||
}
|
||||
},
|
||||
"turnMarker": {
|
||||
"mode": 1,
|
||||
"animation": null,
|
||||
"src": null,
|
||||
"disposition": false
|
||||
},
|
||||
"movementAction": null
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"_id": "c1eM1YGFaqKckprQ",
|
||||
"name": "IMPERIUM",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 3500000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The vast interstellar empire of Humanity that spans over a million worlds, led by the Emperor from Holy Terra. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "AIDhVkSIsCH9Jfbx",
|
||||
"name": "AERONAUTICA IMPERIALIS",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 2100000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The Aeronautica Imperialis are part of the Navis Imperialis, and are responsible for Imperial in-atmosphere aviation. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FLYER",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"_id": "l7YgMSB9ww4iKXJW",
|
||||
"system": {
|
||||
"description": ""
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "76RoKhzW7pHowYHq",
|
||||
"name": "Heavy Bolter",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.",
|
||||
"value": 6,
|
||||
"keywords": "BOLT, IMPERIUM",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 12,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": "b8eQkcc55L9gcmB3"
|
||||
},
|
||||
"salvo": 3,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "heavy"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "rapidFire"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Armoured Cockpit",
|
||||
"folder": "FrmevO9rOTrrEhIe",
|
||||
"type": "gear",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "common",
|
||||
"description": "Extra protection for the Pilot is always welcome, to ensure they not only deliver destruction but also deliver important passengers safely to their destinations.<br><br><strong>Effects: </strong>This item grants the Crew inside the vehicle's cockpit an AR of 4 against any attack originating from outside the vehicle.",
|
||||
"value": 5,
|
||||
"keywords": "FLYER",
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_id": "IxcyH7fPsMvx4YFL",
|
||||
"img": "modules/wng-core/assets/icons/gear/gear.webp",
|
||||
"effects": [],
|
||||
"sort": 100000,
|
||||
"flags": {
|
||||
"core": {}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Heavy Bolter Ammo",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"_id": "b8eQkcc55L9gcmB3",
|
||||
"system": {
|
||||
"quantity": 10,
|
||||
"rarity": "common",
|
||||
"description": "",
|
||||
"value": 0,
|
||||
"keywords": "",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1756320857500,
|
||||
"modifiedTime": 1756320857500,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Actor.Qz0AG5vJU9HrYtxk",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "Qz0AG5vJU9HrYtxk"
|
||||
}
|
||||
@@ -0,0 +1,295 @@
|
||||
{
|
||||
"name": "Cobra-class Destroyer (Renegade)",
|
||||
"type": "vehicle",
|
||||
"img": "modules/wng-core/assets/tokens/generic.webp",
|
||||
"system": {
|
||||
"complement": {
|
||||
"pilot": 0,
|
||||
"crew": 0,
|
||||
"passenger": 0,
|
||||
"list": []
|
||||
},
|
||||
"mnvr": 2,
|
||||
"rarity": "",
|
||||
"value": 0,
|
||||
"traits": {
|
||||
"list": []
|
||||
},
|
||||
"combat": {
|
||||
"size": "colossal",
|
||||
"speed": 10,
|
||||
"wounds": {
|
||||
"value": 0,
|
||||
"bonus": 0,
|
||||
"max": 22
|
||||
},
|
||||
"resilience": {
|
||||
"bonus": 0,
|
||||
"total": 9
|
||||
},
|
||||
"defence": {
|
||||
"bonus": 3
|
||||
},
|
||||
"fly": 0
|
||||
},
|
||||
"notes": "Ex-Navy Cobra in privateer hands with non-standard prow refits.",
|
||||
"settings": {
|
||||
"hidePassengers": false
|
||||
}
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Cobra-class Destroyer (Renegade)",
|
||||
"width": 4,
|
||||
"height": 4,
|
||||
"displayName": 50,
|
||||
"actorLink": false,
|
||||
"texture": {
|
||||
"src": "modules/wng-core/assets/tokens/generic.webp",
|
||||
"anchorX": 0.5,
|
||||
"anchorY": 0.5,
|
||||
"offsetX": 0,
|
||||
"offsetY": 0,
|
||||
"fit": "contain",
|
||||
"scaleX": 1,
|
||||
"scaleY": 1,
|
||||
"rotation": 0,
|
||||
"tint": "#ffffff",
|
||||
"alphaThreshold": 0.75
|
||||
},
|
||||
"lockRotation": false,
|
||||
"rotation": 0,
|
||||
"alpha": 1,
|
||||
"disposition": -1,
|
||||
"displayBars": 0,
|
||||
"bar1": {
|
||||
"attribute": null
|
||||
},
|
||||
"bar2": {
|
||||
"attribute": null
|
||||
},
|
||||
"light": {
|
||||
"negative": false,
|
||||
"priority": 0,
|
||||
"alpha": 0.5,
|
||||
"angle": 360,
|
||||
"bright": 0,
|
||||
"color": null,
|
||||
"coloration": 1,
|
||||
"dim": 0,
|
||||
"attenuation": 0.5,
|
||||
"luminosity": 0.5,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"shadows": 0,
|
||||
"animation": {
|
||||
"type": null,
|
||||
"speed": 5,
|
||||
"intensity": 5,
|
||||
"reverse": false
|
||||
},
|
||||
"darkness": {
|
||||
"min": 0,
|
||||
"max": 1
|
||||
}
|
||||
},
|
||||
"sight": {
|
||||
"enabled": false,
|
||||
"range": 0,
|
||||
"angle": 360,
|
||||
"visionMode": "basic",
|
||||
"color": null,
|
||||
"attenuation": 0.1,
|
||||
"brightness": 0,
|
||||
"saturation": 0,
|
||||
"contrast": 0
|
||||
},
|
||||
"detectionModes": [],
|
||||
"occludable": {
|
||||
"radius": 0
|
||||
},
|
||||
"ring": {
|
||||
"enabled": false,
|
||||
"colors": {
|
||||
"ring": null,
|
||||
"background": null
|
||||
},
|
||||
"effects": 1,
|
||||
"subject": {
|
||||
"scale": 1,
|
||||
"texture": null
|
||||
}
|
||||
},
|
||||
"turnMarker": {
|
||||
"mode": 1,
|
||||
"animation": null,
|
||||
"src": null,
|
||||
"disposition": false
|
||||
},
|
||||
"movementAction": null,
|
||||
"flags": {},
|
||||
"randomImg": false,
|
||||
"appendNumber": false,
|
||||
"prependAdjective": false
|
||||
},
|
||||
"flags": {
|
||||
"wg-voidships": {
|
||||
"source": "Battlefleet Koronus, p. 66",
|
||||
"shields": {
|
||||
"current": 1,
|
||||
"max": 1
|
||||
},
|
||||
"speedVU": 10,
|
||||
"handling": 2,
|
||||
"cr": 5,
|
||||
"tur": 1,
|
||||
"mounts": "",
|
||||
"traits": "",
|
||||
"components": []
|
||||
}
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"_id": "aarPxYJvbSDqkUQf",
|
||||
"name": "Torpedo Tubes",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "Torpedowe wyrzutnie okrętowe. Strzał: Gunnery (BS) vs DEF; przechwytywalne przez TUR. Statystyki efektu zależą od załadowanej głowicy.\n\n**Kompatybilna amunicja (drag&drop na aktora, a następnie wybierz w polu Ammo):**\n• Torpedo Warhead — Standard / Plasma / Melta / Virus / Vortex / Guided.\n\n**Uwaga:** natywny system W&G nie zmienia DMG/AP/ED wg amunicji; używaj opisu ładunku przy interpretacji efektu.",
|
||||
"value": 0,
|
||||
"keywords": "VOIDSHIP, ORDNANCE, TORPEDO, AMMO-DEPENDENT",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "0"
|
||||
},
|
||||
"damage": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"enabled": false,
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"shock": "0",
|
||||
"wounds": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "launcher",
|
||||
"range": {
|
||||
"short": 30,
|
||||
"medium": 60,
|
||||
"long": 120,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {},
|
||||
"salvo": 1,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "ordnance"
|
||||
},
|
||||
{
|
||||
"name": "interceptable",
|
||||
"rating": "TUR"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758135686326,
|
||||
"modifiedTime": 1758135709107,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "RoyTsWuwxFInsIQS",
|
||||
"name": "Torpedo Warhead — Guided",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"system": {
|
||||
"quantity": 6,
|
||||
"rarity": "rare",
|
||||
"description": "Naprowadzana — lepsza celność, trudniejsza do przechwycenia.",
|
||||
"value": 0,
|
||||
"keywords": "VOIDSHIP, TORPEDO-WARHEAD, GUIDED",
|
||||
"effect": "+1k do ataku lub przerzut 1 nieudanego; TUR przeciwnika -1 do Intercept.",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758135687800,
|
||||
"modifiedTime": 1758135687800,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758135625462,
|
||||
"modifiedTime": 1758135625462,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Actor.jPYz63kXVprYFXMi",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": null,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "jPYz63kXVprYFXMi"
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"name": "Cobra-class Destroyer",
|
||||
"type": "vehicle",
|
||||
"img": "modules/wng-core/assets/tokens/generic.webp",
|
||||
"system": {
|
||||
"complement": {
|
||||
"pilot": 0,
|
||||
"crew": 0,
|
||||
"passenger": 0,
|
||||
"list": []
|
||||
},
|
||||
"mnvr": 2,
|
||||
"rarity": "",
|
||||
"value": 0,
|
||||
"traits": {
|
||||
"list": []
|
||||
},
|
||||
"combat": {
|
||||
"size": "colossal",
|
||||
"speed": 10,
|
||||
"wounds": {
|
||||
"value": 0,
|
||||
"bonus": 0,
|
||||
"max": 22
|
||||
},
|
||||
"resilience": {
|
||||
"bonus": 0,
|
||||
"total": 9
|
||||
},
|
||||
"defence": {
|
||||
"bonus": 3
|
||||
},
|
||||
"fly": 0
|
||||
},
|
||||
"notes": "Torpedo raider hunting in packs; strikes, then disengages to reload.",
|
||||
"settings": {
|
||||
"hidePassengers": false
|
||||
}
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Cobra-class Destroyer",
|
||||
"width": 4,
|
||||
"height": 4,
|
||||
"displayName": 50,
|
||||
"actorLink": false,
|
||||
"texture": {
|
||||
"src": "modules/wng-core/assets/tokens/generic.webp",
|
||||
"anchorX": 0.5,
|
||||
"anchorY": 0.5,
|
||||
"offsetX": 0,
|
||||
"offsetY": 0,
|
||||
"fit": "contain",
|
||||
"scaleX": 1,
|
||||
"scaleY": 1,
|
||||
"rotation": 0,
|
||||
"tint": "#ffffff",
|
||||
"alphaThreshold": 0.75
|
||||
},
|
||||
"lockRotation": false,
|
||||
"rotation": 0,
|
||||
"alpha": 1,
|
||||
"disposition": -1,
|
||||
"displayBars": 0,
|
||||
"bar1": {
|
||||
"attribute": null
|
||||
},
|
||||
"bar2": {
|
||||
"attribute": null
|
||||
},
|
||||
"light": {
|
||||
"negative": false,
|
||||
"priority": 0,
|
||||
"alpha": 0.5,
|
||||
"angle": 360,
|
||||
"bright": 0,
|
||||
"color": null,
|
||||
"coloration": 1,
|
||||
"dim": 0,
|
||||
"attenuation": 0.5,
|
||||
"luminosity": 0.5,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"shadows": 0,
|
||||
"animation": {
|
||||
"type": null,
|
||||
"speed": 5,
|
||||
"intensity": 5,
|
||||
"reverse": false
|
||||
},
|
||||
"darkness": {
|
||||
"min": 0,
|
||||
"max": 1
|
||||
}
|
||||
},
|
||||
"sight": {
|
||||
"enabled": false,
|
||||
"range": 0,
|
||||
"angle": 360,
|
||||
"visionMode": "basic",
|
||||
"color": null,
|
||||
"attenuation": 0.1,
|
||||
"brightness": 0,
|
||||
"saturation": 0,
|
||||
"contrast": 0
|
||||
},
|
||||
"detectionModes": [],
|
||||
"occludable": {
|
||||
"radius": 0
|
||||
},
|
||||
"ring": {
|
||||
"enabled": false,
|
||||
"colors": {
|
||||
"ring": null,
|
||||
"background": null
|
||||
},
|
||||
"effects": 1,
|
||||
"subject": {
|
||||
"scale": 1,
|
||||
"texture": null
|
||||
}
|
||||
},
|
||||
"turnMarker": {
|
||||
"mode": 1,
|
||||
"animation": null,
|
||||
"src": null,
|
||||
"disposition": false
|
||||
},
|
||||
"movementAction": null,
|
||||
"flags": {},
|
||||
"randomImg": false,
|
||||
"appendNumber": false,
|
||||
"prependAdjective": false
|
||||
},
|
||||
"flags": {
|
||||
"wg-voidships": {
|
||||
"source": "Battlefleet Koronus, p. 66",
|
||||
"shields": {
|
||||
"current": 1,
|
||||
"max": 1
|
||||
},
|
||||
"speedVU": 10,
|
||||
"handling": 2,
|
||||
"cr": 5,
|
||||
"tur": 1,
|
||||
"mounts": "",
|
||||
"traits": "",
|
||||
"components": []
|
||||
}
|
||||
},
|
||||
"items": [],
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758135104158,
|
||||
"modifiedTime": 1758135104158,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Actor.b518e981d69324aa",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": null,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "b518e981d69324aa"
|
||||
}
|
||||
@@ -0,0 +1,600 @@
|
||||
{
|
||||
"name": "Dauntless-class Light Cruiser",
|
||||
"type": "vehicle",
|
||||
"img": "modules/wng-core/assets/tokens/generic.webp",
|
||||
"system": {
|
||||
"complement": {
|
||||
"pilot": 0,
|
||||
"crew": 0,
|
||||
"passenger": 0,
|
||||
"list": []
|
||||
},
|
||||
"mnvr": 0,
|
||||
"rarity": "",
|
||||
"value": 0,
|
||||
"traits": {
|
||||
"list": []
|
||||
},
|
||||
"combat": {
|
||||
"size": "",
|
||||
"speed": 9,
|
||||
"wounds": {
|
||||
"value": 0,
|
||||
"bonus": 0,
|
||||
"max": 32
|
||||
},
|
||||
"resilience": {
|
||||
"bonus": 0,
|
||||
"total": 11
|
||||
},
|
||||
"defence": {
|
||||
"bonus": 2
|
||||
},
|
||||
"fly": 0
|
||||
},
|
||||
"notes": "Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.",
|
||||
"settings": {
|
||||
"hidePassengers": false
|
||||
}
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Dauntless-class Light Cruiser",
|
||||
"width": 4,
|
||||
"height": 4,
|
||||
"displayName": 50,
|
||||
"actorLink": false,
|
||||
"texture": {
|
||||
"src": "modules/wng-core/assets/tokens/generic.webp",
|
||||
"anchorX": 0.5,
|
||||
"anchorY": 0.5,
|
||||
"offsetX": 0,
|
||||
"offsetY": 0,
|
||||
"fit": "contain",
|
||||
"scaleX": 1,
|
||||
"scaleY": 1,
|
||||
"rotation": 0,
|
||||
"tint": "#ffffff",
|
||||
"alphaThreshold": 0.75
|
||||
},
|
||||
"lockRotation": false,
|
||||
"rotation": 0,
|
||||
"alpha": 1,
|
||||
"disposition": -1,
|
||||
"displayBars": 0,
|
||||
"bar1": {
|
||||
"attribute": null
|
||||
},
|
||||
"bar2": {
|
||||
"attribute": null
|
||||
},
|
||||
"light": {
|
||||
"negative": false,
|
||||
"priority": 0,
|
||||
"alpha": 0.5,
|
||||
"angle": 360,
|
||||
"bright": 0,
|
||||
"color": null,
|
||||
"coloration": 1,
|
||||
"dim": 0,
|
||||
"attenuation": 0.5,
|
||||
"luminosity": 0.5,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"shadows": 0,
|
||||
"animation": {
|
||||
"type": null,
|
||||
"speed": 5,
|
||||
"intensity": 5,
|
||||
"reverse": false
|
||||
},
|
||||
"darkness": {
|
||||
"min": 0,
|
||||
"max": 1
|
||||
}
|
||||
},
|
||||
"sight": {
|
||||
"enabled": false,
|
||||
"range": 0,
|
||||
"angle": 360,
|
||||
"visionMode": "basic",
|
||||
"color": null,
|
||||
"attenuation": 0.1,
|
||||
"brightness": 0,
|
||||
"saturation": 0,
|
||||
"contrast": 0
|
||||
},
|
||||
"detectionModes": [],
|
||||
"occludable": {
|
||||
"radius": 0
|
||||
},
|
||||
"ring": {
|
||||
"enabled": false,
|
||||
"colors": {
|
||||
"ring": null,
|
||||
"background": null
|
||||
},
|
||||
"effects": 1,
|
||||
"subject": {
|
||||
"scale": 1,
|
||||
"texture": null
|
||||
}
|
||||
},
|
||||
"turnMarker": {
|
||||
"mode": 1,
|
||||
"animation": null,
|
||||
"src": null,
|
||||
"disposition": false
|
||||
},
|
||||
"movementAction": null,
|
||||
"flags": {},
|
||||
"randomImg": false,
|
||||
"appendNumber": false,
|
||||
"prependAdjective": false
|
||||
},
|
||||
"flags": {
|
||||
"wg-voidships": {
|
||||
"source": "Battlefleet Koronus, p. 36",
|
||||
"shields": {
|
||||
"current": 2,
|
||||
"max": 2
|
||||
},
|
||||
"speedVU": 9,
|
||||
"handling": 0,
|
||||
"cr": 6,
|
||||
"tur": 2,
|
||||
"mounts": "",
|
||||
"traits": "",
|
||||
"components": []
|
||||
}
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"_id": "rQRXWIkHVSfInJEU",
|
||||
"name": "Launch Bay",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "Zatoki startowe dla skrzydeł. Test Gunnery (BS) vs DEF celu lub manewry CAP/Intercept/Bombing/Assault zgodnie z ładunkiem skrzydeł.\n\n**Kompatybilna amunicja (wybierz w polu Ammo):**\n• Wing Loadout — Fury Interceptors / Starhawk Bombers / Assault Boats.\n\n**Uwaga:** system nie modyfikuje DMG/AP/ED wg ładunku — używaj opisu skrzydła.",
|
||||
"value": 0,
|
||||
"keywords": "VOIDSHIP, CARRIER, CRAFT, AMMO-DEPENDENT",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "0"
|
||||
},
|
||||
"damage": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"enabled": false,
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"shock": "0",
|
||||
"wounds": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "launcher",
|
||||
"range": {
|
||||
"short": 30,
|
||||
"medium": 60,
|
||||
"long": 120,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {},
|
||||
"salvo": 1,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "carrier",
|
||||
"rating": "wings"
|
||||
},
|
||||
{
|
||||
"name": "interceptable",
|
||||
"rating": "TUR"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142366746,
|
||||
"modifiedTime": 1758142375262,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "gre08Ehhz66jpP3x",
|
||||
"name": "Torpedo Warhead — Standard",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"system": {
|
||||
"quantity": 6,
|
||||
"rarity": "uncommon",
|
||||
"description": "Standardowa głowica torpedy. DMG/AP/ED wg zasad modułu torped.",
|
||||
"value": 0,
|
||||
"keywords": "VOIDSHIP, TORPEDO-WARHEAD, STANDARD",
|
||||
"effect": "Atak Gunnery (BS) vs DEF; może być przechwycone przez TUR. Sugerowane: DMG 14, ED 3, AP -2.",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142369873,
|
||||
"modifiedTime": 1758142369873,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "Pmu9A4bJw9d7Ar1g",
|
||||
"name": "Torpedo Tubes",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "Torpedowe wyrzutnie okrętowe. Strzał: Gunnery (BS) vs DEF; przechwytywalne przez TUR. Statystyki efektu zależą od załadowanej głowicy.\n\n**Kompatybilna amunicja (drag&drop na aktora, a następnie wybierz w polu Ammo):**\n• Torpedo Warhead — Standard / Plasma / Melta / Virus / Vortex / Guided.\n\n**Uwaga:** natywny system W&G nie zmienia DMG/AP/ED wg amunicji; używaj opisu ładunku przy interpretacji efektu.",
|
||||
"value": 0,
|
||||
"keywords": "VOIDSHIP, ORDNANCE, TORPEDO, AMMO-DEPENDENT",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "0"
|
||||
},
|
||||
"damage": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"enabled": false,
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"shock": "0",
|
||||
"wounds": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "launcher",
|
||||
"range": {
|
||||
"short": 30,
|
||||
"medium": 60,
|
||||
"long": 120,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {},
|
||||
"salvo": 1,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "ordnance"
|
||||
},
|
||||
{
|
||||
"name": "interceptable",
|
||||
"rating": "TUR"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142371364,
|
||||
"modifiedTime": 1758142375868,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "QKm9bcww1aWOimbb",
|
||||
"name": "Wing Loadout — Assault Boats",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "Łodzie abordażowe — dostarczają zespoły na pokład.",
|
||||
"value": 0,
|
||||
"keywords": "VOIDSHIP, WING-LOADOUT, ASSAULT, BOARDING",
|
||||
"effect": "Zamiast DMG uruchamia Boarding (Close/Contact). Jeśli dotrą bez strat: +2 do pierwszej fazy abordażu.",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142372933,
|
||||
"modifiedTime": 1758142372933,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Heavy Squig Launcha",
|
||||
"type": "weapon",
|
||||
"folder": "vmJPLFnHHoDwT4DM",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "<p>A larger version of the primitive weapon that propels murderous Orkoids known as Squigs wherever an Ork sees fit. Whenever you fire a Heavy Squig Launcha, you can fire a Bile, Bitey, or Boom Squig.</p><ul><li><p>@UUID[Compendium.wng-cos.items.Item.SLT8t7m3UHZ1v5dq]{Bile Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.LkjqUWSEfH14D9Jj]{Bitey Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.QHcZdjZBknkZq39u]{Boom Squig}</p></li></ul>",
|
||||
"value": 6,
|
||||
"keywords": "ORK, SQUIG",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "launcher",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": "2oFWikZMQghCIcnY"
|
||||
},
|
||||
"salvo": null,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "heavy"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"_id": "VdgZx9v0s650UuQ0",
|
||||
"img": "modules/wng-core/assets/icons/weapons/ranged-weapon.webp",
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142626932,
|
||||
"modifiedTime": 1758142671577,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"folder": "9ke9KBkf4wjqg6Gg",
|
||||
"name": "Bile Squig",
|
||||
"type": "weapon",
|
||||
"_id": "2oFWikZMQghCIcnY",
|
||||
"img": "modules/wng-core/assets/icons/weapons/melee-weapon.webp",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "<p>Squig Launcher ammunition is a living, conscious being. Its effect on the battlefield has been simplified to that of a projectile, but if you wish to run a squiggly beast as a combatant, you can use the following profile: @UUID[Compendium.wng-cos.actors.Actor.6TQklyAQ4v1RWRPv]{Bile Squig}.</p>",
|
||||
"value": 2,
|
||||
"keywords": "ORK, SQUIG",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 10,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ed": {
|
||||
"base": 3,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "grenade-missile",
|
||||
"range": {
|
||||
"short": 0,
|
||||
"medium": 0,
|
||||
"long": 0,
|
||||
"melee": null,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "blast",
|
||||
"rating": "8"
|
||||
},
|
||||
{
|
||||
"name": "inflict",
|
||||
"rating": "Poisoned 2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142638477,
|
||||
"modifiedTime": 1758142638477,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758142355338,
|
||||
"modifiedTime": 1758142671578,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Actor.c8975bb7181d8e12",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": null,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "c8975bb7181d8e12"
|
||||
}
|
||||
@@ -0,0 +1,635 @@
|
||||
{
|
||||
"folder": "Kgk6Zo2oRvw9N5ii",
|
||||
"name": "Inquisitorial Arvus Lighter",
|
||||
"type": "vehicle",
|
||||
"img": "modules/wng-cos/assets/tokens/arvus-lighter.webp",
|
||||
"system": {
|
||||
"complement": {
|
||||
"pilot": 1,
|
||||
"crew": 1,
|
||||
"passenger": 4,
|
||||
"list": []
|
||||
},
|
||||
"mnvr": 4,
|
||||
"rarity": "uncommon",
|
||||
"value": 10,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "flyer"
|
||||
},
|
||||
{
|
||||
"name": "hover"
|
||||
},
|
||||
{
|
||||
"name": "reliable"
|
||||
},
|
||||
{
|
||||
"name": "sealed"
|
||||
}
|
||||
]
|
||||
},
|
||||
"combat": {
|
||||
"size": "huge",
|
||||
"speed": 190,
|
||||
"wounds": {
|
||||
"value": 0,
|
||||
"bonus": 0,
|
||||
"max": 17
|
||||
},
|
||||
"resilience": {
|
||||
"bonus": 0,
|
||||
"total": 17
|
||||
},
|
||||
"defence": {
|
||||
"bonus": 0
|
||||
},
|
||||
"fly": 0
|
||||
},
|
||||
"notes": "<p>A small cargo shuttle, the Arvus is robust enough to double as an assault boat for infantry landings and boarding parties. Few would praise its appearance, but the vessel has become a frequent sight in warzones.</p><p></p><p>This is a special version modified to be used as an inquisitorial shuttle. Due to amount of modification it has heavily reduced passenger compartment, almost non-existent cargo compartment and very limited life support (it gets REALLY cold after three hours inside).</p>",
|
||||
"settings": {
|
||||
"hidePassengers": false
|
||||
}
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Arvus Lighter",
|
||||
"displayName": 20,
|
||||
"actorLink": false,
|
||||
"appendNumber": false,
|
||||
"prependAdjective": false,
|
||||
"texture": {
|
||||
"src": "modules/wng-cos/assets/tokens/arvus-lighter.webp",
|
||||
"scaleX": 1,
|
||||
"scaleY": 1,
|
||||
"offsetX": 0,
|
||||
"offsetY": 0,
|
||||
"rotation": 0,
|
||||
"anchorX": 0.5,
|
||||
"anchorY": 0.5,
|
||||
"fit": "contain",
|
||||
"tint": "#ffffff",
|
||||
"alphaThreshold": 0.75
|
||||
},
|
||||
"width": 3,
|
||||
"height": 3,
|
||||
"lockRotation": false,
|
||||
"rotation": 0,
|
||||
"alpha": 1,
|
||||
"disposition": 0,
|
||||
"displayBars": 20,
|
||||
"bar1": {
|
||||
"attribute": "combat.wounds"
|
||||
},
|
||||
"bar2": {
|
||||
"attribute": null
|
||||
},
|
||||
"light": {
|
||||
"alpha": 0.5,
|
||||
"angle": 360,
|
||||
"bright": 0,
|
||||
"coloration": 1,
|
||||
"dim": 0,
|
||||
"attenuation": 0.5,
|
||||
"luminosity": 0.5,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"shadows": 0,
|
||||
"animation": {
|
||||
"type": null,
|
||||
"speed": 5,
|
||||
"intensity": 5,
|
||||
"reverse": false
|
||||
},
|
||||
"darkness": {
|
||||
"min": 0,
|
||||
"max": 1
|
||||
},
|
||||
"negative": false,
|
||||
"priority": 0,
|
||||
"color": null
|
||||
},
|
||||
"sight": {
|
||||
"enabled": false,
|
||||
"range": 0,
|
||||
"angle": 360,
|
||||
"visionMode": "basic",
|
||||
"attenuation": 0.1,
|
||||
"brightness": 0,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"color": null
|
||||
},
|
||||
"detectionModes": [],
|
||||
"flags": {},
|
||||
"randomImg": false,
|
||||
"occludable": {
|
||||
"radius": 0
|
||||
},
|
||||
"ring": {
|
||||
"enabled": false,
|
||||
"colors": {
|
||||
"ring": null,
|
||||
"background": null
|
||||
},
|
||||
"effects": 1,
|
||||
"subject": {
|
||||
"scale": 1,
|
||||
"texture": null
|
||||
}
|
||||
},
|
||||
"turnMarker": {
|
||||
"mode": 1,
|
||||
"animation": null,
|
||||
"src": null,
|
||||
"disposition": false
|
||||
},
|
||||
"movementAction": null
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"_id": "c1eM1YGFaqKckprQ",
|
||||
"name": "IMPERIUM",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 3500000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The vast interstellar empire of Humanity that spans over a million worlds, led by the Emperor from Holy Terra. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "AIDhVkSIsCH9Jfbx",
|
||||
"name": "AERONAUTICA IMPERIALIS",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 2100000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The Aeronautica Imperialis are part of the Navis Imperialis, and are responsible for Imperial in-atmosphere aviation. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FLYER",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"_id": "vhTSyOGeICmO7sQ4",
|
||||
"system": {
|
||||
"description": ""
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Just a very very bright searchlight",
|
||||
"type": "weapon",
|
||||
"folder": "ArBt3bkoEZjiK885",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>The <s>Aeldari</s> Inquisitorial Bright <s>Lance fires</s> Searchlight illuminates a target with a hyperfocussed beam of coherent light through psychically grown crystals. The beam is efficient and intensely powerful, able to penetrate even the thickest armour with pinpoint accuracy. This can be used only twice each flight before having to be recharged on the board of a capital ship</p>",
|
||||
"value": 9,
|
||||
"keywords": "LAS, AELDARI, ASURYANI",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 16,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ap": {
|
||||
"base": -4,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"dice": ""
|
||||
},
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"dice": ""
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false,
|
||||
"dice": ""
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 1,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"rating": "12",
|
||||
"name": "heavy"
|
||||
},
|
||||
{
|
||||
"name": "lance"
|
||||
},
|
||||
{
|
||||
"name": "reliable"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {
|
||||
"id": ""
|
||||
},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"_id": "2It4OvjTfwTp0CEX",
|
||||
"img": "modules/wng-core/assets/icons/weapons/ranged-weapon.webp",
|
||||
"effects": [],
|
||||
"sort": 400000,
|
||||
"flags": {
|
||||
"LocknKey": {
|
||||
"IDKeysFlag": "",
|
||||
"RemoveKeyonUseFlag": false,
|
||||
"LPFormulaFlag": "",
|
||||
"LPFormulaOverrideFlag": false,
|
||||
"LBFormulaFlag": "",
|
||||
"LBFormulaOverrideFlag": false,
|
||||
"ReplacementItemFlag": ""
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058557560,
|
||||
"modifiedTime": 1758058941650,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Infernum Halo Launcher",
|
||||
"folder": "kYNF8JUlpf9Syo2d",
|
||||
"type": "gear",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>Capable of firing a fusillade of Flares as a defensive countermeasure to distract automatically aimed anti-air projectiles, the Infernum Halo Launcher creates a ring of holy light that defends Imperial craft, reminiscent of the protective gaze of the Emperor.<br><br><strong>Effect: </strong>The Infernum Halo Launcher can be activated as a Reflexive Action whenever the vehicle it is attached to is targeted by an attack. When it is activated, the vehicle's Defence is increased by +4 until the start of the next Round.</p>",
|
||||
"value": 9,
|
||||
"keywords": "IMPERIUM, FLYER, ADEPTUS ASTARTES",
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_id": "RDQ5VFK3NNXZec4q",
|
||||
"img": "modules/wng-core/assets/icons/gear/gear.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058683811,
|
||||
"modifiedTime": 1758058683811,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Infernum Halo Launcher",
|
||||
"folder": "kYNF8JUlpf9Syo2d",
|
||||
"type": "gear",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>Capable of firing a fusillade of Flares as a defensive countermeasure to distract automatically aimed anti-air projectiles, the Infernum Halo Launcher creates a ring of holy light that defends Imperial craft, reminiscent of the protective gaze of the Emperor.<br><br><strong>Effect: </strong>The Infernum Halo Launcher can be activated as a Reflexive Action whenever the vehicle it is attached to is targeted by an attack. When it is activated, the vehicle's Defence is increased by +4 until the start of the next Round.</p>",
|
||||
"value": 9,
|
||||
"keywords": "IMPERIUM, FLYER, ADEPTUS ASTARTES",
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_id": "lSu6Rrrr9F11Sw3I",
|
||||
"img": "modules/wng-core/assets/icons/gear/gear.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058691816,
|
||||
"modifiedTime": 1758058691816,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Flare Launcher",
|
||||
"folder": "kYNF8JUlpf9Syo2d",
|
||||
"type": "gear",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "common",
|
||||
"description": "<p>Often used as an inexpensive signalling device, the Flare Launcher has seen activity as a method to hamper enemy targeting by using obscuring smoke.<br><br><strong>Effect: </strong>Flare Launchers are loaded with 6 Flares and can be fired using a Simple Action. When a vehicle fires a Flare, it gains +2 Defence against shooting attacks until the end of the following Round. Any allies on bikes within 12 metres of that vehicle treat their Speed as 6 higher in the Turn the Flare was fired.</p>",
|
||||
"value": 4,
|
||||
"keywords": "IMPERIUM",
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_id": "dszzCx9DCO0u3wAz",
|
||||
"img": "modules/wng-core/assets/icons/gear/gear.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058693804,
|
||||
"modifiedTime": 1758058693804,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Orbital Comms Array",
|
||||
"folder": "kYNF8JUlpf9Syo2d",
|
||||
"type": "gear",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "very-rare",
|
||||
"description": "<p>The advanced communications technology of the Orbital Comms Array allows warriors on the ground to call down a veritable Armageddon of firepower from the colossal weaponry of Imperial Cruisers in the void.<br><br><strong>Effect: </strong>A vehicle with an operational Orbital Comms Array is treated as having the @UUID[Compendium.wng-core.items.Item.0QAqbjjgBCYl78LT]{Bombardment} Talent, which can be used once per session by anyone aboard the vehicle.</p>",
|
||||
"value": 6,
|
||||
"keywords": "IMPERIUM, [ANY]",
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_id": "HRJKhtfgKDtUKKrw",
|
||||
"img": "modules/wng-core/assets/icons/gear/gear.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058703904,
|
||||
"modifiedTime": 1758058703904,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Shield Dome",
|
||||
"folder": "kYNF8JUlpf9Syo2d",
|
||||
"type": "gear",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "very-rare",
|
||||
"description": "<p>A large Refractor Field designed to cloak an entire vehicle with advanced protective energies, a Shield Dome is a rare device using the height of Imperial vehicular technology.<br><br><strong>Effect: </strong>A Shield Dome can only be installed on a Huge or larger vehicle. A vehicle with a Shield Dome gains +3* Resilience.</p>",
|
||||
"value": 7,
|
||||
"keywords": "ADEPTUS ASTARTES, PRIMARIS, TANK, TRANSPORT, RAIDER",
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_id": "L97wk36wXap5CFFg",
|
||||
"img": "modules/wng-core/assets/icons/gear/gear.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058715745,
|
||||
"modifiedTime": 1758058715745,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "srbBTA7HY8MfSS8V",
|
||||
"name": "Heavy Bolter (Requires Arvus to be unsealed for use)",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {},
|
||||
"LocknKey": {
|
||||
"IDKeysFlag": "",
|
||||
"RemoveKeyonUseFlag": false,
|
||||
"LPFormulaFlag": "",
|
||||
"LPFormulaOverrideFlag": false,
|
||||
"LBFormulaFlag": "",
|
||||
"LBFormulaOverrideFlag": false,
|
||||
"ReplacementItemFlag": ""
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "<p>The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.</p><p></p><p>It is a bolter that can be used only from the loading ramp of the ship for strafing or ground support.</p>",
|
||||
"value": 6,
|
||||
"keywords": "BOLT, IMPERIUM",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 12,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"dice": ""
|
||||
},
|
||||
"ap": {
|
||||
"base": -1,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"dice": ""
|
||||
},
|
||||
"enabled": false,
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"dice": ""
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 3,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "heavy"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "rapidFire"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {
|
||||
"id": ""
|
||||
},
|
||||
"twinned": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058742526,
|
||||
"modifiedTime": 1758058803595,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK"
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058442675,
|
||||
"modifiedTime": 1758059324353,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Actor.hF4mUyX99AMTa5MI",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "hF4mUyX99AMTa5MI"
|
||||
}
|
||||
@@ -0,0 +1,661 @@
|
||||
{
|
||||
"folder": null,
|
||||
"name": "Valkyrie \"Mloniya 1\"",
|
||||
"type": "vehicle",
|
||||
"img": "modules/wng-cos/assets/tokens/valkyrie.webp",
|
||||
"system": {
|
||||
"complement": {
|
||||
"pilot": 1,
|
||||
"crew": 3,
|
||||
"passenger": 12,
|
||||
"list": []
|
||||
},
|
||||
"mnvr": 6,
|
||||
"rarity": "rare",
|
||||
"value": 13,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "flyer"
|
||||
},
|
||||
{
|
||||
"name": "hover"
|
||||
},
|
||||
{
|
||||
"name": "reliable"
|
||||
},
|
||||
{
|
||||
"name": "sealed"
|
||||
},
|
||||
{
|
||||
"name": "turboBoost",
|
||||
"rating": "8"
|
||||
}
|
||||
]
|
||||
},
|
||||
"combat": {
|
||||
"size": "gargantuan",
|
||||
"speed": 115,
|
||||
"wounds": {
|
||||
"value": 0,
|
||||
"bonus": 0,
|
||||
"max": 15
|
||||
},
|
||||
"resilience": {
|
||||
"bonus": 0,
|
||||
"total": 15
|
||||
},
|
||||
"defence": {
|
||||
"bonus": 0
|
||||
},
|
||||
"fly": 0
|
||||
},
|
||||
"notes": "<p>The Valkyrie serves the Imperium as a versatile and reliable aerial weapons platform. It can also deploy and extricate ground troops with ease due to its VTOL capabilities and high speed. Combining these aspects with respectable armour and easily customisable weaponry, the Valkyrie is an invaluable asset to the Imperium’s military forces.</p><p>Though technically under the purview of the Imperial Navy, Valkyries are usually despatched to support Imperial Guard deployments of all types, from small sorties to full-scale battles. For beleaguered ground troops, the scream of their engines is always a welcome sound.</p><p></p><p>A <strong>Valkyrie</strong> may replace its @UUID[Compendium.wng-cos.items.Item.BEa8lO6vFyNa45Bl]{Hellstrike Missile}s with 2 @UUID[Compendium.wng-cos.items.Item.xTgz0HUZYa3SW0XK]{Multiple Rocket Pods}, and its @UUID[Compendium.wng-cos.items.Item.XtRh1VndguW93hzA]{Multi-Laser} with a @UUID[Compendium.wng-core.items.Item.x1Ouy4jFDseOnm26]{Lascannon}.</p>",
|
||||
"settings": {
|
||||
"hidePassengers": false
|
||||
}
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Valkyrie",
|
||||
"displayName": 20,
|
||||
"actorLink": false,
|
||||
"appendNumber": false,
|
||||
"prependAdjective": false,
|
||||
"texture": {
|
||||
"src": "modules/wng-cos/assets/tokens/valkyrie.webp",
|
||||
"scaleX": 1,
|
||||
"scaleY": 1,
|
||||
"offsetX": 0,
|
||||
"offsetY": 0,
|
||||
"rotation": 0,
|
||||
"anchorX": 0.5,
|
||||
"anchorY": 0.5,
|
||||
"fit": "contain",
|
||||
"tint": "#ffffff",
|
||||
"alphaThreshold": 0.75
|
||||
},
|
||||
"width": 4,
|
||||
"height": 4,
|
||||
"lockRotation": false,
|
||||
"rotation": 0,
|
||||
"alpha": 1,
|
||||
"disposition": 0,
|
||||
"displayBars": 20,
|
||||
"bar1": {
|
||||
"attribute": "combat.wounds"
|
||||
},
|
||||
"bar2": {
|
||||
"attribute": null
|
||||
},
|
||||
"light": {
|
||||
"alpha": 0.5,
|
||||
"angle": 360,
|
||||
"bright": 0,
|
||||
"coloration": 1,
|
||||
"dim": 0,
|
||||
"attenuation": 0.5,
|
||||
"luminosity": 0.5,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"shadows": 0,
|
||||
"animation": {
|
||||
"type": null,
|
||||
"speed": 5,
|
||||
"intensity": 5,
|
||||
"reverse": false
|
||||
},
|
||||
"darkness": {
|
||||
"min": 0,
|
||||
"max": 1
|
||||
},
|
||||
"negative": false,
|
||||
"priority": 0,
|
||||
"color": null
|
||||
},
|
||||
"sight": {
|
||||
"enabled": false,
|
||||
"range": 0,
|
||||
"angle": 360,
|
||||
"visionMode": "basic",
|
||||
"attenuation": 0.1,
|
||||
"brightness": 0,
|
||||
"saturation": 0,
|
||||
"contrast": 0,
|
||||
"color": null
|
||||
},
|
||||
"detectionModes": [],
|
||||
"flags": {},
|
||||
"randomImg": false,
|
||||
"occludable": {
|
||||
"radius": 0
|
||||
},
|
||||
"ring": {
|
||||
"enabled": false,
|
||||
"colors": {
|
||||
"ring": null,
|
||||
"background": null
|
||||
},
|
||||
"effects": 1,
|
||||
"subject": {
|
||||
"scale": 1,
|
||||
"texture": null
|
||||
}
|
||||
},
|
||||
"turnMarker": {
|
||||
"mode": 1,
|
||||
"animation": null,
|
||||
"src": null,
|
||||
"disposition": false
|
||||
},
|
||||
"movementAction": null
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"_id": "c1eM1YGFaqKckprQ",
|
||||
"name": "IMPERIUM",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 3500000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The vast interstellar empire of Humanity that spans over a million worlds, led by the Emperor from Holy Terra. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "AIDhVkSIsCH9Jfbx",
|
||||
"name": "AERONAUTICA IMPERIALIS",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 2100000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The Aeronautica Imperialis are part of the Navis Imperialis, and are responsible for Imperial in-atmosphere aviation. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "xmheh9BsPxK1eYk3",
|
||||
"name": "ASTRA MILITARUM",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/factions/astra-militarum.svg",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Keywords",
|
||||
"sort": 2500000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"description": "<p>The largest military force of the Imperium, numbering billions of mortal Humans. </p>"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "SXjZUgQ1pROPVE9j",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FLYER",
|
||||
"type": "keyword",
|
||||
"img": "modules/wng-core/assets/ui/aquila-white.webp",
|
||||
"_id": "P02iUsdpBLqaajhN",
|
||||
"system": {
|
||||
"description": ""
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Multi-Laser",
|
||||
"type": "weapon",
|
||||
"folder": "5Cdtq3mpuTzh76fA",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "<p>A rapid-firing and more deadly version Imperial Lasgun, the Multi-Laser utilises massive amounts of energy to fire powerful lasers at high speed. It is extremely effective at dispatching massed infantry and light vehicles with searing barrages.</p>",
|
||||
"value": 8,
|
||||
"keywords": "LAS, IMPERIUM, ASTRA MILITARUM",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 12,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 4,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": "y7oQWqUSmIZQElme"
|
||||
},
|
||||
"salvo": 4,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"rating": "Large",
|
||||
"name": "mounted"
|
||||
},
|
||||
{
|
||||
"rating": "2",
|
||||
"name": "rapidFire"
|
||||
},
|
||||
{
|
||||
"name": "reliable"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"_id": "XtRh1VndguW93hzA",
|
||||
"img": "modules/wng-core/assets/icons/weapons/lascannon.webp",
|
||||
"effects": [],
|
||||
"sort": 1600000,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"_id": "clL2gyHJYJKReJqS",
|
||||
"name": "Heavy Bolter",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 2,
|
||||
"rarity": "uncommon",
|
||||
"description": "The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.",
|
||||
"value": 6,
|
||||
"keywords": "BOLT, IMPERIUM",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 12,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": "QkaAGj8DRZmexAls"
|
||||
},
|
||||
"salvo": 3,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "heavy"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "rapidFire"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Hellstrike Missile",
|
||||
"type": "weapon",
|
||||
"folder": "apWp4JadfC6T9kpt",
|
||||
"system": {
|
||||
"quantity": 2,
|
||||
"rarity": "rare",
|
||||
"description": "<p>Similar to the @UUID[Compendium.wng-cos.items.Item.vFDen8DywXkNBu8K]{Hunter-Killer Missile} Missile, the Hellstrike allows Imperial aircraft to provide effective ground support</p>",
|
||||
"value": 5,
|
||||
"keywords": "EXPLOSIVE, IMPERIUM, AERONAUTICA IMPERIALIS",
|
||||
"equipped": true,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 14,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 3,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": -2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "launcher",
|
||||
"range": {
|
||||
"short": 36,
|
||||
"medium": 72,
|
||||
"long": 108,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": "DiQpmuvNoEtRY7yg"
|
||||
},
|
||||
"salvo": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "blast"
|
||||
},
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"rating": "Huge",
|
||||
"name": "mounted"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"_id": "gI7Vt1hsNXXenFcp",
|
||||
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"flags": {
|
||||
"core": {}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Multi-Laser Ammo",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"_id": "y7oQWqUSmIZQElme",
|
||||
"system": {
|
||||
"quantity": 10,
|
||||
"rarity": "common",
|
||||
"description": "",
|
||||
"value": 0,
|
||||
"keywords": "",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Heavy Bolter Ammo",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"_id": "QkaAGj8DRZmexAls",
|
||||
"system": {
|
||||
"quantity": 20,
|
||||
"rarity": "common",
|
||||
"description": "",
|
||||
"value": 0,
|
||||
"keywords": "",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Hellstrike Missile Ammo",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
|
||||
"_id": "DiQpmuvNoEtRY7yg",
|
||||
"system": {
|
||||
"quantity": 20,
|
||||
"rarity": "common",
|
||||
"description": "",
|
||||
"value": 0,
|
||||
"keywords": "",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758058994839,
|
||||
"modifiedTime": 1758059059038,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Actor.s4qSSaRJokNOfjkm",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "s4qSSaRJokNOfjkm"
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "Aegis of Titan (Ability)",
|
||||
"type": "talent",
|
||||
"img": "icons/svg/aura.svg",
|
||||
"_id": "WpiwdDYb43gYCaoZ",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "CZVs8Y7RVFIExaHs",
|
||||
"label": "Aegis of Titan — Innate Purity",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"_id": "fRopUvWWkFv6OzO4",
|
||||
"label": "Aegis of Titan — Aegis Synergy",
|
||||
"icon": "icons/svg/upgrade.svg",
|
||||
"origin": "",
|
||||
"disabled": true,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"core": {},
|
||||
"wng-core": {
|
||||
"initialization-folder": "Talents",
|
||||
"sort": 0
|
||||
}
|
||||
},
|
||||
"folder": null,
|
||||
"system": {
|
||||
"description": "Innate purity (+1 vs Corruption) and +1 while equipped with Aegis (toggle Synergy).",
|
||||
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"name": "Aegis of Titan (Ability)",
|
||||
"type": "ability",
|
||||
"img": "icons/svg/aura.svg",
|
||||
"_id": "3SQI68UqiAewIU1y",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "5suMwN6MqzHdEg4V",
|
||||
"name": "Aegis of Titan — Innate Purity",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"_id": "Bp0mJSit3PToM3N3",
|
||||
"name": "Aegis of Titan — Aegis Synergy",
|
||||
"icon": "icons/svg/upgrade.svg",
|
||||
"origin": "",
|
||||
"disabled": true,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"core": {}
|
||||
},
|
||||
"folder": null,
|
||||
"system": {
|
||||
"description": "Innate purity (+1 vs Corruption). While equipped with Aegis armour, enable Synergy for an additional +1 vs Corruption.",
|
||||
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS"
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"name": "Aegis Power Armour",
|
||||
"type": "armour",
|
||||
"img": "icons/svg/shield.svg",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "WzCZif9l1GFukRaE",
|
||||
"name": "Aegis Wards (Constant)",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.skills.psychicMastery.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"_id": "D27fn83cJnvlfpC4",
|
||||
"name": "Aegis Warding Runes (Toggle)",
|
||||
"icon": "icons/svg/explosion.svg",
|
||||
"origin": "",
|
||||
"disabled": true,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resilience.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.defence.bonus",
|
||||
"mode": 2,
|
||||
"value": -1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Armour",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "veryRare",
|
||||
"description": "<p>Grey Knights sanctified power armour with hexagrammic wards and storm bolter forearm mount.</p><ul><li><b>AR 5</b>; <b>Powered (3)</b>.</li><li><b>Aegis (integrated):</b> Constant: +1 die to Deny the Witch and +1 die to resist Corruption.</li><li><b>Toggle (Action):</b> Aegis Warding Runes — runes glow; +1 Resilience, −1 Defence (vs ranged).</li></ul>",
|
||||
"value": 9,
|
||||
"keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS",
|
||||
"equipped": false,
|
||||
"rating": 5,
|
||||
"base": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "powered",
|
||||
"rating": "3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"invulnerable": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779886550,
|
||||
"modifiedTime": 1755779886550,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.sTGTpOfbIveLcFul",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "K59Lb8PvaCmIrviu",
|
||||
"_id": "pTSF0G0Cvx4PzPXI"
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"name": "Aegis (Psychic Hood) — Grey Knights",
|
||||
"type": "gear",
|
||||
"img": "modules/wng-core/assets/icons/gear/psychic-hood.webp",
|
||||
"_id": "Niy9qzL63nlyNyzs",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "c2bj13jQg1uIz1Od",
|
||||
"name": "Warding Runes Engaged (Toggle)",
|
||||
"icon": "icons/svg/explosion.svg",
|
||||
"origin": "",
|
||||
"disabled": true,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resilience.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.defence.bonus",
|
||||
"mode": 2,
|
||||
"value": -1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"_id": "8wTAyZmZZ1hYMZDd",
|
||||
"name": "Aegis Wards (Constant)",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.skills.psychicMastery.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"core": {},
|
||||
"wng-core": {
|
||||
"initialization-folder": "Gear",
|
||||
"sort": 0
|
||||
}
|
||||
},
|
||||
"folder": null,
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "veryRare",
|
||||
"description": "<p>Hexagrammic wards and sanctified psychic hood.</p><p><b>Toggle (Action):</b> Warding Runes Engaged — +1 Resilience, −1 Defence (vs ranged). <b>Constant:</b> +1 die to Deny the Witch; +1 die vs Corruption.</p>",
|
||||
"value": 9,
|
||||
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, PSYCHIC HOOD",
|
||||
"equipped": false,
|
||||
"effect": "",
|
||||
"test": {
|
||||
"self": false
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,283 @@
|
||||
{
|
||||
"name": "Grey Knight (Archetype)",
|
||||
"type": "archetype",
|
||||
"img": "modules/wng-forsaken/assets/actors/archetype-astartes-librarian.webp",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "I76csFVFAcWAA4Zz",
|
||||
"label": "Aegis of Titan — Innate Purity",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-forsaken": {
|
||||
"initialization-folder": "Archetypes",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"tier": 4,
|
||||
"journal": "DMmW708Q5AQvQfuy",
|
||||
"species": {
|
||||
"name": "Adeptus Astartes",
|
||||
"id": "KpwHo0A92bR7iVMB"
|
||||
},
|
||||
"faction": {
|
||||
"name": "Adeptus Astartes",
|
||||
"id": "CN5E9Z5GqfiR1MDn"
|
||||
},
|
||||
"influence": 2,
|
||||
"cost": 359,
|
||||
"keywords": [
|
||||
"IMPERIUM",
|
||||
"ADEPTUS ASTARTES",
|
||||
"GREY KNIGHTS"
|
||||
],
|
||||
"attributes": {
|
||||
"strength": 5,
|
||||
"toughness": 5,
|
||||
"agility": 5,
|
||||
"initiative": 5,
|
||||
"willpower": 6,
|
||||
"intellect": 3,
|
||||
"fellowship": null
|
||||
},
|
||||
"skills": {
|
||||
"athletics": 3,
|
||||
"awareness": 3,
|
||||
"ballisticSkill": 5,
|
||||
"cunning": null,
|
||||
"deception": null,
|
||||
"insight": null,
|
||||
"intimidation": null,
|
||||
"investigation": null,
|
||||
"leadership": null,
|
||||
"medicae": null,
|
||||
"persuasion": null,
|
||||
"pilot": null,
|
||||
"psychicMastery": 4,
|
||||
"scholar": 2,
|
||||
"stealth": 3,
|
||||
"survival": 1,
|
||||
"tech": null,
|
||||
"weaponSkill": 5
|
||||
},
|
||||
"ability": {
|
||||
"id": "",
|
||||
"name": "Aegis of Titan",
|
||||
"description": "Innate Purity: +1 vs Corruption. Aegis Synergy: +1 vs Corruption while equipped with Aegis. Reroll 1 die on Deny the Witch each round."
|
||||
},
|
||||
"wargear": {
|
||||
"structure": {
|
||||
"type": "and",
|
||||
"groupId": "root",
|
||||
"id": "root",
|
||||
"options": [
|
||||
{
|
||||
"type": "option",
|
||||
"index": 0,
|
||||
"groupId": "cj0fha0grf41pcv4",
|
||||
"id": "cj0fha0grf41pcv4"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 1,
|
||||
"groupId": "a89wca5qifs6kga9",
|
||||
"id": "a89wca5qifs6kga9"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 2,
|
||||
"groupId": "7za8qa72jedhuct9",
|
||||
"id": "7za8qa72jedhuct9"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 3,
|
||||
"groupId": "q3jc5brs0mr50azx",
|
||||
"id": "q3jc5brs0mr50azx"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 4,
|
||||
"groupId": "lz6z45ef5goceln6",
|
||||
"id": "lz6z45ef5goceln6"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 5,
|
||||
"groupId": "xuev8a8qyfhywpzn",
|
||||
"id": "xuev8a8qyfhywpzn"
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"name": "Mk VII Astartes Power Armour",
|
||||
"type": "item",
|
||||
"id": "cj0fha0grf41pcv4",
|
||||
"diff": {
|
||||
"name": "Mk VII Astartes Power Armour"
|
||||
},
|
||||
"documentId": "7Bp1rDIfKEB2MB9N",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Psychic Hood",
|
||||
"type": "item",
|
||||
"id": "a89wca5qifs6kga9",
|
||||
"diff": {
|
||||
"name": "Psychic Hood"
|
||||
},
|
||||
"documentId": "qKIlaAhu9RZ63l1N",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Bolt Pistol",
|
||||
"type": "item",
|
||||
"id": "7za8qa72jedhuct9",
|
||||
"diff": {
|
||||
"name": "Bolt Pistol"
|
||||
},
|
||||
"documentId": "7b2xcPWBB7up65PM",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Force Stave",
|
||||
"type": "item",
|
||||
"id": "q3jc5brs0mr50azx",
|
||||
"diff": {
|
||||
"name": "Force Stave"
|
||||
},
|
||||
"documentId": "9vfkaU0vc61t7hKO",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Frag Grenades",
|
||||
"type": "item",
|
||||
"id": "lz6z45ef5goceln6",
|
||||
"diff": {
|
||||
"name": "Frag Grenades",
|
||||
"data": {
|
||||
"quantity": 3
|
||||
}
|
||||
},
|
||||
"documentId": "oDG9YpSKSiSUFLIY",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Krak Grenades",
|
||||
"type": "item",
|
||||
"id": "xuev8a8qyfhywpzn",
|
||||
"diff": {
|
||||
"name": "Krak Grenades",
|
||||
"data": {
|
||||
"quantity": 3
|
||||
}
|
||||
},
|
||||
"documentId": "SJ8UaYHEMtF71W1M",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
}
|
||||
],
|
||||
"freeItems": [
|
||||
{
|
||||
"id": "",
|
||||
"name": "Nemesis Force Halberd"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Aegis (Psychic Hood) — Grey Knights"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Astartes Storm Bolter (Aegis Mount)"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Frag Grenade"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Krak Grenade"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Trinket (Chapter Relic Shard)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"suggested": {
|
||||
"attributes": {
|
||||
"strength": null,
|
||||
"toughness": null,
|
||||
"agility": null,
|
||||
"initiative": null,
|
||||
"willpower": null,
|
||||
"intellect": null,
|
||||
"fellowship": null
|
||||
},
|
||||
"skills": {
|
||||
"athletics": null,
|
||||
"awareness": null,
|
||||
"ballisticSkill": null,
|
||||
"cunning": null,
|
||||
"deception": null,
|
||||
"insight": null,
|
||||
"intimidation": null,
|
||||
"investigation": null,
|
||||
"leadership": null,
|
||||
"medicae": null,
|
||||
"persuasion": null,
|
||||
"pilot": null,
|
||||
"psychicMastery": null,
|
||||
"scholar": null,
|
||||
"stealth": null,
|
||||
"survival": null,
|
||||
"tech": null,
|
||||
"weaponSkill": null
|
||||
},
|
||||
"talents": {
|
||||
"list": []
|
||||
}
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755771384639,
|
||||
"modifiedTime": 1755771384639,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.TCmE7YmUDUVQ3xoz",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "DEb55m6iVZ0NUOxA",
|
||||
"_id": "VLHxIxgzHvpG706F"
|
||||
}
|
||||
@@ -0,0 +1,290 @@
|
||||
{
|
||||
"name": "Grey Knight (Archetype)",
|
||||
"type": "archetype",
|
||||
"img": "icons/svg/book.svg",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "T0IpNmU0xjFwmcwr",
|
||||
"name": "Aegis of Titan — Innate Purity",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-forsaken": {
|
||||
"initialization-folder": "Archetypes",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"tier": 4,
|
||||
"journal": "DMmW708Q5AQvQfuy",
|
||||
"species": {
|
||||
"name": "Adeptus Astartes",
|
||||
"id": "KpwHo0A92bR7iVMB"
|
||||
},
|
||||
"faction": {
|
||||
"name": "Adeptus Astartes",
|
||||
"id": "CN5E9Z5GqfiR1MDn"
|
||||
},
|
||||
"influence": 2,
|
||||
"cost": 359,
|
||||
"keywords": [
|
||||
"IMPERIUM",
|
||||
"ADEPTUS ASTARTES",
|
||||
"GREY KNIGHTS",
|
||||
"INQUISITION",
|
||||
"DAEMONHUNTERS",
|
||||
"ORDO MALLEUS"
|
||||
],
|
||||
"attributes": {
|
||||
"strength": 5,
|
||||
"toughness": 5,
|
||||
"agility": 5,
|
||||
"initiative": 5,
|
||||
"willpower": 6,
|
||||
"intellect": 3,
|
||||
"fellowship": null
|
||||
},
|
||||
"skills": {
|
||||
"athletics": 3,
|
||||
"awareness": 3,
|
||||
"ballisticSkill": 5,
|
||||
"cunning": null,
|
||||
"deception": null,
|
||||
"insight": null,
|
||||
"intimidation": null,
|
||||
"investigation": null,
|
||||
"leadership": null,
|
||||
"medicae": null,
|
||||
"persuasion": null,
|
||||
"pilot": null,
|
||||
"psychicMastery": 4,
|
||||
"scholar": 2,
|
||||
"stealth": 3,
|
||||
"survival": 1,
|
||||
"tech": null,
|
||||
"weaponSkill": 5
|
||||
},
|
||||
"ability": {
|
||||
"id": "",
|
||||
"name": "Aegis of Titan",
|
||||
"description": "Innate Purity: +1 vs Corruption. Aegis Synergy: +1 vs Corruption while equipped with Aegis armour. Re-roll 1 die on Deny the Witch each round."
|
||||
},
|
||||
"wargear": {
|
||||
"structure": {
|
||||
"type": "and",
|
||||
"groupId": "root",
|
||||
"id": "root",
|
||||
"options": [
|
||||
{
|
||||
"type": "option",
|
||||
"index": 0,
|
||||
"groupId": "cj0fha0grf41pcv4",
|
||||
"id": "cj0fha0grf41pcv4"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 1,
|
||||
"groupId": "a89wca5qifs6kga9",
|
||||
"id": "a89wca5qifs6kga9"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 2,
|
||||
"groupId": "7za8qa72jedhuct9",
|
||||
"id": "7za8qa72jedhuct9"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 3,
|
||||
"groupId": "q3jc5brs0mr50azx",
|
||||
"id": "q3jc5brs0mr50azx"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 4,
|
||||
"groupId": "lz6z45ef5goceln6",
|
||||
"id": "lz6z45ef5goceln6"
|
||||
},
|
||||
{
|
||||
"type": "option",
|
||||
"index": 5,
|
||||
"groupId": "xuev8a8qyfhywpzn",
|
||||
"id": "xuev8a8qyfhywpzn"
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"name": "Mk VII Astartes Power Armour",
|
||||
"type": "item",
|
||||
"id": "cj0fha0grf41pcv4",
|
||||
"diff": {
|
||||
"name": "Mk VII Astartes Power Armour"
|
||||
},
|
||||
"documentId": "7Bp1rDIfKEB2MB9N",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Psychic Hood",
|
||||
"type": "item",
|
||||
"id": "a89wca5qifs6kga9",
|
||||
"diff": {
|
||||
"name": "Psychic Hood"
|
||||
},
|
||||
"documentId": "qKIlaAhu9RZ63l1N",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Bolt Pistol",
|
||||
"type": "item",
|
||||
"id": "7za8qa72jedhuct9",
|
||||
"diff": {
|
||||
"name": "Bolt Pistol"
|
||||
},
|
||||
"documentId": "7b2xcPWBB7up65PM",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Force Stave",
|
||||
"type": "item",
|
||||
"id": "q3jc5brs0mr50azx",
|
||||
"diff": {
|
||||
"name": "Force Stave"
|
||||
},
|
||||
"documentId": "9vfkaU0vc61t7hKO",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Frag Grenades",
|
||||
"type": "item",
|
||||
"id": "lz6z45ef5goceln6",
|
||||
"diff": {
|
||||
"name": "Frag Grenades",
|
||||
"data": {
|
||||
"quantity": 3
|
||||
}
|
||||
},
|
||||
"documentId": "oDG9YpSKSiSUFLIY",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
},
|
||||
{
|
||||
"name": "Krak Grenades",
|
||||
"type": "item",
|
||||
"id": "xuev8a8qyfhywpzn",
|
||||
"diff": {
|
||||
"name": "Krak Grenades",
|
||||
"data": {
|
||||
"quantity": 3
|
||||
}
|
||||
},
|
||||
"documentId": "SJ8UaYHEMtF71W1M",
|
||||
"idType": "id",
|
||||
"filters": []
|
||||
}
|
||||
],
|
||||
"freeItems": [
|
||||
{
|
||||
"id": "",
|
||||
"name": "Nemesis Force Halberd"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Aegis Power Armour"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Grey Knight Armour Integrated Storm Bolter"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Aegis of Titan (Ability)"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Frag Grenade"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Krak Grenade"
|
||||
},
|
||||
{
|
||||
"id": "",
|
||||
"name": "Trinket (Chapter Relic Shard)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"suggested": {
|
||||
"attributes": {
|
||||
"strength": null,
|
||||
"toughness": null,
|
||||
"agility": null,
|
||||
"initiative": null,
|
||||
"willpower": null,
|
||||
"intellect": null,
|
||||
"fellowship": null
|
||||
},
|
||||
"skills": {
|
||||
"athletics": null,
|
||||
"awareness": null,
|
||||
"ballisticSkill": null,
|
||||
"cunning": null,
|
||||
"deception": null,
|
||||
"insight": null,
|
||||
"intimidation": null,
|
||||
"investigation": null,
|
||||
"leadership": null,
|
||||
"medicae": null,
|
||||
"persuasion": null,
|
||||
"pilot": null,
|
||||
"psychicMastery": null,
|
||||
"scholar": null,
|
||||
"stealth": null,
|
||||
"survival": null,
|
||||
"tech": null,
|
||||
"weaponSkill": null
|
||||
},
|
||||
"talents": {
|
||||
"list": []
|
||||
}
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755771384639,
|
||||
"modifiedTime": 1755771384639,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.TCmE7YmUDUVQ3xoz",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "DEb55m6iVZ0NUOxA",
|
||||
"_id": "AhWvgUliU6XV5GFT"
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"folder": "9ke9KBkf4wjqg6Gg",
|
||||
"name": "Bile Squig",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/melee-weapon.webp",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "<p>Squig Launcher ammunition is a living, conscious being. Its effect on the battlefield has been simplified to that of a projectile, but if you wish to run a squiggly beast as a combatant, you can use the following profile: @UUID[Compendium.wng-cos.actors.Actor.6TQklyAQ4v1RWRPv]{Bile Squig}.</p>",
|
||||
"value": 2,
|
||||
"keywords": "ORK, SQUIG",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 10,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ed": {
|
||||
"base": 3,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "grenade-missile",
|
||||
"range": {
|
||||
"short": 0,
|
||||
"medium": 0,
|
||||
"long": 0,
|
||||
"melee": null,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "blast",
|
||||
"rating": "8"
|
||||
},
|
||||
{
|
||||
"name": "inflict",
|
||||
"rating": "Poisoned 2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758136200481,
|
||||
"modifiedTime": 1758136200481,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.SLT8t7m3UHZ1v5dq",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "SLT8t7m3UHZ1v5dq"
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "Bolt",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/bolt.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Ammo",
|
||||
"sort": -50000
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 0,
|
||||
"rarity": "uncommon",
|
||||
"description": "",
|
||||
"value": 2,
|
||||
"keywords": "",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758136282162,
|
||||
"modifiedTime": 1758136282162,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.Y1Xc0ybqJdgJEFFP",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "fyz06Xz1z4Pqj4BP",
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "Y1Xc0ybqJdgJEFFP"
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"name": "Grey Knight Armour Integrated Storm Bolter",
|
||||
"type": "weapon",
|
||||
"img": "icons/svg/gun.svg",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>Integrated forearm storm bolter. <b>Integrated:</b> does not occupy hands; may fire while wielding two‑handed melee. Treat as Pistol for firing in melee.</p>",
|
||||
"value": 4,
|
||||
"keywords": "BOLT, INTEGRATED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 10,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"enabled": false,
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 12,
|
||||
"medium": 24,
|
||||
"long": 36,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 1,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"name": "pistol"
|
||||
},
|
||||
{
|
||||
"name": "rapidFire",
|
||||
"rating": "2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779945407,
|
||||
"modifiedTime": 1755779945407,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.Seza6hxnXhHInk8m",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"_id": "1R3iq7EsPdCYkMiU"
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"name": "Heavy Bolter",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.",
|
||||
"value": 6,
|
||||
"keywords": "BOLT, IMPERIUM",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 12,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": -1,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"enabled": false,
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 3,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "heavy"
|
||||
},
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "rapidFire"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758136294829,
|
||||
"modifiedTime": 1758136294829,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.ut6nsTPR0xL4mfET",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "ut6nsTPR0xL4mfET"
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
{
|
||||
"name": "Heavy Squig Launcha",
|
||||
"type": "weapon",
|
||||
"folder": "vmJPLFnHHoDwT4DM",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "<p>A larger version of the primitive weapon that propels murderous Orkoids known as Squigs wherever an Ork sees fit. Whenever you fire a Heavy Squig Launcha, you can fire a Bile, Bitey, or Boom Squig.</p><ul><li><p>@UUID[Compendium.wng-cos.items.Item.SLT8t7m3UHZ1v5dq]{Bile Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.LkjqUWSEfH14D9Jj]{Bitey Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.QHcZdjZBknkZq39u]{Boom Squig}</p></li></ul>",
|
||||
"value": 6,
|
||||
"keywords": "ORK, SQUIG",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "launcher",
|
||||
"range": {
|
||||
"short": 18,
|
||||
"medium": 36,
|
||||
"long": 54,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": null,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"rating": "4",
|
||||
"name": "heavy"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"img": "modules/wng-core/assets/icons/weapons/ranged-weapon.webp",
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758136217894,
|
||||
"modifiedTime": 1758136217894,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.ft1Rx5y4pKSoBvxj",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "ft1Rx5y4pKSoBvxj"
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"name": "Hellfire Bolt Rounds",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/hellfire-bolt-rounds.webp",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "Omr8RqQpJAAj66Cz",
|
||||
"changes": [],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"seconds": null,
|
||||
"combat": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
},
|
||||
"transfer": false,
|
||||
"flags": {
|
||||
"wrath-and-glory": {
|
||||
"description": "",
|
||||
"changeCondition": {
|
||||
"0": {
|
||||
"script": "",
|
||||
"description": "Inorganic Target"
|
||||
},
|
||||
"1": {
|
||||
"script": "",
|
||||
"description": "Organic Target"
|
||||
}
|
||||
},
|
||||
"manualEffectKeys": false
|
||||
}
|
||||
},
|
||||
"tint": "#ffffff",
|
||||
"origin": null,
|
||||
"name": "Hellfire Bolt Rounds",
|
||||
"description": "",
|
||||
"statuses": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"img": "modules/wng-core/assets/icons/ammo/hellfire-bolt-rounds.webp",
|
||||
"type": "base",
|
||||
"system": {
|
||||
"transferData": {
|
||||
"documentType": "Item",
|
||||
"type": "document",
|
||||
"originalType": "document",
|
||||
"avoidTest": {
|
||||
"value": "none",
|
||||
"opposed": false,
|
||||
"prevention": true,
|
||||
"reversed": false
|
||||
},
|
||||
"testIndependent": false,
|
||||
"equipTransfer": false,
|
||||
"selfOnly": false,
|
||||
"prompt": false,
|
||||
"area": {
|
||||
"templateData": {
|
||||
"borderColor": null,
|
||||
"fillColor": null,
|
||||
"texture": null
|
||||
},
|
||||
"keep": false,
|
||||
"aura": {
|
||||
"transferred": false,
|
||||
"render": false
|
||||
},
|
||||
"duration": "sustained"
|
||||
},
|
||||
"zone": {
|
||||
"type": "zone",
|
||||
"transferred": false,
|
||||
"traits": {},
|
||||
"skipImmediateOnPlacement": false,
|
||||
"keep": false
|
||||
}
|
||||
},
|
||||
"scriptData": [
|
||||
{
|
||||
"script": "[Script.kfxaiFWAqWgb57Xj]",
|
||||
"label": "Organic Target",
|
||||
"trigger": "dialog",
|
||||
"options": {
|
||||
"targeter": false,
|
||||
"hideScript": "",
|
||||
"activateScript": "",
|
||||
"submissionScript": "",
|
||||
"deleteEffect": false,
|
||||
"defending": false
|
||||
},
|
||||
"async": false
|
||||
},
|
||||
{
|
||||
"script": "[Script.tmtDBU0AvKlGUXUi]",
|
||||
"label": "Inorganic Target",
|
||||
"trigger": "dialog",
|
||||
"options": {
|
||||
"targeter": false,
|
||||
"hideScript": "",
|
||||
"activateScript": "",
|
||||
"submissionScript": "",
|
||||
"deleteEffect": false,
|
||||
"defending": false
|
||||
},
|
||||
"async": false
|
||||
}
|
||||
],
|
||||
"itemTargetData": {
|
||||
"ids": [],
|
||||
"allItems": false
|
||||
},
|
||||
"zone": {
|
||||
"type": "zone",
|
||||
"traits": {},
|
||||
"skipImmediateOnPlacement": false
|
||||
},
|
||||
"sourceData": {
|
||||
"test": {}
|
||||
}
|
||||
},
|
||||
"sort": 0
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Ammo",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "very-rare",
|
||||
"description": "<p>Developed to combat Tyranids, a vial of mutagenic acid replaces the core and tip of these rounds. As the round strikes, thousands of tiny needles splinter and rip through the vial, injecting the accumulated acid directly into exposed flesh. </p>\n<p><strong>Effect</strong>: +3 ED against organic targets. +2 ED against inorganic targets.</p>",
|
||||
"value": 6,
|
||||
"keywords": "IMPERIUM, ADEPTUS ASTARTES",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758143070187,
|
||||
"modifiedTime": 1758143070187,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.ZIXiS264WZhHapZS",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "fyz06Xz1z4Pqj4BP",
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "ZIXiS264WZhHapZS"
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
{
|
||||
"name": "Hurricane Bolter",
|
||||
"type": "weapon",
|
||||
"folder": "5Cdtq3mpuTzh76fA",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>A Hurricane Bolter comprises six interlinked Boltguns mounted on a single vehicle sponson, multiplying the deadly force of the Adeptus Astartes’ iconic weapon.</p>",
|
||||
"value": 8,
|
||||
"keywords": "BOLT, IMPERIUM, ADEPTUS ASTARTES",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 10,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
},
|
||||
"enabled": false
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 12,
|
||||
"medium": 24,
|
||||
"long": 36,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 6,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"rating": "6",
|
||||
"name": "rapidFire"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"combi": {},
|
||||
"twinned": false,
|
||||
"otherDamage": {}
|
||||
},
|
||||
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
|
||||
"effects": [],
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758136183738,
|
||||
"modifiedTime": 1758136183738,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.BXNJ0R8o0E29pOpe",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "BXNJ0R8o0E29pOpe"
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"name": "Kraken Bolt Rounds",
|
||||
"type": "ammo",
|
||||
"img": "modules/wng-core/assets/icons/ammo/kraken-bolt-rounds.webp",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "KgRfIVCDblNxCy9m",
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.damage.ap.bonus",
|
||||
"mode": 2,
|
||||
"value": "-2",
|
||||
"priority": null
|
||||
}
|
||||
],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"seconds": null,
|
||||
"combat": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
},
|
||||
"transfer": false,
|
||||
"flags": {
|
||||
"wrath-and-glory": {
|
||||
"description": "",
|
||||
"manualEffectKeys": true
|
||||
}
|
||||
},
|
||||
"tint": "#ffffff",
|
||||
"origin": null,
|
||||
"name": "Kraken Bolt Rounds",
|
||||
"description": "",
|
||||
"statuses": [],
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"img": "modules/wng-core/assets/icons/ammo/kraken-bolt-rounds.webp",
|
||||
"type": "base",
|
||||
"system": {
|
||||
"transferData": {
|
||||
"type": "document",
|
||||
"originalType": "document",
|
||||
"documentType": "Actor",
|
||||
"avoidTest": {
|
||||
"value": "none",
|
||||
"opposed": false,
|
||||
"prevention": true,
|
||||
"reversed": false
|
||||
},
|
||||
"testIndependent": false,
|
||||
"equipTransfer": false,
|
||||
"selfOnly": false,
|
||||
"prompt": false,
|
||||
"area": {
|
||||
"templateData": {
|
||||
"borderColor": null,
|
||||
"fillColor": null,
|
||||
"texture": null
|
||||
},
|
||||
"keep": false,
|
||||
"aura": {
|
||||
"transferred": false,
|
||||
"render": false
|
||||
},
|
||||
"duration": "sustained"
|
||||
},
|
||||
"zone": {
|
||||
"type": "zone",
|
||||
"transferred": false,
|
||||
"traits": {},
|
||||
"skipImmediateOnPlacement": false,
|
||||
"keep": false
|
||||
}
|
||||
},
|
||||
"itemTargetData": {
|
||||
"ids": [],
|
||||
"allItems": false
|
||||
},
|
||||
"scriptData": [],
|
||||
"zone": {
|
||||
"type": "zone",
|
||||
"traits": {},
|
||||
"skipImmediateOnPlacement": false
|
||||
},
|
||||
"sourceData": {
|
||||
"test": {}
|
||||
}
|
||||
},
|
||||
"sort": 0
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Ammo",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "very-rare",
|
||||
"description": "<p>These powerful armour-piercing Bolt shells possess a solid adamantium core delivered by a powerful propellant. Upon impact, the outer casing peels away, allowing the high-velocity adamantium penetrator to accelerate further into the target before its payload detonates.</p>\n<p><strong>Effect</strong>: AP -2</p>",
|
||||
"value": 6,
|
||||
"keywords": "IMPERIUM, ADEPTUS ASTARTES",
|
||||
"effect": "",
|
||||
"traits": {
|
||||
"list": []
|
||||
}
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1758143095932,
|
||||
"modifiedTime": 1758143095932,
|
||||
"lastModifiedBy": "ETeghv7x8fjtIEKK",
|
||||
"exportSource": {
|
||||
"worldId": "gilead2",
|
||||
"uuid": "Item.p42CwuqBal2u2iLw",
|
||||
"coreVersion": "13.348",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "fyz06Xz1z4Pqj4BP",
|
||||
"ownership": {
|
||||
"default": 0
|
||||
},
|
||||
"_id": "p42CwuqBal2u2iLw"
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"name": "Nemesis Force Halberd",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/force-stave.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "Force Staves are laced with a complex psy-matrix that allows them to act as a psychic battery, storing psychic energy that can be released with brutal efficiency.<p><em>Nemesis:</em> vs DAEMON/PSYKER: +1 ED (homebrew). Two‑Handed.</p>",
|
||||
"value": 2,
|
||||
"keywords": "FORCE, AELDARI, 2-HANDED, INQUISITION, ADEPTUS ASTARTES, ADEPTUS ASTRA TELEPATHICA, GREY KNIGHTS",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 4,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ap": {
|
||||
"base": -1,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"enabled": false,
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "melee",
|
||||
"range": {
|
||||
"short": 0,
|
||||
"medium": 0,
|
||||
"long": 0,
|
||||
"melee": 2,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"name": "force"
|
||||
},
|
||||
{
|
||||
"name": "twoHanded"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779931196,
|
||||
"modifiedTime": 1755779931196,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.9vfkaU0vc61t7hKO",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"_id": "m1dt3VuFzdGxMgaC"
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"name": "Nemesis Force Halberd",
|
||||
"type": "weapon",
|
||||
"img": "icons/svg/sword.svg",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "uncommon",
|
||||
"description": "Force Staves are laced with a complex psy-matrix that allows them to act as a psychic battery, storing psychic energy that can be released with brutal efficiency.<p><em>Nemesis:</em> vs DAEMON/PSYKER: +1 ED (homebrew). Two‑Handed.</p>",
|
||||
"value": 2,
|
||||
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS, MELEE, FORCE",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 4,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ap": {
|
||||
"base": -1,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"enabled": false,
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "melee",
|
||||
"range": {
|
||||
"short": 0,
|
||||
"medium": 0,
|
||||
"long": 0,
|
||||
"melee": 2,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"name": "force"
|
||||
},
|
||||
{
|
||||
"name": "twoHanded"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779931196,
|
||||
"modifiedTime": 1755779931196,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.9vfkaU0vc61t7hKO",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"_id": "O68u3VzArlrZwwFb"
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"name": "Pilgrim Astartes Plate (Disguise Armour)",
|
||||
"type": "armour",
|
||||
"img": "modules/wng-core/assets/icons/armour/terminator-armour.webp",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "44rACWx99MiXXe4E",
|
||||
"name": "Pilgrim Disguise Penalties",
|
||||
"icon": "icons/svg/downgrade.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"seconds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.attributes.agility.bonus",
|
||||
"mode": 2,
|
||||
"value": -1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.skills.stealth.bonus",
|
||||
"mode": 2,
|
||||
"value": -1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.speed",
|
||||
"mode": 2,
|
||||
"value": -1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Armour",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>Scavenged Black Templars plate, patched & lightened. Designed for incognito operations.</p><ul><li><b>AR 4</b>; <b>Powered (1)</b>; <b>Cumbersome</b>.</li><li><b>Penalty (Active Effect):</b> −1 die to Agility- and Stealth-based Tests while worn; −1 Speed (homebrew).</li><li>Appears as Templar armour at a glance; close inspection may reveal inconsistencies.</li></ul>",
|
||||
"value": 6,
|
||||
"keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, BLACK TEMPLARS (DISGUISE)",
|
||||
"equipped": true,
|
||||
"rating": 4,
|
||||
"base": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "cumbersome"
|
||||
},
|
||||
{
|
||||
"name": "powered",
|
||||
"rating": "1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"invulnerable": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779886550,
|
||||
"modifiedTime": 1755779886550,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.sTGTpOfbIveLcFul",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "K59Lb8PvaCmIrviu",
|
||||
"_id": "2P2HioialQdFUCv6"
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"name": "Astartes Storm Bolter (Aegis Mount)",
|
||||
"type": "weapon",
|
||||
"img": "modules/wng-core/assets/icons/weapons/bolt-pistol.webp",
|
||||
"effects": [],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Weapons",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "rare",
|
||||
"description": "<p>Integrated storm bolter module. <b>Integrated:</b> does not occupy hands; may fire while wielding two‑handed melee. Treat as Pistol for firing in melee.</p>",
|
||||
"value": 4,
|
||||
"keywords": "BOLT, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INTEGRATED",
|
||||
"equipped": false,
|
||||
"attack": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": "none"
|
||||
},
|
||||
"damage": {
|
||||
"base": 10,
|
||||
"bonus": 0,
|
||||
"rank": 0,
|
||||
"ed": {
|
||||
"base": 2,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"enabled": false,
|
||||
"otherDamage": {
|
||||
"mortal": "0",
|
||||
"wounds": "0",
|
||||
"shock": "0"
|
||||
}
|
||||
},
|
||||
"ed": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"ap": {
|
||||
"base": 0,
|
||||
"bonus": 0,
|
||||
"rank": 0
|
||||
},
|
||||
"category": "ranged",
|
||||
"range": {
|
||||
"short": 12,
|
||||
"medium": 24,
|
||||
"long": 36,
|
||||
"melee": 1,
|
||||
"thrown": null
|
||||
},
|
||||
"ammo": {
|
||||
"id": ""
|
||||
},
|
||||
"salvo": 1,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "brutal"
|
||||
},
|
||||
{
|
||||
"name": "pistol"
|
||||
},
|
||||
{
|
||||
"name": "rapidFire",
|
||||
"rating": "2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [],
|
||||
"otherDamage": {},
|
||||
"combi": {},
|
||||
"twinned": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779945407,
|
||||
"modifiedTime": 1755779945407,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.Seza6hxnXhHInk8m",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "85dkcvhBYli5TJrZ",
|
||||
"_id": "fUottZHaIQ6IhPH8"
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
{
|
||||
"name": "Terminator Aegis (Grey Knights)",
|
||||
"type": "armour",
|
||||
"img": "icons/svg/tower.svg",
|
||||
"effects": [
|
||||
{
|
||||
"_id": "0f6j24Bb5F9IltEj",
|
||||
"name": "Aegis Wards (Constant)",
|
||||
"icon": "icons/svg/aura.svg",
|
||||
"origin": "",
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.skills.psychicMastery.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.resolve.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"_id": "fABPJslze9yrrlcc",
|
||||
"name": "Aegis Warding Runes (Toggle)",
|
||||
"icon": "icons/svg/explosion.svg",
|
||||
"origin": "",
|
||||
"disabled": true,
|
||||
"duration": {
|
||||
"startTime": null
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.combat.resilience.bonus",
|
||||
"mode": 2,
|
||||
"value": 1,
|
||||
"priority": 20
|
||||
},
|
||||
{
|
||||
"key": "system.combat.defence.bonus",
|
||||
"mode": 2,
|
||||
"value": -1,
|
||||
"priority": 20
|
||||
}
|
||||
],
|
||||
"tint": null,
|
||||
"transfer": true,
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"wng-core": {
|
||||
"initialization-folder": "Armour",
|
||||
"sort": 0
|
||||
},
|
||||
"core": {}
|
||||
},
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"rarity": "artifact",
|
||||
"description": "<p>Grey Knights Tactical Dreadnought armour with Aegis wards and storm bolter hard‑mount.</p><ul><li><b>AR 7</b>; <b>Powered (4)</b>; <b>Cumbersome</b>; counts as Large while worn.</li><li><b>Aegis (integrated):</b> Constant: +1 die to Deny the Witch and +1 die to resist Corruption.</li><li><b>Toggle (Action):</b> Aegis Warding Runes — +1 Resilience, −1 Defence (vs ranged).</li></ul>",
|
||||
"value": 10,
|
||||
"keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS",
|
||||
"equipped": false,
|
||||
"rating": 7,
|
||||
"base": 0,
|
||||
"traits": {
|
||||
"list": [
|
||||
{
|
||||
"name": "cumbersome"
|
||||
},
|
||||
{
|
||||
"name": "powered",
|
||||
"rating": "4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"invulnerable": false
|
||||
},
|
||||
"_stats": {
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1",
|
||||
"createdTime": 1755779886550,
|
||||
"modifiedTime": 1755779886550,
|
||||
"lastModifiedBy": "8fThFXcxV83JCCcX",
|
||||
"exportSource": {
|
||||
"worldId": "gilead-wandg",
|
||||
"uuid": "Item.sTGTpOfbIveLcFul",
|
||||
"coreVersion": "13.347",
|
||||
"systemId": "wrath-and-glory",
|
||||
"systemVersion": "7.1.1"
|
||||
}
|
||||
},
|
||||
"folder": "K59Lb8PvaCmIrviu",
|
||||
"_id": "vq0e5MD7FXcEqQFi"
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
component_name,category,mount,scale,strength,damage,crit_rating,range_vu,power,space,sp,availability,special_rules_notes,book_sources,needs_review
|
||||
Mars-pattern Macrocannon Broadside (Frigate Scale),Macrocannon,Dorsal,Raider/Frigate,3,1d10+2,5,6,4,2,1,UNKN,"Standard macrobattery for escorts; broadside-equivalent on dorsal for small hulls.",Core (Table 8-4),
|
||||
Mars-pattern Macrocannon Broadside (Cruiser Scale),Macrocannon,Port/Starboard,Cruiser/Battlecruiser,6,1d10+2,5,6,4,5,1,UNKN,Standard cruiser macrobroadside component.,Core (Table 8-4),
|
||||
Sunsear Laser Battery (Frigate Scale),Laser Battery,Dorsal,Raider/Frigate,4,1d10+2,4,9,6,4,1,UNKN,High accuracy laser macrobattery used by escorts.,Core (Table 8-4),
|
||||
Sunsear Laser Battery (Cruiser Scale),Laser Battery,Port/Starboard,Cruiser/Battlecruiser,6,1d10+2,4,9,9,6,1,UNKN,Cruiser-grade laser macrobattery.,Supplemental Table 4-2,
|
||||
Dorsal Lance Battery (Frigate Grade),Lance,Dorsal,Frigate,1,1d10+2,3,5,6,4,2,UNKN,Single/double lance mount for escorts.,Core (Table 8-4),
|
||||
Prow Lance Battery (Light Cruiser),Lance,Prow,Light Cruiser,1,1d10+4,3,6,9,4,2,UNKN,Iconic Dauntless prow lance fit.,Core (Table 8-4),
|
||||
Port/Starboard Lance Battery (Cruiser),Lance,Port/Starboard,Cruiser/Battlecruiser,2,1d10+4,3,6,13,6,2,UNKN,Heavy lance broadside for line ships.,Core (Table 8-4),
|
||||
Voss-pattern Torpedo Tubes,Torpedo Tubes,Prow,Escort/Light Cruiser/Cruiser,2,UNKN,UNKN,UNKN,1,5,1,UNKN,"As seen on Falchion (prow slot pre-equipped; half ammo, +1 Power).",Core (Table 1-9),
|
||||
Standard Torpedo Tubes (Cruiser Pattern),Torpedo Tubes,Prow,Cruiser/Battlecruiser,6,UNKN,UNKN,UNKN,2,8,2,UNKN,Generic torpedo tube component for cruiser-sized hulls.,Core (Table 1-9),
|
||||
Jovian-pattern Launch Bay,Launch Bay,Port/Starboard,Light Cruiser/Cruiser/Battlecruiser,2,UNKN,UNKN,UNKN,1,6,2,UNKN,"Carrier component for attack craft (Fury/Starhawk wings).",Core (Table 1-9),
|
||||
Nova Cannon,Nova Cannon,Prow,Cruiser/Battlecruiser,SPECIAL,2d5+4,SPECIAL,6–40,3,7,3,UNKN,"Superheavy prow weapon; unique ammo rules.",Core (Table 1-9),check_table
|
||||
Plasma Battery (Cruiser Grade),Plasma Battery,Port/Starboard,Cruiser/Battlecruiser,4,1d10+4,4,5,7,4,2,UNKN,"If present in BFK as a distinct macrobattery type; verify exact name/statline.",Core (Table 8-4),
|
||||
Bombardment Cannons,Macrocannon,Port/Starboard,Light Cruiser/Cruiser,3,1d10+6,2,4,5,5,3,UNKN,Heavy bombardment macrobattery.,Core (Table 1-9),
|
||||
Disruption Macrocannons,Macrocannon,Any,All Ships,3,1d10+1,0,5,4,2,2,UNKN,"Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls.",Core (Table 1-9),
|
||||
Disruption Macrocannon Broadside,Macrocannon,Port/Starboard,Light Cruiser/Cruiser,6,1d10+1,0,5,6,5,2,UNKN,Broadside variant.,Core (Table 1-9),
|
||||
Stygies-pattern Macrocannons,Macrocannon,Any,All Ships,3,1d10+2,5,5,4,3,1,UNKN,"Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls.",Core (Table 1-9),
|
||||
Hecutor-pattern Plasma Battery,Plasma Battery,Port/Starboard,Light Cruiser/Cruiser,3,1d10+2,4,11,8,3,2,UNKN,High-velocity plasma battery.,Core (Table 1-9),
|
||||
Hecutor-pattern Plasma Broadside,Plasma Battery,Port/Starboard,Battlecruiser/Grand Cruiser,5,1d10+2,4,11,12,5,2,UNKN,Heavy plasma broadside.,Core (Table 1-9),
|
||||
|
||||
Godsbane Lance,Lance,Any,Battlecruiser/Grand Cruiser,1,1d10+2,3,12,9,4,3,UNKN,Single long-range lance.,Core (Table 1-9),
|
||||
Godsbane Lance Battery,Lance,Port/Starboard,Battlecruiser/Grand Cruiser,2,1d10+2,3,12,13,6,3,UNKN,Broadside lance battery.,Core (Table 1-9),
|
||||
Las-burner,Lance,Any,All Ships,2,1d5+1,3,3,7,3,2,UNKN,Short-range cutting lance.,Core (Table 1-9),
|
||||
Mezoa Lance Weapon,Lance,Any,All Ships,1,1d10+5,4,4,9,4,3,UNKN,High-output lance emitter.,Core (Table 1-9),
|
||||
Mezoa Lance Battery,Lance,Port/Starboard,Light Cruiser/Cruiser,2,1d10+5,4,4,13,6,3,UNKN,Heavy lance battery.,Core (Table 1-9),
|
||||
Voidsunder Lance Battery,Lance,Port/Starboard,Light Cruiser/Cruiser,1,1d10+4,3,6,15,8,3,UNKN,Shield-piercing lance battery.,Core (Table 1-9),
|
||||
|
||||
Ryza-pattern Nova Cannon,Nova Cannon,Prow,Cruisers,SPECIAL,2d5+5,SPECIAL,6–36,4,7,4,UNKN,"Nova weapon; special blast/aiming rules apply.",Core (Table 1-9),check_table
|
||||
|
||||
Fortis-pattern Torpedo Tubes,Torpedo Tubes,Prow,Light Cruiser/Cruiser,6,UNKN,UNKN,UNKN,2,8,3,UNKN,Standard cruiser/LC torpedo system.,Core (Table 1-9),
|
||||
Gryphonne-pattern Torpedo Tubes,Torpedo Tubes,Prow,Raider/Frigate/Light Cruiser/Cruiser,4,UNKN,UNKN,UNKN,2,6,1,UNKN,Escort-through-cruiser compatible tubes.,Core (Table 1-9),
|
||||
Mars-pattern Torpedo Tubes,Torpedo Tubes,Prow,Light Cruiser/Cruiser,6,UNKN,UNKN,UNKN,2,8,2,UNKN,Standard Navy cruiser torpedo fit.,Core (Table 1-9),
|
||||
|
||||
Hold Landing Bay,Launch Bay,Internal,Transports,2,UNKN,UNKN,UNKN,1,0,2,UNKN,"Cargo-hold conversion; Space shown as 0 for '—' per CSV convention.",Core (Table 1-9),
|
||||
Jovian-pattern Escort Bay,Launch Bay,Port/Starboard,Light Cruiser/Cruiser,1,UNKN,UNKN,UNKN,1,4,1,UNKN,Escort-grade launch bay.,Core (Table 1-9),
|
||||
Lathe-pattern Landing Bay,Launch Bay,Port/Starboard,Cruiser,2,UNKN,UNKN,UNKN,1,5,2,UNKN,Cruiser-grade launch bay (Lathe),Core (Table 1-9),
|
||||
|
||||
Jovian Missile Battery,Macrocannon,Any,All Ships,5,1d10+1,6,6,3,1,1,UNKN,"Missile-based macrobattery; mount varies by hull.",Supplemental Table 4-2,
|
||||
Lathe Grav-culverin Broadside,Macrocannon,Port/Starboard,Light Cruiser/Cruiser,6,1d10+3,6,5,5,5,1,UNKN,High-velocity gravitic broadside.,Supplemental Table 4-2,
|
||||
Mezoa Macrocannons,Macrocannon,Any,All Ships,4,1d10+3,5,5,4,4,1,UNKN,"Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls.",Supplemental Table 4-2,
|
||||
Pyros Melta-cannons,Macrocannon,Any,All Ships,3,1d10+4,4,4,4,3,2,UNKN,Short-range melta macrobattery.,Supplemental Table 4-2,
|
||||
Sunhammer Lance,Lance,Any,All Ships,1,1d10+3,3,9,9,4,2,UNKN,Long-range lance emitter.,Supplemental Table 4-2,
|
||||
Sunhammer Lance Battery,Lance,Port/Starboard,All Ships,2,1d10+3,3,9,13,6,2,UNKN,Long-range lance battery.,Supplemental Table 4-2,
|
||||
Mars-pattern Nova Cannon,Nova Cannon,Prow,Cruisers,SPECIAL,2d5+4,SPECIAL,6–40,3,7,3,UNKN,"Nova weapon; special blast/aiming rules apply.",Core (Table 1-9),check_table
|
||||
Staravar Laser Macrobattery,Macrocannon,Any,All Ships,4,1d10+2,4,12,4,4,2,Extremely Rare,"Archeotech laser macro; mount depends on hull (Dorsal/Port-Starboard).",Table 4-5,
|
||||
Star-flare Lance,Lance,Any,Light Cruiser/Cruiser,3,1d10+3,3,7,12,6,3,Extremely Rare,Archeotech lance emitter.,Table 4-5,
|
||||
|
||||
Jovian-pattern Nova Cannon†,Nova Cannon,Prow,Cruisers,SPECIAL,2d5+7,SPECIAL,6–35,5,7,5,Extremely Rare,"† Special rules for Strength/Crit (see page 16).",Table 1-12,check_table
|
||||
Plasma Accelerated Torpedo Tubes (Archeotech Weapon),Torpedo Tubes,Prow,All Ships,4,UNKN,UNKN,UNKN,1,4,4,Extremely Rare,"Archeotech torpedo mount; torpedo warhead stats handled separately.",Table 1-12,
|
||||
|
@@ -0,0 +1 @@
|
||||
0.2
|
||||
@@ -0,0 +1,118 @@
|
||||
# generate_manifests.py
|
||||
# Fortel Trappa — pełne manifesty ładunkowe (HOLD I/II/III) w ZIP
|
||||
# Uruchom: python generate_manifests.py -> powstaną dwa pliki ZIP w bieżącym katalogu.
|
||||
|
||||
import random, zipfile, datetime
|
||||
|
||||
random.seed(40000) # deterministyczny „smak”
|
||||
|
||||
WORLDS = ["Ostia","Avachrus","Enoch","Gilead Prime","Nethreus","Ryza","Vostroya","Scintilla","Footfall"]
|
||||
INN_NOTES = [
|
||||
"Zwykły wyrób, zgodny z normą diecezjalną.",
|
||||
"Do użytku cywilnego; dokumentacja pełna.",
|
||||
"Na potrzeby konserwacji/edukacji polowej.",
|
||||
"Brak zasilania, brak funkcji specjalnych.",
|
||||
"Wersja eksportowa; gwinty zgodne z PL-3.",
|
||||
"Na morale i porządek; bez cech bojowych.",
|
||||
"Próbki kontrolne — wynik negatywny na scrapcode.",
|
||||
"Rekwizyty katechetyczne; brak statusu kultowego.",
|
||||
"Puste, czyste, opieczętowane.",
|
||||
"Zabezpieczone audytem Ministorum.",
|
||||
"Składane; bez ostrych krawędzi w papierach.",
|
||||
"Zwykła jakość magazynowa; brak niespodzianek.",
|
||||
"Brak reakcji psionicznej (pomiar: tło).",
|
||||
"Standard przemysłowy; kompatybilność wysoka.",
|
||||
"Do ekspozycji; nieotwierane przy inspekcji.",
|
||||
"Zestaw muzealny; kojąco nudny.",
|
||||
"Oznaczenie ‘cywilne’; instrukcja w komplecie.",
|
||||
"Zgodne z przepisem P-77 (ładownie ogólne).",
|
||||
"Pieczęć diecezjalna aktualna; datowanie bieżące.",
|
||||
"Bezpieczne dla chóru i czytników vox."
|
||||
]
|
||||
INN_NAMES = [
|
||||
"Ziarno kultywacyjne ‘Święty Oset’","Mąka ‘Hostia’","Kasza jęczmienna ‘Pielgrzym’","Groch ‘Kocioł’","Fasola ‘Pilgrim’",
|
||||
"Sól żywnościowa","Olej lampowy","Smary maszynowe ‘Stałość’","Farba kadłubowa ‘Mgła’","Pasy mocujące ‘Ordo Cargo’",
|
||||
"Złącza heksowe","Zawory nadciśnieniowe","Łożyska baryłkowe ‘Wytrwałość’","Łożyska kulkowe precyzyjne",
|
||||
"Taśmy stalowe ‘Krzyżowe’","Plandeki światłochłonne ‘Cień’","Pudła ciszy (obudowy wygłuszające)","Lampiony procesyjne",
|
||||
"Witraże polowe (składane)","Zwoje pergaminowe ‘Sztywna Karta’","Maski nabożne ‘Neutral’","Relikwie podręczne (skrzynki)",
|
||||
"Szkatuły dewocyjne (stal miękka)","Szkła ochronne ‘Błękit Służbowy’","Barwniki okienne (błękit/purpura)",
|
||||
"Kity hermetyczne ‘Głuchy Spaw’","Rury segmentowe PL-7","Kable PL-3 ‘Uniwersalne’","Siatki zabezpieczające ‘Drobne Oczko’",
|
||||
"Zasuwy grodziowe PL-10","Zaczepy stalowe ‘Cierpliwość’","Kątowniki ciężkie ‘Prosto’","Nity kadłubowe ‘Amen’",
|
||||
"Skrzynki na dźwięk (wygłuszenie)","Szkła różnobarwne (mix)","Amfory gliniane ‘E-Seria’","Szaty ‘Pokora’ (robocze)",
|
||||
"Kopułki modlitewne (mini)","Płaszcze przeciwdeszczowe ‘Wachta’","Świece czarne ‘Negocjacje’","Świece woskowe ‘Cisza Nocna’",
|
||||
"Zwoje kabli heksowych (ekranowane)","Sprężyny powrotne","Zawiesia wielokrążkowe","Przekaźniki proste ‘Miedź’",
|
||||
"Łożyska stożkowe ‘Kierunek’","Szkatuły na krople (apteczne)","Ołtarze polowe (składane)","Figurki pobożne",
|
||||
"Piety miniaturowe","Popiół posypny (liturgiczny)","Kleje statkowe ‘Głuchy Spaw’","Klemy zasilające ‘Moc’",
|
||||
"Kołnierze izolacyjne PL-5","Beczki puste ‘Gotowość’","Rolki transportowe ‘Gładkie’","Słód jasny ‘Nocny’",
|
||||
"Skrzydła drzwiowe ‘Jedność’","Skarbonki parafialne","Księgi wizualne (albumy)","Zegary harmoniczne (niski ton)",
|
||||
"Baldachimy małe ‘Krem’","Puchar kapłański (rekwizyt)","Księgi zakładkowe","Pasy transmisyjne ‘Ciągłość’",
|
||||
"Pudła akustyczne (puste)","Rękawice robocze ‘Skóra+’",
|
||||
]
|
||||
XENO_REAL = [
|
||||
"fragmenty wraithbone Aeldari (martwe, obrobione ‘na szkło’)",
|
||||
"odpryski spirit-stone (pozbawione ładunku)",
|
||||
"ukryty vox-scrambler xeno (obudowa cywilna)",
|
||||
"mikrofiolki po jadu Lhamaean (dokładnie wyparzone)",
|
||||
"moduł holo-emisyjny Aeldari (matryca wycięta, nieaktywny)",
|
||||
"kaseta rozliczeń cold trade (podwójne dno)",
|
||||
"nekrotech — fragment stele ‘bezcielesnej’ (kamień ‘ozdobny’)",
|
||||
"obudowy tłumiące sygnał (technologia nieidentyfikowana)",
|
||||
"orb psioniczny — tłumik nastroju (źródło Aeldari)",
|
||||
"halo-device: element oprawy (niekompletne, bez rdzenia)",
|
||||
"resztki proscribed tomes (okładki, wkład wymieniony na blanki)",
|
||||
"zegar-pikietaż dla transakcji cold trade (ukryty znacznik czasu)",
|
||||
"ampułki po obscura klasy ceremonialnej (umyte; testy czyste)",
|
||||
"fiolki po ‘ichorze’ drukhari (sterylnie czyste)",
|
||||
"masker polowy Drukhari — tkanina z włóknem ziggurat (zdezaktywowana)",
|
||||
]
|
||||
|
||||
def inn_note(): return random.choice(INN_NOTES)
|
||||
def name(): return random.choice(INN_NAMES)
|
||||
def world(): return random.choice(WORLDS)
|
||||
def qty(): return random.randint(1, 8)
|
||||
|
||||
def make_line(idx, suspicious_ratio=0.34):
|
||||
q = qty(); nm = name(); ow = world(); note = inn_note()
|
||||
if random.random() < suspicious_ratio:
|
||||
paren = f"({random.choice(XENO_REAL)})"
|
||||
else:
|
||||
paren = f"({random.choice(['zwykły ładunek cywilny','materiały szkoleniowe/rekonstrukcja','zestaw konserwatorski','komplet części serwisowych','puste i czyste','standard magazynowy','produkt spożywczy','wyposażenie pomocnicze','materiały dekoracyjne','narzędzia warsztatowe'])})"
|
||||
return f"{idx}) {q}× — {nm} — {ow} — [{note}] {paren}", q
|
||||
|
||||
def make_section_text(hold_label, s_idx, s_cnt):
|
||||
header = f"=== FORTEL TRAPPA — MANIFEST ŁADUNKOWY ===\n{hold_label} / SEKCJA {s_idx} z {s_cnt}\n(Format: [Liczba 1–10] × Standardowy Imperialny Kontener — Nazwa — Pochodzenie — [Uwaga kapitańska] (co to naprawdę jest))\n\n"
|
||||
total = 0; entries = []
|
||||
for i in range(1, 124):
|
||||
line, q = make_line(i, suspicious_ratio=0.34)
|
||||
entries.append([line, q]); total += q
|
||||
if total > 1000:
|
||||
excess = total - 1000
|
||||
for i in range(len(entries)-1, -1, -1):
|
||||
if excess <= 0: break
|
||||
q = entries[i][1]
|
||||
if q > 1:
|
||||
red = min(q-1, excess); entries[i][1] -= red; excess -= red
|
||||
prefix, rest = entries[i][0].split("× —", 1)
|
||||
idx_str = prefix.split(")")[0] + ")"
|
||||
entries[i][0] = f"{idx_str} {entries[i][1]}× —{rest}"
|
||||
body = "\n".join(e[0] for e in entries)
|
||||
footer = f"\n\n— KONIEC: {hold_label} / SEKCJA {s_idx}/{s_cnt} —"
|
||||
return header + body + footer
|
||||
|
||||
def write_full_zip(path_full, path_hold1):
|
||||
with zipfile.ZipFile(path_full, "w", compression=zipfile.ZIP_DEFLATED) as z:
|
||||
for s in range(4, 17): # HOLD I 04–16
|
||||
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
|
||||
for s in range(1, 16): # HOLD II 01–15
|
||||
z.writestr(f"HOLD_II_SEKCJA_{s:02d}.txt", make_section_text("HOLD II", s, 15))
|
||||
for s in range(1, 16): # HOLD III 01–15
|
||||
z.writestr(f"HOLD_III_SEKCJA_{s:02d}.txt", make_section_text("HOLD III", s, 15))
|
||||
z.writestr("README.txt", f"FORTEL TRAPPA — MANIFESTY ({datetime.datetime.utcnow().isoformat()}Z)\nHOLD I: 04–16; HOLD II: 01–15; HOLD III: 01–15\n~1/3 pozycji w ( ) ma real-tożsamość (xeno/kontrabanda), [ ] — noty ‘urzędowo niewinne’.\n")
|
||||
with zipfile.ZipFile(path_hold1, "w", compression=zipfile.ZIP_DEFLATED) as z:
|
||||
for s in range(4, 17):
|
||||
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
|
||||
z.writestr("README_HOLD_I.txt", f"HOLD I (04–16) — {datetime.datetime.utcnow().isoformat()}Z\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
write_full_zip("FORTEL_HOLD_I_II_III_MANIFESTS.zip", "FORTEL_HOLD_I_SEKCJE_04-16.zip")
|
||||
print("OK: FORTEL_HOLD_I_II_III_MANIFESTS.zip | FORTEL_HOLD_I_SEKCJE_04-16.zip")
|
||||
@@ -0,0 +1,182 @@
|
||||
# generate_manifests_v2.py
|
||||
# Fortel Trappa — manifesty o wysokiej różnorodności (HOLD I/II/III) w dwóch ZIP-ach.
|
||||
# Uruchom: python generate_manifests_v2.py
|
||||
# Wynik: FORTEL_MANIFESTS_v2_FULL.zip oraz FORTEL_MANIFESTS_v2_HOLD_I.zip
|
||||
|
||||
import random, zipfile, datetime
|
||||
|
||||
# ===== USTAWIENIA =====
|
||||
SEED = None # ustaw np. na liczbę, jeśli chcesz powtarzalny wynik
|
||||
SUSP_RATIO = 0.34 # ~1/3 pozycji ma „prawdę” w ( ) o xeno/kontrabandzie
|
||||
QTY_MIN, QTY_MAX = 1, 10
|
||||
LINES_PER_SECTION = 123
|
||||
CAP_PER_SECTION = 1000
|
||||
|
||||
if SEED is None:
|
||||
random.seed() # świeża losowość
|
||||
else:
|
||||
random.seed(SEED)
|
||||
|
||||
# ===== PULI I KOMPONENTY NAZW =====
|
||||
WORLDS = [
|
||||
"Ostia","Avachrus","Enoch","Gilead Prime","Nethreus","Ryza","Vostroya","Scintilla","Footfall",
|
||||
"Hydraphur","Malfi","Port Wander","Voss Prime","Lucius","Graia","Metalica","Sollex","Sibellus"
|
||||
]
|
||||
|
||||
FOODS = [
|
||||
"Ziarno kultywacyjne","Pszenica","Owies","Jęczmień","Mąka","Kasza jęczmienna","Kasza owsiana",
|
||||
"Groch","Fasola","Ciecierzyca","Słód jasny","Słód ciemny","Suszone jarzyny","Sól żywnościowa","Olej lampowy"
|
||||
]
|
||||
INDUSTRY = [
|
||||
"Złącza heksowe","Zawory nadciśnieniowe","Łożyska baryłkowe","Łożyska kulkowe","Łożyska stożkowe",
|
||||
"Taśmy stalowe","Plandeki światłochłonne","Pudła ciszy (wygłuszenie)","Rury segmentowe PL","Kable PL",
|
||||
"Siatki zabezpieczające","Zasuwy grodziowe","Zaczepy stalowe","Kątowniki ciężkie","Nity kadłubowe",
|
||||
"Skrzynki na dźwięk (wygłuszenie)","Filtry rebreatherów","Transpondery nawigacyjne","Przekaźniki proste",
|
||||
"Zawiesia wielokrążkowe","Sprężyny powrotne","Kołnierze izolacyjne","Kleje statkowe","Klemy zasilające",
|
||||
"Rolki transportowe","Farba kadłubowa","Żywica naprawcza","Kity hermetyczne","Szkła ochronne",
|
||||
"Panele grodziowe","Uszczelki retencyjne","Siłowniki serwo (obudowy)"
|
||||
]
|
||||
DEVOTION = [
|
||||
"Lampiony procesyjne","Witraże polowe (składane)","Zwoje pergaminowe","Maski nabożne",
|
||||
"Relikwie podręczne (skrzynki)","Szkatuły dewocyjne (stal miękka)","Amfory gliniane",
|
||||
"Szaty ‘Pokora’ (robocze)","Kopułki modlitewne (mini)","Płaszcze ‘Wachta’",
|
||||
"Świece czarne ‘Negocjacje’","Świece woskowe ‘Cisza Nocna’","Figurki pobożne",
|
||||
"Piety miniaturowe","Popiół posypny (liturgiczny)","Ołtarze polowe (składane)",
|
||||
"Skarbonki parafialne","Księgi wizualne (albumy)","Księgi zakładkowe",
|
||||
"Ikony ścienne (odlewy)","Reliefy miedziane","Baldachimy ‘Krem’","Puchary kapłańskie (rekwizyt)"
|
||||
]
|
||||
|
||||
ADJ = [
|
||||
"‘Hostia’","‘Pielgrzym’","‘Kocioł’","‘Pilgrim’","‘Stałość’","‘Ordo Cargo’","‘Mgła’","‘Cień’",
|
||||
"‘Błękit Służbowy’","‘Sztywna Karta’","‘Jedność’","‘Głuchy Spaw’","‘Kierunek’","‘Gotowość’","‘Neutral’",
|
||||
"‘Mk II’","‘Mk III’","‘Mk IV’","‘Mk V’","‘Plus’","‘Premium’","‘Export’","‘Seria V’","‘Seria IX’","‘Nocny’"
|
||||
]
|
||||
|
||||
INN_NOTES = [
|
||||
"Zwykły wyrób, zgodny z normą diecezjalną.",
|
||||
"Do użytku cywilnego; dokumentacja pełna.",
|
||||
"Na potrzeby konserwacji/edukacji polowej.",
|
||||
"Brak zasilania, brak funkcji specjalnych.",
|
||||
"Wersja eksportowa; gwinty zgodne z PL-3.",
|
||||
"Na morale i porządek; bez cech bojowych.",
|
||||
"Próbki kontrolne — wynik negatywny na scrapcode.",
|
||||
"Rekwizyty katechetyczne; brak statusu kultowego.",
|
||||
"Puste, czyste, opieczętowane.",
|
||||
"Zabezpieczone audytem Ministorum.",
|
||||
"Składane; bez ostrych krawędzi w papierach.",
|
||||
"Zwykła jakość magazynowa; brak niespodzianek.",
|
||||
"Brak reakcji psionicznej (pomiar: tło).",
|
||||
"Standard przemysłowy; kompatybilność wysoka.",
|
||||
"Do ekspozycji; nieotwierane przy inspekcji.",
|
||||
"Zestaw muzealny; kojąco nudny.",
|
||||
"Oznaczenie ‘cywilne’; instrukcja w komplecie.",
|
||||
"Zgodne z przepisem P-77 (ładownie ogólne).",
|
||||
"Pieczęć diecezjalna aktualna; datowanie bieżące.",
|
||||
"Bezpieczne dla chóru i czytników vox."
|
||||
]
|
||||
|
||||
HARMLESS = [
|
||||
"zwykły ładunek cywilny","materiały szkoleniowe/rekonstrukcja","zestaw konserwatorski",
|
||||
"komplet części serwisowych","puste i czyste","standard magazynowy","produkt spożywczy",
|
||||
"wyposażenie pomocnicze","materiały dekoracyjne","narzędzia warsztatowe"
|
||||
]
|
||||
|
||||
XENO_REAL = [
|
||||
"fragmenty wraithbone Aeldari (martwe, obrobione ‘na szkło’)",
|
||||
"odpryski spirit-stone (pozbawione ładunku)",
|
||||
"ukryty vox-scrambler xeno (obudowa cywilna)",
|
||||
"mikrofiolki po jadu Lhamaean (dokładnie wyparzone)",
|
||||
"moduł holo-emisyjny Aeldari (matryca wycięta, nieaktywny)",
|
||||
"kaseta rozliczeń cold trade (podwójne dno)",
|
||||
"nekrotech — fragment stele ‘bezcielesnej’ (kamień ‘ozdobny’)",
|
||||
"obudowy tłumiące sygnał (technologia nieidentyfikowana)",
|
||||
"orb psioniczny — tłumik nastroju (źródło Aeldari)",
|
||||
"halo-device: element oprawy (niekompletne, bez rdzenia)",
|
||||
"resztki proscribed tomes (okładki, wkład wymieniony na blanki)",
|
||||
"zegar-pikietaż dla transakcji cold trade (ukryty znacznik czasu)",
|
||||
"ampułki po obscura klasy ceremonialnej (umyte; testy czyste)",
|
||||
"fiolki po ‘ichorze’ drukhari (sterylnie czyste)",
|
||||
"masker polowy Drukhari — tkanina z włóknem ziggurat (zdezaktywowana)",
|
||||
"matryca soniczna Laer (obudowana ‘pudłem ciszy’)",
|
||||
"półprzezroczysta łuska necron — fragment dekoracyjny (brak reakcji)",
|
||||
]
|
||||
|
||||
def compose_name():
|
||||
# wybór kategorii z wagami
|
||||
genre = random.choices(["food","industry","devotion"], [4,5,3])[0]
|
||||
base = random.choice({"food":FOODS, "industry":INDUSTRY, "devotion":DEVOTION}[genre])
|
||||
# modyfikacje wersji/serii
|
||||
if "PL" in base:
|
||||
base = base.replace("PL", f"PL-{random.randint(3,12)}")
|
||||
if "Kable PL" in base and random.random()<0.7:
|
||||
base = base.replace("Kable PL", f"Kable PL-{random.randint(2,8)}")
|
||||
flair=[]
|
||||
if random.random()<0.7: flair.append(random.choice(ADJ))
|
||||
if random.random()<0.25: flair.append(f"‘Seria {random.randint(2,12)}’")
|
||||
return base if not flair else f"{base} " + " ".join(flair)
|
||||
|
||||
def make_line(idx, suspicious_ratio=SUSP_RATIO):
|
||||
q = random.randint(QTY_MIN, QTY_MAX)
|
||||
nm = compose_name()
|
||||
ow = random.choice(WORLDS)
|
||||
note = random.choice(INN_NOTES)
|
||||
paren = f"({random.choice(XENO_REAL)})" if random.random()<suspicious_ratio else f"({random.choice(HARMLESS)})"
|
||||
return f"{idx}) {q}× — {nm} — {ow} — [{note}] {paren}", q
|
||||
|
||||
def make_section_text(hold_label, s_idx, s_cnt):
|
||||
header = (
|
||||
"=== FORTEL TRAPPA — MANIFEST ŁADUNKOWY ===\n"
|
||||
f"{hold_label} / SEKCJA {s_idx} z {s_cnt}\n"
|
||||
"(Format: [Liczba 1–10] × Standardowy Imperialny Kontener — Nazwa — Pochodzenie — [Uwaga kapitańska] (co to naprawdę jest))\n\n"
|
||||
)
|
||||
total=0; entries=[]
|
||||
# ogranicz powtórzenia nazw w obrębie sekcji
|
||||
seen=set()
|
||||
for i in range(1, LINES_PER_SECTION+1):
|
||||
tries=0
|
||||
while True:
|
||||
line,q = make_line(i)
|
||||
name_part = line.split("—")[1].strip() # „N× — NAZWA — ...”
|
||||
if name_part not in seen or tries>7:
|
||||
seen.add(name_part)
|
||||
break
|
||||
tries+=1
|
||||
entries.append([line,q]); total+=q
|
||||
# przytnij sumę kontenerów do CAP_PER_SECTION
|
||||
if total>CAP_PER_SECTION:
|
||||
excess=total-CAP_PER_SECTION
|
||||
for i in range(len(entries)-1,-1,-1):
|
||||
if excess<=0: break
|
||||
q=entries[i][1]
|
||||
if q>1:
|
||||
red=min(q-1,excess); entries[i][1]-=red; excess-=red
|
||||
prefix,rest=entries[i][0].split("× —",1)
|
||||
idx_str=prefix.split(")")[0]+")"
|
||||
entries[i][0]=f"{idx_str} {entries[i][1]}× —{rest}"
|
||||
body="\n".join(e[0] for e in entries)
|
||||
footer=f"\n\n— KONIEC: {hold_label} / SEKCJA {s_idx}/{s_cnt} —"
|
||||
return header+body+footer
|
||||
|
||||
def build_zip(full_path, hold1_path):
|
||||
# FULL: HOLD I 04–16; HOLD II 01–15; HOLD III 01–15
|
||||
with zipfile.ZipFile(full_path,"w",compression=zipfile.ZIP_DEFLATED) as z:
|
||||
for s in range(4,17): # HOLD I
|
||||
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
|
||||
for s in range(1,16): # HOLD II
|
||||
z.writestr(f"HOLD_II_SEKCJA_{s:02d}.txt", make_section_text("HOLD II", s, 15))
|
||||
for s in range(1,16): # HOLD III
|
||||
z.writestr(f"HOLD_III_SEKCJA_{s:02d}.txt", make_section_text("HOLD III", s, 15))
|
||||
z.writestr("README.txt",
|
||||
f"FORTEL TRAPPA — MANIFESTY v2 ({datetime.datetime.utcnow().isoformat()}Z)\n"
|
||||
"HOLD I: 04–16; HOLD II: 01–15; HOLD III: 01–15\n"
|
||||
f"~{int(SUSP_RATIO*100)}% pozycji w ( ) ujawnia real-tożsamość (xeno/kontrabanda); [ ] — noty urzędowo niewinne.\n"
|
||||
"123 pozycji/sekcję; 1–10 kontenerów/pozycję; suma ≤1000/sekcję.\n")
|
||||
# HOLD I only
|
||||
with zipfile.ZipFile(hold1_path,"w",compression=zipfile.ZIP_DEFLATED) as z:
|
||||
for s in range(4,17):
|
||||
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
|
||||
z.writestr("README_HOLD_I.txt", f"HOLD I (04–16) v2 — {datetime.datetime.utcnow().isoformat()}Z\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
build_zip("FORTEL_MANIFESTS_v2_FULL.zip","FORTEL_MANIFESTS_v2_HOLD_I.zip")
|
||||
print("OK -> FORTEL_MANIFESTS_v2_FULL.zip | FORTEL_MANIFESTS_v2_HOLD_I.zip")
|
||||
@@ -0,0 +1,356 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
manage_releases.py
|
||||
|
||||
Automates synchronization of Git tags with GitHub releases. On each run it:
|
||||
* Verifies the repository is clean and the current branch is fully pushed.
|
||||
* Ensures HEAD is tagged by comparing the root version.nfo with existing
|
||||
release tags and bumping/committing when required.
|
||||
* Iterates over every tag in the repository, creating GitHub releases for any
|
||||
missing entries and attaching per-directory ZIP archives (excluding
|
||||
version.nfo files) that reflect the repository state for that tag.
|
||||
|
||||
Dependencies:
|
||||
- gh CLI (https://cli.github.com/)
|
||||
- git available in PATH
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import io
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import tarfile
|
||||
import tempfile
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
from typing import Dict, Iterable, List, Optional, Sequence, Tuple
|
||||
from zipfile import ZIP_DEFLATED, ZipFile
|
||||
|
||||
|
||||
def sh(args: Sequence[str], cwd: Path, check: bool = True) -> subprocess.CompletedProcess[str]:
|
||||
"""Run a subprocess and return the completed process."""
|
||||
result = subprocess.run(
|
||||
list(args),
|
||||
cwd=str(cwd),
|
||||
text=True,
|
||||
capture_output=True,
|
||||
)
|
||||
if check and result.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"Command failed ({' '.join(args)}):\n"
|
||||
f"{result.stdout}{result.stderr}"
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(description="Synchronize Git tags with GitHub releases.")
|
||||
parser.add_argument(
|
||||
"--repo",
|
||||
default=".",
|
||||
help="Ścieżka do repozytorium git (domyślnie: bieżący katalog).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--remote",
|
||||
default="origin",
|
||||
help="Nazwa zdalnego repozytorium do pushowania commitów oraz tagów (domyślnie: origin).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output-dir",
|
||||
default="Release packs",
|
||||
help="Katalog wyjściowy, w którym powstaną ZIP-y uploadowane do release (domyślnie: 'Release packs').",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--notes-template",
|
||||
default="Automated release for {tag}",
|
||||
help="Szablon notatek release (dostępne pola: {tag}).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--dry-run",
|
||||
action="store_true",
|
||||
help="Tylko plan – bez commitów, tagowania i publikacji release.",
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def read_text_if_exists(path: Path) -> Optional[str]:
|
||||
if not path.is_file():
|
||||
return None
|
||||
return path.read_text(encoding="utf-8").strip()
|
||||
|
||||
|
||||
def parse_version(version: str) -> Optional[Tuple[int, ...]]:
|
||||
if not version:
|
||||
return None
|
||||
if not re.fullmatch(r"\d+(?:\.\d+)*", version):
|
||||
return None
|
||||
return tuple(int(part) for part in version.split("."))
|
||||
|
||||
|
||||
def bump_version(version: str) -> str:
|
||||
parts = parse_version(version)
|
||||
if parts is None:
|
||||
# fallback: append .1 to non-numeric strings
|
||||
return f"{version}.1"
|
||||
bumped = list(parts)
|
||||
bumped[-1] += 1
|
||||
return ".".join(str(piece) for piece in bumped)
|
||||
|
||||
|
||||
def sanitize_component(value: str) -> str:
|
||||
value = value.strip()
|
||||
if not value:
|
||||
return "unknown"
|
||||
return re.sub(r"[\\s/\\\\]+", "-", value)
|
||||
|
||||
|
||||
class ReleaseManager:
|
||||
def __init__(self, args: argparse.Namespace):
|
||||
self.args = args
|
||||
self.repo = Path(args.repo).resolve()
|
||||
self.output_dir = (self.repo / args.output_dir).resolve()
|
||||
|
||||
# ------------------------------------------------------------------ helpers
|
||||
def git(self, *args: str, check: bool = True) -> subprocess.CompletedProcess[str]:
|
||||
return sh(args, cwd=self.repo, check=check)
|
||||
|
||||
def ensure_tooling(self) -> None:
|
||||
sh(["gh", "--version"], cwd=self.repo, check=True)
|
||||
|
||||
def ensure_repo(self) -> None:
|
||||
if not (self.repo / ".git").exists():
|
||||
raise RuntimeError(f"{self.repo} nie jest repozytorium git.")
|
||||
|
||||
def ensure_clean_state(self) -> None:
|
||||
status = self.git("git", "status", "--porcelain", check=True).stdout.strip()
|
||||
if status:
|
||||
raise RuntimeError(
|
||||
"Wykryto niezakomitowane zmiany. Ukończ commit lub stash przed publikacją release.\n"
|
||||
"Release podpisany z nieczystego drzewa może wymagać resetu HEAD do taga."
|
||||
)
|
||||
|
||||
upstream = self.git("git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}", check=False)
|
||||
if upstream.returncode != 0:
|
||||
raise RuntimeError(
|
||||
"Brak skonfigurowanego upstreamu dla bieżącej gałęzi – nie można zweryfikować, "
|
||||
"czy wszystkie commity zostały wypchnięte."
|
||||
)
|
||||
ahead = self.git("git", "rev-list", "--count", "@{u}..HEAD", check=True).stdout.strip()
|
||||
if ahead and int(ahead) > 0:
|
||||
raise RuntimeError(
|
||||
"Bieżąca gałąź zawiera niewypchnięte commity. Wypchnij zmiany zanim utworzysz release."
|
||||
)
|
||||
|
||||
def get_head_tag(self) -> Optional[str]:
|
||||
result = self.git("git", "describe", "--tags", "--exact-match", "HEAD", check=False)
|
||||
tag = result.stdout.strip()
|
||||
if result.returncode == 0 and tag:
|
||||
return tag
|
||||
return None
|
||||
|
||||
def list_tags(self) -> List[str]:
|
||||
tags = self.git("git", "tag", "--sort=creatordate", check=True).stdout.splitlines()
|
||||
return [tag.strip() for tag in tags if tag.strip()]
|
||||
|
||||
def list_version_tags(self) -> List[str]:
|
||||
tags = []
|
||||
for tag in self.list_tags():
|
||||
if parse_version(tag):
|
||||
tags.append(tag)
|
||||
return tags
|
||||
|
||||
def read_root_version(self) -> Optional[str]:
|
||||
return read_text_if_exists(self.repo / "version.nfo")
|
||||
|
||||
def write_root_version(self, version: str) -> None:
|
||||
target = self.repo / "version.nfo"
|
||||
target.write_text(f"{version}\n", encoding="utf-8")
|
||||
|
||||
def commit_root_version(self, version: str) -> None:
|
||||
if self.args.dry_run:
|
||||
print(f"[DRY-RUN] git add version.nfo && git commit -m 'release: bump root to v{version}'")
|
||||
return
|
||||
self.write_root_version(version)
|
||||
self.git("git", "add", "version.nfo", check=True)
|
||||
self.git("git", "commit", "-m", f"release: bump root to v{version}", check=True)
|
||||
self.git("git", "push", self.args.remote, check=True)
|
||||
|
||||
def tag_exists(self, tag: str) -> bool:
|
||||
result = self.git("git", "rev-parse", "-q", "--verify", f"refs/tags/{tag}", check=False)
|
||||
return result.returncode == 0
|
||||
|
||||
def create_tag(self, tag: str, message: str) -> None:
|
||||
if self.tag_exists(tag):
|
||||
print(f"[INFO] Tag {tag} już istnieje – pomijam tworzenie.")
|
||||
return
|
||||
if self.args.dry_run:
|
||||
print(f"[DRY-RUN] git tag -a {tag} -m \"{message}\"")
|
||||
return
|
||||
self.git("git", "tag", "-a", tag, "-m", message, check=True)
|
||||
self.git("git", "push", self.args.remote, tag, check=True)
|
||||
|
||||
def ensure_head_tagged(self) -> str:
|
||||
head_tag = self.get_head_tag()
|
||||
if head_tag:
|
||||
return head_tag
|
||||
|
||||
root_version = self.read_root_version()
|
||||
root_tuple = parse_version(root_version) if root_version else None
|
||||
|
||||
version_tags = self.list_version_tags()
|
||||
latest_version = version_tags[-1] if version_tags else None
|
||||
latest_tuple = parse_version(latest_version) if latest_version else None
|
||||
|
||||
if root_version and (root_tuple and (latest_tuple is None or root_tuple > latest_tuple)):
|
||||
new_version = root_version
|
||||
else:
|
||||
base_version = latest_version or root_version or "0.0"
|
||||
new_version = bump_version(base_version)
|
||||
if not self.args.dry_run:
|
||||
print(f"[INFO] Bump root version.nfo -> {new_version}")
|
||||
self.commit_root_version(new_version)
|
||||
|
||||
tag_message = f"release {new_version}"
|
||||
self.create_tag(new_version, tag_message)
|
||||
return new_version
|
||||
|
||||
def gather_directories_for_tag(self, tag: str) -> List[str]:
|
||||
result = self.git("git", "ls-tree", "-d", "--name-only", tag, check=True)
|
||||
candidates = []
|
||||
for line in result.stdout.splitlines():
|
||||
name = line.strip()
|
||||
if not name:
|
||||
continue
|
||||
candidates.append(name)
|
||||
return candidates
|
||||
|
||||
def version_for_directory(self, tag: str, directory: str) -> str:
|
||||
show = self.git("git", "show", f"{tag}:{directory}/version.nfo", check=False)
|
||||
if show.returncode == 0:
|
||||
version = show.stdout.strip()
|
||||
if version:
|
||||
return version
|
||||
return tag
|
||||
|
||||
def build_assets_for_tag(self, tag: str) -> List[Path]:
|
||||
assets: List[Path] = []
|
||||
directories = self.gather_directories_for_tag(tag)
|
||||
if not directories:
|
||||
print(f"[WARN] Tag {tag} nie zawiera katalogów do zzipowania.")
|
||||
return assets
|
||||
|
||||
tag_output_dir = self.output_dir / sanitize_component(tag)
|
||||
if not self.args.dry_run:
|
||||
if tag_output_dir.exists():
|
||||
shutil.rmtree(tag_output_dir)
|
||||
tag_output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
for directory in directories:
|
||||
version = self.version_for_directory(tag, directory)
|
||||
safe_version = sanitize_component(version)
|
||||
safe_dir = sanitize_component(directory)
|
||||
zip_name = f"{safe_dir}-v{safe_version}.zip"
|
||||
zip_path = tag_output_dir / zip_name
|
||||
|
||||
if self.args.dry_run:
|
||||
print(f"[DRY-RUN] Przygotuj ZIP {zip_path} z taga {tag}:{directory} (pomijając version.nfo)")
|
||||
assets.append(zip_path)
|
||||
continue
|
||||
|
||||
# Re-run capturing binary properly.
|
||||
archive_proc = subprocess.run(
|
||||
["git", "archive", "--format=tar", tag, directory],
|
||||
cwd=str(self.repo),
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
)
|
||||
if archive_proc.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"git archive nie powiódł się dla {tag}:{directory}:\n"
|
||||
f"{archive_proc.stderr.decode('utf-8', errors='ignore')}"
|
||||
)
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
tmp_path = Path(tmp_dir)
|
||||
with tarfile.open(fileobj=io.BytesIO(archive_proc.stdout)) as tar:
|
||||
tar.extractall(tmp_path)
|
||||
|
||||
extracted_root = tmp_path / directory
|
||||
for extra in extracted_root.rglob("version.nfo"):
|
||||
if extra.is_file():
|
||||
extra.unlink()
|
||||
|
||||
with ZipFile(zip_path, "w", ZIP_DEFLATED) as zipf:
|
||||
for root, _, files in os.walk(extracted_root):
|
||||
for filename in files:
|
||||
file_path = Path(root) / filename
|
||||
rel_path = file_path.relative_to(tmp_path)
|
||||
zipf.write(file_path, rel_path.as_posix())
|
||||
|
||||
assets.append(zip_path)
|
||||
|
||||
return assets
|
||||
|
||||
def release_exists(self, tag: str) -> bool:
|
||||
result = self.git("gh", "release", "view", tag, check=False)
|
||||
return result.returncode == 0
|
||||
|
||||
def create_release(self, tag: str, assets: List[Path]) -> None:
|
||||
notes = self.args.notes_template.format(tag=tag)
|
||||
wrapped = "\n".join(textwrap.wrap(notes, width=100))
|
||||
|
||||
if self.args.dry_run:
|
||||
print(f"[DRY-RUN] gh release create {tag} {' '.join(str(a) for a in assets)}")
|
||||
print(f"[DRY-RUN] Notatki:\n{wrapped}")
|
||||
return
|
||||
|
||||
cmd = ["gh", "release", "create", tag, "--title", tag, "--notes", wrapped]
|
||||
cmd.extend(str(asset) for asset in assets)
|
||||
result = self.git(*cmd, check=False)
|
||||
if result.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"Nie udało się utworzyć release {tag}:\n{result.stdout}{result.stderr}"
|
||||
)
|
||||
|
||||
def sync_releases(self) -> None:
|
||||
tags = self.list_tags()
|
||||
if not tags:
|
||||
print("[INFO] Brak tagów do synchronizacji.")
|
||||
return
|
||||
|
||||
self.output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
for tag in tags:
|
||||
if self.release_exists(tag):
|
||||
print(f"[INFO] Release {tag} już istnieje – pomijam.")
|
||||
continue
|
||||
print(f"[INFO] Przygotowuję release dla taga {tag}...")
|
||||
assets = self.build_assets_for_tag(tag)
|
||||
self.create_release(tag, assets)
|
||||
|
||||
def run(self) -> None:
|
||||
self.ensure_repo()
|
||||
self.ensure_tooling()
|
||||
self.ensure_clean_state()
|
||||
self.ensure_head_tagged()
|
||||
self.sync_releases()
|
||||
|
||||
|
||||
def main() -> int:
|
||||
args = parse_args()
|
||||
manager = ReleaseManager(args)
|
||||
try:
|
||||
manager.run()
|
||||
except RuntimeError as exc:
|
||||
print(f"[BŁĄD] {exc}")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,234 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Patchuje:
|
||||
1) wg-voidship-hulls.db -> base.power = 0 (dla wszystkich kadłubów)
|
||||
2) wg-voidship-items.db -> reaktory: use.power=0, mods.power wg subtype;
|
||||
aux-plasma: use.power=0;
|
||||
dopisuje 4 reaktory jeśli brak.
|
||||
Uruchom w katalogu z plikami .db
|
||||
"""
|
||||
|
||||
import json, shutil
|
||||
from pathlib import Path
|
||||
|
||||
HULLS_FN = Path("wg-voidship-hulls.db")
|
||||
ITEMS_FN = Path("wg-voidship-items.db")
|
||||
|
||||
REACTOR_POWER_BY_SUBTYPE = {
|
||||
"escort": 40,
|
||||
"frigate": 45,
|
||||
"light-cruiser": 55,
|
||||
"cruiser": 60,
|
||||
}
|
||||
|
||||
# 4 reaktory „wzorcowe” do dopisania, jeśli brak:
|
||||
REACTOR_TEMPLATES = [
|
||||
{
|
||||
"_id": "ITEMREACTCRU0001",
|
||||
"name": "Plasma Reactor (Cruiser) — Mars-Pattern",
|
||||
"type": "gear",
|
||||
"img": "icons/svg/energy.svg",
|
||||
"flags": {
|
||||
"wg-voidships-builder": {
|
||||
"voidOnly": True,
|
||||
"component": {"kind": "reactor", "subtype": "cruiser", "tags": ["reactor", "plasma"]}
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"description": "Standardowy reaktor plazmowy klasy krążownik (Mars-Pattern). Generuje moc dla wszystkich systemów okrętu.",
|
||||
"voidship": {
|
||||
"slot": "Internal",
|
||||
"use": {"space": 20, "power": 0},
|
||||
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 60}
|
||||
}
|
||||
},
|
||||
"effects": []
|
||||
},
|
||||
{
|
||||
"_id": "ITEMREACTLCR0001",
|
||||
"name": "Plasma Reactor (Light Cruiser) — Mars-Pattern",
|
||||
"type": "gear",
|
||||
"img": "icons/svg/energy.svg",
|
||||
"flags": {
|
||||
"wg-voidships-builder": {
|
||||
"voidOnly": True,
|
||||
"component": {"kind": "reactor", "subtype": "light-cruiser", "tags": ["reactor", "plasma"]}
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"description": "Reaktor plazmowy dla lekkich krążowników (Mars-Pattern).",
|
||||
"voidship": {
|
||||
"slot": "Internal",
|
||||
"use": {"space": 18, "power": 0},
|
||||
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 55}
|
||||
}
|
||||
},
|
||||
"effects": []
|
||||
},
|
||||
{
|
||||
"_id": "ITEMREACTFRI0001",
|
||||
"name": "Plasma Reactor (Frigate) — Jovian-Pattern",
|
||||
"type": "gear",
|
||||
"img": "icons/svg/energy.svg",
|
||||
"flags": {
|
||||
"wg-voidships-builder": {
|
||||
"voidOnly": True,
|
||||
"component": {"kind": "reactor", "subtype": "frigate", "tags": ["reactor", "plasma"]}
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"description": "Reaktor plazmowy okrętów klasy fregata (Jovian-Pattern).",
|
||||
"voidship": {
|
||||
"slot": "Internal",
|
||||
"use": {"space": 15, "power": 0},
|
||||
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 45}
|
||||
}
|
||||
},
|
||||
"effects": []
|
||||
},
|
||||
{
|
||||
"_id": "ITEMREACTESC0001",
|
||||
"name": "Plasma Reactor (Escort) — Jovian-Pattern",
|
||||
"type": "gear",
|
||||
"img": "icons/svg/energy.svg",
|
||||
"flags": {
|
||||
"wg-voidships-builder": {
|
||||
"voidOnly": True,
|
||||
"component": {"kind": "reactor", "subtype": "escort", "tags": ["reactor", "plasma"]}
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"description": "Lżejszy reaktor plazmowy dla eskort.",
|
||||
"voidship": {
|
||||
"slot": "Internal",
|
||||
"use": {"space": 12, "power": 0},
|
||||
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 40}
|
||||
}
|
||||
},
|
||||
"effects": []
|
||||
},
|
||||
]
|
||||
|
||||
def read_ndjson(path: Path):
|
||||
if not path.exists():
|
||||
print(f"[WARN] Brak pliku: {path.name}")
|
||||
return []
|
||||
rows = []
|
||||
with path.open("r", encoding="utf-8") as f:
|
||||
for i, line in enumerate(f, 1):
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
try:
|
||||
rows.append(json.loads(line))
|
||||
except Exception as e:
|
||||
print(f"[WARN] {path.name}:{i}: nie mogę zdekodować JSON: {e}")
|
||||
return rows
|
||||
|
||||
def write_ndjson(path: Path, rows):
|
||||
tmp = path.with_suffix(path.suffix + ".patched")
|
||||
with tmp.open("w", encoding="utf-8") as f:
|
||||
for obj in rows:
|
||||
f.write(json.dumps(obj, ensure_ascii=False, separators=(",", ":")) + "\n")
|
||||
tmp.replace(path)
|
||||
|
||||
def ensure_backup(path: Path):
|
||||
bak = path.with_suffix(path.suffix + ".bak")
|
||||
if path.exists() and not bak.exists():
|
||||
shutil.copy2(path, bak)
|
||||
print(f"[OK] Backup -> {bak.name}")
|
||||
|
||||
def patch_hulls():
|
||||
if not HULLS_FN.exists():
|
||||
print(f"[INFO] Pomijam hulls (brak {HULLS_FN.name})")
|
||||
return
|
||||
ensure_backup(HULLS_FN)
|
||||
rows = read_ndjson(HULLS_FN)
|
||||
patched = 0
|
||||
for o in rows:
|
||||
flags = o.setdefault("flags", {}).setdefault("wg-voidships-builder", {})
|
||||
base = flags.setdefault("base", {})
|
||||
if base.get("power", None) != 0:
|
||||
base["power"] = 0
|
||||
patched += 1
|
||||
write_ndjson(HULLS_FN, rows)
|
||||
print(f"[OK] Hulls: ustawiono base.power=0 w {patched} rekordach ({len(rows)} linii)")
|
||||
|
||||
def has_tag(flags_obj, tag: str) -> bool:
|
||||
try:
|
||||
tags = flags_obj["wg-voidships-builder"]["component"]["tags"]
|
||||
return isinstance(tags, list) and tag in tags
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def patch_items():
|
||||
if not ITEMS_FN.exists():
|
||||
print(f"[INFO] Pomijam items (brak {ITEMS_FN.name})")
|
||||
return
|
||||
ensure_backup(ITEMS_FN)
|
||||
rows = read_ndjson(ITEMS_FN)
|
||||
|
||||
existing_ids = set()
|
||||
patched_reactors = 0
|
||||
patched_aux = 0
|
||||
|
||||
for o in rows:
|
||||
existing_ids.add(o.get("_id", ""))
|
||||
|
||||
flags = o.get("flags", {})
|
||||
comp = flags.get("wg-voidships-builder", {}).get("component", {})
|
||||
kind = comp.get("kind")
|
||||
subtype = comp.get("subtype")
|
||||
|
||||
# Upewnij się, że ścieżka system.voidship.use/mods istnieje
|
||||
sys = o.setdefault("system", {})
|
||||
vsh = sys.setdefault("voidship", {})
|
||||
use = vsh.setdefault("use", {})
|
||||
mods = vsh.setdefault("mods", {})
|
||||
|
||||
# Auxiliary plasma (po tagu)
|
||||
if has_tag(flags, "aux-plasma"):
|
||||
if use.get("power") != 0:
|
||||
use["power"] = 0
|
||||
patched_aux += 1
|
||||
|
||||
# Reaktory
|
||||
if kind == "reactor":
|
||||
if use.get("power") != 0:
|
||||
use["power"] = 0
|
||||
if subtype in REACTOR_POWER_BY_SUBTYPE:
|
||||
pow_val = REACTOR_POWER_BY_SUBTYPE[subtype]
|
||||
if mods.get("power") != pow_val:
|
||||
mods["power"] = pow_val
|
||||
patched_reactors += 1
|
||||
|
||||
# zadbaj o wypełnienie brakujących kluczy modów
|
||||
for k in ["armour","integrity","manoeuvre","detection","speed","space"]:
|
||||
mods.setdefault(k, 0)
|
||||
# i sensowne sloty/space
|
||||
vsh.setdefault("slot", "Internal")
|
||||
use.setdefault("space", use.get("space", 0))
|
||||
|
||||
# Zapisz zmodyfikowane wiersze
|
||||
write_ndjson(ITEMS_FN, rows)
|
||||
print(f"[OK] Items: zaktualizowano reaktory: {patched_reactors}, aux-plasma: {patched_aux}")
|
||||
|
||||
# Dopisz brakujące 4 reaktory
|
||||
to_append = [r for r in REACTOR_TEMPLATES if r["_id"] not in existing_ids]
|
||||
if to_append:
|
||||
with ITEMS_FN.open("a", encoding="utf-8") as f:
|
||||
for obj in to_append:
|
||||
f.write(json.dumps(obj, ensure_ascii=False, separators=(",", ":")) + "\n")
|
||||
print(f"[OK] Items: dopisano brakujące reaktory: {[o['_id'] for o in to_append]}")
|
||||
else:
|
||||
print(f"[OK] Items: wszystkie reaktory już są — nic do dopisania.")
|
||||
|
||||
def main():
|
||||
print("== WG Voidships Patch ==")
|
||||
patch_hulls()
|
||||
patch_items()
|
||||
print("Gotowe. Zrestartuj/reloadnij Foundry i reimportuj kompendia, jeśli potrzeba.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,687 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
sync_foundry_module.py
|
||||
Rozszerzony:
|
||||
- Tryb AUTO: wykrywanie katalogów ze zmianami (git), obsługa modułów i niemodułów.
|
||||
- Każdy katalog -> osobny commit i push.
|
||||
- Root version.nfo: opcjonalny bump globalnej wersji (0.x) jeśli są zmiany i HEAD ma tag z obecną wersją.
|
||||
- Zipowanie po commit/push, przed podmianą plików (moduły) lub tuż po commicie (niemoduły):
|
||||
ZIP_MODE = "ALL" | "MODULE_ONLY" | "OFF"; CLI: --zip-mode; --zip-output-dir.
|
||||
|
||||
Dwa tryby:
|
||||
- AUTO (domyślny): wykryj wszystkie ZMIENIONE podkatalogi w SOURCE_BASE_DIR:
|
||||
* jeśli folder zawiera module.json -> procedura "moduł"
|
||||
* jeśli nie -> procedura "niemoduł" (version.nfo 0.x, inkrementacja)
|
||||
- SINGLE: przetwórz wyłącznie katalog wskazany w MODULE_SUBDIR_NAME (jak wcześniej)
|
||||
|
||||
Dry-run:
|
||||
- nic NIE modyfikuje (ani plików, ani repo), nie czyści i nie kopiuje – tylko plan.
|
||||
|
||||
Wymagania:
|
||||
- Python 3.8+
|
||||
- git w PATH (dla commit/push i wykrywania zmian)
|
||||
- uprawnienia do zapisu w repo i w katalogu docelowym modułów
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import argparse
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from typing import List, Optional, Tuple, Set
|
||||
|
||||
# ==========================
|
||||
# KONFIGURACJA (DOMYŚLNA)
|
||||
# ==========================
|
||||
|
||||
# Tryb: "auto" (wykryj zmienione katalogi) lub "single" (tylko MODULE_SUBDIR_NAME)
|
||||
MODE: str = "auto" # "auto" | "single"
|
||||
|
||||
TARGET_USER: str = "mtusz" # nazwa folderu w C:\Users\...
|
||||
APPDATA_KIND: Optional[str] = None # None | "Local" | "LocalLow" | "Roaming"
|
||||
TARGET_MODULES_DIR_OVERRIDE: Optional[str] = None # pełna ścieżka do ...\FoundryVTT\Data\modules
|
||||
MODULE_SUBDIR_NAME: str = "wg-voidships" # używane w trybie SINGLE
|
||||
CONFIRM_DELETE: bool = True
|
||||
SOURCE_BASE_DIR: str = r"C:\vtt_work"
|
||||
RELATIVE_PATTERN: str = r"FoundryVTT\Data\modules"
|
||||
DRY_RUN: bool = False # globalny tryb symulacji (nic nie zmienia)
|
||||
|
||||
# --- ZIP settings ---
|
||||
# ALL -> zipuj WSZYSTKIE katalogi (moduły i niemoduły)
|
||||
# MODULE_ONLY -> zipuj TYLKO katalogi z module.json
|
||||
# OFF -> nie twórz zipów
|
||||
ZIP_MODE: str = "ALL" # "ALL" | "MODULE_ONLY" | "OFF"
|
||||
# Katalog wyjściowy na archiwa .zip; jeśli None, użyje SOURCE_BASE_DIR/_zips
|
||||
ZIP_OUTPUT_DIR: Optional[str] = r"C:\Release packs"
|
||||
CHECK_MODE: bool = False # tylko walidacja – brak zmian, wyjście !=0 jeśli są akcje
|
||||
|
||||
# ==========================
|
||||
# KONIEC KONFIGURACJI
|
||||
# ==========================
|
||||
|
||||
APPDATA_VARIANTS = ("Local", "LocalLow", "Roaming")
|
||||
ARGS = None # wypełniane w main()
|
||||
|
||||
class AmbiguityError(RuntimeError):
|
||||
pass
|
||||
|
||||
|
||||
def norm(p: Path) -> Path:
|
||||
return Path(os.path.normpath(str(p)))
|
||||
|
||||
|
||||
def sh(cmd: List[str], cwd: Path) -> Tuple[int, str]:
|
||||
"""Uruchom polecenie i zwróć (rc, out)."""
|
||||
r = subprocess.run(cmd, cwd=str(cwd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
|
||||
return r.returncode, r.stdout
|
||||
|
||||
|
||||
def git_head_tag(repo_dir: Path) -> Optional[str]:
|
||||
"""Zwraca tag dokładnie na HEAD (jeśli istnieje), inaczej None."""
|
||||
rc, out = sh(["git", "describe", "--tags", "--exact-match", "HEAD"], repo_dir)
|
||||
if rc != 0:
|
||||
return None
|
||||
return out.strip() if out.strip() else None
|
||||
|
||||
|
||||
def ensure_git_repo(path: Path) -> None:
|
||||
rc, out = sh(["git", "rev-parse", "--is-inside-work-tree"], path)
|
||||
if rc != 0 or "true" not in out.strip().lower():
|
||||
raise RuntimeError(f"Katalog {norm(path)} nie wygląda na repozytorium git.\n{out}")
|
||||
|
||||
|
||||
def git_changed_top_level_dirs(repo_dir: Path) -> List[str]:
|
||||
"""
|
||||
Zwraca posortowaną listę unikalnych NAZW PODKATALOGÓW (1. poziom) w repo,
|
||||
które mają zmiany wg `git status --porcelain` (staged/unstaged/untracked).
|
||||
Zmiany w plikach w root repo są ignorowane (brak katalogu).
|
||||
"""
|
||||
rc, out = sh(["git", "status", "--porcelain"], repo_dir)
|
||||
if rc != 0:
|
||||
raise RuntimeError(f"Błąd podczas `git status --porcelain` w {norm(repo_dir)}:\n{out}")
|
||||
changed: Set[str] = set()
|
||||
for line in out.splitlines():
|
||||
if not line.strip():
|
||||
continue
|
||||
# format: XY <path> lub "?? <path>"
|
||||
try:
|
||||
path = line[3:].strip()
|
||||
except Exception:
|
||||
continue
|
||||
# ignoruj rename "R a -> b": wówczas path ma "a -> b"
|
||||
if "->" in path:
|
||||
path = path.split("->", 1)[1].strip()
|
||||
parts = Path(path).parts
|
||||
if len(parts) >= 1:
|
||||
top = parts[0]
|
||||
# bierz tylko katalogi (jeśli top to plik w root, pomiń)
|
||||
if (repo_dir / top).is_dir():
|
||||
changed.add(top)
|
||||
return sorted(changed)
|
||||
|
||||
|
||||
def find_modules_dir_for_user(user: str,
|
||||
relative_pattern: str,
|
||||
appdata_kind: Optional[str]) -> Path:
|
||||
base = Path(f"C:/Users/{user}/AppData")
|
||||
if not base.exists():
|
||||
raise FileNotFoundError(f"Nie znaleziono katalogu użytkownika: {norm(base)}")
|
||||
|
||||
candidates: List[Path] = []
|
||||
|
||||
if appdata_kind:
|
||||
if appdata_kind not in APPDATA_VARIANTS:
|
||||
raise ValueError(f"APPDATA_KIND musi być jednym z: {APPDATA_VARIANTS}, a nie '{appdata_kind}'")
|
||||
p = base / appdata_kind / Path(relative_pattern)
|
||||
if p.is_dir():
|
||||
return norm(p)
|
||||
else:
|
||||
raise FileNotFoundError(
|
||||
f"Nie znaleziono katalogu: {norm(p)} (dla APPDATA_KIND={appdata_kind})."
|
||||
)
|
||||
|
||||
for kind in APPDATA_VARIANTS:
|
||||
p = base / kind / Path(relative_pattern)
|
||||
if p.is_dir():
|
||||
candidates.append(p)
|
||||
|
||||
if not candidates:
|
||||
raise FileNotFoundError(
|
||||
"Nie znaleziono żadnego katalogu zgodnego z wzorcem.\n"
|
||||
f"Sprawdź, czy istnieje któryś z poniższych:\n"
|
||||
+ "\n".join(f" - {norm(base / kind / Path(relative_pattern))}" for kind in APPDATA_VARIANTS)
|
||||
)
|
||||
|
||||
if len(candidates) == 1:
|
||||
return norm(candidates[0])
|
||||
|
||||
suggestions = []
|
||||
for p in candidates:
|
||||
try:
|
||||
kind = p.parts[p.parts.index("AppData") + 1]
|
||||
except Exception:
|
||||
kind = "??"
|
||||
suggestions.append(f'* Ustaw APPDATA_KIND="{kind}" # trafi w: {norm(p)}')
|
||||
suggestions.append(f'* Albo ustaw TARGET_MODULES_DIR_OVERRIDE="{norm(candidates[0])}" # pełny override')
|
||||
|
||||
raise AmbiguityError(
|
||||
"Znaleziono wiele pasujących lokalizacji dla wzorca 'FoundryVTT\\Data\\modules':\n"
|
||||
+ "\n".join(f" - {norm(c)}" for c in candidates)
|
||||
+ "\n\nPropozycje ujednolicenia:\n" + "\n".join(suggestions)
|
||||
)
|
||||
|
||||
|
||||
def ensure_dir(path: Path) -> None:
|
||||
path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
def iter_dir_contents(dir_path: Path) -> List[Path]:
|
||||
if not dir_path.exists():
|
||||
return []
|
||||
return list(dir_path.iterdir())
|
||||
|
||||
|
||||
def clear_dir_contents(dir_path: Path, dry_run: bool) -> Tuple[int, int]:
|
||||
ensure_dir(dir_path)
|
||||
files = 0
|
||||
dirs = 0
|
||||
to_delete = iter_dir_contents(dir_path)
|
||||
|
||||
if dry_run:
|
||||
print("[DRY-RUN] Zawartość do skasowania:")
|
||||
if not to_delete:
|
||||
print(" (pusto)")
|
||||
for child in to_delete:
|
||||
tag = "[plik]" if child.is_file() else "[katalog]" if child.is_dir() else "[inne]"
|
||||
print(f" {tag} {norm(child)}")
|
||||
for child in to_delete:
|
||||
if child.is_file() or child.is_symlink():
|
||||
files += 1
|
||||
elif child.is_dir():
|
||||
dirs += 1
|
||||
return files, dirs
|
||||
|
||||
for child in to_delete:
|
||||
if child.is_file() or child.is_symlink():
|
||||
files += 1
|
||||
child.unlink(missing_ok=True)
|
||||
elif child.is_dir():
|
||||
dirs += 1
|
||||
shutil.rmtree(child, ignore_errors=True)
|
||||
return files, dirs
|
||||
|
||||
|
||||
def plan_copy(src: Path, dst: Path) -> List[Tuple[Path, Path, str]]:
|
||||
plan: List[Tuple[Path, Path, str]] = []
|
||||
if not src.is_dir():
|
||||
raise FileNotFoundError(f"Katalog źródłowy nie istnieje: {norm(src)}")
|
||||
|
||||
for root, dirs, files in os.walk(src):
|
||||
root_p = Path(root)
|
||||
rel_root = root_p.relative_to(src)
|
||||
for d in dirs:
|
||||
s = root_p / d
|
||||
t = dst / rel_root / d
|
||||
status = "overwrite" if t.exists() else "create"
|
||||
plan.append((s, t, status))
|
||||
for f in files:
|
||||
s = root_p / f
|
||||
t = dst / rel_root / f
|
||||
status = "overwrite" if t.exists() else "create"
|
||||
plan.append((s, t, status))
|
||||
return plan
|
||||
|
||||
|
||||
def copy_dir_contents(src: Path, dst: Path, dry_run: bool) -> Tuple[int, int]:
|
||||
ensure_dir(dst)
|
||||
plan = plan_copy(src, dst)
|
||||
|
||||
if dry_run:
|
||||
print("[DRY-RUN] Plan kopiowania:")
|
||||
if not plan:
|
||||
print(" (brak plików do skopiowania)")
|
||||
for s, t, status in plan:
|
||||
kind = "[katalog]" if s.is_dir() else "[plik]"
|
||||
print(f" {kind} {norm(s)} -> {norm(t)} ({status})")
|
||||
files = sum(1 for s, _, _ in plan if s.is_file())
|
||||
dirs = sum(1 for s, _, _ in plan if s.is_dir())
|
||||
return files, dirs
|
||||
|
||||
files = 0
|
||||
dirs = 0
|
||||
for s, t, _ in plan:
|
||||
if s.is_dir():
|
||||
shutil.copytree(s, t, dirs_exist_ok=True)
|
||||
dirs += 1
|
||||
elif s.is_file():
|
||||
ensure_dir(t.parent)
|
||||
shutil.copy2(s, t)
|
||||
files += 1
|
||||
elif s.is_symlink():
|
||||
target = s.resolve()
|
||||
ensure_dir(t.parent)
|
||||
if target.is_dir():
|
||||
shutil.copytree(target, t, dirs_exist_ok=True)
|
||||
dirs += 1
|
||||
else:
|
||||
shutil.copy2(target, t)
|
||||
files += 1
|
||||
else:
|
||||
print(f"[OSTRZEŻENIE] Pominięto nieobsługiwany typ pliku: {norm(s)}")
|
||||
return files, dirs
|
||||
|
||||
|
||||
# ============ PRE-FLIGHT: module.json + git ============
|
||||
|
||||
def read_manifest(manifest_path: Path) -> dict:
|
||||
if not manifest_path.is_file():
|
||||
raise FileNotFoundError(f"Brak pliku manifestu: {norm(manifest_path)}")
|
||||
try:
|
||||
with manifest_path.open("r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
raise ValueError(f"Niepoprawny JSON w {norm(manifest_path)}: {e}") from e
|
||||
|
||||
|
||||
def bump_version(last_version: str) -> str:
|
||||
parts = last_version.strip().split(".")
|
||||
if not parts:
|
||||
raise ValueError(f"Niepoprawna wersja: '{last_version}'")
|
||||
try:
|
||||
n = int(parts[-1])
|
||||
except ValueError:
|
||||
raise ValueError(f"Ostatni segment wersji nie jest liczbą: '{last_version}'")
|
||||
parts[-1] = str(n + 1)
|
||||
return ".".join(parts)
|
||||
|
||||
|
||||
def write_json_atomic(path: Path, data: dict) -> None:
|
||||
tmp = path.with_suffix(path.suffix + ".tmp")
|
||||
with tmp.open("w", encoding="utf-8") as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
f.write("\n")
|
||||
tmp.replace(path)
|
||||
|
||||
|
||||
def run_git_commands(repo_dir: Path, commit_msg: str, dry_run: bool) -> None:
|
||||
if dry_run:
|
||||
print("[DRY-RUN] git add -A")
|
||||
print(f"[DRY-RUN] git commit -m {commit_msg!r}")
|
||||
print("[DRY-RUN] git push")
|
||||
return
|
||||
|
||||
def run(cmd: List[str]) -> None:
|
||||
rc, out = sh(cmd, repo_dir)
|
||||
if rc != 0:
|
||||
raise RuntimeError(f"Blad podczas uruchamiania: {' '.join(cmd)}\nWyjscie:\n{out}")
|
||||
if out.strip():
|
||||
print(out)
|
||||
|
||||
run(["git", "add", "-A"])
|
||||
rc, out = sh(["git", "commit", "-m", commit_msg], repo_dir)
|
||||
if rc != 0:
|
||||
raise RuntimeError(f"Blad podczas git commit:\n{out}")
|
||||
if out.strip():
|
||||
print(out)
|
||||
run(["git", "push"])
|
||||
|
||||
|
||||
|
||||
def preflight_module(src_dir: Path, dry_run: bool) -> Tuple[str, str]:
|
||||
"""
|
||||
Moduł: odczyt module.json, bump, zapis (jeśli nie dry_run), commit i push.
|
||||
Zwraca (module_id, new_version, commit_sha lub None przy dry-run).
|
||||
"""
|
||||
manifest_path = src_dir / "module.json"
|
||||
manifest = read_manifest(manifest_path)
|
||||
|
||||
if "id" not in manifest or "version" not in manifest:
|
||||
raise KeyError(f"W {norm(manifest_path)} brakuje pola 'id' lub 'version'.")
|
||||
|
||||
module_id = str(manifest["id"])
|
||||
old_version = str(manifest["version"])
|
||||
new_version = bump_version(old_version)
|
||||
|
||||
print(f"[PRE][MODULE] {src_dir.name}: id={module_id}, version={old_version} -> {new_version}")
|
||||
|
||||
if dry_run:
|
||||
print("[DRY-RUN] Nie zapisuję module.json i nie wykonuję git.")
|
||||
else:
|
||||
manifest["version"] = new_version
|
||||
write_json_atomic(manifest_path, manifest)
|
||||
commit_msg = f"sync: {module_id} v{new_version}"
|
||||
run_git_commands(src_dir, commit_msg, dry_run=False)
|
||||
|
||||
return module_id, new_version
|
||||
|
||||
|
||||
def preflight_non_module(src_dir: Path, dry_run: bool) -> str:
|
||||
"""
|
||||
Niemoduł: version.nfo w formacie '0.x' (x int).
|
||||
- jeśli brak -> '0.1'
|
||||
- jeśli jest -> inkrementuj x
|
||||
Zapis (nie dry-run) oraz osobny commit/push.
|
||||
Zwraca (new_version, commit_sha lub None przy dry-run).
|
||||
"""
|
||||
nfo = src_dir / "version.nfo"
|
||||
if not nfo.exists():
|
||||
new_version = "0.1"
|
||||
print(f"[PRE][FOLDER] {src_dir.name}: version.nfo brak -> {new_version}")
|
||||
if not dry_run:
|
||||
with nfo.open("w", encoding="utf-8") as f:
|
||||
f.write(new_version + "\n")
|
||||
commit_msg = f"sync: {src_dir.name} v{new_version}"
|
||||
run_git_commands(src_dir, commit_msg, dry_run=False)
|
||||
return new_version
|
||||
|
||||
# istnieje -> wczytaj i bumpnij
|
||||
content = nfo.read_text(encoding="utf-8").strip()
|
||||
if not (content.startswith("0.") or content.startswith("1.")):
|
||||
raise ValueError(f"{norm(nfo)}: oczekiwano formatu '0/1.x', otrzymano '{content}'")
|
||||
tail = content.split(".", 1)[1]
|
||||
head = content.split(".",1)[0]
|
||||
try:
|
||||
_ = int(head)
|
||||
x = int(tail)
|
||||
except ValueError:
|
||||
raise ValueError(f"{norm(nfo)}: część po '0/1.' nie jest liczbą: '{tail}'")
|
||||
new_version = f"{head}.{x+1}"
|
||||
print(f"[PRE][FOLDER] {src_dir.name}: version {content} -> {new_version}")
|
||||
|
||||
if not dry_run:
|
||||
with nfo.open("w", encoding="utf-8") as f:
|
||||
f.write(new_version + "\n")
|
||||
commit_msg = f"sync: {src_dir.name} v{new_version}"
|
||||
run_git_commands(src_dir, commit_msg, dry_run=False)
|
||||
|
||||
return new_version
|
||||
|
||||
|
||||
# ====== ROOT version.nfo (globalna wersja repo) ======
|
||||
def maybe_bump_root_version(repo_dir: Path, changed_any: bool, dry_run: bool) -> Optional[str]:
|
||||
"""
|
||||
Jeśli:
|
||||
- istnieją zmiany do przetworzenia (changed_any == True)
|
||||
- HEAD ma tag zawierający aktualną wersję globalną z version.nfo (0.x)
|
||||
to bumpnij version.nfo w roocie (0.x -> 0.(x+1)), zrób osobny commit i push.
|
||||
Zwraca nową wersję (str) lub None, jeśli pominięto.
|
||||
"""
|
||||
if not changed_any:
|
||||
print("[ROOT] Pomijam bump wersji globalnej: brak zmian do przetworzenia.")
|
||||
return None
|
||||
|
||||
nfo = repo_dir / "version.nfo"
|
||||
if not nfo.exists():
|
||||
print("[ROOT] Brak version.nfo w roocie; pomijam bump (wymagany istniejący plik).")
|
||||
return None
|
||||
|
||||
current = nfo.read_text(encoding="utf-8").strip()
|
||||
if not current.startswith("0."):
|
||||
raise ValueError(f"{nfo}: oczekiwano formatu '0.x', otrzymano '{current}'")
|
||||
# HEAD musi mieć tag zawierający 'current'
|
||||
tag = git_head_tag(repo_dir)
|
||||
if not tag or current not in tag:
|
||||
print(f"[ROOT] Pomijam bump: {'brak taga na HEAD' if not tag else f'tag \"{tag}\" nie zawiera wersji {current}'}")
|
||||
return None
|
||||
|
||||
# Bump
|
||||
try:
|
||||
tail = int(current.split(".", 1)[1])
|
||||
except ValueError:
|
||||
raise ValueError(f"{nfo}: część po '0.' nie jest liczbą: '{current}'")
|
||||
new_version = f"0.{tail+1}"
|
||||
print(f"[ROOT] Globalna wersja: {current} -> {new_version}")
|
||||
|
||||
if dry_run:
|
||||
print("[DRY-RUN][ROOT] Zapis version.nfo i commit/push zostaną pominięte.")
|
||||
return new_version
|
||||
|
||||
nfo.write_text(new_version + "\n", encoding="utf-8")
|
||||
run_git_commands(repo_dir, f"sync: root v{new_version}", dry_run=False)
|
||||
return new_version
|
||||
|
||||
|
||||
# ====== ZIP utilities ======
|
||||
def should_zip(is_module: bool, zip_mode: str) -> bool:
|
||||
if zip_mode == "OFF":
|
||||
return False
|
||||
if zip_mode == "ALL":
|
||||
return True
|
||||
# MODULE_ONLY
|
||||
return is_module
|
||||
|
||||
|
||||
def ensure_zip_output_dir(source_base: Path, override: Optional[str]) -> Path:
|
||||
out = Path(override) if override else (source_base / "_zips")
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
return out
|
||||
|
||||
|
||||
def make_zip_for_folder(src_dir: Path, version: str, out_dir: Path, dry_run: bool) -> Path:
|
||||
"""
|
||||
Tworzy .zip z zawartością src_dir (bez nadkatalogów) o nazwie NAME-vVERSION.zip
|
||||
Zwraca ścieżkę do archiwum.
|
||||
"""
|
||||
base_name = f"{src_dir.name}-v{version}"
|
||||
target = out_dir / (base_name + ".zip")
|
||||
if dry_run:
|
||||
print(f"[DRY-RUN][ZIP] {src_dir} -> {target}")
|
||||
return target
|
||||
# shutil.make_archive potrzebuje base_name BEZ .zip i root_dir+base_dir
|
||||
base_name_path = out_dir / base_name
|
||||
shutil.make_archive(str(base_name_path), "zip", root_dir=str(src_dir), base_dir=".")
|
||||
print(f"[ZIP] Utworzono {target}")
|
||||
return target
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
p = argparse.ArgumentParser(description="Synchronizacja FoundryVTT: AUTO wykrywanie zmian + obsługa modułów/niemodułów.")
|
||||
p.add_argument("--mode", choices=["auto", "single"], default=MODE,
|
||||
help=f"Tryb działania (domyślnie: {MODE}).")
|
||||
p.add_argument("--user", dest="user", default=TARGET_USER,
|
||||
help=f"Nazwa użytkownika Windows (domyślnie: {TARGET_USER})")
|
||||
p.add_argument("--appdata-kind", dest="appdata_kind", choices=APPDATA_VARIANTS + (None,),
|
||||
default=APPDATA_KIND,
|
||||
help=f"Wymuś AppData wariant: {APPDATA_VARIANTS} lub brak (None). Domyślnie: {APPDATA_KIND}")
|
||||
p.add_argument("--modules-dir-override", dest="modules_dir_override",
|
||||
default=TARGET_MODULES_DIR_OVERRIDE,
|
||||
help="Pełna ścieżka do ...\\FoundryVTT\\Data\\modules (pomija wyszukiwanie).")
|
||||
p.add_argument("--module-subdir-name", dest="module_subdir_name",
|
||||
default=MODULE_SUBDIR_NAME,
|
||||
help=f"Nazwa podkatalogu modułu (tylko w --mode single). Domyślnie: {MODULE_SUBDIR_NAME}")
|
||||
|
||||
cd_group = p.add_mutually_exclusive_group()
|
||||
cd_group.add_argument("--confirm-delete", dest="confirm_delete", action="store_true",
|
||||
help="Włącz potwierdzenie kasowania.")
|
||||
cd_group.add_argument("--no-confirm-delete", dest="confirm_delete", action="store_false",
|
||||
help="Wyłącz potwierdzenie kasowania.")
|
||||
p.set_defaults(confirm_delete=CONFIRM_DELETE)
|
||||
|
||||
p.add_argument("--source-base-dir", dest="source_base_dir",
|
||||
default=SOURCE_BASE_DIR,
|
||||
help=f"Katalog źródłowy repo (domyślnie: {SOURCE_BASE_DIR})")
|
||||
p.add_argument("--relative-pattern", dest="relative_pattern",
|
||||
default=RELATIVE_PATTERN,
|
||||
help=f"Wzorzec relatywny od AppData dla katalogu modules (domyślnie: {RELATIVE_PATTERN})")
|
||||
|
||||
dr_group = p.add_mutually_exclusive_group()
|
||||
dr_group.add_argument("--dry-run", dest="dry_run", action="store_true",
|
||||
help="Tryb symulacji: tylko plan (bez modyfikacji i bez gita).")
|
||||
dr_group.add_argument("--no-dry-run", dest="dry_run", action="store_false",
|
||||
help="Tryb wykonawczy: modyfikacje + git.")
|
||||
p.set_defaults(dry_run=DRY_RUN)
|
||||
|
||||
# ZIP options
|
||||
p.add_argument("--zip-mode", dest="zip_mode",
|
||||
choices=["ALL", "MODULE_ONLY", "OFF"],
|
||||
default=ZIP_MODE,
|
||||
help=f"Zipowanie: ALL | MODULE_ONLY | OFF (domyślnie: {ZIP_MODE})")
|
||||
p.add_argument("--zip-output-dir", dest="zip_output_dir",
|
||||
default=ZIP_OUTPUT_DIR,
|
||||
help="Katalog wyjściowy na zipy (domyślnie: SOURCE_BASE_DIR/_zips)")
|
||||
|
||||
# Tryb check (tylko walidacja)
|
||||
p.add_argument("--check", dest="check", action="store_true",
|
||||
help="Tylko sprawdzenie zmian (wymusza dry-run, kod wyjścia 1 przy wymaganych akcjach).")
|
||||
p.set_defaults(check=CHECK_MODE)
|
||||
|
||||
|
||||
return p.parse_args()
|
||||
|
||||
|
||||
def resolve_modules_base(user: str, relative_pattern: str, appdata_kind: Optional[str],
|
||||
override: Optional[str]) -> Path:
|
||||
if override:
|
||||
modules_dir = Path(override)
|
||||
if not modules_dir.is_dir():
|
||||
raise FileNotFoundError(f"TARGET_MODULES_DIR_OVERRIDE wskazuje na nieistniejący katalog: {norm(modules_dir)}")
|
||||
return modules_dir
|
||||
return find_modules_dir_for_user(user, relative_pattern, appdata_kind)
|
||||
|
||||
|
||||
def process_module(src_dir: Path, modules_base: Path, confirm_delete: bool, dry_run: bool) -> None:
|
||||
module_id, new_ver = preflight_module(src_dir, dry_run=dry_run)
|
||||
|
||||
target_dir = modules_base / src_dir.name
|
||||
print(f"[INFO][MODULE] Cel modułu: {norm(target_dir)}")
|
||||
|
||||
if confirm_delete and not dry_run:
|
||||
ans = input(f"Czy na pewno wyczyścić zawartość '{norm(target_dir)}'? [y/N]: ").strip().lower()
|
||||
if ans not in ("y", "yes", "t", "tak"):
|
||||
raise RuntimeError("Przerwano na życzenie użytkownika.")
|
||||
|
||||
if confirm_delete and dry_run:
|
||||
print("[INFO] (dry-run) Pytanie o potwierdzenie pominięte.")
|
||||
|
||||
# ZIP po commicie, przed podmianą
|
||||
zip_path: Optional[Path] = None
|
||||
if should_zip(is_module=True, zip_mode=ARGS.zip_mode):
|
||||
out_dir = ensure_zip_output_dir(Path(ARGS.source_base_dir), ARGS.zip_output_dir)
|
||||
try:
|
||||
zip_path = make_zip_for_folder(src_dir, new_ver, out_dir, dry_run)
|
||||
except Exception as e:
|
||||
raise RuntimeError(f"Błąd zipowania modułu {src_dir.name}: {e}") from e
|
||||
|
||||
print("[AKCJA] Czyszczenie..." if not dry_run else "[SYMULACJA] Plan czyszczenia...")
|
||||
del_files, del_dirs = clear_dir_contents(target_dir, dry_run=dry_run)
|
||||
print(f"[INFO] {'Do usunięcia' if dry_run else 'Usunięto'}: plików={del_files}, katalogów={del_dirs}")
|
||||
|
||||
print("[AKCJA] Kopiowanie..." if not dry_run else "[SYMULACJA] Plan kopiowania...")
|
||||
cp_files, cp_dirs = copy_dir_contents(src_dir, target_dir, dry_run=dry_run)
|
||||
print(f"[INFO] {'Do skopiowania' if dry_run else 'Skopiowano'}: plików={cp_files}, katalogów={cp_dirs}")
|
||||
|
||||
print(f"[DONE][MODULE] {src_dir.name} -> commit 'sync: {module_id} v{new_ver}' wykonany." if not dry_run
|
||||
else f"[DRY-RUN][MODULE] {src_dir.name} -> commit planowany.")
|
||||
|
||||
def process_non_module(src_dir: Path, dry_run: bool) -> None:
|
||||
new_ver = preflight_non_module(src_dir, dry_run=dry_run)
|
||||
# ZIP po commicie (jeśli ustawienie pozwala)
|
||||
zip_path: Optional[Path] = None
|
||||
if should_zip(is_module=False, zip_mode=ARGS.zip_mode):
|
||||
out_dir = ensure_zip_output_dir(Path(ARGS.source_base_dir), ARGS.zip_output_dir)
|
||||
try:
|
||||
zip_path = make_zip_for_folder(src_dir, new_ver, out_dir, dry_run)
|
||||
except Exception as e:
|
||||
raise RuntimeError(f"Błąd zipowania folderu {src_dir.name}: {e}") from e
|
||||
print(f"[DONE][FOLDER] {src_dir.name} -> version.nfo = {new_ver}; commit wykonany." if not dry_run
|
||||
else f"[DRY-RUN][FOLDER] {src_dir.name} -> version.nfo będzie {new_ver}; commit planowany.")
|
||||
|
||||
def main() -> int:
|
||||
global ARGS
|
||||
ARGS = parse_args()
|
||||
|
||||
check_mode = ARGS.check
|
||||
if check_mode:
|
||||
ARGS.dry_run = True
|
||||
|
||||
mode = ARGS.mode
|
||||
user = ARGS.user
|
||||
appdata_kind = ARGS.appdata_kind if ARGS.appdata_kind != "None" else None
|
||||
modules_override = ARGS.modules_dir_override
|
||||
module_subdir_single = ARGS.module_subdir_name
|
||||
confirm_delete = ARGS.confirm_delete
|
||||
source_base = Path(ARGS.source_base_dir)
|
||||
relative_pattern = ARGS.relative_pattern
|
||||
dry_run = ARGS.dry_run
|
||||
|
||||
if not source_base.is_dir():
|
||||
raise FileNotFoundError(f"Katalog zrodlowy nie istnieje: {norm(source_base)}")
|
||||
|
||||
ensure_git_repo(source_base)
|
||||
|
||||
modules_base = resolve_modules_base(user, relative_pattern, appdata_kind, modules_override)
|
||||
print(f"[INFO] Katalog modules base: {norm(modules_base)}")
|
||||
|
||||
pending_actions = False
|
||||
|
||||
if mode == "single":
|
||||
src_dir = source_base / module_subdir_single
|
||||
if not src_dir.is_dir():
|
||||
raise FileNotFoundError(f"[SINGLE] Brak katalogu: {norm(src_dir)}")
|
||||
|
||||
root_bumped = maybe_bump_root_version(source_base, changed_any=True, dry_run=dry_run)
|
||||
if root_bumped:
|
||||
pending_actions = True
|
||||
|
||||
pending_actions = True
|
||||
|
||||
if (src_dir / "module.json").is_file():
|
||||
print(f"[MODE=SINGLE][MODULE] {src_dir.name}")
|
||||
process_module(src_dir, modules_base, confirm_delete, dry_run)
|
||||
else:
|
||||
print(f"[MODE=SINGLE][FOLDER] {src_dir.name}")
|
||||
process_non_module(src_dir, dry_run)
|
||||
print("[SUKCES] Tryb SINGLE zakonczony.")
|
||||
if check_mode:
|
||||
print("[CHECK] Wykryto oczekujace akcje (tryb single).")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
changed = git_changed_top_level_dirs(source_base)
|
||||
print(f"[AUTO] Zmienione katalogi w {norm(source_base)}: {changed if changed else '(brak)'}")
|
||||
if changed:
|
||||
pending_actions = True
|
||||
|
||||
root_bumped = maybe_bump_root_version(source_base, changed_any=bool(changed), dry_run=dry_run)
|
||||
if root_bumped:
|
||||
pending_actions = True
|
||||
|
||||
if not changed:
|
||||
print("[INFO] Brak zmian do przetworzenia.")
|
||||
if check_mode:
|
||||
if pending_actions:
|
||||
print("[CHECK] Wykryto oczekujace akcje.")
|
||||
return 1
|
||||
print("[CHECK] OK - brak akcji wymaganych.")
|
||||
return 0
|
||||
|
||||
# Przetwarzaj w stalej kolejnosci
|
||||
for name in changed:
|
||||
src_dir = source_base / name
|
||||
if (src_dir / "module.json").is_file():
|
||||
print(f"\n[AUTO][MODULE] {name}")
|
||||
process_module(src_dir, modules_base, confirm_delete, dry_run)
|
||||
else:
|
||||
print(f"\n[AUTO][FOLDER] {name}")
|
||||
process_non_module(src_dir, dry_run)
|
||||
|
||||
print("\n[SUKCES] Tryb AUTO zakonczony.")
|
||||
if check_mode and pending_actions:
|
||||
print("[CHECK] Wykryto oczekujace akcje.")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
sys.exit(main())
|
||||
except AmbiguityError as e:
|
||||
print("\n[NIERÓWNOZNACZNOŚĆ]\n" + str(e), file=sys.stderr)
|
||||
sys.exit(2)
|
||||
except Exception as e:
|
||||
print("\n[BŁĄD]\n" + str(e), file=sys.stderr)
|
||||
sys.exit(1)
|
||||
@@ -0,0 +1 @@
|
||||
0.5
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 934 B |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 794 B |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"title": "Investigation Board",
|
||||
"description": "A Foundry VTT module that lets everyone create, edit, and move sticky and photo notes on the scene as collaborative investigation tools.",
|
||||
"version": "1.3.2",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Gus",
|
||||
"url": "",
|
||||
"email": ""
|
||||
}
|
||||
],
|
||||
"compatibility": {
|
||||
"minimum": "12",
|
||||
"verified": "13"
|
||||
},
|
||||
"esmodules": [
|
||||
"scripts/settings.js",
|
||||
"scripts/investigation-board.js"
|
||||
],
|
||||
"styles": [
|
||||
"styles/style.css"
|
||||
],
|
||||
"packs": [],
|
||||
"templates": [
|
||||
"templates/drawing-sheet.html"
|
||||
],
|
||||
"url": "https://github.com/mordachai/investigation-board",
|
||||
"manifest": "https://github.com/mordachai/investigation-board/raw/main/module.json",
|
||||
"download": "https://github.com/mordachai/investigation-board/raw/main/investigation-board.zip",
|
||||
"id": "investigation-board"
|
||||
}
|
||||
@@ -0,0 +1,471 @@
|
||||
//investigation-boards.js
|
||||
|
||||
import { registerSettings } from "./settings.js";
|
||||
|
||||
const MODULE_ID = "investigation-board";
|
||||
const BASE_FONT_SIZE = 15;
|
||||
const PIN_COLORS = ["redPin.webp", "bluePin.webp", "yellowPin.webp", "greenPin.webp"];
|
||||
|
||||
function getBaseCharacterLimits() {
|
||||
return game.settings.get(MODULE_ID, "baseCharacterLimits") || {
|
||||
sticky: 60,
|
||||
photo: 15,
|
||||
index: 200,
|
||||
};
|
||||
}
|
||||
|
||||
function getDynamicCharacterLimits(noteType, currentFontSize) {
|
||||
const baseLimits = getBaseCharacterLimits();
|
||||
const scaleFactor = BASE_FONT_SIZE / currentFontSize;
|
||||
const limits = baseLimits[noteType] || { sticky: 60, photo: 15, index: 200 };
|
||||
return {
|
||||
sticky: Math.round(limits.sticky * scaleFactor),
|
||||
photo: Math.round(limits.photo * scaleFactor),
|
||||
index: Math.round(limits.index * scaleFactor),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
class CustomDrawingSheet extends DrawingConfig {
|
||||
static get defaultOptions() {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["custom-drawing-sheet"],
|
||||
template: "modules/investigation-board/templates/drawing-sheet.html",
|
||||
width: 400,
|
||||
height: "auto",
|
||||
title: "Note Configuration",
|
||||
});
|
||||
}
|
||||
|
||||
getData(options) {
|
||||
const data = super.getData(options);
|
||||
data.noteType = this.object.flags[MODULE_ID]?.type || "sticky";
|
||||
data.text = this.object.flags[MODULE_ID]?.text || "Default Text";
|
||||
data.image = this.object.flags[MODULE_ID]?.image || "modules/investigation-board/assets/placeholder.webp";
|
||||
|
||||
// Pass along the extra identityName for futuristic photo notes
|
||||
data.identityName = this.object.flags[MODULE_ID]?.identityName || "";
|
||||
|
||||
// Include the board mode from settings for conditional display in the template
|
||||
data.boardMode = game.settings.get(MODULE_ID, "boardMode");
|
||||
|
||||
data.noteTypes = {
|
||||
sticky: "Sticky Note",
|
||||
photo: "Photo Note",
|
||||
index: "Index Card",
|
||||
};
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
async _updateObject(event, formData) {
|
||||
const updates = {
|
||||
[`flags.${MODULE_ID}.type`]: formData.noteType,
|
||||
[`flags.${MODULE_ID}.text`]: formData.text,
|
||||
[`flags.${MODULE_ID}.image`]: formData.image || "modules/investigation-board/assets/placeholder.webp",
|
||||
};
|
||||
if (formData.identityName !== undefined) {
|
||||
updates[`flags.${MODULE_ID}.identityName`] = formData.identityName;
|
||||
}
|
||||
|
||||
|
||||
await this.object.update(updates);
|
||||
const drawing = canvas.drawings.get(this.object.id);
|
||||
if (drawing) drawing.refresh();
|
||||
}
|
||||
|
||||
// Add activateListeners to hook up the file-picker button.
|
||||
activateListeners(element) {
|
||||
super.activateListeners(element);
|
||||
element.querySelectorAll(".file-picker-button").forEach(btn => btn.addEventListener("click", ev => {
|
||||
ev.preventDefault();
|
||||
// Open Foundry's FilePicker for images; adjust the "current" directory if needed.
|
||||
new FilePicker({
|
||||
type: "image",
|
||||
current: "modules/investigation-board/assets/",
|
||||
callback: path => {
|
||||
// Update the readonly input with the chosen image path.
|
||||
const input = element.querySelector("input[name='image']"); if (input) input.value = path;
|
||||
}
|
||||
}).browse();
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
class CustomDrawing extends Drawing {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
this.bgSprite = null;
|
||||
this.pinSprite = null;
|
||||
this.noteText = null;
|
||||
this.photoImageSprite = null;
|
||||
this.identityNameText = null;
|
||||
this.futuristicText = null;
|
||||
}
|
||||
|
||||
// Ensure sprites are created when the drawing is first rendered.
|
||||
async draw() {
|
||||
await super.draw();
|
||||
await this._updateSprites();
|
||||
return this;
|
||||
}
|
||||
|
||||
// Ensure sprites update correctly on refresh.
|
||||
async refresh() {
|
||||
await super.refresh();
|
||||
await this._updateSprites();
|
||||
return this;
|
||||
}
|
||||
|
||||
async _updateSprites() {
|
||||
const noteData = this.document.flags[MODULE_ID];
|
||||
if (!noteData) return;
|
||||
|
||||
const isPhoto = noteData.type === "photo";
|
||||
const isIndex = noteData.type === "index";
|
||||
const mode = game.settings.get(MODULE_ID, "boardMode");
|
||||
|
||||
// FUTURISTIC PHOTO NOTE LAYOUT
|
||||
if (isPhoto && mode === "futuristic") {
|
||||
const fullWidth = game.settings.get(MODULE_ID, "photoNoteWidth");
|
||||
const margin = 10;
|
||||
const photoImgWidth = fullWidth * 0.4;
|
||||
const photoImgHeight = photoImgWidth * (4 / 3);
|
||||
const textAreaX = margin + photoImgWidth + margin;
|
||||
const fullHeight = photoImgHeight + margin * 2;
|
||||
|
||||
// --- Background Frame ---
|
||||
if (!this.bgSprite) {
|
||||
this.bgSprite = new PIXI.Sprite();
|
||||
this.addChildAt(this.bgSprite, 0);
|
||||
}
|
||||
try {
|
||||
// Always use the fixed photo frame image.
|
||||
this.bgSprite.texture = PIXI.Texture.from("modules/investigation-board/assets/photoFrame.webp");
|
||||
} catch (err) {
|
||||
console.error("Failed to load photo frame texture", err);
|
||||
this.bgSprite.texture = PIXI.Texture.EMPTY;
|
||||
}
|
||||
this.bgSprite.width = fullWidth;
|
||||
this.bgSprite.height = fullHeight;
|
||||
|
||||
// --- Foreground (User-Assigned) Photo ---
|
||||
if (!this.photoImageSprite) {
|
||||
this.photoImageSprite = new PIXI.Sprite();
|
||||
this.addChild(this.photoImageSprite);
|
||||
}
|
||||
try {
|
||||
// Use a fallback if no image is assigned.
|
||||
const imagePath = noteData.image || "modules/investigation-board/assets/placeholder.webp";
|
||||
this.photoImageSprite.texture = PIXI.Texture.from(imagePath);
|
||||
} catch (err) {
|
||||
console.error(`Failed to load user photo: ${noteData.image}`, err);
|
||||
this.photoImageSprite.texture = PIXI.Texture.EMPTY;
|
||||
}
|
||||
// Position the user photo inside the frame.
|
||||
this.photoImageSprite.width = fullWidth * 0.9;
|
||||
this.photoImageSprite.height = fullHeight * 0.9;
|
||||
this.photoImageSprite.position.set(fullWidth * 0.05, fullHeight * 0.05);
|
||||
|
||||
// --- Identity Name and Additional Text (Futuristic) ---
|
||||
const font = game.settings.get(MODULE_ID, "font");
|
||||
const baseFontSize = game.settings.get(MODULE_ID, "baseFontSize");
|
||||
const fontSize = (fullWidth / 200) * baseFontSize;
|
||||
const textStyle = new PIXI.TextStyle({
|
||||
fontFamily: font,
|
||||
fontSize: fontSize,
|
||||
fill: "#000000",
|
||||
wordWrap: true,
|
||||
wordWrapWidth: fullWidth - textAreaX - margin,
|
||||
align: "left",
|
||||
});
|
||||
if (!this.identityNameText) {
|
||||
this.identityNameText = new PIXI.Text("", textStyle);
|
||||
this.addChild(this.identityNameText);
|
||||
}
|
||||
this.identityNameText.text = noteData.identityName || "Name";
|
||||
this.identityNameText.style = textStyle;
|
||||
this.identityNameText.position.set(textAreaX, margin);
|
||||
|
||||
if (!this.futuristicText) {
|
||||
this.futuristicText = new PIXI.Text("", textStyle);
|
||||
this.addChild(this.futuristicText);
|
||||
}
|
||||
this.futuristicText.text = noteData.text || "";
|
||||
this.futuristicText.style = textStyle;
|
||||
this.futuristicText.position.set(textAreaX, margin + this.identityNameText.height + 5);
|
||||
|
||||
// Remove default note text if present.
|
||||
if (this.noteText) {
|
||||
this.removeChild(this.noteText);
|
||||
this.noteText.destroy();
|
||||
this.noteText = null;
|
||||
}
|
||||
|
||||
// --- Pin Handling (Futuristic) ---
|
||||
const pinSetting = game.settings.get(MODULE_ID, "pinColor");
|
||||
if (pinSetting === "none") {
|
||||
if (this.pinSprite) {
|
||||
this.removeChild(this.pinSprite);
|
||||
this.pinSprite.destroy();
|
||||
this.pinSprite = null;
|
||||
}
|
||||
} else {
|
||||
if (!this.pinSprite) {
|
||||
this.pinSprite = new PIXI.Sprite();
|
||||
this.addChild(this.pinSprite);
|
||||
}
|
||||
let pinColor = noteData.pinColor;
|
||||
if (!pinColor) {
|
||||
pinColor = (pinSetting === "random")
|
||||
? PIN_COLORS[Math.floor(Math.random() * PIN_COLORS.length)]
|
||||
: `${pinSetting}Pin.webp`;
|
||||
if (this.document.isOwner) {
|
||||
await this.document.update({ [`flags.${MODULE_ID}.pinColor`]: pinColor });
|
||||
}
|
||||
}
|
||||
const pinImage = `modules/investigation-board/assets/${pinColor}`;
|
||||
try {
|
||||
this.pinSprite.texture = PIXI.Texture.from(pinImage);
|
||||
} catch (err) {
|
||||
console.error(`Failed to load pin texture: ${pinImage}`, err);
|
||||
this.pinSprite.texture = PIXI.Texture.EMPTY;
|
||||
}
|
||||
this.pinSprite.width = 40;
|
||||
this.pinSprite.height = 40;
|
||||
this.pinSprite.position.set(fullWidth / 2 - 20, 3);
|
||||
}
|
||||
return; // End early for futuristic photo notes.
|
||||
}
|
||||
|
||||
// STANDARD LAYOUT (Modern photo notes, sticky, index, etc.)
|
||||
const width = isPhoto
|
||||
? game.settings.get(MODULE_ID, "photoNoteWidth")
|
||||
: isIndex
|
||||
? game.settings.get(MODULE_ID, "indexNoteWidth") || 600
|
||||
: game.settings.get(MODULE_ID, "stickyNoteWidth");
|
||||
|
||||
const height = isPhoto
|
||||
? Math.round(width / (225 / 290))
|
||||
: isIndex
|
||||
? Math.round(width / (600 / 400))
|
||||
: width;
|
||||
|
||||
// Background Image based on board mode.
|
||||
const getBackgroundImage = (noteType, mode) => {
|
||||
if (mode === "futuristic") {
|
||||
if (noteType === "photo") return "modules/investigation-board/assets/futuristic_photoFrame.webp";
|
||||
if (noteType === "index") return "modules/investigation-board/assets/futuristic_note_index.webp";
|
||||
return "modules/investigation-board/assets/futuristic_note_white.webp";
|
||||
} else if (mode === "custom") {
|
||||
if (noteType === "photo") return "modules/investigation-board/assets/custom_photoFrame.webp";
|
||||
if (noteType === "index") return "modules/investigation-board/assets/custom_note_index.webp";
|
||||
return "modules/investigation-board/assets/custom_note_white.webp";
|
||||
}
|
||||
// Default "modern" mode:
|
||||
if (noteType === "photo") return "modules/investigation-board/assets/photoFrame.webp";
|
||||
if (noteType === "index") return "modules/investigation-board/assets/note_index.webp";
|
||||
return "modules/investigation-board/assets/note_white.webp";
|
||||
};
|
||||
const bgImage = getBackgroundImage(noteData.type, mode);
|
||||
|
||||
if (!this.bgSprite) {
|
||||
this.bgSprite = new PIXI.Sprite();
|
||||
this.addChild(this.bgSprite);
|
||||
}
|
||||
try {
|
||||
this.bgSprite.texture = PIXI.Texture.from(bgImage);
|
||||
} catch (err) {
|
||||
console.error(`Failed to load background texture: ${bgImage}`, err);
|
||||
this.bgSprite.texture = PIXI.Texture.EMPTY;
|
||||
}
|
||||
this.bgSprite.width = width;
|
||||
this.bgSprite.height = height;
|
||||
|
||||
// --- Foreground (User-Assigned) Photo for Modern Mode ---
|
||||
// (This is the code missing from your current version.)
|
||||
if (isPhoto) {
|
||||
const fgImage = noteData.image || "modules/investigation-board/assets/placeholder.webp";
|
||||
if (!this.photoImageSprite) {
|
||||
this.photoImageSprite = new PIXI.Sprite();
|
||||
this.addChild(this.photoImageSprite);
|
||||
}
|
||||
try {
|
||||
this.photoImageSprite.texture = PIXI.Texture.from(fgImage);
|
||||
} catch (err) {
|
||||
console.error(`Failed to load foreground texture: ${fgImage}`, err);
|
||||
this.photoImageSprite.texture = PIXI.Texture.EMPTY;
|
||||
}
|
||||
// Use offsets similar to your old code.
|
||||
const widthOffset = width * 0.13333;
|
||||
const heightOffset = height * 0.30246;
|
||||
this.photoImageSprite.width = width - widthOffset;
|
||||
this.photoImageSprite.height = height - heightOffset;
|
||||
this.photoImageSprite.position.set(widthOffset / 2, heightOffset / 2);
|
||||
this.photoImageSprite.visible = true;
|
||||
} else if (this.photoImageSprite) {
|
||||
this.photoImageSprite.visible = false;
|
||||
}
|
||||
|
||||
// --- Pin Handling (Standard) ---
|
||||
{
|
||||
const pinSetting = game.settings.get(MODULE_ID, "pinColor");
|
||||
if (pinSetting === "none") {
|
||||
if (this.pinSprite) {
|
||||
this.removeChild(this.pinSprite);
|
||||
this.pinSprite.destroy();
|
||||
this.pinSprite = null;
|
||||
}
|
||||
} else {
|
||||
if (!this.pinSprite) {
|
||||
this.pinSprite = new PIXI.Sprite();
|
||||
this.addChild(this.pinSprite);
|
||||
}
|
||||
let pinColor = noteData.pinColor;
|
||||
if (!pinColor) {
|
||||
pinColor = (pinSetting === "random")
|
||||
? PIN_COLORS[Math.floor(Math.random() * PIN_COLORS.length)]
|
||||
: `${pinSetting}Pin.webp`;
|
||||
if (this.document.isOwner) {
|
||||
await this.document.update({ [`flags.${MODULE_ID}.pinColor`]: pinColor });
|
||||
}
|
||||
}
|
||||
const pinImage = `modules/investigation-board/assets/${pinColor}`;
|
||||
try {
|
||||
this.pinSprite.texture = PIXI.Texture.from(pinImage);
|
||||
} catch (err) {
|
||||
console.error(`Failed to load pin texture: ${pinImage}`, err);
|
||||
this.pinSprite.texture = PIXI.Texture.EMPTY;
|
||||
}
|
||||
this.pinSprite.width = 40;
|
||||
this.pinSprite.height = 40;
|
||||
this.pinSprite.position.set(width / 2 - 20, 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Default text layout for non-futuristic notes.
|
||||
const font = game.settings.get(MODULE_ID, "font");
|
||||
const baseFontSize = game.settings.get(MODULE_ID, "baseFontSize");
|
||||
const fontSize = (width / 200) * baseFontSize;
|
||||
const textStyle = new PIXI.TextStyle({
|
||||
fontFamily: font,
|
||||
fontSize: fontSize,
|
||||
fill: "#000000",
|
||||
wordWrap: true,
|
||||
wordWrapWidth: width - 15,
|
||||
align: "center",
|
||||
});
|
||||
const truncatedText = this._truncateText(noteData.text || "Default Text", font, noteData.type, fontSize);
|
||||
if (!this.noteText) {
|
||||
this.noteText = new PIXI.Text(truncatedText, textStyle);
|
||||
this.noteText.anchor.set(0.5);
|
||||
this.addChild(this.noteText);
|
||||
} else {
|
||||
this.noteText.style = textStyle;
|
||||
this.noteText.text = truncatedText;
|
||||
}
|
||||
this.noteText.position.set(width / 2, isPhoto ? height - 25 : height / 2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
_truncateText(text, font, noteType, currentFontSize) {
|
||||
const limits = getDynamicCharacterLimits(font, currentFontSize);
|
||||
const charLimit = limits[noteType] || 100;
|
||||
return text.length <= charLimit ? text : text.slice(0, charLimit).trim() + "...";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function createNote(noteType) {
|
||||
const scene = canvas.scene;
|
||||
if (!scene) {
|
||||
console.error("Cannot create note: No active scene.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Retrieve width settings (or use defaults)
|
||||
const stickyW = game.settings.get(MODULE_ID, "stickyNoteWidth") || 200;
|
||||
const photoW = game.settings.get(MODULE_ID, "photoNoteWidth") || 225;
|
||||
const indexW = game.settings.get(MODULE_ID, "indexNoteWidth") || 600;
|
||||
|
||||
const width = noteType === "photo" ? photoW
|
||||
: noteType === "index" ? indexW
|
||||
: stickyW;
|
||||
const height = noteType === "photo" ? Math.round(photoW / (225 / 290))
|
||||
: noteType === "index" ? Math.round(indexW / (600 / 400))
|
||||
: stickyW;
|
||||
|
||||
const dims = canvas.dimensions;
|
||||
const x = dims.width / 2;
|
||||
const y = dims.height / 2;
|
||||
|
||||
// Get default text from settings (fallback if missing)
|
||||
const defaultText = game.settings.get(MODULE_ID, `${noteType}NoteDefaultText`) || "Notes";
|
||||
|
||||
// Determine board mode and include identityName if note is a futuristic photo note
|
||||
const boardMode = game.settings.get(MODULE_ID, "boardMode");
|
||||
const extraFlags = {};
|
||||
if (noteType === "photo" && boardMode === "futuristic") {
|
||||
extraFlags.identityName = "";
|
||||
}
|
||||
|
||||
await canvas.scene.createEmbeddedDocuments("Drawing", [
|
||||
{
|
||||
type: "r",
|
||||
author: game.user.id,
|
||||
x,
|
||||
y,
|
||||
shape: { width, height },
|
||||
fillColor: "#ffffff",
|
||||
fillAlpha: 1,
|
||||
strokeColor: "transparent",
|
||||
strokeAlpha: 0,
|
||||
locked: false,
|
||||
flags: {
|
||||
[MODULE_ID]: {
|
||||
type: noteType,
|
||||
text: defaultText,
|
||||
...extraFlags
|
||||
},
|
||||
},
|
||||
"flags.core.sheetClass": "investigation-board.CustomDrawingSheet",
|
||||
"ownership": { default: 3 },
|
||||
},
|
||||
]);
|
||||
|
||||
canvas.drawings.activate();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Hooks.on("getSceneControlButtons", (controls) => {
|
||||
const journalControls = Array.isArray(controls) ? controls.find((c) => c.name === "notes") : (controls["notes"] ?? controls.notes);
|
||||
if (!journalControls) return;
|
||||
|
||||
journalControls.tools.push(
|
||||
{ name: "createStickyNote", title: "Create Sticky Note", icon: "fa-solid fa-note-sticky", onChange: (ev, active) => { if (active) createNote("sticky"); }, button: true },
|
||||
{ name: "createPhotoNote", title: "Create Photo Note", icon: "fa-solid fa-camera-polaroid", onChange: (ev, active) => { if (active) createNote("photo"); }, button: true },
|
||||
{ name: "createIndexCard", title: "Create Index Card", icon: "fa-regular fa-rectangle-list", onChange: (ev, active) => { if (active) createNote("index"); }, button: true }
|
||||
);
|
||||
});
|
||||
|
||||
Hooks.once("init", () => {
|
||||
registerSettings();
|
||||
CONFIG.Drawing.objectClass = CustomDrawing;
|
||||
|
||||
DocumentSheetConfig.registerSheet(DrawingDocument, "investigation-board", CustomDrawingSheet, {
|
||||
label: "Note Drawing Sheet",
|
||||
types: ["base"],
|
||||
makeDefault: false,
|
||||
});
|
||||
|
||||
console.log("Investigation Board module initialized.");
|
||||
});
|
||||
|
||||
|
||||
export { CustomDrawing, CustomDrawingSheet };
|
||||
@@ -0,0 +1,167 @@
|
||||
export const MODULE_ID = "investigation-board";
|
||||
|
||||
export const registerSettings = function() {
|
||||
|
||||
const refreshAllDrawings = () => {
|
||||
if (canvas.drawings) {
|
||||
canvas.drawings.placeables.forEach(drawing => {
|
||||
if (drawing.document.flags[MODULE_ID]) {
|
||||
drawing.refresh();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Update the pinColor setting to include a "No Pins" option.
|
||||
game.settings.register(MODULE_ID, "pinColor", {
|
||||
name: "Pin Color",
|
||||
hint: "Choose the color of the pin for notes. Selecting 'Random' will randomly assign a pin color. Select 'No Pins' to disable pin display.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: String,
|
||||
choices: {
|
||||
random: "Random",
|
||||
red: "Red",
|
||||
blue: "Blue",
|
||||
yellow: "Yellow",
|
||||
green: "Green",
|
||||
none: "No Pins"
|
||||
},
|
||||
default: "random",
|
||||
onChange: () => {
|
||||
if (canvas.drawings) {
|
||||
canvas.drawings.placeables.forEach(drawing => drawing.refresh());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Register a new setting for board mode selection.
|
||||
game.settings.register(MODULE_ID, "boardMode", {
|
||||
name: "Board Mode",
|
||||
hint: "Select the board mode to change the styling of notes.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: String,
|
||||
choices: {
|
||||
modern: "Modern",
|
||||
futuristic: "Futuristic",
|
||||
custom: "Custom"
|
||||
},
|
||||
default: "modern",
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
|
||||
// Register existing settings
|
||||
game.settings.register(MODULE_ID, "stickyNoteWidth", {
|
||||
name: "Sticky Note Width",
|
||||
hint: "The width (in pixels) for all newly created sticky notes (default: 200).",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: Number,
|
||||
default: 200,
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "photoNoteWidth", {
|
||||
name: "Photo Note Width",
|
||||
hint: "The width (in pixels) for all newly created photo notes (default: 225).",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: Number,
|
||||
default: 225,
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "indexNoteWidth", {
|
||||
name: "Index Note Width",
|
||||
hint: "The width (in pixels) for all newly created index cards (default: 600).",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: Number,
|
||||
default: 600,
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "baseFontSize", {
|
||||
name: "Base Font Size",
|
||||
hint: "The font size (in pixels) for text when the note width is at its default size (default: 16).",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: Number,
|
||||
default: 16,
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "font", {
|
||||
name: "Font",
|
||||
hint: "Choose the font to be used in notes.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: String,
|
||||
choices: {
|
||||
"Rock Salt": "Rock Salt",
|
||||
"Courier New": "Courier New",
|
||||
"Times New Roman": "Times New Roman",
|
||||
"Signika": "Signika",
|
||||
"Arial": "Arial"
|
||||
},
|
||||
default: "Rock Salt",
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "characterNameKey", {
|
||||
name: "Character Name Key",
|
||||
hint: "Specify the key path to retrieve the name (e.g., 'prototypeToken.name' or 'system.alias' for Blades in the Dark). If empty, defaults to 'name'.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: "prototypeToken.name",
|
||||
type: String,
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "stickyNoteDefaultText", {
|
||||
name: "Default Sticky Note Text",
|
||||
hint: "The default text to use for new sticky notes.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: String,
|
||||
default: "Clue",
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "photoNoteDefaultText", {
|
||||
name: "Default Photo Note Text",
|
||||
hint: "The default text to use for new photo notes.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: String,
|
||||
default: "Suspect/Place",
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
game.settings.register(MODULE_ID, "indexNoteDefaultText", {
|
||||
name: "Default Index Note Text",
|
||||
hint: "The default text to use for new index notes.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: String,
|
||||
default: "Notes",
|
||||
onChange: () => refreshAllDrawings()
|
||||
});
|
||||
|
||||
// Register base font size and character limits
|
||||
game.settings.register(MODULE_ID, "baseCharacterLimits", {
|
||||
name: "Base Character Limits",
|
||||
hint: "The base character limits for each font and note type. Edit this JSON to customize.",
|
||||
scope: "world",
|
||||
config: false, // Hidden from the settings UI
|
||||
type: Object,
|
||||
default: {
|
||||
"Rock Salt": { sticky: 90, photo: 20, index: 210 },
|
||||
"Courier New": { sticky: 250, photo: 30, index: 580 },
|
||||
"Times New Roman": { sticky: 200, photo: 30, index: 800 },
|
||||
"Signika": { sticky: 200, photo: 30, index: 650 },
|
||||
"Arial": { sticky: 200, photo: 30, index: 650 }
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,134 @@
|
||||
@font-face {
|
||||
font-family: 'Rock Salt';
|
||||
src: url('../assets/fonts/rock_salt.ttf') format('ttf');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.custom-drawing-text {
|
||||
font-family: 'Rock Salt', Arial, sans-serif;
|
||||
color: #000000; /* Black text */
|
||||
}
|
||||
|
||||
.sticky-note {
|
||||
background-image: url("modules/investigation-board/assets/note_white.webp");
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.photo-note {
|
||||
background-image: url("modules/investigation-board/assets/photoFrame.webp");
|
||||
width: 250px;
|
||||
height: 310px;
|
||||
}
|
||||
|
||||
/* EDIT FORM */
|
||||
/*
|
||||
.note-config-wrapper {
|
||||
position: relative;
|
||||
width: 400px;
|
||||
min-height: 310px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
box-shadow: 0 0 10px rgba(0,0,0,0.5);
|
||||
border: none;
|
||||
}
|
||||
|
||||
.note-config-wrapper.sticky-mode {
|
||||
background-image: url("../assets/note_white.webp");
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
.note-config-wrapper.photo-mode {
|
||||
background-image: url("../assets/photoFrame.webp");
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.note-config-wrapper .window-content {
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.note-config-wrapper form {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.note-type-group {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.note-text-group {
|
||||
position: absolute;
|
||||
left: 20px;
|
||||
width: 360px;
|
||||
}
|
||||
|
||||
.note-config-wrapper.sticky-mode .note-text-group {
|
||||
top: 100px;
|
||||
}
|
||||
|
||||
.note-config-wrapper.photo-mode .note-text-group {
|
||||
top: 220px;
|
||||
}
|
||||
|
||||
.note-image-group {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
right: 20px;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.note-save-group {
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
.note-config-wrapper input,
|
||||
.note-config-wrapper textarea,
|
||||
.note-config-wrapper select {
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 2px;
|
||||
padding: 4px;
|
||||
font-size: 14px;
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
|
||||
.note-config-wrapper label {
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 3px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.file-picker-button {
|
||||
margin-left: 5px;
|
||||
background: #eee;
|
||||
border: 1px solid #ccc;
|
||||
padding: 2px 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.save-button {
|
||||
background: #3f51b5;
|
||||
color: #fff;
|
||||
border: none;
|
||||
padding: 5px 10px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.save-button i {
|
||||
margin-right: 5px;
|
||||
} */
|
||||
@@ -0,0 +1,37 @@
|
||||
<form>
|
||||
<div class="form-group">
|
||||
<label for="text">Note Text:</label>
|
||||
<textarea name="text" rows="4">{{text}}</textarea>
|
||||
</div>
|
||||
|
||||
{{!-- Only show the Image Path field for photo notes --}}
|
||||
{{#if (eq noteType "photo")}}
|
||||
<div class="form-group" style="display: block;">
|
||||
<label for="image">Image Path:</label>
|
||||
<div class="file-picker">
|
||||
<input type="text" name="image" value="{{image}}" placeholder="Enter image path" readonly />
|
||||
<button type="button" class="file-picker-button">
|
||||
<i class="fas fa-folder-open"></i> Browse
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="form-group" style="display: none;"></div>
|
||||
{{/if}}
|
||||
|
||||
{{!-- If boardMode is futuristic and noteType is photo, show the extra Identity Name field --}}
|
||||
{{#if (eq noteType "photo")}}
|
||||
{{#if (eq boardMode "futuristic")}}
|
||||
<div class="form-group" style="display: block;">
|
||||
<label for="identityName">Identity Name:</label>
|
||||
<input type="text" name="identityName" value="{{identityName}}" placeholder="Enter identity name" />
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group">
|
||||
<button type="submit" class="save-button">
|
||||
<i class="fas fa-save"></i> Save
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -0,0 +1 @@
|
||||
0.2
|
||||
@@ -0,0 +1,7 @@
|
||||
# Zależności vtt_work — wyłącznie dla help_scripts/sound.py (generator dźwięków).
|
||||
# Pozostałe skrypty Foundry używają czystego stdlib.
|
||||
numpy==2.3.3
|
||||
scipy==1.16.2
|
||||
soundfile==0.13.1
|
||||
cffi==2.0.0
|
||||
pycparser==2.23
|
||||
@@ -0,0 +1 @@
|
||||
0.4
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"id": "gk-greyknight",
|
||||
"title": "Grey Knights — Compendium (Wrath & Glory)",
|
||||
"version": "0.6.5.3",
|
||||
"compatibility": {
|
||||
"minimum": "11",
|
||||
"verified": "13"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "User & Assistant"
|
||||
}
|
||||
],
|
||||
"systems": [
|
||||
"wrath-and-glory"
|
||||
],
|
||||
"packs": [
|
||||
{
|
||||
"name": "gk-items",
|
||||
"label": "Grey Knights — Items",
|
||||
"path": "packs/gk-items",
|
||||
"type": "Item",
|
||||
"system": "wrath-and-glory",
|
||||
"private": false
|
||||
}
|
||||
],
|
||||
"esmodules": [
|
||||
"scripts/auto-loadout.js",
|
||||
"scripts/helpers.js",
|
||||
"scripts/ui-gkpanel.js"
|
||||
],
|
||||
"readme": "README.txt"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
// gk-greyknight — auto-attach loadout (scoped + incognito + ORDO) v0.6.1
|
||||
Hooks.once("ready", () => {
|
||||
const PACK_KEY = "gk-greyknight.gk-items";
|
||||
const PACK_SRC_PREFIX = `Compendium.${PACK_KEY}.`;
|
||||
const CORE = {
|
||||
knife: "Compendium.wng-core.items.Item.4QVBQYWXXLyvFWkj",
|
||||
pistol: "Compendium.wng-core.items.Item.7b2xcPWBB7up65PM",
|
||||
ordo: "Compendium.wng-core.items.Item.mpcvHYlffwcBy9gP"
|
||||
};
|
||||
const ITEMS = {
|
||||
ability: "Aegis of Titan (Ability)",
|
||||
nemesis: "Nemesis Force Halberd",
|
||||
storm: "Grey Knight Armour Integrated Storm Bolter",
|
||||
aegisPA: "Aegis Power Armour",
|
||||
aegisTerm: "Terminator Aegis (Grey Knights)",
|
||||
pilgrim: "Pilgrim Astartes Power Armor",
|
||||
ordo: "ORDO MALLEUS"
|
||||
};
|
||||
const FLAG_SCOPE = "gk-greyknight"; const FLAG_DONE = "autoLoadoutDone";
|
||||
|
||||
async function fetchFromCompendium(name) {
|
||||
const pack = game.packs.get(PACK_KEY);
|
||||
if (!pack) return null;
|
||||
const index = await pack.getIndex();
|
||||
const hit = index.find(e => e.name === name);
|
||||
if (!hit) return null;
|
||||
const doc = await pack.getDocument(hit._id);
|
||||
return doc?.toObject();
|
||||
}
|
||||
async function fetchFromUuid(uuid) { try { const doc = await fromUuid(uuid); return doc?.toObject(); } catch(e){ return null; } }
|
||||
async function ensureOnActor(actor, srcDoc, equip=false) {
|
||||
const name = srcDoc?.name; if (!name) return null;
|
||||
let have = actor.items.getName(name);
|
||||
if (have) { if (typeof have.system?.equipped !== "undefined") await have.update({"system.equipped": !!equip}); return have; }
|
||||
if (equip && srcDoc.system && typeof srcDoc.system.equipped !== "undefined") srcDoc.system.equipped = true;
|
||||
const [created] = await actor.createEmbeddedDocuments("Item", [srcDoc]);
|
||||
return created;
|
||||
}
|
||||
async function ensureByName(actor, name, equip=false) {
|
||||
const have = actor.items.getName(name);
|
||||
if (have) { if (typeof have.system?.equipped !== "undefined") await have.update({"system.equipped": !!equip}); return have; }
|
||||
let src = await fetchFromCompendium(name);
|
||||
if (!src) { const world = game.items.getName(name); if (world) src = world.toObject(); }
|
||||
if (!src) return null;
|
||||
return ensureOnActor(actor, src, equip);
|
||||
}
|
||||
async function setEquipped(actor, name, on) {
|
||||
const it = actor.items.getName(name);
|
||||
if (it && typeof it.system?.equipped !== "undefined") await it.update({"system.equipped": !!on});
|
||||
}
|
||||
|
||||
if (window._gkAutoLoadoutHookId) { Hooks.off("createItem", window._gkAutoLoadoutHookId); window._gkAutoLoadoutHookId = null; }
|
||||
|
||||
window._gkAutoLoadoutHookId = Hooks.on("createItem", async (item, opts, userId) => {
|
||||
try {
|
||||
if (item?.type !== "archetype") return;
|
||||
const src = item?.flags?.core?.sourceId || "";
|
||||
const isFromOurPack = src.startsWith(PACK_SRC_PREFIX);
|
||||
const isOurGKByName = item?.name === "Grey Knight (Archetype)";
|
||||
if (!isFromOurPack && !isOurGKByName) return;
|
||||
if (game.userId !== userId) return;
|
||||
const actor = item.parent; if (!actor) return;
|
||||
if (actor.getFlag(FLAG_SCOPE, FLAG_DONE)) return;
|
||||
await actor.setFlag(FLAG_SCOPE, FLAG_DONE, true);
|
||||
|
||||
await ensureByName(actor, ITEMS.ability, false);
|
||||
await ensureByName(actor, "Brotherhood of Psykers", false);
|
||||
let ordoDoc = await fetchFromUuid(CORE.ordo);
|
||||
if (!ordoDoc) ordoDoc = await fetchFromCompendium(ITEMS.ordo);
|
||||
if (ordoDoc) await ensureOnActor(actor, ordoDoc, false);
|
||||
|
||||
const content = `
|
||||
<style>
|
||||
.gk-choices .opt{display:flex;gap:.6rem;align-items:flex-start;padding:.35rem .5rem;border:1px solid #6663;border-radius:6px;margin:.35rem 0}
|
||||
.gk-choices .opt label{font-weight:600}
|
||||
.gk-choices .hint{font-size:.9em;opacity:.85;margin-left:1.7rem}
|
||||
</style>
|
||||
<div class="gk-choices">
|
||||
<div class="opt">
|
||||
<input type="radio" name="mode" value="incog" id="gk-incog">
|
||||
<label for="gk-incog">Incognito — Pilgrim Astartes Power Armor + Combat Knife + Bolt Pistol</label>
|
||||
</div>
|
||||
<div class="hint">Low‑profile loadout (bez Nemesis/SB)</div>
|
||||
<div class="opt">
|
||||
<input type="radio" name="mode" value="war" id="gk-war" checked>
|
||||
<label for="gk-war">War‑Plate — Aegis Power Armour</label>
|
||||
</div>
|
||||
<div class="hint">Aegis PA + Nemesis + Integrated Storm Bolter</div>
|
||||
<div class="opt">
|
||||
<input type="radio" name="mode" value="term" id="gk-term">
|
||||
<label for="gk-term">Terminator — Terminator Aegis</label>
|
||||
</div>
|
||||
<div class="hint">Terminator Aegis + Nemesis + Integrated Storm Bolter</div>
|
||||
</div>`;
|
||||
|
||||
const choice = await new Promise(resolve => {
|
||||
new Dialog({ title: "Grey Knight — Wybierz Loadout",
|
||||
content,
|
||||
buttons: {
|
||||
ok: {label: "Zastosuj", icon:"<i class='fas fa-check'></i>", callback: html => resolve(html.find('input[name=\"mode\"]:checked').val() || "war")},
|
||||
cancel: {label:"Anuluj", callback: ()=>resolve(null)}
|
||||
}, default: "ok"
|
||||
}).render(true);
|
||||
});
|
||||
if (!choice) return;
|
||||
|
||||
await setEquipped(actor, ITEMS.aegisPA, false);
|
||||
await setEquipped(actor, ITEMS.aegisTerm, false);
|
||||
await setEquipped(actor, ITEMS.nemesis, false);
|
||||
await setEquipped(actor, ITEMS.storm, false);
|
||||
await setEquipped(actor, ITEMS.pilgrim, false);
|
||||
|
||||
if (choice === "incog") {
|
||||
await ensureByName(actor, ITEMS.pilgrim, true);
|
||||
const knife = await fetchFromUuid(CORE.knife); if (knife) await ensureOnActor(actor, knife, true);
|
||||
const pistol = await fetchFromUuid(CORE.pistol); if (pistol) await ensureOnActor(actor, pistol, true);
|
||||
} else if (choice === "war") {
|
||||
await ensureByName(actor, ITEMS.nemesis, true);
|
||||
await ensureByName(actor, ITEMS.storm, true);
|
||||
await ensureByName(actor, ITEMS.aegisPA, true);
|
||||
} else if (choice === "term") {
|
||||
await ensureByName(actor, ITEMS.nemesis, true);
|
||||
await ensureByName(actor, ITEMS.storm, true);
|
||||
await ensureByName(actor, ITEMS.aegisTerm, true);
|
||||
}
|
||||
|
||||
const abil = actor.items.getName(ITEMS.ability);
|
||||
const anyAegisOn = !!actor.items.find(i => ["armour","armor"].includes(i.type) && /Aegis/.test(i.name) && i.system?.equipped);
|
||||
if (abil?.effects?.length) for (const ef of abil.effects) if (ef.name?.toLowerCase().includes("synergy")) await ef.update({disabled: !anyAegisOn});
|
||||
|
||||
ui.notifications.info(`GK loadout: ${choice.toUpperCase()} ustawiony.`);
|
||||
} catch (e) { console.error("gk-greyknight auto-loadout error:", e); }
|
||||
});
|
||||
|
||||
console.log("gk-greyknight: auto-loadout hook active (v0.6.1)");
|
||||
});
|
||||
@@ -0,0 +1,34 @@
|
||||
// GK – Aegis Glow Toggle (module)
|
||||
(async () => {
|
||||
const tok = canvas.tokens.controlled[0] ?? null;
|
||||
const actor = tok?.actor ?? game.user.character;
|
||||
const token = tok ?? canvas.tokens.placeables.find(t => t.actor?.id === actor?.id);
|
||||
if (!actor || !token) return ui.notifications.warn("Wybierz token lub przypisz postać do użytkownika.");
|
||||
|
||||
const aegisArm = actor.items.find(i => ["armour","armor"].includes(i.type) && /Aegis/.test(i.name));
|
||||
if (!aegisArm) return ui.notifications.warn("Nie znaleziono Aegis armour na postaci.");
|
||||
const eff = aegisArm.effects.find(e => e.name?.toLowerCase().startsWith("aegis warding runes"));
|
||||
if (!eff) return ui.notifications.warn("Nie znaleziono efektu toggle na Aegis armour.");
|
||||
const wasDisabled = eff.disabled ?? true;
|
||||
await eff.update({ disabled: !wasDisabled });
|
||||
|
||||
const FLAG_SCOPE = "wng-gk"; const FLAG_KEY = "prevLight";
|
||||
const setGlowOn = async () => {
|
||||
const prev = token.document.getFlag(FLAG_SCOPE, FLAG_KEY);
|
||||
if (!prev) await token.document.setFlag(FLAG_SCOPE, FLAG_KEY, foundry.utils.deepClone(token.document.light));
|
||||
await token.document.update({
|
||||
light: { color:"#66ccff", coloration:2, alpha:0.7, dim:16, bright:0, angle:360,
|
||||
luminosity:0.5, attenuation:0.35, saturation:0, contrast:0, shadows:0,
|
||||
animation:{ type:"pulse", speed:3, intensity:4, reverse:false } }
|
||||
});
|
||||
await canvas.perception.update({ lighting: { refresh: true } });
|
||||
};
|
||||
const setGlowOff = async () => {
|
||||
const prev = token.document.getFlag(FLAG_SCOPE, FLAG_KEY);
|
||||
if (prev) { await token.document.update({ light: prev }); await token.document.unsetFlag(FLAG_SCOPE, FLAG_KEY); }
|
||||
else { await token.document.update({ light: { dim:0, bright:0, color:null } }); }
|
||||
await canvas.perception.update({ lighting: { refresh: true } });
|
||||
};
|
||||
if (wasDisabled) { await setGlowOn(); ChatMessage.create({ content: `<b>Aegis:</b> Warding Runes <span style="color:#66ccff">ENGAGED</span>. (Akcja)` }); }
|
||||
else { await setGlowOff(); ChatMessage.create({ content: `<b>Aegis:</b> Warding Runes DISENGAGED.` }); }
|
||||
})();
|
||||
@@ -0,0 +1,113 @@
|
||||
// gk-greyknight helpers.js — consolidated 0.6.4.6
|
||||
// Zawiera: Brotherhood prompt + starter, powiadomienie (także poza walką), sheet summary,
|
||||
// mini-widżet, oraz patcher traitów (Psycannon/Psilencer -> force).
|
||||
|
||||
/* ---------------- Utilities ---------------- */
|
||||
const GK_DEBUG = false;
|
||||
const FLAG_SCOPE = "gk-greyknight";
|
||||
|
||||
async function findItemInAllPacksByName(name, type=null) {
|
||||
for (const pack of game.packs) {
|
||||
if (pack.documentName !== "Item") continue;
|
||||
const idx = await pack.getIndex();
|
||||
const hit = idx.find(e => e.name === name && (!type || e.type === type));
|
||||
if (hit) return await pack.getDocument(hit._id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
async function ensureHasItemByName(actor, name, type=null) {
|
||||
const existing = actor.items?.find(i => i.name === name && (!type || i.type === type));
|
||||
if (existing) return existing;
|
||||
const doc = await findItemInAllPacksByName(name, type);
|
||||
if (!doc) return null;
|
||||
const data = doc.toObject(); delete data._id;
|
||||
const [created] = await actor.createEmbeddedDocuments("Item", [data]);
|
||||
return created;
|
||||
}
|
||||
async function promptDiscipline(actor) {
|
||||
const existing = await actor.getFlag(FLAG_SCOPE, "discipline");
|
||||
if (existing) return existing;
|
||||
return await new Promise(resolve => {
|
||||
new Dialog({
|
||||
title: "Brotherhood of Psykers — Choose Discipline",
|
||||
content: `<p>Select a discipline for this character:</p>
|
||||
<label style='display:block;margin-top:.5rem'><input type="radio" name="disc" value="sanctic" checked> Sanctic</label>
|
||||
<label style='display:block'><input type="radio" name="disc" value="librarius"> Librarius</label>`,
|
||||
buttons: {
|
||||
ok: { label: "Confirm", icon: "<i class='fas fa-check'></i>", callback: html => resolve(html.find('input[name="disc"]:checked').val() || "sanctic") },
|
||||
cancel: { label: "Cancel", callback: () => resolve(null) }
|
||||
},
|
||||
default: "ok"
|
||||
}).render(true);
|
||||
});
|
||||
}
|
||||
async function gkResolveActorFromMessage(doc) {
|
||||
const sp = doc.speaker || {};
|
||||
let actor = sp.actor ? game.actors?.get(sp.actor) : null;
|
||||
if (!actor && canvas?.tokens) {
|
||||
const t = (sp.token && canvas.tokens.get(sp.token)) || canvas.tokens.controlled?.[0] || null;
|
||||
actor = t?.actor || actor;
|
||||
}
|
||||
return actor;
|
||||
}
|
||||
async function gkIsPsychicMessage(doc) {
|
||||
try {
|
||||
const raw = `${doc.flavor || ""} ${TextEditor?.stripHTML(doc.content || "") || ""}`.toLowerCase();
|
||||
const keys = ["psychic","psychic mastery","psychic power","moc psioniczna","smite","hammerhand","sanctuary","shrouding","might of titan"];
|
||||
if (keys.some(k=>raw.includes(k))) return true;
|
||||
const flagsStr = JSON.stringify(doc.flags || {}).toLowerCase();
|
||||
if (flagsStr.includes("psychic")) return true;
|
||||
if (flagsStr.includes("psychicpower")) return true;
|
||||
if (flagsStr.includes("\"power\"")) return true;
|
||||
const tryUuids = [
|
||||
doc.getFlag?.("core","sourceId"),
|
||||
doc.getFlag?.("wng-core","itemUuid"),
|
||||
doc.flags?.document?.uuid,
|
||||
doc.flags?.uuid
|
||||
].filter(Boolean);
|
||||
for (const u of tryUuids) {
|
||||
try { const it = await fromUuid(u); if (it?.type === "psychicPower") return true; } catch(e){}
|
||||
}
|
||||
} catch(e) { if (GK_DEBUG) console.warn("gk IsPsychicMessage error:", e); }
|
||||
return false;
|
||||
}
|
||||
function gkBrotherhoodAlliesAndBonus(actor) {
|
||||
const tokens = canvas?.tokens?.placeables || [];
|
||||
const ids = new Set();
|
||||
for (const t of tokens) {
|
||||
const a = t.actor; if (!a) continue;
|
||||
const ok = a.items?.some(i => i.type === "ability" && i.name === "Brotherhood of Psykers");
|
||||
if (ok) ids.add(a.id);
|
||||
}
|
||||
const total = ids.size;
|
||||
const bonus = ids.has(actor?.id) ? Math.max(0, total - 1) : total;
|
||||
return { total, bonus };
|
||||
}
|
||||
|
||||
/* ---------------- 1) Brotherhood: prompt + starter ---------------- */
|
||||
Hooks.once("ready", () => {
|
||||
// Avoid duplicate hook if hot-reloaded
|
||||
if (window._gkBroCreateHookId) { Hooks.off("createItem", window._gkBroCreateHookId); window._gkBroCreateHookId = null; }
|
||||
window._gkBroCreateHookId = Hooks.on("createItem", async (item, opts, userId) => {
|
||||
try {
|
||||
if (game.userId !== userId) return;
|
||||
if (item?.type !== "ability" || item?.name !== "Brotherhood of Psykers") return;
|
||||
const actor = item.parent; if (!actor) return;
|
||||
const chosen = await promptDiscipline(actor);
|
||||
if (!chosen) return;
|
||||
await actor.setFlag(FLAG_SCOPE, "discipline", chosen);
|
||||
const psyker = await ensureHasItemByName(actor, "PSYKER", "keyword");
|
||||
if (!psyker) ui.notifications?.warn("PSYKER keyword not found in loaded packs. Add it manually from wng-core.");
|
||||
if (chosen === "sanctic") {
|
||||
const ok = await ensureHasItemByName(actor, "Hammerhand (Sanctic)", "psychicPower");
|
||||
if (!ok) ui.notifications?.warn("Couldn't auto-add Hammerhand (Sanctic). Drag a Sanctic power from the GK pack.");
|
||||
} else {
|
||||
const ok = await ensureHasItemByName(actor, "Smite", "psychicPower");
|
||||
if (!ok) {
|
||||
ui.notifications?.warn("Smite not found in available packs. Please add a Librarius power manually.");
|
||||
game.ui?.sidebar?.tabs?.compendium?.activate();
|
||||
}
|
||||
}
|
||||
} catch (e) { console.error("gk-greyknight — Brotherhood prompt:", e); }
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,201 @@
|
||||
// gk-greyknight — ui-gkpanel.js (0.6.5.2)
|
||||
|
||||
const GK_NS = "gk-greyknight";
|
||||
const GK_DEBUG = false;
|
||||
|
||||
/* ---------------- helpers ---------------- */
|
||||
function gkActorHasBrotherhood(actor) {
|
||||
return !!actor?.items?.some(i => i.type === "ability" && i.name === "Brotherhood of Psykers");
|
||||
}
|
||||
function gkAlliesAndBonus(actor) {
|
||||
const tokens = canvas?.tokens?.placeables || [];
|
||||
const ids = new Set();
|
||||
for (const t of tokens) {
|
||||
const a = t.actor; if (!a) continue;
|
||||
if (gkActorHasBrotherhood(a)) ids.add(a.id);
|
||||
}
|
||||
const total = ids.size;
|
||||
const bonus = ids.has(actor?.id) ? Math.max(0, total - 1) : total;
|
||||
return { total, bonus };
|
||||
}
|
||||
|
||||
/* ---------------- settings (per-user) ---------------- */
|
||||
Hooks.once("init", () => {
|
||||
game.settings.register(GK_NS, "panelVisible", {
|
||||
name: "Brotherhood panel visible",
|
||||
hint: "Show the Brotherhood Focus panel by default.",
|
||||
scope: "client", config: true, type: Boolean, default: true,
|
||||
onChange: (v) => { v ? GKFocusPanel.show(true) : GKFocusPanel.hide(); }
|
||||
});
|
||||
game.settings.register(GK_NS, "panelAutoOpen", {
|
||||
name: "Auto-open when eligible",
|
||||
hint: "Auto-open the panel when your selected actor (or controlled token) has Brotherhood of Psykers.",
|
||||
scope: "client", config: true, type: Boolean, default: true,
|
||||
onChange: () => GKFocusPanel.render()
|
||||
});
|
||||
});
|
||||
|
||||
// v13: dodatkowy hook na zmiany ustawień po stronie klienta
|
||||
Hooks.on?.("clientSettingChanged", (key, value) => {
|
||||
if (key === `${GK_NS}.panelVisible`) return value ? GKFocusPanel.show(true) : GKFocusPanel.hide();
|
||||
if (key === `${GK_NS}.panelAutoOpen`) return GKFocusPanel.render();
|
||||
});
|
||||
|
||||
/* ---------------- panel ---------------- */
|
||||
class GKFocusPanel {
|
||||
static async getState() {
|
||||
return (await game.user.getFlag(GK_NS, "focusPanel")) || {};
|
||||
}
|
||||
static async saveState(patch) {
|
||||
const cur = await this.getState();
|
||||
return game.user.setFlag(GK_NS, "focusPanel", { ...cur, ...patch });
|
||||
}
|
||||
static async isVisible() {
|
||||
const v = game.settings.get(GK_NS, "panelVisible");
|
||||
const st = await this.getState();
|
||||
return v && !st.closed;
|
||||
}
|
||||
static async hide() {
|
||||
await this.saveState({ closed: true, forced: false });
|
||||
$("#gk-focus-panel").remove();
|
||||
}
|
||||
static async show(force = false) {
|
||||
await this.saveState({ closed: false, forced: !!force });
|
||||
this.render();
|
||||
}
|
||||
static async toggle() {
|
||||
const vis = await this.isVisible();
|
||||
if (vis) return this.hide();
|
||||
return this.show(true); // force-open nawet bez aktora GK
|
||||
}
|
||||
|
||||
static currentActor() {
|
||||
return game.user?.character || canvas.tokens?.controlled?.[0]?.actor || null;
|
||||
}
|
||||
|
||||
static async render() {
|
||||
const st = await this.getState();
|
||||
if (st.closed || !game.settings.get(GK_NS, "panelVisible")) { $("#gk-focus-panel").remove(); return; }
|
||||
|
||||
const actor = this.currentActor();
|
||||
if (!st.forced) {
|
||||
if (!actor) { $("#gk-focus-panel").remove(); return; }
|
||||
if (!gkActorHasBrotherhood(actor) && !game.settings.get(GK_NS, "panelAutoOpen")) {
|
||||
$("#gk-focus-panel").remove(); return;
|
||||
}
|
||||
}
|
||||
return this._renderInternal(actor);
|
||||
}
|
||||
|
||||
static async _renderInternal(actor) {
|
||||
const st = await this.getState();
|
||||
|
||||
const { total, bonus } = gkAlliesAndBonus(actor);
|
||||
const x = Number.isFinite(st.x) ? st.x : (window.innerWidth - 260);
|
||||
const y = Number.isFinite(st.y) ? st.y : (window.innerHeight - 120);
|
||||
const w = Number.isFinite(st.w) ? st.w : 260;
|
||||
const h = Number.isFinite(st.h) ? st.h : 110;
|
||||
|
||||
const root = $("#gk-focus-panel");
|
||||
const html = $(`
|
||||
<section id="gk-focus-panel" class="window-app"
|
||||
style="position:fixed; left:${x}px; top:${y}px;
|
||||
width:${w}px; height:${h}px; min-width:200px; min-height:80px;
|
||||
resize: both; overflow:auto; background:#111A; color:#fff;
|
||||
border:1px solid #444; border-radius:6px; z-index:70;">
|
||||
<header class="window-header" style="cursor:move; display:flex; align-items:center; gap:.5rem; padding:.25rem .5rem; border-bottom:1px solid #444;">
|
||||
<h4 class="window-title" style="margin:0; font-size:.95rem;">Brotherhood Focus</h4>
|
||||
<a class="gk-close header-button" style="margin-left:auto;" title="Close"><i class="fas fa-times"></i></a>
|
||||
</header>
|
||||
<section class="window-content" style="padding:.4rem .6rem;">
|
||||
<div><span style="opacity:.9">Allies</span>: <b>${total}</b> · <span style="opacity:.9">Bonus</span>: <b>+${bonus}</b></div>
|
||||
<div style="opacity:.85; font-size:.9em; margin-top:.25rem;">Only one linked GK should use a psychic power as their <em>Action</em> per round. Subsequent powers add +1 <em>Wrath</em> die.</div>
|
||||
</section>
|
||||
</section>`);
|
||||
|
||||
if (root.length) root.replaceWith(html); else $("body").append(html);
|
||||
|
||||
html.find(".gk-close").off("click").on("click", async () => {
|
||||
const left = parseInt(html.css("left")) || x;
|
||||
const top = parseInt(html.css("top")) || y;
|
||||
const ww = parseInt(html.outerWidth()) || w;
|
||||
const hh = parseInt(html.outerHeight()) || h;
|
||||
await this.saveState({ closed: true, forced: false, x:left, y:top, w:ww, h:hh });
|
||||
html.remove();
|
||||
});
|
||||
|
||||
const handle = html.find(".window-header");
|
||||
let dragging = false, ox = 0, oy = 0;
|
||||
function onMove(ev) {
|
||||
if (!dragging) return;
|
||||
const nx = Math.max(0, Math.min(window.innerWidth - html.outerWidth(), ev.clientX - ox));
|
||||
const ny = Math.max(0, Math.min(window.innerHeight - html.outerHeight(), ev.clientY - oy));
|
||||
html.css({ left: nx, top: ny });
|
||||
}
|
||||
async function onUp() {
|
||||
if (!dragging) return;
|
||||
dragging = false;
|
||||
$(window).off("pointermove.gkfp").off("pointerup.gkfp");
|
||||
const left = parseInt(html.css("left")) || 0;
|
||||
const top = parseInt(html.css("top")) || 0;
|
||||
const ww = parseInt(html.outerWidth()) || w;
|
||||
const hh = parseInt(html.outerHeight()) || h;
|
||||
await GKFocusPanel.saveState({ x:left, y:top, w:ww, h:hh });
|
||||
}
|
||||
handle.off("pointerdown.gkfp").on("pointerdown.gkfp", (ev) => {
|
||||
dragging = true;
|
||||
const r = html[0].getBoundingClientRect();
|
||||
ox = ev.clientX - r.left; oy = ev.clientY - r.top;
|
||||
$(window).on("pointermove.gkfp", onMove).on("pointerup.gkfp", onUp);
|
||||
});
|
||||
|
||||
$(window).off("pointerup.gkfp-size").on("pointerup.gkfp-size", async () => {
|
||||
if (!document.body.contains(html[0])) return;
|
||||
const ww = parseInt(html.outerWidth()) || w;
|
||||
const hh = parseInt(html.outerHeight()) || h;
|
||||
await GKFocusPanel.saveState({ w: ww, h: hh });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------- left toolbar button (v12 & v13) ---------------- */
|
||||
Hooks.on("getSceneControlButtons", (controls) => {
|
||||
// v12: controls = SceneControl[]
|
||||
if (Array.isArray(controls)) {
|
||||
const token = controls.find(c => c?.name === "token");
|
||||
if (!token) return;
|
||||
if (token.tools?.some?.(t => t?.name === "gk-toggle-focus")) return;
|
||||
token.tools.push({
|
||||
name: "gk-toggle-focus",
|
||||
title: "Toggle Brotherhood Focus Panel",
|
||||
icon: "fas fa-bolt",
|
||||
button: true,
|
||||
visible: true,
|
||||
order: 999,
|
||||
onClick: () => GKFocusPanel.toggle()
|
||||
});
|
||||
return;
|
||||
}
|
||||
// v13: controls = Record<string, SceneControl>; tools = Record<string, SceneControlTool>
|
||||
const token = controls?.token;
|
||||
if (!token) return;
|
||||
token.tools ??= {};
|
||||
if (!token.tools["gk-toggle-focus"]) {
|
||||
token.tools["gk-toggle-focus"] = {
|
||||
name: "gk-toggle-focus",
|
||||
title: "Toggle Brotherhood Focus Panel",
|
||||
icon: "fas fa-bolt",
|
||||
button: true,
|
||||
visible: true,
|
||||
order: 999,
|
||||
onClick: () => GKFocusPanel.toggle()
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
/* ---------------- reactive hooks ---------------- */
|
||||
Hooks.on("canvasReady", () => GKFocusPanel.render());
|
||||
Hooks.on("controlToken", () => GKFocusPanel.render());
|
||||
Hooks.on("updateCombat", () => GKFocusPanel.render());
|
||||
Hooks.on("createToken", () => GKFocusPanel.render());
|
||||
Hooks.on("deleteToken", () => GKFocusPanel.render());
|
||||
@@ -1,4 +1 @@
|
||||
# W&G Voidships — Builder
|
||||
|
||||
Import a Hull from the hulls compendium, then add Items from the Items compendium or use the macros.
|
||||
RollTables are provided by the separate module `wg-voidships-foundry`.
|
||||
|
||||
@@ -2,18 +2,64 @@
|
||||
"id": "wg-voidships-builder",
|
||||
"title": "Wrath & Glory: Voidships — Builder",
|
||||
"description": "Składanie okrętów jako Actorów przez dodawanie wyposażenia (gear) z kompendium.",
|
||||
"version": "1.4.8",
|
||||
"compatibility": { "minimum": "12", "verified": "13" },
|
||||
"authors": [{ "name": "Gizmo & GPT-5 Thinking" }],
|
||||
"esmodules": ["scripts/voidships.js"],
|
||||
"version": "1.4.13",
|
||||
"compatibility": {
|
||||
"minimum": "12",
|
||||
"verified": "13"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Gizmo & GPT-5 Thinking"
|
||||
}
|
||||
],
|
||||
"scripts": [
|
||||
"scripts/voidships.js",
|
||||
"scripts/voidship-actor.js"
|
||||
],
|
||||
"templates": [
|
||||
"templates/voidship-sheet.hbs"
|
||||
],
|
||||
"packs": [
|
||||
{ "label": "W&G Voidship Hulls (Empty)", "name": "wg-voidship-hulls", "path": "packs/wg-voidship-hulls.db", "type": "Actor", "system": "wrath-and-glory" },
|
||||
{ "label": "W&G Voidship Items", "name": "wg-voidship-items", "path": "packs/wg-voidship-items.db", "type": "Item", "system": "wrath-and-glory" },
|
||||
{ "label": "W&G Voidships — Tables", "name": "wg-voidships-tables", "path": "packs/wg-voidships-tables.db", "type": "RollTable" },
|
||||
{ "label": "W&G Voidship Macros", "name": "wg-voidship-macros", "path": "packs/wg-voidship-macros.db", "type": "Macro" },
|
||||
|
||||
{ "label": "W&G Voidship Archeotech", "name": "wg-voidship-archeotech", "path": "packs/wg-voidship-archeotech.db", "type": "Item", "system": "wrath-and-glory" },
|
||||
{ "label": "W&G Voidship Xenos", "name": "wg-voidship-xenos", "path": "packs/wg-voidship-xenos.db", "type": "Item", "system": "wrath-and-glory" }
|
||||
{
|
||||
"label": "W&G Voidship Hulls (Empty)",
|
||||
"name": "wg-voidship-hulls",
|
||||
"path": "packs/wg-voidship-hulls.db",
|
||||
"type": "Actor",
|
||||
"system": "wrath-and-glory"
|
||||
},
|
||||
{
|
||||
"label": "W&G Voidship Items",
|
||||
"name": "wg-voidship-items",
|
||||
"path": "packs/wg-voidship-items.db",
|
||||
"type": "Item",
|
||||
"system": "wrath-and-glory"
|
||||
},
|
||||
{
|
||||
"label": "W&G Voidships — Tables",
|
||||
"name": "wg-voidships-tables",
|
||||
"path": "packs/wg-voidships-tables.db",
|
||||
"type": "RollTable"
|
||||
},
|
||||
{
|
||||
"label": "W&G Voidship Macros",
|
||||
"name": "wg-voidship-macros",
|
||||
"path": "packs/wg-voidship-macros.db",
|
||||
"type": "Macro"
|
||||
},
|
||||
{
|
||||
"label": "W&G Voidship Archeotech",
|
||||
"name": "wg-voidship-archeotech",
|
||||
"path": "packs/wg-voidship-archeotech.db",
|
||||
"type": "Item",
|
||||
"system": "wrath-and-glory"
|
||||
},
|
||||
{
|
||||
"label": "W&G Voidship Xenos",
|
||||
"name": "wg-voidship-xenos",
|
||||
"path": "packs/wg-voidship-xenos.db",
|
||||
"type": "Item",
|
||||
"system": "wrath-and-glory"
|
||||
}
|
||||
],
|
||||
"packFolders": [
|
||||
{
|
||||
@@ -30,7 +76,13 @@
|
||||
"folders": []
|
||||
}
|
||||
],
|
||||
"relationships": { "systems": [{ "id": "wrath-and-glory" }] },
|
||||
"relationships": {
|
||||
"systems": [
|
||||
{
|
||||
"id": "wrath-and-glory"
|
||||
}
|
||||
]
|
||||
},
|
||||
"readme": "journal/README.md",
|
||||
"license": "LICENSE"
|
||||
}
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
{"_id":"0cc5c3b3a915adf7","name":"Castellan Shield","type":"gear","img":null,"system":{"description":"Ancient projection-field array that can extend protection beyond the host hull. Temperamental and zealously maintained by dedicated Tech-Priests.","keywords":"VOIDSHIP, ARCHEOTECH, SHIELDS","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"a2aab0f18b9e4b9d","name":"Castellan Shield Array","type":"gear","img":null,"system":{"description":"Expanded castellum of emitters tuned for fleet support—projects a formidable ward to nearby vessels at grotesque power cost.","keywords":"VOIDSHIP, ARCHEOTECH, SHIELDS","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"ed965d6a2b3c1a65","name":"Cogitator Interlink","type":"gear","img":null,"system":{"description":"Ancient datalooms and logic-engines that interlink bridge, augurs and gunnery pits, smoothing latency and improving battle rhythm.","keywords":"VOIDSHIP, ARCHEOTECH, BRIDGE","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"2f96e98996b2414b","name":"Energistic Conversion Matrix","type":"gear","img":null,"system":{"description":"Relic matrix that reclaims waste energies throughout the ship and feeds them back into the grid; miraculous efficiency at inscrutable risk.","keywords":"VOIDSHIP, ARCHEOTECH, DRIVE","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"b1d5aa8f4a6b2e1a","name":"Gyro-Stabilization Matrix","type":"gear","img":null,"system":{"description":"Deep-keel stabilisers and vanes governed by pre-Imperial machine-logic; lessen recoil and improve tracking solutions.","keywords":"VOIDSHIP, ARCHEOTECH, MANOEUVRE","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"9e875efc3b2a4d1c","name":"Staravar Laser Macrobattery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"volley","rating":"2"}]},"description":"Archeotech laser batteries from the Staravar school, famed for peerless coherence and range.","keywords":"VOIDSHIP, ARCHEOTECH, MACROLASERS","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"4a3d2c1b0e9f8a77","name":"Star-Flare Lance","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"}]},"description":"A lance emitter of pre-Imperial refinement; slices armour with unsettling ease and little thermal bloom.","keywords":"VOIDSHIP, ARCHEOTECH, LANCE","source":"Archeotech Components (RT)"}}
|
||||
{"_id":"arch-ancient-life-sustainer","name":"Ancient Life Sustainer","type":"gear","img":null,"system":{"description":"Archaiczny, wysokoefektywny podtrzymywacz życia z rozległą siecią przewodów i oczyszczaczy. Podnosi morale załogi i ogranicza straty załogi od nie-bojowych przyczyn; pełni rolę Life Sustainer.","keywords":"VOIDSHIP, ARCHEOTECH, LIFE-SUSTAINER","rarity":"extremely rare","source":"RT Core (205–210)"}}
|
||||
{"_id":"arch-modified-drive","name":"Modified Drive","type":"gear","img":null,"system":{"description":"Starożytny napęd STC z egzotycznych materiałów i nietypowej konstrukcji. Zwiększa prędkość okrętu, a jednocześnie ogranicza zajmowaną przestrzeń napędu; kapryśny w eksploatacji.","keywords":"VOIDSHIP, ARCHEOTECH, DRIVE","rarity":"extremely rare","source":"RT Core (205–210)"}}
|
||||
{"_id":"arch-bridge-of-antiquity","name":"Bridge of Antiquity","type":"gear","img":null,"system":{"description":"Mostek-relikt z epok przedimperialnych: rozbudowane loże dowódcze, antyczne interfejsy i sakralne pulpita. Ułatwia koordynację działań i przegląd sensorażu.","keywords":"VOIDSHIP, ARCHEOTECH, BRIDGE","rarity":"extremely rare","source":"RT Core (205–210)"}}
|
||||
{"_id":"arch-auto-logis-targeter","name":"Auto-stabilised Logis-targeter (Archeotech)","type":"gear","img":null,"system":{"description":"Zabytek mechanologicznym – stabilizowane cogitatory balistyczne, które poprawiają celność baterii makro i zgrywają ogień z rozwiązaniami mostka.","keywords":"VOIDSHIP, ARCHEOTECH, GUNNERY","rarity":"extremely rare","source":"RT Core (205–210)"}}
|
||||
{"_id":"arch-teleportarium","name":"Teleportarium (Archeotech)","type":"gear","img":null,"system":{"description":"Krótkozasięgowy translator materii. Umożliwia błyskawiczne naloty abordażowe i ewakuację; obciążony ciężkimi restrykcjami i ryzykiem.","keywords":"VOIDSHIP, ARCHEOTECH, BOARDING","rarity":"extremely rare","source":"RT Core (205–210)"}}
|
||||
{"_id":"ARCH000000000001","name":"Teleportarium","type":"gear","img":"icons/svg/portal.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"teleport","tags":["archeotech","teleport","boarding"]},"voidOnly":true}},"system":{"description":"Krótkozasięgowy translator materii używany do abordażu/ewakuacji. W RT pozwala na natychmiastowe desanty z ryzykiem zakłóceń empirycznych. (RT/BFK)","voidship":{"slot":"Internal","use":{"space":1,"power":4},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000002","name":"Empyrean Mantle","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"mantle","tags":["archeotech","stealth","defence"]},"voidOnly":true}},"system":{"description":"Zasłona empiryczna tłumiąca echo energetyczne okrętu i utrudniająca namierzenie. (IT/BFK)","voidship":{"slot":"Internal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000003","name":"Warpsbane Hull","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"warpsbane","tags":["archeotech","hull","defence"]},"voidOnly":true}},"system":{"description":"Konsekrowane pancerze i relikwiarze ograniczające anomalie Immaterium. (IT)","voidship":{"slot":"Internal","use":{"space":2,"power":0},"mods":{"armour":1,"integrity":6,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000004","name":"Starchart Cogitator","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"nav","tags":["archeotech","sensor","navigation"]},"voidOnly":true}},"system":{"description":"Gwiezdne kogitatory i mapy sprzed Ery Ciemności; ułatwiają pozycjonowanie i kalkulacje nawigacyjne. (BFK)","voidship":{"slot":"Aetherics","use":{"space":1,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000005","name":"Auto-Temple","type":"gear","img":"icons/svg/holy-symbol.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"morale","tags":["archeotech","crew"]},"voidOnly":true}},"system":{"description":"Zautomatyzowana kaplica i rytuały podnoszące morale. W RT redukuje straty/niepokoje; w W&G modelujemy jako +Integrity (abstrakcja).","voidship":{"slot":"Internal","use":{"space":1,"power":1},"mods":{"armour":0,"integrity":2,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000006","name":"Castellan Shield","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"castellan","tags":["archeotech","shield","support"]},"voidOnly":true}},"system":{"description":"Archaiczny układ projekcyjny osłon; potrafi wzmacniać ochronę własną i—w ograniczonym zakresie—sojuszników w pobliżu. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":2,"power":8},"mods":{"armour":0,"integrity":6,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000007","name":"Castellan Shield Array","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"castellan-array","tags":["archeotech","shield","support"]},"voidOnly":true}},"system":{"description":"Rozbudowana wieża kastelańska o zwiększonym zasięgu projekcji tarcz; koszmarne zużycie mocy. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":3,"power":12},"mods":{"armour":0,"integrity":8,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000008","name":"Cogitator Interlink","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"interlink","tags":["archeotech","bridge","gunnery"]},"voidOnly":true}},"system":{"description":"Reliktowe dataloomy spajające mostek, auspeksy i jamy artyleryjskie; wygładzają latencję i cykl ogniowy. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000009","name":"Energistic Conversion Matrix","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"conversion-matrix","tags":["archeotech","reactor","efficiency"]},"voidOnly":true}},"system":{"description":"Macierz odzysku energii wtórnej; „cudowna” sprawność przy nieprzewidywalnych efektach ubocznych. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":2,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":6}}},"effects":[]}
|
||||
{"_id":"ARCH000000000010","name":"Gyro-Stabilization Matrix","type":"gear","img":"icons/svg/compass.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"gyro","tags":["archeotech","manoeuvre","stability"]},"voidOnly":true}},"system":{"description":"Głębokokilowe stabilizatory i stery zarządzane maszynologicą sprzed Imperium; lepsze śledzenie i odrzut. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":1,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":2,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000011","name":"Staravar Laser Macrobattery (Dorsal)","type":"gear","img":"icons/svg/explosion.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macro-laser","tags":["archeotech","weapon","laser","dorsal"]},"voidOnly":true}},"system":{"description":"Szkoła Staravar: znakomita koherencja i zasięg. W RT to archeotechowa bateria laserowa. Slot: Dorsal.","voidship":{"slot":"Dorsal","use":{"space":2,"power":5},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":1,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000012","name":"Star-Flare Lance (Prow)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"lance-starflare","tags":["archeotech","weapon","lance","prow"]},"voidOnly":true}},"system":{"description":"Przedimperialny emiter lancy o „chłodnym” przekroju termicznym, tnie pancerze z niepokojącą łatwością. Slot: Prow.","voidship":{"slot":"Prow","use":{"space":3,"power":7},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000013","name":"Ancient Life Sustainer","type":"gear","img":"icons/svg/stoned-tower.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"life-sustainer","tags":["archeotech","life-sustainer","support"]},"voidOnly":true}},"system":{"description":"Archaiczny, wysoko-efektywny podtrzymywacz życia i filtracja. W RT poprawia komfort/straty; tu daje lekki buff integralności. (RT Core)","voidship":{"slot":"Internal","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":2,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000014","name":"Modified Drive (Archeotech)","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"drive-modified","tags":["archeotech","drive"]},"voidOnly":true}},"system":{"description":"Reliktowy napęd STC o nietypowej konstrukcji; wyższa prędkość i odzysk przestrzeni kosztem kaprysów serwisowych. (RT Core)","voidship":{"slot":"Internal","use":{"space":8,"power":3},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":1,"space":3,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000015","name":"Bridge of Antiquity","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"bridge-antiquity","tags":["archeotech","bridge"]},"voidOnly":true}},"system":{"description":"Reliktowy mostek: loże dowódcze, antyczne interfejsy. Ułatwia koordynację i sensoraż. (RT Core)","voidship":{"slot":"Internal","use":{"space":2,"power":3},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"ARCH000000000016","name":"Auto-stabilised Logis-targeter","type":"gear","img":"icons/svg/crosshair.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"logis-targeter","tags":["archeotech","gunnery","weapon-mod"]},"voidOnly":true}},"system":{"description":"Stabilizowane kogitatory balistyczne poprawiające celność baterii. W praktyce lepsza akwizycja celów i synchronizacja ognia. (RT Core)","voidship":{"slot":"Internal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
{"_id": "4412029d26021383", "name": "Escort Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 18}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}}, "prototypeToken": {"name": "Escort Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "1f954166473bedf3", "name": "Frigate Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 24}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}}, "prototypeToken": {"name": "Frigate Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "c5ca1fc87803b111", "name": "Light Cruiser Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Light Cruiser Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "96a0dacd77d672bb", "name": "Cruiser Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Cruiser Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "a08b1d9ef251ec0b", "name": "Jericho-class Pilgrim Vessel", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Immense conversions for pilgrim passages and reliquary cargo. Cavernous holds and chapels; range and capacity over armour and speed.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Jericho-class Pilgrim Vessel", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "95fcf7b99d705bd1", "name": "Vagabond-class Merchant Trader", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Modular cargobays and adaptable fittings; a chartist workhorse. Simple to keep running in frontier yards; heavily customised.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Vagabond-class Merchant Trader", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "521f6e630bd813a4", "name": "Hazeroth-class Privateer", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Knife-fast raider with reinforced internals and stripped armour. Favoured for ambushes and commerce raiding.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Hazeroth-class Privateer", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "c4c69cf1b895c0e1", "name": "Havoc-class Merchant Raider", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Hybrid carrier-raider balancing battery weight with cargo. Less protected than Navy hulls but brutal on traffic.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 196"}, "prototypeToken": {"name": "Havoc-class Merchant Raider", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 196", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "ec53303961ef4fd4", "name": "Sword-class Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Reliable escort with accurate dorsal lasers and stout drives. Squadrons screen convoys and prosecute pirates.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Sword-class Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "fb874877eacc7a08", "name": "Tempest-class Strike Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Close-action brawler for boardings and short-range gunnery. Reinforced prow and over-tuned drives.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 196"}, "prototypeToken": {"name": "Tempest-class Strike Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 196", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "c8975bb7181d8e12", "name": "Dauntless-class Light Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 36"}, "prototypeToken": {"name": "Dauntless-class Light Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 36", "shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "0b59c38ddda63f42", "name": "Lunar-class Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Archetypal line cruiser—balanced, dependable, easily refitted. Backbone of many squadrons.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 24"}, "prototypeToken": {"name": "Lunar-class Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 24", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "b518e981d69324aa", "name": "Cobra-class Destroyer", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Torpedo raider hunting in packs; strikes, then disengages to reload.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 66"}, "prototypeToken": {"name": "Cobra-class Destroyer", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 66", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "d3853b0270deaf3f", "name": "Falchion-class Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Modernised frigate with improved drives for frontier scouting.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Falchion-class Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "f1ea3416a6d0d27e", "name": "Turbulent-class Heavy Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Strengthened frame and broader arcs; trades agility for staying power.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Turbulent-class Heavy Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "73eed7c83ea60340", "name": "Defiant-class Light Cruiser (Carrier)", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Light carrier with significant attack craft; excellent for recon and strikes.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Defiant-class Light Cruiser (Carrier)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus", "shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "6836e238cce8d9fc", "name": "Universe-class Mass Conveyor", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Super-massive hauler for colony loads and crusade materiel; logistics linchpin.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 31"}, "prototypeToken": {"name": "Universe-class Mass Conveyor", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 31", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "2c612305a7bb853f", "name": "Goliath-class Factory Ship", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Roving manufactorum and refinery; long autonomous deployments.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 30"}, "prototypeToken": {"name": "Goliath-class Factory Ship", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 30", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "287a7cd15c95031f", "name": "Conquest-class Star Galleon", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Heavily built merchant galleon with strong batteries and hull.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 25"}, "prototypeToken": {"name": "Conquest-class Star Galleon", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 25", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "750ee1998f698e08", "name": "Orion-class Star Clipper", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Fast passenger/light-cargo clipper for courier missions and risky runs.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 150"}, "prototypeToken": {"name": "Orion-class Star Clipper", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 150", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "6da4418bdbd2206c", "name": "Cobra-class Destroyer (Renegade)", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Ex-Navy Cobra in privateer hands with non-standard prow refits.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 66"}, "prototypeToken": {"name": "Cobra-class Destroyer (Renegade)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 66", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "0eb071148d375807", "name": "Secutor-class Monitor-Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Mechanicus monitor with powerful dorsals and redundant shielding; anchors actions.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 151"}, "prototypeToken": {"name": "Secutor-class Monitor-Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 151", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "104965869ffa36bb", "name": "Lathe-class Monitor-Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Lathes-forged variant emphasising resilient sanctified systems.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 152"}, "prototypeToken": {"name": "Lathe-class Monitor-Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 152", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"_id": "6774443321f24e87", "name": "Tyrant-class Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Macrobattery-focused cruiser optimised for crushing broadsides.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 153"}, "prototypeToken": {"name": "Tyrant-class Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 153", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
|
||||
{"name":"Lunar-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lunar-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Archetypal line cruiser—balanced, dependable, easily refitted. Backbone of many squadrons.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 24"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Lunar-class Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"0b59c38ddda63f42","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Secutor-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Secutor-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":3,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":68,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Mechanicus monitor with powerful dorsals and redundant shielding; anchors actions.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 151"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Secutor-class Monitor-Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"0eb071148d375807","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Lathe-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lathe-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":3,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":68,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Lathes-forged variant emphasising resilient sanctified systems.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 152"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Lathe-class Monitor-Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"104965869ffa36bb","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Frigate Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Frigate Hull (Empty)","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":24,"manoeuvre":1,"detection":1,"speed":10,"space":40,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":24},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Frigate Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"1f954166473bedf3","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Conquest-class Star Galleon","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Conquest-class Star Galleon","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Heavily built merchant galleon with strong batteries and hull.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 25"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Conquest-class Star Galleon","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"287a7cd15c95031f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Goliath-class Factory Ship","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Goliath-class Factory Ship","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Roving manufactorum and refinery; long autonomous deployments.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 30"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Goliath-class Factory Ship","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"2c612305a7bb853f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Escort Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Escort Hull (Empty)","size":"Escort","slots":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":18,"manoeuvre":2,"detection":1,"speed":10,"space":35,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":18},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Escort Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"4412029d26021383","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Hazeroth-class Privateer","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Hazeroth-class Privateer","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":38,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Knife-fast raider with reinforced internals and stripped armour. Favoured for ambushes and commerce raiding.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Rogue Trader Core Rulebook, p. 195"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Hazeroth-class Privateer","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"521f6e630bd813a4","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Tyrant-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tyrant-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Macrobattery-focused cruiser optimised for crushing broadsides.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 153"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Tyrant-class Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6774443321f24e87","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Universe-class Mass Conveyor","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Universe-class Mass Conveyor","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"},{"tag":"cargo-bay","min":4,"label":"Cargo Holds"},{"tag":"aux-plasma","min":1,"label":"Auxiliary Plasma Generator"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":80,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Super-massive hauler for colony loads and crusade materiel; logistics linchpin.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 31"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Universe-class Mass Conveyor","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6836e238cce8d9fc","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Cobra-class Destroyer (Renegade)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer (Renegade)","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":36,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Ex-Navy Cobra in privateer hands with non-standard prow refits.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 66"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cobra-class Destroyer (Renegade)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6da4418bdbd2206c","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Defiant-class Light Cruiser (Carrier)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Defiant-class Light Cruiser (Carrier)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":60,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":0,"notes":"Light carrier with significant attack craft; excellent for recon and strikes.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Defiant-class Light Cruiser (Carrier)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"73eed7c83ea60340","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Orion-class Star Clipper","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Orion-class Star Clipper","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Fast passenger/light-cargo clipper for courier missions and risky runs.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 150"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Orion-class Star Clipper","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"750ee1998f698e08","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Vagabond-class Merchant Trader","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Vagabond-class Merchant Trader","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":72,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Modular cargobays and adaptable fittings; a chartist workhorse. Simple to keep running in frontier yards; heavily customised.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Rogue Trader Core Rulebook, p. 195"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Vagabond-class Merchant Trader","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"95fcf7b99d705bd1","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cruiser Hull (Empty)","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cruiser Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"96a0dacd77d672bb","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Jericho-class Pilgrim Vessel","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Jericho-class Pilgrim Vessel","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Immense conversions for pilgrim passages and reliquary cargo. Cavernous holds and chapels; range and capacity over armour and speed.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Rogue Trader Core Rulebook, p. 195"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Jericho-class Pilgrim Vessel","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"a08b1d9ef251ec0b","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Cobra-class Destroyer","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":36,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Torpedo raider hunting in packs; strikes, then disengages to reload.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 66"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cobra-class Destroyer","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"b518e981d69324aa","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Havoc-class Merchant Raider","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Havoc-class Merchant Raider","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":38,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Hybrid carrier-raider balancing battery weight with cargo. Less protected than Navy hulls but brutal on traffic.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Rogue Trader Core Rulebook, p. 196"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Havoc-class Merchant Raider","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c4c69cf1b895c0e1","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Light Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Light Cruiser Hull (Empty)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":60,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":0,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Light Cruiser Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c5ca1fc87803b111","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Dauntless-class Light Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Dauntless-class Light Cruiser","size":"Light Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":62,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":0,"notes":"Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 36"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Dauntless-class Light Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c8975bb7181d8e12","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Falchion-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Falchion-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Modernised frigate with improved drives for frontier scouting.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 28"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Falchion-class Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"d3853b0270deaf3f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Sword-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Sword-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Reliable escort with accurate dorsal lasers and stout drives. Squadrons screen convoys and prosecute pirates.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 28"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Sword-class Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"ec53303961ef4fd4","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Turbulent-class Heavy Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Turbulent-class Heavy Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Strengthened frame and broader arcs; trades agility for staying power.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 28"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Turbulent-class Heavy Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"f1ea3416a6d0d27e","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Tempest-class Strike Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tempest-class Strike Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":0},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Close-action brawler for boardings and short-range gunnery. Reinforced prow and over-tuned drives.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Rogue Trader Core Rulebook, p. 196"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Tempest-class Strike Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"fb874877eacc7a08","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{"name":"Lunar-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lunar-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Archetypal line cruiser—balanced, dependable, easily refitted. Backbone of many squadrons.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 24"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Lunar-class Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"0b59c38ddda63f42","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Secutor-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Secutor-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":3,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":68,"power":82},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Mechanicus monitor with powerful dorsals and redundant shielding; anchors actions.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 151"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Secutor-class Monitor-Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"0eb071148d375807","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Lathe-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lathe-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":3,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":68,"power":82},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Lathes-forged variant emphasising resilient sanctified systems.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 152"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Lathe-class Monitor-Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"104965869ffa36bb","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Frigate Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Frigate Hull (Empty)","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":24,"manoeuvre":1,"detection":1,"speed":10,"space":40,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":24},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Frigate Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"1f954166473bedf3","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Conquest-class Star Galleon","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Conquest-class Star Galleon","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Heavily built merchant galleon with strong batteries and hull.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 25"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Conquest-class Star Galleon","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"287a7cd15c95031f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Goliath-class Factory Ship","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Goliath-class Factory Ship","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Roving manufactorum and refinery; long autonomous deployments.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 30"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Goliath-class Factory Ship","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"2c612305a7bb853f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Escort Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Escort Hull (Empty)","size":"Escort","slots":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":18,"manoeuvre":2,"detection":1,"speed":10,"space":35,"power":40},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":18},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Escort Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"4412029d26021383","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Hazeroth-class Privateer","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Hazeroth-class Privateer","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":38,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Knife-fast raider with reinforced internals and stripped armour. Favoured for ambushes and commerce raiding.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Rogue Trader Core Rulebook, p. 195"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Hazeroth-class Privateer","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"521f6e630bd813a4","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Tyrant-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tyrant-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Macrobattery-focused cruiser optimised for crushing broadsides.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 153"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Tyrant-class Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6774443321f24e87","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Universe-class Mass Conveyor","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Universe-class Mass Conveyor","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"},{"tag":"cargo-bay","min":4,"label":"Cargo Holds"},{"tag":"aux-plasma","min":1,"label":"Auxiliary Plasma Generator"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":80,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Super-massive hauler for colony loads and crusade materiel; logistics linchpin.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 31"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Universe-class Mass Conveyor","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6836e238cce8d9fc","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Cobra-class Destroyer (Renegade)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer (Renegade)","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":36,"power":42},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Ex-Navy Cobra in privateer hands with non-standard prow refits.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 66"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cobra-class Destroyer (Renegade)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6da4418bdbd2206c","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Defiant-class Light Cruiser (Carrier)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Defiant-class Light Cruiser (Carrier)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":60,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":0,"notes":"Light carrier with significant attack craft; excellent for recon and strikes.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Defiant-class Light Cruiser (Carrier)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"73eed7c83ea60340","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Orion-class Star Clipper","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Orion-class Star Clipper","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Fast passenger/light-cargo clipper for courier missions and risky runs.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Into the Storm, p. 150"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Orion-class Star Clipper","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"750ee1998f698e08","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Vagabond-class Merchant Trader","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Vagabond-class Merchant Trader","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":72,"power":68},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Modular cargobays and adaptable fittings; a chartist workhorse. Simple to keep running in frontier yards; heavily customised.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Rogue Trader Core Rulebook, p. 195"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Vagabond-class Merchant Trader","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"95fcf7b99d705bd1","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cruiser Hull (Empty)","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cruiser Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"96a0dacd77d672bb","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Jericho-class Pilgrim Vessel","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Jericho-class Pilgrim Vessel","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":68},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":-1,"notes":"Immense conversions for pilgrim passages and reliquary cargo. Cavernous holds and chapels; range and capacity over armour and speed.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":36},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0},"source":"Rogue Trader Core Rulebook, p. 195"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Jericho-class Pilgrim Vessel","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"a08b1d9ef251ec0b","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Cobra-class Destroyer","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":36,"power":42},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Torpedo raider hunting in packs; strikes, then disengages to reload.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 66"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cobra-class Destroyer","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"b518e981d69324aa","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Havoc-class Merchant Raider","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Havoc-class Merchant Raider","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":38,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":2,"notes":"Hybrid carrier-raider balancing battery weight with cargo. Less protected than Navy hulls but brutal on traffic.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":22},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0},"source":"Rogue Trader Core Rulebook, p. 196"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Havoc-class Merchant Raider","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c4c69cf1b895c0e1","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Light Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Light Cruiser Hull (Empty)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":60,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":0,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Light Cruiser Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c5ca1fc87803b111","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Dauntless-class Light Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Dauntless-class Light Cruiser","size":"Light Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":62,"power":72},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":0,"notes":"Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0},"source":"Battlefleet Koronus, p. 36"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Dauntless-class Light Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c8975bb7181d8e12","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Falchion-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Falchion-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Modernised frigate with improved drives for frontier scouting.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 28"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Falchion-class Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"d3853b0270deaf3f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Sword-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Sword-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Reliable escort with accurate dorsal lasers and stout drives. Squadrons screen convoys and prosecute pirates.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 28"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Sword-class Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"ec53303961ef4fd4","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Turbulent-class Heavy Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Turbulent-class Heavy Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Strengthened frame and broader arcs; trades agility for staying power.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Battlefleet Koronus, p. 28"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Turbulent-class Heavy Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"f1ea3416a6d0d27e","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
{"name":"Tempest-class Strike Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tempest-class Strike Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"mnvr":1,"notes":"Close-action brawler for boardings and short-range gunnery. Reinforced prow and over-tuned drives.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":28},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0},"source":"Rogue Trader Core Rulebook, p. 196"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Tempest-class Strike Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"fb874877eacc7a08","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
|
||||
@@ -1,76 +1,5 @@
|
||||
{"_id": "4c636b539f64cdb9", "name": "Mars-Pattern Macrocannon", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 12, "bonus": 0, "rank": 0, "ed": {"base": 3, "bonus": 0, "rank": 0}, "ap": {"base": -1, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 30, "medium": 60, "long": 120, "melee": 1, "thrown": null}, "salvo": 3, "traits": {"list": [{"name": "brutal"}, {"name": "rapidFire", "rating": "2"}]}, "keywords": "VOIDSHIP, MACROBROADSIDES"}}
|
||||
{"_id": "ca475410c5c586ab", "name": "Sunsear Laser Battery", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 14, "bonus": 0, "rank": 0, "ed": {"base": 2, "bonus": 0, "rank": 0}, "ap": {"base": -2, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 40, "medium": 80, "long": 160, "melee": 1, "thrown": null}, "salvo": 2, "traits": {"list": [{"name": "reliable"}, {"name": "volley", "rating": "2"}]}, "keywords": "VOIDSHIP, MACROLASERS"}}
|
||||
{"_id": "2e5ebcbd3f63b739", "name": "Lance Battery", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 16, "bonus": 0, "rank": 0, "ed": {"base": 1, "bonus": 0, "rank": 0}, "ap": {"base": -3, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 50, "medium": 100, "long": 200, "melee": 1, "thrown": null}, "salvo": 2, "traits": {"list": [{"name": "precise"}, {"name": "volley", "rating": "2"}]}, "keywords": "VOIDSHIP, LANCE"}}
|
||||
{"_id":"c0e76cf8e4a100c0","name":"Torpedo Tubes","type":"weapon","img":"modules/wng-core/assets/icons/weapons/missile-launcher.webp","system":{"category":"launcher","description":"Torpedowe wyrzutnie okrętowe. Strzał: Gunnery (BS) vs DEF; przechwytywalne przez TUR. Statystyki efektu zależą od załadowanej głowicy.\n\n**Kompatybilna amunicja (drag&drop na aktora, a następnie wybierz w polu Ammo):**\n• Torpedo Warhead — Standard / Plasma / Melta / Virus / Vortex / Guided.\n\n**Uwaga:** natywny system W&G nie zmienia DMG/AP/ED wg amunicji; używaj opisu ładunku przy interpretacji efektu.","keywords":"VOIDSHIP, ORDNANCE, TORPEDO, AMMO-DEPENDENT","rarity":"uncommon","salvo":1,"damage":{"enabled":false,"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{},"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[]}}
|
||||
{"_id":"60951ef378ddb44c","name":"Launch Bay","type":"weapon","img":"modules/wng-core/assets/icons/weapons/missile-launcher.webp","system":{"category":"launcher","description":"Zatoki startowe dla skrzydeł. Test Gunnery (BS) vs DEF celu lub manewry CAP/Intercept/Bombing/Assault zgodnie z ładunkiem skrzydeł.\n\n**Kompatybilna amunicja (wybierz w polu Ammo):**\n• Wing Loadout — Fury Interceptors / Starhawk Bombers / Assault Boats.\n\n**Uwaga:** system nie modyfikuje DMG/AP/ED wg ładunku — używaj opisu skrzydła.","keywords":"VOIDSHIP, CARRIER, CRAFT, AMMO-DEPENDENT","rarity":"uncommon","salvo":1,"damage":{"enabled":false,"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{},"traits":{"list":[{"name":"carrier","rating":"wings"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[]}}
|
||||
{"_id": "24c79e9c9ee464af","name":"Nova Cannon","type":"weapon","img":null,"system":{"category":"ranged","description":"Potężny strzał z przeładowaniem: można odpalić co 2 rundy (Recharge 1). Jeśli chybi, fala uderzeniowa rozrywa jednostki w promieniu 1 VU od punktu detonacji (rozproszenie). Każda 6 na ED przy trafieniu generuje dodatkowy krytyk.","keywords":"VOIDSHIP, SIEGE, NOVA","rarity":"rare","salvo":1,"damage":{"enabled":false,"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"traits":{"list":[{"name":"recharge","rating":"1 (fires every 2 rounds)"},{"name":"blast","rating":"1 VU (shockwave on miss)"},{"name":"nova-scatter","rating":"miss: detonate area"},{"name":"ed6-extra-crit","rating":"ED=6 → +1 Crit"}]},"install":{"notes":"DMG/AP/ED i dokładny szablon efektu mogą być modulowane stołowo; core: Recharge 1, miss→fala 1 VU, ED=6→+1 Crit."}}}
|
||||
{"_id": "dce16e3acc436f41", "name": "Plasma Drive — Jovian Pattern", "type": "gear", "img": null, "system": {"description": "Essential Component: plasma drive (Jovian).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, DRIVE"}}
|
||||
{"_id": "501ff1a2bd541b7a", "name": "Plasma Drive — Lathe Pattern", "type": "gear", "img": null, "system": {"description": "Essential Component: plasma drive (Lathe).", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, DRIVE"}}
|
||||
{"_id": "696ec23471a30210", "name": "Warp Engine — Strelov", "type": "gear", "img": null, "system": {"description": "Essential Component: warp engine (Strelov).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, WARP"}}
|
||||
{"_id": "6251cd78f55a7109", "name": "Warp Engine — Miloslav", "type": "gear", "img": null, "system": {"description": "Essential Component: warp engine (Miloslav).", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, WARP"}}
|
||||
{"_id": "46a88fd35a5b5c3c", "name": "Geller Field (Primary)", "type": "gear", "img": null, "system": {"description": "Primary Geller field projector.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, GELLER"}}
|
||||
{"_id": "3e086585bbae99e3", "name": "Geller Field (Reserve)", "type": "gear", "img": null, "system": {"description": "Reserve/backup Geller field (independent).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, GELLER"}}
|
||||
{"_id": "252f476c561c29a4", "name": "Void Shield Array (Single)", "type": "gear", "img": null, "system": {"description": "Single-pattern void shields.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, SHIELDS"}}
|
||||
{"_id": "ba4dff7991891d61", "name": "Void Shield Array (Double)", "type": "gear", "img": null, "system": {"description": "Dual-pattern void shields.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, SHIELDS"}}
|
||||
{"_id": "830b39f8c6a0367e", "name": "Combat Bridge", "type": "gear", "img": null, "system": {"description": "Command bridge; targeting/cmd suites.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, ESSENTIAL, BRIDGE"}}
|
||||
{"_id": "9f0743898f310492", "name": "Vitae-Pattern Life Sustainer", "type": "gear", "img": null, "system": {"description": "Essential life sustainer system.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, LIFE-SUSTAINER"}}
|
||||
{"_id": "d8430ab1d15beb37", "name": "Voidsmen Quarters", "type": "gear", "img": null, "system": {"description": "Standard crew quarters.", "value": 0, "rarity": "common", "keywords": "VOIDSHIP, ESSENTIAL, QUARTERS"}}
|
||||
{"_id": "1916605eb593cc0a", "name": "Luxury Passenger Quarters", "type": "gear", "img": null, "system": {"description": "Luxury accommodations.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, QUARTERS"}}
|
||||
{"_id": "dd72e813065d0e34", "name": "Auger Array", "type": "gear", "img": null, "system": {"description": "Standard shipboard augur sensors.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, ESSENTIAL, AUGUR"}}
|
||||
{"_id": "fff778f13b7ddf73", "name": "Empyrean Mantle", "type": "gear", "img": null, "system": {"description": "Warp-signature damping.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL, STEALTH"}}
|
||||
{"_id": "2a099d32269fcc91", "name": "Holo-Baffles", "type": "gear", "img": null, "system": {"description": "Visual/holo signature masking.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL, STEALTH"}}
|
||||
{"_id": "692975b02473b4ef", "name": "Teleportarium", "type": "gear", "img": null, "system": {"description": "Teleport insertion capability.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "26ea0553729833be", "name": "Tenebro-Maze", "type": "gear", "img": null, "system": {"description": "Internal labyrinth vs boarders.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "b9cd53d57d0eb46c", "name": "Murder-Servitors", "type": "gear", "img": null, "system": {"description": "Automated servitor kill-grids.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "209b5b26731923b6", "name": "Superior Plating", "type": "gear", "img": null, "system": {"description": "Enhanced armor facings.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "96594975caec8fd1", "name": "Librarium Vault", "type": "gear", "img": null, "system": {"description": "Schola/librarium complex.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "53394adfd9df0f67", "name": "Temple-Shrine to the God-Emperor", "type": "gear", "img": null, "system": {"description": "Dedicated shrine complex.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "eed15ac1f0b855d0", "name": "Observation Dome", "type": "gear", "img": null, "system": {"description": "Panoramic astrogation dome.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "035ef8929ef5c465", "name": "Cargo Hold & Lighter Bay", "type": "gear", "img": null, "system": {"description": "Expanded cargo & lighters.", "value": 0, "rarity": "common", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "ce218220da6dad3e", "name": "Barracks", "type": "gear", "img": null, "system": {"description": "Embarked troops for boarding/landings.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "32caa789ebca127b", "name": "Auto-Temple", "type": "gear", "img": null, "system": {"description": "Automated Ecclesiarchy node.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id": "3e2dd5640db8e12b", "name": "Trophy Room", "type": "gear", "img": null, "system": {"description": "Crew morale-focused trophy hall.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
|
||||
{"_id":"e101a1b2c3d4e5f1","name":"BG-15 Assault Scanners","type":"gear","img":null,"system":{"description":"Zbliżeniowe, agresywnie strojone auspeksy do skanów podczas abordażu i w zwarciu. Ułatwiają szybkie namierzanie celów w pobliżu.","keywords":"VOIDSHIP, ESSENTIAL, AUGUR","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e102a1b2c3d4e5f2","name":"Belecane-pattern 90.r Geller Field","type":"gear","img":null,"system":{"description":"Standaryzowany generator pola Gellera utrzymujący „bańkę” rzeczywistości podczas żeglugi w Osnowie.","keywords":"VOIDSHIP, ESSENTIAL, GELLER","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e103a1b2c3d4e5f3","name":"Bilge-Rat Quarters","type":"gear","img":null,"system":{"description":"Skrajnie oszczędne, ciasne kwatery maksymalizujące pojemność załogi kosztem morale i komfortu.","keywords":"VOIDSHIP, ESSENTIAL, QUARTERS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e104a1b2c3d4e5f4","name":"Clemency-pattern Life Sustainer","type":"gear","img":null,"system":{"description":"Wydajny układ podtrzymania życia z ulepszonym obiegiem powietrza i recyklingiem; zmniejsza straty długodystansowe.","keywords":"VOIDSHIP, ESSENTIAL, LIFE-SUSTAINER","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e105a1b2c3d4e5f5","name":"Fleet Flag Bridge","type":"gear","img":null,"system":{"description":"Mostek flagowy do koordynacji formacji i zespołów zadaniowych; rozszerzone stanowiska dowodzenia i łączności.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e106a1b2c3d4e5f6","name":"Flight Command Bridge","type":"gear","img":null,"system":{"description":"Układ mostka zoptymalizowany pod działania lotnicze; integracja kontroli skrzydeł myśliwskich i rozpoznawczych.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e107a1b2c3d4e5f7","name":"Invasion Bridge","type":"gear","img":null,"system":{"description":"Mostek szturmowy do kierowania desantami i operacjami lądowania; kaplice bojowe i łącza do sekcji piechoty.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e108a1b2c3d4e5f8","name":"Jovian-pattern Class 8.1 Drive","type":"gear","img":null,"system":{"description":"Fregatowy rdzeń plazmowy Jovian – niezawodny i łatwy w serwisie w stoczniach Imperial Navy.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e109a1b2c3d4e5f9","name":"Jovian-pattern Class 8.2 Drive","type":"gear","img":null,"system":{"description":"Lekkokrezerski wariant napędu Jovian zoptymalizowany do długich patroli i równych cykli obciążenia.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e10aa1b2c3d4e5fa","name":"Jovian-pattern Class 8.3 Drive","type":"gear","img":null,"system":{"description":"Krezerskie turbiny Jovian – balans między ciągiem a nakładem obsługi i remontów.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e10ba1b2c3d4e5fb","name":"Jovian-pattern Class 8.4 Drive","type":"gear","img":null,"system":{"description":"Rdzeń plazmowy dla ciężkich krążowników – długotrwałe kampanie i wysoka rezerwa mocy.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e10ca1b2c3d4e5fc","name":"Miloslav G-616.b Warp Engine","type":"gear","img":null,"system":{"description":"Kompaktowy silnik Osnowy do rajderów/transportowców/fregat; agresywne, szybkie tranzyty kosztem kapryśności.","keywords":"VOIDSHIP, ESSENTIAL, WARP","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e10da1b2c3d4e5fd","name":"Miloslav H-616.b Warp Engine","type":"gear","img":null,"system":{"description":"Wzmocniona wersja Miloslava dla lekkich i pełnych krążowników; lepsza stabilność w burzach Osnowy.","keywords":"VOIDSHIP, ESSENTIAL, WARP","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e10ea1b2c3d4e5fe","name":"Saturine-pattern Class 4A Ultra Drive","type":"gear","img":null,"system":{"description":"Battlecruiserowy napęd plazmowy – brutalne przyspieszenia i wysoki ciąg w krótkich oknach bojowych.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e10fa1b2c3d4e5ff","name":"Saturine-pattern Class 5 Drive","type":"gear","img":null,"system":{"description":"Napęd dla grand cruiser – imponująca moc przy wysokich kosztach utrzymania i wymogach serwisowych.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e110a1b2c3d4e5f0","name":"Triple Void Shield Array","type":"gear","img":null,"system":{"description":"Potrójna warstwa imperialnych osłon dla ciężkich kadłubów linii; zapewnia znacznie większą chłonność ognia.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e111a1b2c3d4e5f1","name":"Voss 'Glimmer'-pattern Void Shield Array","type":"gear","img":null,"system":{"description":"Wydajna, jednowarstwowa osłona wg wzorca Voss – standard dla lżejszych kadłubów.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e112a1b2c3d4e5f2","name":"Voss 'Glimmer'-pattern Multiple Void Shield Array","type":"gear","img":null,"system":{"description":"Rozbudowany układ tarcz Voss z wieloma warstwami – typowy dla krążowników.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e113a1b2c3d4e5f3","name":"X-470 Ultimo Array","type":"gear","img":null,"system":{"description":"Mocny zewnętrzny zestaw augurów – ponadprzeciętna detekcja, ale silna sygnatura emisyjna.","keywords":"VOIDSHIP, ESSENTIAL, AUGUR","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
|
||||
{"_id":"e114a1b2c3d4e5f4","name":"Arboretum","type":"gear","img":null,"system":{"description":"Hydroponiczne ogrody poprawiające morale i wspomagające podtrzymanie życia w długich rejsach.","keywords":"VOIDSHIP, SUPPLEMENTAL, LIFE-SUPPORT","rarity":"uncommon","source":"Into the Storm, p. 161–162"}}
|
||||
{"_id":"e115a1b2c3d4e5f5","name":"Asteroid Mining Facility","type":"gear","img":null,"system":{"description":"Zestawy górnicze, holowniki i rafinerie pokładowe do samodzielnej eksploatacji pasów asteroid.","keywords":"VOIDSHIP, SUPPLEMENTAL, INDUSTRY","rarity":"uncommon","source":"Into the Storm, p. 161–162"}}
|
||||
{"_id":"e116a1b2c3d4e5f6","name":"Astropathic Choir-chambers","type":"gear","img":null,"system":{"description":"Ufortyfikowane, wyciszone komnaty dla chóru astropatów z wzmacniaczami psycho-łączności.","keywords":"VOIDSHIP, SUPPLEMENTAL, COMMUNICATIONS","rarity":"uncommon","source":"Into the Storm, p. 161"}}
|
||||
{"_id":"e117a1b2c3d4e5f7","name":"Auxiliary Plasma Banks","type":"gear","img":null,"system":{"description":"Dodatkowe akumulatory plazmowe zapewniające krótkie skoki mocy dla całego okrętu.","keywords":"VOIDSHIP, SUPPLEMENTAL, DRIVE","rarity":"uncommon","source":"Into the Storm, p. 161"}}
|
||||
{"_id":"e118a1b2c3d4e5f8","name":"Broadband Hymn-casters","type":"gear","img":null,"system":{"description":"Wieże nadawcze zalewające wszystkie pasma hymnami, utrudniające koordynację przeciwnika.","keywords":"VOIDSHIP, SUPPLEMENTAL, COMMUNICATIONS","rarity":"uncommon","install":{"power":3,"space":0,"sp":1},"source":"Into the Storm, p. 161"}}
|
||||
{"_id":"e119a1b2c3d4e5f9","name":"Drop Pod Launch Bays","type":"gear","img":null,"system":{"description":"Katedry startowe i układy naprowadzania do masowych zrzutów kapsuł desantowych.","keywords":"VOIDSHIP, SUPPLEMENTAL, ORDNANCE","rarity":"uncommon","install":{"power":1,"space":3,"sp":2},"source":"Into the Storm, p. 161"}}
|
||||
{"_id":"e11aa1b2c3d4e5fa","name":"Empyrean Mantle (Expanded)","type":"gear","img":null,"system":{"description":"Rozbudowane projektory tłumiące sygnaturę w Osnowie; warianty dla mniejszych i większych kadłubów.","keywords":"VOIDSHIP, SUPPLEMENTAL, STEALTH","rarity":"uncommon","install":{"variants":[{"hulls":"Transports/Raiders/Frigates","power":3,"space":0,"sp":2},{"hulls":"Light Cruisers/Cruisers","power":5,"space":0,"sp":2}]},"source":"Into the Storm, p. 161–162"}}
|
||||
{"_id":"e11ba1b2c3d4e5fb","name":"Reinforced Prow","type":"gear","img":null,"system":{"description":"Wzmocniona struktura dziobowa do taranowania i walki na kursie zbieżnym.","keywords":"VOIDSHIP, SUPPLEMENTAL, ARMOUR","rarity":"uncommon","install":{"power":0,"space":2,"sp":1},"source":"Into the Storm, p. 161–162"}}
|
||||
{"_id":"e11ca1b2c3d4e5fc","name":"Shadowblind Bays","type":"gear","img":null,"system":{"description":"Zaciemnione, bafflowane zatoki maskujące ruchy i sygnaturę cieplną w trakcie operacji.","keywords":"VOIDSHIP, SUPPLEMENTAL, CARGO","rarity":"uncommon","source":"Into the Storm, p. 161"}}
|
||||
{"_id":"e11da1b2c3d4e5fd","name":"Jovian-pattern Missile Battery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"volley","rating":"2"}]},"description":"Zewnętrzne zasobniki rakiet do gwałtownego salwowania – idealne na otwarcie starcia, potem długi przeładunek.","keywords":"VOIDSHIP, ORDNANCE, MACROBATT","rarity":"uncommon","source":"Into the Storm, p. 161"}}
|
||||
{"_id":"e11ea1b2c3d4e5fe","name":"Lathe-pattern Grav-culverin Broadside","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"broadside","rating":"-"},{"name":"option:extended-range (reduced damage)","rating":"-"}]},"description":"Grawitacyjne masowe miotacze; mogą odpalać samonapędzane pociski dla większego zasięgu kosztem obrażeń.","keywords":"VOIDSHIP, MACROBROADSIDES","rarity":"uncommon","source":"Into the Storm, p. 161–162"}}
|
||||
{"_id":"e11fa1b2c3d4e5ff","name":"Mezoa-pattern Macrocannons","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"bulky","rating":"-"}]},"description":"Mezoański wariant Mars-pattern – wyższe osiągi za cenę większych wymagań mocy i przestrzeni.","keywords":"VOIDSHIP, MACROBATT","rarity":"uncommon","source":"Into the Storm, p. 161–162"}}
|
||||
{"_id":"e120a1b2c3d4e5f0","name":"Pyros Melta-cannons","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"inferno-on-crit","rating":"-"}]},"description":"Przewymiarowane lufy z ładunkami melta; trafienia krytyczne łatwo wzniecają rozległe pożary.","keywords":"VOIDSHIP, MACROBATT, MELTA","rarity":"uncommon","source":"Into the Storm, p. 162"}}
|
||||
{"_id":"e121a1b2c3d4e5f1","name":"Sunhammer Lance (Weapon)","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"}]},"description":"Wysokoenergetyczny emiter lancy do przebijania pancerzy i pasów opancerzenia.","keywords":"VOIDSHIP, LANCE","rarity":"uncommon","source":"Into the Storm, p. 163"}}
|
||||
{"_id":"e122a1b2c3d4e5f2","name":"Sunhammer Lance (Battery)","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"},{"name":"battery","rating":"-"}]},"description":"Zespół sprzężonych emiterów Sunhammer – nasyca cel cięciem wiązek przy ogromnym poborze mocy.","keywords":"VOIDSHIP, LANCE","rarity":"uncommon","source":"Into the Storm, p. 163"}}
|
||||
{"_id":"e123a1b2c3d4e5f3","name":"Sunsear Las-broadside","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"broadside","rating":"-"}]},"description":"Długozasięgowe zespoły Sunsear na burtach – celność i precyzja na dystansie.","keywords":"VOIDSHIP, MACROLASERS","rarity":"uncommon","source":"Into the Storm, p. 162–163"}}
|
||||
{"_id":"a1b2c3d4e5f60123","name":"Torpedo Warhead — Standard","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"Standardowa głowica torpedy. Używana przez Torpedo Tubes. Strzał przechwytywalny przez TUR.","value":0,"keywords":"VOIDSHIP, TORPEDO, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":14,"bonus":0,"rank":0,"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"b2c3d4e5f6a70124","name":"Torpedo Warhead — Plasma","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"rare","description":"+1 ED przeciw celom z aktywnymi SHD.","value":0,"keywords":"VOIDSHIP, TORPEDO, PLASMA, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":5,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":5,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"anti-shield","+1ED"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"c3d4e5f6a7b80125","name":"Torpedo Warhead — Melta","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"rare","description":"W Contact/Close: +2 ED; bardzo wysoki AP.","value":0,"keywords":"VOIDSHIP, TORPEDO, MELTA, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":18,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-4,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-4,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"melta","+2ED @ Contact/Close"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"d4e5f6a7b8c90126","name":"Torpedo Warhead — Virus","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"very rare","description":"Niskie obrażenia kadłuba; dewastuje załogę/systemy (CR -1 on Hit bez SHD; na 6 na Wrath: kolejne -1).","value":0,"keywords":"VOIDSHIP, TORPEDO, VIRUS, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":4,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"crew-killer"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"e5f6a7b8c9d00127","name":"Torpedo Warhead — Vortex","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"extremely rare","description":"On Crit: dodatkowy d66 Crit i Blast 1 VU.","value":0,"keywords":"VOIDSHIP, TORPEDO, VORTEX, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":20,"bonus":0,"rank":0,"ed":{"base":6,"bonus":0,"rank":0},"ap":{"base":-5,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":6,"bonus":0,"rank":0},"ap":{"base":-5,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"blast","rating":"1VU"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"f6a7b8c9d0e10128","name":"Torpedo Warhead — Guided","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"rare","description":"+1k do ataku / przerzut 1 kości; TUR przeciwnika -1 do Intercept.","value":0,"keywords":"VOIDSHIP, TORPEDO, GUIDED, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":14,"bonus":0,"rank":0,"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"guided"},{"name":"interceptable","rating":"TUR-1"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"a7b8c9d0e1f20129","name":"Wing Loadout — Fury Interceptors","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"CAP/Intercept przeciw craft/torpedom.","value":0,"keywords":"VOIDSHIP, WING, FURY, INTERCEPT","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":8,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"carrier-wing"},{"name":"cap"},{"name":"intercept","+2 vs craft/torp"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"b8c9d0e1f2a3012a","name":"Wing Loadout — Starhawk Bombers","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"Bombing run przeciw okrętom; +1 ED jeśli cel ma SHD>0.","value":0,"keywords":"VOIDSHIP, WING, STARHAWK, BOMBING","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":4,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":4,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"carrier-wing"},{"name":"bombing"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"c9d0e1f2a3b4012b","name":"Wing Loadout — Assault Boats","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"Zamiast DMG: Boarding (Close/Contact). Jeśli dotrą bez strat: +2 do 1. fazy.","value":0,"keywords":"VOIDSHIP, WING, ASSAULT, BOARDING","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"carrier-wing"},{"name":"assault-boats"},{"name":"boarding"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
|
||||
{"_id":"ITEMREACESCJOV01","name":"Plasma Reactor (Escort) — Jovian-Pattern","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"reactor","subtype":"escort","tags":["reactor","plasma"]},"voidship":{"slot":"Internal","use":{"space":6,"power":0},"mods":{"power":28}}}},"system":{"description":"Lżejszy reaktor plazmowy dla eskort. Generuje ~28 Power, zajmuje 6 Space."},"effects":[]}
|
||||
{"_id":"ITEMTORPPROW0001","name":"Torpedo Tubes — Jovian-Pattern","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"torpedo","tags":["weapon","torpedo"],"allowedSlots":["prow"]},"voidship":{"allowedSlots":["prow"],"use":{"space":10,"power":5},"mods":{}}}},"system":{"description":"Wyrzutnie torpedowe montowane w dziobie. Zużycie 10 Space, 5 Power."},"effects":[]}
|
||||
{"_id":"ITEMLANCEDSL0001","name":"Lance Battery — Starflare-Pattern","type":"gear","img":"icons/svg/sun.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"lance","tags":["weapon","lance"],"allowedSlots":["dorsal","port","starboard"]},"voidship":{"allowedSlots":["dorsal","port","starboard"],"use":{"space":10,"power":6},"mods":{}}}},"system":{"description":"Bateria lanc. Montaż: Dorsal/Port/Starboard. Zużycie 10 Space, 6 Power."},"effects":[]}
|
||||
{"_id":"ITEMWPMACBRD0001","name":"Macrobattery (Broadside) — Mars-Pattern","type":"gear","img":"icons/svg/dice-target.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"macro-broadside","tags":["weapon","macro"],"allowedSlots":["port","starboard"]},"voidship":{"allowedSlots":["port","starboard"],"use":{"space":9,"power":4},"mods":{}}}},"system":{"description":"Makrobateria burtowa. Montaż wyłącznie Port/Starboard. Zużycie 9 Space, 4 Power."},"effects":[]}
|
||||
{"_id":"ITEMMACROUNI0001","name":"Macrobattery (Universal) — Mars-Pattern","type":"gear","img":"icons/svg/dice-target.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"macro","tags":["weapon","macro"],"allowedSlots":["prow","dorsal","port","starboard"]},"voidship":{"allowedSlots":["prow","dorsal","port","starboard"],"use":{"space":8,"power":4},"mods":{}}}},"system":{"description":"Uniwersalna makrobateria (prow/dorsal/port/starboard). Zużycie 8 Space, 4 Power."},"effects":[]}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{"_id":"BRIDGECLV0000001","name":"Command Bridge (Civilian)","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"bridge","subtype":"civilian","tags":["bridge","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":1,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Standard command bridge and cogitators.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"REACTORPLSM00001","name":"Plasma Reactor (Civilian)","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"reactor","subtype":"plasma","tags":["reactor","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":4,"power":-10},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":10}}}},"system":{"quantity":1,"rarity":"Common","description":"Primary plasma reactor for voidship operations.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"GELLARSTD0000001","name":"Gellar Field Projector","type":"gear","img":"icons/svg/temple.svg","flags":{"wg-voidships-builder":{"component":{"kind":"gellar","subtype":"standard","tags":["gellar","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":2,"power":3},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Essential protection in the Immaterium.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"WARPDRVMILO00001","name":"Miloslav Warp Drive (Civilian)","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"drive","subtype":"warp","tags":["drive","warp","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":3,"power":6},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Reliable civilian warp drive.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"AUGURARRAY000001","name":"Augur Array (Civilian)","type":"gear","img":"icons/svg/mystery-man.svg","flags":{"wg-voidships-builder":{"component":{"kind":"sensor","subtype":"augur","tags":["sensor","auspex","aetherics"]},"voidOnly":true,"voidship":{"slot":"Aetherics","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Standard augur/sensor package.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"HULLPLATE0000001","name":"Reinforced Hull Plating","type":"gear","img":"icons/svg/armor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"armour","subtype":"plating","tags":["hull","armour","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":1,"power":0},"mods":{"armour":2,"integrity":4,"manoeuvre":-1,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Additional armour plates and bracing.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"CARGOHOLD0000001","name":"Cargo Hold & Lighter Bay","type":"gear","img":"icons/svg/crate.svg","flags":{"wg-voidships-builder":{"component":{"kind":"cargo-bay","subtype":"standard","tags":["cargo-bay","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":-5,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":-5,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"General-purpose cargo hold with lighter handling.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"AUXPLASMA0000001","name":"Auxiliary Plasma Generator","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"plasma","subtype":"aux-generator","tags":["aux-plasma","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":2,"power":-6},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":6}}}},"system":{"quantity":1,"rarity":"Common","description":"Auxiliary plasma reactor increasing available power.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"MACROPROW0000001","name":"Macrobattery (Prow)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macrobattery","tags":["weapon","prow"]},"voidOnly":true,"voidship":{"slot":"Prow","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Prow macrobattery.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
{"_id":"MACRODORS0000001","name":"Macrobattery (Dorsal)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macrobattery","tags":["weapon","dorsal"]},"voidOnly":true,"voidship":{"slot":"Dorsal","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Dorsal macrobattery.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
|
||||
@@ -1,6 +1,5 @@
|
||||
{"_id":"2a8c7c6b5d4e3f21","name":"Xenos Habitats","type":"gear","img":null,"system":{"description":"Specialist compartments and atmospherics for transporting or housing alien beings and crews. Includes containment precautions and adaptable life-support matrices.","keywords":"VOIDSHIP, XENOS, QUARTERS","value":0,"rarity":"rare","source":"Into the Storm, p. 161"}}
|
||||
{"_id":"xeno-ghost-field","name":"Ghost Field","type":"gear","img":null,"system":{"description":"Eldarski „widmowy” ekran tworzący fałszywe echo jednostki i myliący wrogie augury. W akcji wymusza wybór: tarcze osłonowe albo ghost field.","keywords":"VOIDSHIP, XENOS, SHIELDS","rarity":"near unique","source":"RT Core (205–210)"}}
|
||||
{"_id":"xeno-shard-cannon-battery","name":"Shard Cannon Battery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"xenos-tech","rating":"-"}]},"description":"Obca, autonomiczna bateria „odłamkowa” – nie wymaga standardowego zasilania ani amunicji; jej charakterystyka bojowa odbiega od imperialnych norm.","keywords":"VOIDSHIP, XENOS, MACROBATT","rarity":"near unique","source":"RT Core (205–210)"}}
|
||||
{"_id":"xeno-runecaster","name":"Runecaster","type":"gear","img":null,"system":{"description":"Węzeł runiczny (eldarski) wspierający sensoraż i nawigację; generuje „rune-echoes” poprawiające wykrywanie i maskowanie.","keywords":"VOIDSHIP, XENOS, AUGUR","rarity":"near unique","source":"RT Core (205–210)"}}
|
||||
{"_id":"xeno-micro-laser-defence-grid","name":"Micro Laser Defence Grid","type":"gear","img":null,"system":{"description":"Drobno-segmentowa siatka mikro-laserów przechwytująca bliskie cele (bomby, torpedy, drobne łodzie); rośnie szansa zestrzelenia zagrożeń zbliżeniowych.","keywords":"VOIDSHIP, XENOS, POINT-DEFENCE","rarity":"near unique","source":"RT Core (205–210)"}}
|
||||
{"_id":"xeno-gravity-sails","name":"Gravity Sails","type":"gear","img":null,"system":{"description":"Grawito-żagle (często spotykane u Eldarów) pozwalające na niemal bezgłośny napęd przy minimalnej sygnaturze; idealne do skrytych przelotów.","keywords":"VOIDSHIP, XENOS, DRIVE","rarity":"near unique","source":"RT Core (205–210)"}}
|
||||
{"_id":"XENO000000000001","name":"Eldar Solar Sails","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"eldar-sails","tags":["xenos","eldar","propulsion"]},"voidOnly":true}},"system":{"description":"Żagle solarne Aeldari — ciche, wysokosprawne napędy żaglowe. W RT zmniejszają zużycie mocy/ślad; u nas: +Speed i +Power (pula).","voidship":{"slot":"Internal","use":{"space":2,"power":0},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":0,"speed":1,"space":0,"power":2}}},"effects":[]}
|
||||
{"_id":"XENO000000000002","name":"Eldar Holofield","type":"gear","img":"icons/svg/mystery-man.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"eldar-holofield","tags":["xenos","eldar","defence"]},"voidOnly":true}},"system":{"description":"Holo-osłony rozszczepiające obraz i echo sensorażu — trudniej trafić i namierzyć.","voidship":{"slot":"Internal","use":{"space":2,"power":4},"mods":{"armour":0,"integrity":3,"manoeuvre":2,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"XENO000000000003","name":"Ork Kustom Force Field","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"ork-kff","tags":["xenos","ork","defence"]},"voidOnly":true}},"system":{"description":"‘Kustom’ pole siłowe Mekboyów — bardzo mocne, bardzo kapryśne.","voidship":{"slot":"Internal","use":{"space":3,"power":6},"mods":{"armour":0,"integrity":6,"manoeuvre":-1,"detection":-1,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"XENO000000000004","name":"Ork Reinforced Ram Prow","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"ork-ram","tags":["xenos","ork","prow"]},"voidOnly":true}},"system":{"description":"Mega-rampa do taranowania — i do ‘wygrywania’ dyskusji na krótkim dystansie.","voidship":{"slot":"Internal","use":{"space":1,"power":0},"mods":{"armour":3,"integrity":2,"manoeuvre":-1,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
{"_id":"XENO000000000005","name":"Eldar Targeting Matrix (Dorsal)","type":"gear","img":"icons/svg/crosshair.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"eldar-matrix","tags":["xenos","eldar","weapon-mod","dorsal"]},"voidOnly":true}},"system":{"description":"Aeldari macierz celownicza wzmacniająca akwizycję i śledzenie celów. Działa najlepiej z bateriami dorsalnymi.","voidship":{"slot":"Dorsal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
|
||||
|
||||
@@ -0,0 +1,401 @@
|
||||
// W&G Voidships Builder — Voidship Actor Sheet (vehicle+flag emulation)
|
||||
// v1.1.0 — Foundry V11–V13 safe
|
||||
/* eslint-env es2021 */
|
||||
const VB_MOD = "wg-voidships-builder";
|
||||
const VB_DEBUG = true; // Debug on
|
||||
function dbg(...args) { if (VB_DEBUG) console.debug("[VB]", ...args); }
|
||||
// --- SLOT HELPERS: normalizacja i przydział "pierwszy wolny pasujący" ---
|
||||
const VB_WEAPON_SLOTS = ["prow", "dorsal", "port", "starboard", "keel"];
|
||||
|
||||
function normalizeSlotName(s) {
|
||||
const v = String(s || "").trim().toLowerCase();
|
||||
return VB_WEAPON_SLOTS.includes(v) ? v : null;
|
||||
}
|
||||
function normalizeAllowedSlots(allowed) {
|
||||
if (!allowed) return [];
|
||||
if (Array.isArray(allowed)) return allowed.map(normalizeSlotName).filter(Boolean);
|
||||
return String(allowed).split(/[|,; ]+/g).map(normalizeSlotName).filter(Boolean);
|
||||
}
|
||||
function getVSH(it) {
|
||||
// canonical: flags; fallback: legacy system.voidship (skopiujemy do flags przy dropie)
|
||||
return it.getFlag(VB_MOD, "voidship") || it.system?.voidship || null;
|
||||
}
|
||||
function countUsedWeaponSlots(actor) {
|
||||
const used = { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 };
|
||||
for (const it of actor.items ?? []) {
|
||||
const v = getVSH(it);
|
||||
const eq = (it.system?.equipped ?? true);
|
||||
const slot = normalizeSlotName(v?.slot);
|
||||
if (eq && slot && (slot in used)) used[slot] += 1;
|
||||
}
|
||||
return used;
|
||||
}
|
||||
function pickFirstFreeSlot(allowed, hullSlots, used) {
|
||||
const order = ["prow", "dorsal", "port", "starboard", "keel"];
|
||||
for (const s of order) {
|
||||
if (!allowed.includes(s)) continue;
|
||||
const cap = Number(hullSlots?.[s] ?? 0);
|
||||
const u = Number(used?.[s] ?? 0);
|
||||
if (u < cap) return s;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// ---------------- Handlebars helpers ----------------
|
||||
Hooks.once("init", () => {
|
||||
if (!Handlebars.helpers.signed) {
|
||||
Handlebars.registerHelper("signed", (v) => {
|
||||
const n = Number(v || 0);
|
||||
if (!Number.isFinite(n) || n === 0) return "±0";
|
||||
return (n > 0 ? "+" : "−") + Math.abs(n);
|
||||
});
|
||||
}
|
||||
if (!Handlebars.helpers.eq) {
|
||||
Handlebars.registerHelper("eq", (a, b) => a === b);
|
||||
}
|
||||
if (!Handlebars.helpers.json) {
|
||||
Handlebars.registerHelper("json", (ctx) => {
|
||||
try { return JSON.stringify(ctx, null, 2); }
|
||||
catch { return String(ctx); }
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
class VoidshipSheet extends ActorSheet {
|
||||
static get defaultOptions() {
|
||||
const opts = super.defaultOptions;
|
||||
return foundry.utils.mergeObject(opts, {
|
||||
classes: ["wg-voidships", "sheet", "actor", "voidship", "themed", "theme-light"],
|
||||
template: `modules/${VB_MOD}/templates/voidship-sheet.hbs`,
|
||||
width: 720,
|
||||
height: 680,
|
||||
tabs: [{ navSelector: ".tabs", contentSelector: ".sheet-body", initial: "wg" }],
|
||||
dragDrop: [{ dragSelector: ".voidship-sheet", dropSelector: ".voidship-sheet" }]
|
||||
});
|
||||
}
|
||||
|
||||
/** Allow viewing for everyone (adjust if you need perms) */
|
||||
_canUserView(user) { return !!user; }
|
||||
|
||||
get isVoidship() { return this.actor?.getFlag(VB_MOD, "isVoidship") === true; }
|
||||
|
||||
// ---- math helpers ----
|
||||
_sumModsFromItems(items) {
|
||||
const mods = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0 };
|
||||
let useSpace = 0, usePower = 0;
|
||||
const slotsUsed = { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 };
|
||||
|
||||
for (const it of items) {
|
||||
const vs = it.system?.voidship;
|
||||
if (!vs) continue;
|
||||
|
||||
const equipped = (it.system?.equipped ?? true);
|
||||
const slotKey = String(vs.slot || "").toLowerCase();
|
||||
if (equipped && ["prow", "dorsal", "port", "starboard", "keel"].includes(slotKey)) {
|
||||
slotsUsed[slotKey] = (slotsUsed[slotKey] || 0) + 1;
|
||||
}
|
||||
|
||||
// capacity usage (always counts, bo to realne zużycie – jeśli wolisz tylko equipped, to obejmij warunkiem)
|
||||
const use = vs.use || {};
|
||||
if (Number.isFinite(Number(use.space))) useSpace += Number(use.space);
|
||||
if (Number.isFinite(Number(use.power))) usePower += Number(use.power);
|
||||
|
||||
// mods liczą się tylko jeśli equipped
|
||||
if (!equipped) continue;
|
||||
const m = vs.mods || {};
|
||||
for (const k of Object.keys(mods)) {
|
||||
const val = Number(m[k]);
|
||||
if (Number.isFinite(val)) mods[k] += val;
|
||||
}
|
||||
}
|
||||
|
||||
return { mods, use: { space: useSpace, power: usePower }, slotsUsed };
|
||||
}
|
||||
|
||||
// ---- data aggregation for template ----
|
||||
async getData(options) {
|
||||
const data = await super.getData(options);
|
||||
const actor = this.actor;
|
||||
const VB_MOD = "wg-voidships-builder";
|
||||
|
||||
// Flagowe źródła (przeżywają migracje W&G)
|
||||
// czytaj flagi wprost z actor.flags[namespace] (albo pojedyncze klucze)
|
||||
const flagsNs = actor.flags?.[VB_MOD] || {};
|
||||
const defaultHull = { class: actor.name, size: "Cruiser", slots: { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 } };
|
||||
const defaultBase = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0 };
|
||||
const defaultCrew = { command: 0, pilot: 0, sensors: 0, engineering: 0, gunnery: 0, security: 0, flightDeck: 0, passengers: 0 };
|
||||
|
||||
const crew = actor.getFlag(VB_MOD, "crew") ?? flagsNs.crew ?? defaultCrew;
|
||||
|
||||
const rtRaw = actor.getFlag(VB_MOD, "rtRaw") ?? flagsNs.rtRaw ?? {};
|
||||
|
||||
const rt = rtRaw.rt || {};
|
||||
const rtCard = {
|
||||
speed: rt.speed ?? rtRaw.combat?.speed ?? 0,
|
||||
manoeuvrability: rt.manoeuvrability ?? rtRaw.mnvr ?? 0,
|
||||
detection: rt.detection ?? 0,
|
||||
hullIntegrity: rt.hullIntegrity ?? rtRaw.combat?.wounds?.max ?? 0,
|
||||
armour: rt.armour ?? 0,
|
||||
space: rt.space ?? 0,
|
||||
power: rt.power ?? 0,
|
||||
weapons: {
|
||||
prow: rt.weapons?.prow ?? 0,
|
||||
dorsal: rt.weapons?.dorsal ?? 0,
|
||||
port: rt.weapons?.port ?? 0,
|
||||
starboard: rt.weapons?.starboard ?? 0,
|
||||
keel: rt.weapons?.keel ?? 0
|
||||
},
|
||||
turret: rt.turret ?? 0,
|
||||
notes: rtRaw.notes ?? "",
|
||||
source: rt.source ?? rtRaw.source ?? ""
|
||||
};
|
||||
|
||||
// --- komponenty z itemów (flags canonical) ---
|
||||
const items = actor.items.contents || [];
|
||||
const components = [];
|
||||
const slotsUsed = { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 };
|
||||
const mods = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0 };
|
||||
const useTotal = { space: 0, power: 0 };
|
||||
|
||||
for (const it of items) {
|
||||
const v = getVSH(it);
|
||||
if (!v) continue;
|
||||
const c = foundry.utils.duplicate(v);
|
||||
c.name = it.name;
|
||||
c.itemId = it.id;
|
||||
c.equipped = (it.system?.equipped ?? true);
|
||||
c.slot = normalizeSlotName(c.slot) || "Internal";
|
||||
c.allowedSlots = normalizeAllowedSlots(c.allowedSlots || foundry.utils.getProperty(it.flags, `${VB_MOD}.component.allowedSlots`));
|
||||
|
||||
// defaults
|
||||
c.use = { space: 0, power: 0, ...(c.use || {}) };
|
||||
c.mods = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0, ...(c.mods || {}) };
|
||||
|
||||
components.push(c);
|
||||
|
||||
if (c.equipped) {
|
||||
// sumuj mody
|
||||
for (const k of Object.keys(mods)) {
|
||||
const val = Number(c.mods[k] || 0);
|
||||
if (Number.isFinite(val)) mods[k] += val;
|
||||
}
|
||||
// sumuj zużycie/produkcję
|
||||
const us = Number(c.use.space || 0);
|
||||
const up = Number(c.use.power || 0);
|
||||
if (Number.isFinite(us)) useTotal.space += us;
|
||||
if (Number.isFinite(up)) useTotal.power += up;
|
||||
|
||||
// slot usage (tylko jeśli to broń z legalnym slotem)
|
||||
if (VB_WEAPON_SLOTS.includes(c.slot)) {
|
||||
slotsUsed[c.slot] = (slotsUsed[c.slot] || 0) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const base = actor.getFlag(VB_MOD, "base") || { armour:0, integrity:0, manoeuvre:0, detection:0, speed:0, space:0, power:0 };
|
||||
|
||||
// total = base + mods
|
||||
const totals = {
|
||||
armour: (Number(base.armour)||0) + mods.armour,
|
||||
integrity: (Number(base.integrity)||0) + mods.integrity,
|
||||
manoeuvre: (Number(base.manoeuvre)||0) + mods.manoeuvre,
|
||||
detection: (Number(base.detection)||0) + mods.detection,
|
||||
speed: (Number(base.speed)||0) + mods.speed,
|
||||
space: (Number(base.space)||0) + mods.space,
|
||||
power: (Number(base.power)||0) + mods.power
|
||||
};
|
||||
totals.spaceFree = totals.space - useTotal.space;
|
||||
totals.powerFree = totals.power - useTotal.power;
|
||||
|
||||
// warnings
|
||||
const hull = actor.getFlag(VB_MOD, "hull") || { slots: {} };
|
||||
const warnings = {};
|
||||
for (const s of VB_WEAPON_SLOTS) {
|
||||
if ((slotsUsed[s]||0) > (hull.slots?.[s]||0)) { warnings.slots = "One or more weapon slot groups exceed hull limits."; break; }
|
||||
}
|
||||
if (totals.spaceFree < 0) warnings.capacity = "Not enough Space for installed components.";
|
||||
if (totals.powerFree < 0) warnings.capacity = "Not enough Power for installed components.";
|
||||
|
||||
// zaszyj
|
||||
data.hull = hull;
|
||||
data.base = base;
|
||||
data.components = components;
|
||||
data.slotsUsed = slotsUsed;
|
||||
data.totals = totals;
|
||||
data.mods = mods;
|
||||
data.useTotal = useTotal;
|
||||
|
||||
// extra debug
|
||||
data.debug = {
|
||||
usedWeaponSlots: slotsUsed,
|
||||
itemsCount: items.length,
|
||||
componentsCount: components.length,
|
||||
itemsNoVSH: items.filter(i => !getVSH(i)).map(i => ({id:i.id, name:i.name}))
|
||||
};
|
||||
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
// ---- listeners & UI ----
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
html.find("[data-action='mark-voidship']").on("click", async () => {
|
||||
await this.actor.setFlag(VB_MOD, "isVoidship", true);
|
||||
ui.notifications.info("Marked as Voidship.");
|
||||
this.render(true);
|
||||
});
|
||||
html.find("[data-action='unmark-voidship']").on("click", async () => {
|
||||
await this.actor.unsetFlag(VB_MOD, "isVoidship");
|
||||
ui.notifications.info("Unmarked Voidship.");
|
||||
this.render(true);
|
||||
});
|
||||
|
||||
html.find("[data-action='configure-base']").on("click", async () => {
|
||||
const cur = this.actor.getFlag(VB_MOD, "base") || {};
|
||||
const content = `
|
||||
<form>
|
||||
<div class="form-group"><label>Armour</label><input type="number" name="armour" value="${Number(cur.armour || 0)}"/></div>
|
||||
<div class="form-group"><label>Integrity</label><input type="number" name="integrity" value="${Number(cur.integrity || 0)}"/></div>
|
||||
<div class="form-group"><label>Manoeuvre</label><input type="number" name="manoeuvre" value="${Number(cur.manoeuvre || 0)}"/></div>
|
||||
<div class="form-group"><label>Detection</label><input type="number" name="detection" value="${Number(cur.detection || 0)}"/></div>
|
||||
<div class="form-group"><label>Speed</label><input type="number" name="speed" value="${Number(cur.speed || 0)}"/></div>
|
||||
<div class="form-group"><label>Space</label><input type="number" name="space" value="${Number(cur.space || 0)}"/></div>
|
||||
<div class="form-group"><label>Power</label><input type="number" name="power" value="${Number(cur.power || 0)}"/></div>
|
||||
</form>`;
|
||||
new Dialog({
|
||||
title: "Voidship — Base Stats",
|
||||
content, buttons: {
|
||||
ok: {
|
||||
label: "Save",
|
||||
callback: async (dlg) => {
|
||||
const form = dlg[0].querySelector("form");
|
||||
const num = (n) => Number(form.querySelector(`[name="${n}"]`)?.value || 0);
|
||||
await this.actor.setFlag(VB_MOD, "base", {
|
||||
armour: num("armour"), integrity: num("integrity"),
|
||||
manoeuvre: num("manoeuvre"), detection: num("detection"),
|
||||
speed: num("speed"), space: num("space"), power: num("power")
|
||||
});
|
||||
this.render(true);
|
||||
}
|
||||
},
|
||||
cancel: { label: "Cancel" }
|
||||
}, default: "ok"
|
||||
}, { jQuery: true }).render(true);
|
||||
});
|
||||
|
||||
// Components controls
|
||||
html.find("[data-action='comp-toggle']").on("click", async (ev) => {
|
||||
const row = ev.currentTarget.closest("tr");
|
||||
const id = row?.dataset?.itemId;
|
||||
const item = this.actor.items.get(id);
|
||||
if (!item) return;
|
||||
const equipped = !(item.system?.equipped ?? true);
|
||||
await item.update({ "system.equipped": equipped });
|
||||
this.render(true);
|
||||
});
|
||||
|
||||
html.find("[data-action='comp-edit']").on("click", async (ev) => {
|
||||
const row = ev.currentTarget.closest("tr");
|
||||
const id = row?.dataset?.itemId;
|
||||
const item = this.actor.items.get(id);
|
||||
if (item) item.sheet?.render(true);
|
||||
});
|
||||
|
||||
html.find("[data-action='comp-remove']").on("click", async (ev) => {
|
||||
const row = ev.currentTarget.closest("tr");
|
||||
const id = row?.dataset?.itemId;
|
||||
if (!id) return;
|
||||
await this.actor.deleteEmbeddedDocuments("Item", [id]);
|
||||
this.render(true);
|
||||
});
|
||||
}
|
||||
|
||||
async _onDropItem(event, data) {
|
||||
event.preventDefault();
|
||||
|
||||
// 1) Rozwiąż źródło (uuid/pack/data)
|
||||
let doc = null;
|
||||
try {
|
||||
if (data?.uuid) doc = await fromUuid(data.uuid);
|
||||
else if (data?.pack && data?._id) {
|
||||
const pack = game.packs.get(data.pack);
|
||||
if (pack) doc = await pack.getDocument(data._id);
|
||||
} else if (data) {
|
||||
doc = await Item.implementation.fromDropData(data);
|
||||
}
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
const raw = doc?.toObject?.(false) ?? data?.data ?? data;
|
||||
if (!raw?.type) { ui.notifications.error("Drop failed: cannot resolve item data (no UUID/DATA)."); return false; }
|
||||
|
||||
// 2) Czy to komponent?
|
||||
const flagsIn = foundry.utils.getProperty(raw, `flags.${VB_MOD}`) || {};
|
||||
const legacySys = foundry.utils.getProperty(raw, "system.voidship") || null;
|
||||
const hasCompTag = !!flagsIn.component;
|
||||
const hasLegacy = !!legacySys;
|
||||
if (!hasCompTag && !hasLegacy) {
|
||||
ui.notifications.warn("This item is not a voidship component.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 3) Skonstruuj flags.${VB_MOD}.voidship (kanoniczne)
|
||||
const vshIn = flagsIn.voidship || legacySys || {};
|
||||
const flagsOut = foundry.utils.duplicate(flagsIn);
|
||||
flagsOut.voidship = foundry.utils.mergeObject({
|
||||
slot: vshIn.slot || null,
|
||||
use: { space: 0, power: 0, ...(vshIn.use || {}) },
|
||||
mods: { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0, ...(vshIn.mods || {}) },
|
||||
allowedSlots: normalizeAllowedSlots(vshIn.allowedSlots || flagsIn?.component?.allowedSlots || [])
|
||||
}, {}, { inplace: false });
|
||||
|
||||
// 4) Auto-przydział slotu dla broni (jeśli allowedSlots != pusty)
|
||||
const allowed = flagsOut.voidship.allowedSlots || [];
|
||||
if (allowed.length > 0) {
|
||||
const hull = this.actor.getFlag(VB_MOD, "hull") || {};
|
||||
const hullSlots = hull.slots || {};
|
||||
const used = countUsedWeaponSlots(this.actor);
|
||||
const chosen = pickFirstFreeSlot(allowed, hullSlots, used);
|
||||
if (!chosen) {
|
||||
ui.notifications.warn("No free matching weapon slot for this component.");
|
||||
return false;
|
||||
}
|
||||
flagsOut.voidship.slot = chosen;
|
||||
} else {
|
||||
// nie-broń
|
||||
flagsOut.voidship.slot = flagsOut.voidship.slot || "Internal";
|
||||
}
|
||||
|
||||
// 5) wpisz flags i domyślne "equipped"
|
||||
raw.flags = raw.flags || {};
|
||||
raw.flags[VB_MOD] = flagsOut;
|
||||
if (raw.system?.equipped === undefined) {
|
||||
raw.system = raw.system || {};
|
||||
raw.system.equipped = true;
|
||||
}
|
||||
|
||||
// 6) Utwórz na aktorze
|
||||
await this.actor.createEmbeddedDocuments("Item", [raw]);
|
||||
this.render(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Register the sheet
|
||||
Hooks.once("init", () => {
|
||||
Actors.registerSheet(VB_MOD, VoidshipSheet, {
|
||||
types: ["vehicle"],
|
||||
makeDefault: false,
|
||||
label: "Voidship (W&G)"
|
||||
});
|
||||
game.wgVoidships = game.wgVoidships || {};
|
||||
game.wgVoidships.createVoidship = async function (name = "New Voidship") {
|
||||
const actor = await Actor.create({ name, type: "vehicle", folder: null });
|
||||
await actor.setFlag(VB_MOD, "isVoidship", true);
|
||||
ui.notifications.info(`Voidship created: ${name}`);
|
||||
return actor;
|
||||
};
|
||||
console.log(`${VB_MOD}: VoidshipSheet registered`);
|
||||
});
|
||||
@@ -1 +1,15 @@
|
||||
Hooks.once('ready',()=>console.warn('wg-voidships-builder: helper script not provided, using stub'));
|
||||
Hooks.once('init', async () => {
|
||||
try {
|
||||
if (typeof Handlebars?.registerHelper === "function") {
|
||||
Handlebars.registerHelper("json", (ctx) => JSON.stringify(ctx ?? {}, null, 2));
|
||||
}
|
||||
await loadTemplates(["modules/wg-voidships-builder/templates/voidship-sheet.hbs"]);
|
||||
console.debug("[VB] templates preloaded");
|
||||
} catch (e) {
|
||||
console.warn("wg-voidships-builder: init failed", e);
|
||||
}
|
||||
});
|
||||
|
||||
Hooks.once('ready', () => {
|
||||
console.warn('wg-voidships-builder: builder UI not yet active (stub)');
|
||||
});
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
<form class="voidship-sheet">
|
||||
<header class="sheet-header flexrow" style="align-items:center; gap:.5rem;">
|
||||
<img class="profile" src="{{actor.img}}" width="48" height="48">
|
||||
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}"></h1>
|
||||
|
||||
<div style="margin-left:auto; display:flex; gap:.5rem;">
|
||||
<button type="button" data-action="configure-base"><i class="fas fa-cog"></i> Base</button>
|
||||
{{#if (eq actor.flags.wg-voidships-builder.isVoidship true)}}
|
||||
<button type="button" data-action="unmark-voidship"><i class="fas fa-times-circle"></i> Unmark</button>
|
||||
{{else}}
|
||||
<button type="button" data-action="mark-voidship"><i class="fas fa-check-circle"></i> Mark Voidship</button>
|
||||
{{/if}}
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<nav class="tabs" data-group="primary">
|
||||
<a class="item" data-tab="wg">W&G</a>
|
||||
<a class="item" data-tab="rt">Rogue Trader</a>
|
||||
<a class="item" data-tab="crew">Crew</a>
|
||||
<a class="item" data-tab="components">Components</a>
|
||||
</nav>
|
||||
|
||||
<section class="sheet-body">
|
||||
|
||||
<!-- W&G TAB -->
|
||||
<div class="tab" data-group="primary" data-tab="wg">
|
||||
<div class="grid grid-2col" style="gap:.5rem;">
|
||||
<div class="card">
|
||||
<h3>Totals (Base + Mods)</h3>
|
||||
<ol class="properties">
|
||||
<li>Armour: <b>{{totals.armour}}</b></li>
|
||||
<li>Integrity: <b>{{totals.integrity}}</b></li>
|
||||
<li>Manoeuvre: <b>{{totals.manoeuvre}}</b></li>
|
||||
<li>Detection: <b>{{totals.detection}}</b></li>
|
||||
<li>Speed: <b>{{totals.speed}}</b></li>
|
||||
<li>Space (free/total): <b>{{totals.spaceFree}}</b> / <b>{{totals.space}}</b></li>
|
||||
<li>Power (free/total): <b>{{totals.powerFree}}</b> / <b>{{totals.power}}</b></li>
|
||||
</ol>
|
||||
{{#if warnings.capacity}}<p class="warning" style="color:#b45309;">{{warnings.capacity}}</p>{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Hull</h3>
|
||||
<ol class="properties">
|
||||
<li>Class: <b>{{hull.class}}</b> ({{hull.size}})</li>
|
||||
<li>Slots — Prow: <b>{{hull.slots.prow}}</b>, Dorsal: <b>{{hull.slots.dorsal}}</b>, Port: <b>{{hull.slots.port}}</b>, Starboard: <b>{{hull.slots.starboard}}</b>, Keel: <b>{{hull.slots.keel}}</b></li>
|
||||
</ol>
|
||||
{{#if warnings.slots}}<p class="warning" style="color:#b45309;">{{warnings.slots}}</p>{{/if}}
|
||||
{{#if warnings.requirements}}<p class="warning" style="color:#b91c1c;">{{warnings.requirements}}</p>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="grid grid-2col" style="gap:.5rem;">
|
||||
<div class="card">
|
||||
<h3>Base (flags)</h3>
|
||||
<ol class="properties">
|
||||
<li>Armour: <b>{{totals.armour}}</b></li>
|
||||
<li>Integrity: <b>{{totals.integrity}}</b></li>
|
||||
<li>Manoeuvre: <b>{{totals.manoeuvre}}</b></li>
|
||||
<li>Detection: <b>{{totals.detection}}</b></li>
|
||||
<li>Speed: <b>{{totals.speed}}</b></li>
|
||||
<li>Space (free/total): <b>{{totals.spaceFree}}</b> / <b>{{totals.space}}</b></li>
|
||||
<li>Power (free/total): <b>{{totals.powerFree}}</b> / <b>{{totals.power}}</b></li>
|
||||
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Mods (items)</h3>
|
||||
<ol class="properties">
|
||||
<li>Armour: <b>{{mods.armour}}</b></li>
|
||||
<li>Integrity: <b>{{mods.integrity}}</b></li>
|
||||
<li>Manoeuvre: <b>{{mods.manoeuvre}}</b></li>
|
||||
<li>Detection: <b>{{mods.detection}}</b></li>
|
||||
<li>Speed: <b>{{mods.speed}}</b></li>
|
||||
<li>Space: <b>{{mods.space}}</b></li>
|
||||
<li>Power: <b>{{mods.power}}</b></li>
|
||||
</ol>
|
||||
<p class="notes" style="opacity:.7">* Mods dodawane są tylko z wyposażonych komponentów.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<details style="margin-top:.5rem;"><summary>Raw JSON</summary>
|
||||
<pre>{{json this}}</pre>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- ROGUE TRADER TAB -->
|
||||
<div class="tab" data-group="primary" data-tab="rt">
|
||||
<div class="grid grid-2col" style="gap:.75rem;">
|
||||
<div class="card">
|
||||
<h3>RT — Stat Block</h3>
|
||||
<ol class="properties">
|
||||
<li><span>Speed</span> <b>{{rtCard.speed}}</b></li>
|
||||
<li><span>Manoeuvrability</span> <b>{{rtCard.manoeuvrability}}</b></li>
|
||||
<li><span>Detection</span> <b>{{rtCard.detection}}</b></li>
|
||||
<li><span>Hull Integrity</span> <b>{{rtCard.hullIntegrity}}</b></li>
|
||||
<li><span>Armour</span> <b>{{rtCard.armour}}</b></li>
|
||||
<li><span>Space</span> <b>{{rtCard.space}}</b></li>
|
||||
<li><span>Power</span> <b>{{rtCard.power}}</b></li>
|
||||
<li><span>Turret</span> <b>{{rtCard.turret}}</b></li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>RT — Weapon Capacity</h3>
|
||||
<ol class="properties">
|
||||
<li>Prow: <b>{{rtCard.weapons.prow}}</b></li>
|
||||
<li>Dorsal: <b>{{rtCard.weapons.dorsal}}</b></li>
|
||||
<li>Port: <b>{{rtCard.weapons.port}}</b></li>
|
||||
<li>Starboard: <b>{{rtCard.weapons.starboard}}</b></li>
|
||||
<li>Keel: <b>{{rtCard.weapons.keel}}</b></li>
|
||||
</ol>
|
||||
{{#if rtCard.notes}}<hr><p style="opacity:.85">{{rtCard.notes}}</p>{{/if}}
|
||||
{{#if rtCard.source}}<p class="notes" style="margin-top:.25rem; opacity:.65;">Source: {{rtCard.source}}</p>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<details style="margin-top:.5rem;"><summary>Raw RT</summary>
|
||||
<pre>{{json actor.flags.wg-voidships-builder.rtRaw}}</pre>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- CREW TAB -->
|
||||
<div class="tab" data-group="primary" data-tab="crew">
|
||||
<div class="grid grid-2col" style="gap:.5rem;">
|
||||
<div class="card">
|
||||
<h3>Main Roles</h3>
|
||||
<ol class="properties">
|
||||
<li>Command: <b>{{crew.command}}</b></li>
|
||||
<li>Pilot/Helm: <b>{{crew.pilot}}</b></li>
|
||||
<li>Sensors/Auspex: <b>{{crew.sensors}}</b></li>
|
||||
<li>Engineering: <b>{{crew.engineering}}</b></li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>Combat & Support</h3>
|
||||
<ol class="properties">
|
||||
<li>Gunnery: <b>{{crew.gunnery}}</b></li>
|
||||
<li>Security/Armsmen: <b>{{crew.security}}</b></li>
|
||||
<li>Flight Deck: <b>{{crew.flightDeck}}</b></li>
|
||||
<li>Passengers: <b>{{crew.passengers}}</b></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<details style="margin-top:.5rem;"><summary>Raw Crew</summary>
|
||||
<pre>{{json crew}}</pre>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- COMPONENTS TAB -->
|
||||
<div class="tab" data-group="primary" data-tab="components">
|
||||
<div class="grid grid-2col" style="gap:.75rem;">
|
||||
<div class="card">
|
||||
<h3>Capacity</h3>
|
||||
<ol class="properties">
|
||||
<li>Space (free / total): <b>{{totals.spaceFree}}</b> / <b>{{totals.space}}</b></li>
|
||||
<li>Power (free / total): <b>{{totals.powerFree}}</b> / <b>{{totals.power}}</b></li>
|
||||
</ol>
|
||||
{{#if warnings.capacity}}<p class="warning" style="color:#b45309;">{{warnings.capacity}}</p>{{/if}}
|
||||
<hr>
|
||||
<h3>Slots Used</h3>
|
||||
<ol class="properties">
|
||||
<li>Prow: <b>{{slotsUsed.prow}}</b> / <b>{{hull.slots.prow}}</b></li>
|
||||
<li>Dorsal: <b>{{slotsUsed.dorsal}}</b> / <b>{{hull.slots.dorsal}}</b></li>
|
||||
<li>Port: <b>{{slotsUsed.port}}</b> / <b>{{hull.slots.port}}</b></li>
|
||||
<li>Starboard: <b>{{slotsUsed.starboard}}</b> / <b>{{hull.slots.starboard}}</b></li>
|
||||
<li>Keel: <b>{{slotsUsed.keel}}</b> / <b>{{hull.slots.keel}}</b></li>
|
||||
</ol>
|
||||
{{#if warnings.slots}}<p class="warning" style="color:#b45309;">{{warnings.slots}}</p>{{/if}}
|
||||
{{#if warnings.requirements}}<p class="warning" style="color:#b91c1c;">{{warnings.requirements}}</p>{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Mounted Components</h3>
|
||||
{{#if components.length}}
|
||||
<table class="table" style="width:100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left;">Name</th>
|
||||
<th>Slot</th>
|
||||
<th>Use</th>
|
||||
<th>Mods</th>
|
||||
<th style="width:90px;">Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each components as |c|}}
|
||||
<tr data-item-id="{{c.itemId}}">
|
||||
<td style="text-align:left;">
|
||||
{{#if c.equipped}}<i class="fa-solid fa-plug" title="Equipped"></i>{{else}}<i class="fa-regular fa-square" title="Unequipped"></i>{{/if}}
|
||||
{{c.name}}
|
||||
</td>
|
||||
<td style="text-align:center;">{{c.slot}}</td>
|
||||
<td style="text-align:center;">
|
||||
<small>Space: {{c.use.space}}, Power: {{c.use.power}}</small>
|
||||
</td>
|
||||
<td>
|
||||
<small>
|
||||
{{#if c.mods.armour}}Armour {{signed c.mods.armour}} {{/if}}
|
||||
{{#if c.mods.integrity}}Integrity {{signed c.mods.integrity}} {{/if}}
|
||||
{{#if c.mods.manoeuvre}}Manoeuvre {{signed c.mods.manoeuvre}} {{/if}}
|
||||
{{#if c.mods.detection}}Detection {{signed c.mods.detection}} {{/if}}
|
||||
{{#if c.mods.speed}}Speed {{signed c.mods.speed}} {{/if}}
|
||||
{{#if c.mods.space}}Space {{signed c.mods.space}} {{/if}}
|
||||
{{#if c.mods.power}}Power {{signed c.mods.power}} {{/if}}
|
||||
</small>
|
||||
</td>
|
||||
<td style="text-align:center;">
|
||||
<a class="control" data-action="comp-toggle" title="Toggle Equipped"><i class="fa-solid fa-power-off"></i></a>
|
||||
<a class="control" data-action="comp-edit" title="Edit Component"><i class="fa-solid fa-pen-to-square"></i></a>
|
||||
<a class="control" data-action="comp-remove" title="Remove"><i class="fa-solid fa-trash"></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{else}}
|
||||
<p style="opacity:.7">No components installed. Drag items from the Components compendium here.</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<details style="margin-top:.5rem;"><summary>Raw Components & Use</summary>
|
||||
<pre>{{json components}}</pre>
|
||||
<pre>{{json use}}</pre>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</form>
|
||||
@@ -2,7 +2,3 @@
|
||||
|
||||
This module contains a single Journal Entry with subpages created from files in `wg-voidships.1.1.zip`.
|
||||
Import the Journal into your world from the **W&G Voidships Docs** compendium.
|
||||
|
||||
- Compatible with Foundry VTT v11+
|
||||
- Ownership: default Observer (2)
|
||||
- Source archive: wg-voidships.1.1.zip
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"id": "wg-voidships-journal",
|
||||
"title": "W&G Voidships 1.1 — Journal Pack",
|
||||
"description": "A single Journal Entry with subpages for each document from wg-voidships.1.1.zip.",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"compatibility": {
|
||||
"minimum": "11",
|
||||
"verified": "11"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
0.2
|
||||