-
Notifications
You must be signed in to change notification settings - Fork 0
/
UA2023PT6 Content [by MasterJedi2014] V4.js
3246 lines (3207 loc) · 159 KB
/
UA2023PT6 Content [by MasterJedi2014] V4.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* -INFORMATION-
Subject: Classes, Companion Template Options, Creatures, Subclasses, Spells, & Feats
Effect: This script adds the content from the 2023 Unearthed Arcana "Player's Handbook Playtest 6" article.
This file has been made by MasterJedi2014, borrowing a lot of code from MPMB and those who have contributed to the sheet's existing material.
Code by: MasterJedi2014, using MorePurpleMoreBetter's code as reference
Date: 2024-05-13 (sheet v13.1.0)
*/
var iFileName = "UA2023PT6 Content [by MasterJedi2014] V4.js";
RequiredSheetVersion("13.1.0");
SourceList["MJ:HB"] = {
name : "MasterJedi2014's Homebrew",
abbreviation : "MJ:HB",
date : "2024/05/13",
};
SourceList["UA23PT6"] = {
name : "Unearthed Arcana 2023: Player's Handbook Playtest 6",
abbreviation : "UA23PT6",
date : "2023/06/29",
url : "https://media.dndbeyond.com/compendium-images/ua/ph-playtest6/OJVW7QLuHjEFCCVs/UA-2023-PH-Playtest6.pdf",
};
/* Bard will not be added in this script because the Arcane, Divine, and Primal Spell Lists have been removed
from playtesting & the Bard in this UA article depends on those Spell Lists to function correctly.
Some of the code references spells that appear in later UA articles. These spells will be added to the sheet
by the scripts for those UA articles.
*/
// Add UA23PT6 Cleric class
ClassList.cleric_ua23pt6 = {
name : "Cleric (UA:PT-vi)",
regExpSearch : /(cleric|priest|clergy)/i,
source : [["UA23PT6", 9], ["MJ:HB", 0]],
primaryAbility : "Wisdom",
prerequisite : "Wisdom 13+",
prereqeval : function(v) {
return What('Wis') >= 13;
},
die : 8,
improvements : [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5],
saves : ["Wis", "Cha"],
skills : ["\n\n" + toUni("Cleric") + ": Choose two from History, Insight, Medicine, Persuasion, Religion", ""],
armor : [
[true, true, false, true],
[true, true, false, true],
],
weapons : [
[true, false, [""]],
[true, false, [""]],
],
equipment : "Cleric starting equipment:" +
"\n \u2022 Chain shirt," +
"\n \u2022 Holy Symbol," +
"\n \u2022 Mace," +
"\n \u2022 Priest's Pack," +
"\n \u2022 Shield," +
"\n \u2022 and 7 gp;" +
"\n\nAlternatively, choose 110 gp worth of starting equipment instead of the class' starting equipment.",
subclasses : ["Divine Domain", []],
attacks : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
abilitySave : 5,
spellcastingFactor : 1,
spellcastingKnown : {
cantrips : [3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
spells : "list",
prepared : true,
},
spellcastingList : {
class : ["cleric", "cleric_ua23pt6"],
},
features : {
"divine order ua23pt6" : {
name : "Divine Order",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
minlevel : 1,
description : "\n " + "Choose a Divine Order using the \"Choose Feature\" button above. The chosen option will appear in pg 3's Notes section.",
},
"spellcasting ua23pt6" : {
name : "Spellcasting",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
minlevel : 1,
description : desc([
"I can cast prepared cleric cantrips/spells, using Wisdom as my spellcasting ability.",
"I can use a holy symbol as a spellcasting focus for my cleric spells.",
"I can cast my prepared cleric spells as rituals if they have the ritual tag.",
]),
additional : levels.map(function (n, idx) {
return [3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5][idx] + " cantrips known";
}),
},
"channel divinity ua23pt6" : {
name : "Channel Divinity",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
minlevel : 2,
description : desc([
"I can channel divine energy to cause an effect; the save for this is my cleric spell DC.",
"Available effects are Divine Spark & Turn Undead; I gain additional effect options at higher levels in this class.",
"I can use Channel Divinity 2 times at 2nd Level, 3 times at 6th Level, and 4 times at 18th Level.",
]),
additional : "; regain 1 per Short Rest",
usages : [0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4],
recovery : "long rest",
},
"divine spark ua23pt6" : {
name : "Channel Divinity: Divine Spark",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
minlevel : 2,
description : desc([
"As a Magic action, I roll 1d8 + Wis modifier, targeting one creature I can see within 30 ft.",
"I either restore Hit Points to the creature equal to that total or force the creature to make a Constitution saving throw.",
"Creature takes radiant or necrotic damage, saves for half. Add an additional d8 at Cleric levels 7 (2d8), 13 (3d8), and 18 (4d8).",
]),
action : [
["action", "Channel Divinity: Divine Spark"],
],
},
"turn undead ua23pt6" : {
name : "Channel Divinity: Turn Undead",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
minlevel : 2,
description : desc([
"As a Magic action, all undead within 30 ft that can see/hear me must make a Wisdom save",
"If an undead fails this save, it is Turned for 1 minute or until it takes any damage, I become Incapacitated, or I die",
"Turned creatures gain the Frightened & Incapacitated conditions",
]),
action : [
["action", "Channel Divinity: Turn Undead"],
],
},
"subclassfeature3" : { //Ripped directly from ListClasses.js and then altered
name : "Divine Domain",
source : [["SRD", 16], ["P", 58]],
minlevel : 3,
description : desc('Choose a Domain related to your deity and put it in the "Class" field ')
},
"smite undead ua23pt6" : {
name : "Smite Undead",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
minlevel : 5,
description : desc([
"I can can cause my Turn Undead feature to smite undead, doing Wis modifier # of d8s.",
"in Radiant damage to Undead that dail their saving throw against that use of Turn Undead;",
"This Radiant damage doesn't end the turn effect.",
]),
},
"blessed strikes ua23pt6" : {
name : "Blessed Strikes",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
minlevel : 7,
description : "\n " + "Choose a Blessed Strikes option using the \"Choose Feature\" button above. The chosen option will appear in pg 3's Notes section.",
},
"commune ua23pt6" : {
name : "Commune",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
minlevel : 9,
description : desc([
"I now always have the Commune spell prepared.",
]),
spellcastingBonus : {
name : "Commune",
spells : ["commune"],
selection : ["commune"],
times : 1,
},
},
"divine intervention ua23pt6" : {
name : "Divine Intervention",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
minlevel : 10,
description : desc([
"Once per Long Rest, I can use a Magic action to cast a Cleric spell of 5th Level or lower",
"with a non-Reaction casting time with expending a spell slot or needing material components.",
]),
usages : 1,
recovery : "long rest",
},
"improved blessed strikes ua23pt6" : {
name : "Improved Blessed Strikes",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
minlevel : 14,
description : desc([
"The option I chose for Blessed Strikes at 7th Lvl grows more powerful",
]),
},
"greater divine intervention ua23pt6" : {
name : "Greater Divine Intervention",
source : [["UA23PT6", 13], ["MJ:HB", 0]],
minlevel : 20,
description : desc([
"I can cast the Wish spell when I use my Divine Intervention feature; doing so means I can not",
"use my Divine Intervention feature until I finish 2d4 Long Rests. When casting Wish with this",
"feature, I\'m immune to the stress caused by using Wish to do something other than casting a spell.",
]),
limfeaname : "Divine Inter. Wish; recharge 1 per 2d4",
usages : 1,
recovery : "long rest",
},
},
};
//// Add Cleric "Divine Order" choices
AddFeatureChoice(ClassList.cleric_ua23pt6.features["divine order ua23pt6"], true, "Divine Order: Protector", {
name : "Divine Order: Protector",
extraname : "Cleric 1",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
description : "\n " + "I gain Martial Weapons Proficiency & Heavy Armor training.",
weaponProfs : [false, true],
armorProfs : [
[false, false, true, false],
],
prereqeval : function (v) { return classes.known.cleric_ua23pt6.level >= 1 ? true : "skip"; }
}, "1st-level cleric Divine Order choice");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["divine order ua23pt6"], true, "Divine Order: Thaumaturge", {
name : "Divine Order: Thaumaturge",
extraname : "Cleric 1",
source : [["UA23PT6", 11], ["MJ:HB", 0]],
description : "\n " + "I know 1 extra cantrip from the Cleric spell list & I add my Wis modifier to Intelligence (Religion) checks.",
spellcastingBonus : [{
name : "Cleric cantrip",
spellcastingAbility : 5,
"class" : ["cleric", "cleric_ua23pt6"],
level : [0, 0],
firstCol : "atwill",
times : 1
}],
addMod : [
{ type : "skill", field : "Religion", mod : "Wis", text : "I can add my Wisdom modifier to Intelligence (Religion) checks." },
],
prereqeval : function (v) { return classes.known.cleric_ua23pt6.level >= 1 ? true : "skip"; }
}, "1st-level cleric Divine Order choice");
//// Add Cleric "Blessed Strikes" choices
AddFeatureChoice(ClassList.cleric_ua23pt6.features["blessed strikes ua23pt6"], true, "Blessed Strikes: Divine Strike", {
name : "Blessed Strikes: Divine Strike",
extraname : "Cleric 7",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
description : "\n " + "Once per turn, when I hit a creature with a weapon attack, I can do extra Radiant/Necrotic damage; damage increases at 14th Lvl",
additional : levels.map(function (n) {
return n < 7 ? "" : "+" + (n < 14 ? 1 : 2) + "d8 Radiant/Necrotic damage (choice)";
}),
calcChanges : {
atkAdd : [
function (fields, v) {
if (classes.known.cleric_ua23pt6 && classes.known.cleric_ua23pt6.level >= 7 && !v.isSpell) {
fields.Description += (fields.Description ? '; ' : '') + 'Once per turn +' + (classes.known.cleric_ua23pt6.level < 14 ? 1 : 2) + 'd8 Radiant/Necrotic damage';
}
},
"Once per turn, when I hit a creature with a weapon attack, I can do extra Radiant/Necrotic damage.",
],
},
prereqeval : function (v) { return classes.known.cleric_ua23pt6.level >= 7 ? true : "skip"; }
}, "7th-level cleric Blessed Strike choice");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["blessed strikes ua23pt6"], true, "Blessed Strikes: Potent Spellcasting", {
name : "Blessed Strikes: Potent Spellcasting",
extraname : "Cleric 7",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
description : "\n " + "I add my Wisdom modifier to the damage I deal with my cleric cantrips; At 14th Lvl, I can add 2x Wis Mod in Temp HP to myself or another creature",
additional : levels.map(function (n) {
return n < 14 ? "" : "+" + " 2x Wis Mod in Temp HP to myself or other creature within 60 ft";
}),
calcChanges : {
atkCalc : [
function (fields, v, output) {
if (classes.known.cleric_ua23pt6 && classes.known.cleric_ua23pt6.level > 7 && v.thisWeapon[3] && v.thisWeapon[4].indexOf('cleric_ua23pt6') !== -1 && SpellsList[v.thisWeapon[3]].level === 0) {
output.extraDmg += What('Wis Mod');
};
},
"My cleric cantrips get my Wisdom modifier added to their damage.",
],
spellAdd : [
function (spellKey, spellObj, spName) {
if (spName.indexOf("cleric_ua23pt6") == -1 || !What("Wis Mod") || Number(What("Wis Mod")) <= 0 || spellObj.psionic || spellObj.level !== 0) return;
return genericSpellDmgEdit(spellKey, spellObj, "\\w+\\.?", "Wis");
},
"My cleric cantrips get my Wisdom modifier added to their damage.",
],
},
prereqeval : function (v) { return classes.known.cleric_ua23pt6.level >= 7 ? true : "skip"; }
}, "7th-level cleric Blessed Strike choice");
//// Add Cleric optional choices; Ripped directly from all_WotC_pub+UA.js and then altered
AddFeatureChoice(ClassList.cleric_ua23pt6.features["spellcasting ua23pt6"], true, "Access to Dunamancy Spells", {
name : "Dunamancy Spells",
extraname : "Optional Cleric 1",
source : [["W", 186]],
description : desc([
"All dunamancy spells are added to the cleric spell list, each still pending DM's approval"
]),
calcChanges : {
spellList : [
function(spList, spName, spType) {
// Stop this is not the class' spell list or if this is for a bonus spell entry
if (spName !== "cleric_ua23pt6" || spType.indexOf("bonus") !== -1) return;
spList.extraspells = spList.extraspells.concat(["sapping sting", "gift of alacrity", "magnify gravity", "fortune's favor", "immovable object", "wristpocket", "pulse wave", "gravity sinkhole", "temporal shunt", "gravity fissure", "tether essence", "dark star", "reality break", "ravenous void", "time ravage"]);
},
"This optional class feature expands the spell list of the cleric class with all dunamancy spells (spell level in brackets): Sapping Sting (cantrip), Gift of Alacrity (1), Magnify Gravity (1), Fortune's Favor (2), Immovable Object (2), Wristpocket (2), Pulse Wave (3), Gravity Sinkhole (4), Temporal Shunt (5), Gravity Fissure (6), Tether Essence (7), Dark Star (8), Reality Break (8),Ravenous Void (9), and Time Ravage (9)."
]
}
}, "Optional 1st-level cleric features");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["spellcasting ua23pt6"], true, "Additional Cleric Spells", {
name : "Additional Cleric Spells",
extraname : "Optional Cleric 1",
source : [["T", 30]],
description : "",
calcChanges : {
spellList : [
function(spList, spName, spType) {
// Stop this is not the class' spell list or if this is for a bonus spell entry
if (spName !== "cleric_ua23pt6" || spType.indexOf("bonus") !== -1) return;
spList.extraspells = spList.extraspells.concat(["aura of vitality", "aura of life", "aura of purity", "sunbeam", "sunburst", "power word heal"]);
},
"This optional class feature expands the spell list of the cleric class with the following spells (spell level in brackets): Aura of Vitality (3), Aura of Life (4), Aura of Purity (4), Sunbeam (6), Sunburst (8), and Power Word Heal (9)."
]
}
}, "Optional 1st-level cleric features");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["channel divinity ua23pt6"], true, "Harness Divine Power", {
name : "Channel Divinity: Harness Divine Power",
extraname : "Optional Cleric 2",
source : [["T", 30]],
description : desc([
"As a bonus action, I can expend a use of my channel divinity to regain one used spell slot",
"The level of this spell slot can be no more than half my Proficiency Bonus (rounded up)",
"I can only do this so many times per long rest, even if I have uses of channel divinity left"
]),
action : [["bonus action", ""]],
usages : levels.map(function(n) {
return n < 3 ? "" : n < 6 ? 1 : n < 18 ? 2 : 3;
}),
recovery : "long rest"
}, "Optional 2nd-level cleric features");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["turn undead ua23pt6"], true, "Cantrip Versatility", {
name : "Cantrip Versatility",
extraname : "Optional Cleric 4",
source : [["T", 31]],
description : " [ASI = Ability Score Improvement]\n Whenever I gain an ASI from the cleric class, I can change one cleric cantrip for another",
prereqeval : function (v) { return classes.known.cleric_ua23pt6.level >= 4 ? true : "skip"; }
}, "Optional 4th-level cleric features");
//// Add "UA 2019: Class Feature Variants" Cleric optional choices; Ripped directly from all_WotC_pub+UA.js and then altered
AddFeatureChoice(ClassList.cleric_ua23pt6.features["spellcasting ua23pt6"], true, "Cantrip Versatility (ua:cfv)", {
name : "Cantrip Versatility",
extraname : "Optional Cleric 1",
source : [["UA:CFV", 3]],
description : "\n Whenever I gain a cleric level, I can replace a cleric cantrip I know with another"
}, "Optional 1st-level cleric features");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["spellcasting ua23pt6"], true, "Expanded Spell List (ua:cfv)", {
name : "Expanded Cleric Spell List",
extraname : "Optional Cleric 1",
source : [["UA:CFV", 3]],
description : "",
calcChanges : {
spellList : [
function(spList, spName, spType) {
// Stop this is not the class' spell list or if this is for a bonus spell entry
if (spName !== "cleric_ua23pt6" || spType.indexOf("bonus") !== -1) return;
spList.extraspells = spList.extraspells.concat(["cause fear", "wrathful smite", "branding smite", "aura of vitality", "aura of life", "aura of purity", "skill empowerment", "wall of light", "power word heal"]);
},
"This alternative class feature enhancement expands the spell list of the cleric class with the following spells (spell level in brackets): Cause Fear (1), Wrathful Smite (1), Branding Smite (2), Aura of Vitality (3), Aura of Life (4), Aura of Purity (4), Skill Empowerment (5), Wall of Light (5), and Power Word Heal (9)."
]
}
}, "Optional 1st-level cleric features");
AddFeatureChoice(ClassList.cleric_ua23pt6.features["channel divinity ua23pt6"], true, "Harness Divine Power (ua:cfv)", {
name : "Channel Divinity:\xA0Harness Divine Power",
source : [["UA:CFV", 4]],
description : "\n As a bonus action, I can use my holy symbol and a prayer to regain 1 used level 1 spell slot",
action : [["bonus action", ""]]
}, "Optional 2nd-level cleric features");
////// Add UA23PT6 Life Domain Cleric subclass
AddSubClass("cleric_ua23pt6", "life domain_ua23pt6", {
regExpSearch : /^(?=.*(cleric|priest|clergy))(?=.*\b(life|living)\b).*$/i,
subname : "Life Domain",
source : [["UA23PT6", 13], ["MJ:HB", 0], ["SRD", 17], ["P", 60]],
spellcastingExtra : ["aid", "aid ua22cs", "aura of life", "bless", "cure wounds", "cure wounds ua23pt8", "death ward", "greater restoration", "lesser restoration", "mass healing word", "mass healing word ua23pt8", "revivify", "mass cure wounds", "mass cure wounds ua23pt8"],
features : {
"subclassfeature3" : { //Ripped directly from ListClasses.js and then altered
name : "Disciple of Life",
source : [["UA23PT6", 13], ["MJ:HB", 0], ["SRD", 17], ["P", 60]],
minlevel : 3,
description : desc([
"Whenever a 1st-level or higher spell I cast restores HP to a creature, it heals more",
"The creature regains an additional 2 + spell level (SL) worth of hit points",
'Note that "X/SL" on the spell page means per spell slot level above the spell\'s normal level',
]),
calcChanges : {
spellAdd : [
// Includes Revivify and Raise Dead as they restore HP from 0 to 1, but omits Aid and Heroes' Feast as they increase max HP, not restore
function (spellKey, spellObj, spName) {
if (spellObj.psionic || !spellObj.level) return;
switch (spellKey) {
case "enervation" :
case "life transference" :
case "vampiric touch" :
var useSpellDescr = getSpellShortDescription(spellKey, spellObj);
var strAdd = " +" + (spellObj.level + 2) + "+1/SL";
spellObj.description = useSpellDescr.replace(/(heals? (half|twice)( the damage dealt| that)?)( in HP)?/, "$1" + strAdd);
return true;
case "mass heal" :
spellObj.description = spellObj.descriptionShorter.replace(/crea(tures)? in range.*cure[sd]/i, "crea in range, each then +11 HP, cured");
return true;
default :
if (!genericSpellDmgEdit(spellKey, spellObj, "heal", (2 + spellObj.level))) return;
if (spellObj.level < 9) genericSpellDmgEdit(spellKey, spellObj, "heal", "1/SL");
spellObj.discipleOfLife = true; // for Blessed Healer and Supreme Healing,
return true;
}
},
"When I use a spell that restores hit points, it restores an additional 2 + the level of the spell slot (or spell slot equivalent) used to cast the spell.",
],
},
},
"subclassfeature3.1" : {
name : "Channel Divinity: Preserve Life",
source : [["UA23PT6", 13], ["MJ:HB", 0]],
minlevel : 3,
description : desc([
"I can expend a number of Channel Divinity uses to cast an Abjuration spell",
"without expending a spell slot. The number of Channel Divinity uses required",
"equals the level of the spell being cast.",
]),
action : ["action", ""],
},
"subclassfeature6" : { //Ripped directly from ListClasses.js and then altered
name : "Blessed Healer",
source : [["UA23PT6", 13], ["MJ:HB", 0], ["SRD", 17], ["P", 60]],
minlevel : 6,
description : desc("When I restore HP to another with a spell, I regain 2 + the spell (slot) level in HP"),
calcChanges : {
spellAdd : [
// note that several healing spells are skipped because they don't restore hp at casting (only later)
function (spellKey, spellObj, spName) {
var otherHealSpells = ["mass heal", "life transference", "power word heal", "power word heal ua23pt8", "resurrection", "true resurrection"];
var noHealAtCast = ["aura of life", "aura of vitality", "goodberry", "healing elixir-uass", "healing spirit"];
if (noHealAtCast.indexOf(spellKey) !== -1) return;
if (spellObj.discipleOfLife || otherHealSpells.indexOf(spellKey) !== -1) {
var useSpellDescr = getSpellShortDescription(spellKey, spellObj).replace(/spell(casting)? (ability )?mod(ifier)?/i, "spell mod");
switch (spellKey) {
case "heal" :
case "life transference" :
case "mass heal" :
useSpellDescr = useSpellDescr.replace(" in range", "").replace(" I can see", "").replace("blindness, deafness", "blind, deaf");
break;
case "regenerate" :
useSpellDescr = useSpellDescr.replace(" for the duration; restores lost body", "; regrow");
break;
case "resurrection" :
case "true resurrection" :
useSpellDescr = useSpellDescr.replace(" with", ", ").replace("century", "100y").replace("1000gp", "1k gp");
break;
case "raise dead" :
case "revivify" :
useSpellDescr = useSpellDescr.replace(/(Resurrects?|Restores?) (a )?crea(ture)?('s)? (body )?that (has )?died in( the)?/i, "Restore crea that died in");
break;
};
var alwaysOthers = ["life transference", "raise dead", "revivify", "resurrection", "true resurrection"];
var strPart = alwaysOthers.indexOf(spellKey) === -1 ? "; if other, I heal " : "; I heal ";
var strAdd = spellObj.level < 9 ? strPart + (spellObj.level + 2) + (spellObj.noSpellUpcasting ? "" : "+1/SL") + " HP" : strPart + "11 HP";
spellObj.description = useSpellDescr + strAdd;
return true;
}
},
"When I cast a spell that restores hit points to another creature than myself at the moment of casting, I also heal 2 + the level of the spell slot (or spell slot equivalent) hit points.",
],
},
},
"subclassfeature17" : { //Ripped directly from ListClasses.js
name : "Supreme Healing",
source : [["UA23PT6", 14], ["MJ:HB", 0], ["SRD", 17], ["P", 60]],
minlevel : 17,
description : desc("When I restore HP with a spell, I heal the maximum amount instead of rolling the dice"),
calcChanges : {
spellAdd : [
function (spellKey, spellObj, spName) {
if (!spellObj.discipleOfLife) return;
return genericSpellDmgEdit(spellKey, spellObj, "heal", false, false, true, true);
},
"When I use a spell that restores hit points by rolling one or more dice to restore hit points with a spell, I instead use the highest number possible for each die.",
],
},
},
},
});
////// Add UA23PT6 Light Domain Cleric subclass
AddSubClass("cleric_ua23pt6", "light domain_ua23pt6", {
regExpSearch : /^(?=.*(cleric|priest|clergy))(?=.*\b(light|sun)\b).*$/i,
subname : "Light Domain",
source : [["UA23PT6", 14], ["MJ:HB", 0], ["P", 61]],
spellcastingExtra : ["arcane eye", "burning hands", "daylight", "faerie fire", "fireball", "flame strike", "moonbeam", "scrying", "see invisibility", "wall of fire"],
features : {
"subclassfeature3" : { //Ripped directly from all_WotC_pub+UA.js and then altered
name : "Warding Flare",
source : [["UA23PT6", 14], ["MJ:HB", 0], ["P", 61]],
minlevel : 3,
description : desc([
"When a creature within 30 ft attacks a creature and I can see it, I can interpose divine light",
"As a Reaction, I impose disadv. on the attacker's attack roll (unless it can't be blinded)",
]),
usages : "Wisdom modifier per ",
usagescalc : "event.value = Math.max(1, What('Wis Mod'));",
recovery : "long rest",
action : ["reaction", ""],
},
"subclassfeature3.1" : { //Ripped directly from all_WotC_pub+UA.js and then altered
name : "Channel Divinity: Radiance of the Dawn",
source : [["UA23PT6", 14], ["MJ:HB", 0], ["P", 61]],
minlevel : 3,
description : "\n " + "As a Magic action, in 30 ft, magical darkness is dispelled and hostiles must make a Con save" + "\n " + "Each takes radiant damage, saves for half, and negates with total cover",
additional : ["", "", "2d10 + 3 damage", "2d10 + 4 damage", "2d10 + 5 damage", "2d10 + 6 damage", "2d10 + 7 damage", "2d10 + 8 damage", "2d10 + 9 damage", "2d10 + 10 dmg", "2d10 + 11 dmg", "2d10 + 12 dmg", "2d10 + 13 dmg", "2d10 + 14 dmg", "2d10 + 15 dmg", "2d10 + 16 dmg", "2d10 + 17 dmg", "2d10 + 18 dmg", "2d10 + 19 dmg", "2d10 + 20 dmg"],
action : ["action", ""],
},
"subclassfeature6" : {
name : "Revealing Light",
source : [["UA23PT6", 14], ["MJ:HB", 0]],
minlevel : 6,
description : desc([
"Once per Long Rest, I can use a Bonus Action to cast \"See Invisibility\" without expending a spell slot.",
"Allies within 10 ft of me also gain the benefit of the spell. I can end spell with a Bonus Action.",
"While spell is active, I emite Bright Light in a 10 ft rad & Dim Light for another 10 ft.",
]),
action : ["bonus action", " (start/stop)"],
usages : 1,
recovery : "long rest",
},
"subclassfeature17" : { //Ripped directly from all_WotC_pub+UA.js and then altered
name : "Corona of Light",
source : [["UA23PT6", 14], ["MJ:HB", 0], ["P", 61]],
minlevel : 17,
description : "\n " + "As a Magic action, I have an aura of 60 ft sunlight and 30 ft dim light for 1 min" + "\n " + "Enemies in the sunlight have disadv. on saves vs. spells (inc. Radiance of the Dawn) that deal fire or radiant damage",
action : ["action", " (start/stop)"],
},
},
});
////// Add UA23PT6 Trickery Domain Cleric subclass
AddSubClass("cleric_ua23pt6", "trickery domain_ua23pt6", {
regExpSearch : /^(?=.*(cleric|priest|clergy))(?=.*(trickery|trickster)).*$/i,
subname : "Trickery Domain",
source : [["UA23PT6", 15], ["MJ:HB", 0], ["P", 63]],
spellcastingExtra : ["charm person", "disguise self", "pass without trace", "invisibility", "hypnotic pattern", "nondetection", "confusion", "dimension door", "hold monster", "mislead"],
features : {
"subclassfeature3" : { //Ripped directly from all_WotC_pub+UA.js and then altered
name : "Blessing of the Trickster",
source : [["UA23PT6", 15], ["MJ:HB", 0], ["P", 63]],
minlevel : 3,
description : "\n " + "As an action, a willing creature I touch (including me) has adv. on Dex (Stealth) checks" + "\n " + "This lasts for 1 hour or until I use it again",
action : ["action", ""],
},
"subclassfeature3.1" : { //Ripped directly from all_WotC_pub+UA.js and then altered
name : "Channel Divinity: Invoke Duplicity",
source : [["UA23PT6", 15], ["MJ:HB", 0], ["P", 63]],
minlevel : 3,
description : desc([
"As a free action, I create an illusory duplicate of myself within 30 ft of me for 1 min",
"As a Bonus Action, I can move them 30 ft to a space I can see within 120 ft & can swap places with it",
"I can cast spells as though I was in the duplicate's space, using my own senses",
"I have advantage on attacks if the target is within 5 ft of a duplicate and me",
]),
action : ["bonus action", "Move Duplicate"],
},
"subclassfeature6" : {
name : "Trickster's Magic",
source : [["UA23PT6", 15], ["MJ:HB", 0]],
minlevel : 6,
description : desc([
"I can cast an Illusion spell with an Action casting time using a Bonus Action instead.",
]),
usages : "Wisdom modifier per ",
usagescalc : "event.value = Math.max(1, What('Wis Mod'));",
recovery : "long rest",
},
"subclassfeature17" : {
name : "Improved Duplicity",
source : [["UA23PT6", 15], ["MJ:HB", 0], ["P", 63]],
minlevel : 17,
description : desc([
"I can initially teleport up to a range of 120 ft instead of 30 ft.",
"The duplicate can now move 60 ft per Bonus Action.",
"Both myself and my allies have advantage on attacks if the target is within 5 ft of the duplicate.",
"When illusion ends, myself or a creature of my choice regains HP equal to my Cleric lvl.",
]),
},
},
});
////// Add UA23PT6 War Domain Cleric subclass
AddSubClass("cleric_ua23pt6", "war domain_ua23pt6", {
regExpSearch : /^(?=.*(cleric|priest|clergy))(?=.*\b(war|fighting)\b).*$/i,
subname : "War Domain",
source : [["UA23PT6", 16], ["MJ:HB", 0], ["P", 63]],
spellcastingExtra : ["crusader's mantle", "destructive wave", "divine favor", "freedom of movement", "hold monster", "magic weapon", "shield of faith", "spirit guardians", "spiritual weapon", "spiritual weapon ua22cs", "stoneskin"],
features : {
"subclassfeature3" : {
name : "War Priest",
source : [["UA23PT6", 16], ["MJ:HB", 0], ["P", 63]],
minlevel : 3,
description : desc([
"When I use the Attack action, I can make a weapon attack as a bonus action",
"I can use the Mastery property of one kind of Simple or Martial weapon I have Proficiency in.",
"I can swap out the chosen weapon I can use the Mastery property of after a Long Rest",
]),
usages : "Wisdom modifier per ",
usagescalc : "event.value = Math.max(1, What('Wis Mod'));",
recovery : "long rest",
action : ["bonus action", " (with Attack action)"],
},
"subclassfeature3.1" : {
name : "Channel Divinity: Guided Strike",
source : [["UA23PT6", 16], ["MJ:HB", 0], ["P", 63]],
minlevel : 3,
description : desc([
"When myself or a creature within 30 ft misses an attack roll, I can use my Reaction to",
"expend a use of my Channel Divinity to add a +10 bonus to the roll.",
]),
action : ["reaction", ""],
},
"subclassfeature6" : {
name : "Channel Divinity: War God's Blessing",
source : [["UA23PT6", 16], ["MJ:HB", 0], ["P", 63]],
minlevel : 6,
description : desc([
"When I cast the \"Shield of Faith\" spell, the spell affects both myself & the creature it is cast on.",
"Once per Long Rest, I can cast the \"Shield of Faith\" spell without expending a spell slot.",
]),
usages : 1,
recovery : "long rest",
action : ["action", ""],
},
"subclassfeature17" : {
name : "Avatar of Battle",
source : [["UA23PT6", 16], ["MJ:HB", 0], ["P", 63]],
minlevel : 17,
description : "\n " + "I have resistance to Bludgeoning/Piercing/Slashing damage",
dmgres : ["Bludgeoning", "Piercing", "Slashing"],
},
},
});
// Add UA23PT6 Paladin class
ClassList.paladin_ua23pt6 = {
name : "Paladin (UA:PT-vi)",
regExpSearch : /^((?=.*paladin)|((?=.*(exalted|sacred|holy))(?=.*(knight|fighter|warrior|warlord)))).*$/i,
source : [["UA23PT6", 32], ["MJ:HB", 0]],
primaryAbility : "Strength and Charisma",
prerequisite : "Strength 13+ and Charisma 13+",
prereqeval : function(v) {
return What('Str') >= 13 && What('Cha') >= 13;
},
die : 10,
improvements : [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5],
saves : ["Wis", "Cha"],
skills : ["\n\n" + toUni("Paladin") + ": Choose two from Athletics, Insight, Intimidation, Medicine, Persuasion, Religion", ""],
armor : [
[true, true, true, true],
[false, false, false, false],
],
weapons : [
[true, true, [""]],
[true, true, [""]],
],
equipment : "Paladin starting equipment:" +
"\n \u2022 Chain mail," +
"\n \u2022 Holy Symbol," +
"\n \u2022 Javelin (6)," +
"\n \u2022 Longsword," +
"\n \u2022 Priest's Pack," +
"\n \u2022 Shield," +
"\n \u2022 and 9 gp;" +
"\n\nAlternatively, choose 150 gp worth of starting equipment instead of the class' starting equipment.",
subclasses : ["Sacred Oath", []],
attacks : [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
abilitySave : 6,
spellcastingFactor : 2,
spellcastingKnown : {
spells : "list",
prepared : true
},
spellcastingList : {
class : ["paladin", "paladin_ua23pt6"],
},
features : {
"lay on hands ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Lay on Hands",
source : [["UA23PT6", 34], ["SRD", 31], ["P", 84], ["MJ:HB", 0]],
minlevel : 1,
description : desc([
"As a Bonus Action, I can use points in my pool to heal a touched, living creature's hit points",
"I can neutralize poisons/diseases instead at a cost of 5 points per affliction",
"Note that diseases have been rolled into the Poisoned condition as of UA23PT6",
]),
usages : [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100],
recovery : "long rest",
action : [
["bonus action", ""],
],
},
"spellcasting ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Spellcasting",
source : [["UA23PT6", 34], ["SRD", 31], ["P", 84], ["MJ:HB", 0]],
minlevel : 1,
description : desc([
"I can cast prepared paladin spells, using Charisma as my spellcasting ability",
"I can use a holy symbol as a spellcasting focus for my paladin spells",
]),
},
"weapon mastery ua23pt6" : { //Using Reaction Fields for this because there are too many possible weapons to choose from and I don't know how to code FeatureChoices to take that vast number of possible weapons into account.
name : "Weapon Mastery",
source : [["UA23PT6", 34], ["MJ:HB", 0]],
minlevel : 1,
description : desc([
"I can use the Mastery property of two kinds of weapons of my choice with which I have proficiency.",
"I can change what weapons I can use the Mastery property of after finishing a Long Rest.",
]),
calcChanges : {
atkAdd : masteryFunctions.weaponMasteryAtkAdd
},
action : [
["reaction", "Wpn Mstry 1: [Wpn Name]"],
["reaction", "Wpn Mstry 2: [Wpn Name]"],
],
},
"paladins smite ua23pt6" : {
name : "Paladin's Smite",
source : [["UA23PT6", 34], ["MJ:HB", 0]],
minlevel : 2,
description : desc([
"I always have certain smite spells ready. Once per Long Rest, I can cast one of them without using a spell slot.",
"At 2nd Lvl, I gain access to: Divine Smite & Thunderous Smite; At 5th Lvl, I gain access to: Shining Smite;",
"At 9th Lvl, I gain access to: Blinding Smite; At 13th Lvl, I gain access to: Staggering Smite;",
"At 17th Lvl, I gain access to: Banishing Smite",
]),
spellcastingExtra : ["banishing smite ua23pt6", "blinding smite ua23pt6", "divine smite ua23pt6", "shining smite ua23pt6", "staggering smite ua23pt6", "thunderous smite ua23pt6"],
},
"fighting style ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Fighting Style",
source : [["UA23PT6", 34], ["SRD", 31], ["P", 84], ["MJ:HB", 0]],
minlevel : 2,
description : desc([
"Choose a Fighting Style feat for the paladin using the \"Choose Feature\" button above.",
"The chosen option will appear in pg 3's Notes section & in the list of feats",
]),
},
"channel divinity ua23pt6" : {
name : "Channel Divinity",
source : [["UA23PT6", 35], ["MJ:HB", 0]],
minlevel : 3,
description : desc([
"I can channel divine energy to cause an effect; the save for this is my paladin spell DC.",
"Available effect is Divine Sense; I gain additional effect options at higher levels in this class.",
"I can use Channel Divinity 2 times at 2nd Level & 3 times at Paladin Level 11 onward.",
]),
additional : "; regain 1 per Short Rest",
usages : [0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
recovery : "long rest",
},
"divine sense ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Channel Divinity: Divine Sense",
source : [["UA23PT6", 35], ["SRD", 30], ["P", 84], ["MJ:HB", 0]],
minlevel : 3,
description : desc([
"As a Bonus Action, I sense celestials/fiends/undead/consecrated/desecrated within 60 ft",
"For 10 minutes or until Incapacitated, I sense the location of any creature of those types & know its creature type"
]),
action : ["bonus action", ""],
},
"subclassfeature3" : { //Ripped directly from ListClasses.js and then altered
name : "Sacred Oath",
source : [["SRD", 16], ["P", 58]],
minlevel : 3,
description : desc('Choose a Sacred Oath you swear to and put it in the "Class" field '),
},
"faithful steed ua23pt6" : {
name : "Faithful Steed",
source : [["UA23PT6", 35], ["MJ:HB", 0]],
minlevel : 5,
description : desc([
"I now always have the Find Steed (UA23PT6) spell prepared.",
]),
spellcastingBonus : {
name : "Find Steed (UA23PT6)",
spells : ["find steed ua23pt6"],
selection : ["find steed ua23pt6"],
times : 1,
},
},
"aura of protection ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Aura of Protection",
source : [["UA23PT6", 35], ["SRD", 32], ["P", 85], ["MJ:HB", 0]],
minlevel : 6,
description : desc([
"While I'm conscious and not Incapacitated, allies not behind Total Cover within range and I can add my Cha mod (min 1) to saves.",
"A creature can benefit from only one Aura of Protection at a time, choosing which when entering the auras.",
"Aura increases in size to a 30 ft radius at Paladin Level 18.",
]),
additional : ["", "", "", "", "", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "30-foot aura", "30-foot aura", "30-foot aura"],
addMod : { type : "save", field : "all", mod : "max(Cha|1)", text : "While I'm conscious I can add my Charisma modifier (min 1) to all my saving throws." },
},
"abjure foes ua23pt6" : {
name : "Channel Divinity: Abjure Foes",
source : [["UA23PT6", 12], ["MJ:HB", 0]],
minlevel : 9,
description : desc([
"As a Magic action, in 30 ft, target Cha mod (min 1) number of creatures I can see within 60 ft",
"Each must succeed Wis saving throw or have Dazed & Frightened conditions for 1 min or until it takes damage",
]),
action : ["action", ""],
},
"aura of courage ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Aura of Courage",
source : [["UA23PT6", 35], ["SRD", 32], ["P", 85], ["MJ:HB", 0]],
minlevel : 10,
description : desc([
"While I'm conscious, allies within range of Aura of Protection and I can't be frightened",
"Frightened allies that enter the aura are no longer affected by the condition while in the aura",
"Aura increases in size to a 30 ft radius at Paladin Level 18.",
]),
additional : ["", "", "", "", "", "", "", "", "", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "30-foot aura", "30-foot aura", "30-foot aura"],
savetxt : { immune : ["frightened"] },
},
"radiant strikes ua23pt6" : { //Ripped directly from ListClasses.js and then altered
name : "Radiant Strikes",
source : [["UA23PT6", 35], ["SRD", 32], ["P", 85], ["MJ:HB", 0]],
minlevel : 11,
description : desc("Whenever I hit a creature with a melee weapon or unarmed strike, I do an extra 1d8 radiant damage"),
calcChanges : {
atkAdd : [
function (fields, v) { //Not sure if I set the below function up correctly
if (v.isMeleeWeapon||(v.isNaturalWeapon && v.isMeleeWeapon)) fields.Description += (fields.Description ? '; ' : '') + '+1d8 Radiant damage';
},
"With my melee weapon & unarmed strike attacks I deal an extra 1d8 radiant damage."
]
},
},
"restoring touch ua23pt6" : {
name : "Restoring Touch",
source : [["UA23PT6", 36], ["MJ:HB", 0]],
minlevel : 14,
description : desc([
"My Lay on Hands Feature can now also remove the following conditions, using 5 points from my pool for each condition:",
"Blinded, Charmed, Dazed, Deafened, Frightened, Paralyzed, or Stunned.",
"The points used to remove a condition do not also restore Hit Points to the creature.",
]),
},
},
};
//// Add Paladin "Fighting Style" choices
AddFeatureChoice(ClassList.paladin_ua23pt6.features["fighting style ua23pt6"], true, "Fighting Style: Defense", {
name : "Fighting Style: Defense",
extraname : "Paladin 2",
source : [["UA23PT6", 34], ["MJ:HB", 0]],
description : "\n " + "I have chosen the Defense Fighting Style feat.",
prereqeval : function (v) { return classes.known.paladin_ua23pt6.level >= 2 ? true : "skip"; },
eval : function() { AddFeat("Defense Fighting Style (UA23PT6)"); },
removeeval : function() { RemoveFeat("Defense Fighting Style (UA23PT6)"); }
}, "2nd-level paladin Fighting Style choice");
AddFeatureChoice(ClassList.paladin_ua23pt6.features["fighting style ua23pt6"], true, "Fighting Style: Dueling", {
name : "Fighting Style: Dueling",
extraname : "Paladin 2",
source : [["UA23PT6", 34], ["MJ:HB", 0]],
description : "\n " + "I have chosen the Dueling Fighting Style feat.",
prereqeval : function (v) { return classes.known.paladin_ua23pt6.level >= 2 ? true : "skip"; },
eval : function() { AddFeat("Dueling Fighting Style (UA23PT6)"); },
removeeval : function() { RemoveFeat("Dueling Fighting Style (UA23PT6)"); }
}, "2nd-level paladin Fighting Style choice");
AddFeatureChoice(ClassList.paladin_ua23pt6.features["fighting style ua23pt6"], true, "Fighting Style: Great Weapon Fighting", {
name : "Fighting Style: Great Weapon Fighting",
extraname : "Paladin 2",
source : [["UA23PT6", 34], ["MJ:HB", 0]],
description : "\n " + "I have chosen the Great Weapon Fighting Style feat.",
prereqeval : function (v) { return classes.known.paladin_ua23pt6.level >= 2 ? true : "skip"; },
eval : function() { AddFeat("Great Weapon Fighting Style (UA23PT6)"); },
removeeval : function() { RemoveFeat("Great Weapon Fighting Style (UA23PT6)"); }
}, "2nd-level paladin Fighting Style choice");
AddFeatureChoice(ClassList.paladin_ua23pt6.features["fighting style ua23pt6"], true, "Fighting Style: Protection", {
name : "Fighting Style: Protection",
extraname : "Paladin 2",
source : [["UA23PT6", 34], ["MJ:HB", 0]],
description : "\n " + "I have chosen the Protection Fighting Style feat.",
prereqeval : function (v) { return classes.known.paladin_ua23pt6.level >= 2 ? true : "skip"; },
eval : function() { AddFeat("Protection Fighting Style (UA23PT6)"); },
removeeval : function() { RemoveFeat("Protection Fighting Style (UA23PT6)"); }
}, "2nd-level paladin Fighting Style choice");
//// Add Paladin optional choices; Ripped directly from all_WotC_pub+UA.js and then altered
AddFeatureChoice(ClassList.paladin_ua23pt6.features["spellcasting ua23pt6"], true, "Access to Dunamancy Spells", {
name : "Dunamancy Spells",
extraname : "Optional Paladin 2",
source : [["W", 186]],
description : desc([
"All dunamancy spells are added to the paladin spell list, each still pending DM's approval"
]),
calcChanges : {
spellList : [
function(spList, spName, spType) {
// Stop this is not the class' spell list or if this is for a bonus spell entry
if (spName !== "paladin_ua23pt6" || spType.indexOf("bonus") !== -1) return;
spList.extraspells = spList.extraspells.concat(["gift of alacrity", "magnify gravity", "fortune's favor", "immovable object", "wristpocket", "pulse wave", "gravity sinkhole", "temporal shunt"]);
},
"This optional class feature expands the spell list of the paladin class with all dunamancy spells (spell level in brackets): Gift of Alacrity (1), Magnify Gravity (1), Fortune's Favor (2), Immovable Object (2), Wristpocket (2), Pulse Wave (3), Gravity Sinkhole (4), and Temporal Shunt (5)."
]
}
}, "Optional 2nd-level paladin features");
AddFeatureChoice(ClassList.paladin_ua23pt6.features["spellcasting ua23pt6"], true, "Additional Paladin Spells", {
name : "Additional Paladin Spells",
extraname : "Optional Paladin 2",
source : [["T", 52]],
description : "",
calcChanges : {
spellList : [
function(spList, spName, spType) {
// Stop this is not the class' spell list or if this is for a bonus spell entry
if (spName !== "paladin_ua23pt6" || spType.indexOf("bonus") !== -1) return;
spList.extraspells = spList.extraspells.concat(["gentle repose", "prayer of healing", "warding bond"]);
},
"This optional class feature expands the spell list of the paladin class with the following spells (spell level in brackets): Gentle Repose (2), Prayer of Healing (2), and Warding Bond (2)."
]
}
}, "Optional 2nd-level paladin features");
AddFeatureChoice(ClassList.paladin_ua23pt6.features["channel divinity ua23pt6"], true, "Harness Divine Power", {
name : "Channel Divinity: Harness Divine Power",
extraname : "Optional Paladin 3",
source : [["T", 52]],
description : desc([
"As a bonus action, I can expend a use of my channel divinity to regain one used spell slot",
"The level of this spell slot can be no more than half my Proficiency Bonus (rounded up)",
"I can only do this so many times per long rest, even if I have uses of channel divinity left"
]),
action : [["bonus action", ""]],
usages : levels.map(function(n) {
return n < 3 ? "" : n < 11 ? 1 : 2;
}),
recovery : "long rest"
}, "Optional 3rd-level paladin features");
AddFeatureChoice(ClassList.paladin_ua23pt6.features["divine sense ua23pt6"], true, "Martial Versatility", {
name : "Martial Versatility",
extraname : "Optional Paladin 4",
source : [["T", 53]],
description : " [ASI = Ability Score Improvement]\n Whenever I gain an ASI from the paladin class, I can change my paladin fighting style",
prereqeval : function (v) { return classes.known.paladin_ua23pt6.level >= 4 ? true : "skip"; }
}, "Optional 4th-level paladin features");
////// Add UA23PT6 Oath of Devotion Paladin subclass
AddSubClass("paladin_ua23pt6", "oath of devotion_ua23pt6", {
regExpSearch : /^(?=.*(devotion))((?=.*paladin)|((?=.*(exalted|sacred|holy))(?=.*(knight|fighter|warrior|warlord)))).*$/i,
subname : "Oath of Devotion",
source : [["UA23PT6", 36], ["SRD", 32], ["P", 86], ["MJ:HB", 0]],
spellcastingExtra : ["aid", "aid ua22cs", "beacon of hope", "commune", "dispel magic", "flame strike", "freedom of movement", "guardian of faith", "protection from evil and good", "shield of faith", "zone of truth"],
toNotesPage : [{
name : "Tenants of Devotion",
note : [
"Though the exact words and strictures of the Oath of Devotion vary, Paladins of this oath share these tenets:",
" \u2022 Honesty. Don’t lie or cheat. Let your word be your promise.",
" \u2022 Courage. Never fear to act, though caution is wise.",
" \u2022 Compassion. Aid others, protect the weak, and punish those who threaten them. Show mercy to your foes, but temper it with wisdom.",
" \u2022 Honor. Treat others with fairness, and let your honorable deeds be an example to them.",
" \u2022 Duty. Be responsible for your actions and their consequences, protect those entrusted to your care, and obey those who have just authority over you.",
],
page3notes : true,
popupName : "Tenants of Devotion",
source : [["UA23PT6", 37], ["MJ:HB", 0]],
}],
features : {
"subclassfeature3" : { //Ripped directly from ListClasses.js and then altered
name : "Channel Divinity: Sacred Weapon",
source : [["UA23PT6", 37], ["SRD", 33], ["P", 86], ["MJ:HB", 0]],
minlevel : 3,
description : desc([
"As a Bonus Action, for 1 minute, I add my Cha modifier to hit for one weapon I'm holding",
"It emits bright light in a 20-ft radius and equal dim light, & I can choose to deal Radiant dmg instead of normal dmg",
"Effect ends if Incapacitated, not holding or carrying the weapon, or willingly end it with a Bonus Action",
]),
action : ["bonus action", ""],
calcChanges : {
atkCalc : [
function (fields, v, output) {
if (classes.known.paladin_ua23pt6 && classes.known.paladin_ua23pt6.level > 2 && !v.isSpell && (/^(?=.*sacred)(?=.*weapon).*$/i).test(v.WeaponTextName)) {
output.extraHit += What('Cha Mod');
};
},
"If I include the words 'Sacred Weapon' in the name of a weapon, it gets my Charisma modifier added to its To Hit."
]
},
},
"subclassfeature7" : { //Ripped directly from ListClasses.js and then altered
name : "Aura of Devotion",
source : [["UA23PT6", 37], ["SRD", 33], ["P", 86], ["MJ:HB", 0]],
minlevel : 7,
description : desc([
"While I'm conscious, allies within range and I can't be charmed",
"Aura increases in size to a 30 ft radius at Paladin Level 18.",
]),
additional : ["", "", "", "", "", "", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "30-foot aura", "30-foot aura", "30-foot aura"],
savetxt : { immune : ["charmed"] },
},
"subclassfeature15" : {
name : "Blessed Healer",
source : [["UA23PT6", 37], ["MJ:HB", 0]],