Compare commits

...

186 Commits

Author SHA1 Message Date
root 0e0fd22fad auto commit 2025-12-03 20:21:56 +01:00
macniel 80d1b29486 Merge pull request 'feature/zauber-rework' (#67) from feature/zauber-rework into main
Reviewed-on: #67
2025-12-03 20:20:40 +01:00
macniel 24bb15f502 Merge remote-tracking branch 'origin/main' into feature/zauber-rework
Pull Request Check / testing (pull_request) Successful in 21s Details
# Conflicts:
#	src/system.json
2025-12-03 20:20:24 +01:00
macniel 75280e5590 finalises spell system on basic implementation level 2025-12-03 20:07:35 +01:00
macniel 98864464b1 adds value statistics to message 2025-11-30 12:27:00 +01:00
macniel 8be096f464 changes on the form persist now, spell is now correctly queued. 2025-11-30 12:20:53 +01:00
macniel c51e281530 adjust dialog flow to match spell casting in 4.1 2025-11-30 11:21:26 +01:00
macniel 50c28cb380 moves roll mechanic into global file 2025-11-30 11:21:07 +01:00
macniel 2ee6ed775b equalise field probenMod 2025-11-30 11:20:39 +01:00
macniel 235dd0928d adds clausel that Kosten Einsparen reduces the costs by at least 1 AsP. 2025-11-28 15:05:45 +01:00
macniel 07ba1c889b fixes error found with ATTRIBUTO 2025-11-28 14:59:42 +01:00
macniel cc60f9e57f finalises calculation for SpoMods 2025-11-28 14:50:47 +01:00
macniel 94a80eb321 implements spell restrictions 2025-11-27 15:25:40 +01:00
macniel 959f47f348 implements partial (display) support for SpoMods 2025-11-26 20:54:32 +01:00
macniel 5f85631679 displays ZfW based on selected Mods and its initial Spell Value 2025-11-26 19:03:52 +01:00
macniel 957584206d first attempts at normalising dialog flow 2025-11-23 20:51:14 +01:00
macniel 9727d7bc3a src/system.json aktualisiert 2025-11-19 16:14:35 +01:00
macniel 4a9bfe2865 adds english language file 2025-11-19 16:13:53 +01:00
macniel ce6207be95 reworked BRW spells as a PoC 2025-11-17 17:35:39 +01:00
root 468984a83b auto commit 2025-11-16 23:35:11 +01:00
macniel 3f8794e181 the return of the paperdoll 2025-11-16 23:32:49 +01:00
macniel f5b4633f76 README.md aktualisiert 2025-11-16 17:03:41 +01:00
macniel c6829ff697 README.md aktualisiert 2025-11-16 17:03:21 +01:00
macniel 3207020d57 README.md aktualisiert 2025-11-16 17:03:07 +01:00
root df61621565 auto commit 2025-11-16 17:02:10 +01:00
macniel 61e1bd2836 Merge pull request 'feature/after_review' (#65) from feature/after_review into main
Reviewed-on: #65
2025-11-16 16:58:15 +01:00
macniel f7d772b6ca Merge branch 'main' into feature/after_review
Pull Request Check / testing (pull_request) Successful in 19s Details
2025-11-16 16:58:01 +01:00
macniel 02f0ecc9dd implements last standalone tab 2025-11-16 16:56:54 +01:00
macniel 182aeb2dc6 implements optional fatigue system. 2025-11-16 16:07:42 +01:00
macniel c00a6b11b7 fixes NPE as ranged items could be equipped when the actor doesnt even have the skill to do so. 2025-11-16 13:35:39 +01:00
macniel eca965e434 increases discoverability of die interactions 2025-11-16 13:26:02 +01:00
macniel 6f935644c1 spell and liturgy dice are now easier to recognise 2025-11-16 13:19:54 +01:00
macniel 4f4446d327 introduces socketlib as hard requirement enabling players to loot and buy even when they lack the permission to update items they don't own (yet). 2025-11-16 12:36:19 +01:00
macniel e0e70d126f fix faulty tab config on creatureSheet 2025-11-16 11:52:56 +01:00
macniel 692867f2ac finalises missing sidebutton tabs 2025-11-16 11:41:35 +01:00
macniel 46b6ed8f2a implements colorful sidebar buttons 2025-11-16 11:03:50 +01:00
macniel 189db593aa fixes styling in merchant sheet 2025-11-16 10:18:02 +01:00
macniel d355cb2d5c fixes orientiation of sidebuttons 2025-11-14 21:29:00 +01:00
macniel accd2d1f16 continues development on mini character sheet 2025-11-14 15:57:07 +01:00
macniel 0fffebdab9 implements mini character sheet, now it also needs tabs on the side to open dedicated sections from the big boy character sheet as dialogs. 2025-11-14 00:07:31 +01:00
macniel 6d366188ea begins implementing sidebar elements for pinned Items 2025-11-13 22:40:48 +01:00
macniel 47280f7216 beginning operation:health. 2025-11-13 15:04:34 +01:00
macniel bbf181eb8c implements selecting an item and buying that if the coin is sufficent. 2025-11-13 15:04:11 +01:00
macniel 1bc6d9673a inverts cooldown display, removes unintuitive progress/activate button and also fixes a bug in the tooltip 2025-11-12 20:42:29 +01:00
macniel 811806a68b makes talents more subtle also adds tooltips to rollable on the skill sheet. 2025-11-12 20:13:21 +01:00
macniel bdcb09c82e fixes rounding issue 2025-11-12 19:09:44 +01:00
macniel cfc5bc15b1 fixes rounding issue 2025-11-12 19:09:07 +01:00
macniel 29d25f8afe Implements Filtering 2025-11-12 17:05:45 +01:00
macniel c2b8a7d895 implements creating Equipment from scratch and also an Equipment/Item Browser from where to drag and drop (perhaps even buy from) new Equipment onto an Actor. 2025-11-12 00:21:55 +01:00
macniel ed893f6b9d fixes some user experience issues 2025-11-11 22:20:01 +01:00
macniel 316ab90c67 fixes some user experience issues 2025-11-11 22:19:54 +01:00
macniel 7e34251397 fixes some user experience issues 2025-11-09 19:14:35 +01:00
root 28f19772f2 auto commit 2025-11-09 10:54:04 +01:00
macniel d51aa18a19 finalise darkmode 2025-11-09 10:53:11 +01:00
macniel 0f9032c3f5 beginnings of darkmode 2025-11-09 00:41:54 +01:00
root 34d7175c39 auto commit 2025-11-08 20:52:11 +01:00
macniel 97fe0fa9a6 implements deity model and sheet.
the model includes stats important for clerics as it contains miracle Plus and miracle Minus.
2025-11-08 14:21:28 +01:00
root 7b0f407239 auto commit 2025-11-07 22:53:23 +01:00
macniel f402661488 fixes jsons 2025-11-07 22:51:47 +01:00
macniel 03de483e9a fixes paths 2025-11-07 22:49:09 +01:00
root 1adff7568d auto commit 2025-11-04 18:20:18 +01:00
macniel 97466ed45d Merge pull request 'starts cleaning code and also localisation' (#64) from feature/cleanup-and-localisation into main
Reviewed-on: #64
2025-11-04 18:19:30 +01:00
macniel 12c9b0766a starts cleaning code and also localisation 2025-11-04 00:20:41 +01:00
macniel 5104f43e2f inventory is now contained in its own scrollView. 2025-11-03 18:14:53 +01:00
macniel 34c95891e6 cleans up code 2025-11-03 18:14:39 +01:00
macniel 223ea9e26b cleans up init Hook 2025-11-03 16:26:05 +01:00
macniel 4be53924d8 best stock prices guaranteed. 2025-11-02 21:00:50 +01:00
macniel 8258f53a3a enables buying of goods and reducing the wealth of the actor who bought the good and proclaiming it loudly in chat. 2025-11-02 20:53:09 +01:00
root 6d4f8694df auto commit 2025-11-01 12:30:31 +01:00
macniel 72248f2635 fixes styling of merchant items 2025-11-01 12:29:05 +01:00
macniel 1d714a3773 enables selling of goods 2025-11-01 12:26:14 +01:00
root 95712704b5 auto commit 2025-11-01 11:54:43 +01:00
macniel 7788035c8c restores lep calculation 2025-11-01 11:53:13 +01:00
root b66e4e77ac auto commit 2025-11-01 11:45:08 +01:00
macniel e862185803 fixes casing 2025-11-01 11:44:06 +01:00
root dc97fffba2 auto commit 2025-11-01 11:29:28 +01:00
macniel db81e2def1 fixes asynchronous error with gitkeep, but do not process them 2025-11-01 11:28:30 +01:00
macniel 373781b5b0 fixes asynchronous error with gitkeep as the directory was not pushed 2025-11-01 11:26:40 +01:00
macniel 394992d447 fixes asynchronous error with a pinky promise 2025-11-01 11:24:15 +01:00
macniel ec4c9768dd fixes asynchronous error with a pinky promise 2025-11-01 11:21:10 +01:00
macniel df4fd6061d fixes asynchronous error with a pinky promise 2025-11-01 11:16:08 +01:00
macniel bb35d0d6e7 fixes asynchronous error with a pinky promise 2025-11-01 11:08:29 +01:00
macniel 7476c55e63 fixes asynchronous error 2025-11-01 10:58:44 +01:00
macniel 5b46f36c58 fixes asynchronous error 2025-11-01 10:55:13 +01:00
macniel 026f222718 fixes asynchronous error 2025-11-01 10:45:08 +01:00
root b69511f93a auto commit 2025-11-01 10:35:41 +01:00
macniel 9a57bcd77a establishes fixed randomIDs 2025-11-01 10:26:24 +01:00
macniel 62c5702992 removes stray generated abvenenum 2025-11-01 10:25:24 +01:00
macniel 9948521512 liturgies can now be pushed into queue. 2025-10-31 19:15:15 +01:00
macniel a861245d44 adds special ability group support. 2025-10-31 16:12:43 +01:00
root e69374f6f4 auto commit 2025-10-31 16:03:21 +01:00
root 7a89809af4 auto commit 2025-10-31 16:01:04 +01:00
macniel b179545a8e README.md aktualisiert 2025-10-31 15:59:51 +01:00
macniel 7d04520470 src/system.json aktualisiert 2025-10-31 15:58:48 +01:00
macniel f4af6fa56b fix buildscript to not overwrite static manifest path 2025-10-31 15:57:56 +01:00
root 95ce581f52 auto commit 2025-10-31 15:57:02 +01:00
macniel 0e667398ae update raw 2025-10-31 15:55:57 +01:00
root 80aa21ea53 auto commit 2025-10-31 15:54:14 +01:00
macniel 03f20554a3 update buildscript to commit changes to main 2025-10-31 15:53:32 +01:00
macniel 5c6d588b04 update buildscript to commit changes to main 2025-10-31 15:51:46 +01:00
macniel f073b6570c update buildscript to commit changes to main 2025-10-31 15:49:03 +01:00
macniel d5f3a10956 update buildscript to commit changes to main 2025-10-31 15:48:24 +01:00
macniel 1ba4d340f8 update buildscript to commit changes to main 2025-10-31 15:46:22 +01:00
macniel db8ad0a83f update buildscript to commit changes to main 2025-10-31 15:45:13 +01:00
macniel 2b33613801 update buildscript to commit changes to main 2025-10-31 15:44:12 +01:00
macniel 932f935b88 update buildscript to commit changes to main 2025-10-31 15:43:01 +01:00
macniel d5ae25a52c update buildscript to commit changes to main 2025-10-31 15:37:47 +01:00
macniel 83b5b79f61 update buildscript to commit changes to main 2025-10-31 15:33:32 +01:00
macniel 2872aa743e update buildscript to commit changes to main 2025-10-31 15:29:57 +01:00
macniel b4e614ec74 fixes buildscript 2025-10-31 15:16:56 +01:00
macniel 517bd2f50b removes strange loca key 2025-10-31 14:07:04 +01:00
macniel 6dec43c1b2 adds some fluff to attributes. 2025-10-31 13:59:57 +01:00
macniel 453db6f599 implements die roll dialogs for attributes / flaws. 2025-10-31 13:52:54 +01:00
macniel 277318a37b using new potions icon for Ink. 2025-10-31 13:01:31 +01:00
macniel 819ab5c790 removes deprecated commented code 2025-10-31 13:00:29 +01:00
macniel 0fb82d01e7 fixes situational bonuses to not apply constantly on attributes and the like 2025-10-31 11:54:38 +01:00
macniel fcbf6abaf6 implements dialog for rolling skills 2025-10-31 11:46:10 +01:00
macniel d3f5702fd5 fix eigenschaften 2025-10-31 10:18:38 +01:00
macniel f1052d77b9 Merge pull request 'feature/liturgy-dialog' (#63) from feature/liturgy-dialog into main
Reviewed-on: #63
2025-10-30 23:10:43 +01:00
macniel dda93eeacb implements basic liturgy casting dialog 2025-10-30 23:06:51 +01:00
macniel bf78cfde87 Merge remote-tracking branch 'origin/main' into feature/liturgy-dialog 2025-10-30 11:54:39 +01:00
macniel 2362631465 fixes catastrophic failure in xmlImport 2025-10-30 11:08:07 +01:00
macniel eb6f13f78e restores wounds logic 2025-10-30 11:03:58 +01:00
macniel d62bbe9886 frees the dice from the box 2025-10-30 10:40:11 +01:00
macniel 23543efe45 adds recently released SODA icons 2025-10-30 10:21:08 +01:00
macniel 9ce299a202 enables rolling of character flaws 2025-10-30 10:20:35 +01:00
macniel 4395ada6f5 removes alveranian construction site 2025-10-30 10:20:31 +01:00
macniel db4428938b README.md aktualisiert 2025-10-29 15:22:23 +01:00
macniel 1833027cef Merge pull request 'feature/battle-dialog' (#62) from feature/battle-dialog into main
Reviewed-on: #62
2025-10-29 15:16:46 +01:00
macniel 196b99b52e implements roll mechanic for battle dice 2025-10-29 15:14:22 +01:00
macniel b50e4d3090 implements ui for battle dice 2025-10-29 13:21:48 +01:00
macniel b04315946b shelving for now 2025-10-29 10:46:21 +01:00
macniel db708d991c updates kreutzer design 2025-10-29 01:32:19 +01:00
macniel 9e8cadde24 README.md aktualisiert 2025-10-29 01:16:09 +01:00
macniel cabd35be04 README.md aktualisiert 2025-10-29 01:13:12 +01:00
macniel c342d8d366 fixes some glitches in display logic and also enables rolling the regeneration dice, closes the dialog afterwards. 2025-10-29 00:51:28 +01:00
macniel 9e0e85efe6 adds the ability to sumon the rest and relax dialog 2025-10-28 14:11:25 +01:00
macniel f5be5250ab enables application of Advantages and Specialabilities to character values 2025-10-28 14:11:25 +01:00
macniel bc4e1691fb enables application of Advantages and Specialabilities to character values 2025-10-28 14:11:25 +01:00
macniel 9cfa86a815 README.md aktualisiert 2025-10-27 16:56:33 +01:00
macniel 4d3fdd1d74 README.md aktualisiert
ergänzt Features aus Spielersicht
2025-10-27 16:55:02 +01:00
macniel 03650cccd3 Merge pull request 'feature/new_icons' (#61) from feature/new_icons into main
Reviewed-on: #61
2025-10-27 16:33:10 +01:00
macniel eef89c5a10 fixes default behavior for editing an image 2025-10-27 16:15:13 +01:00
macniel fca38ec507 fixes tab alignment 2025-10-27 15:42:43 +01:00
macniel 6b64b0b6db adds reverse inventory mechanic with "zusammenlegen" 2025-10-27 15:42:31 +01:00
macniel 7849ba2a90 adds Feinmechanik, Freizeitbedarf and Ketten 2025-10-27 14:10:55 +01:00
macniel 6fd5dfc4be adds Feinmechanik, Freizeitbedarf and Ketten 2025-10-27 13:57:19 +01:00
macniel 5d75e3b160 adds new icons by kitbashing already existing Icons by SODA. 2025-10-27 10:55:59 +01:00
macniel ff09875ad3 adds with splitStack a new equipment interaction 2025-10-27 10:55:31 +01:00
macniel 92540c58cb adds new equipment 2025-10-27 10:34:56 +01:00
macniel 87a785e65d adds new icons made by SODA 2025-10-27 00:21:56 +01:00
macniel 1e93d552b1 adds currency to compendia.
Also fixes skittish hover-behavior of equipment items.
2025-10-26 22:04:52 +01:00
macniel 8cf8a61730 adds currency to compendia.
Also fixes skittish hover-behavior of equipment items.
2025-10-26 21:11:49 +01:00
macniel e7a1e3d3cf adds forgotten assets 2025-10-26 18:07:44 +01:00
macniel a57cf98aa1 implements lootable creatures 2025-10-26 17:44:08 +01:00
macniel 2da34b6af3 fix broken json 2025-10-26 17:09:25 +01:00
macniel 5f1011b441 upgrades compendium data to final form 2025-10-26 16:45:09 +01:00
macniel 5f802aa275 adds GM Tool "Merchant" 2025-10-26 14:08:55 +01:00
macniel 2e217abe8f increases drop target for equipment and also fixes display of item icons 2025-10-25 10:26:47 +02:00
macniel d0c9fb56fc fixes finally import error of height 2025-10-24 14:20:37 +02:00
macniel dce8df4b50 increases affordance 2025-10-24 14:15:31 +02:00
macniel b42bb8caca fixes import 2025-10-24 13:41:23 +02:00
macniel 957ce31eb1 fixes typo 2025-10-24 13:32:21 +02:00
macniel 408ef3ddc0 adds GRW races to compendia 2025-10-24 13:31:19 +02:00
macniel ae57e2f90e adds Mod Info and the Current choice to SpecialAbility Sheet 2025-10-24 11:05:06 +02:00
macniel 3f6b4a0303 implements defense screen 2025-10-24 09:57:11 +02:00
macniel f67560a2b1 removes unused code 2025-10-23 12:46:49 +02:00
macniel 7d23af8902 implements cooldowntracker for ongoing actions 2025-10-23 12:41:52 +02:00
macniel 3c7426bf56 adds benefit display of mod value 2025-10-22 23:57:40 +02:00
macniel 47a1881442 removes worse options when an SF could be applied 2025-10-22 23:06:45 +02:00
macniel 2b22a8fa6f finalises dialog 2025-10-22 16:42:07 +02:00
macniel 10d05683ad fixes typo 2025-10-22 16:41:51 +02:00
macniel 7f18c62270 implements combat attack dialog 2025-10-22 13:21:24 +02:00
macniel b2d9a82af8 adjusting SFs for better and consistent parsing 2025-10-22 13:21:05 +02:00
macniel dcdcecb39f fixes issue with import xmls of characters that dont have gegenstände 2025-10-21 17:04:47 +02:00
macniel a7164eab53 first fruitful attempts of managing actions based on SF requirements 2025-10-21 17:04:09 +02:00
macniel 9352a418a8 reworks requirements of SF into a workable solution. 2025-10-21 17:03:39 +02:00
macniel 4d7d71f2e5 fixes styling of equipment sheet, atleast the meta page 2025-10-21 13:31:22 +02:00
macniel 81f9357c10 fixes linkage 2025-10-21 13:23:30 +02:00
macniel c4863b4493 adds import of equipment 2025-10-21 12:38:04 +02:00
macniel b49f945a74 fixes general styling 2025-10-21 12:16:08 +02:00
macniel 7fe5ba1595 rigs specialabilities for import. 2025-10-21 12:15:59 +02:00
macniel 9f91606516 restores styling of advantages/disadvantages and specialabilities. 2025-10-21 12:15:31 +02:00
macniel 1993c1696f rigs nachteile for compendium import 2025-10-21 11:29:42 +02:00
macniel 1c9d4a1f1f repackages xml-import into class and adds configuration dialog to it 2025-10-21 11:02:19 +02:00
macniel 53c5c7b53a Merge pull request 'feature/applicationv2' (#57) from feature/applicationv2 into main
Reviewed-on: #57
2025-10-21 01:19:41 +02:00
3614 changed files with 173529 additions and 26533 deletions

View File

@ -7,6 +7,8 @@ on:
jobs: jobs:
build: build:
runs-on: node-01 runs-on: node-01
permissions:
contents: write
steps: steps:
- name: Print Tag - name: Print Tag
run: | run: |
@ -38,11 +40,15 @@ jobs:
zip -r release.zip . # Adjust the path to your build output directory zip -r release.zip . # Adjust the path to your build output directory
mv release.zip /tmp/release.zip mv release.zip /tmp/release.zip
- name: Auto Commit
run: |
git add .
git commit -m "auto commit"
git push origin HEAD:main
- name: Package Upload - name: Package Upload
uses: akkuman/gitea-release-action@v1 uses: akkuman/gitea-release-action@v1
with: with:
server_url: https://git.macniel.online server_url: https://git.macniel.online
files: | files: |
/tmp/release.zip /tmp/release.zip
./dist/system.json

View File

@ -0,0 +1,21 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="7">
<item index="0" class="java.lang.String" itemvalue="nobr" />
<item index="1" class="java.lang.String" itemvalue="noembed" />
<item index="2" class="java.lang.String" itemvalue="comment" />
<item index="3" class="java.lang.String" itemvalue="noscript" />
<item index="4" class="java.lang.String" itemvalue="embed" />
<item index="5" class="java.lang.String" itemvalue="script" />
<item index="6" class="java.lang.String" itemvalue="prose-mirror" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
</profile>
</component>

View File

@ -1,6 +1,9 @@
Modulentwicklung eines Systems was Das Schwarze Auge 4.1 in FoundryVTT abbildet. Modulentwicklung eines Systems was Das Schwarze Auge 4.1 in FoundryVTT abbildet.
---- ----
Manifest des Systems: `https://git.macniel.online/macniel/foundry-dsa41-game/raw/branch/main/src/system.json`
In diesem Repository findet die Codeentwicklung des Moduls statt. In diesem Repository findet die Codeentwicklung des Moduls statt.
## Weitere Resourcen ## Weitere Resourcen
@ -17,4 +20,67 @@ API: https://foundryvtt.com/api/classes/foundry.abstract.Document.html
Demo: https://github.com/foundryvtt/dnd5e Demo: https://github.com/foundryvtt/dnd5e
Flim Flam # Features
## Spieler Tools
### Währungsanzeige
Mit dieser handlichen Anzeige kann man auf einem Blick sehen, über wieviele Geldmittel man verfügt. Hierzu werden alle Dukaten, Silbertaler, Kreuzer und Heller im Inventar zusammengezählt und ansprechend präsentiert.
### Teilen und Zusammenlegen von Gegenstands-Stapeln
Es ist möglich via Kontextmenü Gegenstands-Stapel in zwei Stapel aufzuteilen, dies ist vorallem dann hilfreich, wenn man Loot aufteilen möchte. Gleichermaßen ist es möglich gleichartige Gegenstands-Stapel zusammenzuführen, in dem man einen Stapel auf ein anderen fallen lässt.
### Attacke Dialog
Über den Charakterbogen kann eine Attacke gestartet werden. In diesem Dialog kann das Ziel, die Waffe sowie das Manvör und etwaige Erschwernisse und Ansagen eingestellt werden. Je nach Länge des Manövers wird die Attacke direkt ausgeführt oder in die Abklingleiste deponiert.
### Verteidigungs Dialog
Über den Charakterbogen kann eine Verteidigung gestartet werden. In diesem Dialog kann die Waffe oder das Manöver ausgewählt werden womit sich der Charakter verteidigen soll. Der Verteidigungswurf wird automatisch durchgeführt.
### Rasten und Regeneration
Es ist möglich den Rasten und Regenerations Dialog von dem Charakterbogen eines Charakters aufzurufen worin man die Einstellungen vornehmen kann die die Regeneration während einer Rest von Lebensenergie und Astralenergie sowie der Heilung von Wunden beeinflussen.
### Mini Charakterbogen
Wenn der Charakterbogen schmall genug gezogen ist, wird dieser aktiviert und enthält lediglich die Seitenleiste sowie die Attribute auf denen gewürfelt werden können. Daneben allerdings befinden sich die Reiter des großen Charakterbogens welche die jeweiligen Seiten in kleiner Form als separates Fenster öffnen lassen.
### Item Browser
Es ist nun möglich auf dem Charakterbogen unter dem Reiter "Inventar" den Item Browser zu öffnen wo alle Gegenstände der aktuellen Welt enthalten sind und mit rudimentären Filtern durchsucht werden können. Ein Spieler kann hierrüber neue Gegenstände kaufen, der Spielleiter hingegen kann per Drag and Drop die gesuchten Gegenstände auf alle Actor Sheets hinzufügen.
## GM Tools
### Gruppenmanagement
Um die Übersicht zu wahren, gibt es mit Gruppen das Werkzeug in die Hände der Spielleitung um wichtige Infos wie
Eigenschaften, Vor und Nachteile und andere Statistiken eines Charakters innerhalb einer Gruppe zu haben und diese
gleichzeitigt mit denen anderer vergleichen zu können.
### Kreaturen
Da die Erstellung eines Charakters sehr komplex ist, gibt es mit Kreaturen eine stark abgespeckte Variante, die leicht
während der Sitzung oder in Vorbereitung angelegt werden können. Nur die für kämpfischer Begegnungen relevanten
Informationen sind verfügbar.
### Händler
Um die Vorbereitung einer Sitzung so komfortabel wie möglich zu gestalten, gibt es mit Händler die Möglichkeit Gebäude
oder NSCs vorzubereiten welche Waren und oder (ggf. in Anzahl beschränkte) Dienstleistungen bereitstellen, gegen einen
Preis natürlich.
### Battle
Um heimlich vergleichend Talentproben von zwei Charakteren und oder Kreaturen durchzuführen gibt es den Battle Dialog. In diesem können Charaktere/Kreaturen ausgewählt werden, deren Talente ausgewählt oder eingegeben (samt Eigenschaften) werden, Erschwernisse eingetragen werden und dann geht es auch schon los.
---
# Acknowledgments
Icon Theme of Equipment Items (e.g. Weapons, Armory, Adventuring Gear) is made by https://soda-1.itch.io/
Tanja für den UI UX Support.

View File

@ -1,70 +1,109 @@
import {dest, series, src} from 'gulp'; import {dest, series, src} from 'gulp';
import gulp from 'gulp';
import process from 'node:process'; import process from 'node:process';
import replace from 'gulp-replace'; import replace from 'gulp-replace';
import {getRandomValues} from 'node:crypto'; import jsonModify from 'gulp-json-modify';
import {subtle} from 'node:crypto';
import * as dartSass from 'sass'; import * as dartSass from 'sass';
import gulpSass from 'gulp-sass'; import gulpSass from 'gulp-sass';
import {deleteAsync} from 'del'; import {deleteAsync} from 'del';
import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync} from "fs"; import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync, statSync} from "fs";
import {join} from 'node:path'; import {join} from 'node:path';
import {compilePack} from '@foundryvtt/foundryvtt-cli'; import {compilePack} from '@foundryvtt/foundryvtt-cli';
const sass = gulpSass(dartSass); const sass = gulpSass(dartSass)
/** /**
* Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`. * Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`.
* @param {string} reference The reference which should be used to generate a semi random ID
* @param {number} length The length of the random string to generate, which must be at most 16384. * @param {number} length The length of the random string to generate, which must be at most 16384.
* @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9). * @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9).
*/ */
function randomID(length = 16) { function randomID(reference = "", length = 16) {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; const encoder = new TextEncoder()
const cutoff = 0x100000000 - (0x100000000 % chars.length); const data = encoder.encode(reference)
const random = new Uint32Array(length); return subtle.digest('SHA-256', data).then(hashBuffer => {
do { // Step 2: Convert the hash to a Base62 string
getRandomValues(random); const base62Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
} while (random.some(x => x >= cutoff)); const hashArray = new Uint8Array(hashBuffer)
let id = ""; let num = BigInt(0)
for (let i = 0; i < length; i++) id += chars[random[i] % chars.length];
return id; // Convert hash buffer to a BigInt
for (let byte of hashArray) {
num = (num << BigInt(8)) | BigInt(byte)
}
let base62Id = '';
while (num > 0) {
const remainder = num % BigInt(62)
base62Id = base62Chars[Number(remainder)] + base62Id
num = num / BigInt(62)
}
// Step 3: Return the first 16 characters
return base62Id.slice(-length)
});
} }
const convert = function (from, to, ofType) { const convert = function (from, to, ofType, overwrite = true) {
const SOURCE = from; const SOURCE = from;
const DEST = to; const DEST = to;
const TYPE = ofType; const TYPE = ofType;
try { if (overwrite) {
rmdirSync(DEST, {force: true, recursive: true}) try {
} catch (e) { rmdirSync(DEST, {force: true, recursive: true})
} } catch (e) {
mkdirSync(DEST)
readdirSync(SOURCE).forEach(file => {
console.log(file)
let originalSource = JSON.parse(readFileSync(join(SOURCE, file), {encoding: "utf8"}));
let id = randomID();
let targetSource = {
_id: id,
_key: "!items!" + id,
type: TYPE,
img: originalSource.image,
name: originalSource.name.trim(),
system: {...originalSource},
} }
delete targetSource.system.image; mkdirSync(DEST)
let target = JSON.stringify(targetSource, null, 2); }
let newFileName = "./" + join(DEST, id + ".json");
writeFileSync(newFileName, target, {encoding: "utf8"});
});
let promises = []
const filewalker = async (source) => {
console.debug("entering directory", source)
for (let file of readdirSync(source)) {
if (statSync(join(source, file)).isDirectory()) {
await filewalker(join(source, file))
} else {
if (file.endsWith(".json")) {
console.debug("processing file", join(source, file))
let originalSource = JSON.parse(readFileSync(join(source, file), {encoding: "utf8"}))
promises.push(new Promise((resolve2) => {
randomID("DSA_4-1" + TYPE + originalSource.name.trim()).then(id => {
let targetSource = {
_id: id,
_key: "!items!" + id,
type: TYPE,
img: originalSource.image,
name: originalSource.name.trim(),
system: {...originalSource},
}
delete targetSource.system.image;
let target = JSON.stringify(targetSource, null, 2)
let newFileName = "./" + join(DEST, id + ".json")
if (!existsSync(join("./", DEST))) {
mkdirSync(join("./", DEST))
}
writeFileSync(newFileName, target, {encoding: "utf8"})
resolve2()
})
}))
}
}
}
}
filewalker(SOURCE)
return Promise.allSettled(promises)
} }
function cleanDist() { function cleanDist() {
return deleteAsync(['dist/**']); return deleteAsync(['dist/**'])
} }
function buildStyles() { function buildStyles() {
@ -84,38 +123,60 @@ function copyAssets() {
} }
function updateManifestFile() { function updateManifestFile() {
return src('dist/system.json') return src('src/system.json')
.pipe(replace('{{VERSION}}', process.env.VERSION)) .pipe(
.pipe(dest('dist/')) jsonModify({
key: "version",
value: process.env.VERSION
})
)
.pipe(
jsonModify({
key: "download",
value: "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/release.zip".replace("{{VERSION}}", process.env.VERSION)
})
)
.pipe(dest('src/'))
} }
async function prepareDB() { gulp.task('prepareDB', async function (done) {
try { try {
if (!existsSync("./src/packs/__source")) { if (!existsSync("./src/packs/__source")) {
mkdirSync("./src/packs/__source"); mkdirSync("./src/packs/__source");
} }
convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill"); await convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill")
convert("./src/packs/_source/zauber", "./src/packs/__source/zauber", "Spell"); await convert("./src/packs/_source/zauber-brw", "./src/packs/__source/zauber", "Spell")
convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage"); await convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage")
convert("./src/packs/_source/waffen", "./src/packs/__source/waffen", "Equipment"); await convert("./src/packs/_source/nachteile", "./src/packs/__source/vorteile", "Advantage", false)
convert("./src/packs/_source/munition", "./src/packs/__source/munition", "Equipment"); await convert("./src/packs/_source/sonderfertigkeiten", "./src/packs/__source/sonderfertigkeiten", "SpecialAbility")
convert("./src/packs/_source/ruestzeug", "./src/packs/__source/ruestzeug", "Equipment"); await convert("./src/packs/_source/waehrungen", "./src/packs/__source/waehrungen", "Equipment")
convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy"); await convert("./src/packs/_source/Gegenstaende/Waffen", "./src/packs/__source/waffen", "Equipment")
convert("./src/packs/_source/wunden", "./src/packs/__source/wunden", "ActiveEffect"); await convert("./src/packs/_source/Gegenstaende/Munition", "./src/packs/__source/munition", "Equipment")
await convert("./src/packs/_source/Gegenstaende/Ruestzeug", "./src/packs/__source/ruestzeug", "Equipment")
convert("./src/packs/_source/kulturen", "./src/packs/__source/kulturen", "Culture"); await convert("./src/packs/_source/Gegenstaende/Behaelter", "./src/packs/__source/gegenstaende", "Equipment", false)
convert("./src/packs/_source/spezien", "./src/packs/__source/spezien", "Species"); await convert("./src/packs/_source/Gegenstaende/Bekleidung", "./src/packs/__source/gegenstaende", "Equipment", false)
convert("./src/packs/_source/professionen", "./src/packs/__source/professionen", "Profession"); await convert("./src/packs/_source/Gegenstaende/Beleuchtung", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Buecher", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Essutensilien", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Sonstiges", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Werkzeug", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Seile", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy")
await convert("./src/packs/_source/wunden", "./src/packs/__source/wunden", "ActiveEffect")
await convert("./src/packs/_source/kulturen", "./src/packs/__source/kulturen", "Culture")
await convert("./src/packs/_source/spezien", "./src/packs/__source/spezien", "Species")
await convert("./src/packs/_source/professionen", "./src/packs/__source/professionen", "Profession")
done()
} catch (err) { } catch (err) {
console.error(err); console.error(err)
} }
})
}
function buildDB() { gulp.task('buildDB', function (done) {
// Determine which source folders to process // Determine which source folders to process
const PACK_SRC = "src/packs/__source" const PACK_SRC = "src/packs/__source"
@ -127,23 +188,24 @@ function buildDB() {
); );
for (const folder of folders) { for (const folder of folders) {
const src = join(PACK_SRC, folder.name); const src = join(PACK_SRC, folder.name)
const dest = join(PACK_DEST, folder.name); const dest = join(PACK_DEST, folder.name)
console.info(`Compiling pack ${folder.name}`); console.info(`Compiling pack ${folder.name}`)
await compilePack(src, dest, {recursive: true, nedb: false}); await compilePack(src, dest, {recursive: true, nedb: false})
} }
resolve() resolve()
done()
}) })
} })
export default series( export default series(
cleanDist, cleanDist,
updateManifestFile,
copySource, copySource,
copyAssets, copyAssets,
buildStyles, buildStyles,
prepareDB, gulp.task('prepareDB'),
buildDB, gulp.task('buildDB')
updateManifestFile
) )

