diff --git a/ADnD_2E_Revised/2ESheet.html b/ADnD_2E_Revised/2ESheet.html index 03dd1a7357..31b328bd7c 100644 --- a/ADnD_2E_Revised/2ESheet.html +++ b/ADnD_2E_Revised/2ESheet.html @@ -5,18 +5,28 @@
Announcements -
+

Changes in

    -
  • Fixed autofill for simple magic weapons where the bonus is inserted in a spot without a whitespace. Here are some examples that have been fixed: +
  • Completely redesigned the new spell section, so each spell can be on a single line, showing Name, Range, and Area of Effect
      -
    • "Short bow, Flight Arrow" -> "Short bow +1, Flight Arrow"
    • -
    • "Bastard sword, One-handed" -> "Bastard sword +2, One-handed"
    • -
    • "Katana, One-handed (samurai long sword)" -> "Katana +1, One-handed (samurai long sword)"
    • -
    • "Sling, Bullet" -> "Sling +1, Bullet"
    • +
    • Single line spells can be folded out to show additional information of the spells
    • +
    • Removed the "Roll Spell Effect" button as it caused more confusion than it helped
  • +
  • Added Spell tracking selection to the Sheet Settings Tab. Choices are: Spell Slots, Spell Points, Arcs / Winds
  • +
  • Redesigned the Spells tab to only show the spell tracking system that selected on the Sheet Settings Tab
  • +
  • High Wisdom now triggers a popup asking if you are a priest. Bonus spells are only added if you are a priest
  • +
  • High Wisdom now autofill bonus Winds for Priests for the Arcs/Winds spell tracking system, based on the same popup as stated above. If the PO: S&P sub ability scores are used, base Wisdom is still used for determining bonus winds
  • +
  • Added support for automatic Spell Points for Wizards with high Intelligence. This is a toggle as the bonus is optional.
  • +
  • Added support for automatic Spell Points for Priests with high Wisdom. This is a toggle as only priests gets this bonus, and not Paladins and Rangers. The Priest caster level is used to determine how many spell points should be given
  • +
  • Fixed bonus spells from high Intuition from PO: Skills & Powers. Willpower was incorrectly used
  • +
  • Regeneration from high Constitution now clarifies that it is per turn(s)
  • +
  • Only show up and down arrows on numeric input fields in Firefox on hover or focus
  • +
  • Styled Monster tab to have dynamically sized fields, and larger fields for Hit Dice, HP, and Max HP
  • +
  • Updated saving throws to tell how much the check was made or missed by
  • +
  • 2Espell - Sensory signature and Knockdown switched places to make them appear in the same order as in the PO: Spells & Magic book

@@ -46,6 +56,11 @@

+ + + + +

Info  @@ -731,7 +746,7 @@ - + @@ -739,7 +754,7 @@ - + @@ -747,7 +762,7 @@ - + @@ -755,7 +770,7 @@ - + @@ -763,7 +778,7 @@ - + @@ -771,7 +786,7 @@ - + @@ -779,7 +794,7 @@ - + @@ -787,7 +802,7 @@ - + @@ -795,7 +810,7 @@ - + @@ -803,7 +818,7 @@ - + @@ -820,7 +835,7 @@ - + @@ -828,7 +843,7 @@ - + @@ -836,7 +851,7 @@ - + @@ -1143,7 +1158,7 @@ Notes - + @@ -1162,7 +1177,7 @@ Notes - + @@ -1180,7 +1195,7 @@ Notes - + % @@ -1200,7 +1215,7 @@ Notes - + @@ -1219,7 +1234,7 @@ Notes - + @@ -1236,7 +1251,7 @@ Notes - + @@ -1282,7 +1297,7 @@
- + @@ -1293,7 +1308,7 @@ - + @@ -1301,7 +1316,7 @@ - + @@ -1312,7 +1327,7 @@ - + @@ -1320,7 +1335,7 @@ - + @@ -1328,7 +1343,7 @@ - + @@ -1336,7 +1351,7 @@ - + @@ -1346,7 +1361,7 @@ - + @@ -1356,7 +1371,7 @@ - + @@ -1365,7 +1380,7 @@ - + @@ -1375,7 +1390,7 @@ - + @@ -1385,7 +1400,7 @@ - + @@ -1395,7 +1410,7 @@ - + @@ -1404,7 +1419,7 @@ - + @@ -1413,7 +1428,7 @@ - + @@ -1422,7 +1437,7 @@ - + @@ -1430,7 +1445,7 @@ - + @@ -1438,7 +1453,7 @@ - + @@ -3877,46 +3892,7 @@ Level 15

- Spell Points & Arc - Player's Option: Spells & Magic -
-
Hit
Probability
Damage
Adjustment
Notes
Reaction
Adjustment
Missile Attack
Adjustment
Notes
Hit Point
Adjustment
System
Shock
Notes
%
Number of
Languages
Maximum
Spell Level
Notes
Magical Def
Adjustment
Bonus
Priest Spells
Notes
Maximum Number
of Henchmen
Loyalty
Base
Notes
- - - - - - - - - - - - - - - - - - -
LevelSpecialistIntelligenceTotal|Remaining
Spell Points|
- -
- - - - - - - - - - - -
TotalRemaining
Arc
- -
-
- +
@@ -3924,7 +3900,50 @@
Wizard caster level
-
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
LevelSpecialistIntelligenceTotal|Remaining
Spell Points|
+
+ Bonus spell points from high Intelligence to Wizards + Under this optional rule, wizard characters gain a number of bonus spell points, based on their Intelligence score. Player's Options: Spells & Powers, p. 79 +
+
+ + + + + + + + + + + + + +
Total|Remaining
Arcs|
+
- - - - / - - - - - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -4183,140 +4273,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -4428,140 +4589,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -4673,140 +4905,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -4918,140 +5221,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -5163,141 +5537,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- - +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -5409,140 +5853,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -5654,140 +6169,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -5899,140 +6485,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -6144,140 +6801,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -6389,140 +7117,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -6634,140 +7433,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -6879,140 +7749,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -7124,140 +8065,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -7369,140 +8381,211 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -7626,45 +8709,7 @@ Level 7  Quest

- Spell Points & Wind - Player's Option: Spells & Magic -
- - - - - - - - - - - - - - - - - -
LevelWisdomTotal|Remaining
Spell Points|
- -
- - - - - - - - - - - - -
TotalRemaining
Wind
- -
-
- +
@@ -7672,7 +8717,73 @@
Priest caster level
-
+
+ +
+ Show Spheres of Influence: +
+ Major: + + +
+ Minor: + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + +
LevelWisdomTotal|Remaining
Spell Points|
+
+ Bonus spell points from high Wisdom to Priests + Priests with high Wisdom scores gain a special bonus spell points to reflect their piety and devotion. (This is a standard rule in this spell point system, unlike the optional bonus spell point rule for wizards with high Intelligence scores.) Player's Option: Spells & Powers, p. 92 +
+
+ + + + + + + + + + + + + + + + + +
LevelWisdomTotal|Remaining
Winds|
+
-

- Show Spheres of Influence: -
- Major: - - -
- Minor: - - -
-
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -7948,145 +9109,207 @@
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -8198,145 +9421,207 @@
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -8448,145 +9733,207 @@
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -8698,145 +10045,207 @@
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -8948,145 +10357,207 @@
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -9198,145 +10669,207 @@
- -
- -
-
+
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ +
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -9448,139 +10981,207 @@
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- +
+ + + + + + + + + + + + + + + +
LevelWisdomMisc.Total
Spell Slots
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
+
-

Spells Memorized and Spell Book

-

Spells Memorized

-
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
@@ -10032,11 +11633,11 @@ - + - + - + @@ -10081,11 +11682,11 @@ - + - + - + @@ -10133,11 +11734,11 @@ - + - + - + @@ -10182,11 +11783,11 @@ - + - + - + @@ -10234,11 +11835,11 @@ - + - + - + @@ -10283,11 +11884,11 @@ - + - + - + @@ -10335,11 +11936,11 @@ - + - + - + @@ -10384,11 +11985,11 @@ - + - + - + @@ -10436,11 +12037,11 @@ - + - + - + @@ -10485,11 +12086,11 @@ - + - + - + @@ -10537,11 +12138,11 @@ - + - + - + @@ -10586,11 +12187,11 @@ - + - + - + @@ -10638,11 +12239,11 @@ - + - + - + @@ -10687,11 +12288,11 @@ - + - + - + @@ -11299,7 +12900,7 @@
-
+
@@ -11747,14 +13348,14 @@ - + - + - +
Slot
Spell failure: %
@@ -12506,16 +14107,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -12711,16 +14312,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -12915,16 +14516,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -13273,16 +14874,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -13636,16 +15237,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -13994,16 +15595,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -14357,16 +15958,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -14808,16 +16409,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -15264,16 +16865,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -16571,16 +18172,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -17900,16 +19501,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -18476,16 +20077,16 @@
- - - - - - - - - - + + + + + + + + + + @@ -19001,134 +20602,144 @@
-
+
- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
Name:
Climate/Terrain:
Frequency:
Organization:
Activity Cycle:
Diet:
Intelligence:
Treasure:
Alignment:
- +
- + - + - + - - + + - + - + - + - - + + - - + +
No. Appearing:
Armor Class:
Movement:
Hit Dice: - ± - | - - + + + + + + + + + +
±|
Hit Points: - - / - + + + + + + +
/
THAC0:
# of Attacks:
Attack 1:
- +
- - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + +
Attack 2:
Attack 3:
Special Atk:
Special Def:
Magic Res:
Size:
Morale:
XP Value:
@@ -19193,95 +20804,167 @@ -
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+

@@ -19294,113 +20977,182 @@ -
-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
+ +
+
+ + + + + + + + + + + + + + + + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+

- - - - - - - - - - + + + + + + + + + + @@ -19432,7 +21184,7 @@

General

-

Select books to include autofil information from:

+

Select books to include autofill information from:

@@ -19607,6 +21359,24 @@
Book

+

Spell tracking system

+ AD&D 2E have different systems for tracking spells, three have been implemented: +
    +
  • Spell Slots: The default system described in the Player's Handbook
  • +
  • Spell Points: Introduced in Player's Option: Spells & Magic
  • +
  • Arcs, Songs, Winds: Introduced in Forgotten Realms, Netheril: Empire of Magic
  • +
+ + +
+
+

Miscellaneous modifier popup on rolls

+

By default all rolls creates a popup asking for a 'Miscellaneous modifier' to capture when the DM says: 'Make an X-roll with +2'. + If your DM rarely asks for this, if you find the popup annoying, or if you would rather add any bonuses after the roll is made, this popup can be turned off

