diff --git a/GammaWorld3e/README.rst b/GammaWorld3e/README.md similarity index 100% rename from GammaWorld3e/README.rst rename to GammaWorld3e/README.md diff --git a/GammaWorld3e/sheet.html b/GammaWorld3e/sheet.html index cda4d0449c..40a6528be9 100644 --- a/GammaWorld3e/sheet.html +++ b/GammaWorld3e/sheet.html @@ -1,1874 +1,5 @@ - -
-

Gamma World 3e

- - - -
- -
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
-
-

Physical Abilities

-
-
-
Cur.
-
Orig.
-
Adv.
-
Tmp.
-
Mod.
-
Roll
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
-

Mental Abilities

-
-
-
Cur.
-
Orig.
-
Adv.
-
Tmp.
-
Mod.
-
Roll
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
-
-
-
-
-

Mutations

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - - -
-
- y -
-
-
- -
-
- - - - - -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
-
-

Attacks

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
- y -
-
-
-
Type
-
- -
-
Skill
-
- -
-
-
-
-
-
Effect
-
- -
-
Critical
-
- -
-
-
-
-
-
Tech Lvl.
-
- -
-
Tech Rank
-
- -
-
-
-
Notes
-
- -
-
-
-
-
-
-
-

Armour

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- y -
-
-
Notes
-
- -
-
Tech Lvl.
-
- -
-
Tech Rank
-
- -
-
-
-
Powered - -
-
- - - - - - - -
-
-
-
-
Air Supply (hrs)
-
- -
-
-
-
-
-
Sensors
-
- -
-
-
-
-
-
-
-
No. Cells
-
- -
-
-
-
-
-
Cells Type
-
- -
-
-
-
-
-
Power Duration (hours)
-
- -
-
-
-
-
-
-
-
Strength x
-
- -
-
-
-
-
-
Speed x
-
- -
-
-
-
-
-
Enc. x
-
- -
-
-
-
-
-
-
Shield - -
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
Helmet - -
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
-
-
-
-
-

Gear

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
-
-
-
-

Movement

-
-
-
-
-
-
- -
-
- - -
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
kg.
-
-
-
-

Combat Stats

-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
- -
-
- -
-
- -
-
-
-
-
-
Physical
-
-
-
-
-
-
-
-
-
-
Energy
-
-
-
-
-
-
-
-
-
-
Mental
-
-
-
-
-
-
-
-
-
-
-

Notes

-
-
-
- -
-
- y -
-
-
Description
-
- -
-
-
-
-
-
-
-
-

Skills

-
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
-

Talents

-
-
- -
-
-
-
-
- -
-
- -
-
- y -
-
-
Affects:
-
- -
-
Act Factor:
-
- -
-
Notes
-
- -
-
-
-
-
-
-
-
-

Coins

-
-
- -
-
- -
-
-
-
Nickels
-
- -
-
-
-
Silver Coins
-
- -
-
-
-
Gold Coins
-
- -
-
-
-
Domars
-
- -
-
-
-
Dahlers
-
- -
-
-
-
Daublers
-
- -
-
-
-
-
-
-

Cells

-
-
- -
-
- -
-
-
-
Atomic
-
- -
-
-
-
Chemical
-
- -
-
-
-
Hydrogen
-
- -
-
-
-
Solar
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-

-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-

Combat Stats

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- -
-
- -
-
- -
-
-
-
Physical
-
-
-
-
-
-
-
-
Energy
-
-
-
-
-
-
-
-
Mental
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-

Physical Abilities

-
-
-
Cur.
-
Orig.
-
Adv.
-
Tmp.
-
Mod.
-
Roll
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
-

Mental Abilities

-
-
-
Cur.
-
Orig.
-
Adv.
-
Tmp.
-
Mod.
-
Roll
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
-
-
-
-
-

Mutations

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- y -
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-

Attacks

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- y -
-
-
-
Type
-
- -
-
Skill
-
- -
-
-
-
-
-
Effect
-
- -
-
Critical
-
- -
-
-
-
-
-
Tech Lvl.
-
- -
-
Tech Rank
-
- -
-
-
-
Notes
-
- -
-
-
-
-
-
-
-
-
- -
-
- -
-
-
-
-
-
-
-
-

Ability Scores

-
- - - -
-

Hit Points

