Compare commits

...

61 Commits

Author SHA1 Message Date
a5c6ae8fcb Fix #35 2023-10-04 21:49:07 +02:00
5e42cfbab1 Fix sheet and weapons roll 2023-09-01 20:46:36 +02:00
86a9889359 Fix #29 2023-08-30 20:19:13 +02:00
7375fa39c5 Fix #27 2023-08-30 14:22:29 +02:00
ab587740d8 Fix #25 2023-08-30 09:46:43 +02:00
0f4fe253e0 Manage packs thru LFS 2023-08-29 11:17:16 +02:00
3b13a44d9d Manage packs thru LFS 2023-08-29 09:16:18 +02:00
0ebe0c3734 Manage packs thru LFS 2023-08-29 09:16:05 +02:00
6a00dd8583 Manage packs thru LFS 2023-08-29 09:14:57 +02:00
5064b83f2b Fix #21 : Add the missing helper 2023-08-29 09:12:34 +02:00
58275c32e6 Fix #21 : Add the missing helper 2023-08-27 20:44:20 +02:00
c22b950f7c Fix #21 : Add the missing helper 2023-08-27 20:43:02 +02:00
893ca4cfa5 Fix Killing damage information 2023-08-27 16:21:58 +02:00
94065a3755 Fix Killing damage information 2023-08-27 16:21:10 +02:00
1d4d3054c3 Fix various issues 2023-08-26 22:27:17 +02:00
e5c6d3f42f Fix various issues 2023-08-26 22:25:28 +02:00
f914b9838e #7 Fix starting round 2023-08-26 21:22:42 +02:00
8a543068d2 #8 Fix column alignement 2023-08-26 21:03:25 +02:00
379b8358ee #2 Fix skill profiency 2023-08-26 20:59:41 +02:00
40ee7c3c40 Move repo to public area 2023-08-26 09:49:13 +02:00
a07f367b0c Move repo to public area 2023-08-26 09:48:07 +02:00
09bb7fb692 Move repo to public area 2023-08-26 05:38:10 +02:00
92dc81af24 Move repo to public area 2023-08-26 05:36:15 +02:00
d2430ee482 Move repo to public area 2023-08-26 05:15:18 +02:00
86780ce8ae Move repo to public area 2023-08-26 05:14:08 +02:00
b383481915 First official release 2023-08-25 23:00:21 +02:00
dca78fd4b6 Add changelog 2023-08-25 19:02:40 +02:00
f381269acf Add changelog 2023-08-25 18:58:48 +02:00
686ea4cea6 Fix manifest link 2023-08-25 18:55:34 +02:00
c915b85a7b Update README 2023-08-25 16:34:10 +02:00
5026e120c1 Equipment management 2023-08-24 23:12:55 +02:00
9cefc6f816 Equipment management 2023-08-24 20:32:12 +02:00
11d7c7d1c0 Equipment management 2023-08-24 20:32:00 +02:00
3abf9a9f8f Equipment management 2023-08-24 18:45:54 +02:00
f5c0faffd3 Equipment management 2023-08-24 15:59:54 +02:00
3f0e0a41b8 Update equipments type 2023-08-22 23:30:31 +02:00
20c49eb48c Fix Maneuvers 2023-08-15 22:12:02 +02:00
6275319164 Various fixes 2023-08-10 13:06:16 +02:00
19fb872824 Various fixes 2023-08-10 13:05:56 +02:00
002d6f4fbd Various fixes 2023-08-09 18:05:16 +02:00
43a3a2ccfa Various fixes and enhancents 2023-08-08 08:17:48 +02:00
356f0fee5f Various fixes and enhancents 2023-08-08 08:17:30 +02:00
58bcfc07a3 Various fixes and enhancents 2023-08-07 23:28:04 +02:00
3dcb60e7a9 Add compendiums + pictures + minor fixes 2023-08-04 07:04:12 +02:00
6c4812c7e4 Add compendiums + pictures + minor fixes 2023-08-03 22:32:45 +02:00
099bb0d88c Use initiative 2023-07-29 18:12:22 +02:00
9a30275640 Use initiative 2023-07-29 18:11:57 +02:00
b798cde48d Combat tracker fixes 2023-07-24 13:35:35 +02:00
a943e6defa Fix turn management 2023-07-21 14:52:22 +02:00
9099e812d5 Combat tracker fixes 2023-07-16 14:33:26 +02:00
6d6b7075df Combat tracker fixes 2023-07-07 15:35:24 +02:00
3762e6185b Combat tracker fixes 2023-07-06 21:28:52 +02:00
1e74d6f306 Combat tracker fixes 2023-07-06 13:10:41 +02:00
8f10b9825e Fixes from 29th of june 2023-06-30 22:20:44 +02:00
297c94adb7 Fixes from 29th of june 2023-06-30 21:11:29 +02:00
b535a86116 Fixes from 29th of june 2023-06-30 17:21:11 +02:00
270c7c4a91 Fixes from 29th of june 2023-06-30 13:14:40 +02:00
0b0b74754f Various/changes from 30th may requestsé 2023-06-06 09:18:33 +02:00
cf4de99242 All fixes requested 2023-05-07 14:06:48 +02:00
536739fced All fixes requested 2023-05-07 14:03:14 +02:00
2d328659b2 Combat Tracker + power enhancements 2023-04-06 16:57:19 +02:00
126 changed files with 3001 additions and 836 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
packs/* filter=lfs diff=lfs merge=lfs -text

View File

@ -1,2 +1,28 @@
# fvtt-dark-stars This is the official Hero System 6th Edition game system for FoundryVTT, based on the TTRPG from Hero Games and developed by Legendsmiths, LLC. For more information about Legendsmiths and their work, visit https://legendsmiths.com/.
The Hero System game system is not usable standalone. To play this game you need a copy of the core rulebook.
It features :
- PC/NPC sheets
- Roll management and associated helpers
- Segment and Turn management in the combat tracker
- Official compendiums
![Snapshot](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/08/hero6_snapshot_02.webp "Snapshot")
Installation
Manifest URL: https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/raw/branch/master/system.json
Project page : https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6
For manual installation, use the provided manifest URL in the "Install System" popup window while managing game systems.
Copyright (c) 2023 Legendsmiths, LLC
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
All content for the HERO System™® is DOJ, Inc.s trademark for its roleplaying system. HERO System Copyright ©1984, 1989, 2002, 2009 by DOJ, Inc. d/b/a Hero Games. All rights reserved. Fantasy Hero ©2003, 2010 by DOJ, Inc. d/b/a Hero Games. All rights reserved. Star Hero ©2003, 2011 by DOJ, Inc. d/b/a Hero Games. All rights reserved. All DOJ trademarks and copyrights used with permission and under license with Legendsmiths , LLC. For further information about Hero Games and the HERO System, visit www.herogames.com. All HERO System™® content is not be included to copy, modify, merge, publish, distribute, sublicense, and/or sell with copies of the Software with the exception of the current licensee Legendsmiths, LLC.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -39,9 +39,9 @@
{"name":"Concealment","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Concealment","description":"Concealment represents a characters ability to hide things and to find things which others have hidden — important papers, weapons, jewels, arti- facts, drugs, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"YfLechAkLdcHGPCm"} {"name":"Concealment","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Concealment","description":"Concealment represents a characters ability to hide things and to find things which others have hidden — important papers, weapons, jewels, arti- facts, drugs, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"YfLechAkLdcHGPCm"}
{"name":"Security Systems","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Security Systems","description":"A character with Security Systems can locate, recognize, evade, and build various types of alarms and traps. This usually requires the proper equipment, and often a lot of time (one Turn or longer) as well.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bBoNhL0myNTylcHm"} {"name":"Security Systems","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Security Systems","description":"A character with Security Systems can locate, recognize, evade, and build various types of alarms and traps. This usually requires the proper equipment, and often a lot of time (one Turn or longer) as well.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bBoNhL0myNTylcHm"}
{"name":"Transport Familiarity","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Transport Familiarity","description":"This Background Skill allows characters to drive or pilot specific types of vehicles, or ride a living mount, under routine conditions (combat or crisis conditions require other Skills listed above).\nEach Transport Familiarity (TF) costs 2 Character Points. The character must select one of the following groups of vehicles:\n\nRiding Animals (horses, camels, elephants, and so on)\nGround Vehicles (cars, trucks, trains, motorcycles, sleds, snowmobiles)\nWater Vehicles (rowed boats, sailed boats, motorized boats)\nAir Vehicles (airplanes, helicopters) Space Vehicles (spaceships, starships) Mecha\nCharacters can purchase a TF with a single specific type of vehicle for 1 Character Point. This includes not only individual vehicles (Ford Mus- tangs, Los Angeles-class submarines) but recreational “vehicles” (such as SCUBA, Parachuting, Snow Skiing, or the like).","notes":"","effects":"","cost":"","activecost":"","basecost":"","value":"","modifiers":"","skilltype":"Background","characteristic":"","base":"","levelscost":"","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505028,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bstMbLdHkP16NpyE"} {"name":"Transport Familiarity","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Transport Familiarity","description":"This Background Skill allows characters to drive or pilot specific types of vehicles, or ride a living mount, under routine conditions (combat or crisis conditions require other Skills listed above).\nEach Transport Familiarity (TF) costs 2 Character Points. The character must select one of the following groups of vehicles:\n\nRiding Animals (horses, camels, elephants, and so on)\nGround Vehicles (cars, trucks, trains, motorcycles, sleds, snowmobiles)\nWater Vehicles (rowed boats, sailed boats, motorized boats)\nAir Vehicles (airplanes, helicopters) Space Vehicles (spaceships, starships) Mecha\nCharacters can purchase a TF with a single specific type of vehicle for 1 Character Point. This includes not only individual vehicles (Ford Mus- tangs, Los Angeles-class submarines) but recreational “vehicles” (such as SCUBA, Parachuting, Snow Skiing, or the like).","notes":"","effects":"","cost":"","activecost":"","basecost":"","value":"","modifiers":"","skilltype":"Background","characteristic":"","base":"","levelscost":"","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505028,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bstMbLdHkP16NpyE"}
{"name":"Charm","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Charm","description":"Charm is the ability to gain others trust (and perhaps even friendship) by offering companionship or favors. This Skill is normally only for use on NPCs; a player should have more control over his characters actions. The GM may rule that Charm can be used on a PC when it fits his Complications or personality.","notes":"","effects":"","cost":null,"activecost":null,"basecost":3,"value":"","modifiers":"","skilltype":"interaction","characteristic":"PRE","base":"","levelscost":2,"levels":null,"skilllevelonly":0,"skillfamiliarity":0,"skilleveryman":false,"skillprofiency":0,"plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.39","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1686003305741,"lastModifiedBy":"psfGTCIZQgpI1hvV"},"ownership":{"default":0,"psfGTCIZQgpI1hvV":3},"folder":null,"sort":0,"_id":"ddpdwDnfixUNP0eF"}
{"name":"Streetwise","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Streetwise","description":"Streetwise gives a character knowledge of the seamy side of civilization. He knows how to find the black market, talk to thugs and criminals, gain information, deal with organized (and not so organized) crime figures, and so on.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505023,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gIYMsOzBOnRNRCLv"} {"name":"Streetwise","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Streetwise","description":"Streetwise gives a character knowledge of the seamy side of civilization. He knows how to find the black market, talk to thugs and criminals, gain information, deal with organized (and not so organized) crime figures, and so on.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505023,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gIYMsOzBOnRNRCLv"}
{"name":"Tracking","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Tracking","description":"Characters with Tracking can follow a trail by observing tracks, marks, broken twigs and so forth, and also know how to hide tracks.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505027,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gpzcF5naO9H3vNzi"} {"name":"Tracking","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Tracking","description":"Characters with Tracking can follow a trail by observing tracks, marks, broken twigs and so forth, and also know how to hide tracks.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505027,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gpzcF5naO9H3vNzi"}
{"name":"Charm","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Charm","description":"Charm is the ability to gain others trust (and perhaps even friendship) by offering companionship or favors. This Skill is normally only for use on NPCs; a player should have more control over his characters actions. The GM may rule that Charm can be used on a PC when it fits his Complications or personality.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505026,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"hZxL8I4mNlTsA9xQ"}
{"name":"Systems Operation","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Systems Operation","description":"Characters with Systems Operation know how to operate sensing and communication devices properly. It does not cover navigational equipment (thats Navigation) or encoding transmissions (thats Cryptography).","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"j7rkLue81LaHIzz7"} {"name":"Systems Operation","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Systems Operation","description":"Characters with Systems Operation know how to operate sensing and communication devices properly. It does not cover navigational equipment (thats Navigation) or encoding transmissions (thats Cryptography).","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"j7rkLue81LaHIzz7"}
{"name":"Ventriloquism","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Ventriloquism","description":"A character with Ventriloquism can make his voice sound as if its coming from somewhere other than himself, and can speak without apparently moving his lips. Ventriloquism is detected with a PER Roll in a Skill Versus Skill Contest. A Ventriloquism roll takes a -1 for every 2m of distance between the ventriloquist and the point where the voice “speaks.”","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505026,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"jFd7i04Eu1FLCEpJ"} {"name":"Ventriloquism","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Ventriloquism","description":"A character with Ventriloquism can make his voice sound as if its coming from somewhere other than himself, and can speak without apparently moving his lips. Ventriloquism is detected with a PER Roll in a Skill Versus Skill Contest. A Ventriloquism roll takes a -1 for every 2m of distance between the ventriloquist and the point where the voice “speaks.”","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505026,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"jFd7i04Eu1FLCEpJ"}
{"name":"High Society","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"High Society","description":"Characters with High Society know about upper-class culture and how to interact with it: what clothes to wear, which fork to use for shrimp, whos who, the gossip and “court politics” applicable to the situation, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"m40buQ4y7AzWbrA9"} {"name":"High Society","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"High Society","description":"Characters with High Society know about upper-class culture and how to interact with it: what clothes to wear, which fork to use for shrimp, whos who, the gossip and “court politics” applicable to the situation, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"m40buQ4y7AzWbrA9"}

47
changelog.md Normal file
View File

@ -0,0 +1,47 @@
v11.0.23
- Proper display of BODY/STUN bars on tokens
v11.0.22
- Fix actor sheet (powers, characteristics)
- Fix weapons roll
v11.0.21
- Fix grid default distance in system.json
- Fix powers roll again (#29)
v11.0.20
- Enhance chat message output (cf #25)
- Enhance roll window
- Code simplification
v11.0.19
- Fix killing damage computation (again)
v11.0.18
- Fix killing damage computation
v11.0.17
- Fix tickets 1, 2, 3, 7, 8, 9, 10
- Implements effects tagging (#11)
v11.0.16
- Fix mental maneuvers rolls
- Renamed title
v11.0.15
- Fix target rolls for power
- Add maneuvers roll in the maneuver tab
- Renamed title
v11.0.14
- Initial public release

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View File

@ -1,18 +1,27 @@
{ {
"ACTOR": { "TYPES": {
"TypeCharacter": "Character" "Actor": {
"character": "Character",
"minion": "Minion"
},
"Item": {
"skill": "Skill",
"perk": "Perk",
"power": "Power",
"talent": "Talent",
"advantage": "Advantage",
"martialart": "Martial art",
"limitation": "Limitation",
"complication": "Complication",
"equipment": "Equipment",
"currency": "Currency",
"maneuver": "Maneuver"
}
}, },
"ITEM": { "COMBAT": {
"TypeSkill": "Skill", "TurnPrev": "Previous initiative",
"TypePerk": "Perk", "RoundPrev": "Previous segment",
"TypePower": "Power", "TurnNext": "Next initiative",
"TypeTalent": "Talent", "RoundNext": "Next segment"
"TypeAdvantage": "Advantage",
"TypeMartialart": "Martial art",
"TypeLimitation": "Limitation",
"TypeComplication": "Complication",
"TypeEquipment": "Equipment",
"TypeCurrency": "Currency",
"TypeManeuver": "Maneuver"
} }
} }

View File

@ -46,13 +46,17 @@ export class Hero6ActorSheet extends ActorSheet {
complications: this.actor.getComplications( ), complications: this.actor.getComplications( ),
maneuvers: this.actor.getManeuvers( ), maneuvers: this.actor.getManeuvers( ),
nonstockmaneuvers: this.actor.getNonStockManeuvers(), nonstockmaneuvers: this.actor.getNonStockManeuvers(),
allmaneuvers: this.actor.getAllManeuvers(),
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ), weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())), armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())),
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())), shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsMoneys()) ), moneys: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getMoneys())),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipments()) ),
subActors: duplicate(this.actor.getSubActors()), subActors: duplicate(this.actor.getSubActors()),
race: duplicate(this.actor.getRace()), race: duplicate(this.actor.getRace()),
encCapacity: this.actor.getEncumbranceCapacity(), encCapacity: this.actor.getEncumbranceCapacity(),
isHold: this.actor.getHoldAction(),
isAbort: this.actor.getAbortAction(),
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}), description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
motivation: await TextEditor.enrichHTML(this.object.system.biodata.motivation, {async: true}), motivation: await TextEditor.enrichHTML(this.object.system.biodata.motivation, {async: true}),
quote: await TextEditor.enrichHTML(this.object.system.biodata.quote, {async: true}), quote: await TextEditor.enrichHTML(this.object.system.biodata.quote, {async: true}),
@ -66,12 +70,15 @@ export class Hero6ActorSheet extends ActorSheet {
notes5: await TextEditor.enrichHTML(this.object.system.biodata.notes5, {async: true}), notes5: await TextEditor.enrichHTML(this.object.system.biodata.notes5, {async: true}),
containersTree: this.actor.containersTree, containersTree: this.actor.containersTree,
encCurrent: this.actor.encCurrent, encCurrent: this.actor.encCurrent,
totalValue: this.actor.totalValue,
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.document.isOwner,
editScore: this.options.editScore, editScore: this.options.editScore,
isGM: game.user.isGM isGM: game.user.isGM
} }
this.formData = formData; this.formData = formData;
this.stockManeuverDisplayed = false
console.log("PC : ", formData, this.object); console.log("PC : ", formData, this.object);
return formData; return formData;
@ -86,9 +93,9 @@ export class Hero6ActorSheet extends ActorSheet {
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
html.bind("keydown", function(e) { // Ignore Enter in actores sheet /*html.bind("keydown", function(e) { // Ignore Enter in actores sheet
if (e.keyCode === 13) return false; if (e.keyCode === 13) return false;
}); });*/
// Update Inventory Item // Update Inventory Item
html.find('.item-edit').click(ev => { html.find('.item-edit').click(ev => {
@ -152,22 +159,53 @@ export class Hero6ActorSheet extends ActorSheet {
const characKey = $(event.currentTarget).data("charac-key"); const characKey = $(event.currentTarget).data("charac-key");
this.actor.rollCharac(characKey); this.actor.rollCharac(characKey);
}); });
html.find('.roll-perception').click((event) => {
this.actor.rollPerception("int");
});
html.find('.roll-weapon').click((event) => {
const li = $(event.currentTarget).parents(".item")
this.actor.rollWeapon(li.data("item-id"));
});
html.find('.roll-power-attack').click((event) => {
const li = $(event.currentTarget).parents(".item")
this.actor.rollPowerAttack(li.data("item-id"));
});
html.find('.roll-direct').click((event) => { html.find('.roll-direct').click((event) => {
const rollFormula = $(event.currentTarget).data("roll-formula") const rollFormula = $(event.currentTarget).data("roll-formula")
const rollSource = $(event.currentTarget).data("roll-source") const rollSource = $(event.currentTarget).data("roll-source")
Hero6Utility.processDirectRoll( { actorId: this.actor.id, rollFormula: rollFormula, rollSource: rollSource, mode:"directroll"} ) Hero6Utility.processDirectRoll( { actorId: this.actor.id, rollFormula: rollFormula, rollSource: rollSource, mode:"directroll"} )
}); });
html.find('.roll-item').click((event) => { html.find('.roll-item').click((event) => {
const li = $(event.currentTarget).parents(".item"); const li = $(event.currentTarget).parents(".item");
let itemId = li.data("item-id") let itemId = li.data("item-id")
this.actor.rollItem(itemId); this.actor.rollItem(itemId);
}); });
html.find('.roll-damage').click((event) => {
html.find('.roll-weapon').click((event) => {
const li = $(event.currentTarget).parents(".item"); const li = $(event.currentTarget).parents(".item");
const skillId = li.data("item-id") let itemId = li.data("item-id")
this.actor.rollWeapon(skillId) this.actor.rollDamage(itemId);
});
html.find('.roll-lift-dice').click((event) => {
const li = $(event.currentTarget).parents(".item");
let itemId = li.data("item-id")
this.actor.rollLiftDice(itemId);
});
html.find('.hold-action').click((event) => {
this.actor.holdAction()
});
html.find('.abort-action').click((event) => {
this.actor.abortAction()
});
html.find(".show-stock-maneuver").click((event) => {
if ( !this.stockManeuverDisplayed) {
$('div .maneuver-list').removeClass('maneuver-is-stock');
this.stockManeuverDisplayed = true
} else {
$('div .maneuver-list').addClass('maneuver-is-stock');
this.stockManeuverDisplayed = false
}
}); });
html.find('.lock-unlock-sheet').click((event) => { html.find('.lock-unlock-sheet').click((event) => {

View File

@ -1,14 +1,12 @@
/* -------------------------------------------- */ /* -------------------------------------------- */
import { Hero6Utility } from "./hero6-utility.js"; import { Hero6Utility } from "./hero6-utility.js";
import { Hero6RollDialog } from "./hero6-roll-dialog.js"; import { Hero6RollDialog } from "./hero6-roll-dialog.js";
import { Hero6LiftDice } from "./hero6-lift-dice.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const coverBonusTable = { "nocover": 0, "lightcover": 2, "heavycover": 4, "entrenchedcover": 6 }; const __speed2Segments = [[0], [7], [6, 12], [4, 8, 12], [3, 6, 9, 12], [3, 5, 8, 10, 12], [2, 4, 6, 8, 10, 12],
const statThreatLevel = ["agi", "str", "phy", "com", "def", "per"] [2, 4, 6, 7, 9, 11, 12], [2, 3, 5, 6, 8, 9, 11, 12], [2, 3, 4, 6, 7, 8, 10, 11, 12], [2, 3, 4, 5, 6, 8, 9, 10, 11, 12],
const __subkey2title = { [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
"melee-dmg": "Melee Damage", "melee-atk": "Melee Attack", "ranged-atk": "Ranged Attack",
"ranged-dmg": "Ranged Damage", "dmg-res": "Damare Resistance"
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -42,11 +40,10 @@ export class Hero6Actor extends Actor {
return actor; return actor;
} }
if (data.type == 'character') { if (data.type == 'character' || data.type == 'minion') {
//const skills = await Hero6Utility.loadCompendium("fvtt-hero-system-6.skills"); const maneuvers = await Hero6Utility.loadCompendium("fvtt-hero-system-6.maneuvers")
//data.items = skills.map(i => i.toObject()) let maneuversObj = maneuvers.map(i => i.toObject())
} data.items = maneuversObj.filter(m => m.system.isstock)
if (data.type == 'npc') {
} }
return super.create(data, options); return super.create(data, options);
@ -62,13 +59,24 @@ export class Hero6Actor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
computeHitPoints() { computeDerivatedData() {
if (this.type == "character") { let newSTREND = this.computeSTREND()
if (newSTREND != this.system.characteristics.str.strend) {
this.update({ 'system.characteristics.str.strend': newSTREND })
} }
} }
/* -------------------------------------------- */
performMigration() {
// Fix OCV/OMCV rollable
if (!this.system.characteristics.ocv.hasroll) {
this.update({ 'system.characteristics.ocv.hasroll': true, 'system.characteristics.omcv.hasroll': true })
}
}
/* -------------------------------------------- */
computeDicesValue() { computeDicesValue() {
this.system.biodata.presenceattack = Hero6Utility.getDerivatedDiceFormulas(this.system.characteristics.pre.value ) this.system.biodata.presenceattack = Hero6Utility.getDerivatedDiceFormulas(this.system.characteristics.pre.value)
this.system.characteristics.str.strdice = Hero6Utility.getDerivatedDiceFormulas(this.system.characteristics.str.value ) this.system.characteristics.str.strdice = Hero6LiftDice.getLiftDice(this.system.characteristics.str.value)
this.system.characteristics.str.lift = Hero6LiftDice.getLift(this.system.characteristics.str.value)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareDerivedData() { prepareDerivedData() {
@ -76,7 +84,7 @@ export class Hero6Actor extends Actor {
if (this.type == 'character' || game.user.isGM) { if (this.type == 'character' || game.user.isGM) {
this.system.encCapacity = this.getEncumbranceCapacity() this.system.encCapacity = this.getEncumbranceCapacity()
this.buildContainerTree() this.buildContainerTree()
this.computeHitPoints() this.computeDerivatedData()
this.computeDicesValue() this.computeDicesValue()
} }
@ -91,7 +99,10 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getEncumbranceCapacity() { getEncumbranceCapacity() {
return 1; let numLift = this.system.characteristics.str.lift.match(/\d*\s/g)
if (numLift && numLift[0] && Number(numLift[0])) {
return numLift[0] / 2
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -148,18 +159,6 @@ export class Hero6Actor extends Actor {
return listItem return listItem
} }
/* -------------------------------------------- */
getConditions() {
let comp = duplicate(this.items.filter(item => item.type == 'condition') || []);
Hero6Utility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getWeapons() {
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || []);
Hero6Utility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getItemById(id) { getItemById(id) {
let item = this.items.find(item => item.id == id); let item = this.items.find(item => item.id == id);
@ -168,26 +167,40 @@ export class Hero6Actor extends Actor {
} }
return item; return item;
} }
/* -------------------------------------------- */
async _preCreate(data, options, user) {
await super._preCreate(data, options, user);
// Configure prototype token settings
const prototypeToken = {};
if (this.type === "character") Object.assign(prototypeToken, {
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
});
this.updateSource({ prototypeToken });
}
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareSkill(skill) { prepareSkill(skill) {
skill.roll = 0 skill.roll = 0
skill.charac = "N/A" skill.charac = "N/A"
skill.system.skilltype = skill.system.skilltype.toLowerCase()
if (skill.system.skillfamiliarity) { if (skill.system.skillfamiliarity) {
skill.roll = 8; skill.roll = 8;
} else if (skill.system.skillprofiency) { } else if (skill.system.skillprofiency) {
skill.roll = 10; skill.roll = 10;
} else if (skill.system.skilltype == "agility") { } else if (skill.system.skilltype == "agility") {
skill.charac = "DEX" skill.charac = "dex"
let charac = duplicate(this.system.characteristics.dex) let charac = duplicate(this.system.characteristics.dex)
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
} else if (skill.system.skilltype == "interaction") { } else if (skill.system.skilltype == "interaction") {
skill.charac = "PRE" skill.charac = "pre"
let charac = duplicate(this.system.characteristics.pre) let charac = duplicate(this.system.characteristics.pre)
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
} else if (skill.system.skilltype == "intellect") { } else if (skill.system.skilltype == "intellect") {
skill.charac = "INT" skill.charac = "int"
let charac = duplicate(this.system.characteristics.int) let charac = duplicate(this.system.characteristics.int)
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
@ -197,7 +210,7 @@ export class Hero6Actor extends Actor {
if (skill.system.characteristic == "manual") { if (skill.system.characteristic == "manual") {
skill.roll = skill.system.base skill.roll = skill.system.base
} else { } else {
skill.charac = skill.system.characteristic skill.charac = (skill.system.characteristic == "") ? "str" : skill.system.characteristic
let charac = duplicate(this.system.characteristics[skill.system.characteristic]) let charac = duplicate(this.system.characteristics[skill.system.characteristic])
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
@ -208,6 +221,29 @@ export class Hero6Actor extends Actor {
} }
} }
/* -------------------------------------------- */
prepareManeuver(maneuver) {
let subMode = "normal"
if (maneuver.system.maneuvertype == "mental") {
maneuver.roll = 11 + (Number(this.system.characteristics.omcv.value) || 0)
subMode = "omcv"
if (Number(maneuver.system.omcv)) {
maneuver.roll += (Number(maneuver.system.omcv) || 0)
} else {
maneuver.noOMCV = true
}
} else {
maneuver.roll = 11 + (Number(this.system.characteristics.ocv.value) || 0)
subMode = "ocv"
if (Number(maneuver.system.ocv)) {
maneuver.roll += (Number(maneuver.system.ocv) || 0)
} else {
maneuver.noOCV = true
}
}
return subMode
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getSkills() { getSkills() {
let comp = duplicate(this.items.filter(item => item.type == 'skill') || []) let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
@ -226,6 +262,7 @@ export class Hero6Actor extends Actor {
let comp = duplicate(this.items.filter(item => item.type == 'power') || []) let comp = duplicate(this.items.filter(item => item.type == 'power') || [])
for (let c of comp) { for (let c of comp) {
c.enrichDescription = c.name + "<br>" + await TextEditor.enrichHTML(c.system.description, { async: true }) c.enrichDescription = c.name + "<br>" + await TextEditor.enrichHTML(c.system.description, { async: true })
c.enrichNotes = c.name + "<br>" + await TextEditor.enrichHTML(c.system.notes, { async: true })
} }
Hero6Utility.sortArrayObjectsByName(comp) Hero6Utility.sortArrayObjectsByName(comp)
return comp return comp
@ -278,11 +315,18 @@ export class Hero6Actor extends Actor {
let maneuvers = { let maneuvers = {
general: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "general"), general: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "general"),
offensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "offensive"), offensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "offensive"),
defensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "defensive") defensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "defensive"),
mental: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "mental")
} }
Hero6Utility.sortArrayObjectsByName(maneuvers.general) Hero6Utility.sortArrayObjectsByName(maneuvers.general)
Hero6Utility.sortArrayObjectsByName(maneuvers.offensive) Hero6Utility.sortArrayObjectsByName(maneuvers.offensive)
Hero6Utility.sortArrayObjectsByName(maneuvers.defensive) Hero6Utility.sortArrayObjectsByName(maneuvers.defensive)
Hero6Utility.sortArrayObjectsByName(maneuvers.mental)
return maneuvers
}
getAllManeuvers() {
let maneuvers = this.items.filter(item => item.type == "maneuver")
Hero6Utility.sortArrayObjectsByName(maneuvers)
return maneuvers return maneuvers
} }
getNonStockManeuvers() { getNonStockManeuvers() {
@ -295,6 +339,11 @@ export class Hero6Actor extends Actor {
Hero6Utility.sortArrayObjectsByName(list) Hero6Utility.sortArrayObjectsByName(list)
return list return list
} }
getMoneys() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "money");
Hero6Utility.sortArrayObjectsByName(list)
return list
}
getWeapons() { getWeapons() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "weapon"); let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "weapon");
Hero6Utility.sortArrayObjectsByName(list) Hero6Utility.sortArrayObjectsByName(list)
@ -322,46 +371,21 @@ export class Hero6Actor extends Actor {
} }
/* ------------------------------------------- */ /* ------------------------------------------- */
async buildContainerTree() { buildContainerTree() {
let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []) let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []);
for (let equip1 of equipments) {
if (equip1.system.iscontainer) {
equip1.system.contents = []
equip1.system.contentsEnc = 0
for (let equip2 of equipments) {
if (equip1._id != equip2.id && equip2.system.containerid == equip1.id) {
equip1.system.contents.push(equip2)
let q = equip2.system.quantity ?? 1
equip1.system.contentsEnc += q * equip2.system.weight
}
}
}
}
// Compute whole enc
let enc = 0 let enc = 0
for (let item of equipments) { let value = 0
//item.data.idrDice = Hero6Utility.getDiceFromLevel(Number(item.data.idr)) for (let equip1 of equipments) {
if (item.system.equipped) { if (Number(equip1.system.weight) && Number(equip1.system.quantity)) {
if (item.system.iscontainer) { enc += equip1.system.weight * equip1.system.quantity
enc += item.system.contentsEnc }
} else if (item.system.containerid == "") { if (Number(equip1.system.value) && Number(equip1.system.quantity)) {
let q = item.system.quantity ?? 1 value += equip1.system.value * equip1.system.quantity
enc += q * item.system.weight
}
} }
} }
for (let item of this.items) { // Process items/shields/armors
if ((item.type == "weapon" || item.type == "shield" || item.type == "armor") && item.system.equipped) {
let q = item.system.quantity ?? 1
enc += q * item.system.weight
}
}
// Store local values // Store local values
this.encCurrent = enc this.encCurrent = enc
this.containersTree = equipments.filter(item => item.system.containerid == "") // Returns the root of equipements without container this.totalValue = value
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -390,7 +414,7 @@ export class Hero6Actor extends Actor {
} else { } else {
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }]) await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }])
} }
} else if (object && object.system.containerid) { // remove from container } else if (object?.system?.containerid) { // remove from container
console.log("Removeing: ", object) console.log("Removeing: ", object)
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]); await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]);
} }
@ -407,18 +431,93 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async equipGear(equipmentId) { async equipGear(equipmentId) {
let item = this.items.find(item => item.id == equipmentId); let item = this.items.find(item => item.id == equipmentId);
if (item && item.system) { if (item?.system) {
let update = { _id: item.id, "system.equipped": !item.system.equipped }; let update = { _id: item.id, "system.equipped": !item.system.equipped };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getInitiativeScore(combatId, combatantId) { async cleanCombat() {
if (this.type == 'character') { await this.setFlag("world", "hold-action", false)
this.rollMR(true, combatId, combatantId) await this.setFlag("world", "abort-action", { state: false, count: 0 })
}
async holdAction() {
await this.disableAbortAction()
if (this.getFlag("world", "hold-action")) {
await this.setFlag("world", "hold-action", false)
//game.combat.holdAction(this.id, false)
game.combat.forceHold(this, false)
return false
} else {
await this.setFlag("world", "hold-action", true)
//game.combat.holdAction(this.id, false)
game.combat.forceHold(this, true)
return true
} }
console.log("Init required !!!!") }
return -1; async disableHoldAction() {
await this.setFlag("world", "hold-action", false)
}
async disableAbortAction() {
await this.setFlag("world", "abort-action", { state: false, count: 0 })
}
async abortAction() {
await this.disableHoldAction()
let abort = this.getFlag("world", "abort-action")
if (abort.state) {
await this.setFlag("world", "abort-action", { state: false, count: 0 })
game.combat.forceAbort(this, false)
//game.combat.abortAction(this.id, false)
} else {
await this.setFlag("world", "abort-action", { state: true, count: 0 })
game.combat.forceAbort(this, true)
//game.combat.abortAction(this.id, true)
}
}
async incAbortActionCount() {
let abort = this.getFlag("world", "abort-action")
if (abort.state) {
abort.count++
await this.setFlag("world", "abort-action", abort)
if (abort.count == 2) {
return true
}
}
return false
}
getHoldAction() {
return this.getFlag("world", "hold-action")
}
getAbortAction() {
let abort = this.getFlag("world", "abort-action")
return abort?.state || false
}
/* -------------------------------------------- */
hasPhase(segmentNumber) {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
let phases = __speed2Segments[index]
console.log("index", segmentNumber, index, phases, phases.includes(segmentNumber), __speed2Segments)
return phases.includes(segmentNumber)
}
/* -------------------------------------------- */
getSegments() {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
//console.log("INDEX", index, __speed2Segments[index])
return __speed2Segments[index]
}
getPhasesString() {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
return __speed2Segments[index].toString()
}
/* -------------------------------------------- */
getBaseInit(turn) {
if (turn != this.turn) {
let r = new Roll("1d6").roll({ async: false })
this.currentInit = Number(this.system.characteristics.dex.initiative) + Number(((r.total / 10).toFixed(2)))
this.turn = turn
}
return this.currentInit
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -448,13 +547,29 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareCharacValues(charac) { prepareCharacValues(charac) {
charac.total = charac.value if (charac.label == "OCV" || charac.label == "OMCV" ) {
charac.roll = 9 + Math.floor((charac.value) / 5) charac.total = charac.value
charac.roll = 11 + charac.value
} else {
charac.total = charac.value
charac.roll = 9 + Math.round((charac.value) / 5)
}
} }
prepareCharac() { prepareCharac() {
let characs = duplicate(this.system.characteristics) let characs = duplicate(this.system.characteristics)
for (let key in characs) { for (let key in characs) {
this.prepareCharacValues(characs[key]) let ch = characs[key]
this.prepareCharacValues(ch)
if (key == "str") {
ch.lift = Hero6LiftDice.getLift(ch.value)
ch.liftDice = Hero6LiftDice.getLiftDice(ch.value)
}
if (key == "spd") {
ch.phasesString = this.getPhasesString()
}
if (key == "pre") {
ch.presenceattack = duplicate(this.system.biodata.presenceattack)
}
} }
return characs return characs
} }
@ -468,6 +583,22 @@ export class Hero6Actor extends Actor {
return skill; return skill;
} }
/* -------------------------------------------- */
computeSTREND() {
let newSTREND = 0
switch (this.system.characteristics.str.strendmode) {
case "str20":
newSTREND = Math.floor(this.system.characteristics.str.value / 20)
break;
case "str10":
newSTREND = Math.floor(this.system.characteristics.str.value / 10)
break;
case "str5":
newSTREND = Math.floor(this.system.characteristics.str.value / 5)
break;
}
return newSTREND
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async deleteAllItemsByType(itemType) { async deleteAllItemsByType(itemType) {
let items = this.items.filter(item => item.type == itemType); let items = this.items.filter(item => item.type == itemType);
@ -510,6 +641,9 @@ export class Hero6Actor extends Actor {
rollData.actorImg = this.img rollData.actorImg = this.img
rollData.actorId = this.id rollData.actorId = this.id
rollData.img = this.img rollData.img = this.img
rollData.title = this.name
rollData.subMode = "normal"
rollData.characteristics = duplicate(this.system.characteristics)
if (chKey) { if (chKey) {
rollData.charac = duplicate(this.system.characteristics[chKey]) rollData.charac = duplicate(this.system.characteristics[chKey])
this.prepareCharacValues(rollData.charac) this.prepareCharacValues(rollData.charac)
@ -528,23 +662,35 @@ export class Hero6Actor extends Actor {
const ray = new Ray(token.object?.center || token.center, defenderToken.center) const ray = new Ray(token.object?.center || token.center, defenderToken.center)
rollData.tokensDistance = canvas.grid.measureDistances([{ ray }], { gridSpaces: false })[0] / canvas.grid.grid.options.dimensions.distance rollData.tokensDistance = canvas.grid.measureDistances([{ ray }], { gridSpaces: false })[0] / canvas.grid.grid.options.dimensions.distance
} else { } else {
ui.notifications.info("No token connected to this actor, unable to compute distance.") //ui.notifications.info("No token connected to this actor, unable to compute distance.")
return //return
} }
if (defender) { if (defender) {
rollData.forceAdvantage = defender.isAttackerAdvantage()
rollData.advantageFromTarget = true
} }
} }
console.log("ROLLDATA", rollData) console.log("ROLLDATA", rollData)
return rollData return rollData
} }
/* -------------------------------------------- */
rollPerception() {
let rollData = this.getCommonRollData("int")
rollData.isPerception = true
rollData.title = "Perception roll"
rollData.charac.roll = Number(rollData.charac.perceptionroll)
rollData.mode = "perception"
if (rollData.target) {
ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.")
return
}
this.startRoll(rollData)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
rollCharac(chKey) { rollCharac(chKey) {
let rollData = this.getCommonRollData(chKey) let rollData = this.getCommonRollData(chKey)
rollData.mode = "charac" rollData.mode = "charac"
rollData.title = "Characteristic roll"
if (rollData.target) { if (rollData.target) {
ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.") ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.")
return return
@ -556,13 +702,77 @@ export class Hero6Actor extends Actor {
let item = this.items.get(itemId) let item = this.items.get(itemId)
let rollData = this.getCommonRollData() let rollData = this.getCommonRollData()
rollData.mode = "item" rollData.mode = "item"
rollData.title = Hero6Utility.upperFirst(item.type) + " - " + item.name
rollData.item = duplicate(item) rollData.item = duplicate(item)
if (item.type == "skill") { if (item.type == "skill") {
this.prepareSkill(rollData.item) this.prepareSkill(rollData.item)
} }
if (item.type == "maneuver") {
rollData.subMode = this.prepareManeuver(rollData.item)
}
this.startRoll(rollData) this.startRoll(rollData)
} }
/* -------------------------------------------- */
async rollDamage(itemId) {
let item = this.items.get(itemId)
let rollData = this.getCommonRollData()
rollData.mode = "damage"
rollData.item = duplicate(item)
rollData.title = item.name
rollData.diceFormula = Hero6Utility.convertRollHeroSyntax(item.system.damage)
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
//await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = myRoll
rollData.result = myRoll.total
rollData.bodyValue = Hero6Utility.computeBodyValue(myRoll)
let mult
if (item.system.damageeffect == "killing") { // As per issue #11
mult = new Roll("1d3").roll({ async: false })
rollData.killingMultiplier = mult.total
rollData.stunValue = Number(myRoll.total) * (Number(mult.total) + (Number(item.system.stunx) || 0))
} else {
rollData.stunValue = myRoll.total
}
let msgFlavor = await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-damage-result.hbs`, rollData)
let msg = await rollData.roll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
})
if (mult) {
await Hero6Utility.showDiceSoNice(mult, game.settings.get("core", "rollMode"))
}
rollData.roll = duplicate(rollData.roll) // Convert to object
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
}
/* -------------------------------------------- */
async rollLiftDice() {
let rollData = this.getCommonRollData()
rollData.mode = "lift-dice"
rollData.diceFormula = Hero6Utility.convertRollHeroSyntax(Hero6LiftDice.getLiftDice(this.system.characteristics.str.value))
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.bodyValue = Hero6Utility.computeBodyValue(myRoll)
rollData.result = myRoll.total
rollData.roll = duplicate(myRoll)
let msgFlavor = await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-lift-dice-result.hbs`, rollData)
let msg = await myRoll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
})
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
rollSkill(skillId) { rollSkill(skillId) {
let skill = this.items.get(skillId) let skill = this.items.get(skillId)
@ -587,34 +797,58 @@ export class Hero6Actor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
rollWeapon(weaponId) { async rollWeapon(weaponId) {
let weapon = this.items.get(weaponId) let weapon = this.items.get(weaponId)
if (weapon) { if (weapon) {
weapon = duplicate(weapon) weapon = duplicate(weapon)
let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase()) let rollData = this.getCommonRollData()
if (skill) { rollData.subMode = "ocv"
skill = duplicate(skill) rollData.mode = "weapon"
Hero6Utility.updateSkill(skill) rollData.item = weapon
let abilityKey = skill.system.ability rollData.item.roll = 11 + (Number(this.system.characteristics.ocv.value) || 0) + (Number(weapon.system.ocv) || 0)
let rollData = this.getCommonRollData(abilityKey) rollData.img = weapon.img
rollData.mode = "weapon" this.startRoll(rollData)
rollData.skill = skill } else {
rollData.weapon = weapon ui.notifications.warn("Unable to find the weapon " + weapon.name)
rollData.img = weapon.img
if (!rollData.forceDisadvantage) { // This is an attack, check if disadvantaged
rollData.forceDisadvantage = this.isAttackDisadvantage()
}
/*if (rollData.weapon.system.isranged && rollData.tokensDistance > Hero6Utility.getWeaponMaxRange(rollData.weapon) ) {
ui.notifications.warn(`Your target is out of range of your weapon (max: ${Hero6Utility.getWeaponMaxRange(rollData.weapon)} - current : ${rollData.tokensDistance})` )
return
}*/
this.startRoll(rollData)
} else {
ui.notifications.warn("Unable to find the relevant skill for weapon " + weapon.name)
}
} }
} }
/* -------------------------------------------- */
rollMentalManeuver(maneuverId) {
let maneuver = this.items.get(maneuverId)
if (maneuver) {
maneuver = duplicate(maneuver)
let rollData = this.getCommonRollData()
rollData.roll = 11 + (Number(this.system.characteristics.omcv.value) || 0) + (Number(maneuver.system.omcv) || 0)
rollData.mode = "mentalmaneuver"
rollData.item = maneuver
rollData.img = maneuver.img
this.startRoll(rollData)
} else {
ui.notifications.warn("Unable to find the maneuver " + maneuver.name)
}
}
/* -------------------------------------------- */
rollPowerAttack(powerId ) {
let power = this.items.get(powerId)
if (power) {
power = duplicate(power)
let rollData = this.getCommonRollData()
rollData.mode = "powerattack"
rollData.item = power
rollData.img = power.img
if (power.system.attackvalue == "ocv") {
rollData.item.roll = 11 + (Number(this.system.characteristics.ocv.value) || 0) + (Number(power.system.ocv) || 0)
rollData.subMode = "ocv"
} else {
rollData.item.roll = 11 + (Number(this.system.characteristics.omcv.value) || 0) + (Number(power.system.omcv) || 0)
rollData.subMode = "omcv"
}
this.startRoll(rollData)
} else {
ui.notifications.warn("Unable to find power " + power.name)
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async startRoll(rollData) { async startRoll(rollData) {
let rollDialog = await Hero6RollDialog.create(this, rollData) let rollDialog = await Hero6RollDialog.create(this, rollData)

View File

@ -1,25 +1,299 @@
import { Hero6Utility } from "./hero6-utility.js"; import { Hero6Utility } from "./hero6-utility.js";
/* -------------------------------------------- */
export class Hero6CombatTracker extends CombatTracker {
/* -------------------------------------------- */
static get defaultOptions() {
let path = "systems/fvtt-hero-system-6/templates/apps/combat-tracker.hbs";
return foundry.utils.mergeObject(super.defaultOptions, {
template: path,
});
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
export class Hero6Combat extends Combat { export class Hero6Combat extends Combat {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {} ) { static ready() {
Hooks.on("getCombatTrackerEntryContext", (html, options) => { Hero6Combat.pushMenuOptions(html, options); });
game.combat.settings.resource = "characteristics.spd.value";
}
/* -------------------------------------------- */
static pushMenuOptions(html, options) {
let newOpt
for (let i = 0; i < options.length; i++) {
let option = options[i];
if (option.name == 'COMBAT.CombatantReroll') { // Replace !
option.name = "Hold/Unhold action";
option.condition = true;
option.icon = '<i class="far fa-question-circle"></i>';
option.callback = target => {
let id = target.data('combatant-id')
let c = game.combat.combatants.get(id)
c.actor.holdAction()
}
//newOpt = duplicate(option)
}
}
//options.push(newOpt)
}
/* -------------------------------------------- */
holdAction(combatantId) {
this.rebuildInitiative()
//console.log("Rebuilding.....")
}
/* -------------------------------------------- */
abortAction(actorId, abortState) {
this.rebuildInitiative()
}
/* -------------------------------------------- */
constructor(data, context) {
data.flags = { world: { turnData: { turnNumber: 0, segmentNumber: 12} } }
super(data, context);
this.turnNumber = 0;
this.segmentNumber = 12;
}
/* -------------------------------------------- */
async startCombat() {
game.combat.settings.resource = "characteristics.spd.value";
let updList = []
for (let c of this.combatants) {
this.computeInitiative(c, updList)
await c.actor.cleanCombat()
}
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
}
super.startCombat();
}
/* -------------------------------------------- */
forceHold(actor, isHold) {
if (game.user.isGM) {
let updList = []
let c = this.combatants.find(c => c.actor._id == actor.id)
let name = actor.name + ((isHold) ? " (H)" : "")
console.log("ForceHold!!", c, actor)
updList.push({ _id: c.id || c._id, name: name, initiative: actor.getBaseInit(this.segmentNumber) })
this.updateEmbeddedDocuments("Combatant", updList)
} else {
game.socket.emit("system.fvtt-hero-system-6", { name: "msg_force_hold", data: { actorId: actor.id, isHold: isHold } });
}
}
/* -------------------------------------------- */
forceAbort(actor, isAbort) {
if (game.user.isGM) {
let updList = []
let c = this.combatants.find(c => c.actor._id == actor.id)
let name = actor.name + ((isAbort) ? " (A)" : "")
updList.push({ _id: c.id || c._id, name: name, initiative: actor.getBaseInit(this.segmentNumber) })
this.updateEmbeddedDocuments("Combatant", updList)
} else {
game.socket.emit("system.fvtt-hero-system-6", { name: "msg_force_abort", data: { actorId: actor.id, isAbort: isAbort } });
}
}
/* -------------------------------------------- */
computeInitiative(c, updList) {
let id = c._id || c.id
let hasSegment = c.actor.hasPhase(this.segmentNumber)
let isOnHold = c.actor.getHoldAction()
let isOnAbort = c.actor.getAbortAction()
let name = c.actor.name
if (hasSegment || isOnHold || isOnAbort) {
let baseInit = c.actor ? c.actor.getBaseInit(this.segmentNumber) : 0;
if (isOnHold) {
if (hasSegment) { // On hold + current segment -> auto-disable on hold
c.actor.disableHoldAction()
} else {
name = c.actor.name + " (H)"
}
}
if (isOnAbort) {
name = c.actor.name + " (A)"
if (c.actor.incAbortActionCount()) {
c.actor.disableAbortAction()
}
}
updList.push({ _id: id, name: name, initiative: baseInit, holdAction: c.holdAction })
} else {
updList.push({ _id: id, name: name, initiative: 0, holdAction: c.holdAction })
}
}
/* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
let updList = []
for (let cId = 0; cId < ids.length; cId++) { for (let cId = 0; cId < ids.length; cId++) {
const c = this.combatants.get(ids[cId]); const c = this.combatants.get(ids[cId])
let id = c._id || c.id; this.computeInitiative(c, updList)
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, id ) : -1; }
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initBonus } ]);
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
} }
return this; return this;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_onUpdate(changed, options, userId) { async rebuildInitiative() {
let updList = []
for (let c of this.combatants) {
this.computeInitiative(c, updList)
}
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
//console.log("Rebuild INIT", updList)
for (let c of updList) {
if (c.initiative != 0) {
return true
}
}
}
return false
} }
/* -------------------------------------------- */
nextTurn() {
let nbC = this.combatants.filter(c => c.initiative > 0).length
//console.log("Next turn called....", this.turn, nbC)
if (this.turn < nbC - 1) {
super.nextTurn()
} else {
this.nextRound()
}
}
/* -------------------------------------------- */
async previousRound() {
let hasCombatants = false
let nextRound = this.round
let advanceTime = 0
let turn = this.turn === null ? null : 0; // Preserve the fact that it's no-one's turn currently.
let turnData = this.getFlag("world", "turnData")
//console.log("Next round called....", nextRound, turnData)
while (!hasCombatants) {
if (this.settings.skipDefeated && (turn !== null)) {
turn = this.turns.findIndex(t => !t.isDefeated);
if (turn === -1) {
ui.notifications.warn("COMBAT.NoneRemaining", { localize: true });
turn = 0;
}
}
advanceTime = -1 * (Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime);
advanceTime -= CONFIG.time.roundTime;
nextRound = nextRound -1
//console.log("Next round called....2", nextRound, turnData)
turnData = this.getFlag("world", "turnData")
if (!turnData) {
turnData = { turnNumber: 0, segmentNumber: 12 }
this.setFlag("world", "turnData", turnData)
}
turnData = duplicate(turnData)
turnData.segmentNumber -= 1
if (turnData.segmentNumber <= 0) {
turnData.segmentNumber = 12
turnData.turnNumber--
}
await this.setFlag("world", "turnData", turnData)
this.turnNumber = turnData.turnNumber;
this.segmentNumber = turnData.segmentNumber;
//console.log("Next round called....3", nextRound, turnData)
// Re-compute init of actors
hasCombatants = await this.rebuildInitiative()
//console.log("Going round....", nextRound, hasCombatants)
}
// Update the document, passing data through a hook first
const updateData = { round: nextRound, turn };
const updateOptions = { advanceTime, direction: -1 };
Hooks.callAll("combatRound", this, updateData, updateOptions);
console.log(this)
return this.update(updateData, updateOptions);
}
/* -------------------------------------------- */
async nextRound() {
let hasCombatants = false
let nextRound = this.round
let advanceTime = 0
let turn = this.turn === null ? null : 0; // Preserve the fact that it's no-one's turn currently.
let turnData = this.getFlag("world", "turnData")
//console.log("Next round called....", nextRound, turnData)
while (!hasCombatants) {
if (this.settings.skipDefeated && (turn !== null)) {
turn = this.turns.findIndex(t => !t.isDefeated);
if (turn === -1) {
ui.notifications.warn("COMBAT.NoneRemaining", { localize: true });
turn = 0;
}
}
advanceTime = Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime;
advanceTime += CONFIG.time.roundTime;
nextRound = nextRound + 1;
//console.log("Next round called....2", nextRound, turnData)
turnData = this.getFlag("world", "turnData")
if (!turnData) {
turnData = { turnNumber: 0, segmentNumber: 12 }
this.setFlag("world", "turnData", turnData)
}
turnData = duplicate(turnData)
turnData.segmentNumber += 1
if (turnData.segmentNumber > 12) {
turnData.segmentNumber = 1
turnData.turnNumber++
ChatMessage.create({
content: "Complete Post-Segment 12 Recoveries."
})
}
await this.setFlag("world", "turnData", turnData)
this.turnNumber = turnData.turnNumber;
this.segmentNumber = turnData.segmentNumber;
//console.log("Next round called....3", nextRound, turnData)
// Re-compute init of actors
hasCombatants = await this.rebuildInitiative()
//console.log("Going round....", nextRound, hasCombatants)
}
// Update the document, passing data through a hook first
const updateData = { round: nextRound, turn };
const updateOptions = { advanceTime, direction: 1 };
Hooks.callAll("combatRound", this, updateData, updateOptions);
console.log(this)
return this.update(updateData, updateOptions);
}
/* -------------------------------------------- */
async _onCreateDescendantDocuments(type, documents, result, options, userId) {
//console.log("Added...")
if (game.user.isGM) {
await super._onCreateEmbeddedDocuments(type, documents, result, options, userId)
await this.rebuildInitiative()
}
}
/* --------------------------------------------
_onUpdate(changed, options, userId) {
}*/
/* -------------------------------------------- */ /* -------------------------------------------- */
static async checkTurnPosition() { static async checkTurnPosition() {
while (game.combat.turn > 0) { while (game.combat.turn > 0) {

View File

@ -4,18 +4,28 @@ import { Hero6Utility } from "./hero6-utility.js";
import { Hero6RollDialog } from "./hero6-roll-dialog.js"; import { Hero6RollDialog } from "./hero6-roll-dialog.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const __saveFirstToKey = { r: "reflex", f: "fortitude", w: "willpower"} const __saveFirstToKey = { r: "reflex", f: "fortitude", w: "willpower" }
/* -------------------------------------------- */ /* -------------------------------------------- */
export class Hero6Commands { export class Hero6Commands {
static init() { static ready() {
if (!game.system.hero6.commands) { if (!game.system.hero6.commands) {
const hero6Commands = new Hero6Commands(); const hero6Commands = new Hero6Commands();
hero6Commands.registerCommand({ path: ["/rtarget"], func: (content, msg, params) => Hero6Commands.rollTarget(msg, params), descr: "Launch the target roll window" }); hero6Commands.registerCommand({ path: ["/rh"], func: (content, msg, params) => Hero6Commands.rollSpecialHero(msg, params), descr: "Special roll hero roll (1/2d6 like)" });
hero6Commands.registerCommand({ path: ["/rsave"], func: (content, msg, params) => Hero6Commands.rollSave(msg, params), descr: "Performs a save roll" });
game.system.hero6.commands = hero6Commands; game.system.hero6.commands = hero6Commands;
} }
Hooks.on("chatMessage", (html, content, msg) => {
if (content[0] == '/') {
let regExp = /(\S+)/g;
let commands = content.match(regExp);
if (game.hero6.commands.processChatCommand(commands, content, msg)) {
return false;
}
}
return true
})
} }
constructor() { constructor() {
@ -108,37 +118,25 @@ export class Hero6Commands {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static rollTarget(msg, params) { static async rollSpecialHero(msg, params) {
const speaker = ChatMessage.getSpeaker() console.log("ROLL HERE", msg, params)
let actor let formula = params.join(' ')
if (speaker.token) actor = game.actors.tokens[speaker.token] if (formula) {
if (!actor) actor = game.actors.get(speaker.actor) let foundryFormula = Hero6Utility.convertRollHeroSyntax(formula)
if (!actor) {
return ui.notifications.warn(`Select your actor to run the macro`)
}
actor.rollDefenseRanged()
}
/* -------------------------------------------- */ let myRoll = new Roll(foundryFormula).roll({ async: false })
static rollSave(msg, params) { await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
console.log(msg, params) let bodyValue = Hero6Utility.computeBodyValue(myRoll)
if ( params.length == 0) {
ui.notifications.warn("/rsave command error : syntax is /rsave reflex, /rsave fortitude or /rsave willpower") let msgFlavor = await renderTemplate('systems/fvtt-hero-system-6/templates/chat/chat-hr-roll.hbs', {myRoll, bodyValue} )
return let msg = await myRoll.toMessage({
} user: game.user.id,
let saveKey = params[0].toLowerCase() rollMode: game.settings.get("core", "rollMode"),
if ( saveKey.length > 0 && (saveKey[0] == "r" || saveKey[0] == "f" || saveKey[0] == "w")) { flavor: msgFlavor
const speaker = ChatMessage.getSpeaker() })
let actor return true
if (speaker.token) actor = game.actors.tokens[speaker.token]
if (!actor) actor = game.actors.get(speaker.actor)
if (!actor) {
return ui.notifications.warn(`Select your actor to run the macro`)
}
actor.rollSave( __saveFirstToKey[saveKey[0]] )
} else {
ui.notifications.warn("/rsave syntax error : syntax is /rsave reflex, /rsave fortitude or /rsave willpower")
} }
return false
} }
} }

View File

@ -10,7 +10,8 @@ export const Hero6_CONFIG = {
maneuverTypes: { maneuverTypes: {
"general": "General", "general": "General",
"offensive": "Offensive", "offensive": "Offensive",
"defensive": "Defensive" "defensive": "Defensive",
"mental": "Mental"
}, },
rollCharac : { rollCharac : {
"str": "Strength", "str": "Strength",
@ -21,6 +22,13 @@ export const Hero6_CONFIG = {
"pre": "Presence", "pre": "Presence",
"manual": "Manual", "manual": "Manual",
}, },
damageEffect: {
"normal": "Normal",
"killing": "Killing",
"stunonly": "Stun Only",
"bodyonly": "Body Only",
"effect": "Effect"
},
skillType: { skillType: {
"agility": "Agility", "agility": "Agility",
"interaction": "Interaction", "interaction": "Interaction",
@ -29,6 +37,10 @@ export const Hero6_CONFIG = {
"combat": "Combat" , "combat": "Combat" ,
"custom": "Custom" "custom": "Custom"
}, },
attackTypes: {
"ocv": "OCV",
"omcv": "OMCV"
},
powerEquipmentType: { powerEquipmentType: {
"adjustment": "Adjustment", "adjustment": "Adjustment",
"mental": "Mental", "mental": "Mental",
@ -48,5 +60,10 @@ export const Hero6_CONFIG = {
powerSenseAffecting: { powerSenseAffecting: {
"none": "None", "none": "None",
"senseaffecting": "Sense-Affecting", "senseaffecting": "Sense-Affecting",
},
powerEffectRoll: {
"standard": "Standard",
"normal": "Normal",
"killing": "Killing",
} }
} }

View File

@ -60,6 +60,7 @@ export class Hero6ItemSheet extends ItemSheet {
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}), description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
notes: await TextEditor.enrichHTML(this.object.system.notes, {async: true}),
config: game.system.hero6.config, config: game.system.hero6.config,
system: objectData, system: objectData,
limited: this.object.limited, limited: this.object.limited,
@ -146,13 +147,13 @@ export class Hero6ItemSheet extends ItemSheet {
}); });
html.find('.item-skill-profiency').click(ev => { html.find('.item-skill-profiency').click(ev => {
this.object.update( {'system.levels': 12, 'system.cost': 2} ) this.object.update( {'system.skillfamiliarity': false, 'system.cost': 2} )
} ) } )
html.find('.item-skill-familiarity').click(ev => { html.find('.item-skill-familiarity').click(ev => {
this.object.update( {'system.levels': 10, 'system.cost': 1} ) this.object.update( {'system.skillprofiency': false, 'system.cost': 1} )
} ) } )
html.find('.item-skill-everyman').click(ev => { html.find('.item-skill-everyman').click(ev => {
this.object.update( {'system.levels': 8, 'system.cost': 0} ) this.object.update( {'system.cost': 0} )
} ) } )
html.find('.view-subitem').click(ev => { html.find('.view-subitem').click(ev => {

641
modules/hero6-lift-dice.js Normal file
View File

@ -0,0 +1,641 @@
const __LiftDiceValues = {
"0": {
"weight": "25 kg",
"dice": ""
},
"1": {
"weight": "29 kg",
"dice": ""
},
"2": {
"weight": "33 kg",
"dice": ""
},
"3": {
"weight": "37.5 kg",
"dice": "0 1/2d6"
},
"4": {
"weight": "44 kg",
"dice": "0 1/2d6"
},
"5": {
"weight": "50 kg",
"dice": "1d6"
},
"6": {
"weight": "58 kg",
"dice": "1d6"
},
"7": {
"weight": "67 kg",
"dice": "1d6"
},
"8": {
"weight": "75 kg",
"dice": "1 1/2d6"
},
"9": {
"weight": "88 kg",
"dice": "1 1/2d6"
},
"10": {
"weight": "100 kg",
"dice": "2d6"
},
"11": {
"weight": "117 kg",
"dice": "2d6"
},
"12": {
"weight": "133 kg",
"dice": "2d6"
},
"13": {
"weight": "150 kg",
"dice": "2 1/2d6"
},
"14": {
"weight": "175 kg",
"dice": "2 1/2d6"
},
"15": {
"weight": "200 kg",
"dice": "3d6"
},
"16": {
"weight": "233 kg",
"dice": "3d6"
},
"17": {
"weight": "267 kg",
"dice": "3d6"
},
"18": {
"weight": "300 kg",
"dice": "3 1/2d6"
},
"19": {
"weight": "350 kg",
"dice": "3 1/2d6"
},
"20": {
"weight": "400 kg",
"dice": "4d6"
},
"21": {
"weight": "467 kg",
"dice": "4d6"
},
"22": {
"weight": "533 kg",
"dice": "4d6"
},
"23": {
"weight": "600 kg",
"dice": "4 1/2d6"
},
"24": {
"weight": "700 kg",
"dice": "4 1/2d6"
},
"25": {
"weight": "800 kg",
"dice": "5d6"
},
"26": {
"weight": "933 kg",
"dice": "5d6"
},
"27": {
"weight": "1,067 kg",
"dice": "5d6"
},
"28": {
"weight": "1,200 kg",
"dice": "5 1/2d6"
},
"29": {
"weight": "1,400 kg",
"dice": "5 1/2d6"
},
"30": {
"weight": "1,600 kg",
"dice": "6d6"
},
"31": {
"weight": "1,867 kg",
"dice": "6d6"
},
"32": {
"weight": "2,133 kg",
"dice": "6d6"
},
"33": {
"weight": "2,400 kg",
"dice": "6 1/2d6"
},
"34": {
"weight": "2,800 kg",
"dice": "6 1/2d6"
},
"35": {
"weight": "3,200 kg",
"dice": "7d6"
},
"36": {
"weight": "3,733 kg",
"dice": "7d6"
},
"37": {
"weight": "4,267 kg",
"dice": "7d6"
},
"38": {
"weight": "4,800 kg",
"dice": "7 1/2d6"
},
"39": {
"weight": "5,600 kg",
"dice": "7 1/2d6"
},
"40": {
"weight": "6,400 kg",
"dice": "8d6"
},
"41": {
"weight": "7,467 kg",
"dice": "8d6"
},
"42": {
"weight": "8,533 kg",
"dice": "8d6"
},
"43": {
"weight": "9,600 kg",
"dice": "8 1/2d6"
},
"44": {
"weight": "11 tons",
"dice": "8 1/2d6"
},
"45": {
"weight": "12.5 tons",
"dice": "9d6"
},
"46": {
"weight": "15 tons",
"dice": "9d6"
},
"47": {
"weight": "17 tons",
"dice": "9d6"
},
"48": {
"weight": "19 tons",
"dice": "9 1/2d6"
},
"49": {
"weight": "22 tons",
"dice": "9 1/2d6"
},
"50": {
"weight": "25 tons",
"dice": "10d6"
},
"51": {
"weight": "29 tons",
"dice": "10d6"
},
"52": {
"weight": "33 tons",
"dice": "10d6"
},
"53": {
"weight": "37.5 tons",
"dice": "10 1/2d6"
},
"54": {
"weight": "44 tons",
"dice": "10 1/2d6"
},
"55": {
"weight": "50 tons",
"dice": "11d6"
},
"56": {
"weight": "58 tons",
"dice": "11d6"
},
"57": {
"weight": "67 tons",
"dice": "11d6"
},
"58": {
"weight": "75 tons",
"dice": "11 1/2d6"
},
"59": {
"weight": "88 tons",
"dice": "11 1/2d6"
},
"60": {
"weight": "100 tons",
"dice": "12d6"
},
"61": {
"weight": "117 tons",
"dice": "12d6"
},
"62": {
"weight": "133 tons",
"dice": "12d6"
},
"63": {
"weight": "150 tons",
"dice": "12 1/2d6"
},
"64": {
"weight": "175 tons",
"dice": "12 1/2d6"
},
"65": {
"weight": "200 tons",
"dice": "13d6"
},
"66": {
"weight": "233 tons",
"dice": "13d6"
},
"67": {
"weight": "267 tons",
"dice": "13d6"
},
"68": {
"weight": "300 tons",
"dice": "13 1/2d6"
},
"69": {
"weight": "350 tons",
"dice": "13 1/2d6"
},
"70": {
"weight": "400 tons",
"dice": "14d6"
},
"71": {
"weight": "467 tons",
"dice": "14d6"
},
"72": {
"weight": "533 tons",
"dice": "14d6"
},
"73": {
"weight": "600 tons",
"dice": "14 1/2d6"
},
"74": {
"weight": "700 tons",
"dice": "14 1/2d6"
},
"75": {
"weight": "800 tons",
"dice": "15d6"
},
"76": {
"weight": "933 tons",
"dice": "15d6"
},
"77": {
"weight": "1 kton 15d6",
"dice": ""
},
"78": {
"weight": "1.2 ktons",
"dice": "15 1/2d6"
},
"79": {
"weight": "1.4 ktons",
"dice": "15 1/2d6"
},
"80": {
"weight": "1.6 ktons",
"dice": "16d6"
},
"81": {
"weight": "1.9 ktons",
"dice": "16d6"
},
"82": {
"weight": "2 ktons",
"dice": "16d6"
},
"83": {
"weight": "2.4 ktons",
"dice": "16 1/2d6"
},
"84": {
"weight": "2.8 ktons",
"dice": "16 1/2d6"
},
"85": {
"weight": "3.2 ktons",
"dice": "17d6"
},
"86": {
"weight": "3.7 ktons",
"dice": "17d6"
},
"87": {
"weight": "4.3 ktons",
"dice": "17d6"
},
"88": {
"weight": "4.8 ktons",
"dice": "17 1/2d6"
},
"89": {
"weight": "5.6 ktons",
"dice": "17 1/2d6"
},
"90": {
"weight": "6.4 ktons",
"dice": "18d6"
},
"91": {
"weight": "7.5 ktons",
"dice": "18d6"
},
"92": {
"weight": "8.5 ktons",
"dice": "18d6"
},
"93": {
"weight": "9.6 ktons",
"dice": "18 1/2d6"
},
"94": {
"weight": "11 ktons",
"dice": "18 1/2d6"
},
"95": {
"weight": "12.5 ktons",
"dice": "19d6"
},
"96": {
"weight": "15 ktons",
"dice": "19d6"
},
"97": {
"weight": "17 ktons",
"dice": "19d6"
},
"98": {
"weight": "19 ktons",
"dice": "19 1/2d6"
},
"99": {
"weight": "22 ktons",
"dice": "19 1/2d6"
},
"100": {
"weight": "25 ktons",
"dice": "20d6"
},
"105": {
"weight": "50 ktons",
"dice": "21d6"
},
"110": {
"weight": "100 ktons",
"dice": "22d6"
},
"115": {
"weight": "200 ktons",
"dice": "23d6"
},
"120": {
"weight": "400 ktons",
"dice": "24d6"
},
"125": {
"weight": "800 ktons",
"dice": "25d6"
},
"130": {
"weight": "1.6 mtons",
"dice": "26d6"
},
"135": {
"weight": "3.2 mtons",
"dice": "27d6"
},
"140": {
"weight": "6.4 mtons",
"dice": "28d6"
},
"145": {
"weight": "12.5 mtons",
"dice": "29d6"
},
"150": {
"weight": "25 mtons",
"dice": "30d6"
},
"155": {
"weight": "50 mtons",
"dice": "31d6"
},
"160": {
"weight": "100 mtons",
"dice": "32d6"
},
"165": {
"weight": "200 mtons",
"dice": "33d6"
},
"170": {
"weight": "400 mtons",
"dice": "34d6"
},
"175": {
"weight": "800 mtons",
"dice": "35d6"
},
"180": {
"weight": "1.6 gtons",
"dice": "36d6"
},
"185": {
"weight": "3.2 gtons",
"dice": "37d6"
},
"190": {
"weight": "6.4 gtons",
"dice": "38d6"
},
"195": {
"weight": "12.5 gtons",
"dice": "39d6"
},
"200": {
"weight": "25 gtons",
"dice": "40d6"
},
"-50": {
"weight": "0.025 kg",
"dice": ""
},
"-45": {
"weight": "0.05 kg",
"dice": ""
},
"-40": {
"weight": "0.1 kg",
"dice": ""
},
"-35": {
"weight": "0.2 kg",
"dice": ""
},
"-30": {
"weight": "0.4 kg",
"dice": ""
},
"-29": {
"weight": "0.5 kg",
"dice": ""
},
"-28": {
"weight": "0.5 kg",
"dice": ""
},
"-27": {
"weight": "0.6 kg",
"dice": ""
},
"-26": {
"weight": "0.7 kg",
"dice": ""
},
"-25": {
"weight": "0.8 kg",
"dice": ""
},
"-24": {
"weight": "0.9 kg",
"dice": ""
},
"-23": {
"weight": "1.0 kg",
"dice": ""
},
"-22": {
"weight": "1.2 kg",
"dice": ""
},
"-21": {
"weight": "1.4 kg",
"dice": ""
},
"-20": {
"weight": "1.6 kg",
"dice": ""
},
"-19": {
"weight": "1.8 kg",
"dice": ""
},
"-18": {
"weight": "2.0 kg",
"dice": ""
},
"-17": {
"weight": "2.4 kg",
"dice": ""
},
"-16": {
"weight": "2.8 kg",
"dice": ""
},
"-15": {
"weight": "3.2 kg",
"dice": ""
},
"-14": {
"weight": "3.6 kg",
"dice": ""
},
"-13": {
"weight": "4.0 kg",
"dice": ""
},
"-12": {
"weight": "4.8 kg",
"dice": ""
},
"-11": {
"weight": "5.6 kg",
"dice": ""
},
"-10": {
"weight": "6.4 kg",
"dice": ""
},
"-9": {
"weight": "7.2 kg",
"dice": ""
},
"-8": {
"weight": "8.0 kg",
"dice": ""
},
"-7": {
"weight": "9.5 kg",
"dice": ""
},
"-6": {
"weight": "11 kg",
"dice": ""
},
"-5": {
"weight": "12.5 kg",
"dice": ""
},
"-4": {
"weight": "14 kg",
"dice": ""
},
"-3": {
"weight": "16 kg",
"dice": ""
},
"-2": {
"weight": "19 kg",
"dice": ""
},
"-1": {
"weight": "22 kg",
"dice": ""
}
}
export class Hero6LiftDice{
static getLift(value) {
let data = __LiftDiceValues[String(value)]
if (data) {
return data.weight
}
return 0
}
static getLiftDice(value) {
let data = __LiftDiceValues[String(value)]
if (data) {
return data.dice
}
return 0
}
}

View File

@ -13,7 +13,7 @@ import { Hero6ItemSheet } from "./hero6-item-sheet.js";
import { Hero6ActorSheet } from "./hero6-actor-sheet.js"; import { Hero6ActorSheet } from "./hero6-actor-sheet.js";
import { Hero6NPCSheet } from "./hero6-npc-sheet.js"; import { Hero6NPCSheet } from "./hero6-npc-sheet.js";
import { Hero6Utility } from "./hero6-utility.js"; import { Hero6Utility } from "./hero6-utility.js";
import { Hero6Combat } from "./hero6-combat.js"; import { Hero6Combat, Hero6CombatTracker } from "./hero6-combat.js";
import { Hero6Item } from "./hero6-item.js"; import { Hero6Item } from "./hero6-item.js";
import { Hero6Hotbar } from "./hero6-hotbar.js" import { Hero6Hotbar } from "./hero6-hotbar.js"
import { Hero6Commands } from "./hero6-commands.js" import { Hero6Commands } from "./hero6-commands.js"
@ -41,10 +41,10 @@ Hooks.once("init", async function () {
// Set an initiative formula for the system // Set an initiative formula for the system
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
formula: "1d6", formula: "1d6",
decimals: 1 decimals: 2
}; };
/* -------------------------------------------- */ /* ------------------------------- ------------- */
game.socket.on("system.fvtt-hero-system-6", data => { game.socket.on("system.fvtt-hero-system-6", data => {
Hero6Utility.onSocketMesssage(data) Hero6Utility.onSocketMesssage(data)
}); });
@ -54,12 +54,14 @@ Hooks.once("init", async function () {
CONFIG.Combat.documentClass = Hero6Combat CONFIG.Combat.documentClass = Hero6Combat
CONFIG.Actor.documentClass = Hero6Actor CONFIG.Actor.documentClass = Hero6Actor
CONFIG.Item.documentClass = Hero6Item CONFIG.Item.documentClass = Hero6Item
CONFIG.ui.combat = Hero6CombatTracker;
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register sheet application classes // Register sheet application classes
Actors.unregisterSheet("core", ActorSheet); Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-hero-system-6", Hero6ActorSheet, { types: ["character"], makeDefault: true }); Actors.registerSheet("fvtt-hero-system-6", Hero6ActorSheet, { types: ["character"], makeDefault: true });
Actors.registerSheet("fvtt-hero-system-6", Hero6NPCSheet, { types: ["npc"], makeDefault: false }); Actors.registerSheet("fvtt-hero-system-6", Hero6ActorSheet, { types: ["minion"], makeDefault: false });
Items.unregisterSheet("core", ItemSheet); Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-hero-system-6", Hero6ItemSheet, { makeDefault: true }); Items.registerSheet("fvtt-hero-system-6", Hero6ItemSheet, { makeDefault: true });
@ -73,7 +75,7 @@ function welcomeMessage() {
user: game.user.id, user: game.user.id,
whisper: [game.user.id], whisper: [game.user.id],
content: `<div id="welcome-message-dark-stars"><span class="rdd-roll-part"> content: `<div id="welcome-message-dark-stars"><span class="rdd-roll-part">
<strong>Welcome to the Hero6 RPG.</strong> <strong>Welcome to Hero System 6E RPG.</strong>
` }); ` });
} }
@ -93,7 +95,9 @@ Hooks.once("ready", function () {
welcomeMessage(); welcomeMessage();
Hero6Utility.ready() Hero6Utility.ready()
Hero6Commands.init() Hero6Commands.ready()
Hero6Combat.ready()
}) })
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -5,7 +5,7 @@ export class Hero6RollDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, rollData) { static async create(actor, rollData) {
let options = { classes: ["Hero6Dialog"], width: 460, height: 'fit-content', 'z-index': 99999 }; let options = { classes: ["Hero6Dialog"], width: 320, height: 'fit-content', 'z-index': 99999 };
let html = await renderTemplate('systems/fvtt-hero-system-6/templates/apps/roll-dialog-generic.hbs', rollData); let html = await renderTemplate('systems/fvtt-hero-system-6/templates/apps/roll-dialog-generic.hbs', rollData);
return new Hero6RollDialog(actor, rollData, html, options); return new Hero6RollDialog(actor, rollData, html, options);
@ -14,7 +14,7 @@ export class Hero6RollDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(actor, rollData, html, options, close = undefined) { constructor(actor, rollData, html, options, close = undefined) {
let conf = { let conf = {
title: (rollData.mode == "skill") ? "Skill" : "Attribute", title: "Roll window",
content: html, content: html,
buttons: { buttons: {
roll: { roll: {
@ -53,7 +53,7 @@ export class Hero6RollDialog extends Dialog {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
var dialog = this; let dialog = this;
function onLoad() { function onLoad() {
} }
$(function () { onLoad(); }); $(function () { onLoad(); });

View File

@ -15,8 +15,6 @@ export class Hero6Utility {
Hero6Utility.dropItemOnToken(canvas, data) Hero6Utility.dropItemOnToken(canvas, data)
});*/ });*/
Hero6Commands.init();
Handlebars.registerHelper('count', function (list) { Handlebars.registerHelper('count', function (list) {
return list.length; return list.length;
}) })
@ -43,7 +41,10 @@ export class Hero6Utility {
return list.length > 0; return list.length > 0;
}) })
Handlebars.registerHelper('mul', function (a, b) { Handlebars.registerHelper('mul', function (a, b) {
return parseInt(a) * parseInt(b); return Number(a) * Number(b);
})
Handlebars.registerHelper('add', function (a, b) {
return (Number(a) || 0) + (Number(b) || 0);
}) })
Handlebars.registerHelper('locationLabel', function (key) { Handlebars.registerHelper('locationLabel', function (key) {
return __locationNames[key] return __locationNames[key]
@ -54,6 +55,14 @@ export class Hero6Utility {
} }
return false return false
}) })
Handlebars.registerHelper('fixNum', function (value) {
return Number(value) || 0
})
Handlebars.registerHelper('checkInit', function (value) {
let myValue = Number(value) || 0
return myValue > 0
})
this.gameSettings() this.gameSettings()
@ -121,6 +130,10 @@ export class Hero6Utility {
const rollTables = await Hero6Utility.loadCompendium("fvtt-hero-system-6.rolltables") const rollTables = await Hero6Utility.loadCompendium("fvtt-hero-system-6.rolltables")
this.rollTables = rollTables.map(i => i.toObject()) this.rollTables = rollTables.map(i => i.toObject())
for (let actor of game.actors) {
actor.performMigration()
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -142,24 +155,6 @@ export class Hero6Utility {
html.on("click", '.view-item-from-chat', event => { html.on("click", '.view-item-from-chat', event => {
game.system.crucible.creator.openItemView(event) game.system.crucible.creator.openItemView(event)
}) })
html.on("click", '.roll-defense-melee', event => {
let rollId = $(event.currentTarget).data("roll-id")
let rollData = Hero6Utility.getRollData(rollId)
rollData.defenseWeaponId = $(event.currentTarget).data("defense-weapon-id")
let actor = game.canvas.tokens.get(rollData.defenderTokenId).actor
if (actor && (game.user.isGM || actor.isOwner)) {
actor.rollDefenseMelee(rollData)
}
})
html.on("click", '.roll-defense-ranged', event => {
let rollId = $(event.currentTarget).data("roll-id")
let rollData = Hero6Utility.getRollData(rollId)
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
if (defender && (game.user.isGM || defender.isOwner)) {
defender.rollDefenseRanged(rollData)
}
})
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -174,12 +169,14 @@ export class Hero6Utility {
'systems/fvtt-hero-system-6/templates/partials/partial-options-abilities.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-options-abilities.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-nav.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-item-nav.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-description.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-item-description.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs' 'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-power-maneuver-effect.hbs'
] ]
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
@ -244,12 +241,21 @@ export class Hero6Utility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async onSocketMesssage(msg) { static async onSocketMesssage(msg) {
console.log("SOCKET MESSAGE", msg.name) console.log("SOCKET MESSAGE", msg.name, msg)
if (msg.name == "msg_update_roll") { if (msg.name == "msg_update_roll") {
this.updateRollData(msg.data) this.updateRollData(msg.data)
} }
if (msg.name == "msg_gm_process_attack_defense") { if (msg.name == "msg_force_hold") {
this.processSuccessResult(msg.data) if (game.user.isGM) {
let actor = game.actors.get(msg.data.actorId)
game.combat.forceHold(actor, msg.data.isHold)
}
}
if (msg.name == "msg_force_abort") {
if (game.user.isGM) {
let actor = game.actors.get(msg.data.actorId)
game.combat.forceAbort(actor, msg.data.isAbort)
}
} }
if (msg.name == "msg_gm_item_drop" && game.user.isGM) { if (msg.name == "msg_gm_item_drop" && game.user.isGM) {
let actor = game.actors.get(msg.data.actorId) let actor = game.actors.get(msg.data.actorId)
@ -343,6 +349,7 @@ export class Hero6Utility {
// ability/save/size => 0 // ability/save/size => 0
let diceFormula = "3d6" let diceFormula = "3d6"
let target = 10 let target = 10
if (rollData.charac) { if (rollData.charac) {
target = rollData.charac.roll target = rollData.charac.roll
} }
@ -352,11 +359,11 @@ export class Hero6Utility {
target += rollData.bonusMalus target += rollData.bonusMalus
// Performs roll // Performs roll
console.log("Roll formula", diceFormula) //console.log("Roll formula", diceFormula)
let myRoll = rollData.roll let myRoll = rollData.roll
if (!myRoll) { // New rolls only of no rerolls if (!myRoll) { // New rolls only of no rerolls
myRoll = new Roll(diceFormula).roll({ async: false }) myRoll = new Roll(diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) //await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
} }
rollData.roll = myRoll rollData.roll = myRoll
@ -367,6 +374,7 @@ export class Hero6Utility {
if (rollData.result <= target) { if (rollData.result <= target) {
rollData.isSuccess = true rollData.isSuccess = true
} }
//console.log("Roll result", rollData)
if (myRoll.terms[0].total == 3) { // Always a success if (myRoll.terms[0].total == 3) { // Always a success
rollData.isSuccess = true rollData.isSuccess = true
} }
@ -375,10 +383,6 @@ export class Hero6Utility {
} }
rollData.margin = target - rollData.result rollData.margin = target - rollData.result
if (rollData.item && rollData.item.system.computebody) {
rollData.bodyValue = this.computeBody(myRoll)
}
this.outputRollMessage(rollData) this.outputRollMessage(rollData)
} }
@ -388,20 +392,47 @@ export class Hero6Utility {
rollData.roll = roll rollData.roll = roll
rollData.result = roll.total rollData.result = roll.total
rollData.bodyValue = this.computeBody(rollData.roll) rollData.bodyValue = this.computeBodyValue(rollData.roll)
this.outputRollMessage(rollData) this.outputRollMessage(rollData).catch(function() { ui.notifications.warn("Error during message output.") })
} }
/* -------------- ----------------------------- */ /* -------------- ----------------------------- */
static async outputRollMessage(rollData) { static async outputRollMessage(rollData) {
let msg = await this.createChatWithRollMode(rollData.alias, { let msgFlavor = await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-generic-result.hbs`, rollData)
content: await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-generic-result.hbs`, rollData) let msg = await rollData.roll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
}) })
rollData.roll = duplicate(rollData.roll) // Convert to object
msg.setFlag("world", "rolldata", rollData) msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData) console.log("Rolldata result", rollData)
} }
/* -------------- ----------------------------- */
static convertRollHeroSyntax(hero6Formula) {
// Ensure we have no space at all
//hero6Formula = hero6Formula.replace(/\s/g, '')
let hasHalfDice = ""
let newFormula = hero6Formula
let form1 = hero6Formula.match(/\s*(\d*)\s*1\/2d6/)
if ( form1 ) {
let nbDice = form1[1] || 0
newFormula = nbDice+"d6+round(1d6/2)"
}
let form3 = hero6Formula.match(/\s*(\d*)\.5d6/)
if ( form3 ) {
let nbDice = form3[1] || 0
newFormula = nbDice+"d6+round(1d6/2)"
}
console.log("Parsed formula : ", hero6Formula, newFormula)
return newFormula
}
/* -------------- ----------------------------- */ /* -------------- ----------------------------- */
static sortArrayObjectsByName(myArray) { static sortArrayObjectsByName(myArray) {
myArray.sort((a, b) => { myArray.sort((a, b) => {
@ -440,7 +471,7 @@ export class Hero6Utility {
static blindMessageToGM(chatOptions) { static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions); let chatGM = duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM); chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM); console.log("blindMessageToGM", chatGM);
game.socket.emit("system.fvtt-hero-system-6", { msg: "msg_gm_chat_message", data: chatGM }); game.socket.emit("system.fvtt-hero-system-6", { msg: "msg_gm_chat_message", data: chatGM });
} }

Binary file not shown.

View File

@ -0,0 +1 @@
MANIFEST-000188

0
packs/complications/LOCK Normal file
View File

8
packs/complications/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.140558 7f16d7fff6c0 Recovering log #186
2023/10/04-21:41:44.150660 7f16d7fff6c0 Delete type=3 #184
2023/10/04-21:41:44.150712 7f16d7fff6c0 Delete type=0 #186
2023/10/04-21:47:02.531984 7f14567ef6c0 Level-0 table #191: started
2023/10/04-21:47:02.532010 7f14567ef6c0 Level-0 table #191: 0 bytes OK
2023/10/04-21:47:02.538823 7f14567ef6c0 Delete type=0 #189
2023/10/04-21:47:02.545067 7f14567ef6c0 Manual compaction at level-0 from '!items!05yAsPAteobyHoVT' @ 72057594037927935 : 1 .. '!items!yFhVFTqzLKcqApBr' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.545092 7f14567ef6c0 Manual compaction at level-1 from '!items!05yAsPAteobyHoVT' @ 72057594037927935 : 1 .. '!items!yFhVFTqzLKcqApBr' @ 0 : 0; will stop at (end)

View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.811691 7f16d6ffd6c0 Recovering log #182
2023/10/04-21:35:01.822017 7f16d6ffd6c0 Delete type=3 #180
2023/10/04-21:35:01.822072 7f16d6ffd6c0 Delete type=0 #182
2023/10/04-21:41:38.795066 7f14567ef6c0 Level-0 table #187: started
2023/10/04-21:41:38.795089 7f14567ef6c0 Level-0 table #187: 0 bytes OK
2023/10/04-21:41:38.801689 7f14567ef6c0 Delete type=0 #185
2023/10/04-21:41:38.808479 7f14567ef6c0 Manual compaction at level-0 from '!items!05yAsPAteobyHoVT' @ 72057594037927935 : 1 .. '!items!yFhVFTqzLKcqApBr' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.808530 7f14567ef6c0 Manual compaction at level-1 from '!items!05yAsPAteobyHoVT' @ 72057594037927935 : 1 .. '!items!yFhVFTqzLKcqApBr' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/equipment/000099.ldb Normal file

Binary file not shown.

View File

1
packs/equipment/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000190

0
packs/equipment/LOCK Normal file
View File

8
packs/equipment/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.100507 7f16d6ffd6c0 Recovering log #188
2023/10/04-21:41:44.111147 7f16d6ffd6c0 Delete type=3 #186
2023/10/04-21:41:44.111281 7f16d6ffd6c0 Delete type=0 #188
2023/10/04-21:47:02.509785 7f14567ef6c0 Level-0 table #193: started
2023/10/04-21:47:02.509815 7f14567ef6c0 Level-0 table #193: 0 bytes OK
2023/10/04-21:47:02.518200 7f14567ef6c0 Delete type=0 #191
2023/10/04-21:47:02.518694 7f14567ef6c0 Manual compaction at level-0 from '!folders!48DCB6UNXCsERTXK' @ 72057594037927935 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.518773 7f14567ef6c0 Manual compaction at level-1 from '!folders!48DCB6UNXCsERTXK' @ 72057594037927935 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at (end)

8
packs/equipment/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.768747 7f16d7fff6c0 Recovering log #184
2023/10/04-21:35:01.779863 7f16d7fff6c0 Delete type=3 #182
2023/10/04-21:35:01.779921 7f16d7fff6c0 Delete type=0 #184
2023/10/04-21:41:38.760705 7f14567ef6c0 Level-0 table #189: started
2023/10/04-21:41:38.760752 7f14567ef6c0 Level-0 table #189: 0 bytes OK
2023/10/04-21:41:38.767288 7f14567ef6c0 Delete type=0 #187
2023/10/04-21:41:38.774856 7f14567ef6c0 Manual compaction at level-0 from '!folders!48DCB6UNXCsERTXK' @ 72057594037927935 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.781126 7f14567ef6c0 Manual compaction at level-1 from '!folders!48DCB6UNXCsERTXK' @ 72057594037927935 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/maneuvers/000129.ldb Normal file

Binary file not shown.

View File

1
packs/maneuvers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000182

0
packs/maneuvers/LOCK Normal file
View File

8
packs/maneuvers/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.152237 7f16d6ffd6c0 Recovering log #180
2023/10/04-21:41:44.162524 7f16d6ffd6c0 Delete type=3 #178
2023/10/04-21:41:44.162593 7f16d6ffd6c0 Delete type=0 #180
2023/10/04-21:47:02.538933 7f14567ef6c0 Level-0 table #185: started
2023/10/04-21:47:02.538963 7f14567ef6c0 Level-0 table #185: 0 bytes OK
2023/10/04-21:47:02.544945 7f14567ef6c0 Delete type=0 #183
2023/10/04-21:47:02.545085 7f14567ef6c0 Manual compaction at level-0 from '!items!0HeZcvevni63brWf' @ 72057594037927935 : 1 .. '!items!yAT32VYV2aIWOBkK' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.545108 7f14567ef6c0 Manual compaction at level-1 from '!items!0HeZcvevni63brWf' @ 72057594037927935 : 1 .. '!items!yAT32VYV2aIWOBkK' @ 0 : 0; will stop at (end)

8
packs/maneuvers/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.823989 7f16d7fff6c0 Recovering log #176
2023/10/04-21:35:01.834386 7f16d7fff6c0 Delete type=3 #174
2023/10/04-21:35:01.834682 7f16d7fff6c0 Delete type=0 #176
2023/10/04-21:41:38.788643 7f14567ef6c0 Level-0 table #181: started
2023/10/04-21:41:38.788676 7f14567ef6c0 Level-0 table #181: 0 bytes OK
2023/10/04-21:41:38.794955 7f14567ef6c0 Delete type=0 #179
2023/10/04-21:41:38.808465 7f14567ef6c0 Manual compaction at level-0 from '!items!0HeZcvevni63brWf' @ 72057594037927935 : 1 .. '!items!yAT32VYV2aIWOBkK' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.808513 7f14567ef6c0 Manual compaction at level-1 from '!items!0HeZcvevni63brWf' @ 72057594037927935 : 1 .. '!items!yAT32VYV2aIWOBkK' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/perks/000005.ldb Normal file

Binary file not shown.

0
packs/perks/000190.log Normal file
View File

1
packs/perks/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000188

0
packs/perks/LOCK Normal file
View File

8
packs/perks/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.164948 7f16ecffa6c0 Recovering log #186
2023/10/04-21:41:44.175548 7f16ecffa6c0 Delete type=3 #184
2023/10/04-21:41:44.175604 7f16ecffa6c0 Delete type=0 #186
2023/10/04-21:47:02.552360 7f14567ef6c0 Level-0 table #191: started
2023/10/04-21:47:02.552386 7f14567ef6c0 Level-0 table #191: 0 bytes OK
2023/10/04-21:47:02.560501 7f14567ef6c0 Delete type=0 #189
2023/10/04-21:47:02.560629 7f14567ef6c0 Manual compaction at level-0 from '!items!L3vwlIh3oloE6A8W' @ 72057594037927935 : 1 .. '!items!yWTR7MCOtGWm1KCz' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.560655 7f14567ef6c0 Manual compaction at level-1 from '!items!L3vwlIh3oloE6A8W' @ 72057594037927935 : 1 .. '!items!yWTR7MCOtGWm1KCz' @ 0 : 0; will stop at (end)

8
packs/perks/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.836873 7f16ecffa6c0 Recovering log #182
2023/10/04-21:35:01.847899 7f16ecffa6c0 Delete type=3 #180
2023/10/04-21:35:01.847965 7f16ecffa6c0 Delete type=0 #182
2023/10/04-21:41:38.781263 7f14567ef6c0 Level-0 table #187: started
2023/10/04-21:41:38.781303 7f14567ef6c0 Level-0 table #187: 0 bytes OK
2023/10/04-21:41:38.788512 7f14567ef6c0 Delete type=0 #185
2023/10/04-21:41:38.808450 7f14567ef6c0 Manual compaction at level-0 from '!items!L3vwlIh3oloE6A8W' @ 72057594037927935 : 1 .. '!items!yWTR7MCOtGWm1KCz' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.808503 7f14567ef6c0 Manual compaction at level-1 from '!items!L3vwlIh3oloE6A8W' @ 72057594037927935 : 1 .. '!items!yWTR7MCOtGWm1KCz' @ 0 : 0; will stop at (end)

BIN
packs/perks/MANIFEST-000188 Normal file

Binary file not shown.

BIN
packs/powers/000165.ldb Normal file

Binary file not shown.

0
packs/powers/000192.log Normal file
View File

1
packs/powers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000190

0
packs/powers/LOCK Normal file
View File

8
packs/powers/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.127784 7f16d77fe6c0 Recovering log #188
2023/10/04-21:41:44.137990 7f16d77fe6c0 Delete type=3 #186
2023/10/04-21:41:44.138069 7f16d77fe6c0 Delete type=0 #188
2023/10/04-21:47:02.518821 7f14567ef6c0 Level-0 table #193: started
2023/10/04-21:47:02.518901 7f14567ef6c0 Level-0 table #193: 0 bytes OK
2023/10/04-21:47:02.525324 7f14567ef6c0 Delete type=0 #191
2023/10/04-21:47:02.545045 7f14567ef6c0 Manual compaction at level-0 from '!items!3vinyVxuFdrQDCBo' @ 72057594037927935 : 1 .. '!items!zpF2QY4tx7qdBomQ' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.545077 7f14567ef6c0 Manual compaction at level-1 from '!items!3vinyVxuFdrQDCBo' @ 72057594037927935 : 1 .. '!items!zpF2QY4tx7qdBomQ' @ 0 : 0; will stop at (end)

8
packs/powers/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.795955 7f16d77fe6c0 Recovering log #184
2023/10/04-21:35:01.806044 7f16d77fe6c0 Delete type=3 #182
2023/10/04-21:35:01.806101 7f16d77fe6c0 Delete type=0 #184
2023/10/04-21:41:38.774865 7f14567ef6c0 Level-0 table #189: started
2023/10/04-21:41:38.774887 7f14567ef6c0 Level-0 table #189: 0 bytes OK
2023/10/04-21:41:38.780982 7f14567ef6c0 Delete type=0 #187
2023/10/04-21:41:38.781151 7f14567ef6c0 Manual compaction at level-0 from '!items!3vinyVxuFdrQDCBo' @ 72057594037927935 : 1 .. '!items!zpF2QY4tx7qdBomQ' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.781172 7f14567ef6c0 Manual compaction at level-1 from '!items!3vinyVxuFdrQDCBo' @ 72057594037927935 : 1 .. '!items!zpF2QY4tx7qdBomQ' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/skills/000005.ldb Normal file

Binary file not shown.

0
packs/skills/000192.log Normal file
View File

1
packs/skills/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000190

0
packs/skills/LOCK Normal file
View File

8
packs/skills/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.114622 7f16ecffa6c0 Recovering log #188
2023/10/04-21:41:44.125734 7f16ecffa6c0 Delete type=3 #186
2023/10/04-21:41:44.125812 7f16ecffa6c0 Delete type=0 #188
2023/10/04-21:47:02.525443 7f14567ef6c0 Level-0 table #193: started
2023/10/04-21:47:02.525470 7f14567ef6c0 Level-0 table #193: 0 bytes OK
2023/10/04-21:47:02.531866 7f14567ef6c0 Delete type=0 #191
2023/10/04-21:47:02.545057 7f14567ef6c0 Manual compaction at level-0 from '!items!0663RVbZRl0oZ0Dr' @ 72057594037927935 : 1 .. '!items!zLKcnLGEcMwECjni' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.545100 7f14567ef6c0 Manual compaction at level-1 from '!items!0663RVbZRl0oZ0Dr' @ 72057594037927935 : 1 .. '!items!zLKcnLGEcMwECjni' @ 0 : 0; will stop at (end)

8
packs/skills/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.783254 7f16ecffa6c0 Recovering log #184
2023/10/04-21:35:01.792970 7f16ecffa6c0 Delete type=3 #182
2023/10/04-21:35:01.793080 7f16ecffa6c0 Delete type=0 #184
2023/10/04-21:41:38.767422 7f14567ef6c0 Level-0 table #189: started
2023/10/04-21:41:38.767446 7f14567ef6c0 Level-0 table #189: 0 bytes OK
2023/10/04-21:41:38.774734 7f14567ef6c0 Delete type=0 #187
2023/10/04-21:41:38.781109 7f14567ef6c0 Manual compaction at level-0 from '!items!0663RVbZRl0oZ0Dr' @ 72057594037927935 : 1 .. '!items!zLKcnLGEcMwECjni' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.781182 7f14567ef6c0 Manual compaction at level-1 from '!items!0663RVbZRl0oZ0Dr' @ 72057594037927935 : 1 .. '!items!zLKcnLGEcMwECjni' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/talents/000005.ldb Normal file

Binary file not shown.

0
packs/talents/000190.log Normal file
View File

1
packs/talents/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000188

0
packs/talents/LOCK Normal file
View File

8
packs/talents/LOG Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:41:44.177511 7f16d77fe6c0 Recovering log #186
2023/10/04-21:41:44.187706 7f16d77fe6c0 Delete type=3 #184
2023/10/04-21:41:44.187791 7f16d77fe6c0 Delete type=0 #186
2023/10/04-21:47:02.545189 7f14567ef6c0 Level-0 table #191: started
2023/10/04-21:47:02.545213 7f14567ef6c0 Level-0 table #191: 0 bytes OK
2023/10/04-21:47:02.552254 7f14567ef6c0 Delete type=0 #189
2023/10/04-21:47:02.560616 7f14567ef6c0 Manual compaction at level-0 from '!items!1oojD2KMJsxNlMez' @ 72057594037927935 : 1 .. '!items!znoFgVzNQOCTGUBl' @ 0 : 0; will stop at (end)
2023/10/04-21:47:02.560646 7f14567ef6c0 Manual compaction at level-1 from '!items!1oojD2KMJsxNlMez' @ 72057594037927935 : 1 .. '!items!znoFgVzNQOCTGUBl' @ 0 : 0; will stop at (end)

8
packs/talents/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/10/04-21:35:01.850710 7f16d77fe6c0 Recovering log #182
2023/10/04-21:35:01.861789 7f16d77fe6c0 Delete type=3 #180
2023/10/04-21:35:01.861973 7f16d77fe6c0 Delete type=0 #182
2023/10/04-21:41:38.801785 7f14567ef6c0 Level-0 table #187: started
2023/10/04-21:41:38.801808 7f14567ef6c0 Level-0 table #187: 0 bytes OK
2023/10/04-21:41:38.808336 7f14567ef6c0 Delete type=0 #185
2023/10/04-21:41:38.808493 7f14567ef6c0 Manual compaction at level-0 from '!items!1oojD2KMJsxNlMez' @ 72057594037927935 : 1 .. '!items!znoFgVzNQOCTGUBl' @ 0 : 0; will stop at (end)
2023/10/04-21:41:38.808522 7f14567ef6c0 Manual compaction at level-1 from '!items!1oojD2KMJsxNlMez' @ 72057594037927935 : 1 .. '!items!znoFgVzNQOCTGUBl' @ 0 : 0; will stop at (end)

Binary file not shown.

0
packs/weapons/000088.log Normal file
View File

1
packs/weapons/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000086

0
packs/weapons/LOCK Normal file
View File

7
packs/weapons/LOG Normal file
View File

@ -0,0 +1,7 @@
2023/08/24-15:57:43.392826 7fab4affd6c0 Recovering log #84
2023/08/24-15:57:43.403060 7fab4affd6c0 Delete type=3 #82
2023/08/24-15:57:43.403157 7fab4affd6c0 Delete type=0 #84
2023/08/24-15:59:11.995583 7fab497fa6c0 Level-0 table #89: started
2023/08/24-15:59:11.995614 7fab497fa6c0 Level-0 table #89: 0 bytes OK
2023/08/24-15:59:12.004480 7fab497fa6c0 Delete type=0 #87
2023/08/24-15:59:12.025495 7fab497fa6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

7
packs/weapons/LOG.old Normal file
View File

@ -0,0 +1,7 @@
2023/08/24-15:09:37.452353 7fab4b7fe6c0 Recovering log #80
2023/08/24-15:09:37.462595 7fab4b7fe6c0 Delete type=3 #78
2023/08/24-15:09:37.462673 7fab4b7fe6c0 Delete type=0 #80
2023/08/24-15:56:20.976153 7fab497fa6c0 Level-0 table #85: started
2023/08/24-15:56:20.976179 7fab497fa6c0 Level-0 table #85: 0 bytes OK
2023/08/24-15:56:20.984268 7fab497fa6c0 Delete type=0 #83
2023/08/24-15:56:20.984458 7fab497fa6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -39,42 +39,48 @@
text-align: justify; text-align: justify;
font-size: 16px; font-size: 16px;
letter-spacing: 1px; letter-spacing: 1px;
color: rgba(44, 133, 133, 0.75); color: rgba(6, 56, 56, 0.75);
background: rgba(66, 66, 64, 0.95); background: rgba(228, 240, 240, 1);
} }
/* Fonts */ /* Fonts */
.sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item { .sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item {
font-size: 1.0rem; font-size: 1.0rem;
color: rgba(224, 208, 197, 0.9); color: rgba(224, 208, 197, 0.9);
background: rgba(66, 66, 64, 0.95); /*background: rgba(66, 66, 64, 0.95);*/
} /* For title, sidebar character and scene */ } /* For title, sidebar character and scene */
.sheet nav.sheet-tabs { .sheet nav.sheet-tabs {
font-size: 0.7rem; font-size: 0.7rem;
color: rgba(224, 208, 197, 0.9); color: rgba(224, 208, 197, 0.9);
background: rgba(66, 66, 64, 0.95); /*background: rgba(66, 66, 64, 0.95);*/
} /* For nav and title */ } /* For nav and title */
.fvtt-hero-system-6 .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle { .fvtt-hero-system-6 .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
font-size: 0.8rem; font-size: 0.8rem;
color: rgba(224, 208, 197, 0.9); color: rgba(4, 44, 44, 0.98);
background: rgba(66, 66, 64, 0.95); /*background: rgba(66, 66, 64, 0.95);*/
}
.window-app {
}
.app.sidebar-popout .window-content {
color: rgba(4, 44, 44, 0.98);
} }
.window-header{ .window-header{
background: rgba(0,0,0,0.75); background: rgba(0,0,0,0.75);
} }
.dialog .window-content { .dialog .window-content {
color: rgba(66, 66, 64, 0.95); color: rgba(224, 208, 197, 0.9);
} }
.dialog-content, .dialog-buttons, .form-fields { .dialog-content, .dialog-buttons, .form-fields {
color: rgba(66, 66, 64, 0.95); color: rgba(4, 44, 44, 0.98);
} }
.dialog-buttons { .dialog-buttons {
color: rgba(66, 66, 64, 0.95); color: rgba(224, 208, 197, 0.9);
} }
.dialog .dialog-buttons button.default { .dialog .dialog-buttons button.default {
color: rgba(66, 66, 64, 0.95); color: rgba(4, 44, 44, 0.98);
} }
.window-app.sheet .window-content { .window-app.sheet .window-content {
margin: 0; margin: 0;
@ -211,8 +217,7 @@ table { border: 1px solid #7a7971;}
flex: 'flex-shrink' ; flex: 'flex-shrink' ;
} }
/* Styles limited to foundryvtt-vadentis sheets */ /* Styles limited to foundryvtt-hero6 sheets */
.fvtt-hero-system-6 .sheet-header { .fvtt-hero-system-6 .sheet-header {
-webkit-box-flex: 0; -webkit-box-flex: 0;
-ms-flex: 0 0 210px; -ms-flex: 0 0 210px;
@ -399,14 +404,9 @@ form .form-group label {
text-align: right; text-align: right;
} }
.window-app.sheet .window-content .sheet-header {
/* ======================================== */ background: rgba(228, 240, 240, 0.75);
/* Sheet */
.window-app.sheet .window-content .sheet-header{
background: url("../images/ui/pc_sheet_bg.webp")
} }
/* background: #011d33 url("../images/ui/fond1.webp") repeat left top;*/
/*color: rgba(168, 139, 139, 0.5);*/
.window-app.sheet .window-content .sheet-header input[type="text"], .window-app.sheet .window-content .sheet-header input[type="number"], .window-app.sheet .window-content .sheet-header input[type="password"], .window-app.sheet .window-content .sheet-header input[type="date"], .window-app.sheet .window-content .sheet-header input[type="time"] { .window-app.sheet .window-content .sheet-header input[type="text"], .window-app.sheet .window-content .sheet-header input[type="number"], .window-app.sheet .window-content .sheet-header input[type="password"], .window-app.sheet .window-content .sheet-header input[type="date"], .window-app.sheet .window-content .sheet-header input[type="time"] {
background: rgba(228, 240, 240, 0.75); background: rgba(228, 240, 240, 0.75);
@ -434,13 +434,10 @@ form .form-group label {
.window-app .window-content, .window-app.sheet .window-content .sheet-body{ .window-app .window-content, .window-app.sheet .window-content .sheet-body{
font-size: 0.8rem; font-size: 0.8rem;
/*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;*/
background: rgba(228, 240, 240, 0.75); background: rgba(228, 240, 240, 0.75);
color: rgba(66, 66, 64, 0.95); color: rgba(66, 66, 64, 0.95);
} }
/* background: rgba(245,245,240,0.6) url("../images/ui/sheet_background.webp") left top;*/
section.sheet-body{padding: 0.25rem 0.5rem;} section.sheet-body{padding: 0.25rem 0.5rem;}
.sheet header.sheet-header .profile-img { .sheet header.sheet-header .profile-img {
@ -466,8 +463,6 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
color:beige; color:beige;
} }
/* background: rgb(245,245,240) url("../images/ui/fond4.webp") repeat left top;*/
nav.sheet-tabs .item { nav.sheet-tabs .item {
position: relative; position: relative;
padding: 0 0.15rem; padding: 0 0.15rem;
@ -480,7 +475,7 @@ nav.sheet-tabs .item:after {
right: 0; right: 0;
height: 2rem; height: 2rem;
width: 1px; width: 1px;
border-right: 1px dashed rgba(52, 52, 52, 0.25); /*border-right: 1px dashed rgba(52, 52, 52, 0.25);*/
} }
.sheet .tab[data-tab] { .sheet .tab[data-tab] {
@ -586,9 +581,6 @@ ul, li {
.item-display-hide { .item-display-hide {
display: none; display: none;
} }
.conteneur-type {
background: rgb(200, 10, 100, 0.25);
}
.item-quantite { .item-quantite {
margin-left: 0.5rem; margin-left: 0.5rem;
} }
@ -657,6 +649,11 @@ ul, li {
align-content: center; align-content: center;
} }
.content-center {
align-content: center;
text-align: center;
}
.attribut-value, .attribut-value,
.carac-value { .carac-value {
flex-grow: 0; flex-grow: 0;
@ -780,8 +777,6 @@ ul, li {
color: rgba(220,220,220,0.75); color: rgba(220,220,220,0.75);
} }
/* background: rgb(105,85,65) url("../images/ui/texture_feuille_perso_onglets.webp") no-repeat right bottom;*/
#sidebar.collapsed { #sidebar.collapsed {
height: 470px !important; height: 470px !important;
} }
@ -826,10 +821,13 @@ ul, li {
.roll-dialog-header { .roll-dialog-header {
height: 52px; height: 52px;
} }
.dialog-roll-title {
margin-left: 8px;
}
.actor-icon { .actor-icon {
float: left; float: left;
width: 48px; width: 48px;
max-width: 48px;
height: 48px; height: 48px;
padding: 2px 6px 2px 2px; padding: 2px 6px 2px 2px;
} }
@ -865,18 +863,6 @@ ul, li {
padding-bottom: .2rem; padding-bottom: .2rem;
} }
.div-river-full {
height: 5rem;
align-items: flex-start;
}
.div-river {
align-content: center;
margin-left: 8px;
align-content:space-around;
justify-content: space-around;
}
.div-center { .div-center {
align-self: center; align-self: center;
} }
@ -1051,38 +1037,9 @@ ul, li {
transition: opacity 0.3s; transition: opacity 0.3s;
} }
.tooltip .ttt-fatigue{
width: 360px;
background: rgba(30, 25, 20, 0.9);
border-image: url(img/ui/bg_control.jpg) 21 repeat;
border-image-slice: 6 6 6 6 fill;
border-image-width: 6px 6px 6px 6px;
border-image-outset: 0px 0px 0px 0px;
border-radius: 0px;
font-size: 0.8rem;
padding: 3px 0;
}
.tooltip .ttt-ajustements {
width: 150px;
background: rgba(220,220,210,0.95);
border-radius: 6px;
font-size: 0.9rem;
padding: 3px 0;
}
.tooltip-nobottom { .tooltip-nobottom {
border-bottom: unset; /* If you want dots under the hoverable text */ border-bottom: unset; /* If you want dots under the hoverable text */
} }
.tooltip .ttt-xp {
width: 250px;
background: rgba(220,220,210,0.95);
border-radius: 6px;
font-size: 0.9rem;
padding: 3px 0;
}
/* Show the tooltip text when you mouse over the tooltip container */ /* Show the tooltip text when you mouse over the tooltip container */
.tooltip:hover .tooltiptext { .tooltip:hover .tooltiptext {
@ -1090,6 +1047,31 @@ ul, li {
opacity: 1; opacity: 1;
} }
.chat-card-small-button {
box-shadow: inset 0px 1px 0px 0px #a6827e;
background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%);
background-color: #7d5d3b00;
border-radius: 3px;
border: 1px ridge #846109;
display: inline-block;
cursor: pointer;
color: #ffffff;
font-size: 0.8rem;
text-decoration: none;
text-shadow: 0px 1px 0px #4d3534;
position: relative;
margin:1px;
}
.chat-card-small-button:hover {
background: linear-gradient(to bottom, #800000 5%, #3e0101 100%);
background-color: red;
}
.chat-card-small-button:active {
position:relative;
top:1px;
}
.chat-card-button { .chat-card-button {
box-shadow: inset 0px 1px 0px 0px #a6827e; box-shadow: inset 0px 1px 0px 0px #a6827e;
background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%); background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%);
@ -1154,34 +1136,6 @@ ul, li {
padding-left: 2rem; padding-left: 2rem;
} }
.drop-equipment-effect,
.drop-power-effect,
.drop-perk-effect,
.drop-ability-effect,
.drop-effect-specaffected,
.drop-effect-spec,
.drop-ability-weapon,
.drop-ability-armor,
.drop-race-perk,
.drop-spec-perk,
.drop-ability-power,
.drop-ability-spec,
.drop-spec-power,
.drop-specialability,
.drop-abilities,
.drop-optionnal-abilities,
.drop-virtue-vice-effect,
.drop-virtue-vice,
.drop-vice-virtue,
.drop-specialperk1,
.drop-perk2,
.drop-spec1 ,
.drop-spec2 {
background: linear-gradient(to bottom, #6c95b9fc 5%, #105177ab 100%);
background-color: #7d5d3b00;
border-radius: 3px;
border: 2px ridge #846109;
}
/*************************************************************/ /*************************************************************/
#pause #pause
@ -1201,8 +1155,8 @@ ul, li {
} }
#logo { #logo {
content : url(../images/ui/crucible_game_logo.png); content : url(../images/ui/logo_hex_yellow_01.webp);
width: 100px; width: 60px;
height: 60px; height: 60px;
} }
@ -1341,6 +1295,9 @@ Focus FOC: #ff0084
background: black; background: black;
color: white; color: white;
} }
.item-packed {
flex-grow:0;
}
.items-title-text { .items-title-text {
margin-left: 4px; margin-left: 4px;
} }
@ -1392,6 +1349,11 @@ Focus FOC: #ff0084
max-width: 9rem; max-width: 9rem;
min-width: 9rem; min-width: 9rem;
} }
.item-field-label-very-short {
flex-grow:1;
max-width: 2.5rem;
min-width: 2.5rem;
}
.item-field-label-short { .item-field-label-short {
flex-grow:1; flex-grow:1;
max-width: 4rem; max-width: 4rem;
@ -1406,6 +1368,12 @@ Focus FOC: #ff0084
flex-grow:1; flex-grow:1;
max-width: 8rem; max-width: 8rem;
min-width: 8rem; min-width: 8rem;
text-align: start;
}
.item-field-text-long {
flex-grow:1;
max-width: 14rem;
min-width: 14rem;
} }
.item-field-label-long-img { .item-field-label-long-img {
flex-grow:1; flex-grow:1;
@ -1430,12 +1398,20 @@ Focus FOC: #ff0084
.item-control-end { .item-control-end {
align-self: flex-end; align-self: flex-end;
} }
.margin-space-4 {
margin-left: 4px;
}
.margin-item-list { .margin-item-list {
margin-top: 4px; margin-top: 4px;
} }
.margin-image-right { .margin-image-right {
margin-right: 4px; margin-right: 4px;
} }
.fixed-separator {
width: 12px;
max-width: 12px;
min-width: 12px;
}
.alternate-list { .alternate-list {
margin-top: 4px; margin-top: 4px;
flex-wrap: nowrap; flex-wrap: nowrap;
@ -1446,7 +1422,12 @@ Focus FOC: #ff0084
} }
.item-controls-fixed { .item-controls-fixed {
min-width:2rem; min-width:2rem;
max-width: 2rem; /*max-width: 2rem;*/
}
.item-controls-fixed-small {
min-width:1rem;
font-size: 0.8rem;
/*max-width: 2rem;*/
} }
.biodata-portrait { .biodata-portrait {
min-height: 512px; min-height: 512px;
@ -1456,3 +1437,16 @@ Focus FOC: #ff0084
min-height: 100%; min-height: 100%;
height: 100%; height: 100%;
} }
.margin-left-4 {
margin-left: 4px;
}
.margin-left-8 {
margin-left: 8px;
}
.maneuver-is-stock {
display: none;
visibility: hidden;
}
.compendium .directory-list .directory-item .folder-header h3 {
color:#000
}

View File

@ -1,60 +0,0 @@
{{!-- Carac Tab --}}
<div class="tab items" data-group="primary" data-tab="statistics">
<div class="grid grid-2col">
<div class="">
<div class="flexrow">
<span class="generic-label packed-left"><a class="generic-pool-roll"><button class="chat-card-button">Dice Pool</button></a></span>
</div>
</div>
<div class="">
<ul>
<li class="item flexrow list-item" data-key="momentum">
<span class="stat-label flexrow" name="momentum"> <h4>{{data.momentum.label}}</h4> </span>
<input type="text" class="padd-right" name="data.momentum.value" value="{{data.momentum.value}}" data-dtype="Number"/>
<input type="text" class="padd-right" name="data.momentum.max" value="{{data.momentum.max}}" data-dtype="Number"/>
</li>
</ul>
</div>
</div>
</div>
<ul>
<li class="item flexrow list-item" data-key="mr">
<span class="stat-label flexrow" name="mr">
<a class="roll-mr" data-stat-key="{{mr}}"><h4>{{data.mr.label}}</h4></a>
</span>
<select class="carac-base flexrow" type="text" name="data.mr.value" value="{{data.mr.value}}"
data-dtype="Number" >
{{#select data.mr.value}}
{{{@root.optionsDiceList}}}
{{/select}}
</select>
<input type="text" class="padd-right input-numeric-short" name="data.mr.mod" value="{{data.mr.mod}}" data-dtype="Number"/>
</li>
</ul>
<li class="item flexrow list-item" data-attr-key="{{key}}">
{{#each data.secondary as |stat2 key|}}
{{#if stat2.iscombat}}
<span class="stat-label" name="{{key}}">
<h4>{{stat2.label}} : </h4>
</span>
<span class="small-label padd-right packed-left">Cur</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.secondary.{{key}}.value" value="{{stat2.value}}" data-dtype="Number"/>
<span class="small-label padd-right packed-left">&nbsp;Max</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.secondary.{{key}}.max" value="{{stat2.max}}" data-dtype="Number"/>
{{/if}}
{{/each}}
</li>
<li class="item flexrow list-item" data-key="momentum">
<span class="stat-label flexrow" name="momentum"><h4>{{data.momentum.label}}:</h4></span>
<span class="small-label padd-right packed-left">Cur</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.momentum.value" value="{{data.momentum.value}}" data-dtype="Number"/>
<span class="small-label padd-right packed-left">&nbsp;Max</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.momentum.max" value="{{data.momentum.max}}" data-dtype="Number"/>
</li>

View File

@ -5,11 +5,11 @@
"flags": {} "flags": {}
} }
], ],
"description": "Hero System v6 for FoundryVTT (Official)", "description": "Hero System 6E for FoundryVTT (Official)",
"esmodules": [ "esmodules": [
"modules/hero6-main.js" "modules/hero6-main.js"
], ],
"gridDistance": 5, "gridDistance": 2,
"gridUnits": "m", "gridUnits": "m",
"languages": [ "languages": [
{ {
@ -30,15 +30,6 @@
"private": false, "private": false,
"flags": {} "flags": {}
}, },
{
"type": "Item",
"label": "Weapons",
"name": "weapons",
"path": "packs/weapons.db",
"system": "fvtt-hero-system-6",
"private": false,
"flags": {}
},
{ {
"type": "Item", "type": "Item",
"label": "Skills", "label": "Skills",
@ -66,6 +57,15 @@
"private": false, "private": false,
"flags": {} "flags": {}
}, },
{
"type": "Item",
"label": "Maneuvers",
"name": "maneuvers",
"path": "packs/maneuvers.db",
"system": "fvtt-hero-system-6",
"private": false,
"flags": {}
},
{ {
"type": "Item", "type": "Item",
"label": "Perks", "label": "Perks",
@ -85,22 +85,21 @@
"flags": {} "flags": {}
} }
], ],
"primaryTokenAttribute": "secondary.hp", "primaryTokenAttribute": "characteristics.body",
"secondaryTokenAttribute": "secondary.effort", "secondaryTokenAttribute": "characteristics.end",
"socket": true, "socket": true,
"styles": [ "styles": [
"styles/simple.css" "styles/simple.css"
], ],
"version": "10.0.33", "version": "11.0.23",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "11",
"verified": "10", "verified": "11"
"maximum": "10"
}, },
"title": "Hero System v6 for FoundrtVTT (Official)", "title": "Hero System 6E Basic (Official)",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/raw/branch/main/system.json", "manifest": "https://www.uberwald.me/gitea/public/fvtt-hero-system-6/raw/branch/master/system.json",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/archive/fvtt-hero-system-6-v10.0.33.zip", "download": "https://www.uberwald.me/gitea/public/fvtt-hero-system-6/archive/fvtt-hero-system-6-v11.0.23.zip",
"url": "https://www.uberwald.me/gitea/uberwald/", "url": "https://www.uberwald.me/public/uberwald/",
"background": "images/ui/hro6_welcome_page.webp", "background": "systems/fvtt-hero-system-6/images/ui/hero_foundry_cover.webp",
"id": "fvtt-hero-system-6" "id": "fvtt-hero-system-6"
} }

View File

@ -1,7 +1,8 @@
{ {
"Actor": { "Actor": {
"types": [ "types": [
"character" "character",
"minion"
], ],
"templates": { "templates": {
"biodata": { "biodata": {
@ -39,48 +40,50 @@
"characteristics": { "characteristics": {
"characteristics": { "characteristics": {
"str": { "str": {
"label": "Strength", "label": "STR",
"value": 10, "value": 10,
"base": 10, "base": 10,
"category": "main", "category": "main",
"strdice": {}, "strdice": "1d6",
"lift": "", "lift": "",
"strend": 0, "strend": 0,
"strendmode": "str10",
"hasroll": true, "hasroll": true,
"realcost": 0, "realcost": 0,
"activecost": 0 "activecost": 0
}, },
"dex": { "dex": {
"label": "Dexterity", "label": "DEX",
"value": 10, "value": 10,
"base": 10, "base": 10,
"hasroll": true, "hasroll": true,
"initiative": 10,
"category": "main" "category": "main"
}, },
"con": { "con": {
"label": "Constitution", "label": "CON",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
"base": 10 "base": 10
}, },
"int": { "int": {
"label": "Intelligence", "label": "INT",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
"base": 10, "base": 10,
"perceptionroll": 10 "perceptionroll": 11
}, },
"ego": { "ego": {
"label": "Ego", "label": "EGO",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
"base": 10 "base": 10
}, },
"pre": { "pre": {
"label": "Presence", "label": "PRE",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
@ -88,7 +91,7 @@
}, },
"ocv": { "ocv": {
"label": "OCV", "label": "OCV",
"hasroll": false, "hasroll": true,
"base": 3, "base": 3,
"autoMod": "0", "autoMod": "0",
"userMod": "0", "userMod": "0",
@ -106,7 +109,7 @@
}, },
"omcv": { "omcv": {
"label": "OMCV", "label": "OMCV",
"hasroll": false, "hasroll": true,
"base": 3, "base": 3,
"autoMod": "0", "autoMod": "0",
"userMod": "0", "userMod": "0",
@ -123,7 +126,7 @@
"modifier": 1 "modifier": 1
}, },
"spd": { "spd": {
"label": "Speed", "label": "SPD",
"hasroll": false, "hasroll": false,
"value": 2, "value": 2,
"base": 2 "base": 2
@ -172,14 +175,6 @@
"value": 20, "value": 20,
"max": 20 "max": 20
}, },
"other": {
"label": "OTHER",
"hasroll": false,
"isvital": true,
"damage": 0,
"value": 20,
"max": 20
},
"body": { "body": {
"label": "BODY", "label": "BODY",
"hasroll": false, "hasroll": false,
@ -211,6 +206,7 @@
"ismovement": true, "ismovement": true,
"hasroll": false, "hasroll": false,
"value": 12, "value": 12,
"ncvalue": 24,
"base": 12 "base": 12
}, },
"swimming": { "swimming": {
@ -218,6 +214,7 @@
"ismovement": true, "ismovement": true,
"hasroll": false, "hasroll": false,
"value": 4, "value": 4,
"ncvalue": 8,
"base": 4 "base": 4
}, },
"leaping": { "leaping": {
@ -225,6 +222,7 @@
"ismovement": true, "ismovement": true,
"hasroll": false, "hasroll": false,
"value": 4, "value": 4,
"ncvalue": 8,
"base": 4, "base": 4,
"leaping_horizontal_base": 0, "leaping_horizontal_base": 0,
"leaping_horizontal_total": 0, "leaping_horizontal_total": 0,
@ -237,25 +235,31 @@
"movements": { "movements": {
"fly": { "fly": {
"label": "Fly", "label": "Fly",
"value": 0 "value": 0,
"ncvalue": 0
}, },
"teleport": { "teleport": {
"label": "Teleport", "label": "Teleport",
"value": 0 "value": 0,
"ncvalue": 0
}, },
"tunnel": { "tunnel": {
"label": "Tunnel", "label": "Tunnel",
"value": 0 "value": 0,
"ncvalue": 0
}, },
"move1": { "move1": {
"label": "N/A", "label": "N/A",
"iseditable": true, "iseditable": true,
"value": 0 "value": 0,
"ncvalue": 0
}, },
"move2": { "move2": {
"label": "N/A", "label": "N/A",
"iseditable": true, "iseditable": true,
"value": 0 "value": 0,
"ncvalue": 0
} }
} }
}, },
@ -306,6 +310,15 @@
"movements" "movements"
], ],
"subactors": [] "subactors": []
},
"minion": {
"templates": [
"biodata",
"characteristics",
"defenses",
"movements"
],
"subactors": []
} }
}, },
"Item": { "Item": {
@ -339,13 +352,21 @@
"senseaffecting": false, "senseaffecting": false,
"modifiers": [], "modifiers": [],
"levels": 0, "levels": 0,
"quantity": 0, "quantity": 1,
"range": "", "range": "",
"damageeffect": "normal",
"damage": "", "damage": "",
"stunx": 0,
"endurance": 0, "endurance": 0,
"hasroll": false, "hasroll": false,
"attackvalue": "ocv",
"roll": 0, "roll": 0,
"computebody": false, "computebody": false,
"haseffectroll": false,
"effectroll": "standard",
"effectrollformula": "",
"hascharges": false,
"nbcharges": 0,
"items": {} "items": {}
} }
}, },
@ -355,8 +376,10 @@
], ],
"maneuvertype": "general", "maneuvertype": "general",
"pha": "", "pha": "",
"ocv": 0, "ocv": "",
"dcv" : 0, "dcv" : "",
"omcv": "",
"dmcv" : "",
"isstock": false, "isstock": false,
"active": false "active": false
}, },
@ -372,7 +395,7 @@
}, },
"skill": { "skill": {
"skilltype": "agility", "skilltype": "agility",
"characteristic": "", "characteristic": "str",
"base": "", "base": "",
"levelscost": 0, "levelscost": 0,
"levels": 0, "levels": 0,
@ -398,7 +421,19 @@
"subtype": "equipment", "subtype": "equipment",
"value": 0, "value": 0,
"weight": 0, "weight": 0,
"moneycost": 0 "moneycost": 0,
"ocv": 0,
"omcv": 0,
"dmcv": 0,
"rmod": 0,
"pd": 0,
"ed": 0,
"rpd": 0,
"red": 0,
"mentaldefense": 0,
"powerdefense": 0,
"flashdefense": 0,
"otherdefense": 0
}, },
"attack": { "attack": {
"templates": [ "templates": [

View File

@ -4,7 +4,13 @@
<header class="sheet-header"> <header class="sheet-header">
<div class="header-fields"> <div class="header-fields">
<div class="flexrow"> <div class="flexrow">
<img class="profile-img margin-image-right" src="{{img}}" data-edit="img" title="{{name}}" />
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="fixed-separator">
&nbsp;
</div>
<div class="flexcol"> <div class="flexcol">
<h1 class="charname "><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname "><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
@ -12,54 +18,60 @@
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item flexrow"> <li class="item flexrow">
<label class="item-field-label-medium">Alternate IDs</label> <label class="item-field-label-medium">Alternate IDs</label>
<input type="text" class="item-field-label-long4" name="system.biodata.alternateids" value="{{system.biodata.origin}}" <input type="text" class="item-field-label-long4" name="system.biodata.alternateids"
data-dtype="String" /> value="{{system.biodata.origin}}" data-dtype="String" />
</li> </li>
</ul> </ul>
</div> </div>
<div class="grid grid-2col"> <div class="grid grid-2col">
<div> <div>
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="flexrow item"> <li class="flexrow item">
<label class="item-field-label-medium">Campaign</label> <label class="item-field-label-medium">Campaign</label>
<input type="text" class="item-field-label-long3" name="system.biodata.campaign" value="{{system.biodata.campaign}}" data-dtype="String" /> <input type="text" class="item-field-label-long3" name="system.biodata.campaign"
</li> value="{{system.biodata.campaign}}" data-dtype="String" />
<li class="flexrow item"> </li>
<label class="item-field-label-medium">Player</label> <li class="flexrow item">
<input type="text" class="item-field-label-long3" name="system.biodata.player" value="{{system.biodata.player}}" <label class="item-field-label-medium">Player</label>
data-dtype="String" /> <input type="text" class="item-field-label-long3" name="system.biodata.player"
</li> value="{{system.biodata.player}}" data-dtype="String" />
<li class="flexrow item"> </li>
<label class="item-field-label-medium">GM</label> <li class="flexrow item">
<input type="text" class="item-field-label-long3" name="system.biodata.gm" value="{{system.biodata.gm}}" <label class="item-field-label-medium">GM</label>
data-dtype="String" /> <input type="text" class="item-field-label-long3" name="system.biodata.gm"
</li> value="{{system.biodata.gm}}" data-dtype="String" />
<li class="item flexrow"> </li>
<label class="item-field-label-medium">Hair</label> <li class="item flexrow">
<input type="text" class="item-field-label-long3" name="system.biodata.hair" value="{{system.biodata.hair}}" data-dtype="String" /> <label class="item-field-label-medium">Hair</label>
</li> <input type="text" class="item-field-label-long3" name="system.biodata.hair"
</ul> value="{{system.biodata.hair}}" data-dtype="String" />
</li>
</ul>
</div> </div>
<div> <div>
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="flexrow item"> <li class="flexrow item">
<label class="item-field-label-medium">Gender</label> <label class="item-field-label-medium">Gender</label>
<input type="text" class="item-field-label-medium" name="system.biodata.gender" value="{{system.biodata.gender}}" data-dtype="String" /> <input type="text" class="item-field-label-medium" name="system.biodata.gender"
</li> value="{{system.biodata.gender}}" data-dtype="String" />
<li class="item flexrow"> </li>
<label class="item-field-label-medium">Height</label> <li class="item flexrow">
<input type="text" class="item-field-label-medium" name="system.biodata.height" value="{{system.biodata.height}}" data-dtype="String" /> <label class="item-field-label-medium">Height</label>
</li> <input type="text" class="item-field-label-medium" name="system.biodata.height"
<li class="item flexrow"> value="{{system.biodata.height}}" data-dtype="String" />
<label class="item-field-label-medium">Mass</label> </li>
<input type="text" class="item-field-label-medium" name="system.biodata.mass" value="{{system.biodata.mass}}" data-dtype="String" /> <li class="item flexrow">
</li> <label class="item-field-label-medium">Mass</label>
<li class="item flexrow"> <input type="text" class="item-field-label-medium" name="system.biodata.mass"
<label class="item-field-label-medium">Eyes</label> value="{{system.biodata.mass}}" data-dtype="String" />
<input type="text" class="item-field-label-medium" name="system.biodata.eyes" value="{{system.biodata.eyes}}" data-dtype="String" /> </li>
</li> <li class="item flexrow">
</ul> <label class="item-field-label-medium">Eyes</label>
<input type="text" class="item-field-label-medium" name="system.biodata.eyes"
value="{{system.biodata.eyes}}" data-dtype="String" />
</li>
</ul>
</div> </div>
</div> </div>
@ -67,19 +79,23 @@
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item flexrow"> <li class="item flexrow">
<label class="item-field-label-medium">Points</label> <label class="item-field-label-medium">Points</label>
<input type="text" class="item-field-label-short" name="system.biodata.points" value="{{system.biodata.origin}}" data-dtype="Number" /> <input type="text" class="item-field-label-short" name="system.biodata.points"
value="{{system.biodata.origin}}" data-dtype="Number" />
<label class="">&nbsp;</label> <label class="">&nbsp;</label>
<label class="item-field-label-medium">Complications</label> <label class="item-field-label-medium">Complications</label>
<input type="text" class="item-field-label-short" name="system.biodata.complications" value="{{system.biodata.complications}}" data-dtype="Number" /> <input type="text" class="item-field-label-short" name="system.biodata.complications"
value="{{system.biodata.complications}}" data-dtype="Number" />
<label class="">&nbsp;</label> <label class="">&nbsp;</label>
<label class="item-field-label-medium">XP Earned</label> <label class="item-field-label-medium">XP Earned</label>
<input type="text" class="item-field-label-short" name="system.biodata.xpearned" value="{{system.biodata.xpearned}}" data-dtype="Number" /> <input type="text" class="item-field-label-short" name="system.biodata.xpearned"
value="{{system.biodata.xpearned}}" data-dtype="Number" />
<label class="">&nbsp;</label> <label class="">&nbsp;</label>
<label class="item-field-label-medium">XP Spent</label> <label class="item-field-label-medium">XP Spent</label>
<input type="text" class="item-field-label-short" name="system.biodata.xpspent" value="{{system.biodata.xpspent}}" data-dtype="Number" /> <input type="text" class="item-field-label-short" name="system.biodata.xpspent"
value="{{system.biodata.xpspent}}" data-dtype="Number" />
<label class="">&nbsp;</label> <label class="">&nbsp;</label>
</li> </li>
</ul> </ul>
@ -113,69 +129,115 @@
<div class="tab combat" data-group="primary" data-tab="combat"> <div class="tab combat" data-group="primary" data-tab="combat">
<div class="grid grid2col"> <div class="grid grid2col">
<div> <div>
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item"> <li class="item">
<label class="item-field-label-medium">STR Dice</label> <label class="item-field-label-medium">STR Dice</label>
<a class="roll-direct" data-roll-source="STR Dice" data-roll-formula="{{characteristics.str.strdice.rollFormula}}"><i class="fas fa-dice"></i>{{characteristics.str.strdice.displayFormula}}</a> <a class="roll-lift-dice"><i class="fas fa-dice"></i>{{characteristics.str.strdice}}</a>
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-medium">Lift</label> <label class="item-field-label-medium">Lift</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.str.lift" value="{{characteristics.str.lift}}" data-dtype="String" /> <input type="text" class="item-field-label-short update-field" disabled
data-field-name="system.characteristics.str.lift" value="{{characteristics.str.lift}}"
data-dtype="String" />
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-medium">STR END</label> <label class="item-field-label-medium">STR END</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.str.strend" value="{{characteristics.str.strend}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
</li> data-field-name="system.characteristics.str.strend" disabled value="{{characteristics.str.strend}}"
<li class="flexrow item"> data-dtype="Number" />
<label class="item-field-label-long">Presence attack</label>
<a class="roll-direct" data-roll-source="Presence attack" data-roll-formula="{{system.biodata.presenceattack.rollFormula}}"><i class="fas fa-dice"></i>{{system.biodata.presenceattack.displayFormula}}</a>
</li> </li>
</ul> </ul>
{{#each maneuvers as |mlist key|}} {{#each maneuvers as |mlist mtype|}}
<ul class="stat-list alternate-list"> <ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long-img"> <span class="item-field-label-long-img">
<label class="">{{upperFirst key}} Standard Maneuver</label> <label class="">{{upperFirst mtype}} Maneuver</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-very-short">
<label class="short-label">PHA</label> <label class="short-label">PHA</label>
</span> </span>
<span class="item-field-label-short">
<label class="short-label">OCV</label> {{#if (eq mtype "mental")}}
</span> <span class="item-field-label-very-short">
<span class="item-field-label-short"> <label class="short-label">OMCV</label>
<label class="short-label">DCV</label> </span>
</span> <span class="item-field-label-very-short">
<span class="item-field-label-medium"> <label class="short-label">DMCV</label>
<label class="short-label">Effects</label> </span>
</span> {{else}}
</li> <span class="item-field-label-very-short">
{{#each mlist as |maneuver key|}} <label class="short-label">OCV</label>
<li class="item flexrow list-item list-item-shadow" data-item-id="{{maneuver._id}}"> </span>
<span class="item-field-label-very-short">
<label class="short-label">DCV</label>
</span>
{{/if}}
<span class="item-field-text-long">
<label class="short-label">Effects</label>
</span>
</li>
{{#each mlist as |maneuver key|}}
<li class="item flexrow list-item list-item-shadow " data-item-id="{{maneuver._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{maneuver.img}}" /></a> src="{{maneuver.img}}" />
<span class="item-field-label-long">{{maneuver.name}}</span> </a>
<span class="item-field-label-long">
<a class="roll-item"><i class="fas fa-dice"></i></a>
{{maneuver.name}}
</span>
<span class="item-field-label-short">{{maneuver.system.pha}}</span> <span class="item-field-label-very-short content-center">{{maneuver.system.pha}}</span>
<span class="item-field-label-short">{{maneuver.system.ocv}}</span> {{#if (eq ../mtype "mental")}}
<span class="item-field-label-short">{{maneuver.system.dcv}}</span> <span class="item-field-label-very-short content-center">{{maneuver.system.omcv}}</span>
<span class="item-field-label-very-short content-center">{{maneuver.system.dmcv}}</span>
{{else}}
<span class="item-field-label-very-short content-center">{{maneuver.system.ocv}}</span>
<span class="item-field-label-very-short content-center">{{maneuver.system.dcv}}</span>
{{/if}}
<span class="item-field-label-medium">{{maneuver.system.effects}}</span> <span class="item-field-text-long">{{maneuver.system.effects}}
{{#if maneuver.system.haseffectroll}}
<a class="roll-direct" data-roll-source="Maneuver {{maneuver.name}}"
data-roll-formula="{{maneuver.system.effectrollformula}}">
<i class="fas fa-dice"></i>{{maneuver.system.effectrollformula}}
</a>
{{/if}}
</span>
<div class="item-controls item-controls-fixed"> </li>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> {{/each}}
</div> </ul>
</li>
{{/each}}
</ul>
{{/each}} {{/each}}
</div> </div>
<div> <div>
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="flexrow item"> <li class="flexrow item">
<label class="item-field-label-medium">SPD</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.spd.value" value="{{characteristics.spd.value}}" data-dtype="Number" /> <label class="item-packed">Initiative</label>
<input type="text" class="margin-left-4item-packed item-field-label-very-short update-field"
data-field-name="system.characteristics.dex.initiative" value="{{characteristics.dex.initiative}}"
data-dtype="Number" />
<label class="items-title-text item-packed margin-left-8">SPD</label>
<input type="text" class="item-field-label-very-short margin-left-4 update-field item-packed"
data-field-name="system.characteristics.spd.value" value="{{characteristics.spd.value}}"
data-dtype="Number" />
<button class="chat-card-small-button item-field-label-short margin-left-8 hold-action item-packed">{{#if
isHold}}Unhold{{else}}Hold{{/if}}</button>
<button class="chat-card-small-button item-field-label-short margin-left-4 abort-action item-packed">{{#if
isAbort}}Unabort{{else}}Abort{{/if}}</button>
<label class="items-title-text margin-left-8">Presence attack</label>
<a class="roll-direct" data-roll-source="Presence attack"
data-roll-formula="{{system.biodata.presenceattack.rollFormula}}">
<i class="fas fa-dice"></i>{{system.biodata.presenceattack.displayFormula}}
</a>
</li> </li>
</ul> </ul>
@ -183,24 +245,26 @@
<div> <div>
<ul class="stat-list alternate-list"> <ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long"> <span class="item-field-label-long">
<label class="">Vitals</label> <label class="">Vitals</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Val</label> <label class="short-label">Val</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Dmg</label> <label class="short-label">Dmg</label>
</span> </span>
</li> </li>
{{#each characteristics as |char key|}} {{#each characteristics as |char key|}}
{{#if char.isvital}} {{#if char.isvital}}
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}"> <li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
<span class="item-field-label-long">{{char.label}}</span> <span class="item-field-label-long">{{char.label}}</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.{{key}}.value" value="{{char.value}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
<input type="text" class="item-field-label-short" name="system.characteristics.{{key}}.damage" value="{{char.damage}}" data-dtype="Number" /> data-field-name="system.characteristics.{{key}}.max" value="{{char.max}}" data-dtype="Number" />
</li> <input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.{{key}}.value"
{{/if}} value="{{char.value}}" data-dtype="Number" />
</li>
{{/if}}
{{/each}} {{/each}}
</ul> </ul>
@ -210,57 +274,73 @@
<ul class="stat-list alternate-list"> <ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long"> <span class="item-field-label-long">
<label class="">Defenses</label> <label class="">Defenses</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Val</label> <label class="short-label">Normal</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Res</label> <label class="short-label">Resistant</label>
</span> </span>
</li> </li>
{{#each characteristics as |char key|}} {{#each characteristics as |char key|}}
{{#if char.isdefense}} {{#if char.isdefense}}
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}"> <li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
<span class="item-field-label-long">{{char.label}}</span> <span class="item-field-label-long">{{char.label}}</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.{{key}}.value" value="{{char.value}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
<input type="text" class="item-field-label-short" name="system.characteristics.{{key}}.resistant" value="{{char.resistant}}" data-dtype="Number" /> data-field-name="system.characteristics.{{key}}.value" value="{{char.value}}" data-dtype="Number" />
</li> <input type="text" class="item-field-label-short" name="system.characteristics.{{key}}.resistant"
{{/if}} value="{{char.resistant}}" data-dtype="Number" />
</li>
{{/if}}
{{/each}} {{/each}}
{{#each defenses as |def key|}} {{#each defenses as |def key|}}
<li class="item flexrow list-item list-item-shadow" data-defense-key="{{key}}"> <li class="item flexrow list-item list-item-shadow" data-defense-key="{{key}}">
{{#if def.iseditable}} {{#if def.iseditable}}
<input type="text" class="item-field-label-long update-field" data-field-name="system.defenses.{{key}}.label" value="{{def.label}}" data-dtype="String" /> <input type="text" class="item-field-label-long update-field"
{{else}} data-field-name="system.defenses.{{key}}.label" value="{{def.label}}" data-dtype="String" />
<span class="item-field-label-long">{{def.label}}</span> {{else}}
{{/if}} <span class="item-field-label-long">{{def.label}}</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.defenses.{{key}}.value" value="{{def.value}}" data-dtype="Number" /> {{/if}}
<input type="text" class="item-field-label-short" name="system.defenses.{{key}}.resistant" value="{{def.resistant}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
</li> data-field-name="system.defenses.{{key}}.value" value="{{def.value}}" data-dtype="Number" />
<input type="text" class="item-field-label-short" name="system.defenses.{{key}}.resistant"
value="{{def.resistant}}" data-dtype="Number" />
</li>
{{/each}} {{/each}}
</ul> </ul>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<label class="item-field-label-short">OCV</label> <label class="item-field-label-short">
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.ocv.value" value="{{characteristics.ocv.value}}" data-dtype="Number" /> <a class="roll-charac" data-charac-key="ocv"><i class="fas fa-dice"></i>OCV</a>
</label>
<input type="text" class="item-field-label-short update-field"
data-field-name="system.characteristics.ocv.value" value="{{characteristics.ocv.value}}"
data-dtype="Number" />
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-short">DCV</label> <label class="item-field-label-short">DCV</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.dcv.value" value="{{characteristics.dcv.value}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
data-field-name="system.characteristics.dcv.value" value="{{characteristics.dcv.value}}"
data-dtype="Number" />
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-short">OMCV</label> <label class="item-field-label-short">
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.omcv.value" value="{{characteristics.omcv.value}}" data-dtype="Number" /> <a class="roll-charac" data-charac-key="omcv"><i class="fas fa-dice"></i>OMCV</a>
</label>
<input type="text" class="item-field-label-short update-field"
data-field-name="system.characteristics.omcv.value" value="{{characteristics.omcv.value}}"
data-dtype="Number" />
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-short">DMCV</label> <label class="item-field-label-short">DMCV</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.dmcv.value" value="{{characteristics.dmcv.value}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
data-field-name="system.characteristics.dmcv.value" value="{{characteristics.dmcv.value}}"
data-dtype="Number" />
</div> </div>
<div class="flexrow"> <div class="flexrow">
@ -273,52 +353,63 @@
<div> <div>
<ul class="stat-list alternate-list"> <ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long"> <span class="item-field-label-long">
<label class="">Senses</label> <label class="">Senses</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
</span> </span>
</li>
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
<span class="item-field-label-long">
<a class="roll-perception"><i class="fas fa-dice"></i>Perception Roll</a>
</span>
<input type="text" class="item-field-label-short update-field"
data-field-name="system.characteristics.int.perceptionroll"
value="{{characteristics.int.perceptionroll}}" data-dtype="Number" />
</li> </li>
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
<span class="item-field-label-long">Perception Roll</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.int.perceptionroll" value="{{characteristics.int.perceptionroll}}" data-dtype="Number" />
</li>
</ul> </ul>
<textarea type="text" class="textarea-full-height padd-right" name="system.biodata.combatnotes1" data-dtype="String">{{system.biodata.combatnotes1}}</textarea> <textarea rows="20" type="text" class="textarea-full-height padd-right" name="system.biodata.combatnotes1"
data-dtype="String">{{system.biodata.combatnotes1}}</textarea>
</div> </div>
<div> <div>
<ul class="stat-list alternate-list"> <ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long"> <span class="item-field-label-long">
<label class="">Movement</label> <label class="">Movement</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">C</label> <label class="short-label">Combat</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">NC</label> <label class="short-label">NC</label>
</span> </span>
</li> </li>
{{#each characteristics as |char key|}} {{#each characteristics as |char key|}}
{{#if char.ismovement}} {{#if char.ismovement}}
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}"> <li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
<span class="item-field-label-long">{{char.label}}</span> <span class="item-field-label-long">{{char.label}}</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.{{key}}.value" value="{{char.value}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
<input type="text" class="item-field-label-short" value="{{mul char.value 2}}" disabled data-dtype="Number" /> data-field-name="system.characteristics.{{key}}.value" value="{{char.value}}" data-dtype="Number" />
</li> <input type="text" class="item-field-label-short update-field"
{{/if}} data-field-name="system.characteristics.{{key}}.ncvalue" value="{{char.ncvalue}}"
data-dtype="Number" />
</li>
{{/if}}
{{/each}} {{/each}}
{{#each movements as |move key|}} {{#each movements as |move key|}}
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}"> <li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
{{#if move.iseditable}} {{#if move.iseditable}}
<input type="text" class="item-field-label-long update-field" data-field-name="system.movements.{{key}}.label" value="{{move.label}}" data-dtype="String" /> <input type="text" class="item-field-label-long update-field"
{{else}} data-field-name="system.movements.{{key}}.label" value="{{move.label}}" data-dtype="String" />
<span class="item-field-label-long">{{move.label}}</span> {{else}}
{{/if}} <span class="item-field-label-long">{{move.label}}</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.movements.{{key}}.value" value="{{move.value}}" data-dtype="Number" /> {{/if}}
<input type="text" class="item-field-label-short" value="{{mul move.value 2}}" disabled data-dtype="Number" /> <input type="text" class="item-field-label-short update-field"
</li> data-field-name="system.movements.{{key}}.value" value="{{move.value}}" data-dtype="Number" />
<input type="text" class="item-field-label-short" value="{{mul move.value 2}}" disabled
data-dtype="Number" />
</li>
{{/each}} {{/each}}
</ul> </ul>
@ -335,26 +426,26 @@
<div class="charac-item"> <div class="charac-item">
<ul> <ul>
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-medium"> <span class="item-field-label-short">
<label class="">Value</label> <label class="">Value</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-medium">
<label class="item-field-label-medium">CHAR</label> <label class="item-field-label-medium">CHAR</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Base</label> <label class="short-label">Base</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Roll</label> <label class="short-label">Roll</label>
</span> </span>
<span class="item-field-label-long"> <span class="item-field-label-long">
<label class="short-label">Notes</label> <label class="short-label">Notes</label>
</span> </span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
</li> </li>
{{#each characteristics as |charac key|}} {{#each characteristics as |charac key|}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-full-charac.hbs charac=charac key=key}} {{> systems/fvtt-hero-system-6/templates/partials/partial-actor-full-charac.hbs charac=charac key=key}}
{{/each}} {{/each}}
</ul> </ul>
</div> </div>
@ -383,7 +474,8 @@
src="{{skill.img}}" /></a> src="{{skill.img}}" /></a>
<span class="item-field-label-long">{{skill.name}}</span> <span class="item-field-label-long">{{skill.name}}</span>
<span class="item-field-label-medium">{{upper skill.charac}}</span> <span class="item-field-label-medium">{{upper skill.charac}}</span>
<span class="item-field-label-short"><a class="roll-item" data-type="skill"><i class="fas fa-dice"></i>{{skill.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="skill"><i
class="fas fa-dice"></i>{{skill.roll}}-</a></span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
@ -411,7 +503,8 @@
src="{{perk.img}}" /></a> src="{{perk.img}}" /></a>
<span class="item-name-label">{{perk.name}}</span> <span class="item-name-label">{{perk.name}}</span>
{{#if perk.system.hasroll}} {{#if perk.system.hasroll}}
<span class="item-field-label-short"><a class="roll-item" data-type="perk"><i class="fas fa-dice"></i>{{perk.system.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="perk"><i
class="fas fa-dice"></i>{{perk.system.roll}}-</a></span>
{{else}} {{else}}
<span class="item-field-label-short">&nbsp;</span> <span class="item-field-label-short">&nbsp;</span>
{{/if}} {{/if}}
@ -442,7 +535,8 @@
src="{{talent.img}}" /></a> src="{{talent.img}}" /></a>
<span class="item-name-label">{{talent.name}}</span> <span class="item-name-label">{{talent.name}}</span>
{{#if talent.system.hasroll}} {{#if talent.system.hasroll}}
<span class="item-field-label-short"><a class="roll-item" data-type="perk"><i class="fas fa-dice"></i>{{talent.system.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="perk"><i
class="fas fa-dice"></i>{{talent.system.roll}}-</a></span>
{{else}} {{else}}
<span class="item-field-label-short">&nbsp;</span> <span class="item-field-label-short">&nbsp;</span>
{{/if}} {{/if}}
@ -458,6 +552,10 @@
{{!-- Maneuvers Tab --}} {{!-- Maneuvers Tab --}}
<div class="tab maneuver" data-group="primary" data-tab="maneuver"> <div class="tab maneuver" data-group="primary" data-tab="maneuver">
<div>
<button class="show-stock-maneuver">Show/Hide stock maneuvers</button>
</div>
<ul class="stat-list alternate-list item-list"> <ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long-img"> <span class="item-field-label-long-img">
@ -472,29 +570,80 @@
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">DCV</label> <label class="short-label">DCV</label>
</span> </span>
<span class="item-field-label-long"> <span class="item-field-label-long3">
<label class="short-label">Effects</label> <label class="short-label">Effects</label>
</span> </span>
</li> </li>
{{#each nonstockmaneuvers as |maneuver key|}} {{#each allmaneuvers as |maneuver key|}}
<li class="item stat flexrow list-item list-item-shadow" data-item-id="{{maneuver._id}}"> {{#if (ne maneuver.system.maneuvertype "mental")}}
<div class="{{#if maneuver.system.isstock}}maneuver-list maneuver-is-stock{{/if}}">
<li class="item stat flexrow list-item list-item-shadow " data-item-id="{{maneuver._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{maneuver.img}}" /></a> src="{{maneuver.img}}" /></a>
<span class="item-field-label-long">{{maneuver.name}}</span> <span class="item-field-label-long"><a class="roll-item"><i class="fas fa-dice"></i>{{maneuver.name}}</a></span>
<span class="item-field-label-short">{{maneuver.system.pha}}</span> <span class="item-field-label-short">{{maneuver.system.pha}}</span>
<span class="item-field-label-short">{{maneuver.system.ocv}}</span> <span class="item-field-label-short">{{maneuver.system.ocv}}</span>
<span class="item-field-label-short">{{maneuver.system.dcv}}</span> <span class="item-field-label-short">{{maneuver.system.dcv}}</span>
<span class="item-field-label-long">{{maneuver.system.effects}}</span> <span class="item-field-label-long3">{{maneuver.system.effects}}</span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
</div>
{{/if}}
{{/each}} {{/each}}
</ul> </ul>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long-img">
<label class="">Mental Maneuvers</label>
</span>
<span class="item-field-label-short">
<label class="short-label">PHA</label>
</span>
<span class="item-field-label-short">
<label class="short-label">OMCV</label>
</span>
<span class="item-field-label-short">
<label class="short-label">DMCV</label>
</span>
<span class="item-field-label-long3">
<label class="short-label">Effects</label>
</span>
</li>
{{#each allmaneuvers as |maneuver key|}}
{{#if (eq maneuver.system.maneuvertype "mental")}}
<div class="">
<li class="item stat flexrow list-item list-item-shadow " data-item-id="{{maneuver._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{maneuver.img}}" /></a>
<span class="item-field-label-long">
<a class="roll-item"><i class="fas fa-dice"></i>
{{maneuver.name}}
</a>
</span>
<span class="item-field-label-short content-center">{{maneuver.system.pha}}</span>
<span class="item-field-label-short content-center">{{maneuver.system.omcv}}</span>
<span class="item-field-label-short content-center">{{maneuver.system.dmcv}}</span>
<span class="item-field-label-long3">{{maneuver.system.effects}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
</div>
{{/if}}
{{/each}}
</ul>
</div> </div>
{{!-- Powers Tab --}} {{!-- Powers Tab --}}
@ -508,14 +657,20 @@
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="item-field-label-short">Cost</label> <label class="item-field-label-short">Cost</label>
</span> </span>
<span class="item-field-label-long4"> <span class="item-field-label-long3">
<label class="item-field-label-long4">Power</label> <label class="item-field-label-long3">Name</label>
</span>
<span class="item-field-label-long2">
<label class="item-field-label-long2">Display</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Effect</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="item-field-label-short">Roll</label> <label class="item-field-label-short">Roll</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-short">
<label class="item-field-label-medium">END</label> <label class="item-field-label-short">END</label>
</span> </span>
</li> </li>
{{#each powers as |power key|}} {{#each powers as |power key|}}
@ -523,14 +678,26 @@
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{power.img}}" /></a> src="{{power.img}}" /></a>
<span class="item-field-label-short">{{power.system.cost}}</span> <span class="item-field-label-short">{{power.system.cost}}</span>
<span class="item-field-label-long4">{{{power.enrichDescription}}} {{#if (eq system.typemodifier "attack")}}
<span class="item-field-label-long3">
<a class="roll-power-attack">
<i class="fas fa-dice"></i>
{{power.name}}
</a>
</span> </span>
{{else}}
<span class="item-field-label-long3">{{power.name}}</span>
{{/if}}
<span class="item-field-label-long2">{{power.system.displayname}}</span>
<span class="item-field-label-medium"><a class="roll-damage" data-type="power"><i
class="fas fa-dice"></i>{{power.system.damage}}</a></span>
{{#if power.system.hasroll}} {{#if power.system.hasroll}}
<span class="item-field-label-short"><a class="roll-item" data-type="power"><i class="fas fa-dice"></i>{{power.system.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="power"><i
class="fas fa-dice"></i>{{power.system.roll}}-</a></span>
{{else}} {{else}}
<span class="item-field-label-short">&nbsp;</span> <span class="item-field-label-short">&nbsp;</span>
{{/if}} {{/if}}
<span class="item-field-label-medium">{{power.system.endurance}}</span> <span class="item-field-label-short">{{power.system.endurance}}</span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
@ -558,7 +725,8 @@
src="{{comp.img}}" /></a> src="{{comp.img}}" /></a>
<span class="item-name-label">{{comp.name}}</span> <span class="item-name-label">{{comp.name}}</span>
{{#if comp.system.hasroll}} {{#if comp.system.hasroll}}
<span class="item-field-label-short"><a class="roll-item" data-type="perk"><i class="fas fa-dice"></i>{{comp.system.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="perk"><i
class="fas fa-dice"></i>{{comp.system.roll}}-</a></span>
{{else}} {{else}}
<span class="item-field-label-short">&nbsp;</span> <span class="item-field-label-short">&nbsp;</span>
{{/if}} {{/if}}
@ -578,15 +746,22 @@
<h3>Encumbrance</h3> <h3>Encumbrance</h3>
<span class="small-label">Current : {{encCurrent}}</span> <span class="small-label">Current : {{encCurrent}}</span>
<span class="small-label">Capacity : {{encCapacity}}</span> <span class="small-label">Capacity : {{encCapacity}}</span>
<span class="small-label">Total value : {{totalValue}}</span>
</div> </div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Weapons" items=weapons}} {{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Money"
items=moneys}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Weapons"
items=weapons}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Armor" items=armors}} {{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Armor" items=armors}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Shields" items=shields}} {{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Shields"
items=shields}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Equipment" items=equipments}} {{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Equipment"
items=equipments}}
<hr> <hr>
@ -638,38 +813,38 @@
{{!-- Notes Tab --}} {{!-- Notes Tab --}}
<div class="tab notes" data-group="primary" data-tab="notes"> <div class="tab notes" data-group="primary" data-tab="notes">
<h3>Notes 1 : </h3> <h3>Notes 1 : </h3>
<div class="form-group editor"> <div class="medium-editor ">
{{editor notes1 target="system.biodata.notes1" button=true owner=owner {{editor notes1 target="system.biodata.notes1" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 2 : </h3> <h3>Notes 2 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes2 target="system.biodata.notes2" button=true owner=owner {{editor notes2 target="system.biodata.notes2" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 3 : </h3> <h3>Notes 3 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes3 target="system.biodata.notes3" button=true owner=owner {{editor notes3 target="system.biodata.notes3" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 4 : </h3> <h3>Notes 4 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes4 target="system.biodata.notes4" button=true owner=owner {{editor notes4 target="system.biodata.notes4" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 5 : </h3> <h3>Notes 5 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes5 target="system.biodata.notes5" button=true owner=owner {{editor notes5 target="system.biodata.notes5" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
</div> </div>
</div> </div>
</section> </section>
</form> </form>

View File

@ -0,0 +1,128 @@
<section class="{{cssClass}} directory flexcol" id="{{cssId}}" data-tab="{{tabName}}">
<header class="combat-tracker-header">
{{#if user.isGM}}
<nav class="encounters flexrow" aria-label="COMBAT.NavLabel">
<a class="combat-button combat-create" data-tooltip="COMBAT.Create">
<i class="fas fa-plus"></i>
</a>
{{#if combatCount}}
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterPrevious"
{{#if previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}>
<i class="fas fa-caret-left"></i>
</a>
<h4 class="encounter">{{localize "COMBAT.Encounter"}} {{currentIndex}} / {{combatCount}}</h4>
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterNext"
{{#if nextId}}data-document-id="{{nextId}}"{{else}}disabled{{/if}}>
<i class="fas fa-caret-right"></i>
</a>
{{/if}}
<a class="combat-button combat-control" data-tooltip="COMBAT.Delete" data-control="endCombat" {{#unless combatCount}}disabled{{/unless}}>
<i class="fas fa-trash"></i>
</a>
</nav>
{{/if}}
<div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}">
{{#if user.isGM}}
<a class="combat-button combat-control" data-tooltip="COMBAT.RollAll" data-control="rollAll" {{#unless turns}}disabled{{/unless}}>
<i class="fas fa-users"></i>
</a>
<a class="combat-button combat-control" data-tooltip="COMBAT.RollNPC" data-control="rollNPC" {{#unless turns}}disabled{{/unless}}>
<i class="fas fa-users-cog"></i>
</a>
{{/if}}
{{#if combatCount}}
{{#if combat.round}}
<!--<h3 class="encounter-title noborder">Turn {{combat.turnNumber}} Segment {{combat.segmentNumber}}</h3>-->
<h3 class="encounter-title noborder">Turn {{combat.flags.world.turnData.turnNumber}} Segment {{combat.flags.world.turnData.segmentNumber}}</h3>
{{else}}
<h3 class="encounter-title noborder">{{localize 'COMBAT.NotStarted'}}</h3>
{{/if}}
{{else}}
<h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3>
{{/if}}
{{#if user.isGM}}
<a class="combat-button combat-control" data-tooltip="COMBAT.InitiativeReset" data-control="resetAll"
{{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-undo"></i>
</a>
<a class="combat-button combat-control" data-tooltip="{{labels.scope}}"
data-control="toggleSceneLink" {{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-{{#unless linked}}un{{/unless}}link"></i>
</a>
<a class="combat-button combat-settings" data-tooltip="COMBAT.Settings" data-control="trackerSettings">
<i class="fas fa-cog"></i>
</a>
{{/if}}
</div>
</header>
<ol id="combat-tracker" class="directory-list">
{{#each turns}}
{{#if (checkInit this.initiative)}}
<li class="combatant actor directory-item flexrow {{this.css}}" data-combatant-id="{{this.id}}">
<img class="token-image" data-src="{{this.img}}" alt="{{this.name}}"/>
<div class="token-name flexcol">
<h4>{{this.name}} </h4>
<div class="combatant-controls flexrow">
{{#if ../user.isGM}}
<a class="combatant-control {{#if this.hidden}}active{{/if}}" data-tooltip="COMBAT.ToggleVis" data-control="toggleHidden">
<i class="fas fa-eye-slash"></i>
</a>
<a class="combatant-control {{#if this.defeated}}active{{/if}}" data-tooltip="COMBAT.ToggleDead" data-control="toggleDefeated">
<i class="fas fa-skull"></i>
</a>
{{/if}}
{{#if this.canPing}}
<a class="combatant-control" data-tooltip="COMBAT.PingCombatant" data-control="pingCombatant">
<i class="fa-solid fa-bullseye-arrow"></i>
</a>
{{/if}}
<div class="token-effects">
{{#each this.effects}}
<img class="token-effect" src="{{this}}"/>
{{/each}}
</div>
</div>
</div>
{{#if this.hasResource}}
<div class="token-resource">
<span class="resource">{{this.resource}}</span>
</div>
{{/if}}
<div class="token-initiative">
{{#if this.hasRolled}}
<span class="initiative">{{this.initiative}}</span>
{{else if this.owner}}
<a class="combatant-control roll" data-tooltip="COMBAT.InitiativeRoll" data-control="rollInitiative"></a>
{{/if}}
</div>
</li>
{{/if}}
{{/each}}
</ol>
<nav id="combat-controls" class="directory-footer flexrow" data-tooltip-direction="UP">
{{#if hasCombat}}
{{#if user.isGM}}
{{#if round}}
<a class="combat-control" data-tooltip="COMBAT.RoundPrev" data-control="previousRound"><i class="fas fa-step-backward"></i></a>
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
<a class="combat-control center" data-control="endCombat">{{localize 'COMBAT.End'}}</a>
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
<a class="combat-control" data-tooltip="COMBAT.RoundNext" data-control="nextRound"><i class="fas fa-step-forward"></i></a>
{{else}}
<a class="combat-control center" data-control="startCombat">{{localize 'COMBAT.Begin'}}</a>
{{/if}}
{{else if control}}
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
<a class="combat-control center" data-control="nextTurn">{{localize 'COMBAT.TurnEnd'}}</a>
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
{{/if}}
{{/if}}
</nav>
</section>

View File

@ -1,18 +1,42 @@
<form class="skill-roll-dialog"> <form class="skill-roll-dialog">
<header class="roll-dialog-header"> <header class="roll-dialog-header">
{{#if img}} <div class="flexrow">
<img class="actor-icon" src="{{img}}" data-edit="img" title="{{name}}" /> {{#if img}}
{{/if}} <img class="actor-icon" src="{{img}}" data-edit="img" title="{{name}}" />
<h1 class="dialog-roll-title roll-dialog-header">{{title}}</h1> {{/if}}
<h2 class="dialog-roll-title roll-dialog-header">{{title}}</h2>
</div>
</header> </header>
<div class="flexcol"> <div class="flexcol">
{{#if charac}} {{#if charac}}
<div class="flexrow"> <div class="flexrow">
<span class="item-field-label-long margin-item-list">Characteristic : </span> <span class="item-field-label-long margin-item-list">{{#if isPerception}}Perception{{else}}Characteristic{{/if}} : </span>
<span class="item-field-label-medium margin-item-list">{{charac.roll}}-</span> <span class="item-field-label-medium margin-item-list">{{charac.roll}}-</span>
</div> </div>
{{/if}}
{{#if (eq subMode "ocv")}}
<div class="flexrow">
<span class="item-field-label-long margin-item-list">OCV : </span>
<span class="item-field-label-medium margin-item-list">{{characteristics.ocv.value}}</span>
</div>
<div class="flexrow">
<span class="item-field-label-long margin-item-list">{{upperFirst item.type}} OCV : </span>
<span class="item-field-label-medium margin-item-list">{{fixNum item.system.ocv}}</span>
</div>
{{/if}}
{{#if (eq subMode "omcv")}}
<div class="flexrow">
<span class="item-field-label-long margin-item-list">OMCV : </span>
<span class="item-field-label-medium margin-item-list">{{characteristics.omcv.value}}</span>
</div>
<div class="flexrow">
<span class="item-field-label-long margin-item-list">{{upperFirst item.type}} OMCV : </span>
<span class="item-field-label-medium margin-item-list">{{fixNum item.system.omcv}}</span>
</div>
{{/if}} {{/if}}
{{#if item}} {{#if item}}

View File

@ -7,12 +7,6 @@
<hr> <hr>
{{#if img}}
<div >
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div>
{{/if}}
<div class="flexcol"> <div class="flexcol">
</div> </div>

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