-
+
@@ -29268,49 +31038,49 @@ Saving Throw
{{save}} {{#subtlety}} - {{#sensory}} + {{#knockdown}} Casting Subtlety
{{subtlety}} - Sensory Signature
{{sensory}} + Knockdown
{{knockdown}} - {{/sensory}} + {{/knockdown}} {{/subtlety}} {{#subtlety}} - {{^sensory}} + {{^knockdown}} Casting Subtlety
{{subtlety}} - {{/sensory}} + {{/knockdown}} {{/subtlety}} {{^subtlety}} - {{#sensory}} - - Sensory Signature
{{sensory}} - - {{/sensory}} - {{/subtlety}} {{#knockdown}} - {{#crit}} - - Knockdown
{{knockdown}} - Critical Strikes
{{crit}} - - {{/crit}} - {{/knockdown}} - {{#knockdown}} - {{^crit}} Knockdown
{{knockdown}} - {{/crit}} {{/knockdown}} - {{^knockdown}} + {{/subtlety}} + {{#sensory}} + {{#crit}} + + Sensory Signature
{{sensory}} + Critical Strikes
{{crit}} + + {{/crit}} + {{/sensory}} + {{#sensory}} + {{^crit}} + + Sensory Signature
{{sensory}} + + {{/crit}} + {{/sensory}} + {{^sensory}} {{#crit}} Critical Strikes
{{crit}} {{/crit}} - {{/knockdown}} + {{/sensory}} {{#damage}} Damage: @@ -31958,8 +33728,8 @@ constitutionTable['conadj'] = ['Error','-3','-2','-2','-1','-1','-1','0','0','0' constitutionTable['conshock'] = ['Error','25','30','35','40','45','50','55','60','65','70','75','80','85','88','90','95','97','99','99','99','99','99','99','99','100']; constitutionTable['conres'] = ['Error','30','35','40','45','50','55','60','65','70','75','80','85','90','92','94','96','98','100','100','100','100','100','100','100','100']; constitutionTable['conpoisonsave'] = ['Error','-2','-1','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','+1','+1','+2','+2','+3','+3','+4']; -constitutionTable['conregen'] = ['Error','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','1/6','1/5','1/4','1/3','1/2','1/1']; -constitutionTable['connotes'] = ['INVALID CONSTITUTION','','','','','','','','','','','','','','','','','','','','1 hp/6 turns - not acid/fire','1 hp/5 turns - not acid/fire','1 hp/4 turns - not acid/fire','1 hp/3 turns - not acid/fire','1 hp/2 turns - not acid/fire','1 hp/turn - not acid/fire']; +constitutionTable['conregen'] = ['Error','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','1/6 turns','1/5 turns','1/4 turns','1/3 turns','1/2 turns','1/1 turn']; +constitutionTable['connotes'] = ['INVALID CONSTITUTION','','','','','','','','','','','','','','','','','','','','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21']; constitutionTable['con2notes'] = ['INVALID CONSTITUTION','','','','','','','','','','','','','','','','','(+3) Warriors only','(+4) Warriors only','(+5) Warriors only','(+5) Warriors only','(+6) Warriors only','(+6) Warriors only','(+6) Warriors only','(+7) Warriors only','(+7) Warriors only']; const intelligenceTable = {}; @@ -31975,15 +33745,15 @@ intelligenceTable['intimm5th'] = ['Error','','','','','','','','','','','','','' intelligenceTable['intimm6th'] = ['Error','','','','','','','','','','','','','','','','','','','','','','','','6th-level','6th-level']; intelligenceTable['intimm7th'] = ['Error','','','','','','','','','','','','','','','','','','','','','','','','','7th-level']; intelligenceTable['intnotes'] = ['INVALID INTELLIGENCE','Communicate by Grunts & Gestures','','','','','','','','','','','','','','','','','','','','','','','','','']; +intelligenceTable['spell-points-int'] = [0,0,0,0,0,0,0,0,0,2,2,2,3,3,4,4,5,6,7,8,9,9,9,9,9,9]; const wisdomTable = {}; wisdomTable['wisdef'] = ['Error','-6','-4','-3','-2','-1','-1','-1','0','0','0','0','0','0','0','+1','+2','+3','+4','+4','+4','+4','+4','+4','+4','+4']; wisdomTable['wisbonus'] = ['Error','—','—','—','—','—','—','—','—','0','0','0','0','1st','1st','2nd','2nd','3rd','4th','1st,3rd','2nd,4th','3rd,5th','4th,5th','1st,6th','5th,6th','6th,7th']; -wisdomTable['wisbonus-prime'] = ['Error','','','','','','','','','','','','','1st','2x1st','2x1st, 2nd','2x1st, 2x2nd','2x1st, 2x2nd, 3rd','2x1st, 2x2nd, 3rd, 4th','3x1st, 2x2nd, 2x3rd, 4th','3x1st, 3x2nd, 2x3rd, 2x4th','3x1st, 3x2nd, 3x3rd, 2x4th','3x1st, 3x2nd, 3x3rd, 3x4th','4x1st, 3x2nd, 3x3rd, 3x4th','4x1st, 3x2nd, 3x3rd, 3x4th','4x1st, 3x2nd, 3x3rd, 3x4th']; -wisdomTable['wisbonus-extra'] = ['Error','','','','','','','','','','','','','','','','','','','','','5th','2x5th','2x5th, 6th','3x5th, 2x6th','3x5th, 3x6th, 7th']; wisdomTable['wisfail'] = ['Error','80','60','50','45','40','35','30','25','20','15','10','5','0','0','0','0','0','0','0','0','0','0','0','0','0']; wisdomTable['wisimmune'] = ['Error','','','','','','','','','','','','','','','','','','','cause fear, charm person, command, friends, hypnotism','forget, hold person, ray of enfeeblement, scare','fear','charm monster, confusion, emotion, fumble, suggestion','chaos, feeblemind, hold monster, magic jar, quest','geas, mass suggestion, rod of rulership','antipathy/sympathy, death spell, mass charm']; wisdomTable['wisnotes'] = ['INVALID WISDOM','','','','','','','','','','','','','','','','','','','','','','','','','','']; +wisdomTable['wisdom-wind'] = [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,11,12]; const charismaTable = {}; charismaTable['chamax'] = ['Error','0','1','1','1','2','2','3','3','4','4','4','5','5','6','7','8','10','15','20','25','30','35','40','45','50']; @@ -66800,45 +68570,42 @@ const capitalizeFirst = function (s) { } const displaySize = function(size) { - if (typeof size !== 'string') + if (typeof size !== 'string' || size.length === 0) return ''; - size = size.toLowerCase(); - switch (size) { - case 't': - case 'tiny': return 'Tiny'; - case 's': - case 'small': return 'Small'; - case 'm': - case 'medium': return 'Medium'; - case 'l': - case 'large': return 'Large'; - case 'h': - case 'huge': return 'Huge'; - case 'g': - case 'gargantuan': return 'Gargantuan'; + let sizeLetter = size.charAt(0).toLowerCase(); + switch (sizeLetter) { + case 't': return 'Tiny'; + case 's': return 'Small'; + case 'm': return 'Medium'; + case 'l': return 'Large'; + case 'h': return 'Huge'; + case 'g': return 'Gargantuan'; default: return capitalizeFirst(size); } } const sizeToInt = function(size) { - size = displaySize(size); - switch (size) { - case 'Tiny': return 0; - case 'Small': return 1; - case 'Medium': return 2; - case 'Large': return 3; - case 'Huge': return 4; - case 'Gargantuan': return 5; + if (typeof size !== 'string' || size.length === 0) + return ''; + + let sizeLetter = size.charAt(0).toLowerCase(); + switch (sizeLetter) { + case 't': return 0; + case 's': return 1; + case 'm': return 2; + case 'l': return 3; + case 'h': return 4; + case 'g': return 5; } } const displayWeaponType = function (type) { - if (typeof type !== 'string') + if (typeof type !== 'string' || type.length === 0) return ''; - type = type.toLowerCase(); - switch (type) { + let typeLetter = type.toLowerCase(); + switch (typeLetter) { case 's': return 'Slashing'; case 'p': return 'Piercing'; case 'b': return 'Bludgeoning'; @@ -67163,7 +68930,7 @@ on('clicked:hide-toast', function(eventInfo) { //#region Ability Scores logic // Ability Score Parser function -const EXCEPTIONAL_STRENGHT_REGEX = /18[\[(]([0-9]{1,3})[\])]/; // Ie. 18[65], 18(65) +const EXCEPTIONAL_STRENGTH_REGEX = /18[\[(]([0-9]{1,3})[\])]/; // Ie. 18[65], 18(65) function getLookupValue(abilityScoreString, defaultValue, isStrength = false) { if (abilityScoreString === '') { return defaultValue; @@ -67175,7 +68942,7 @@ function getLookupValue(abilityScoreString, defaultValue, isStrength = false) { } if (isStrength) { - let exceptionalMatch = abilityScoreString.match(EXCEPTIONAL_STRENGHT_REGEX); + let exceptionalMatch = abilityScoreString.match(EXCEPTIONAL_STRENGTH_REGEX); if (exceptionalMatch !== null) { let exceptionalStrNumber = parseInt(exceptionalMatch[1]); if (1 <= exceptionalStrNumber && exceptionalStrNumber <= 50) { @@ -67400,20 +69167,28 @@ on('change:intelligence change:reason change:knowledge', function() { }); // Set sub-attributes based on Wisdom, Intuition, and Willpower -function parseWisBonus(abilityScore) { - if (abilityScore < 13) { - return { - '1st': 0, - '2nd': 0, - '3rd': 0, - '4th': 0, - '5th': 0, - '6th': 0, - '7th': 0, - 'wisbonus': wisdomTable['wisbonus'][abilityScore], - 'wisbonus-prime': wisdomTable['wisbonus'][abilityScore], - 'wisbonus-extra': wisdomTable['wisbonus'][abilityScore], - }; +async function parseWisBonus(abilityScore, wisdom) { + let bonus = { + '1st': 0, + '2nd': 0, + '3rd': 0, + '4th': 0, + '5th': 0, + '6th': 0, + '7th': 0, + 'wind': 0, + 'wisbonus': '—', + 'wisbonus-prime': '—', + 'wisbonus-extra': '—', + }; + if (abilityScore < 13 && wisdom < 13) { + await keepContextRoll(); + return bonus; + } + + let answer = await extractQueryResult('?{Priests get bonus spells from high Wisdom (but not Paladins and Rangers). Do you play a priest?|My character is a priest,true|My character is a different class,false}'); + if (answer !== 'true') { + return bonus; } // Combine all spell levels into one string @@ -67423,7 +69198,7 @@ function parseWisBonus(abilityScore) { } // Count instances of each spell level - let bonus = { + bonus = { '1st': (bonusString.match(/1st/g) || []).length, '2nd': (bonusString.match(/2nd/g) || []).length, '3rd': (bonusString.match(/3rd/g) || []).length, @@ -67431,18 +69206,28 @@ function parseWisBonus(abilityScore) { '5th': (bonusString.match(/5th/g) || []).length, '6th': (bonusString.match(/6th/g) || []).length, '7th': (bonusString.match(/7th/g) || []).length, + 'wind': wisdomTable['wisdom-wind'][wisdom], }; // Generate bonus prime and bonus extra strings - bonus['wisbonus-prime'] = wisdomTable['wisbonus-prime'][abilityScore]; - bonus['wisbonus-extra'] = wisdomTable['wisbonus-extra'][abilityScore]; + function format(bonus, key) { + if (bonus[key] === 0) { + return ''; + } + if (bonus[key] === 1) { + return key + } + return `${bonus[key]}x${key}`; + } + bonus['wisbonus-prime'] = [format(bonus, '1st'), format(bonus, '2nd'), format(bonus, '3rd'), format(bonus, '4th')].filter(Boolean).join(', '); + bonus['wisbonus-extra'] = [format(bonus, '5th'), format(bonus, '6th'), format(bonus, '7th')].filter(Boolean).join(', '); bonus['wisbonus'] = [bonus['wisbonus-prime'], bonus['wisbonus-extra']].filter(Boolean).join(', '); return bonus; } on('change:wisdom change:intuition change:willpower', function() { - getAttrs(['wisdom','intuition','willpower'], function(values) { + getAttrs(['wisdom','intuition','willpower'], async function (values) { let wisdomRaw = values.wisdom.replace(/\s+/g, ''); let intuitionRaw = values.intuition.replace(/\s+/g, ''); let willpowerRaw = values.willpower.replace(/\s+/g, ''); @@ -67454,7 +69239,7 @@ on('change:wisdom change:intuition change:willpower', function() { let bonusSpells; if (wisdom === 0) { - bonusSpells = parseWisBonus(0); + bonusSpells = await parseWisBonus(0, 0); assignAttributes(0, 0, 0, bonusSpells, wisdomTable['wisimmune'][0], wisdomTable['wisimmune'][0], wisdomTable['wisnotes'][0], wisdomTable['wisnotes'][0]); return; } @@ -67482,34 +69267,35 @@ on('change:wisdom change:intuition change:willpower', function() { for (let i = willpower; i > 18; i--) { wisImmuneArray.push(wisdomTable['wisimmune'][i]); } - let slicePoint = Math.round(wisImmuneArray.length/2); + let slicePoint = Math.round(wisImmuneArray.length / 2); wisimm1 = wisImmuneArray.slice(0, slicePoint).filter(Boolean).join(', '); wisimm2 = wisImmuneArray.slice(slicePoint).filter(Boolean).join(', '); } - bonusSpells = parseWisBonus(willpower); + bonusSpells = await parseWisBonus(intuition, wisdom); assignAttributes(wisdom, intuition, willpower, bonusSpells, wisimm1, wisimm2, wisnotes, wis2notes); function assignAttributes(wisdom, intuition, willpower, bonusSpells, wisimm1, wisimm2, wisnotes, wis2notes) { - setAttrs({ - wisdef: wisdomTable['wisdef'][willpower], - wisbonus: bonusSpells['wisbonus'], - 'wisbonus-prime': bonusSpells['wisbonus-prime'], - 'wisbonus-extra': bonusSpells['wisbonus-extra'], - wisfail: wisdomTable['wisfail'][intuition], - wisimm: wisimm1, - wisimm1: wisimm1, - wisimm2: wisimm2, - wisnotes: wisnotes, - wis2notes: wis2notes, - 'spell-priest-level1-wisdom': bonusSpells['1st'], - 'spell-priest-level2-wisdom': bonusSpells['2nd'], - 'spell-priest-level3-wisdom': bonusSpells['3rd'], - 'spell-priest-level4-wisdom': bonusSpells['4th'], - 'spell-priest-level5-wisdom': bonusSpells['5th'], - 'spell-priest-level6-wisdom': bonusSpells['6th'], - 'spell-priest-level7-wisdom': bonusSpells['7th'], - }); + let newValue = {}; + newValue['wisdef'] = wisdomTable['wisdef'][willpower]; + newValue['wisbonus'] = bonusSpells['wisbonus']; + newValue['wisbonus-prime'] = bonusSpells['wisbonus-prime']; + newValue['wisbonus-extra'] = bonusSpells['wisbonus-extra']; + newValue['wisfail'] = wisdomTable['wisfail'][intuition]; + newValue['wisimm'] = wisimm1; + newValue['wisimm1'] = wisimm1; + newValue['wisimm2'] = wisimm2; + newValue['wisnotes'] = wisnotes; + newValue['wis2notes'] = wis2notes; + newValue['spell-priest-level1-wisdom'] = bonusSpells['1st']; + newValue['spell-priest-level2-wisdom'] = bonusSpells['2nd']; + newValue['spell-priest-level3-wisdom'] = bonusSpells['3rd']; + newValue['spell-priest-level4-wisdom'] = bonusSpells['4th']; + newValue['spell-priest-level5-wisdom'] = bonusSpells['5th']; + newValue['spell-priest-level6-wisdom'] = bonusSpells['6th']; + newValue['spell-priest-level7-wisdom'] = bonusSpells['7th']; + newValue['wisdom-wind'] = bonusSpells['wind']; + setAttrs(newValue); } }); }); @@ -67667,10 +69453,10 @@ function setupRepeatingSpellSumming(sections, oldField, newField, resultFieldNam } function setupCalculateRemaining(totalField, sumField, remainingField) { - on(`change:${totalField} change:${sumField}`, function () { + on(`change:${totalField} change:${sumField}`, function (eventInfo) { getAttrs([totalField, sumField], function (values) { - let intTotal = parseInt(values[totalField]); - let intSum = parseInt(values[sumField]); + let intTotal = parseInt(values[totalField]) || 0; + let intSum = parseInt(values[sumField]) || 0; console.log(`Setting ${remainingField} with value from ${totalField}: ${intTotal} and ${sumField}: ${intSum}`); @@ -67692,9 +69478,9 @@ const PRIEST_SPHERES = [ 'Chaos','Law','Numbers','Thought','Time','Travelers','War','Wards' ]; -const primarySphereRegex = new RegExp(PRIEST_SPHERES.join('|'), 'gi'); -const noElementalRegex = new RegExp(PRIEST_SPHERES.filter(s => s !== ELEMENTAL).join('|'), 'gi'); -const elementalRegex = /Earth|Air|Fire|Water/gi +const PRIMARY_SPHERE_REGEX = new RegExp(PRIEST_SPHERES.join('|'), 'gi'); +const NO_ELEMENTAL_REGEX = new RegExp(PRIEST_SPHERES.filter(s => s !== ELEMENTAL).join('|'), 'gi'); +const ELEMENTAL_REGEX = /Earth|Air|Fire|Water/gi function parseSpheres(spheresStrings, regex) { let spheres = new Set(); @@ -67728,7 +69514,7 @@ function isSpellAvailable(spellName, spell, availableSpheres, elementalSpheres, let spheres = getSpellSpheres(spell, optionalSpheres); - let primarySpellSpheres = spheres.match(noElementalRegex) || []; + let primarySpellSpheres = spheres.match(NO_ELEMENTAL_REGEX) || []; let isAvailable = primarySpellSpheres.some(sphere => availableSpheres.has(sphere)); if (isAvailable) return true; @@ -67740,7 +69526,7 @@ function isSpellAvailable(spellName, spell, availableSpheres, elementalSpheres, return false; if (spheres.includes(`${ELEMENTAL} (`)) - return spheres.match(elementalRegex).some((element) => elementalSpheres.has(element)) + return spheres.match(ELEMENTAL_REGEX).some((element) => elementalSpheres.has(element)) // The player and the spell has the elemental sphere (without any sub elements) // Currently only 'Commune With Nature' in the revised Player's Handbook (1995) has this property @@ -67765,8 +69551,8 @@ function setupAddPriestSpell(postfix) { knownSpells.add(row.S[field]); return knownSpells; }, new Set(), function (knownSpells,_,attrSet){ - let primarySpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), primarySphereRegex); - let elementalSpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), elementalRegex); + let primarySpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), PRIMARY_SPHERE_REGEX); + let elementalSpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), ELEMENTAL_REGEX); if (primarySpheres.size < 1) { showToast(WARNING, 'No spheres found', `No valid spheres found. Please write or select some spheres`); @@ -67897,7 +69683,7 @@ function setupSpellSlotsReset(buttonName, tab, spellLevels, allSections) { //#endregion //#region Wizard and Priest spells and Powers setup -function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFields) { +function setupAutoFillSpellInfo(section, spellsTable, optionalRulesFields) { if (!spellsTable[section]) return; @@ -67916,7 +69702,7 @@ function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFi let spellInfo = { [`repeating_spells-${section}_spell-cast-time`] : spell['cast-time'], - [`repeating_spells-${section}_spell-level`] : levelFunc(spell['level'], className), + [`repeating_spells-${section}_spell-level`] : displaySpellLevel(spell['level'], className), [`repeating_spells-${section}_spell-school`] : getSpellSchools(spell, books), [`repeating_spells-${section}_spell-components`] : spell['components'], [`repeating_spells-${section}_spell-range`] : spell['range'], @@ -67941,8 +69727,7 @@ function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFi spellInfo[`repeating_spells-${section}_spell-sphere`] = getSpellSpheres(spell, sphereRules); } if (!books[levelField].trim()) { - let classLevel = capitalizeFirst(levelField.replace('level-', '')); - let toast = getToastObject(INFO, `Set ${classLevel} caster level`, 'Almost every spell requires a caster level to calculate its effect. Without it most spells will fail and show and error in the chat'); + let toast = getToastObject(INFO, `Set ${className} caster level`, 'Almost every spell requires a caster level to calculate its effect. Without it most spells will fail and show and error in the chat'); Object.assign(spellInfo, toast); } @@ -67951,8 +69736,7 @@ function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFi }); } - -let wizardSpellLevelsSections = [ +const WIZARD_SPELL_LEVELS_SECTIONS = [ {level: '1', sections: ['', '2', '3', 'wiz1']}, {level: '2', sections: ['4', '5', '6', 'wiz2']}, {level: '3', sections: ['7', '8', '9', 'wiz3']}, @@ -67970,7 +69754,7 @@ let wizardSpellLevelsSections = [ {level: '15', sections: ['64', '65', '66', 'wiz15']}, ]; -let priestSpellLevelsSections = [ +const PRIEST_SPELL_LEVELS_SECTIONS = [ {level: '1', sections: ['28', '29', '30', 'pri1']}, {level: '2', sections: ['31', '32', '33', 'pri2']}, {level: '3', sections: ['34', '35', '36', 'pri3']}, @@ -67988,7 +69772,7 @@ const displaySpellLevel = function(level, className) { } // --- Start setup Spell Slots --- // -wizardSpellLevelsSections.forEach(spellLevel => { +WIZARD_SPELL_LEVELS_SECTIONS.forEach(spellLevel => { let prefix = `spell-level${spellLevel.level}`; setupStaticCalculateTotal(`${prefix}-total`, [`${prefix}-castable`, `${prefix}-specialist`, `${prefix}-misc`]); setupRepeatingSpellSumming(spellLevel.sections, 'cast-value', 'spell-cast-value', `${prefix}-cast-value-sum`); @@ -67999,14 +69783,14 @@ wizardSpellLevelsSections.forEach(spellLevel => { // Auto set spell info function let lastSection = spellLevel.sections[spellLevel.sections.length - 1]; if (isNewSpellSection(lastSection)) { - setupAutoFillSpellInfo(lastSection, wizardSpells, displaySpellLevel, SCHOOL_FIELDS); + setupAutoFillSpellInfo(lastSection, wizardSpells, SCHOOL_FIELDS); setupSpellCrit(lastSection); } }); -setupAutoFillSpellInfo('wizmonster', wizardSpells, displaySpellLevel, SCHOOL_FIELDS); +setupAutoFillSpellInfo('wizmonster', wizardSpells, SCHOOL_FIELDS); setupSpellCrit('wizmonster'); -priestSpellLevelsSections.forEach(spellLevel => { +PRIEST_SPELL_LEVELS_SECTIONS.forEach(spellLevel => { let prefix = `spell-priest-level${spellLevel.level}`; setupStaticCalculateTotal(`${prefix}-total`, [`${prefix}-castable`, `${prefix}-wisdom`, `${prefix}-misc`]); setupRepeatingSpellSumming(spellLevel.sections, 'cast-value', 'spell-cast-value', `${prefix}-cast-value-sum`); @@ -68017,43 +69801,125 @@ priestSpellLevelsSections.forEach(spellLevel => { // Auto set spell info function let lastSection = spellLevel.sections[spellLevel.sections.length - 1]; if (isNewSpellSection(lastSection)) { - setupAutoFillSpellInfo(lastSection, priestSpells, displaySpellLevel, SPHERE_FIELDS); + setupAutoFillSpellInfo(lastSection, priestSpells, SPHERE_FIELDS); setupSpellCrit(lastSection); if (lastSection !== 'priq') { setupAddPriestSpell(lastSection); } } }); -setupAutoFillSpellInfo('primonster', priestSpells, displaySpellLevel, SPHERE_FIELDS); +setupAutoFillSpellInfo('primonster', priestSpells, SPHERE_FIELDS); setupSpellCrit('primonster'); // --- End setup Spell Slots --- // // --- Start setup Spell Points, Arc, and Wind --- // -let wizardSpellPoints = 'spell-points'; -let arc = 'total-arc'; -let allWizardSpellSections = wizardSpellLevelsSections.flatMap(sl => sl.sections); -setupStaticCalculateTotal(`${wizardSpellPoints}-total`, [`${wizardSpellPoints}-lvl`, `${wizardSpellPoints}-spc`, `${wizardSpellPoints}-int`]); -setupRepeatingSpellSumming(allWizardSpellSections, wizardSpellPoints, 'spell-points', `${wizardSpellPoints}-sum`, true); -setupRepeatingSpellSumming(allWizardSpellSections, 'arc', 'spell-arc', `${arc}-sum`, true); -setupCalculateRemaining(`${wizardSpellPoints}-total`, `${wizardSpellPoints}-sum`, `${wizardSpellPoints}-remaining`); -setupCalculateRemaining(arc, `${arc}-sum`, `${arc}-remaining`); +const WIZARD_SPELL_POINTS = 'spell-points'; +const TOTAL_ARC = 'total-arc'; +const ALL_WIZARD_SPELL_SECTIONS = WIZARD_SPELL_LEVELS_SECTIONS.flatMap(sl => sl.sections); +setupStaticCalculateTotal(`${WIZARD_SPELL_POINTS}-total`, [`${WIZARD_SPELL_POINTS}-lvl`, `${WIZARD_SPELL_POINTS}-spc`, `${WIZARD_SPELL_POINTS}-int`]); +setupRepeatingSpellSumming(ALL_WIZARD_SPELL_SECTIONS, WIZARD_SPELL_POINTS, 'spell-points', `${WIZARD_SPELL_POINTS}-sum`, true); +setupRepeatingSpellSumming(ALL_WIZARD_SPELL_SECTIONS, 'arc', 'spell-arc', `${TOTAL_ARC}-sum`, true); +setupCalculateRemaining(`${WIZARD_SPELL_POINTS}-total`, `${WIZARD_SPELL_POINTS}-sum`, `${WIZARD_SPELL_POINTS}-remaining`); +setupCalculateRemaining(TOTAL_ARC, `${TOTAL_ARC}-sum`, `${TOTAL_ARC}-remaining`); +on('change:spell-points-int-enabled change:intelligence', function (eventInfo) { + getAttrs(['spell-points-int-enabled', 'intelligence'], function (values) { + let newValue = {'spell-points-int': 0} + if (values['spell-points-int-enabled'] !== '1') { + return setAttrs(newValue); + } + let intelligence = getLookupValue(values['intelligence'], 0); + newValue['spell-points-int'] = intelligenceTable['spell-points-int'][intelligence]; + setAttrs(newValue); + }); +}); -let priestSpellPoints = 'spell-points-priest'; -let wind = 'total-wind'; -let allPriestSpellSections = priestSpellLevelsSections.flatMap(sl => sl.sections); -setupStaticCalculateTotal(`${priestSpellPoints}-total`, [`${priestSpellPoints}-lvl`, `${priestSpellPoints}-wis`]); -setupRepeatingSpellSumming(allPriestSpellSections, priestSpellPoints, 'spell-points', `${priestSpellPoints}-sum`, true); -setupRepeatingSpellSumming(allPriestSpellSections, 'wind', 'spell-wind', `${wind}-sum`, true); -setupCalculateRemaining(`${priestSpellPoints}-total`, `${priestSpellPoints}-sum`, `${priestSpellPoints}-remaining`); -setupCalculateRemaining(wind, `${wind}-sum`, `${wind}-remaining`); +const PRIEST_SPELL_POINTS = 'spell-points-priest'; +const TOTAL_WIND = 'total-wind'; +const ALL_PRIEST_SPELL_SECTIONS = PRIEST_SPELL_LEVELS_SECTIONS.flatMap(sl => sl.sections); +setupStaticCalculateTotal(`${PRIEST_SPELL_POINTS}-total`, [`${PRIEST_SPELL_POINTS}-lvl`, `${PRIEST_SPELL_POINTS}-wis`]); +setupStaticCalculateTotal(TOTAL_WIND, ['level-wind', 'wisdom-wind']); +setupRepeatingSpellSumming(ALL_PRIEST_SPELL_SECTIONS, PRIEST_SPELL_POINTS, 'spell-points', `${PRIEST_SPELL_POINTS}-sum`, true); +setupRepeatingSpellSumming(ALL_PRIEST_SPELL_SECTIONS, 'wind', 'spell-wind', `${TOTAL_WIND}-sum`, true); +setupCalculateRemaining(`${PRIEST_SPELL_POINTS}-total`, `${PRIEST_SPELL_POINTS}-sum`, `${PRIEST_SPELL_POINTS}-remaining`); +setupCalculateRemaining(TOTAL_WIND, `${TOTAL_WIND}-sum`, `${TOTAL_WIND}-remaining`); +let PRIEST_SPELL_POINTS_WIS = 'spell-points-priest-wis'; +on('change:spell-points-priest-wis-enabled change:wisdom change:level-priest', function (eventInfo) { + getAttrs(['spell-points-priest-wis-enabled', 'wisdom', 'level-priest'], async function (values) { + await keepContextRoll(); + let newValue = {}; + newValue[PRIEST_SPELL_POINTS_WIS] = 0; + if (values['spell-points-priest-wis-enabled'] !== '1') { + return setAttrs(newValue); + } + let wisdom = getLookupValue(values['wisdom'], 0); + if (wisdom < 13) { + return setAttrs(newValue); + } + if (wisdom === 13) { + newValue[PRIEST_SPELL_POINTS_WIS] = 4; + return setAttrs(newValue); + } + if (wisdom === 14) { + newValue[PRIEST_SPELL_POINTS_WIS] = 8; + return setAttrs(newValue); + } + + let level = 1; + if (values['level-priest'] === '') { + return showToast(INFO, 'Set Priest caster level', 'The Priest\'s level is needed to calculate bonus Spell Points from high Wisdom.'); + } else { + level = await extractRollResult(values['level-priest']); + } + if (isNaN(level) || level < 0) { + level = 1; + } + let spellPoints = 0; + if (wisdom === 15) { + spellPoints = level < 3 ? 8 : 15; + } else if (wisdom === 16) { + spellPoints = level < 3 ? 8 : 20; + } else if (wisdom === 17) { + if (1 <= level && level <= 2) { + spellPoints = 8; + } else if (3 <= level && level <= 4) { + spellPoints = 20; + } else { + spellPoints = 30; + } + } else if (wisdom === 18) { + if (1 <= level && level <= 2) { + spellPoints = 8; + } else if (3 <= level && level <= 4) { + spellPoints = 20; + } else if (5 <= level && level <= 6) { + spellPoints = 30; + } else { + spellPoints = 45; + } + } else if (wisdom >= 19) { + if (1 <= level && level <= 2) { + spellPoints = 12; + } else if (3 <= level && level <= 4) { + spellPoints = 25; + } else if (5 <= level && level <= 6) { + spellPoints = 45; + } else { + spellPoints = 60; + } + } + + newValue[PRIEST_SPELL_POINTS_WIS] = spellPoints; + setAttrs(newValue); + }); +}); // --- End setup Spell Points, Arc, and Wind --- // // --- Start setup reset buttons --- // //tab6 = wizard levels //tab7 = priest levels -setupSpellSlotsReset('reset-spent-slots-wiz', 'tab6', wizardSpellLevelsSections, allWizardSpellSections); -let allPriestSectionsExceptQuest = priestSpellLevelsSections.slice(0, -1).flatMap(sl => sl.sections); -setupSpellSlotsReset('reset-spent-slots-pri', 'tab7', priestSpellLevelsSections, allPriestSectionsExceptQuest); +setupSpellSlotsReset('reset-spent-slots-wiz', 'tab6', WIZARD_SPELL_LEVELS_SECTIONS, ALL_WIZARD_SPELL_SECTIONS); +let allPriestSectionsExceptQuest = PRIEST_SPELL_LEVELS_SECTIONS.slice(0, -1).flatMap(sl => sl.sections); +setupSpellSlotsReset('reset-spent-slots-pri', 'tab7', PRIEST_SPELL_LEVELS_SECTIONS, allPriestSectionsExceptQuest); // --- End setup reset buttons --- // // --- Start setup Granted Powers --- // @@ -68119,19 +69985,14 @@ on('change:repeating_customrogue:crl remove:repeating_customrogue', function(){ //#endregion //#region Weapons tab logic and autofil -//Used in version.js -const updateNonprofPenalty = function () { - getAttrs(['nonprof-penalty'], function(values) { - let nonprof = Math.abs(parseInt(values['nonprof-penalty'])) * -1; - let famil = Math.floor(nonprof / 2) - setAttrs({ - ['nonprof-penalty']: nonprof, - ['famil-penalty']: famil - },{silent:true}); - }); -} on('change:nonprof-penalty', function (eventInfo){ - updateNonprofPenalty(); + let nonprofRaw = parseInt(eventInfo.newValue) || 0; + let nonprof = Math.abs(nonprofRaw) * -1; + let famil = Math.floor(nonprof / 2) + setAttrs({ + ['nonprof-penalty']: nonprof, + ['famil-penalty']: famil + },{silent:true}); }); on('change:thac0-base-calc', function(eventInfo) { @@ -68162,7 +70023,7 @@ async function selectVersion(foundObjects, values, comparer, objectName) { return; } - let isPlayersOption = values[PLAYERS_OPTION_FIELD] === '2'; + let isPlayersOption = values[WEAPONS_PLAYERS_OPTION_FIELD] === '2'; let isAllEqual = activeObjects.every(o => comparer(o, activeObjects[0], isPlayersOption)); if (isAllEqual) { await keepContextRoll(); @@ -68202,13 +70063,13 @@ function combineBooks(activeObjects, comparer, isPlayersOptions) { } //#region Weapons autofill -const PLAYERS_OPTION_FIELD = 'tab81'; +const WEAPONS_PLAYERS_OPTION_FIELD = 'tab81'; function setWeaponWithBonus(weaponName, setWeaponFunc, comparer, thac0Field, category) { if (!weaponName) return; weaponName = weaponName.toLowerCase(); - let fields = [...BOOK_FIELDS, PLAYERS_OPTION_FIELD, thac0Field].filter(Boolean); + let fields = [...BOOK_FIELDS, WEAPONS_PLAYERS_OPTION_FIELD, thac0Field].filter(Boolean); getAttrs(fields, async function (values) { let bonus = 0; let baseWeapons = WEAPONS_TABLE[weaponName] @@ -68286,13 +70147,13 @@ on('change:repeating_weapons:weaponname', function(eventInfo) { //melee damage autofill on('change:repeating_weapons-damage:weaponname1', function(eventInfo) { let comparer = function (weapon1, weapon2, isPlayersOption) { - let fisk = ['small-medium','large']; + let compareFields = ['small-medium','large']; if (isPlayersOption) { - fisk.push('size'); - fisk.push('type'); - fisk.push('knockdown'); + compareFields.push('size'); + compareFields.push('type'); + compareFields.push('knockdown'); } - return fisk.every(f => weapon1[f] === weapon2[f]) + return compareFields.every(f => weapon1[f] === weapon2[f]) } let rowId = parseSourceAttribute(eventInfo).rowId; let setWeaponFunc = function (weapon) { @@ -68396,7 +70257,7 @@ function setupFollowerWeaponsAutoFill(repeating, sections) { }); } -const followerWeapons = [ +const FOLLOWER_WEAPONS = [ {repeating: '', sections: ['', '001', '002']}, {repeating: 'hench', sections: ['003', '004', '005']}, {repeating: '', sections: ['006', '007', '008']}, @@ -68411,7 +70272,7 @@ const followerWeapons = [ {repeating: 'hench6', sections: ['033', '034', '035']}, ]; -followerWeapons.forEach(fw => { +FOLLOWER_WEAPONS.forEach(fw => { setupFollowerWeaponsAutoFill(fw.repeating, fw.sections); }); @@ -69040,11 +70901,10 @@ function weaponPoCritTemplate(prefix, fields, nameFunc, baseDamageFunc, damageAd //#region Proficiencies //Weapon proficiency slots -const updateWeaponProfsRemaining = () => repeatingCalculateRemaining('weaponprofs', ['weapprofnum'], 'weapprof-slots-total-calc', 'weapprof-slots-remain'); on('change:repeating_weaponprofs:weapprofnum remove:repeating_weaponprofs change:weapprof-slots-total-calc', function(eventInfo) { if (doEarlyReturn(eventInfo, ['weapprofnum'])) return; - updateWeaponProfsRemaining(); + repeatingCalculateRemaining('weaponprofs', ['weapprofnum'], 'weapprof-slots-total-calc', 'weapprof-slots-remain'); }); //Weapon proficiency autofill on('change:repeating_weaponprofs:weapprofname', function(eventInfo) { @@ -69371,12 +71231,14 @@ const setPsionicDisciplineVisibility = function(newValue) { elements.removeClass('sheet-show'); } } -on('change:tab8 sheet:opened', function (eventInfo) { + +const PSIONIC_SKILLS_AND_POWERS_FIELD = 'tab8'; +on(`change:${PSIONIC_SKILLS_AND_POWERS_FIELD} sheet:opened`, function (eventInfo) { if (eventInfo.newValue) return setPsionicDisciplineVisibility(eventInfo.newValue); - getAttrs(['tab8'], function (values) { - setPsionicDisciplineVisibility(values['tab8']); + getAttrs([PSIONIC_SKILLS_AND_POWERS_FIELD], function (values) { + setPsionicDisciplineVisibility(values[PSIONIC_SKILLS_AND_POWERS_FIELD]); }) }); @@ -69614,14 +71476,18 @@ PSIONIC_CORE_SECTIONS.forEach(({section, name, macro, number, cost_number, disci //#endregion // Show / Hide buttons for various repeating sections -const REPEATING_SECTIONS = [ +const FOLDABLE_REPEATING_SECTIONS = [ + ...WIZARD_SPELL_LEVELS_SECTIONS.map(e => e.sections[e.sections.length-1]).map(e => `spells-${e}`), + 'spells-wizmonster', + ...PRIEST_SPELL_LEVELS_SECTIONS.map(e => e.sections[e.sections.length-1]).map(e => `spells-${e}`), + 'spells-primonster', ...PSIONIC_CORE_SECTIONS.map(e => e.section), 'scrolls', ]; -REPEATING_SECTIONS.forEach(section => { +FOLDABLE_REPEATING_SECTIONS.forEach(section => { on(`clicked:repeating_${section}:show clicked:repeating_${section}:hide`, function (eventInfo) { let parse = parseSourceAttribute(eventInfo); - $20(`div[data-reprowid=${parse.rowId}] .sheet-hidden`).toggleClass('sheet-show'); + $20(`div[data-reprowid=${parse.rowId}] .sheet-hidden.sheet-fold`).toggleClass('sheet-show'); }); }); @@ -69649,7 +71515,7 @@ on(BOOK_FIELDS.map(b => `change:${b}`).join(' '), function (eventInfo) { // --- Version change start --- // const SHEET_NAME = 'AD&D 2E Revised'; -const SHEET_VERSION = '4.14.2'; +const SHEET_VERSION = '4.15.0'; on('sheet:opened', function(){ getAttrs(['character_sheet'],function(attrs){ @@ -69676,9 +71542,6 @@ on('sheet:opened', function(){ if (oldSheetVersion.isBelowMigrate(3, 3, 2)) migrate3_3_2(); - if (oldSheetVersion.isBelowMigrate(3, 4, 0)) - migrate3_4_0(); - if (oldSheetVersion.isBelowMigrate(4, 3, 0)) migrate4_3_0(); } @@ -69835,13 +71698,6 @@ function migrateOtherValuables() { } //#endregion -//#region version 3.4.0 -function migrate3_4_0() { - console.log('Migrating to v3.4.0'); - updateNonprofPenalty(); -} -//#endregion - //#region version 3.3.2 function migrate3_3_2() { console.log('Migrating to v3.3.2'); diff --git a/ADnD_2E_Revised/2EStyle.css b/ADnD_2E_Revised/2EStyle.css index a1ad9b7db1..0b305e9f23 100644 --- a/ADnD_2E_Revised/2EStyle.css +++ b/ADnD_2E_Revised/2EStyle.css @@ -1,10 +1,3 @@ -input, -button, -select, -textarea { - background-color: white; -} - .charsheet input { display: inline-block; width: 165px; @@ -52,12 +45,10 @@ textarea { .charsheet input.sheet-madtext { width: 79px; } -.charsheet select.sheet-spell-select, .charsheet select.sheet-attr, .charsheet input.sheet-attr { width: 80px; } -.charsheet select.sheet-spell-select-min, .charsheet select.sheet-attr-min, .charsheet input.sheet-attr-min { min-width: 80px; @@ -155,10 +146,6 @@ textarea { .charsheet input.sheet-nonweaponprof { width: 260px; } -.charsheet select.sheet-spell-big, -.charsheet input.sheet-spell-big { - width: 295px; -} .charsheet select.sheet-long, .charsheet input.sheet-long { width: 400px; @@ -201,10 +188,24 @@ textarea { box-sizing: border-box; } +.charsheet select.sheet-table-dynamic { + margin: 0; +} + .charsheet input.sheet-table-dynamic90 { min-width: 90%; } +.charsheet th.sheet-td-dynamic20, +.charsheet td.sheet-td-dynamic20 { + width: 20%; +} + +.charsheet th.sheet-td-dynamic25, +.charsheet td.sheet-td-dynamic25 { + width: 25%; +} + .charsheet th.sheet-td-dynamic30, .charsheet td.sheet-td-dynamic30 { width: 30%; @@ -215,6 +216,11 @@ textarea { width: 50%; } +.charsheet th.sheet-td-dynamic60, +.charsheet td.sheet-td-dynamic60 { + width: 60%; +} + .charsheet th.sheet-td-dynamic70, .charsheet td.sheet-td-dynamic70 { width: 70%; @@ -225,36 +231,6 @@ textarea { width: 100%; } -.charsheet select.sheet-table-dynamic { - margin: 0; -} - -.charsheet input[type="number"].sheet-tiny { - width: 23px; -} -input[type="number"].sheet-tiny::-webkit-inner-spin-button { - -webkit-appearance: none; -} -input[type="number"].sheet-nobut::-webkit-inner-spin-button { - -webkit-appearance: none; -} - -input.sheet-arrow -{ - float: left; -} - -input.sheet-arrow:checked ~ div.sheet-body -{ - display: none; -} - -.charsheet input[type="checkbox"].left { - float: left; - margin: 5px 0; - width: 2px; -} - input.sheet-tab:not(:first-child)::before { border-left: none; @@ -316,106 +292,103 @@ textarea.sheet-input-like { content: "✓"; } -div[class^="sheet-section"] { +.charsheet input.sheet-tab1:checked ~ .sheet-section-character-page, +.charsheet input.sheet-tab2:checked ~ .sheet-section-monster-page, +.charsheet input.sheet-tab3:checked ~ .sheet-section-character-info, +.charsheet input.sheet-tab4:checked ~ .sheet-section-attributes, +.charsheet input.sheet-tab5:checked ~ .sheet-section-weapons, +.charsheet input.sheet-tab6:checked ~ .sheet-section-rogue, +.charsheet input.sheet-tab7:checked ~ .sheet-section-proficiencies, +.charsheet input.sheet-tab8:checked ~ .sheet-section-spells, +.charsheet input.sheet-tab9:checked ~ .sheet-section-psionics, +.charsheet input.sheet-tab10:checked ~ .sheet-section-equipment, +.charsheet input.sheet-tab11:checked ~ .sheet-section-currency, +.charsheet input.sheet-tab12:checked ~ .sheet-section-followers, +.charsheet input.sheet-tab14:checked ~ .sheet-section-ravenloft-saves, +.charsheet input.sheet-tab15:checked ~ .sheet-section-movement-standard, +.charsheet input.sheet-tab16:checked ~ .sheet-section-movement-advanced, +.charsheet input.sheet-tab17:checked ~ .sheet-section-attributes-standard, +.charsheet input.sheet-tab18:checked ~ .sheet-section-attributes-player-option, +.charsheet input.sheet-tab19:checked ~ .sheet-section-wizard-spells, +.charsheet input.sheet-tab20:checked ~ .sheet-section-priest-spells, +.charsheet input.sheet-tab21:checked ~ .sheet-section-wizard-level-one, +.charsheet input.sheet-tab22:checked ~ .sheet-section-wizard-level-two, +.charsheet input.sheet-tab23:checked ~ .sheet-section-wizard-level-three, +.charsheet input.sheet-tab24:checked ~ .sheet-section-wizard-level-four, +.charsheet input.sheet-tab25:checked ~ .sheet-section-wizard-level-five, +.charsheet input.sheet-tab26:checked ~ .sheet-section-wizard-level-six, +.charsheet input.sheet-tab27:checked ~ .sheet-section-wizard-level-seven, +.charsheet input.sheet-tab28:checked ~ .sheet-section-wizard-level-eight, +.charsheet input.sheet-tab29:checked ~ .sheet-section-wizard-level-nine, +.charsheet input.sheet-tab30:checked ~ .sheet-section-wizard-level-ten, +.charsheet input.sheet-tab31:checked ~ .sheet-section-priest-level-one, +.charsheet input.sheet-tab32:checked ~ .sheet-section-priest-level-two, +.charsheet input.sheet-tab33:checked ~ .sheet-section-priest-level-three, +.charsheet input.sheet-tab34:checked ~ .sheet-section-priest-level-four, +.charsheet input.sheet-tab35:checked ~ .sheet-section-priest-level-five, +.charsheet input.sheet-tab36:checked ~ .sheet-section-priest-level-six, +.charsheet input.sheet-tab37:checked ~ .sheet-section-priest-level-seven, +.charsheet input.sheet-tab31:checked ~ div .sheet-section-priest-level-one, +.charsheet input.sheet-tab32:checked ~ div .sheet-section-priest-level-two, +.charsheet input.sheet-tab33:checked ~ div .sheet-section-priest-level-three, +.charsheet input.sheet-tab34:checked ~ div .sheet-section-priest-level-four, +.charsheet input.sheet-tab35:checked ~ div .sheet-section-priest-level-five, +.charsheet input.sheet-tab36:checked ~ div .sheet-section-priest-level-six, +.charsheet input.sheet-tab37:checked ~ div .sheet-section-priest-level-seven, +.charsheet input.sheet-tab38:checked ~ .sheet-section-priest-quest, +.charsheet input.sheet-tab39:checked ~ .sheet-section-rogue-standard, +.charsheet input.sheet-tab40:checked ~ .sheet-section-psionic-standard, +.charsheet input.sheet-tab41:checked ~ .sheet-section-psionic-advanced, +.charsheet input.sheet-tab42:checked ~ .sheet-section-currency-standard, +.charsheet input.sheet-tab43:checked ~ .sheet-section-currency-dragonlance, +.charsheet input.sheet-tab44:checked ~ .sheet-section-currency-dark-sun, +.charsheet input.sheet-tab45:checked ~ .sheet-section-currency-ravenloft, +.charsheet input.sheet-tab46:checked ~ .sheet-section-follower-warrior, +.charsheet input.sheet-tab47:checked ~ .sheet-section-follower-wizard, +.charsheet input.sheet-tab48:checked ~ .sheet-section-follower-priest, +.charsheet input.sheet-tab49:checked ~ .sheet-section-follower-rogue, +.charsheet input.sheet-tab50:checked ~ .sheet-section-follower-psion, +.charsheet input.sheet-tab51:checked ~ .sheet-section-follower-animals, +.charsheet input.sheet-tab52:checked ~ .sheet-section-priest-turn, +.charsheet input.sheet-tab53:checked ~ .sheet-section-journal, +.charsheet input.sheet-tab54:checked ~ .sheet-section-wizard-level-eleven, +.charsheet input.sheet-tab55:checked ~ .sheet-section-wizard-level-twelve, +.charsheet input.sheet-tab56:checked ~ .sheet-section-wizard-level-thirteen, +.charsheet input.sheet-tab57:checked ~ .sheet-section-wizard-level-fourteen, +.charsheet input.sheet-tab58:checked ~ .sheet-section-wizard-level-fifteen, +.charsheet input.sheet-tab59:checked ~ .sheet-section-currency-maztica, +.charsheet input.sheet-tab60:checked ~ .sheet-section-rogue-spds, +.charsheet input.sheet-tab61:checked ~ .sheet-section-rogue-standard-hench, +.charsheet input.sheet-tab62:checked ~ .sheet-section-rogue-spds-hench, +.charsheet input.sheet-tab63:checked ~ .sheet-section-rogue-standard-repeat, +.charsheet input.sheet-tab64:checked ~ .sheet-section-rogue-spds-repeat, +.charsheet input.sheet-tab65:checked ~ .sheet-section-psionics-standard-hench, +.charsheet input.sheet-tab66:checked ~ .sheet-section-psionics-advanced-hench, +.charsheet input.sheet-tab67:checked ~ .sheet-section-psionics-standard-repeat, +.charsheet input.sheet-tab68:checked ~ .sheet-section-psionics-advanced-repeat, +.charsheet input.sheet-tab69:checked ~ .sheet-section-granted-powers, +.charsheet input.sheet-tab70:checked ~ .sheet-section-weapon-standard-melee, +.charsheet input.sheet-tab71:checked ~ .sheet-section-weapon-standard-ranged, +.charsheet input.sheet-tab72:checked ~ .sheet-section-movement-mount, +.charsheet input.sheet-tab73:checked ~ .sheet-section-character-info-details, +.charsheet input.sheet-tab74:checked ~ .sheet-section-character-info-tracker, +.charsheet input.sheet-tab75:checked ~ .sheet-section-currency-birthright, +.charsheet input.sheet-tab76:checked ~ .sheet-section-birthright, +.charsheet input.sheet-tab77:checked ~ .sheet-section-movement-barbarian, +.charsheet input.sheet-tab79:checked ~ .sheet-section-movement-swimming, +.charsheet input.sheet-tab80:checked ~ .sheet-section-movement-flying, +.charsheet input.sheet-tab81:checked ~ .sheet-section-weapon-standard, +.charsheet input.sheet-tab82:checked ~ .sheet-section-weapon-player-option, +.charsheet input.sheet-tab83:checked ~ .sheet-section-weapon-player-option-melee, +.charsheet input.sheet-tab84:checked ~ .sheet-section-weapon-player-option-ranged, +.charsheet input.sheet-tab85:checked ~ .sheet-section-settings-page { display: block; } -.charsheet input.sheet-tab1:checked ~ div.sheet-section-character-page, -.charsheet input.sheet-tab2:checked ~ div.sheet-section-monster-page, -.charsheet input.sheet-tab3:checked ~ div.sheet-section-character-info, -.charsheet input.sheet-tab4:checked ~ div.sheet-section-attributes, -.charsheet input.sheet-tab5:checked ~ div.sheet-section-weapons, -.charsheet input.sheet-tab6:checked ~ div.sheet-section-rogue, -.charsheet input.sheet-tab7:checked ~ div.sheet-section-proficiencies, -.charsheet input.sheet-tab8:checked ~ div.sheet-section-spells, -.charsheet input.sheet-tab9:checked ~ div.sheet-section-psionics, -.charsheet input.sheet-tab10:checked ~ div.sheet-section-equipment, -.charsheet input.sheet-tab11:checked ~ div.sheet-section-currency, -.charsheet input.sheet-tab12:checked ~ div.sheet-section-followers, -.charsheet input.sheet-tab13:checked ~ div.sheet-section-standard-saves, -.charsheet input.sheet-tab14:checked ~ div.sheet-section-ravenloft-saves, -.charsheet input.sheet-tab15:checked ~ div.sheet-section-movement-standard, -.charsheet input.sheet-tab16:checked ~ div.sheet-section-movement-advanced, -.charsheet input.sheet-tab17:checked ~ div.sheet-section-attributes-standard, -.charsheet input.sheet-tab18:checked ~ div.sheet-section-attributes-player-option, -.charsheet input.sheet-tab19:checked ~ div.sheet-section-wizard-spells, -.charsheet input.sheet-tab20:checked ~ div.sheet-section-priest-spells, -.charsheet input.sheet-tab21:checked ~ div.sheet-section-wizard-level-one, -.charsheet input.sheet-tab22:checked ~ div.sheet-section-wizard-level-two, -.charsheet input.sheet-tab23:checked ~ div.sheet-section-wizard-level-three, -.charsheet input.sheet-tab24:checked ~ div.sheet-section-wizard-level-four, -.charsheet input.sheet-tab25:checked ~ div.sheet-section-wizard-level-five, -.charsheet input.sheet-tab26:checked ~ div.sheet-section-wizard-level-six, -.charsheet input.sheet-tab27:checked ~ div.sheet-section-wizard-level-seven, -.charsheet input.sheet-tab28:checked ~ div.sheet-section-wizard-level-eight, -.charsheet input.sheet-tab29:checked ~ div.sheet-section-wizard-level-nine, -.charsheet input.sheet-tab30:checked ~ div.sheet-section-wizard-level-ten, -.charsheet input.sheet-tab31:checked ~ div.sheet-section-priest-level-one, -.charsheet input.sheet-tab32:checked ~ div.sheet-section-priest-level-two, -.charsheet input.sheet-tab33:checked ~ div.sheet-section-priest-level-three, -.charsheet input.sheet-tab34:checked ~ div.sheet-section-priest-level-four, -.charsheet input.sheet-tab35:checked ~ div.sheet-section-priest-level-five, -.charsheet input.sheet-tab36:checked ~ div.sheet-section-priest-level-six, -.charsheet input.sheet-tab37:checked ~ div.sheet-section-priest-level-seven, -.charsheet input.sheet-tab38:checked ~ div.sheet-section-priest-quest, -.charsheet input.sheet-tab39:checked ~ div.sheet-section-rogue-standard, -.charsheet input.sheet-tab40:checked ~ div.sheet-section-psionic-standard, -.charsheet input.sheet-tab41:checked ~ div.sheet-section-psionic-advanced, -.charsheet input.sheet-tab42:checked ~ div.sheet-section-currency-standard, -.charsheet input.sheet-tab43:checked ~ div.sheet-section-currency-dragonlance, -.charsheet input.sheet-tab44:checked ~ div.sheet-section-currency-dark-sun, -.charsheet input.sheet-tab45:checked ~ div.sheet-section-currency-ravenloft, -.charsheet input.sheet-tab46:checked ~ div.sheet-section-follower-warrior, -.charsheet input.sheet-tab47:checked ~ div.sheet-section-follower-wizard, -.charsheet input.sheet-tab48:checked ~ div.sheet-section-follower-priest, -.charsheet input.sheet-tab49:checked ~ div.sheet-section-follower-rogue, -.charsheet input.sheet-tab50:checked ~ div.sheet-section-follower-psion, -.charsheet input.sheet-tab51:checked ~ div.sheet-section-follower-animals, -.charsheet input.sheet-tab52:checked ~ div.sheet-section-priest-turn, -.charsheet input.sheet-tab53:checked ~ div.sheet-section-journal, -.charsheet input.sheet-tab54:checked ~ div.sheet-section-wizard-level-eleven, -.charsheet input.sheet-tab55:checked ~ div.sheet-section-wizard-level-twelve, -.charsheet input.sheet-tab56:checked ~ div.sheet-section-wizard-level-thirteen, -.charsheet input.sheet-tab57:checked ~ div.sheet-section-wizard-level-fourteen, -.charsheet input.sheet-tab58:checked ~ div.sheet-section-wizard-level-fifteen, -.charsheet input.sheet-tab59:checked ~ div.sheet-section-currency-maztica, -.charsheet input.sheet-tab60:checked ~ div.sheet-section-rogue-spds, -.charsheet input.sheet-tab61:checked ~ div.sheet-section-rogue-standard-hench, -.charsheet input.sheet-tab62:checked ~ div.sheet-section-rogue-spds-hench, -.charsheet input.sheet-tab63:checked ~ div.sheet-section-rogue-standard-repeat, -.charsheet input.sheet-tab64:checked ~ div.sheet-section-rogue-spds-repeat, -.charsheet input.sheet-tab65:checked ~ div.sheet-section-psionics-standard-hench, -.charsheet input.sheet-tab66:checked ~ div.sheet-section-psionics-advanced-hench, -.charsheet input.sheet-tab67:checked ~ div.sheet-section-psionics-standard-repeat, -.charsheet input.sheet-tab68:checked ~ div.sheet-section-psionics-advanced-repeat, -.charsheet input.sheet-tab69:checked ~ div.sheet-section-granted-powers, -.charsheet input.sheet-tab70:checked ~ div.sheet-section-weapon-standard-melee, -.charsheet input.sheet-tab71:checked ~ div.sheet-section-weapon-standard-ranged, -.charsheet input.sheet-tab72:checked ~ div.sheet-section-movement-mount, -.charsheet input.sheet-tab73:checked ~ div.sheet-section-character-info-details, -.charsheet input.sheet-tab74:checked ~ div.sheet-section-character-info-tracker, -.charsheet input.sheet-tab75:checked ~ div.sheet-section-currency-birthright, -.charsheet input.sheet-tab76:checked ~ div.sheet-section-birthright, -.charsheet input.sheet-tab77:checked ~ div.sheet-section-movement-barbarian, -.charsheet input.sheet-tab78:checked ~ div.sheet-section-attributes-dream, -.charsheet input.sheet-tab79:checked ~ div.sheet-section-movement-swimming, -.charsheet input.sheet-tab80:checked ~ div.sheet-section-movement-flying, -.charsheet input.sheet-tab81:checked ~ div.sheet-section-weapon-standard, -.charsheet input.sheet-tab82:checked ~ div.sheet-section-weapon-player-option, -.charsheet input.sheet-tab83:checked ~ div.sheet-section-weapon-player-option-melee, -.charsheet input.sheet-tab84:checked ~ div.sheet-section-weapon-player-option-ranged, -.charsheet input.sheet-tab85:checked ~ div.sheet-section-settings-page { - display: block; -} - -.charsheet input.sheet-tab99:checked ~ div[class^="sheet-section"] { - display: block; -} - .charsheet input.sheet-tab { width: 120px; height: inherit; - cursor: pointer; + cursor: pointer; position: relative; opacity: 0; z-index: 9999; @@ -423,16 +396,16 @@ div[class^="sheet-section"] { .charsheet span.sheet-tab { text-align: center; - display: inline-block; - font-size: 14px; - background: #800a0a; + display: inline-block; + font-size: 14px; + background: #800a0a; color: white; font-weight: bold; border-radius: 4px; width: 120px; height: inherit; - cursor: pointer; + cursor: pointer; position: relative; } @@ -549,7 +522,6 @@ div[class^="sheet-section"] { cursor: pointer; z-index: 1; } -input.sheet-tab + span::before, input.sheet-tab + span::before { margin-right: 4px; @@ -580,11 +552,6 @@ input.sheet-tab + span::before padding: 0 0 0 0; } -/* Dark Mode override */ -.sheet-darkmode .charsheet label { - color: #333; -} - .charsheet h1, .charsheet h2, .charsheet h3, @@ -594,283 +561,364 @@ input.sheet-tab + span::before font-weight: 800; } -/*h2,h3,h4,h5,h6 {*/ -/* line-height:1em;*/ -/* display:inline;*/ -/* font-family: Arial, sans-serif;*/ -/* font-size:.8125rem;*/ -/* color: #000;*/ -/*}*/ - - -/*h1 {*/ -/* width: 100%;*/ -/* background-color: #FFF;*/ -/* color: #000;*/ -/* padding:.2em 0 0 0;*/ -/* min-height: 1em;*/ -/* margin: 0 0 .5em 0;*/ -/* font-size:.8125rem;*/ -/* line-height:1.4em;*/ -/* display:block;*/ -/* text-align:center;*/ -/*}*/ - -.sheet-small-label1 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 72px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label1 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label1 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label1 select { - margin-top:-2px; - width: 72px; - border: .5px; -} -.sheet-small-label2 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 63px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label2 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label2 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label2 select { - margin-top:-2px; - width: 63px; - border: .5px; -} -.sheet-small-label3 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 85px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label3 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label3 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label3 select { - margin-top:-2px; - width: 85px; - border: .5px; -} -.sheet-small-label4 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 67px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label4 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label4 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label4 select { - margin-top:-2px; - width: 67px; - border: .5px; -} -.sheet-small-label5 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 105px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label5 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label5 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label5 select { - margin-top:-2px; - width: 105px; - border: .5px; -} -.sheet-small-label6 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 75px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label6 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label6 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label6 select { - margin-top:-2px; - width: 75px; - border: .5px; -} -.sheet-small-label7 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 125px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label7 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label7 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label7 select { - margin-top:-2px; - width: 125px; - border: .5px; -} - -button { - background-color: #7C0303; -} - .charsheet, .charsheet button:hover { background-image: url("https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/ADnD_2E_Revised/img/background-parchment_paper_seamless_pattern.jpg"); } +.sheet-inline, +.sheet-inline-5 { + display: inline-block; +} + +.sheet-inline-5 { + padding-right: 5px; +} + +table.sheet-default-header-first-row tr:first-child, +table.sheet-default-header-thead thead:first-child, +table.sheet-default-header-even-row tr:nth-child(even), +table.sheet-default-header-odd-row tr:nth-child(odd), +table.sheet-default-header-every-third-row tr:nth-child(3n+1), +table.sheet-default-header-first-column td:first-child, +table.sheet-default-header-first-column th:first-child, +table.sheet-default-header-even-column td:nth-child(even), +table.sheet-default-header-even-column th:nth-child(even), +table.sheet-default-header-odd-column td:nth-child(odd), +table.sheet-default-header-odd-column th:nth-child(odd), +table.sheet-default-header-every-third-column td:nth-child(3n+1), +.sheet-default-header { + background-color: #7C0303; + color: #FFF; + font-family: Arial, sans-serif; + font-weight: bold; +} + +table.sheet-background-gray-pair3 tr:nth-child(6n+5), +table.sheet-background-gray-pair3 tr:nth-child(6n+6), +table.sheet-background-gray-pair3 tr:nth-child(6n+7) { + background-color: rgb(0, 0, 0, 10%); +} + +.sheet-centering, +.sheet-centering-padding-2, +.sheet-centering-padding-5, +table.sheet-centering-column1 th:nth-child(1), +table.sheet-centering-column1 td:nth-child(1), +table.sheet-centering-column2 th:nth-child(2), +table.sheet-centering-column2 td:nth-child(2), +table.sheet-centering-column3 th:nth-child(3), +table.sheet-centering-column3 td:nth-child(3), +table.sheet-centering-column4 th:nth-child(4), +table.sheet-centering-column4 td:nth-child(4), +table.sheet-centering-padding-5-column2 th:nth-child(2), +table.sheet-centering-padding-5-column2 td:nth-child(2), +table.sheet-centering-padding-5-column3 th:nth-child(3), +table.sheet-centering-padding-5-column3 td:nth-child(3), +table.sheet-centering-padding-5-column4 th:nth-child(4), +table.sheet-centering-padding-5-column4 td:nth-child(4), +table.sheet-centering-padding-5-column5 th:nth-child(5), +table.sheet-centering-padding-5-column5 td:nth-child(5) { + text-align: center; + vertical-align: middle; +} + +.sheet-centering-horizontal { + text-align: center; +} + +.sheet-centering-vertical { + vertical-align: middle; +} + +.sheet-table-center { + margin-left: auto; + margin-right: auto; +} + +.sheet-centering-padding-2 { + padding-left: 2px; + padding-right: 2px; +} + +table.sheet-centering-padding-5-column2 th:nth-child(2), +table.sheet-centering-padding-5-column2 td:nth-child(2), +table.sheet-centering-padding-5-column3 th:nth-child(3), +table.sheet-centering-padding-5-column3 td:nth-child(3), +table.sheet-centering-padding-5-column4 th:nth-child(4), +table.sheet-centering-padding-5-column4 td:nth-child(4), +.sheet-centering-padding-5 { + padding-left: 5px; + padding-right: 5px; +} + +.sheet-padding-right, +table.sheet-padding-right-column1 th:nth-child(1), +table.sheet-padding-right-column1 td:nth-child(1), +table.sheet-padding-right-column2 th:nth-child(2), +table.sheet-padding-right-column2 td:nth-child(2) { + padding-right: 5px; +} + +.sheet-table-nowrap th, +.sheet-table-nowrap td, +.sheet-table-nowrap-column1 th:nth-child(1), +.sheet-table-nowrap-column1 td:nth-child(1), +.sheet-table-nowrap-column2 th:nth-child(2), +.sheet-table-nowrap-column2 td:nth-child(2) { + white-space: nowrap; +} + +.sheet-table-full-width-column1 th:nth-child(1), +.sheet-table-full-width-column1 td:nth-child(1), +.sheet-table-full-width-column2 th:nth-child(2), +.sheet-table-full-width-column2 td:nth-child(2) { + width: 100%; +} + +.sheet-table-white { + color: #FFF; + font-family: Arial, sans-serif; + font-weight: bold; +} + +.sheet-table-slim-first-column td:first-child { + width: 1px; +} + +.sheet-table-sub-ability-score tr:nth-child(3n) button:first-child, +.sheet-table-sub-ability-score tr:nth-child(3n-1) button:first-child { + margin-left: 10px; +} + +.sheet-note { + line-height:1em; + font-family: Arial, sans-serif; + font-size:.8125rem; + font-weight: bold; + color: #000; +} + +.sheet-flex, +.charsheet .sheet-body .sheet-flex { + display: flex; +} + +.sheet-flex-column, +.charsheet .sheet-body .sheet-flex-column { + display: flex; + flex-direction: column; +} + +.sheet-spell-line { + display: flex; + align-items: flex-end; + justify-content: space-between; + column-gap: 5px; +} + +.sheet-spell-fold { + display: flex; + justify-content: space-between; + column-gap: 10px; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; +} + +.charsheet .sheet-spell-effect { + height: unset; + resize: vertical; + margin-bottom: 0; +} + +.charsheet label input[type="radio"], +.charsheet label input[type="checkbox"] { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + left: 0; + top: 0; + margin: 0; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + text-align: inherit; + padding-left: inherit; +} + +/* Show hide styling */ +.sheet-collapse { + visibility: collapse; +} + +.sheet-hidden { + display: none; +} + +.sheet-hidden.sheet-show, +input.sheet-show-worn-equipment:checked ~ .sheet-hidden, +input.sheet-show-spell-slots:checked ~ .sheet-tab-content .sheet-spell-slots.sheet-hidden, +input.sheet-show-spell-points:checked ~ .sheet-tab-content .sheet-spell-points.sheet-hidden, +input.sheet-show-spell-arcs-winds:checked ~ .sheet-tab-content .sheet-spell-arcs-winds.sheet-hidden, +input.sheet-show-spell-spheres-pri:checked ~ .sheet-spell-sphere-pri.sheet-hidden { + display: revert; +} + +.btn.sheet-hidden { + padding-top: 2px; + padding-left: 8px; + padding-right: 8px; +} + +div.repcontainer div.repitem:first-child td.sheet-show-first, +div.repcontainer div.repitem:first-child tr.sheet-show-first, +div.repcontainer div.repitem:first-child th.sheet-show-first, +div.repcontainer div.repitem:first-child thead.sheet-show-first { + visibility: visible; +} + +.sheet-action-button, +.sheet-action-button-roll { + height: 19px; + font-size: 1.3em; + padding: 2px 3px; + margin: 0 3px; +} + +.sheet-action-button-roll:before { + font-family: "dicefontd20"; + content: "t"; +} + +/*#region Announcement styling start */ +input.sheet-show-announcement:checked ~ .sheet-hidden { + display: revert; +} + +div.sheet-announcement { + width: 95%; + margin: 5px; + border: 3px solid #ff0000; + border-radius: 8px; + padding: 8px; + background: #ababab; + box-sizing: border-box; +} + +.sheet-selectable { + font-style: italic; + font-weight: bold; + color: #181E72; + -webkit-user-select: all; /* Chrome all / Safari all */ + -moz-user-select: all; /* Firefox all */ + -ms-user-select: all; /* IE 10+ */ + user-select: all; /* Likely future */ +} + +img.expandable { + transition:transform 0.25s ease; +} + +img.expandable:hover { + -webkit-transform:scale(3); /* or some other value */ + transform:scale(3); +} +/*#endregion Announcement styling end */ +/*#region Toast styling*/ +input.sheet-show-toast:checked + .sheet-hidden { + display: revert; +} +.sheet-toast { + position: fixed; + right: 30px; + bottom: -13px; + text-align: center; + width: 300px; + height: 200px; +} + +.sheet-toast div { + position: absolute; + top: 0; + right: 0; + border: 2px solid; + border-radius: 10px; + cursor: text; +} + +input.sheet-toast-success:checked ~ .sheet-toast-content { + border-color: #badbcc; + background-color: #d1e7dd; +} +input.sheet-toast-info:checked ~ .sheet-toast-content { + border-color: #b6d4fe; + background-color: #cfe2ff; +} +input.sheet-toast-warning:checked ~ .sheet-toast-content { + border-color: #ffecb5; + background-color: #fff3cd; +} +input.sheet-toast-error:checked ~ .sheet-toast-content { + border-color: #f5c2c7; + background-color: #f8d7da; +} + +.sheet-toast input { + text-align: center; + font-size: 18px; + font-weight: bold; + width: 100%; +} + +.sheet-toast input, +.sheet-toast textarea { + border: 0; + background-color: transparent; + cursor: text; + margin-bottom: 0; + resize: none; +} + +.sheet-hide-toast { + position: absolute; + top: -10px; + right: -12px; + z-index: 1; + border-radius: 20px; + border-color: black; + background-color: white; + font-weight: bold; +} +/*#endregion Toast styling end*/ +/* Firefox styling */ +@supports (-moz-appearance:none) { + .charsheet .sheet-chrome { + display: none; + } + + input[type="number"] { + -moz-appearance: textfield; + } + input[type="number"]:hover, + input[type="number"]:focus { + -moz-appearance: revert; + } +} + +/* Not Firefox styling */ +@supports not (-moz-appearance:none) { + .charsheet .sheet-firefox { + display: none; + } +} /*/ Styles for 2ESheet rolltemplates /*/ .sheet-rolltemplate-darkmode .inlinerollresult { color: rgb(255, 171, 0); @@ -1566,367 +1614,26 @@ button { } /*#endregion*/ - -.sheet-inline, -.sheet-inline-5 { - display: inline-block; -} - -.sheet-inline-5 { - padding-right: 5px; -} - -table.sheet-default-header-first-row tr:first-child, -table.sheet-default-header-thead thead:first-child, -table.sheet-default-header-even-row tr:nth-child(even), -table.sheet-default-header-odd-row tr:nth-child(odd), -table.sheet-default-header-every-third-row tr:nth-child(3n+1), -table.sheet-default-header-first-column td:first-child, -table.sheet-default-header-first-column th:first-child, -table.sheet-default-header-even-column td:nth-child(even), -table.sheet-default-header-odd-column td:nth-child(odd), -table.sheet-default-header-every-third-column td:nth-child(3n+1), -.sheet-default-header { - background-color: #7C0303; - color: #FFF; - font-family: Arial, sans-serif; - font-weight: bold; -} - -table.sheet-background-gray-pair3 tr:nth-child(6n+5), -table.sheet-background-gray-pair3 tr:nth-child(6n+6), -table.sheet-background-gray-pair3 tr:nth-child(6n+7) { - background-color: rgb(0, 0, 0, 10%); -} - -.sheet-centering, -.sheet-centering-padding-2, -.sheet-centering-padding-5, -table.sheet-centering-column1 th:nth-child(1), -table.sheet-centering-column1 td:nth-child(1), -table.sheet-centering-column2 th:nth-child(2), -table.sheet-centering-column2 td:nth-child(2), -table.sheet-centering-column3 th:nth-child(3), -table.sheet-centering-column3 td:nth-child(3), -table.sheet-centering-column4 th:nth-child(4), -table.sheet-centering-column4 td:nth-child(4), -table.sheet-centering-padding-5-column2 th:nth-child(2), -table.sheet-centering-padding-5-column2 td:nth-child(2), -table.sheet-centering-padding-5-column3 th:nth-child(3), -table.sheet-centering-padding-5-column3 td:nth-child(3), -table.sheet-centering-padding-5-column4 th:nth-child(4), -table.sheet-centering-padding-5-column4 td:nth-child(4), -table.sheet-centering-padding-5-column5 th:nth-child(5), -table.sheet-centering-padding-5-column5 td:nth-child(5) { - text-align: center; - vertical-align: middle; -} - -.sheet-centering-horizontal { - text-align: center; -} - -.sheet-centering-vertical { - vertical-align: middle; -} - -.sheet-table-center { - margin-left: auto; - margin-right: auto; -} - -.sheet-centering-padding-2 { - padding-left: 2px; - padding-right: 2px; -} - -table.sheet-centering-padding-5-column2 th:nth-child(2), -table.sheet-centering-padding-5-column2 td:nth-child(2), -table.sheet-centering-padding-5-column3 th:nth-child(3), -table.sheet-centering-padding-5-column3 td:nth-child(3), -table.sheet-centering-padding-5-column4 th:nth-child(4), -table.sheet-centering-padding-5-column4 td:nth-child(4), -.sheet-centering-padding-5 { - padding-left: 5px; - padding-right: 5px; -} - -.sheet-padding-right, -table.sheet-padding-right-column1 th:nth-child(1), -table.sheet-padding-right-column1 td:nth-child(1), -table.sheet-padding-right-column2 th:nth-child(2), -table.sheet-padding-right-column2 td:nth-child(2) { - padding-right: 5px; -} - -.sheet-table-white { - color: #FFF; - font-family: Arial, sans-serif; - font-weight: bold; -} - -.sheet-table-slim-first-column td:first-child { - width: 1px; -} - -.sheet-table-sub-ability-score tr:nth-child(3n) button:first-child, -.sheet-table-sub-ability-score tr:nth-child(3n-1) button:first-child { - margin-left: 10px; -} - -.sheet-note { - line-height:1em; - font-family: Arial, sans-serif; - font-size:.8125rem; - font-weight: bold; - color: #000; -} - -.sheet-flex, -.charsheet .sheet-body .sheet-flex { - display: flex; -} - -.sheet-flex-column, -.charsheet .sheet-body .sheet-flex-column { - display: flex; - flex-direction: column; -} - -.sheet-flex-wrap .repcontainer { - display: flex; - flex-wrap: wrap; - justify-content: space-around; -} - -.charsheet label input[type="radio"], -.charsheet label input[type="checkbox"] { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - left: 0; - top: 0; - margin: 0; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - text-align: inherit; - padding-left: inherit; -} - -.sheet-collapse { - visibility: collapse; -} - -.sheet-hidden { - display: none; -} -.sheet-hidden.sheet-show { - display: revert; -} -.btn.sheet-hidden { - padding-top: 2px; - padding-left: 8px; - padding-right: 8px; -} - -div.repcontainer:not(.editmode) div.repitem td button[type="action"], -div.repcontainer:not(.editmode) div.repitem th button[type="action"] { - position: relative; -} - -div.repcontainer div.repitem:first-child td.sheet-show-first, -div.repcontainer div.repitem:first-child tr.sheet-show-first, -div.repcontainer div.repitem:first-child th.sheet-show-first, -div.repcontainer div.repitem:first-child thead.sheet-show-first { - visibility: visible; -} - -.sheet-show-spell-hack { - position: relative; - top: -11px; -} - -.sheet-spell-effect { - width: 100%; - position: relative; - top: -5px; -} - -input.sheet-show-spell-details:checked ~ .sheet-spell-effect { - top: 0; -} - -table.sheet-spell-details { - visibility: collapse; -} -input.sheet-show-spell-details:checked ~ table.sheet-spell-details { - visibility: visible; - margin-top: -5px; -} - -div.sheet-spell-details { - display: none; -} -input.sheet-show-spell-details:checked ~ div.sheet-spell-details { - display: flex; -} - -.sheet-underline { - text-decoration: underline; - font-weight: bolder; -} - /* Overwrite Roll20 base styling */ details > summary:first-of-type { display: list-item; } -/* Show hide styling */ -.sheet-worn-equipment, -.sheet-spell-points-wiz, -.sheet-spell-points-pri, -.sheet-spell-sphere-pri, -.sheet-announcement, -.sheet-toast { - display: none; +/* Fix action buttons in repeating tables */ +div.repcontainer:not(.editmode) div.repitem td button[type="action"], +div.repcontainer:not(.editmode) div.repitem th button[type="action"] { + position: relative; } -input.sheet-show-worn-equipment:checked ~ .sheet-worn-equipment, -input.sheet-show-spell-points-wiz:checked ~ .sheet-spell-points-wiz, -input.sheet-show-spell-points-pri:checked ~ .sheet-spell-points-pri, -input.sheet-show-spell-spheres-pri:checked ~ .sheet-spell-sphere-pri, -input.sheet-show-announcement:checked ~ .sheet-announcement, -input.sheet-show-toast:checked ~ .sheet-toast -{ - display: block; +/* Dark Mode override */ +.sheet-darkmode .charsheet label { + color: #333; } -.sheet-action-button, -.sheet-action-button-roll { - height: 19px; - font-size: 1.3em; - padding: 2px 3px; - margin: 0 3px; -} - -.sheet-action-button-roll:before { - font-family: "dicefontd20"; - content: "t"; -} - -/* Announcement styling start */ -div.sheet-announcement { - width: 95%; - margin: 5px; - border: 3px solid #ff0000; - border-radius: 8px; - padding: 8px; - background: #ababab; - box-sizing: border-box; -} - -.sheet-selectable { - font-style: italic; - font-weight: bold; - color: #181E72; - -webkit-user-select: all; /* Chrome all / Safari all */ - -moz-user-select: all; /* Firefox all */ - -ms-user-select: all; /* IE 10+ */ - user-select: all; /* Likely future */ -} - -img.expandable { - transition:transform 0.25s ease; -} - -img.expandable:hover { - -webkit-transform:scale(3); /* or some other value */ - transform:scale(3); -} -/* Announcement styling end */ - -/* Firefox styling */ -@supports (-moz-appearance:none) { - .charsheet .sheet-chrome { - display: none; - } -} - -/* Not Firefox styling */ -@supports not (-moz-appearance:none) { - .charsheet .sheet-firefox { - display: none; - } -} - -/*#region Toast styling*/ -.sheet-toast { - position: fixed; - right: 30px; - bottom: -13px; - text-align: center; - width: 300px; - height: 200px; -} - -.sheet-toast div { - position: absolute; - top: 0; - right: 0; - border: 2px solid; - border-radius: 10px; - cursor: text; -} - -input.sheet-toast-success:checked ~ .sheet-toast-content { - border-color: #badbcc; - background-color: #d1e7dd; -} -input.sheet-toast-info:checked ~ .sheet-toast-content { - border-color: #b6d4fe; - background-color: #cfe2ff; -} -input.sheet-toast-warning:checked ~ .sheet-toast-content { - border-color: #ffecb5; - background-color: #fff3cd; -} -input.sheet-toast-error:checked ~ .sheet-toast-content { - border-color: #f5c2c7; - background-color: #f8d7da; -} - -.sheet-toast input { - text-align: center; - font-size: 18px; - font-weight: bold; - width: 100%; -} - -.sheet-toast input, -.sheet-toast textarea { - border: 0; - background-color: transparent; - cursor: text; - margin-bottom: 0; - resize: none; -} - -.sheet-hide-toast { - position: absolute; - top: -10px; - right: -12px; - z-index: 1; - border-radius: 20px; - border-color: black; +/* Fix background color so active fields can be differentiated from read-only and disabled fields */ +input, +button, +select, +textarea { background-color: white; - font-weight: bold; } -/*#endregion Toast styling end*/ diff --git a/ADnD_2E_Revised/build/buildPug.js b/ADnD_2E_Revised/build/buildPug.js index 2a2762d63f..506864a11d 100644 --- a/ADnD_2E_Revised/build/buildPug.js +++ b/ADnD_2E_Revised/build/buildPug.js @@ -4,7 +4,7 @@ const path = require('path'); const sourceFolder = path.join(__dirname, '..'); const jsFolder = path.join(sourceFolder, 'javascript'); const pugFolder = path.join(sourceFolder, 'pug'); -const htmlFolder = path.join(sourceFolder, 'html', 'components'); +const htmlFolder = path.join(sourceFolder, 'html'); const miscFolder = path.join(sourceFolder, 'misc'); const booksPriority = [ {book: 'PHB', print: 'First Printing May 2013'}, @@ -65,6 +65,11 @@ spellsJs.forEach(jsFile => { } }); +let spellTemplate = pug.renderFile(path.join(pugFolder, 'spellTemplate.pug'), {pretty: true, isPriest: false}); +fs.writeFileSync(path.join(htmlFolder, 'shared', 'wizard-spell-template.html'), spellTemplate); +spellTemplate = pug.renderFile(path.join(pugFolder, 'spellTemplate.pug'), {pretty: true, isPriest: true}); +fs.writeFileSync(path.join(htmlFolder, 'shared', 'priest-spell-template.html'), spellTemplate); + const wizardSpells = require(path.join(jsFolder, 'wizardSpells.js')); const priestSpells = require(path.join(jsFolder, 'priestSpells.js')); html += pug.renderFile(path.join(pugFolder, 'spellScrollsDatalists.pug'), {pretty: true, wizardSpells, priestSpells}); @@ -96,5 +101,5 @@ simpleDatalists.forEach(simpleDatalist => { html += pug.renderFile(path.join(pugFolder, 'simpleDatalists.pug'), {pretty: true, data: data, id:simpleDatalist[1]}) }); -fs.writeFileSync(path.join(htmlFolder, 'dynamicDatalists.html'), html); +fs.writeFileSync(path.join(htmlFolder, 'components', 'dynamicDatalists.html'), html); console.log(''); \ No newline at end of file diff --git a/ADnD_2E_Revised/css/2EStyle-base.css b/ADnD_2E_Revised/css/2EStyle-base.css index 2c1a0a9221..9b827e7cb2 100644 --- a/ADnD_2E_Revised/css/2EStyle-base.css +++ b/ADnD_2E_Revised/css/2EStyle-base.css @@ -1,10 +1,3 @@ -input, -button, -select, -textarea { - background-color: white; -} - .charsheet input { display: inline-block; width: 165px; @@ -52,12 +45,10 @@ textarea { .charsheet input.sheet-madtext { width: 79px; } -.charsheet select.sheet-spell-select, .charsheet select.sheet-attr, .charsheet input.sheet-attr { width: 80px; } -.charsheet select.sheet-spell-select-min, .charsheet select.sheet-attr-min, .charsheet input.sheet-attr-min { min-width: 80px; @@ -155,10 +146,6 @@ textarea { .charsheet input.sheet-nonweaponprof { width: 260px; } -.charsheet select.sheet-spell-big, -.charsheet input.sheet-spell-big { - width: 295px; -} .charsheet select.sheet-long, .charsheet input.sheet-long { width: 400px; @@ -201,10 +188,24 @@ textarea { box-sizing: border-box; } +.charsheet select.sheet-table-dynamic { + margin: 0; +} + .charsheet input.sheet-table-dynamic90 { min-width: 90%; } +.charsheet th.sheet-td-dynamic20, +.charsheet td.sheet-td-dynamic20 { + width: 20%; +} + +.charsheet th.sheet-td-dynamic25, +.charsheet td.sheet-td-dynamic25 { + width: 25%; +} + .charsheet th.sheet-td-dynamic30, .charsheet td.sheet-td-dynamic30 { width: 30%; @@ -215,6 +216,11 @@ textarea { width: 50%; } +.charsheet th.sheet-td-dynamic60, +.charsheet td.sheet-td-dynamic60 { + width: 60%; +} + .charsheet th.sheet-td-dynamic70, .charsheet td.sheet-td-dynamic70 { width: 70%; @@ -225,36 +231,6 @@ textarea { width: 100%; } -.charsheet select.sheet-table-dynamic { - margin: 0; -} - -.charsheet input[type="number"].sheet-tiny { - width: 23px; -} -input[type="number"].sheet-tiny::-webkit-inner-spin-button { - -webkit-appearance: none; -} -input[type="number"].sheet-nobut::-webkit-inner-spin-button { - -webkit-appearance: none; -} - -input.sheet-arrow -{ - float: left; -} - -input.sheet-arrow:checked ~ div.sheet-body -{ - display: none; -} - -.charsheet input[type="checkbox"].left { - float: left; - margin: 5px 0; - width: 2px; -} - input.sheet-tab:not(:first-child)::before { border-left: none; @@ -316,106 +292,103 @@ textarea.sheet-input-like { content: "✓"; } -div[class^="sheet-section"] { +.charsheet input.sheet-tab1:checked ~ .sheet-section-character-page, +.charsheet input.sheet-tab2:checked ~ .sheet-section-monster-page, +.charsheet input.sheet-tab3:checked ~ .sheet-section-character-info, +.charsheet input.sheet-tab4:checked ~ .sheet-section-attributes, +.charsheet input.sheet-tab5:checked ~ .sheet-section-weapons, +.charsheet input.sheet-tab6:checked ~ .sheet-section-rogue, +.charsheet input.sheet-tab7:checked ~ .sheet-section-proficiencies, +.charsheet input.sheet-tab8:checked ~ .sheet-section-spells, +.charsheet input.sheet-tab9:checked ~ .sheet-section-psionics, +.charsheet input.sheet-tab10:checked ~ .sheet-section-equipment, +.charsheet input.sheet-tab11:checked ~ .sheet-section-currency, +.charsheet input.sheet-tab12:checked ~ .sheet-section-followers, +.charsheet input.sheet-tab14:checked ~ .sheet-section-ravenloft-saves, +.charsheet input.sheet-tab15:checked ~ .sheet-section-movement-standard, +.charsheet input.sheet-tab16:checked ~ .sheet-section-movement-advanced, +.charsheet input.sheet-tab17:checked ~ .sheet-section-attributes-standard, +.charsheet input.sheet-tab18:checked ~ .sheet-section-attributes-player-option, +.charsheet input.sheet-tab19:checked ~ .sheet-section-wizard-spells, +.charsheet input.sheet-tab20:checked ~ .sheet-section-priest-spells, +.charsheet input.sheet-tab21:checked ~ .sheet-section-wizard-level-one, +.charsheet input.sheet-tab22:checked ~ .sheet-section-wizard-level-two, +.charsheet input.sheet-tab23:checked ~ .sheet-section-wizard-level-three, +.charsheet input.sheet-tab24:checked ~ .sheet-section-wizard-level-four, +.charsheet input.sheet-tab25:checked ~ .sheet-section-wizard-level-five, +.charsheet input.sheet-tab26:checked ~ .sheet-section-wizard-level-six, +.charsheet input.sheet-tab27:checked ~ .sheet-section-wizard-level-seven, +.charsheet input.sheet-tab28:checked ~ .sheet-section-wizard-level-eight, +.charsheet input.sheet-tab29:checked ~ .sheet-section-wizard-level-nine, +.charsheet input.sheet-tab30:checked ~ .sheet-section-wizard-level-ten, +.charsheet input.sheet-tab31:checked ~ .sheet-section-priest-level-one, +.charsheet input.sheet-tab32:checked ~ .sheet-section-priest-level-two, +.charsheet input.sheet-tab33:checked ~ .sheet-section-priest-level-three, +.charsheet input.sheet-tab34:checked ~ .sheet-section-priest-level-four, +.charsheet input.sheet-tab35:checked ~ .sheet-section-priest-level-five, +.charsheet input.sheet-tab36:checked ~ .sheet-section-priest-level-six, +.charsheet input.sheet-tab37:checked ~ .sheet-section-priest-level-seven, +.charsheet input.sheet-tab31:checked ~ div .sheet-section-priest-level-one, +.charsheet input.sheet-tab32:checked ~ div .sheet-section-priest-level-two, +.charsheet input.sheet-tab33:checked ~ div .sheet-section-priest-level-three, +.charsheet input.sheet-tab34:checked ~ div .sheet-section-priest-level-four, +.charsheet input.sheet-tab35:checked ~ div .sheet-section-priest-level-five, +.charsheet input.sheet-tab36:checked ~ div .sheet-section-priest-level-six, +.charsheet input.sheet-tab37:checked ~ div .sheet-section-priest-level-seven, +.charsheet input.sheet-tab38:checked ~ .sheet-section-priest-quest, +.charsheet input.sheet-tab39:checked ~ .sheet-section-rogue-standard, +.charsheet input.sheet-tab40:checked ~ .sheet-section-psionic-standard, +.charsheet input.sheet-tab41:checked ~ .sheet-section-psionic-advanced, +.charsheet input.sheet-tab42:checked ~ .sheet-section-currency-standard, +.charsheet input.sheet-tab43:checked ~ .sheet-section-currency-dragonlance, +.charsheet input.sheet-tab44:checked ~ .sheet-section-currency-dark-sun, +.charsheet input.sheet-tab45:checked ~ .sheet-section-currency-ravenloft, +.charsheet input.sheet-tab46:checked ~ .sheet-section-follower-warrior, +.charsheet input.sheet-tab47:checked ~ .sheet-section-follower-wizard, +.charsheet input.sheet-tab48:checked ~ .sheet-section-follower-priest, +.charsheet input.sheet-tab49:checked ~ .sheet-section-follower-rogue, +.charsheet input.sheet-tab50:checked ~ .sheet-section-follower-psion, +.charsheet input.sheet-tab51:checked ~ .sheet-section-follower-animals, +.charsheet input.sheet-tab52:checked ~ .sheet-section-priest-turn, +.charsheet input.sheet-tab53:checked ~ .sheet-section-journal, +.charsheet input.sheet-tab54:checked ~ .sheet-section-wizard-level-eleven, +.charsheet input.sheet-tab55:checked ~ .sheet-section-wizard-level-twelve, +.charsheet input.sheet-tab56:checked ~ .sheet-section-wizard-level-thirteen, +.charsheet input.sheet-tab57:checked ~ .sheet-section-wizard-level-fourteen, +.charsheet input.sheet-tab58:checked ~ .sheet-section-wizard-level-fifteen, +.charsheet input.sheet-tab59:checked ~ .sheet-section-currency-maztica, +.charsheet input.sheet-tab60:checked ~ .sheet-section-rogue-spds, +.charsheet input.sheet-tab61:checked ~ .sheet-section-rogue-standard-hench, +.charsheet input.sheet-tab62:checked ~ .sheet-section-rogue-spds-hench, +.charsheet input.sheet-tab63:checked ~ .sheet-section-rogue-standard-repeat, +.charsheet input.sheet-tab64:checked ~ .sheet-section-rogue-spds-repeat, +.charsheet input.sheet-tab65:checked ~ .sheet-section-psionics-standard-hench, +.charsheet input.sheet-tab66:checked ~ .sheet-section-psionics-advanced-hench, +.charsheet input.sheet-tab67:checked ~ .sheet-section-psionics-standard-repeat, +.charsheet input.sheet-tab68:checked ~ .sheet-section-psionics-advanced-repeat, +.charsheet input.sheet-tab69:checked ~ .sheet-section-granted-powers, +.charsheet input.sheet-tab70:checked ~ .sheet-section-weapon-standard-melee, +.charsheet input.sheet-tab71:checked ~ .sheet-section-weapon-standard-ranged, +.charsheet input.sheet-tab72:checked ~ .sheet-section-movement-mount, +.charsheet input.sheet-tab73:checked ~ .sheet-section-character-info-details, +.charsheet input.sheet-tab74:checked ~ .sheet-section-character-info-tracker, +.charsheet input.sheet-tab75:checked ~ .sheet-section-currency-birthright, +.charsheet input.sheet-tab76:checked ~ .sheet-section-birthright, +.charsheet input.sheet-tab77:checked ~ .sheet-section-movement-barbarian, +.charsheet input.sheet-tab79:checked ~ .sheet-section-movement-swimming, +.charsheet input.sheet-tab80:checked ~ .sheet-section-movement-flying, +.charsheet input.sheet-tab81:checked ~ .sheet-section-weapon-standard, +.charsheet input.sheet-tab82:checked ~ .sheet-section-weapon-player-option, +.charsheet input.sheet-tab83:checked ~ .sheet-section-weapon-player-option-melee, +.charsheet input.sheet-tab84:checked ~ .sheet-section-weapon-player-option-ranged, +.charsheet input.sheet-tab85:checked ~ .sheet-section-settings-page { display: block; } -.charsheet input.sheet-tab1:checked ~ div.sheet-section-character-page, -.charsheet input.sheet-tab2:checked ~ div.sheet-section-monster-page, -.charsheet input.sheet-tab3:checked ~ div.sheet-section-character-info, -.charsheet input.sheet-tab4:checked ~ div.sheet-section-attributes, -.charsheet input.sheet-tab5:checked ~ div.sheet-section-weapons, -.charsheet input.sheet-tab6:checked ~ div.sheet-section-rogue, -.charsheet input.sheet-tab7:checked ~ div.sheet-section-proficiencies, -.charsheet input.sheet-tab8:checked ~ div.sheet-section-spells, -.charsheet input.sheet-tab9:checked ~ div.sheet-section-psionics, -.charsheet input.sheet-tab10:checked ~ div.sheet-section-equipment, -.charsheet input.sheet-tab11:checked ~ div.sheet-section-currency, -.charsheet input.sheet-tab12:checked ~ div.sheet-section-followers, -.charsheet input.sheet-tab13:checked ~ div.sheet-section-standard-saves, -.charsheet input.sheet-tab14:checked ~ div.sheet-section-ravenloft-saves, -.charsheet input.sheet-tab15:checked ~ div.sheet-section-movement-standard, -.charsheet input.sheet-tab16:checked ~ div.sheet-section-movement-advanced, -.charsheet input.sheet-tab17:checked ~ div.sheet-section-attributes-standard, -.charsheet input.sheet-tab18:checked ~ div.sheet-section-attributes-player-option, -.charsheet input.sheet-tab19:checked ~ div.sheet-section-wizard-spells, -.charsheet input.sheet-tab20:checked ~ div.sheet-section-priest-spells, -.charsheet input.sheet-tab21:checked ~ div.sheet-section-wizard-level-one, -.charsheet input.sheet-tab22:checked ~ div.sheet-section-wizard-level-two, -.charsheet input.sheet-tab23:checked ~ div.sheet-section-wizard-level-three, -.charsheet input.sheet-tab24:checked ~ div.sheet-section-wizard-level-four, -.charsheet input.sheet-tab25:checked ~ div.sheet-section-wizard-level-five, -.charsheet input.sheet-tab26:checked ~ div.sheet-section-wizard-level-six, -.charsheet input.sheet-tab27:checked ~ div.sheet-section-wizard-level-seven, -.charsheet input.sheet-tab28:checked ~ div.sheet-section-wizard-level-eight, -.charsheet input.sheet-tab29:checked ~ div.sheet-section-wizard-level-nine, -.charsheet input.sheet-tab30:checked ~ div.sheet-section-wizard-level-ten, -.charsheet input.sheet-tab31:checked ~ div.sheet-section-priest-level-one, -.charsheet input.sheet-tab32:checked ~ div.sheet-section-priest-level-two, -.charsheet input.sheet-tab33:checked ~ div.sheet-section-priest-level-three, -.charsheet input.sheet-tab34:checked ~ div.sheet-section-priest-level-four, -.charsheet input.sheet-tab35:checked ~ div.sheet-section-priest-level-five, -.charsheet input.sheet-tab36:checked ~ div.sheet-section-priest-level-six, -.charsheet input.sheet-tab37:checked ~ div.sheet-section-priest-level-seven, -.charsheet input.sheet-tab38:checked ~ div.sheet-section-priest-quest, -.charsheet input.sheet-tab39:checked ~ div.sheet-section-rogue-standard, -.charsheet input.sheet-tab40:checked ~ div.sheet-section-psionic-standard, -.charsheet input.sheet-tab41:checked ~ div.sheet-section-psionic-advanced, -.charsheet input.sheet-tab42:checked ~ div.sheet-section-currency-standard, -.charsheet input.sheet-tab43:checked ~ div.sheet-section-currency-dragonlance, -.charsheet input.sheet-tab44:checked ~ div.sheet-section-currency-dark-sun, -.charsheet input.sheet-tab45:checked ~ div.sheet-section-currency-ravenloft, -.charsheet input.sheet-tab46:checked ~ div.sheet-section-follower-warrior, -.charsheet input.sheet-tab47:checked ~ div.sheet-section-follower-wizard, -.charsheet input.sheet-tab48:checked ~ div.sheet-section-follower-priest, -.charsheet input.sheet-tab49:checked ~ div.sheet-section-follower-rogue, -.charsheet input.sheet-tab50:checked ~ div.sheet-section-follower-psion, -.charsheet input.sheet-tab51:checked ~ div.sheet-section-follower-animals, -.charsheet input.sheet-tab52:checked ~ div.sheet-section-priest-turn, -.charsheet input.sheet-tab53:checked ~ div.sheet-section-journal, -.charsheet input.sheet-tab54:checked ~ div.sheet-section-wizard-level-eleven, -.charsheet input.sheet-tab55:checked ~ div.sheet-section-wizard-level-twelve, -.charsheet input.sheet-tab56:checked ~ div.sheet-section-wizard-level-thirteen, -.charsheet input.sheet-tab57:checked ~ div.sheet-section-wizard-level-fourteen, -.charsheet input.sheet-tab58:checked ~ div.sheet-section-wizard-level-fifteen, -.charsheet input.sheet-tab59:checked ~ div.sheet-section-currency-maztica, -.charsheet input.sheet-tab60:checked ~ div.sheet-section-rogue-spds, -.charsheet input.sheet-tab61:checked ~ div.sheet-section-rogue-standard-hench, -.charsheet input.sheet-tab62:checked ~ div.sheet-section-rogue-spds-hench, -.charsheet input.sheet-tab63:checked ~ div.sheet-section-rogue-standard-repeat, -.charsheet input.sheet-tab64:checked ~ div.sheet-section-rogue-spds-repeat, -.charsheet input.sheet-tab65:checked ~ div.sheet-section-psionics-standard-hench, -.charsheet input.sheet-tab66:checked ~ div.sheet-section-psionics-advanced-hench, -.charsheet input.sheet-tab67:checked ~ div.sheet-section-psionics-standard-repeat, -.charsheet input.sheet-tab68:checked ~ div.sheet-section-psionics-advanced-repeat, -.charsheet input.sheet-tab69:checked ~ div.sheet-section-granted-powers, -.charsheet input.sheet-tab70:checked ~ div.sheet-section-weapon-standard-melee, -.charsheet input.sheet-tab71:checked ~ div.sheet-section-weapon-standard-ranged, -.charsheet input.sheet-tab72:checked ~ div.sheet-section-movement-mount, -.charsheet input.sheet-tab73:checked ~ div.sheet-section-character-info-details, -.charsheet input.sheet-tab74:checked ~ div.sheet-section-character-info-tracker, -.charsheet input.sheet-tab75:checked ~ div.sheet-section-currency-birthright, -.charsheet input.sheet-tab76:checked ~ div.sheet-section-birthright, -.charsheet input.sheet-tab77:checked ~ div.sheet-section-movement-barbarian, -.charsheet input.sheet-tab78:checked ~ div.sheet-section-attributes-dream, -.charsheet input.sheet-tab79:checked ~ div.sheet-section-movement-swimming, -.charsheet input.sheet-tab80:checked ~ div.sheet-section-movement-flying, -.charsheet input.sheet-tab81:checked ~ div.sheet-section-weapon-standard, -.charsheet input.sheet-tab82:checked ~ div.sheet-section-weapon-player-option, -.charsheet input.sheet-tab83:checked ~ div.sheet-section-weapon-player-option-melee, -.charsheet input.sheet-tab84:checked ~ div.sheet-section-weapon-player-option-ranged, -.charsheet input.sheet-tab85:checked ~ div.sheet-section-settings-page { - display: block; -} - -.charsheet input.sheet-tab99:checked ~ div[class^="sheet-section"] { - display: block; -} - .charsheet input.sheet-tab { width: 120px; height: inherit; - cursor: pointer; + cursor: pointer; position: relative; opacity: 0; z-index: 9999; @@ -423,16 +396,16 @@ div[class^="sheet-section"] { .charsheet span.sheet-tab { text-align: center; - display: inline-block; - font-size: 14px; - background: #800a0a; + display: inline-block; + font-size: 14px; + background: #800a0a; color: white; font-weight: bold; border-radius: 4px; width: 120px; height: inherit; - cursor: pointer; + cursor: pointer; position: relative; } @@ -549,7 +522,6 @@ div[class^="sheet-section"] { cursor: pointer; z-index: 1; } -input.sheet-tab + span::before, input.sheet-tab + span::before { margin-right: 4px; @@ -580,11 +552,6 @@ input.sheet-tab + span::before padding: 0 0 0 0; } -/* Dark Mode override */ -.sheet-darkmode .charsheet label { - color: #333; -} - .charsheet h1, .charsheet h2, .charsheet h3, @@ -594,285 +561,11 @@ input.sheet-tab + span::before font-weight: 800; } -/*h2,h3,h4,h5,h6 {*/ -/* line-height:1em;*/ -/* display:inline;*/ -/* font-family: Arial, sans-serif;*/ -/* font-size:.8125rem;*/ -/* color: #000;*/ -/*}*/ - - -/*h1 {*/ -/* width: 100%;*/ -/* background-color: #FFF;*/ -/* color: #000;*/ -/* padding:.2em 0 0 0;*/ -/* min-height: 1em;*/ -/* margin: 0 0 .5em 0;*/ -/* font-size:.8125rem;*/ -/* line-height:1.4em;*/ -/* display:block;*/ -/* text-align:center;*/ -/*}*/ - -.sheet-small-label1 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 72px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label1 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label1 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label1 select { - margin-top:-2px; - width: 72px; - border: .5px; -} -.sheet-small-label2 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 63px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label2 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label2 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label2 select { - margin-top:-2px; - width: 63px; - border: .5px; -} -.sheet-small-label3 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 85px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label3 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label3 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label3 select { - margin-top:-2px; - width: 85px; - border: .5px; -} -.sheet-small-label4 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 67px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label4 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label4 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label4 select { - margin-top:-2px; - width: 67px; - border: .5px; -} -.sheet-small-label5 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 105px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label5 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label5 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label5 select { - margin-top:-2px; - width: 105px; - border: .5px; -} -.sheet-small-label6 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 75px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label6 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label6 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label6 select { - margin-top:-2px; - width: 75px; - border: .5px; -} -.sheet-small-label7 { - display: inline-block; - padding: .5em .07em 0 .07em; - margin: .75rem .4em 1.125rem .4em; - height: 1.85em; - width: 125px; - vertical-align: middle; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} - -.sheet-small-label7 span { - padding: .5em .07em 0 .07em; - text-align:center; - font-size: .85em; - font-style: italic; - font-weight: bold; - float:left; /* floats but 100% wide. */ - /*firefox has to be squeezed */ - -moz-margin-start:-2px; - -moz-margin-end:-2px; -} -.sheet-small-label7 input::-moz-focus-inner { - padding: 0; -} -.sheet-small-label7 select { - margin-top:-2px; - width: 125px; - border: .5px; -} - -button { - background-color: #7C0303; -} - .charsheet, .charsheet button:hover { background-image: url("https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/ADnD_2E_Revised/img/background-parchment_paper_seamless_pattern.jpg"); } -insert_rolltemplates.css - .sheet-inline, .sheet-inline-5 { display: inline-block; @@ -890,7 +583,9 @@ table.sheet-default-header-every-third-row tr:nth-child(3n+1), table.sheet-default-header-first-column td:first-child, table.sheet-default-header-first-column th:first-child, table.sheet-default-header-even-column td:nth-child(even), +table.sheet-default-header-even-column th:nth-child(even), table.sheet-default-header-odd-column td:nth-child(odd), +table.sheet-default-header-odd-column th:nth-child(odd), table.sheet-default-header-every-third-column td:nth-child(3n+1), .sheet-default-header { background-color: #7C0303; @@ -965,6 +660,22 @@ table.sheet-padding-right-column2 td:nth-child(2) { padding-right: 5px; } +.sheet-table-nowrap th, +.sheet-table-nowrap td, +.sheet-table-nowrap-column1 th:nth-child(1), +.sheet-table-nowrap-column1 td:nth-child(1), +.sheet-table-nowrap-column2 th:nth-child(2), +.sheet-table-nowrap-column2 td:nth-child(2) { + white-space: nowrap; +} + +.sheet-table-full-width-column1 th:nth-child(1), +.sheet-table-full-width-column1 td:nth-child(1), +.sheet-table-full-width-column2 th:nth-child(2), +.sheet-table-full-width-column2 td:nth-child(2) { + width: 100%; +} + .sheet-table-white { color: #FFF; font-family: Arial, sans-serif; @@ -999,10 +710,26 @@ table.sheet-padding-right-column2 td:nth-child(2) { flex-direction: column; } -.sheet-flex-wrap .repcontainer { +.sheet-spell-line { display: flex; - flex-wrap: wrap; - justify-content: space-around; + align-items: flex-end; + justify-content: space-between; + column-gap: 5px; +} + +.sheet-spell-fold { + display: flex; + justify-content: space-between; + column-gap: 10px; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; +} + +.charsheet .sheet-spell-effect { + height: unset; + resize: vertical; + margin-bottom: 0; } .charsheet label input[type="radio"], @@ -1027,6 +754,7 @@ th { padding-left: inherit; } +/* Show hide styling */ .sheet-collapse { visibility: collapse; } @@ -1034,20 +762,22 @@ th { .sheet-hidden { display: none; } -.sheet-hidden.sheet-show { + +.sheet-hidden.sheet-show, +input.sheet-show-worn-equipment:checked ~ .sheet-hidden, +input.sheet-show-spell-slots:checked ~ .sheet-tab-content .sheet-spell-slots.sheet-hidden, +input.sheet-show-spell-points:checked ~ .sheet-tab-content .sheet-spell-points.sheet-hidden, +input.sheet-show-spell-arcs-winds:checked ~ .sheet-tab-content .sheet-spell-arcs-winds.sheet-hidden, +input.sheet-show-spell-spheres-pri:checked ~ .sheet-spell-sphere-pri.sheet-hidden { display: revert; } + .btn.sheet-hidden { padding-top: 2px; padding-left: 8px; padding-right: 8px; } -div.repcontainer:not(.editmode) div.repitem td button[type="action"], -div.repcontainer:not(.editmode) div.repitem th button[type="action"] { - position: relative; -} - div.repcontainer div.repitem:first-child td.sheet-show-first, div.repcontainer div.repitem:first-child tr.sheet-show-first, div.repcontainer div.repitem:first-child th.sheet-show-first, @@ -1055,66 +785,6 @@ div.repcontainer div.repitem:first-child thead.sheet-show-first { visibility: visible; } -.sheet-show-spell-hack { - position: relative; - top: -11px; -} - -.sheet-spell-effect { - width: 100%; - position: relative; - top: -5px; -} - -input.sheet-show-spell-details:checked ~ .sheet-spell-effect { - top: 0; -} - -table.sheet-spell-details { - visibility: collapse; -} -input.sheet-show-spell-details:checked ~ table.sheet-spell-details { - visibility: visible; - margin-top: -5px; -} - -div.sheet-spell-details { - display: none; -} -input.sheet-show-spell-details:checked ~ div.sheet-spell-details { - display: flex; -} - -.sheet-underline { - text-decoration: underline; - font-weight: bolder; -} - -/* Overwrite Roll20 base styling */ -details > summary:first-of-type { - display: list-item; -} - -/* Show hide styling */ -.sheet-worn-equipment, -.sheet-spell-points-wiz, -.sheet-spell-points-pri, -.sheet-spell-sphere-pri, -.sheet-announcement, -.sheet-toast { - display: none; -} - -input.sheet-show-worn-equipment:checked ~ .sheet-worn-equipment, -input.sheet-show-spell-points-wiz:checked ~ .sheet-spell-points-wiz, -input.sheet-show-spell-points-pri:checked ~ .sheet-spell-points-pri, -input.sheet-show-spell-spheres-pri:checked ~ .sheet-spell-sphere-pri, -input.sheet-show-announcement:checked ~ .sheet-announcement, -input.sheet-show-toast:checked ~ .sheet-toast -{ - display: block; -} - .sheet-action-button, .sheet-action-button-roll { height: 19px; @@ -1128,49 +798,8 @@ input.sheet-show-toast:checked ~ .sheet-toast content: "t"; } -/* Announcement styling start */ -div.sheet-announcement { - width: 95%; - margin: 5px; - border: 3px solid #ff0000; - border-radius: 8px; - padding: 8px; - background: #ababab; - box-sizing: border-box; -} - -.sheet-selectable { - font-style: italic; - font-weight: bold; - color: #181E72; - -webkit-user-select: all; /* Chrome all / Safari all */ - -moz-user-select: all; /* Firefox all */ - -ms-user-select: all; /* IE 10+ */ - user-select: all; /* Likely future */ -} - -img.expandable { - transition:transform 0.25s ease; -} - -img.expandable:hover { - -webkit-transform:scale(3); /* or some other value */ - transform:scale(3); -} -/* Announcement styling end */ - -/* Firefox styling */ -@supports (-moz-appearance:none) { - .charsheet .sheet-chrome { - display: none; - } -} - -/* Not Firefox styling */ -@supports not (-moz-appearance:none) { - .charsheet .sheet-firefox { - display: none; - } -} - +insert_announcements.css insert_toast.css +insert_browser-support.css +insert_rolltemplates.css +insert_roll20-overrides.css diff --git a/ADnD_2E_Revised/css/announcements.css b/ADnD_2E_Revised/css/announcements.css new file mode 100644 index 0000000000..839684986d --- /dev/null +++ b/ADnD_2E_Revised/css/announcements.css @@ -0,0 +1,34 @@ +/*#region Announcement styling start */ +input.sheet-show-announcement:checked ~ .sheet-hidden { + display: revert; +} + +div.sheet-announcement { + width: 95%; + margin: 5px; + border: 3px solid #ff0000; + border-radius: 8px; + padding: 8px; + background: #ababab; + box-sizing: border-box; +} + +.sheet-selectable { + font-style: italic; + font-weight: bold; + color: #181E72; + -webkit-user-select: all; /* Chrome all / Safari all */ + -moz-user-select: all; /* Firefox all */ + -ms-user-select: all; /* IE 10+ */ + user-select: all; /* Likely future */ +} + +img.expandable { + transition:transform 0.25s ease; +} + +img.expandable:hover { + -webkit-transform:scale(3); /* or some other value */ + transform:scale(3); +} +/*#endregion Announcement styling end */ diff --git a/ADnD_2E_Revised/css/browser-support.css b/ADnD_2E_Revised/css/browser-support.css new file mode 100644 index 0000000000..1fae634aed --- /dev/null +++ b/ADnD_2E_Revised/css/browser-support.css @@ -0,0 +1,21 @@ +/* Firefox styling */ +@supports (-moz-appearance:none) { + .charsheet .sheet-chrome { + display: none; + } + + input[type="number"] { + -moz-appearance: textfield; + } + input[type="number"]:hover, + input[type="number"]:focus { + -moz-appearance: revert; + } +} + +/* Not Firefox styling */ +@supports not (-moz-appearance:none) { + .charsheet .sheet-firefox { + display: none; + } +} diff --git a/ADnD_2E_Revised/css/roll20-overrides.css b/ADnD_2E_Revised/css/roll20-overrides.css new file mode 100644 index 0000000000..97e51c521f --- /dev/null +++ b/ADnD_2E_Revised/css/roll20-overrides.css @@ -0,0 +1,23 @@ +/* Overwrite Roll20 base styling */ +details > summary:first-of-type { + display: list-item; +} + +/* Fix action buttons in repeating tables */ +div.repcontainer:not(.editmode) div.repitem td button[type="action"], +div.repcontainer:not(.editmode) div.repitem th button[type="action"] { + position: relative; +} + +/* Dark Mode override */ +.sheet-darkmode .charsheet label { + color: #333; +} + +/* Fix background color so active fields can be differentiated from read-only and disabled fields */ +input, +button, +select, +textarea { + background-color: white; +} diff --git a/ADnD_2E_Revised/css/toast.css b/ADnD_2E_Revised/css/toast.css index 23be582b90..437987d9b9 100644 --- a/ADnD_2E_Revised/css/toast.css +++ b/ADnD_2E_Revised/css/toast.css @@ -1,4 +1,7 @@ /*#region Toast styling*/ +input.sheet-show-toast:checked + .sheet-hidden { + display: revert; +} .sheet-toast { position: fixed; right: 30px; diff --git a/ADnD_2E_Revised/futureIdeas.txt b/ADnD_2E_Revised/futureIdeas.txt index 41292df675..fb12fc09c2 100644 --- a/ADnD_2E_Revised/futureIdeas.txt +++ b/ADnD_2E_Revised/futureIdeas.txt @@ -1,20 +1,4 @@ -Possible NPC sheet -- Follower sheet -- Add top level button to jump directly to the Follower sheet -- More detailed weapons and such for npcs -- Remove repeating NPC sections? - -- Structured spell book, which fields for total pages, pages used, and remaining pages. --- Multiple spell books --- A roll button for the number of pages needed --- A roll button for the number of days to write it into the book - -- Armor Class detailed breakdown -- Armor class Slashing/Piercing/Bludgeoning - -Follower classes - -AD&D 2E Book release order +AD&D 2E Book release order The Complete Fighter's Handbook 1989 December The Complete Thief's Handbook 1989 December The Complete Priest's Handbook 1990 May @@ -271,4 +255,4 @@ http://www.wizards.com/dnd/DnDDMGErrata.asp http://www.wizards.com/dnd/DnDPlayersOptionSkillsPowersErrata.asp http://www.wizards.com/dnd/DnDPlayersOptionSkillsPowers2ndErrata.asp http://www.wizards.com/dnd/DnDPlayersOptionSkillsPowers3rdErrata.asp -http://www.wizards.com/dnd/DnDPlayersOptionCombatTacticsErrata.asp \ No newline at end of file +http://www.wizards.com/dnd/DnDPlayersOptionCombatTacticsErrata.asp diff --git a/ADnD_2E_Revised/html/2ESheet-base.html b/ADnD_2E_Revised/html/2ESheet-base.html index 8d0582f721..c804ae9533 100644 --- a/ADnD_2E_Revised/html/2ESheet-base.html +++ b/ADnD_2E_Revised/html/2ESheet-base.html @@ -12,9 +12,14 @@ insert_changelog.html

+ + + + + insert_character-tab.html insert_monster-tab.html -insert_sheet-settings.html +insert_sheet-settings-tab.html insert_toast.html diff --git a/ADnD_2E_Revised/html/changelog.html b/ADnD_2E_Revised/html/changelog.html index 137826fec8..39391556ec 100644 --- a/ADnD_2E_Revised/html/changelog.html +++ b/ADnD_2E_Revised/html/changelog.html @@ -1,17 +1,27 @@
Announcements -
+

Changes in

    -
  • Fixed autofill for simple magic weapons where the bonus is inserted in a spot without a whitespace. Here are some examples that have been fixed: +
  • Completely redesigned the new spell section, so each spell can be on a single line, showing Name, Range, and Area of Effect
      -
    • "Short bow, Flight Arrow" -> "Short bow +1, Flight Arrow"
    • -
    • "Bastard sword, One-handed" -> "Bastard sword +2, One-handed"
    • -
    • "Katana, One-handed (samurai long sword)" -> "Katana +1, One-handed (samurai long sword)"
    • -
    • "Sling, Bullet" -> "Sling +1, Bullet"
    • +
    • Single line spells can be folded out to show additional information of the spells
    • +
    • Removed the "Roll Spell Effect" button as it caused more confusion than it helped
  • +
  • Added Spell tracking selection to the Sheet Settings Tab. Choices are: Spell Slots, Spell Points, Arcs / Winds
  • +
  • Redesigned the Spells tab to only show the spell tracking system that selected on the Sheet Settings Tab
  • +
  • High Wisdom now triggers a popup asking if you are a priest. Bonus spells are only added if you are a priest
  • +
  • High Wisdom now autofill bonus Winds for Priests for the Arcs/Winds spell tracking system, based on the same popup as stated above. If the PO: S&P sub ability scores are used, base Wisdom is still used for determining bonus winds
  • +
  • Added support for automatic Spell Points for Wizards with high Intelligence. This is a toggle as the bonus is optional.
  • +
  • Added support for automatic Spell Points for Priests with high Wisdom. This is a toggle as only priests gets this bonus, and not Paladins and Rangers. The Priest caster level is used to determine how many spell points should be given
  • +
  • Fixed bonus spells from high Intuition from PO: Skills & Powers. Willpower was incorrectly used
  • +
  • Regeneration from high Constitution now clarifies that it is per turn(s)
  • +
  • Only show up and down arrows on numeric input fields in Firefox on hover or focus
  • +
  • Styled Monster tab to have dynamically sized fields, and larger fields for Hit Dice, HP, and Max HP
  • +
  • Updated saving throws to tell how much the check was made or missed by
  • +
  • 2Espell - Sensory signature and Knockdown switched places to make them appear in the same order as in the PO: Spells & Magic book

diff --git a/ADnD_2E_Revised/html/components/fold-button.html b/ADnD_2E_Revised/html/components/fold-button.html new file mode 100644 index 0000000000..2343a2cd89 --- /dev/null +++ b/ADnD_2E_Revised/html/components/fold-button.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ADnD_2E_Revised/html/components/rolltemplates.html b/ADnD_2E_Revised/html/components/rolltemplates.html index 129c3913a5..690ace0091 100644 --- a/ADnD_2E_Revised/html/components/rolltemplates.html +++ b/ADnD_2E_Revised/html/components/rolltemplates.html @@ -138,49 +138,49 @@ Saving Throw
{{save}} {{#subtlety}} - {{#sensory}} + {{#knockdown}} Casting Subtlety
{{subtlety}} - Sensory Signature
{{sensory}} + Knockdown
{{knockdown}} - {{/sensory}} + {{/knockdown}} {{/subtlety}} {{#subtlety}} - {{^sensory}} + {{^knockdown}} Casting Subtlety
{{subtlety}} - {{/sensory}} + {{/knockdown}} {{/subtlety}} {{^subtlety}} - {{#sensory}} - - Sensory Signature
{{sensory}} - - {{/sensory}} - {{/subtlety}} {{#knockdown}} - {{#crit}} - - Knockdown
{{knockdown}} - Critical Strikes
{{crit}} - - {{/crit}} - {{/knockdown}} - {{#knockdown}} - {{^crit}} Knockdown
{{knockdown}} - {{/crit}} {{/knockdown}} - {{^knockdown}} + {{/subtlety}} + {{#sensory}} + {{#crit}} + + Sensory Signature
{{sensory}} + Critical Strikes
{{crit}} + + {{/crit}} + {{/sensory}} + {{#sensory}} + {{^crit}} + + Sensory Signature
{{sensory}} + + {{/crit}} + {{/sensory}} + {{^sensory}} {{#crit}} Critical Strikes
{{crit}} {{/crit}} - {{/knockdown}} + {{/sensory}} {{#damage}} Damage: diff --git a/ADnD_2E_Revised/html/shared/priest-spell-template.html b/ADnD_2E_Revised/html/shared/priest-spell-template.html index 0306860003..687835af64 100644 --- a/ADnD_2E_Revised/html/shared/priest-spell-template.html +++ b/ADnD_2E_Revised/html/shared/priest-spell-template.html @@ -1,92 +1,161 @@ -

-
-
- - - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Wind Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sphere: - - - School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
\ No newline at end of file + +
+
+ + + + + + + + + + + + + + + insert_fold-button.html + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Winds Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
\ No newline at end of file diff --git a/ADnD_2E_Revised/html/shared/saving-throws.html b/ADnD_2E_Revised/html/shared/saving-throws.html index 7f88cf4f41..ea2fd8a5a1 100644 --- a/ADnD_2E_Revised/html/shared/saving-throws.html +++ b/ADnD_2E_Revised/html/shared/saving-throws.html @@ -1,15 +1,15 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/ADnD_2E_Revised/html/shared/wizard-spell-template.html b/ADnD_2E_Revised/html/shared/wizard-spell-template.html index d91ab24b1e..05ee976b91 100644 --- a/ADnD_2E_Revised/html/shared/wizard-spell-template.html +++ b/ADnD_2E_Revised/html/shared/wizard-spell-template.html @@ -1,89 +1,161 @@ -
-
-
-
- - - - - - - -
Spell name: - - - Casting time:
- - - - - -
Cast / Memorized: /
- - - - - -
Spell Points / Arc Used: /
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Level:School:Components:
Range:Area of Effect:Duration:
Damage:Damage type:Saving throw:
Healing:Materials:Book reference:
Subtlety:Sensory:Knockdown:
Critical:
- - - - - -
- -
- -
-
-
-
-
\ No newline at end of file + +
+
+ + + + + + + + + + + + + + + insert_fold-button.html + +
Spell nameRangeArea of EffectCasting timeMacro
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
CastMemorized
+ + / + +
+ + + + + + + +
Spell Points Used
+ +
+ + + + + + + +
Arcs Used
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level: + +
School: + + Sphere: + +
Duration: + + Components: + +
Subtlety: + + Saving Throw: + +
Sensory: + + Knockdown: + +
Critical: + + + +
Damage: + + Damage Type: + +
Healing: + +
Reference: + +
Materials: + +
+ +
+
+
\ No newline at end of file diff --git a/ADnD_2E_Revised/html/tabs/character-tab/attributes-tab/attribute-button.html b/ADnD_2E_Revised/html/tabs/character-tab/attributes-tab/attribute-button.html index 032a7004af..045c675ab2 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/attributes-tab/attribute-button.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/attributes-tab/attribute-button.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab.html b/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab.html index 7d047745b6..1fca9f94c3 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab.html @@ -497,7 +497,7 @@ - + insert_saving-throw-button.html_(par,Paralyzation) @@ -505,7 +505,7 @@ - + insert_saving-throw-button.html_(poi,Poison) @@ -513,7 +513,7 @@ - + insert_saving-throw-button.html_(dea,Death) @@ -521,7 +521,7 @@ - + insert_saving-throw-button.html_(rod,Rod) @@ -529,7 +529,7 @@ - + insert_saving-throw-button.html_(sta,Staff) @@ -537,7 +537,7 @@ - + insert_saving-throw-button.html_(wan,Wand) @@ -545,7 +545,7 @@ - + insert_saving-throw-button.html_(pet,Petrification) @@ -553,7 +553,7 @@ - + insert_saving-throw-button.html_(pol,Polymorph) @@ -561,7 +561,7 @@ - + insert_saving-throw-button.html_(breath,Breath) @@ -569,7 +569,7 @@ - + insert_saving-throw-button.html_(sp,Spell) @@ -586,7 +586,7 @@ - + insert_saving-throw-button.html_(f,Fear) @@ -594,7 +594,7 @@ - + insert_saving-throw-button.html_(horr,Horror) @@ -602,7 +602,7 @@ - + insert_saving-throw-button.html_(mad,Madness) diff --git a/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab/saving-throw-button.html b/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab/saving-throw-button.html new file mode 100644 index 0000000000..d4e3b43d8b --- /dev/null +++ b/ADnD_2E_Revised/html/tabs/character-tab/character-info-tab/character-info-tracker-tab/saving-throw-button.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ADnD_2E_Revised/html/tabs/character-tab/equipment-tab.html b/ADnD_2E_Revised/html/tabs/character-tab/equipment-tab.html index 6149daaa92..029beb93fc 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/equipment-tab.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/equipment-tab.html @@ -3,7 +3,7 @@
-
+
@@ -451,14 +451,14 @@ - + insert_fold-button.html - + - +
Slot
Spell failure: %
diff --git a/ADnD_2E_Revised/html/tabs/character-tab/psionics-tab/psionic-core-discipline.html b/ADnD_2E_Revised/html/tabs/character-tab/psionics-tab/psionic-core-discipline.html index f1c721c7e7..3d329b6aa6 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/psionics-tab/psionic-core-discipline.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/psionics-tab/psionic-core-discipline.html @@ -32,11 +32,11 @@ - + insert_fold-button.html - + - + diff --git a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/priest-sphere-button.html b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/priest-sphere-button.html deleted file mode 100644 index 2c53c9b4bd..0000000000 --- a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/priest-sphere-button.html +++ /dev/null @@ -1,6 +0,0 @@ - -
- -
-
-
\ No newline at end of file diff --git a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-reset-button.html b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-reset-button.html index 5d48c07d0e..9eb4b7c6d4 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-reset-button.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-reset-button.html @@ -1,4 +1,4 @@ -
+
+ + + + + + + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
\ No newline at end of file diff --git a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-tracking-wizard.html b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-tracking-wizard.html new file mode 100644 index 0000000000..f99a455505 --- /dev/null +++ b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/components/spell-slots-tracking-wizard.html @@ -0,0 +1,41 @@ +
+ + + + + + + + + + + + + + + + + + + +
LevelSpecialistMisc.Total/Max
Spell Slots/
+ + + + + + + + + + + + + + + + +
Available to
Memorize|Cast
|
+ + +
\ No newline at end of file diff --git a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/priest-tab.html b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/priest-tab.html index 5933f59196..2c7264c83f 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/priest-tab.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/priest-tab.html @@ -11,45 +11,7 @@ Level 7  Quest

- Spell Points & Wind - Player's Option: Spells & Magic -
- - - - - - - - - - - - - - - - - -
LevelWisdomTotal|Remaining
Spell Points|
- -
- - - - - - - - - - - - -
TotalRemaining
Wind
- -
-
- +
@@ -57,62 +19,78 @@
Priest caster level
- insert_spell-slots-reset-button.html_(pri,(Not Quest)) -

- Show Spheres of Influence: -
- Major: - - -
- Minor: - - -
+
+ +
+ Show Spheres of Influence: +
+ Major: + + +
+ Minor: + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + +
LevelWisdomTotal|Remaining
Spell Points|
+
+ Bonus spell points from high Wisdom to Priests + Priests with high Wisdom scores gain a special bonus spell points to reflect their piety and devotion. (This is a standard rule in this spell point system, unlike the optional bonus spell point rule for wizards with high Intelligence scores.) Player's Option: Spells & Powers, p. 92 +
+
+ + + + + + + + + + + + + + + + + +
LevelWisdomTotal|Remaining
Winds|
+ insert_spell-slots-reset-button.html_(pri,(Not Quest))
- insert_priest-sphere-button.html_(pri1,1st) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level1) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri1,,[[@{wisfail}]]%)
@@ -127,47 +105,9 @@
- insert_priest-sphere-button.html_(pri2,2nd) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level2) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri2,,[[@{wisfail}]]%)
@@ -182,47 +122,9 @@
- insert_priest-sphere-button.html_(pri3,3rd) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level3) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri3,,[[@{wisfail}]]%)
@@ -237,47 +139,9 @@
- insert_priest-sphere-button.html_(pri4,4th) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level4) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri4,,[[@{wisfail}]]%)
@@ -292,47 +156,9 @@
- insert_priest-sphere-button.html_(pri5,5th) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level5) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri5,,[[@{wisfail}]]%)
@@ -347,47 +173,9 @@
- insert_priest-sphere-button.html_(pri6,6th) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level6) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri6,,[[@{wisfail}]]%)
@@ -402,47 +190,9 @@
- insert_priest-sphere-button.html_(pri7,7th) - - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(level7) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(pri7,,[[@{wisfail}]]%)
@@ -457,46 +207,9 @@
- - - - - - - - - - - - - - - -
LevelWisdomMisc.Total
Spell Slots
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-priest.html_(levelq) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_priest-spell-template.html_(priq,,[[@{wisfail}]]%)
diff --git a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/wizard-tab.html b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/wizard-tab.html index df03fd9563..7536864cd3 100644 --- a/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/wizard-tab.html +++ b/ADnD_2E_Revised/html/tabs/character-tab/spells-tab/wizard-tab.html @@ -19,46 +19,7 @@ Level 15

- Spell Points & Arc - Player's Option: Spells & Magic -
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistIntelligenceTotal|Remaining
Spell Points|
- -
- - - - - - - - - - - -
TotalRemaining
Arc
- -
-
- +
@@ -66,53 +27,55 @@
Wizard caster level
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
LevelSpecialistIntelligenceTotal|Remaining
Spell Points|
+
+ Bonus spell points from high Intelligence to Wizards + Under this optional rule, wizard characters gain a number of bonus spell points, based on their Intelligence score. Player's Options: Spells & Powers, p. 79 +
+
+ + + + + + + + + + + + + +
Total|Remaining
Arcs|
insert_spell-slots-reset-button.html_(wiz)
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level1) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz1)
@@ -127,50 +90,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level2) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz2)
@@ -185,50 +107,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level3) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz3)
@@ -243,50 +124,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level4) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz4)
@@ -301,50 +141,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level5) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz5)
@@ -359,51 +158,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- - + insert_spell-slots-tracking-wizard.html_(level6) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz6)
@@ -418,50 +175,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level7) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz7)
@@ -476,50 +192,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level8) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz8)
@@ -534,50 +209,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level9) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz9)
@@ -592,50 +226,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level10) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz10)
@@ -650,50 +243,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level11) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz11)
@@ -708,50 +260,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level12) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz12)
@@ -766,50 +277,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level13) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz13)
@@ -824,50 +294,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level14) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz14)
@@ -882,50 +311,9 @@
- - - - - - - - - - - - - - - - - - - -
LevelSpecialistMisc.Total/Max
Spell Slots/
- - - - - - - - - - - - - - - - -
Available to
Memorize|Cast
|
- - -