-
- - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/GammaWorld3e/sheet.json b/GammaWorld3e/sheet.json index 04bf56360e..0cbb2b6e9f 100644 --- a/GammaWorld3e/sheet.json +++ b/GammaWorld3e/sheet.json @@ -3,7 +3,7 @@ "css": "styles.css", "authors": "Noel da Costa", "roll20userid": "3920005", - "instructions": "# Instructions/r/r## Using the sheet/r/r### Overview/r/rThis sheet is for use with the GammaWorld 3rd edition rules./r/r### Abilities/r/r3e required that character abilities be rolled randomly. This is currently a requirement on the sheet - you can't edit your attributes directly. To roll your character's abilities, click on the `Roll-up` tab, here you can roll attributes and hitpoints. If you wish to re-roll you need to first click `Reset`./r/r- Adv. - This represents your character's advancement through XP. If you take your ability scores up with XP add the amount in this field./r- Tmp. - Any temporary modifiers to an ability score should be entered in this field/r- Mod. - The ability modifier is calculated automatically/r/r### Combat Stats/r/r#### Defence/r/rNote that this is a slight departure from the original character sheets included with the rules in that it splits defence ratings across `energy`, `physical` and `mental`. These were implied in the rules but not fully represented on the PnP character sheet. These are calculated values based on Gear, Armour and Mutation entries./r/r- _CS_: Column Shift/r- _RF_: Result Factor/r- _DR_: Damage Reduction", + "instructions": "This sheet is for use with the GammaWorld 3rd edition rules. Character abilities must be rolled randomly, this is currently a requirement on the sheet - you cannot edit your attributes directly. To roll your character's abilities, click on the `Roll-up` tab, here you can roll attributes and hitpoints. If you wish to re-roll you need to first click `Reset`. Note that this is a slight departure from the original character sheets included with the rules in that it splits defence ratings across `energy`, `physical` and `mental`. These were implied in the rules but not fully represented on the PnP character sheet. These are calculated values based on Gear, Armour and Mutation entries. CS: Column Shift RF: Result Factor DR: Damage Reduction", "preview": "GW3-sheet.png", "legacy": true } \ No newline at end of file diff --git a/GammaWorld3e/src/api-scripts/companion.js b/GammaWorld3e/src/api-scripts/companion.js index 1574992bdf..396083ca71 100644 --- a/GammaWorld3e/src/api-scripts/companion.js +++ b/GammaWorld3e/src/api-scripts/companion.js @@ -48,8 +48,7 @@ function empty(mixedVar) { return false; } -// @license: GammaWorld compendium not included for licensing reasons, but you can create your own, contact me for advice on how -// import compendium from './compendium' +import compendium from "./compendium"; var GW3Companion = GW3Companion || @@ -63,10 +62,12 @@ var GW3Companion = // Styling for the chat responses. const styles = { reset: "padding: 0; margin: 0;", + menuborder: + "border: 0px solid transparent; border-radius: 4px; padding: 6px; background: red;", menu: - "background-color: #fff; border: 1px dashed #ae2400; padding: 5px 5px 10px 5px; border-radius: 5px;", + "background-color: #f1f1f1; border: 5px solid transparent; padding: 6px 5px 10px 5px; border-radius: 4px;", button: - "background-color: #000; border: 1px solid #292929; border-radius: 3px; padding: 5px; color: #fff; text-align: center;", + "background-color: #000; border: 1px solid #292929; border-radius: 3px; padding: 5px; color: #f1f1f1; text-align: center;", list: "list-style: none;", float: { right: "float: right;", @@ -83,6 +84,10 @@ var GW3Companion = fullWidth: "width: 100%;", underline: "text-decoration: underline;", strikethrough: "text-decoration: strikethrough", + border: + "margin-top: 1rem; border: 1px solid #aaa; padding: 1rem; border-radius: 5px;", + description: + "font-weight: normal; margin-top: 5px; border: 1px solid grey; padding: 1rem; border-radius: 5px; background-color: #aaa; color: white;", effect: "font-weight: bold; margin-top: 5px; border: 1px solid grey; padding: 1rem; border-radius: 5px; background-color: #aaa; color: white;", }, @@ -217,6 +222,7 @@ var GW3Companion = log(msg); log("GM issued " + script_name + " msg: " + msg.content); log("GM issued " + script_name + " command: " + command); + log("state config", state[state_name].config.command); if (command == state[state_name].config.command) { switch (extracommand) { case "reset": @@ -294,10 +300,14 @@ var GW3Companion = case "act": log("ACT roll"); if (args.length > 0) { + log("args obj..."); log(args); // Get main settings let rankSetting = args.shift().split("|"); + log("rankSetting..."); + log(rankSetting); let rank = rankSetting.shift(); + log("rank: ", rank); let roll1 = rankSetting[0]; let roll2 = rankSetting[1]; @@ -306,6 +316,7 @@ var GW3Companion = log("parameters: "); log(parameters); log("act passed rank: " + rank); + log("roll1 & roll2..."); log(roll1); log(roll2); // log(value); @@ -326,14 +337,21 @@ var GW3Companion = break; case "category": log("category"); + log("args length:" + args.length); if (args.length > 0) { let category = args.shift(); + log("category: " + category); let cost = 0; data = getData(); + if (!data) { + return; + } + log("got data"); listItems = []; let items = Object.keys(data[category]); let subcat = {}; let header = ""; + log("got items"); _.each(items, (item) => { // render type headers if (data[category][item].type) { @@ -394,8 +412,18 @@ var GW3Companion = case "compendium": log("compendium"); data = getData(); + if (!data) { + return; + } listItems = []; - let categories = ["armour", "attacks", "gear", "mutations"]; + let categories = [ + "armour", + "attacks", + "gear", + "mutations", + "skills", + "talents", + ]; _.each(categories, (category) => { button = makeButton( ucFirst(category), @@ -484,10 +512,20 @@ var GW3Companion = } return { colour, RF, background }; }, + /** + * @param {object} msg the msg object from chat window + * @param {string} rank the rank column to roll against + * @param {object} parameters the message content parsed as key, value pairs + * @param {Number} roll1 the ability ACT roll (i.e. number from 1 - 100) + * @param {Number} roll2 the save ACT roll (i.e. number from 1 - 100) + */ rollAct = (msg, rank, parameters = {}, roll1, roll2) => { const self = this; log("rollACT: " + rank); const data = getData(); + if (!data) { + return; + } let save, rankHTML = "", effectType = "effect", @@ -497,7 +535,8 @@ var GW3Companion = colorResult = {}, effectName = "", category = parameters["category"], - dmgTotalString = ""; + dmgTotalString = "", + orig_rank = parseInt(rank); rank = parseInt(rank); rankHTML = `${rank}`; sendChat(msg.playerid, "/roll 2d100", function (ops) { @@ -517,9 +556,9 @@ var GW3Companion = log("roll1: " + roll1); log("roll2: " + roll2); if (parameters["mod"]) { - // log('calculating rank based on mod'); + // log('calculating rank based on modifier'); // log(parameters['character']); - // log(`${parameters['mod']}_mod`); + // log(`${parameters['modifier']}_mod`); // log(getAttrByName(parameters['character'], 'PS_modifier')); const mod = parseInt( @@ -532,9 +571,9 @@ var GW3Companion = rank += mod; } if (parameters["character"]) { + character = getObj("character", parameters["character"]); log("character: "); log(character); - character = getObj("character", parameters["character"]); } if (parameters["CS"]) { log("calculating rank based on CS: " + parseInt(parameters["CS"])); @@ -585,18 +624,92 @@ var GW3Companion = // log(attribute); // }); } + // minus target's DX mod for melee attacks - if ( - parameters["category"] === "attacks" && - parameters["type"] === "melee" - ) { - let targetDXmod = getAttrByName( - targetCharacter.id, - "DX_modifier" + if (parameters["category"] === "attacks") { + let character_rank = parseInt( + getAttrByName(character.id, "character_rank") ); - log("targetDXmod: " + targetDXmod); - rankHTML += ` - ${targetDXmod}`; - rank -= parseInt(targetDXmod); + log("character"); + log(character); + log("talents"); + + rank += character_rank; + rankHTML += ` + ${character_rank}`; + if (parameters["type"] === "melee") { + let targetDXmod = getAttrByName( + targetCharacter.id, + "DX_modifier" + ); + log("targetDXmod: " + targetDXmod); + rankHTML += ` - ${targetDXmod}`; + rank -= parseInt(targetDXmod); + } + if (parameters["type"] === "throwing") { + let throwingTalent = filterObjs( + (a) => + a.get("type") === "attribute" && + a.get("characterid") === character.id && + /^repeating_talents_[^_]*_ref$/.test(a.get("name")) && + a.get("current") === "throwing" + ); + if (throwingTalent.length) { + rankHTML += ` + ${character_rank}`; + rank += character_rank; + } + } + if (parameters["type"] === "shooting") { + let shootingTalent = filterObjs( + (a) => + a.get("type") === "attribute" && + a.get("characterid") === character.id && + /^repeating_talents_[^_]*_ref$/.test(a.get("name")) && + a.get("current") === "shooting" + ); + if (shootingTalent.length) { + rankHTML += ` + ${character_rank}`; + rank += character_rank; + } + } + if (parameters["type"] === "grappling") { + let grapplingTalent = filterObjs( + (a) => + a.get("type") === "attribute" && + a.get("characterid") === character.id && + /^repeating_talents_[^_]*_ref$/.test(a.get("name")) && + a.get("current") === "grappling" + ); + if (grapplingTalent.length) { + rankHTML += ` + ${character_rank}`; + rank += character_rank; + } + } + if (parameters["type"] === "martialarts") { + let martialartsTalent = filterObjs( + (a) => + a.get("type") === "attribute" && + a.get("characterid") === character.id && + /^repeating_talents_[^_]*_ref$/.test(a.get("name")) && + a.get("current") === "martialarts" + ); + if (martialartsTalent.length) { + rankHTML += ` + ${character_rank}`; + rank += character_rank; + } + } + if (parameters["type"] === "brawling") { + let brawlingTalent = filterObjs( + (a) => + a.get("type") === "attribute" && + a.get("characterid") === character.id && + /^repeating_talents_[^_]*_ref$/.test(a.get("name")) && + a.get("current") === "brawling" + ); + if (brawlingTalent.length) { + rankHTML += ` + ${character_rank}`; + rank += character_rank; + } + } } } @@ -617,7 +730,7 @@ var GW3Companion = } colorResult = getRollColour(roll1, row); - // log('color: ' + colour); + log("colorResult: " + colorResult); // log('background: ' + background); // log('RC: ' + background); // log('RF: ' + RF); @@ -643,36 +756,53 @@ var GW3Companion = "damage parameter: " + parameters["dmg"] + " - " + - parameters["damage_type"] + parameters["dmg_type"] ); - let baseDmg, + let baseDmg = 0, DR = 0, - soaked; - if (parameters["dmg"] === "mutation") { - baseDmg = parseInt(rank) / 2; + dmgAfterDRsoak = 0; + if (parameters["dmg"] === "mutation" || parameters["dmg"] === "M") { + baseDmg = parseInt(orig_rank) / 2; } else if (parameters["dmg"].includes("/")) { + //- cater for damage ratings for different sizes let dmg = parameters["dmg"].split("/"); log("dmg: "); log(dmg); let size = getAttrByName(targetCharacter.id, "character_size") || 3; log("size: " + size); - baseDmg = parseInt(size) < 4 ? dmg[0] : dmg[1]; + baseDmg = + parseInt(size) < 4 ? parseInt(dmg[0]) : parseInt(dmg[1]); + log("baseDmg after size: " + baseDmg); + if (_.isNaN(baseDmg)) baseDmg = 0; } else { baseDmg = parseInt(parameters["dmg"]); + if (_.isNaN(baseDmg)) baseDmg = 0; } + + if (parameters["category"] === "attacks") { + if (parameters["skilldmg"]) { + log("baseDmg orig_rank: " + orig_rank); + log("baseDmg before skilldmg: " + baseDmg); + baseDmg += parseInt(orig_rank); + log("baseDmg after skilldmg: " + baseDmg); + } + } + log("baseDMG: " + baseDmg); log("RF: " + colorResult.RF); DR = getAttrByName(targetCharacter.id, "DR_physical") || 0; log("DR: " + DR); + log("DR in: " + parseInt(DR)); let dmgTotal = parseInt(colorResult.RF) * parseInt(baseDmg); - if (DR) { - soaked = dmgTotal + parseInt(DR); - } - soaked = soaked < 1 ? 0 : soaked; + if (_.isNaN(dmgTotal)) dmgTotal = 0; + dmgAfterDRsoak = dmgTotal; + dmgAfterDRsoak += parseInt(DR); + dmgAfterDRsoak = dmgAfterDRsoak < 1 ? 0 : dmgAfterDRsoak; log("dmgTotal: " + dmgTotal); - dmgTotalString = `Physical Damage: ${soaked}`; + log("dmgAfterDRsoak: " + dmgAfterDRsoak); + dmgTotalString = `Physical Damage: ${dmgAfterDRsoak}`; } content += makeResult( @@ -698,35 +828,70 @@ var GW3Companion = } }; - // check save from item or from damage type - if (parameters["damage_type"]) { - if (data["damage_types"][parameters["damage_type"]]) { - if (data["damage_types"][parameters["damage_type"]]["save"]) { - save = data["damage_types"][parameters["damage_type"]].save; + // show ability description + if (parameters["describe"] === "on") { + const description = _.defaults( + data[parameters["category"]][parameters["id"]], + { description: false } + ).description; + if (description) { + content += `
${description}
`; + } + } + + if (parameters["save"]) { + save = parameters["save"]; + } + let effectsContent = ""; + // override save type from damage type + if (parameters["dmg_type"]) { + log( + "Damage Type: " + + data["damage_types"][parameters["dmg_type"]].name + ); + if (data["damage_types"][parameters["dmg_type"]]) { + if (data["damage_types"][parameters["dmg_type"]].save) { + save = data["damage_types"][parameters["dmg_type"]].save; + } + if (data["damage_types"][parameters["dmg_type"]].effect_crit) { + parameters["effect_crit"] = + data["damage_types"][parameters["dmg_type"]].effect_crit; + } + if (data["damage_types"][parameters["dmg_type"]].effect) { + parameters["effect"] = + data["damage_types"][parameters["dmg_type"]].effect; + } + if (data["damage_types"][parameters["dmg_type"]].description) { + content += `
Damage Type: ${ + data["damage_types"][parameters["dmg_type"]].name + }

