diff --git a/AD&D 2E Revised/2ESheet.html b/AD&D 2E Revised/2ESheet.html
index 4e690fcff2..08e24ff679 100644
--- a/AD&D 2E Revised/2ESheet.html
+++ b/AD&D 2E Revised/2ESheet.html
@@ -9,17 +9,33 @@
Changes in
-
The Monster Sheet, Variants repeating section has been deleted
-
-
-
-
-
No data has been deleted only the HTML. If you use this section, please let me know so that I can restore it, and thereby give you access to your data.
-
The removal will be made permanent in on the 1st of October 2021 so you have approximately one month to speak up!
-
If the section stays removed, the following features will be added afterwards to the Monster Sheet
+
Monster Sheet
-
Repeating Weapons / attack table allowing for adding more attacks to a monster
-
Repeating spells, allowing monsters to use the full list of spells, currently available to players. This also include rolling spells secretly as the DM, so that players cannot see what spell you are using
+
Repeating Weapons / attack table allowing for adding more attacks to a monster.
+
+
Attacks can be public or private via general switch
+
Weapons auto fill like for players. Magical weapons adds bonus to ThAC0, Damage and Speed
+
Only S/M damage is listed for weapons as it is most likely that monsters will his players that are small / medium
+
+
+
Repeating spells, allowing monsters to use the full list of spells, currently available to players. This also include rolling spells secretly as the DM, so that players cannot see what spell you are using.
+
+
Spells can be public or private via general switch
+
+
+
Added datalist for Monster Frequency
+
Added datalist for Monster Intelligence
+
Added datalist for Monster Size
+
Added datalist for Monster Morale
+
Added the first User option for the sheet. Now GMs can define the default value for if monster attacks should be public or private
+
+
Player Sheet
+
+
New styling for proficiency slots calculation. Now the total amount of slots can easier be verified
+
+
General sheet changes
+
+
All magical weapons now reduce speed down to a minimum of 0 instead of 1. The rule was found in the PHB (p. 127)
diff --git a/AD&D 2E Revised/html/wizard-spell-template.html b/AD&D 2E Revised/html/wizard-spell-template.html
index 7aa5839680..99618b044a 100644
--- a/AD&D 2E Revised/html/wizard-spell-template.html
+++ b/AD&D 2E Revised/html/wizard-spell-template.html
@@ -63,7 +63,7 @@
-
+
diff --git a/AD&D 2E Revised/img/background-parchment_paper_seamless_pattern.jpg b/AD&D 2E Revised/img/background-parchment_paper_seamless_pattern.jpg
new file mode 100644
index 0000000000..64ad4e99df
Binary files /dev/null and b/AD&D 2E Revised/img/background-parchment_paper_seamless_pattern.jpg differ
diff --git a/AD&D 2E Revised/img/rolltemplate-ac.png b/AD&D 2E Revised/img/rolltemplate-ac.png
new file mode 100644
index 0000000000..17e767ddad
Binary files /dev/null and b/AD&D 2E Revised/img/rolltemplate-ac.png differ
diff --git a/AD&D 2E Revised/img/rolltemplate-crit.png b/AD&D 2E Revised/img/rolltemplate-crit.png
new file mode 100644
index 0000000000..16b75c5655
Binary files /dev/null and b/AD&D 2E Revised/img/rolltemplate-crit.png differ
diff --git a/AD&D 2E Revised/img/rolltemplate-scatter-diagram.png b/AD&D 2E Revised/img/rolltemplate-scatter-diagram.png
new file mode 100644
index 0000000000..7e86c63811
Binary files /dev/null and b/AD&D 2E Revised/img/rolltemplate-scatter-diagram.png differ
diff --git a/AD&D 2E Revised/img/sheet-logo.png b/AD&D 2E Revised/img/sheet-logo.png
new file mode 100644
index 0000000000..ad0178e060
Binary files /dev/null and b/AD&D 2E Revised/img/sheet-logo.png differ
diff --git a/AD&D 2E Revised/javascript/priestSpells.js b/AD&D 2E Revised/javascript/priestSpells.js
index 25018ae55a..568b2f354b 100644
--- a/AD&D 2E Revised/javascript/priestSpells.js
+++ b/AD&D 2E Revised/javascript/priestSpells.js
@@ -3145,4 +3145,12 @@ priestSpells['pri4'] = pri4;
priestSpells['pri5'] = pri5;
priestSpells['pri6'] = pri6;
priestSpells['pri7'] = pri7;
+
+const primonster = {};
+for (const [_, section] of Object.entries(priestSpells)) {
+ for (const [spellName, spell] of Object.entries(section)) {
+ primonster[spellName] = spell;
+ }
+}
+priestSpells['primonster'] = primonster;
/* ---- Priest spells end ---- */
\ No newline at end of file
diff --git a/AD&D 2E Revised/javascript/sheetWorkers.js b/AD&D 2E Revised/javascript/sheetWorkers.js
index 678f02f758..66cff355e8 100644
--- a/AD&D 2E Revised/javascript/sheetWorkers.js
+++ b/AD&D 2E Revised/javascript/sheetWorkers.js
@@ -814,6 +814,7 @@ wizardSpellLevelsSections.forEach(spellLevel => {
setupAutoFillSpellInfo(lastSection, wizardSpells);
}
});
+setupAutoFillSpellInfo("wizmonster", wizardSpells);
priestSpellLevelsSections.forEach(spellLevel => {
let prefix = `spell-priest-level${spellLevel.level}`;
@@ -830,6 +831,7 @@ priestSpellLevelsSections.forEach(spellLevel => {
setupAddPriestSpell(lastSection);
}
});
+setupAutoFillSpellInfo("primonster", priestSpells);
// --- End setup Spell Slots --- //
// --- Start setup Spell Points, Arc, and Wind --- //
@@ -933,7 +935,7 @@ on('change:nonprof-penalty', function (eventInfo) {
});
})
-function getWeaponWithBonus(weaponName) {
+function getWeaponWithBonus(weaponName, isMonster) {
if (!weaponName)
return undefined;
@@ -942,26 +944,40 @@ function getWeaponWithBonus(weaponName) {
if (baseWeapon) {
return {
...baseWeapon,
- bonus: '0'
+ 'bonus' : '0'
};
}
- let match = weaponName.match(/\s*\+[0-9]+\s*/);
+ let match = weaponName.match(/\s*\+([0-9])+\s*/);
if (!match)
return undefined;
let baseWeaponName = weaponName.replace(match[0], ' ').trim();
baseWeapon = weapons[baseWeaponName];
- let bonusString = match[0].trim().replace('+', '');
- let bonus = parseInt(bonusString)
- if (!baseWeapon || isNaN(bonus))
+ if (!baseWeapon)
return undefined;
+ let bonusString = match[1];
+ let bonus = parseInt(bonusString)
+ if (isNaN(bonus))
+ return undefined;
+
+ if (bonus < 1)
+ return {
+ ...baseWeapon,
+ 'bonus' : '0'
+ };
+
let weaponWithBonus = {
...baseWeapon,
- 'speed' : Math.max(baseWeapon['speed'] - bonus, 1),
+ 'speed' : Math.max(baseWeapon['speed'] - bonus, 0),
'bonus' : `+${bonus}`
}
+ if (isMonster) {
+ weaponWithBonus['small-medium'] += `+${bonus}`
+ weaponWithBonus['thac0'] = `@{monsterthac0}-${bonus}`
+ }
+
return weaponWithBonus;
}
@@ -1088,6 +1104,22 @@ followerWeapons.forEach(fw => {
setupFollowerWeaponsAutoFill(fw.repeating, fw.sections)
});
+// Monster weapons
+on('change:repeating_monsterweapons:weaponname', function(eventInfo){
+ let weapon = getWeaponWithBonus(eventInfo.newValue, true);
+ if (weapon === undefined)
+ return;
+
+ let weaponInfo = {
+ [`repeating_monsterweapons_attacknum`] : weapon['rof'] || '1',
+ [`repeating_monsterweapons_ThAC0`] : weapon['thac0'] || '@{monsterthac0}',
+ [`repeating_monsterweapons_damsm`] : weapon['small-medium'],
+ [`repeating_monsterweapons_weapspeed`] : weapon['speed'],
+ };
+
+ setAttrs(weaponInfo);
+});
+
//Weapon proficiency slots
on('change:repeating_weaponprofs:weapprofnum remove:repeating_weaponprofs', function(eventInfo) {
if (doEarlyReturn(eventInfo, ['weapprofnum']))
diff --git a/AD&D 2E Revised/javascript/version.js b/AD&D 2E Revised/javascript/version.js
index 5ea0280ebb..55c200e116 100644
--- a/AD&D 2E Revised/javascript/version.js
+++ b/AD&D 2E Revised/javascript/version.js
@@ -1,7 +1,7 @@
// --- Version change start --- //
const sheetName = 'AD&D 2E Revised';
-const sheetVersion = '4.1.4';
+const sheetVersion = '4.2.0';
on('sheet:opened', function(){
getAttrs(['character_sheet'],function(attrs){
diff --git a/AD&D 2E Revised/javascript/wizardSpells.js b/AD&D 2E Revised/javascript/wizardSpells.js
index 9973e603bd..ffafb4354d 100644
--- a/AD&D 2E Revised/javascript/wizardSpells.js
+++ b/AD&D 2E Revised/javascript/wizardSpells.js
@@ -5341,4 +5341,12 @@ wizardSpells['wiz6'] = wiz6;
wizardSpells['wiz7'] = wiz7;
wizardSpells['wiz8'] = wiz8;
wizardSpells['wiz9'] = wiz9;
+
+const wizmonster = {};
+for (const [_, section] of Object.entries(wizardSpells)) {
+ for (const [spellName, spell] of Object.entries(section)) {
+ wizmonster[spellName] = spell;
+ }
+}
+wizardSpells['wizmonster'] = wizmonster;
/* ---- Wizard spells end ---- */
diff --git a/AD&D 2E Revised/sheet.json b/AD&D 2E Revised/sheet.json
index 4ee90ebfdb..763133703a 100644
--- a/AD&D 2E Revised/sheet.json
+++ b/AD&D 2E Revised/sheet.json
@@ -5,5 +5,18 @@
"preview": "2EPreview.png",
"roll20userid": "2569950, 5062881",
"instructions": "#Message from current Author Peter B.(2020)\rThe sheet has been updated with more options for players to choose between rule sets such as the standard rule set from the Player's Handbook and the additional material from the Player's Option.\rTo follow current development or for any future development request please write a post on https://app.roll20.net/forum/post/9311682/official-ad-and-d-2e-revised-update-thread.\rThe full change log is always available at https://wiki.roll20.net/ADnD_2nd_Edition_Character_sheet#Changelog\r\r#Message from Original Author Seth (2017)\rThis sheet supports Advanced Dungeons and Dragons 2nd Edition Revised for both Player Characters and Monsters. This sheet has full integration for macro support within many fields of the sheet. Many fields are now auto-calculating fields. Please update these trackers by changing a quantity value and then changing it back.",
- "legacy": false
+ "legacy": false,
+ "useroptions": [
+ {
+ "attribute": "wtype",
+ "displayname": "Should Monster attacks be public to players or private (Only send to the GM)?",
+ "type": "select",
+ "options": [
+ "Public|@{character_name}",
+ "To GM|/w gm @{character_name}"
+ ],
+ "default": "",
+ "description": "By default all monster attacks are public. These attacks include the static buttons ThAC0, Attack 1-3, Special attack. It also include the repeating buttons Hit, Damage, Special damage, and Spell. To GM rolls will send the mentioned buttons only to yourself and the GM. Thus is a GM clicks the button, only the GM can see it."
+ }
+ ]
}