- + insert_spell-slots-tracking-wizard.html_(level15) +
-

Spells Memorized and Spell Book

-

Spells Memorized

insert_wizard-spell-template.html_(wiz15)
diff --git a/ADnD_2E_Revised/html/tabs/monster-tab.html b/ADnD_2E_Revised/html/tabs/monster-tab.html index 7fe47831c6..062a962ed2 100644 --- a/ADnD_2E_Revised/html/tabs/monster-tab.html +++ b/ADnD_2E_Revised/html/tabs/monster-tab.html @@ -4,134 +4,144 @@
- +
- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
Name:
Climate/Terrain:
Frequency:
Organization:
Activity Cycle:
Diet:
Intelligence:
Treasure:
Alignment:
- +
- + - + - + - - + + - + - + - + - - + + - - + +
No. Appearing:
Armor Class:
Movement:
Hit Dice: - ± - | - - + + + + + + + + + +
±|
Hit Points: - - / - + + + + + + +
/
THAC0:
# of Attacks:
Attack 1:
- +
- - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + +
Attack 2:
Attack 3:
Special Atk:
Special Def:
Magic Res:
Size:
Morale:
XP Value:
diff --git a/ADnD_2E_Revised/html/tabs/sheet-settings.html b/ADnD_2E_Revised/html/tabs/sheet-settings-tab.html similarity index 89% rename from ADnD_2E_Revised/html/tabs/sheet-settings.html rename to ADnD_2E_Revised/html/tabs/sheet-settings-tab.html index be37dda28d..ce800762e7 100644 --- a/ADnD_2E_Revised/html/tabs/sheet-settings.html +++ b/ADnD_2E_Revised/html/tabs/sheet-settings-tab.html @@ -1,6 +1,6 @@