${ + data["damage_types"][parameters["dmg_type"]].description + }

`; } } } if (parameters["effect"]) { effectName = parameters["effect"]; + log("effect name: " + effectName); if ( !empty(data.effects) && !empty(data.effects[parameters["effect"]]) ) { - effectName = data.effects[parameters["effect"]].name; + effectDisplayName = data.effects[parameters["effect"]].name; + log("effect name: " + effectDisplayName); // let result = getEffectResult(parameters['effect'], colorResult.background); - content += `
Effect:
${effectName}
`; + content += `
Effect:
${effectDisplayName}
`; } else if ( !empty(data.damage_types) && data.damage_types[parameters["effect"]] ) { - log( - "damage_type based on effect: " + - parameters["effect"] + - ", " + - data.damage_types[parameters["effect"]] - ); - content += `
Effect: Critical Effect: ${ data.effects[parameters["effect_crit"]].name }
`; - } else if (data.damage_types[parameters["effect_crit"]]) { - log(data.damage_types); - log(parameters["effect_crit"]); - log(data.damage_types[parameters["effect_crit"]]); - content += `
Critical Effect: ${ - data.damage_types[parameters["effect_crit"]].name - }
`; - save = data.damage_types[parameters["effect_crit"]].save; } + // else if (data.damage_types[parameters["effect_crit"]]) { + // log("Crit effect according to Damage Type"); + // log(data.damage_types); + // log(parameters["effect_crit"]); + // log(data.damage_types[parameters["effect_crit"]]); + // content += `
Critical Effect: ${ + // data.damage_types[parameters["effect_crit"]].name + // }
`; + // save = data.damage_types[parameters["effect_crit"]].save; + // content += renderSaveRoll( + // save, + // targetCharacter, + // roll2, + // parameters, + // effectType, + // colorResult, + // effectName + // ); + // } } } - - if (parameters["save"]) { - save = save || parameters["save"]; - let saveScore = getAttrByName(targetCharacter.id, `${save}`); - let effectsActRow = getActRow(saveScore); - let effectsColorResult = getRollColour(roll2, effectsActRow); - let effectsResult = { result: effectsColorResult.background }; - let result = ""; - log("effectType: " + effectType); - log(parameters[effectType]); - if (!empty(data.effects) && data.effects[parameters[effectType]]) { - effectsResult = getEffectResult( - parameters[effectType], - effectsColorResult.background - ); - } - result = effectsResult.result; - let success = - parseInt(effectsColorResult.RF) >= parseInt(colorResult.RF); - let successMessage = success - ? `success` - : `fail`; - content += `
Save (${effectName}): ${result} ${successMessage}
`; + if (!empty(save)) { + content += renderSaveRoll( + save, + targetCharacter, + roll2, + parameters, + effectType, + colorResult, + effectsContent + ); + } else { + log('Will not render Save as the "save" parameter was not set.'); } send(msg, parameters, title, content); }); }, + renderSaveRoll = ( + save, + targetCharacter, + roll2, + parameters, + effectType, + colorResult, + effectsContent + ) => { + const data = getData(); + if (!data) { + return; + } + log("START renderSaveRoll"); + let saveScore = getAttrByName(targetCharacter.id, `${save}`); + log("saveScore: " + saveScore); + let effectsActRow = getActRow(saveScore); + log("effectsActRow"); + log(effectsActRow); + let effectsColorResult = getRollColour(roll2, effectsActRow); + let effectsResult = { result: effectsColorResult.background }; + let result = ""; + if (!empty(data.effects) && data.effects[parameters[effectType]]) { + effectsResult = getEffectResult( + parameters[effectType], + effectsColorResult.background + ); + } + result = effectsResult.result; + let success = + parseInt(effectsColorResult.RF) >= parseInt(colorResult.RF); + let successMessage = success + ? `success` + : `fail`; + + log("END renderSaveRoll"); + let content = `
Save vs. ${save}: ${result} ${successMessage}
`; + if (!success) { + content += effectsContent; + } + return content; + }, getActRow = (rank) => { log("getActRow"); rank = parseInt(rank); @@ -799,27 +1009,27 @@ var GW3Companion = A: [18, 74, 99, null, null, 100], B: [17, 73, 98, 99, null, 100], C: [16, 72, 97, 99, null, 100], - "1": [15, 71, 96, 98, 99, 100], - "2": [14, 69, 94, 97, 99, 100], - "3": [13, 68, 93, 97, 97, 100], - "4": [12, 66, 91, 96, 97, 100], - "5": [11, 62, 87, 93, 97, 99], - "6": [10, 60, 85, 92, 96, 99], - "7": [9, 58, 83, 91, 96, 99], - "8": [8, 56, 80, 89, 95, 99], - "9": [7, 54, 78, 88, 93, 99], - "10": [6, 52, 75, 86, 92, 99], - "11": [5, 49, 71, 83, 91, 98], - "12": [5, 47, 68, 81, 90, 98], - "13": [4, 44, 65, 79, 89, 98], - "14": [4, 42, 62, 77, 88, 98], - "15": [4, 40, 58, 75, 87, 98], - "16": [3, 37, 53, 72, 86, 97], - "17": [3, 35, 49, 70, 85, 97], - "18": [3, 33, 45, 68, 84, 97], - "19": [3, 30, 41, 66, 83, 97], - "20": [2, 26, 36, 63, 82, 96], - "21": [2, 23, 32, 61, 81, 96], + 1: [15, 71, 96, 98, 99, 100], + 2: [14, 69, 94, 97, 99, 100], + 3: [13, 68, 93, 97, 97, 100], + 4: [12, 66, 91, 96, 97, 100], + 5: [11, 62, 87, 93, 97, 99], + 6: [10, 60, 85, 92, 96, 99], + 7: [9, 58, 83, 91, 96, 99], + 8: [8, 56, 80, 89, 95, 99], + 9: [7, 54, 78, 88, 93, 99], + 10: [6, 52, 75, 86, 92, 99], + 11: [5, 49, 71, 83, 91, 98], + 12: [5, 47, 68, 81, 90, 98], + 13: [4, 44, 65, 79, 89, 98], + 14: [4, 42, 62, 77, 88, 98], + 15: [4, 40, 58, 75, 87, 98], + 16: [3, 37, 53, 72, 86, 97], + 17: [3, 35, 49, 70, 85, 97], + 18: [3, 33, 45, 68, 84, 97], + 19: [3, 30, 41, 66, 83, 97], + 20: [2, 26, 36, 63, 82, 96], + 21: [2, 23, 32, 61, 81, 96], X: [2, 20, 27, 59, 80, 96], Y: [2, 17, 22, 56, 78, 95], Z: [2, 13, 16, 51, 76, 94], @@ -973,21 +1183,23 @@ var GW3Companion = } if (category === "attacks" || category === "ammo") { if (category === "attacks") { - let character_rank = parseInt( - getAttrByName(character.id, "character_rank") - ); - log("character rank:" + character_rank); - if (character_rank === NaN) { - log( - "character rank was not found and thus the attack rank could not be accurately determined and will default to 1" - ); - character_rank = 1; - } - let obj = Object.assign(objTemplate, { - name: `repeating_${category}_${rowId}_rank`, - current: character_rank, - }); - createObj("attribute", obj); + //@deprecated: Attack ranks are distinct from Character ranks + // log("import attack"); + // let character_rank = parseInt( + // getAttrByName(character.id, "character_rank") + // ); + // log("character rank:" + character_rank); + // if (_.isNaN(character_rank)) { + // log( + // "character rank was not found and thus the attack rank could not be accurately determined and will default to 1" + // ); + // character_rank = 1; + // } + // let obj = Object.assign(objTemplate, { + // name: `repeating_${category}_${rowId}_rank`, + // current: character_rank, + // }); + // createObj("attribute", obj); } // also add it to gear _.each(itemAttributes, (attributeValue, attributeName) => { @@ -1138,13 +1350,13 @@ var GW3Companion = sendChat( script_name, whisper + - '
' + title + contents + - "
", + "
", null, { noarchive: true, @@ -1160,13 +1372,13 @@ var GW3Companion = sendChat( `${type}|${id}`, whisper + - '
' + title + contents + - "
", + "
", null, { noarchive: true, @@ -1261,6 +1473,10 @@ var GW3Companion = } }, getData = () => { + if (typeof compendium === "undefined") { + log("The compendium is not installed"); + return false; + } return compendium; // return {} }; diff --git a/GammaWorld3e/src/sheet.pug b/GammaWorld3e/src/sheet.pug index ccf3e9e237..0983920a92 100644 --- a/GammaWorld3e/src/sheet.pug +++ b/GammaWorld3e/src/sheet.pug @@ -29,7 +29,7 @@ .col-xs-3 label Rank: .col-xs-3 - input(type="number" name="attr_character_rank" value=1) + input(type="number" name="attr_character_rank" title="@{character_rank}" value=1) .col-xs-5 .row.middle-xs .col-xs-2 @@ -77,6 +77,8 @@ option(value=1) I option(value=2) II option(value=3) III + option(value=4) IV + option(value=5) V .row.top-xs .col-xs-8 .row.underline @@ -247,25 +249,37 @@ .col-xs-1 input(type="number" name="attr_rank") .col-xs-1 - input(type="number" name="attr_dmg") + input(type="text" name="attr_dmg") .col-xs-1 input(type="hidden" name="attr_id") input(type="hidden" name="attr_ref") - button(type='roll' name='roll_mutation' value='!gw act @{rank} CS|?{CS|0} id|@{ref} title|ref category|mutations save|@{save} effect|@{effect} effect_crit|@{effect_crit} dmg|@{dmg} mod|@{mod} character|@{character_id} target_id|@{target|target1|token_id} ') + button(type='roll' name='roll_mutation' value='!gw act @{rank} CS|?{CS|0} id|@{ref} title|ref describe|@{describe} category|mutations save|@{save} effect|@{effect} effect_crit|@{effect_crit} dmg|@{dmg} dmg_type|@{dmg_type} mod|@{modifier} character|@{character_id} target_id|@{target|target1|token_id} ') //- button(type='roll' name='roll_mutation2' value='!gw act @{rank} title|@{name} character|@{character_id} target_id|@{target|token_id}') //- button(type='roll' name='roll_mutation4' value='!gw act @{rank} title|@{name} character|@{character_id} target_id|@{target|target1|token_name}') input.short.options-flag(type="checkbox" name="attr_options-flag" class="options-flag" ) span y .options .row.middle-xs - .col-xs-1 + .col-xs-3 + label Effort + .col-xs-3 + select(name="attr_effort") + option(value="passive") Subconscious + option(value="active") Conscious + .col-xs-3 + label Targets + .col-xs-3 + input(type="text" name="attr_number") + + .row.middle-xs + .col-xs-2 label Mod. - .col-xs-1 - input(type="hidden" name="attr_save") + .col-xs-2 + //- input(type="hidden" name="attr_save") input(type="hidden" name="attr_effect") input(type="hidden" name="attr_effect_crit") input(type="hidden" name="attr_dmg_type") - select(name="attr_mod") + select(name="attr_modifier") option(value="PS") PS option(value="DX") DX option(value="CN") CN @@ -273,15 +287,16 @@ option(value="MS") MS option(value="CH") CH .col-xs-2 - label Effort + label Save .col-xs-2 - select(name="attr_effort") - option(value="passive") Subconscious - option(value="active") Conscious - .col-xs-1 - label No. - .col-xs-1 - input(type="text" name="attr_number") + select(name="attr_save") + option(value="PS") PS + option(value="DX") DX + option(value="CN") CN + option(value="IN") IN + option(value="MS") MS + option(value="CH") CH + .col-xs-2 label Duration .col-xs-2 @@ -290,26 +305,28 @@ label Description .col-xs-12 textarea(name="attr_description") + .col-xs-12 Show description on roll + input.short(type="checkbox" name="attr_describe" class="check-flag" ) .row.underline .col-xs-12 h2 Attacks .row.middle-xs - .col-xs-3 + .col-xs-5 label Name - .col-xs-1 + .col-xs-2 label Mod. .col-xs-1 label Range .col-xs-1 label Dmg. - .col-xs-2 - label Rank + .col-xs-1 + label Skill fieldset.repeating_attacks .row - .col-xs-3 + .col-xs-5 input(type="text" name="attr_name") - .col-xs-1 - select(name="attr_mod") + .col-xs-2 + select(name="attr_modifier") option(value="PS") PS option(value="DX") DX option(value="CN") CN @@ -324,8 +341,8 @@ input(type="hidden" name="attr_ref") input(type="text" name="attr_rank") .col-xs-1 - button(type='roll' name='roll_attack' value='!gw act @{rank} CS|?{CS|0} id|@{ref} title|ref category|attacks effect|@{effect} effect_crit|@{effect_crit} dmg|@{dmg} mod|@{mod} skill|@{skill} tech|@{tech} type|@{type} character|@{character_id} target_id|@{target|target1|token_id}') - //- button(type='roll' name='roll_attack' value='!gw act @{rank} CS|?{CS|0} title|@{name} mod|@{mod} tech|@{tech} type|@{type} effect|@{effect} character|@{character_id}') + button(type='roll' name='roll_attack' value='!gw act @{rank} CS|?{CS|0} id|@{ref} title|ref category|attacks effect|@{effect} effect_crit|@{effect_crit} dmg|@{dmg} skilldmg|@{skilldmg} mod|@{modifier} skill|@{skill} tech|@{tech} type|@{type} character|@{character_id} target_id|@{target|target1|token_id}') + //- button(type='roll' name='roll_attack' value='!gw act @{rank} CS|?{CS|0} title|@{name} mod|@{modifier} tech|@{tech} type|@{type} effect|@{effect} character|@{character_id}') input.short.options-flag(type="checkbox" name="attr_options-flag" class="options-flag" ) span y .options @@ -438,10 +455,29 @@ .row.middle-xs .col-xs-2 Tech Lvl. .col-xs-2 + select(name="attr_tech") + option(value=1) I + option(value=2) II + option(value=3) III + option(value=4) IV + option(value=5) V input(type="number" name="attr_tech") .col-xs-2 Tech Rank .col-xs-2 - input(type="text" name="attr_tech_rank") + select(name="attr_tech_rank") + option(value="N") N + option(value="A") A + option(value="B") B + option(value="C") C + option(value="D") D + option(value="E") E + option(value="F") F + option(value="G") G + option(value="H") H + option(value="I") I + option(value="J") J + .col-xs-12 Add attack rank to damage + input.short(type="checkbox" name="attr_skilldmg" class="check-flag" ) .col-xs-12 Notes .col-xs-12 textarea(name="attr_notes") @@ -671,7 +707,7 @@ option(value=5) V .col-xs-1 select(name="attr_tech_rank") - option(value="N") A + option(value="N") N option(value="A") A option(value="B") B option(value="C") C @@ -794,7 +830,7 @@ .row .col-xs-5 label Name - .col-xs-3 + .col-xs-2 label Rank .col-xs-3 label Mod. @@ -802,10 +838,10 @@ .row .col-xs-5 input(type="text" name="attr_name") - .col-xs-3 + .col-xs-2 input(type="number" name="attr_rank") .col-xs-3 - select(name="attr_mod") + select(name="attr_modifier") option(value="PS") PS option(value="DX") DX option(value="CN") CN @@ -813,7 +849,14 @@ option(value="MS") MS option(value="CH") CH .col-xs-1 - button(type='roll' name='roll_skill' value='!gw act @{rank} title|@{name} mod|@{mod} character|@{character_id}') + button(type='roll' name='roll_skill' value='!gw act @{rank} title|@{name} mod|@{modifier} character|@{character_id}') + input.short.options-flag(type="checkbox" name="attr_options-flag" class="options-flag" ) + span y + .options + .row + .col-xs-12 Description + .col-xs-12 + textarea(name="attr_description") .row.underline .col-xs-12 h2 Talents @@ -823,6 +866,7 @@ fieldset.repeating_talents .row .col-xs-8 + input(type="hidden" name="attr_ref") input(type="text" name="attr_name") .col-xs-2 button(type='roll' name='roll_talent' value='!gw act @{character_rank} title|@{name} character|@{character_id}') @@ -830,15 +874,18 @@ span y .options .row - .col-xs-3 Affects: - .col-xs-3 - input(type="text" name="attr_affects") - .col-xs-3 Act Factor: - .col-xs-3 - input(type="text" name="attr_act_factor") - .col-xs-12 Notes + //- .col-xs-3 Affects: + //- .col-xs-3 + //- input(type="text" name="attr_affects") + //- .col-xs-3 Act Factor: + //- .col-xs-3 + //- input(type="text" name="attr_act_factor") + .col-xs-12 Description .col-xs-12 - textarea(name="attr_notes") + textarea(name="attr_description") + //- .col-xs-12 Notes + //- .col-xs-12 + //- textarea(name="attr_notes") .row.underline .col-xs-12 h2 Coins @@ -1160,7 +1207,7 @@ .col-xs-1 input(type="number" name="attr_rank") .col-xs-1 - input(type="number" name="attr_dmg") + input(type="text" name="attr_dmg") .col-xs-1 input(type="hidden" name="attr_id") button(type='roll' name='roll_mutation' value='!gw act @{rank} title|@{name} character|@{character_id}') @@ -1171,7 +1218,7 @@ .col-xs-2 label Mod. .col-xs-2 - select(name="attr_mod") + select(name="attr_modifier") option(value="PS") PS option(value="DX") DX option(value="CN") CN @@ -1208,13 +1255,13 @@ .col-xs-1 label Dmg. .col-xs-2 - label Rank + label Skill fieldset.repeating_attacks .row .col-xs-3 input(type="text" name="attr_name") .col-xs-1 - select(name="attr_mod") + select(name="attr_modifier") option(value="PS") PS option(value="DX") DX option(value="CN") CN @@ -1226,9 +1273,11 @@ .col-xs-1 input(type="text" name="attr_dmg") .col-xs-1 + input(type="hidden" name="attr_ref") input(type="text" name="attr_rank") .col-xs-1 - button(type='roll' name='roll_attack' value='!gw act @{rank} CS|?{CS|0} title|@{name} mod|@{mod} tech| type|@{type} effect|@{effect} character|@{character_id}') + button(type='roll' name='roll_attack' value='!gw act @{rank} CS|?{CS|0} id|@{ref} title|ref category|attacks effect|@{effect} effect_crit|@{effect_crit} dmg|@{dmg} skilldmg|@{skilldmg} mod|@{modifier} skill|@{skill} tech|@{tech} type|@{type} character|@{character_id} target_id|@{target|target1|token_id}') + input.short.options-flag(type="checkbox" name="attr_options-flag" class="options-flag" ) span y .options @@ -1341,10 +1390,28 @@ .row.middle-xs .col-xs-2 Tech Lvl. .col-xs-2 - input(type="number" name="attr_tech") + select(name="attr_tech") + option(value=1) I + option(value=2) II + option(value=3) III + option(value=4) IV + option(value=5) V .col-xs-2 Tech Rank .col-xs-2 - input(type="text" name="attr_tech_rank") + select(name="attr_tech_rank") + option(value="N") N + option(value="A") A + option(value="B") B + option(value="C") C + option(value="D") D + option(value="E") E + option(value="F") F + option(value="G") G + option(value="H") H + option(value="I") I + option(value="J") J + .col-xs-12 Add attack rank to damage + input.short(type="checkbox" name="attr_skilldmg" class="check-flag" ) .col-xs-12 Notes .col-xs-12 textarea(name="attr_notes") @@ -1434,5 +1501,5 @@ input(type="hidden" name="attr_RF_energy" title="@RF_energy" value="0") script(type="text/worker") | | - include dice3.js - include sheetworkers.js \ No newline at end of file + include src/dice3.js + include src/sheetworkers.js \ No newline at end of file