View File

@ -8,7 +8,7 @@ const DEST = "/home/macniel/.local/share/FoundryVTT/Data/systems/DSA_4-1"
if (existsSync(SRC)) { if (existsSync(SRC)) {
cpSync(SRC, resolve(DEST), {recursive: true}) cpSync(SRC, resolve(DEST), {recursive: true})
console.log(`copied ${SRC} to ${DEST}`) console.debug(`copied ${SRC} to ${DEST}`)
} else { } else {
console.error(`Source ${SRC} does not exists. Forgot to compile?`) console.error(`Source ${SRC} does not exists. Forgot to compile?`)
} }

16480
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,10 +10,11 @@
"scripts": { "scripts": {
"test": "true", "test": "true",
"build": "gulp", "build": "gulp",
"localBuild": "VERSION=0.0.1 gulp",
"installToFoundry": "node installToFoundry.mjs" "installToFoundry": "node installToFoundry.mjs"
}, },
"devDependencies": { "devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.0", "@foundryvtt/foundryvtt-cli": "^3.0.2",
"cb": "^0.1.1", "cb": "^0.1.1",
"del": "^8.0.1", "del": "^8.0.1",
"fvtt-types": "npm:@league-of-foundry-developers/foundry-vtt-types@^13.346.0-beta.20250812191140", "fvtt-types": "npm:@league-of-foundry-developers/foundry-vtt-types@^13.346.0-beta.20250812191140",
@ -26,6 +27,7 @@
"sass-build": "^1.1.6" "sass-build": "^1.1.6"
}, },
"dependencies": { "dependencies": {
"gulp-cli": "^3.1.0" "gulp-cli": "^3.1.0",
"gulp-json-modify": "^1.0.2"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1010 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

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