General

-

Select books to include autofil information from:

+

Select books to include autofill information from:

@@ -175,6 +175,24 @@
Book

+

Spell tracking system

+ AD&D 2E have different systems for tracking spells, three have been implemented: +
    +
  • Spell Slots: The default system described in the Player's Handbook
  • +
  • Spell Points: Introduced in Player's Option: Spells & Magic
  • +
  • Arcs, Songs, Winds: Introduced in Forgotten Realms, Netheril: Empire of Magic
  • +
+ + +
+
+

Miscellaneous modifier popup on rolls

+

By default all rolls creates a popup asking for a 'Miscellaneous modifier' to capture when the DM says: 'Make an X-roll with +2'. + If your DM rarely asks for this, if you find the popup annoying, or if you would rather add any bonuses after the roll is made, this popup can be turned off

-
+
diff --git a/ADnD_2E_Revised/javascript/abilityScores.js b/ADnD_2E_Revised/javascript/abilityScores.js index fcb3a0008a..4a9fc1bc57 100644 --- a/ADnD_2E_Revised/javascript/abilityScores.js +++ b/ADnD_2E_Revised/javascript/abilityScores.js @@ -83,8 +83,8 @@ constitutionTable['conadj'] = ['Error','-3','-2','-2','-1','-1','-1','0','0','0' constitutionTable['conshock'] = ['Error','25','30','35','40','45','50','55','60','65','70','75','80','85','88','90','95','97','99','99','99','99','99','99','99','100']; constitutionTable['conres'] = ['Error','30','35','40','45','50','55','60','65','70','75','80','85','90','92','94','96','98','100','100','100','100','100','100','100','100']; constitutionTable['conpoisonsave'] = ['Error','-2','-1','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','+1','+1','+2','+2','+3','+3','+4']; -constitutionTable['conregen'] = ['Error','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','1/6','1/5','1/4','1/3','1/2','1/1']; -constitutionTable['connotes'] = ['INVALID CONSTITUTION','','','','','','','','','','','','','','','','','','','','1 hp/6 turns - not acid/fire','1 hp/5 turns - not acid/fire','1 hp/4 turns - not acid/fire','1 hp/3 turns - not acid/fire','1 hp/2 turns - not acid/fire','1 hp/turn - not acid/fire']; +constitutionTable['conregen'] = ['Error','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','Nil','1/6 turns','1/5 turns','1/4 turns','1/3 turns','1/2 turns','1/1 turn']; +constitutionTable['connotes'] = ['INVALID CONSTITUTION','','','','','','','','','','','','','','','','','','','','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21','Fire and acid damage cannot be regenerated, PHB p. 21']; constitutionTable['con2notes'] = ['INVALID CONSTITUTION','','','','','','','','','','','','','','','','','(+3) Warriors only','(+4) Warriors only','(+5) Warriors only','(+5) Warriors only','(+6) Warriors only','(+6) Warriors only','(+6) Warriors only','(+7) Warriors only','(+7) Warriors only']; const intelligenceTable = {}; @@ -100,15 +100,15 @@ intelligenceTable['intimm5th'] = ['Error','','','','','','','','','','','','','' intelligenceTable['intimm6th'] = ['Error','','','','','','','','','','','','','','','','','','','','','','','','6th-level','6th-level']; intelligenceTable['intimm7th'] = ['Error','','','','','','','','','','','','','','','','','','','','','','','','','7th-level']; intelligenceTable['intnotes'] = ['INVALID INTELLIGENCE','Communicate by Grunts & Gestures','','','','','','','','','','','','','','','','','','','','','','','','','']; +intelligenceTable['spell-points-int'] = [0,0,0,0,0,0,0,0,0,2,2,2,3,3,4,4,5,6,7,8,9,9,9,9,9,9]; const wisdomTable = {}; wisdomTable['wisdef'] = ['Error','-6','-4','-3','-2','-1','-1','-1','0','0','0','0','0','0','0','+1','+2','+3','+4','+4','+4','+4','+4','+4','+4','+4']; wisdomTable['wisbonus'] = ['Error','—','—','—','—','—','—','—','—','0','0','0','0','1st','1st','2nd','2nd','3rd','4th','1st,3rd','2nd,4th','3rd,5th','4th,5th','1st,6th','5th,6th','6th,7th']; -wisdomTable['wisbonus-prime'] = ['Error','','','','','','','','','','','','','1st','2x1st','2x1st, 2nd','2x1st, 2x2nd','2x1st, 2x2nd, 3rd','2x1st, 2x2nd, 3rd, 4th','3x1st, 2x2nd, 2x3rd, 4th','3x1st, 3x2nd, 2x3rd, 2x4th','3x1st, 3x2nd, 3x3rd, 2x4th','3x1st, 3x2nd, 3x3rd, 3x4th','4x1st, 3x2nd, 3x3rd, 3x4th','4x1st, 3x2nd, 3x3rd, 3x4th','4x1st, 3x2nd, 3x3rd, 3x4th']; -wisdomTable['wisbonus-extra'] = ['Error','','','','','','','','','','','','','','','','','','','','','5th','2x5th','2x5th, 6th','3x5th, 2x6th','3x5th, 3x6th, 7th']; wisdomTable['wisfail'] = ['Error','80','60','50','45','40','35','30','25','20','15','10','5','0','0','0','0','0','0','0','0','0','0','0','0','0']; wisdomTable['wisimmune'] = ['Error','','','','','','','','','','','','','','','','','','','cause fear, charm person, command, friends, hypnotism','forget, hold person, ray of enfeeblement, scare','fear','charm monster, confusion, emotion, fumble, suggestion','chaos, feeblemind, hold monster, magic jar, quest','geas, mass suggestion, rod of rulership','antipathy/sympathy, death spell, mass charm']; wisdomTable['wisnotes'] = ['INVALID WISDOM','','','','','','','','','','','','','','','','','','','','','','','','','','']; +wisdomTable['wisdom-wind'] = [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,11,12]; const charismaTable = {}; charismaTable['chamax'] = ['Error','0','1','1','1','2','2','3','3','4','4','4','5','5','6','7','8','10','15','20','25','30','35','40','45','50']; diff --git a/ADnD_2E_Revised/javascript/sheetWorkers.js b/ADnD_2E_Revised/javascript/sheetWorkers.js index 9dd33bedaf..becb63d05e 100644 --- a/ADnD_2E_Revised/javascript/sheetWorkers.js +++ b/ADnD_2E_Revised/javascript/sheetWorkers.js @@ -67,45 +67,42 @@ const capitalizeFirst = function (s) { } const displaySize = function(size) { - if (typeof size !== 'string') + if (typeof size !== 'string' || size.length === 0) return ''; - size = size.toLowerCase(); - switch (size) { - case 't': - case 'tiny': return 'Tiny'; - case 's': - case 'small': return 'Small'; - case 'm': - case 'medium': return 'Medium'; - case 'l': - case 'large': return 'Large'; - case 'h': - case 'huge': return 'Huge'; - case 'g': - case 'gargantuan': return 'Gargantuan'; + let sizeLetter = size.charAt(0).toLowerCase(); + switch (sizeLetter) { + case 't': return 'Tiny'; + case 's': return 'Small'; + case 'm': return 'Medium'; + case 'l': return 'Large'; + case 'h': return 'Huge'; + case 'g': return 'Gargantuan'; default: return capitalizeFirst(size); } } const sizeToInt = function(size) { - size = displaySize(size); - switch (size) { - case 'Tiny': return 0; - case 'Small': return 1; - case 'Medium': return 2; - case 'Large': return 3; - case 'Huge': return 4; - case 'Gargantuan': return 5; + if (typeof size !== 'string' || size.length === 0) + return ''; + + let sizeLetter = size.charAt(0).toLowerCase(); + switch (sizeLetter) { + case 't': return 0; + case 's': return 1; + case 'm': return 2; + case 'l': return 3; + case 'h': return 4; + case 'g': return 5; } } const displayWeaponType = function (type) { - if (typeof type !== 'string') + if (typeof type !== 'string' || type.length === 0) return ''; - type = type.toLowerCase(); - switch (type) { + let typeLetter = type.toLowerCase(); + switch (typeLetter) { case 's': return 'Slashing'; case 'p': return 'Piercing'; case 'b': return 'Bludgeoning'; @@ -430,7 +427,7 @@ on('clicked:hide-toast', function(eventInfo) { //#region Ability Scores logic // Ability Score Parser function -const EXCEPTIONAL_STRENGHT_REGEX = /18[\[(]([0-9]{1,3})[\])]/; // Ie. 18[65], 18(65) +const EXCEPTIONAL_STRENGTH_REGEX = /18[\[(]([0-9]{1,3})[\])]/; // Ie. 18[65], 18(65) function getLookupValue(abilityScoreString, defaultValue, isStrength = false) { if (abilityScoreString === '') { return defaultValue; @@ -442,7 +439,7 @@ function getLookupValue(abilityScoreString, defaultValue, isStrength = false) { } if (isStrength) { - let exceptionalMatch = abilityScoreString.match(EXCEPTIONAL_STRENGHT_REGEX); + let exceptionalMatch = abilityScoreString.match(EXCEPTIONAL_STRENGTH_REGEX); if (exceptionalMatch !== null) { let exceptionalStrNumber = parseInt(exceptionalMatch[1]); if (1 <= exceptionalStrNumber && exceptionalStrNumber <= 50) { @@ -667,20 +664,28 @@ on('change:intelligence change:reason change:knowledge', function() { }); // Set sub-attributes based on Wisdom, Intuition, and Willpower -function parseWisBonus(abilityScore) { - if (abilityScore < 13) { - return { - '1st': 0, - '2nd': 0, - '3rd': 0, - '4th': 0, - '5th': 0, - '6th': 0, - '7th': 0, - 'wisbonus': wisdomTable['wisbonus'][abilityScore], - 'wisbonus-prime': wisdomTable['wisbonus'][abilityScore], - 'wisbonus-extra': wisdomTable['wisbonus'][abilityScore], - }; +async function parseWisBonus(abilityScore, wisdom) { + let bonus = { + '1st': 0, + '2nd': 0, + '3rd': 0, + '4th': 0, + '5th': 0, + '6th': 0, + '7th': 0, + 'wind': 0, + 'wisbonus': '—', + 'wisbonus-prime': '—', + 'wisbonus-extra': '—', + }; + if (abilityScore < 13 && wisdom < 13) { + await keepContextRoll(); + return bonus; + } + + let answer = await extractQueryResult('?{Priests get bonus spells from high Wisdom (but not Paladins and Rangers). Do you play a priest?|My character is a priest,true|My character is a different class,false}'); + if (answer !== 'true') { + return bonus; } // Combine all spell levels into one string @@ -690,7 +695,7 @@ function parseWisBonus(abilityScore) { } // Count instances of each spell level - let bonus = { + bonus = { '1st': (bonusString.match(/1st/g) || []).length, '2nd': (bonusString.match(/2nd/g) || []).length, '3rd': (bonusString.match(/3rd/g) || []).length, @@ -698,18 +703,28 @@ function parseWisBonus(abilityScore) { '5th': (bonusString.match(/5th/g) || []).length, '6th': (bonusString.match(/6th/g) || []).length, '7th': (bonusString.match(/7th/g) || []).length, + 'wind': wisdomTable['wisdom-wind'][wisdom], }; // Generate bonus prime and bonus extra strings - bonus['wisbonus-prime'] = wisdomTable['wisbonus-prime'][abilityScore]; - bonus['wisbonus-extra'] = wisdomTable['wisbonus-extra'][abilityScore]; + function format(bonus, key) { + if (bonus[key] === 0) { + return ''; + } + if (bonus[key] === 1) { + return key + } + return `${bonus[key]}x${key}`; + } + bonus['wisbonus-prime'] = [format(bonus, '1st'), format(bonus, '2nd'), format(bonus, '3rd'), format(bonus, '4th')].filter(Boolean).join(', '); + bonus['wisbonus-extra'] = [format(bonus, '5th'), format(bonus, '6th'), format(bonus, '7th')].filter(Boolean).join(', '); bonus['wisbonus'] = [bonus['wisbonus-prime'], bonus['wisbonus-extra']].filter(Boolean).join(', '); return bonus; } on('change:wisdom change:intuition change:willpower', function() { - getAttrs(['wisdom','intuition','willpower'], function(values) { + getAttrs(['wisdom','intuition','willpower'], async function (values) { let wisdomRaw = values.wisdom.replace(/\s+/g, ''); let intuitionRaw = values.intuition.replace(/\s+/g, ''); let willpowerRaw = values.willpower.replace(/\s+/g, ''); @@ -721,7 +736,7 @@ on('change:wisdom change:intuition change:willpower', function() { let bonusSpells; if (wisdom === 0) { - bonusSpells = parseWisBonus(0); + bonusSpells = await parseWisBonus(0, 0); assignAttributes(0, 0, 0, bonusSpells, wisdomTable['wisimmune'][0], wisdomTable['wisimmune'][0], wisdomTable['wisnotes'][0], wisdomTable['wisnotes'][0]); return; } @@ -749,34 +764,35 @@ on('change:wisdom change:intuition change:willpower', function() { for (let i = willpower; i > 18; i--) { wisImmuneArray.push(wisdomTable['wisimmune'][i]); } - let slicePoint = Math.round(wisImmuneArray.length/2); + let slicePoint = Math.round(wisImmuneArray.length / 2); wisimm1 = wisImmuneArray.slice(0, slicePoint).filter(Boolean).join(', '); wisimm2 = wisImmuneArray.slice(slicePoint).filter(Boolean).join(', '); } - bonusSpells = parseWisBonus(willpower); + bonusSpells = await parseWisBonus(intuition, wisdom); assignAttributes(wisdom, intuition, willpower, bonusSpells, wisimm1, wisimm2, wisnotes, wis2notes); function assignAttributes(wisdom, intuition, willpower, bonusSpells, wisimm1, wisimm2, wisnotes, wis2notes) { - setAttrs({ - wisdef: wisdomTable['wisdef'][willpower], - wisbonus: bonusSpells['wisbonus'], - 'wisbonus-prime': bonusSpells['wisbonus-prime'], - 'wisbonus-extra': bonusSpells['wisbonus-extra'], - wisfail: wisdomTable['wisfail'][intuition], - wisimm: wisimm1, - wisimm1: wisimm1, - wisimm2: wisimm2, - wisnotes: wisnotes, - wis2notes: wis2notes, - 'spell-priest-level1-wisdom': bonusSpells['1st'], - 'spell-priest-level2-wisdom': bonusSpells['2nd'], - 'spell-priest-level3-wisdom': bonusSpells['3rd'], - 'spell-priest-level4-wisdom': bonusSpells['4th'], - 'spell-priest-level5-wisdom': bonusSpells['5th'], - 'spell-priest-level6-wisdom': bonusSpells['6th'], - 'spell-priest-level7-wisdom': bonusSpells['7th'], - }); + let newValue = {}; + newValue['wisdef'] = wisdomTable['wisdef'][willpower]; + newValue['wisbonus'] = bonusSpells['wisbonus']; + newValue['wisbonus-prime'] = bonusSpells['wisbonus-prime']; + newValue['wisbonus-extra'] = bonusSpells['wisbonus-extra']; + newValue['wisfail'] = wisdomTable['wisfail'][intuition]; + newValue['wisimm'] = wisimm1; + newValue['wisimm1'] = wisimm1; + newValue['wisimm2'] = wisimm2; + newValue['wisnotes'] = wisnotes; + newValue['wis2notes'] = wis2notes; + newValue['spell-priest-level1-wisdom'] = bonusSpells['1st']; + newValue['spell-priest-level2-wisdom'] = bonusSpells['2nd']; + newValue['spell-priest-level3-wisdom'] = bonusSpells['3rd']; + newValue['spell-priest-level4-wisdom'] = bonusSpells['4th']; + newValue['spell-priest-level5-wisdom'] = bonusSpells['5th']; + newValue['spell-priest-level6-wisdom'] = bonusSpells['6th']; + newValue['spell-priest-level7-wisdom'] = bonusSpells['7th']; + newValue['wisdom-wind'] = bonusSpells['wind']; + setAttrs(newValue); } }); }); @@ -934,10 +950,10 @@ function setupRepeatingSpellSumming(sections, oldField, newField, resultFieldNam } function setupCalculateRemaining(totalField, sumField, remainingField) { - on(`change:${totalField} change:${sumField}`, function () { + on(`change:${totalField} change:${sumField}`, function (eventInfo) { getAttrs([totalField, sumField], function (values) { - let intTotal = parseInt(values[totalField]); - let intSum = parseInt(values[sumField]); + let intTotal = parseInt(values[totalField]) || 0; + let intSum = parseInt(values[sumField]) || 0; console.log(`Setting ${remainingField} with value from ${totalField}: ${intTotal} and ${sumField}: ${intSum}`); @@ -959,9 +975,9 @@ const PRIEST_SPHERES = [ 'Chaos','Law','Numbers','Thought','Time','Travelers','War','Wards' ]; -const primarySphereRegex = new RegExp(PRIEST_SPHERES.join('|'), 'gi'); -const noElementalRegex = new RegExp(PRIEST_SPHERES.filter(s => s !== ELEMENTAL).join('|'), 'gi'); -const elementalRegex = /Earth|Air|Fire|Water/gi +const PRIMARY_SPHERE_REGEX = new RegExp(PRIEST_SPHERES.join('|'), 'gi'); +const NO_ELEMENTAL_REGEX = new RegExp(PRIEST_SPHERES.filter(s => s !== ELEMENTAL).join('|'), 'gi'); +const ELEMENTAL_REGEX = /Earth|Air|Fire|Water/gi function parseSpheres(spheresStrings, regex) { let spheres = new Set(); @@ -995,7 +1011,7 @@ function isSpellAvailable(spellName, spell, availableSpheres, elementalSpheres, let spheres = getSpellSpheres(spell, optionalSpheres); - let primarySpellSpheres = spheres.match(noElementalRegex) || []; + let primarySpellSpheres = spheres.match(NO_ELEMENTAL_REGEX) || []; let isAvailable = primarySpellSpheres.some(sphere => availableSpheres.has(sphere)); if (isAvailable) return true; @@ -1007,7 +1023,7 @@ function isSpellAvailable(spellName, spell, availableSpheres, elementalSpheres, return false; if (spheres.includes(`${ELEMENTAL} (`)) - return spheres.match(elementalRegex).some((element) => elementalSpheres.has(element)) + return spheres.match(ELEMENTAL_REGEX).some((element) => elementalSpheres.has(element)) // The player and the spell has the elemental sphere (without any sub elements) // Currently only 'Commune With Nature' in the revised Player's Handbook (1995) has this property @@ -1032,8 +1048,8 @@ function setupAddPriestSpell(postfix) { knownSpells.add(row.S[field]); return knownSpells; }, new Set(), function (knownSpells,_,attrSet){ - let primarySpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), primarySphereRegex); - let elementalSpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), elementalRegex); + let primarySpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), PRIMARY_SPHERE_REGEX); + let elementalSpheres = parseSpheres(sphereFields.map(aField => attrSet.S[aField]), ELEMENTAL_REGEX); if (primarySpheres.size < 1) { showToast(WARNING, 'No spheres found', `No valid spheres found. Please write or select some spheres`); @@ -1164,7 +1180,7 @@ function setupSpellSlotsReset(buttonName, tab, spellLevels, allSections) { //#endregion //#region Wizard and Priest spells and Powers setup -function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFields) { +function setupAutoFillSpellInfo(section, spellsTable, optionalRulesFields) { if (!spellsTable[section]) return; @@ -1183,7 +1199,7 @@ function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFi let spellInfo = { [`repeating_spells-${section}_spell-cast-time`] : spell['cast-time'], - [`repeating_spells-${section}_spell-level`] : levelFunc(spell['level'], className), + [`repeating_spells-${section}_spell-level`] : displaySpellLevel(spell['level'], className), [`repeating_spells-${section}_spell-school`] : getSpellSchools(spell, books), [`repeating_spells-${section}_spell-components`] : spell['components'], [`repeating_spells-${section}_spell-range`] : spell['range'], @@ -1208,8 +1224,7 @@ function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFi spellInfo[`repeating_spells-${section}_spell-sphere`] = getSpellSpheres(spell, sphereRules); } if (!books[levelField].trim()) { - let classLevel = capitalizeFirst(levelField.replace('level-', '')); - let toast = getToastObject(INFO, `Set ${classLevel} caster level`, 'Almost every spell requires a caster level to calculate its effect. Without it most spells will fail and show and error in the chat'); + let toast = getToastObject(INFO, `Set ${className} caster level`, 'Almost every spell requires a caster level to calculate its effect. Without it most spells will fail and show and error in the chat'); Object.assign(spellInfo, toast); } @@ -1218,8 +1233,7 @@ function setupAutoFillSpellInfo(section, spellsTable, levelFunc, optionalRulesFi }); } - -let wizardSpellLevelsSections = [ +const WIZARD_SPELL_LEVELS_SECTIONS = [ {level: '1', sections: ['', '2', '3', 'wiz1']}, {level: '2', sections: ['4', '5', '6', 'wiz2']}, {level: '3', sections: ['7', '8', '9', 'wiz3']}, @@ -1237,7 +1251,7 @@ let wizardSpellLevelsSections = [ {level: '15', sections: ['64', '65', '66', 'wiz15']}, ]; -let priestSpellLevelsSections = [ +const PRIEST_SPELL_LEVELS_SECTIONS = [ {level: '1', sections: ['28', '29', '30', 'pri1']}, {level: '2', sections: ['31', '32', '33', 'pri2']}, {level: '3', sections: ['34', '35', '36', 'pri3']}, @@ -1255,7 +1269,7 @@ const displaySpellLevel = function(level, className) { } // --- Start setup Spell Slots --- // -wizardSpellLevelsSections.forEach(spellLevel => { +WIZARD_SPELL_LEVELS_SECTIONS.forEach(spellLevel => { let prefix = `spell-level${spellLevel.level}`; setupStaticCalculateTotal(`${prefix}-total`, [`${prefix}-castable`, `${prefix}-specialist`, `${prefix}-misc`]); setupRepeatingSpellSumming(spellLevel.sections, 'cast-value', 'spell-cast-value', `${prefix}-cast-value-sum`); @@ -1266,14 +1280,14 @@ wizardSpellLevelsSections.forEach(spellLevel => { // Auto set spell info function let lastSection = spellLevel.sections[spellLevel.sections.length - 1]; if (isNewSpellSection(lastSection)) { - setupAutoFillSpellInfo(lastSection, wizardSpells, displaySpellLevel, SCHOOL_FIELDS); + setupAutoFillSpellInfo(lastSection, wizardSpells, SCHOOL_FIELDS); setupSpellCrit(lastSection); } }); -setupAutoFillSpellInfo('wizmonster', wizardSpells, displaySpellLevel, SCHOOL_FIELDS); +setupAutoFillSpellInfo('wizmonster', wizardSpells, SCHOOL_FIELDS); setupSpellCrit('wizmonster'); -priestSpellLevelsSections.forEach(spellLevel => { +PRIEST_SPELL_LEVELS_SECTIONS.forEach(spellLevel => { let prefix = `spell-priest-level${spellLevel.level}`; setupStaticCalculateTotal(`${prefix}-total`, [`${prefix}-castable`, `${prefix}-wisdom`, `${prefix}-misc`]); setupRepeatingSpellSumming(spellLevel.sections, 'cast-value', 'spell-cast-value', `${prefix}-cast-value-sum`); @@ -1284,43 +1298,125 @@ priestSpellLevelsSections.forEach(spellLevel => { // Auto set spell info function let lastSection = spellLevel.sections[spellLevel.sections.length - 1]; if (isNewSpellSection(lastSection)) { - setupAutoFillSpellInfo(lastSection, priestSpells, displaySpellLevel, SPHERE_FIELDS); + setupAutoFillSpellInfo(lastSection, priestSpells, SPHERE_FIELDS); setupSpellCrit(lastSection); if (lastSection !== 'priq') { setupAddPriestSpell(lastSection); } } }); -setupAutoFillSpellInfo('primonster', priestSpells, displaySpellLevel, SPHERE_FIELDS); +setupAutoFillSpellInfo('primonster', priestSpells, SPHERE_FIELDS); setupSpellCrit('primonster'); // --- End setup Spell Slots --- // // --- Start setup Spell Points, Arc, and Wind --- // -let wizardSpellPoints = 'spell-points'; -let arc = 'total-arc'; -let allWizardSpellSections = wizardSpellLevelsSections.flatMap(sl => sl.sections); -setupStaticCalculateTotal(`${wizardSpellPoints}-total`, [`${wizardSpellPoints}-lvl`, `${wizardSpellPoints}-spc`, `${wizardSpellPoints}-int`]); -setupRepeatingSpellSumming(allWizardSpellSections, wizardSpellPoints, 'spell-points', `${wizardSpellPoints}-sum`, true); -setupRepeatingSpellSumming(allWizardSpellSections, 'arc', 'spell-arc', `${arc}-sum`, true); -setupCalculateRemaining(`${wizardSpellPoints}-total`, `${wizardSpellPoints}-sum`, `${wizardSpellPoints}-remaining`); -setupCalculateRemaining(arc, `${arc}-sum`, `${arc}-remaining`); +const WIZARD_SPELL_POINTS = 'spell-points'; +const TOTAL_ARC = 'total-arc'; +const ALL_WIZARD_SPELL_SECTIONS = WIZARD_SPELL_LEVELS_SECTIONS.flatMap(sl => sl.sections); +setupStaticCalculateTotal(`${WIZARD_SPELL_POINTS}-total`, [`${WIZARD_SPELL_POINTS}-lvl`, `${WIZARD_SPELL_POINTS}-spc`, `${WIZARD_SPELL_POINTS}-int`]); +setupRepeatingSpellSumming(ALL_WIZARD_SPELL_SECTIONS, WIZARD_SPELL_POINTS, 'spell-points', `${WIZARD_SPELL_POINTS}-sum`, true); +setupRepeatingSpellSumming(ALL_WIZARD_SPELL_SECTIONS, 'arc', 'spell-arc', `${TOTAL_ARC}-sum`, true); +setupCalculateRemaining(`${WIZARD_SPELL_POINTS}-total`, `${WIZARD_SPELL_POINTS}-sum`, `${WIZARD_SPELL_POINTS}-remaining`); +setupCalculateRemaining(TOTAL_ARC, `${TOTAL_ARC}-sum`, `${TOTAL_ARC}-remaining`); +on('change:spell-points-int-enabled change:intelligence', function (eventInfo) { + getAttrs(['spell-points-int-enabled', 'intelligence'], function (values) { + let newValue = {'spell-points-int': 0} + if (values['spell-points-int-enabled'] !== '1') { + return setAttrs(newValue); + } + let intelligence = getLookupValue(values['intelligence'], 0); + newValue['spell-points-int'] = intelligenceTable['spell-points-int'][intelligence]; + setAttrs(newValue); + }); +}); -let priestSpellPoints = 'spell-points-priest'; -let wind = 'total-wind'; -let allPriestSpellSections = priestSpellLevelsSections.flatMap(sl => sl.sections); -setupStaticCalculateTotal(`${priestSpellPoints}-total`, [`${priestSpellPoints}-lvl`, `${priestSpellPoints}-wis`]); -setupRepeatingSpellSumming(allPriestSpellSections, priestSpellPoints, 'spell-points', `${priestSpellPoints}-sum`, true); -setupRepeatingSpellSumming(allPriestSpellSections, 'wind', 'spell-wind', `${wind}-sum`, true); -setupCalculateRemaining(`${priestSpellPoints}-total`, `${priestSpellPoints}-sum`, `${priestSpellPoints}-remaining`); -setupCalculateRemaining(wind, `${wind}-sum`, `${wind}-remaining`); +const PRIEST_SPELL_POINTS = 'spell-points-priest'; +const TOTAL_WIND = 'total-wind'; +const ALL_PRIEST_SPELL_SECTIONS = PRIEST_SPELL_LEVELS_SECTIONS.flatMap(sl => sl.sections); +setupStaticCalculateTotal(`${PRIEST_SPELL_POINTS}-total`, [`${PRIEST_SPELL_POINTS}-lvl`, `${PRIEST_SPELL_POINTS}-wis`]); +setupStaticCalculateTotal(TOTAL_WIND, ['level-wind', 'wisdom-wind']); +setupRepeatingSpellSumming(ALL_PRIEST_SPELL_SECTIONS, PRIEST_SPELL_POINTS, 'spell-points', `${PRIEST_SPELL_POINTS}-sum`, true); +setupRepeatingSpellSumming(ALL_PRIEST_SPELL_SECTIONS, 'wind', 'spell-wind', `${TOTAL_WIND}-sum`, true); +setupCalculateRemaining(`${PRIEST_SPELL_POINTS}-total`, `${PRIEST_SPELL_POINTS}-sum`, `${PRIEST_SPELL_POINTS}-remaining`); +setupCalculateRemaining(TOTAL_WIND, `${TOTAL_WIND}-sum`, `${TOTAL_WIND}-remaining`); +let PRIEST_SPELL_POINTS_WIS = 'spell-points-priest-wis'; +on('change:spell-points-priest-wis-enabled change:wisdom change:level-priest', function (eventInfo) { + getAttrs(['spell-points-priest-wis-enabled', 'wisdom', 'level-priest'], async function (values) { + await keepContextRoll(); + let newValue = {}; + newValue[PRIEST_SPELL_POINTS_WIS] = 0; + if (values['spell-points-priest-wis-enabled'] !== '1') { + return setAttrs(newValue); + } + let wisdom = getLookupValue(values['wisdom'], 0); + if (wisdom < 13) { + return setAttrs(newValue); + } + if (wisdom === 13) { + newValue[PRIEST_SPELL_POINTS_WIS] = 4; + return setAttrs(newValue); + } + if (wisdom === 14) { + newValue[PRIEST_SPELL_POINTS_WIS] = 8; + return setAttrs(newValue); + } + + let level = 1; + if (values['level-priest'] === '') { + return showToast(INFO, 'Set Priest caster level', 'The Priest\'s level is needed to calculate bonus Spell Points from high Wisdom.'); + } else { + level = await extractRollResult(values['level-priest']); + } + if (isNaN(level) || level < 0) { + level = 1; + } + let spellPoints = 0; + if (wisdom === 15) { + spellPoints = level < 3 ? 8 : 15; + } else if (wisdom === 16) { + spellPoints = level < 3 ? 8 : 20; + } else if (wisdom === 17) { + if (1 <= level && level <= 2) { + spellPoints = 8; + } else if (3 <= level && level <= 4) { + spellPoints = 20; + } else { + spellPoints = 30; + } + } else if (wisdom === 18) { + if (1 <= level && level <= 2) { + spellPoints = 8; + } else if (3 <= level && level <= 4) { + spellPoints = 20; + } else if (5 <= level && level <= 6) { + spellPoints = 30; + } else { + spellPoints = 45; + } + } else if (wisdom >= 19) { + if (1 <= level && level <= 2) { + spellPoints = 12; + } else if (3 <= level && level <= 4) { + spellPoints = 25; + } else if (5 <= level && level <= 6) { + spellPoints = 45; + } else { + spellPoints = 60; + } + } + + newValue[PRIEST_SPELL_POINTS_WIS] = spellPoints; + setAttrs(newValue); + }); +}); // --- End setup Spell Points, Arc, and Wind --- // // --- Start setup reset buttons --- // //tab6 = wizard levels //tab7 = priest levels -setupSpellSlotsReset('reset-spent-slots-wiz', 'tab6', wizardSpellLevelsSections, allWizardSpellSections); -let allPriestSectionsExceptQuest = priestSpellLevelsSections.slice(0, -1).flatMap(sl => sl.sections); -setupSpellSlotsReset('reset-spent-slots-pri', 'tab7', priestSpellLevelsSections, allPriestSectionsExceptQuest); +setupSpellSlotsReset('reset-spent-slots-wiz', 'tab6', WIZARD_SPELL_LEVELS_SECTIONS, ALL_WIZARD_SPELL_SECTIONS); +let allPriestSectionsExceptQuest = PRIEST_SPELL_LEVELS_SECTIONS.slice(0, -1).flatMap(sl => sl.sections); +setupSpellSlotsReset('reset-spent-slots-pri', 'tab7', PRIEST_SPELL_LEVELS_SECTIONS, allPriestSectionsExceptQuest); // --- End setup reset buttons --- // // --- Start setup Granted Powers --- // @@ -1386,19 +1482,14 @@ on('change:repeating_customrogue:crl remove:repeating_customrogue', function(){ //#endregion //#region Weapons tab logic and autofil -//Used in version.js -const updateNonprofPenalty = function () { - getAttrs(['nonprof-penalty'], function(values) { - let nonprof = Math.abs(parseInt(values['nonprof-penalty'])) * -1; - let famil = Math.floor(nonprof / 2) - setAttrs({ - ['nonprof-penalty']: nonprof, - ['famil-penalty']: famil - },{silent:true}); - }); -} on('change:nonprof-penalty', function (eventInfo){ - updateNonprofPenalty(); + let nonprofRaw = parseInt(eventInfo.newValue) || 0; + let nonprof = Math.abs(nonprofRaw) * -1; + let famil = Math.floor(nonprof / 2) + setAttrs({ + ['nonprof-penalty']: nonprof, + ['famil-penalty']: famil + },{silent:true}); }); on('change:thac0-base-calc', function(eventInfo) { @@ -1429,7 +1520,7 @@ async function selectVersion(foundObjects, values, comparer, objectName) { return; } - let isPlayersOption = values[PLAYERS_OPTION_FIELD] === '2'; + let isPlayersOption = values[WEAPONS_PLAYERS_OPTION_FIELD] === '2'; let isAllEqual = activeObjects.every(o => comparer(o, activeObjects[0], isPlayersOption)); if (isAllEqual) { await keepContextRoll(); @@ -1469,13 +1560,13 @@ function combineBooks(activeObjects, comparer, isPlayersOptions) { } //#region Weapons autofill -const PLAYERS_OPTION_FIELD = 'tab81'; +const WEAPONS_PLAYERS_OPTION_FIELD = 'tab81'; function setWeaponWithBonus(weaponName, setWeaponFunc, comparer, thac0Field, category) { if (!weaponName) return; weaponName = weaponName.toLowerCase(); - let fields = [...BOOK_FIELDS, PLAYERS_OPTION_FIELD, thac0Field].filter(Boolean); + let fields = [...BOOK_FIELDS, WEAPONS_PLAYERS_OPTION_FIELD, thac0Field].filter(Boolean); getAttrs(fields, async function (values) { let bonus = 0; let baseWeapons = WEAPONS_TABLE[weaponName] @@ -1553,13 +1644,13 @@ on('change:repeating_weapons:weaponname', function(eventInfo) { //melee damage autofill on('change:repeating_weapons-damage:weaponname1', function(eventInfo) { let comparer = function (weapon1, weapon2, isPlayersOption) { - let fisk = ['small-medium','large']; + let compareFields = ['small-medium','large']; if (isPlayersOption) { - fisk.push('size'); - fisk.push('type'); - fisk.push('knockdown'); + compareFields.push('size'); + compareFields.push('type'); + compareFields.push('knockdown'); } - return fisk.every(f => weapon1[f] === weapon2[f]) + return compareFields.every(f => weapon1[f] === weapon2[f]) } let rowId = parseSourceAttribute(eventInfo).rowId; let setWeaponFunc = function (weapon) { @@ -1663,7 +1754,7 @@ function setupFollowerWeaponsAutoFill(repeating, sections) { }); } -const followerWeapons = [ +const FOLLOWER_WEAPONS = [ {repeating: '', sections: ['', '001', '002']}, {repeating: 'hench', sections: ['003', '004', '005']}, {repeating: '', sections: ['006', '007', '008']}, @@ -1678,7 +1769,7 @@ const followerWeapons = [ {repeating: 'hench6', sections: ['033', '034', '035']}, ]; -followerWeapons.forEach(fw => { +FOLLOWER_WEAPONS.forEach(fw => { setupFollowerWeaponsAutoFill(fw.repeating, fw.sections); }); @@ -2307,11 +2398,10 @@ function weaponPoCritTemplate(prefix, fields, nameFunc, baseDamageFunc, damageAd //#region Proficiencies //Weapon proficiency slots -const updateWeaponProfsRemaining = () => repeatingCalculateRemaining('weaponprofs', ['weapprofnum'], 'weapprof-slots-total-calc', 'weapprof-slots-remain'); on('change:repeating_weaponprofs:weapprofnum remove:repeating_weaponprofs change:weapprof-slots-total-calc', function(eventInfo) { if (doEarlyReturn(eventInfo, ['weapprofnum'])) return; - updateWeaponProfsRemaining(); + repeatingCalculateRemaining('weaponprofs', ['weapprofnum'], 'weapprof-slots-total-calc', 'weapprof-slots-remain'); }); //Weapon proficiency autofill on('change:repeating_weaponprofs:weapprofname', function(eventInfo) { @@ -2638,12 +2728,14 @@ const setPsionicDisciplineVisibility = function(newValue) { elements.removeClass('sheet-show'); } } -on('change:tab8 sheet:opened', function (eventInfo) { + +const PSIONIC_SKILLS_AND_POWERS_FIELD = 'tab8'; +on(`change:${PSIONIC_SKILLS_AND_POWERS_FIELD} sheet:opened`, function (eventInfo) { if (eventInfo.newValue) return setPsionicDisciplineVisibility(eventInfo.newValue); - getAttrs(['tab8'], function (values) { - setPsionicDisciplineVisibility(values['tab8']); + getAttrs([PSIONIC_SKILLS_AND_POWERS_FIELD], function (values) { + setPsionicDisciplineVisibility(values[PSIONIC_SKILLS_AND_POWERS_FIELD]); }) }); @@ -2881,14 +2973,18 @@ PSIONIC_CORE_SECTIONS.forEach(({section, name, macro, number, cost_number, disci //#endregion // Show / Hide buttons for various repeating sections -const REPEATING_SECTIONS = [ +const FOLDABLE_REPEATING_SECTIONS = [ + ...WIZARD_SPELL_LEVELS_SECTIONS.map(e => e.sections[e.sections.length-1]).map(e => `spells-${e}`), + 'spells-wizmonster', + ...PRIEST_SPELL_LEVELS_SECTIONS.map(e => e.sections[e.sections.length-1]).map(e => `spells-${e}`), + 'spells-primonster', ...PSIONIC_CORE_SECTIONS.map(e => e.section), 'scrolls', ]; -REPEATING_SECTIONS.forEach(section => { +FOLDABLE_REPEATING_SECTIONS.forEach(section => { on(`clicked:repeating_${section}:show clicked:repeating_${section}:hide`, function (eventInfo) { let parse = parseSourceAttribute(eventInfo); - $20(`div[data-reprowid=${parse.rowId}] .sheet-hidden`).toggleClass('sheet-show'); + $20(`div[data-reprowid=${parse.rowId}] .sheet-hidden.sheet-fold`).toggleClass('sheet-show'); }); }); diff --git a/ADnD_2E_Revised/javascript/version.js b/ADnD_2E_Revised/javascript/version.js index 0bb3294495..d23f5e650e 100644 --- a/ADnD_2E_Revised/javascript/version.js +++ b/ADnD_2E_Revised/javascript/version.js @@ -1,7 +1,7 @@ // --- Version change start --- // const SHEET_NAME = 'AD&D 2E Revised'; -const SHEET_VERSION = '4.14.2'; +const SHEET_VERSION = '4.15.0'; on('sheet:opened', function(){ getAttrs(['character_sheet'],function(attrs){ @@ -28,9 +28,6 @@ on('sheet:opened', function(){ if (oldSheetVersion.isBelowMigrate(3, 3, 2)) migrate3_3_2(); - if (oldSheetVersion.isBelowMigrate(3, 4, 0)) - migrate3_4_0(); - if (oldSheetVersion.isBelowMigrate(4, 3, 0)) migrate4_3_0(); } @@ -187,13 +184,6 @@ function migrateOtherValuables() { } //#endregion -//#region version 3.4.0 -function migrate3_4_0() { - console.log('Migrating to v3.4.0'); - updateNonprofPenalty(); -} -//#endregion - //#region version 3.3.2 function migrate3_3_2() { console.log('Migrating to v3.3.2'); diff --git a/ADnD_2E_Revised/pug/spellTemplate.pug b/ADnD_2E_Revised/pug/spellTemplate.pug new file mode 100644 index 0000000000..7b383e6f23 --- /dev/null +++ b/ADnD_2E_Revised/pug/spellTemplate.pug @@ -0,0 +1,113 @@ +- let failureCheck = '' +- let arcWind = 'Arc' +if isPriest + - failureCheck = '{{checkroll=[[1d100]]%}}{{checktarget=#REPLACE2#}}{{fail=The spell is expended with absolutely no effect whatsoever.}}' + - arcWind = 'Wind' +fieldset(name="repeating_spells-#REPLACE0#" class="repeating_spells-#REPLACE0#") + div(class="sheet-spell-line") + table(class="sheet-default-header-first-row sheet-inline" style="flex-grow: 1") + tr(class="sheet-collapse sheet-show-first") + th Spell name + th Range + th Area of Effect + th(colspan="2") Casting time + th(colspan="2") Macro + tr + td(class="sheet-td-dynamic50") + input(type="text" name="attr_spell-name" title="@{repeating_spells-#REPLACE0#_$X_spell-name}" class="sheet-table-dynamic sheet-chrome" placeholder="Spell name" list="#REPLACE0#-spells") + input(type="text" name="attr_spell-name" title="@{repeating_spells-#REPLACE0#_$X_spell-name}" class="sheet-table-dynamic sheet-firefox" placeholder="Spell name" list="#REPLACE0#-spells-ff") + td(class="sheet-td-dynamic25") + input(type="text" name="attr_spell-range" title="@{repeating_spells-#REPLACE0#_$X_spell-range}" class="sheet-table-dynamic" placeholder="Range") + td(class="sheet-td-dynamic25") + input(type="text" name="attr_spell-aoe" title="@{repeating_spells-#REPLACE0#_$X_spell-aoe}" class="sheet-table-dynamic" placeholder="Area of Effect") + td + input(type="text" name="attr_spell-cast-time" title="@{repeating_spells-#REPLACE0#_$X_spell-cast-time}" class="sheet-short" placeholder="Cast time") + td + button(type="roll" name="roll_spell-init" title="@{repeating_spells-#REPLACE0#_$X_spell-init}" value!="/gmroll [[{[[1d10]]+(@{spell-cast-time})-(@{misc-mod}), 1}kh1]] [Initiative (@{spell-name})]&{tracker}") Initiative + td + button(type="roll" name="roll_spell-template" title="%{repeating_spells-#REPLACE0#_$X_spell-template}" value!="#REPLACE1#&{template:2Espell}{{title=@{spell-name}}}{{splevel=@{spell-level}}}{{school=@{spell-school}}}{{sphere=@{spell-sphere}}}{{components=@{spell-components}}}{{time=@{spell-cast-time}}}{{range=@{spell-range}}}{{duration=@{spell-duration}}}{{aoe=@{spell-aoe}}}{{save=@{spell-saving-throw}}}{{subtlety=@{spell-subtlety}}}{{sensory=@{spell-sensory}}}{{knockdown=@{spell-knockdown}}}{{crit=@{spell-crit-size}}}{{damage=@{spell-damage}}}{{damagetype=@{spell-damage-type}}}{{healing=@{spell-healing}}}{{reference=@{spell-reference}}}{{materials=@{spell-materials}}}"+failureCheck+"{{effects=@{spell-effect}}}") T + | insert_fold-button.html + table(class="sheet-default-header-first-row sheet-spell-slots sheet-hidden") + tr(class="sheet-collapse sheet-show-first") + td Cast + td + td Memorized + tr + td + input(type="number" name="attr_spell-cast-value" title="@{repeating_spells-#REPLACE0#_$X_spell-cast-value}" class="sheet-short" value="0") + td(class="sheet-centering-padding-5") / + td + input(type="number" name="attr_spell-memorized" title="@{repeating_spells-#REPLACE0#_$X_spell-memorized}" class="sheet-table-dynamic" value="0") + table(class="sheet-default-header-first-row sheet-spell-points sheet-hidden") + tr(class="sheet-collapse sheet-show-first") + td Spell Points Used + tr + td + input(type="number" name="attr_spell-points" title="@{repeating_spells-#REPLACE0#_$X_spell-points}" class="sheet-table-dynamic" value="0") + table(class="sheet-default-header-first-row sheet-spell-arcs-winds sheet-hidden") + tr(class="sheet-collapse sheet-show-first") + td #{arcWind}s Used + tr + td + input(type="number" name="attr_spell-"+arcWind.toLowerCase() title="@{repeating_spells-#REPLACE0#_$X_spell-"+arcWind.toLowerCase()+"}" class="sheet-table-dynamic" value="0") + div(class="sheet-hidden sheet-fold") + div(class="sheet-spell-fold") + table(class="sheet-default-header-odd-column" style="align-self: flex-start") + tr + th Level: + td(colspan="3") + input(type="text" name="attr_spell-level" title="@{repeating_spells-#REPLACE0#_$X_spell-level}" class="sheet-table-dynamic" placeholder="Spell level") + tr + th School: + td + input(type="text" name="attr_spell-school" title="@{repeating_spells-#REPLACE0#_$X_spell-school}" class="sheet-spell-half" placeholder="School") + th Sphere: + td + input(type="text" name="attr_spell-sphere" title="@{repeating_spells-#REPLACE0#_$X_spell-sphere}" class="sheet-spell-half" placeholder="Sphere") + tr + th Duration: + td + input(type="text" name="attr_spell-duration" title="@{repeating_spells-#REPLACE0#_$X_spell-duration}" class="sheet-spell-half" placeholder="Duration") + th Components: + td + input(type="text" name="attr_spell-components" title="@{repeating_spells-#REPLACE0#_$X_spell-components}" class="sheet-spell-half" placeholder="Components") + tr + th Subtlety: + td + input(type="text" name="attr_spell-subtlety" title="@{repeating_spells-#REPLACE0#_$X_spell-subtlety}" class="sheet-spell-half" placeholder="Subtlety") + th(style="white-space: nowrap") Saving Throw: + td + input(type="text" name="attr_spell-saving-throw" title="@{repeating_spells-#REPLACE0#_$X_spell-saving-throw}" class="sheet-spell-half" placeholder="Saving Throw") + tr + th Sensory: + td + input(type="text" name="attr_spell-sensory" title="@{repeating_spells-#REPLACE0#_$X_spell-sensory}" class="sheet-spell-half" placeholder="Sensory") + th Knockdown: + td + input(type="text" name="attr_spell-knockdown" title="@{repeating_spells-#REPLACE0#_$X_spell-knockdown}" class="sheet-spell-half" placeholder="[[d6]]") + tr + th Critical: + td + input(type="text" name="attr_spell-crit-size" title="@{repeating_spells-#REPLACE0#_$X_spell-crit-size}" class="sheet-spell-half" placeholder="Large (1d3 hits)" list="spell-crit-size") + td(colspan="2" style="background-color: transparent;") + button(type="action" name="act_spell-crit2" class="btn sheet-action-button" title="%{repeating_spells-#REPLACE0#_$X_spell-crit2}") Critical Effect + tr + th Damage: + td + textarea(name="attr_spell-damage" title="@{repeating_spells-#REPLACE0#_$X_spell-damage}" class="sheet-spell-half sheet-input-like" placeholder="[[Damage]]") + th Damage Type: + td + input(type="text" name="attr_spell-damage-type" title="@{repeating_spells-#REPLACE0#_$X_spell-damage-type}" class="sheet-spell-half" placeholder="Damage type" list="spell-damage-type") + tr + th Healing: + td(colspan="3") + textarea(name="attr_spell-healing" title="@{repeating_spells-#REPLACE0#_$X_spell-healing}" class="sheet-table-dynamic sheet-input-like" placeholder="[[Healing]]") + tr + th Reference: + td(colspan="3") + input(type="text" name="attr_spell-reference" title="@{repeating_spells-#REPLACE0#_$X_spell-reference}" class="sheet-table-dynamic" placeholder="Book Reference") + tr + th Materials: + td(colspan="3") + textarea(name="attr_spell-materials" title="@{repeating_spells-#REPLACE0#_$X_spell-materials}" class="sheet-table-dynamic sheet-input-like" placeholder="Materials") + textarea(name="attr_spell-effect" title="@{repeating_spells-#REPLACE0#_$X_spell-effect}" placeholder="Insert Spell effects." class="sheet-spell-effect") \ No newline at end of file diff --git a/ADnD_2E_Revised/sheet.json b/ADnD_2E_Revised/sheet.json index 85675addc2..1e842e273e 100644 --- a/ADnD_2E_Revised/sheet.json +++ b/ADnD_2E_Revised/sheet.json @@ -216,9 +216,21 @@ { "displayname": " " }, + { + "attribute": "spell-tracking-system", + "displayname": "System for Spell Tracking", + "type": "select", + "options": [ + "Spell Slots|spell-slots", + "Spell Points|spell-points", + "Arcs, Songs, Winds|spell-arcs-winds" + ], + "default": "spell-slots", + "description": "AD&D 2E have different systems for tracking spells, three have been implemented: Spell Slots: The default system described in the Player's Handbook. Spell Points: Introduced in Player's Option: Spells & Magic. Arcs, Songs, Winds: Introduced in Forgotten Realms, Netheril: Empire of Magic" + }, { "attribute": "misc-mod", - "displayname": "Miscellaneous modifier on Rolls", + "displayname": "Miscellaneous modifier popup on rolls", "type": "select", "options": [ "Popup on rolls|?{Misc. modifier?|0}",