From a3f5ddca724ffc8d8df921b40dfb65944e7fc783 Mon Sep 17 00:00:00 2001 From: KnowledgeRhino Date: Wed, 9 Mar 2016 21:21:41 -0800 Subject: [PATCH] Update to Star Wars FFG API-Compatible Version 4.0.4.2 Added a section header design change as well as better organization of information from old vehicle tabs. --- .../Character Sheet Preview.jpg | Bin 0 -> 43857 bytes .../Character Sheet Preview.png | Bin 57459 -> 0 bytes .../FFG-SWRPG-CharacterSheet.css | 11 +- .../FFG-SWRPG-CharacterSheet.html | 1395 +++---- .../FFG-SWRPG-Dice-Roller.js | 3545 ----------------- Star Wars FFG API-Compatible/README.md | 8 +- 6 files changed, 718 insertions(+), 4241 deletions(-) create mode 100644 Star Wars FFG API-Compatible/Character Sheet Preview.jpg delete mode 100644 Star Wars FFG API-Compatible/Character Sheet Preview.png delete mode 100644 Star Wars FFG API-Compatible/FFG-SWRPG-Dice-Roller.js diff --git a/Star Wars FFG API-Compatible/Character Sheet Preview.jpg b/Star Wars FFG API-Compatible/Character Sheet Preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..342257e37e9838b696dcae8b429d1703299335fa GIT binary patch literal 43857 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 BPy_$~ literal 0 HcmV?d00001 diff --git a/Star Wars FFG API-Compatible/Character Sheet Preview.png b/Star Wars FFG API-Compatible/Character Sheet Preview.png deleted file mode 100644 index 4f251fce585f06d13c5f90f46cf6f0ee0f549b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57459 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ⅇiOO+ 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 Q5&!@I07*qoM6N<$f +
+

Fantasy Flight Games Star Wars Role Playing Game

+
+ + + + + + +
Fantasy Flight Games Star Wars Role Playing Game: Edge of the EmpireFantasy Flight Games Star Wars Role Playing Game: Age of RebellionFantasy Flight Games Star Wars Role Playing Game: Force and Destiny

+
+
+ Character Sheet @@ -17,6 +30,8 @@ Version 4.0.4.0 Group Sheet Companion Sheet + +Old Vehicle Sheet @@ -4512,10 +4527,6 @@ Version 4.0.4.0  Planetary   Beast  - - Old Vehicle Tab 1 - - Old Vehicle Tab 2
@@ -4764,12 +4775,8 @@ Version 4.0.4.0   - - - - - - + + - -

-

Details

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

Vehicle Critical

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

Attachments

- - - - - - - - - -
NameHard pointsBase ModifiersModifications
-
- - - - - - - - - -
-
-
-
-
- -
-
-

Crew Roles

- - - - - - - - - - -
Character NameRole (Pilot, Co-pilot, Engineer)DiceSpecialSkill
-
- - - - - - - - - - -
- -
-
-
-

Weapons

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Character NameWeapon NameArcCritDmgRange/Skill
- - - - - - - - - - -  
- -
-
-
- -





+






 Base of Operations   @@ -10063,6 +9394,690 @@ Version 4.0.4.0
+
+
+
+ + + + + + + + + + + + +
+ + + + + +
+ + +
+ + + +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + + +
+ + +
+ + +
+ + +
+
+
+
+ + +  Details  + +  Weapons  + +
+
+
+
+ + +

+

Details

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
> +
 
+
+
+
+
+
+
+

Attachments

+ + + + + + + + + +
NameHard pointsBase ModifiersModifications
+
+ + + + + + + + + +
+
+
+
+
+
+
+

Vehicle Critical

+
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ + + +
+
+ + + + + + + + + + +
+ + +
+
+
+
+
+
+
+

Crew Roles

+ + + + + + + + + + +
Character NameRole (Pilot, Co-pilot, Engineer)DiceSpecialSkill
+
+ + + + + + + + + + +
+ +
+
+
+

Weapons

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Character NameWeapon NameArcCritDmgRange/Skill
+ + + + + + + + + + +  
+ +
+
+
+
@@ -10482,7 +10497,7 @@ Version 4.0.4.0 diff --git a/Star Wars FFG API-Compatible/FFG-SWRPG-Dice-Roller.js b/Star Wars FFG API-Compatible/FFG-SWRPG-Dice-Roller.js deleted file mode 100644 index 7493c2c2cf..0000000000 --- a/Star Wars FFG API-Compatible/FFG-SWRPG-Dice-Roller.js +++ /dev/null @@ -1,3545 +0,0 @@ -/* - Current Version: 4.0.4.0 - Last updated: 03.07.2016 - Character Sheet and Script Maintained by: GM Knowledge Rhino - Older Verions: https://github.com/dayst/StarWarsEdgeOfTheEmpire_Dice - - Credits: - Original creator: Konrad J. - Helped with Dice specs: Alicia G. and Blake the Lake - Dice graphics hosted by Alicia G. at galacticcampaigns.com - Dice graphics borrowed from the awesome google+ hangouts EotE Dice App - Basic Character Sheet and Advanced Dice Roller: Steve Day - GM Sheet Campaign Details design inspiration: www.reddit.com/user/JohnSquiggleton - Sheet Autocreator: www.reddit.com/user/lowdownfool - New Tab Labels: Steve D., GM Knowledge Rhino, and Loki - Skill Description by: Gribble - https://dl.dropboxusercontent.com/u/9077657/SW-EotE-Reference-Sheets.pdf - Critical Descriptions by: Gribble - https://dl.dropboxusercontent.com/u/9077657/SW-EotE-Reference-Sheets.pdf - Debugger: Arron - Basic Roll Templates for basic rolls: Josh A. - Initiative Roller: Andrew H. - Opposed Roller: Tom F. - Work done by GM Knowledge Rhino: - Group Tab - Companion Tab - GM Resources - ReDesign of Vehicle Tab - Riding Beast Display - Roll Template Code Fixes - Roll Templates integrated with all Rolls - - API Chat Commands - Settings: - Log - * default: 'on' and 'single' - * Description: Sets the visual output in the chat window for the dice rolls - * Command: !eed log on|off|multi|single - - Graphics - * default: 'on' and 'm' - * Description: Sets chat window dice output as graphic, small, medium, or large if "on" or as text if "off" - * Command: !eed graphics on|off|s|m|l - - Test - * Description: Output every side of every die to the chat window - * !eed test - - Debug - * default: 'off' - * DescriptionL Sets the logging level of the script in the API console. If you are having issues with the - * script rolling incorect dice, turn on debug logging and post the result in the forums. No need to restart the - * script with this command. - * Command: !eed debug on|off - - Roll: - Label - * default: null - * Description: set the skill name of the roll - * Command: !eed label(Name of Skill) - - Initiative - * default: false - * Description: Set NPC/PC initiative true - * Command: !eed npcinit or pcinit and #b #g #y #blk #p #r #w - - Skill - * default: - * Description: create the ability and proficiency dice for a skill check - * Command: !eed skill(char_value|skill_value) - - Opposed - * default: - * Description: create the difficulty and challenge dice for an opposed skill check - * Command: !eed opposed(char_value|skill_value) - - Dice - * default: - * Description: Loop thru the dice and adds or subtracts them from the dice object - * Command: !eed #g #y #b #blk #r #p #w #s #a - - Upgrade - * default: - * Description: upgrades ability and difficulty dice - * Command: !eed upgrade(ability|#) or upgrade(difficulty|#) - - Downgrade - * default: - * Description: downgrades proficiency and challenge dice - * Command: !eed downgrade(proficiency|#) or downgrade(challenge|#) - - Destiny - * default: - * Description: Rolls 1w die and adds the result to the destiny pool - * Command: !eed #w destiny doRoll - - Other: - Charsheet - * default: - * Description: Generates a blank character sheet and automatically makes it viewable and editable by the person calling the script. - * Command: !charsheet - -*/ - -/* Begin Sheet Character Sheet Auto Creator */ - -var Charsheet = Charsheet || {}; - -on('chat:message', function (msg) { - // Exit if not an api command - if (msg.type != "api") { - return; - } - - if (msg.content.indexOf('!charsheet') != -1) { - Charsheet.Generate(msg); - } -}); - -Charsheet.Generate = function (msg) { - var player = msg.who; - var character_name = msg.who + Date.now(); - - var character = createObj('character', { - gmnotes: 'Player: ' + player + '
Generated by script Charsheet.js', - archived: false, - inplayerjournals: msg.playerid, - controlledby: msg.playerid - }); - - /* Create attributes */ - createObj('attribute', { - name: 'player_name', - current: player, - _characterid: character.id - }); - createObj('attribute', { - name: 'name', - current: character_name, - _characterid: character.id - }) - - sendChat(player, "/me created a character named \"" + character_name + "\"!"); -}; - -if (!Date.now) { - Date.now = function now() { - return new Date().getTime(); - }; -} -/* End Sheet Character Sheet Auto Creator */ -var eote = {} - -eote.init = function () { - eote.setCharacterDefaults(); - eote.createGMDicePool(); - eote.events(); -} - -eote.defaults = { - globalVars: { - diceLogChat: true, - diceGraphicsChat: true, - diceGraphicsChatSize: 30,//medium size - diceTextResult: "", - diceTextResultLog: "", - diceGraphicResult: "", - diceGraphicResultLog: "", - diceTestEnabled: false, - diceLogRolledOnOneLine: true, - scriptDebug: false - }, - '-DicePoolID': '', - character: { - attributes: [ - /* Don't need to update characterID - * - *{ - name : "characterID", - current : "UPDATES TO CURRENT ID", - max : "", - update : false - }*/ - ], - ablities: [], - }, - graphics: { - SIZE: { - SMALL: 20, - MEDIUM: 30, - LARGE: 40 - }, - ABILITY: { - BLANK: "http://galacticcampaigns.com/images/EotE/Ability/abilityBlank.png", - A: "http://galacticcampaigns.com/images/EotE/Ability/abilityA.png", - AA: "http://galacticcampaigns.com/images/EotE/Ability/abilityAA.png", - S: "http://galacticcampaigns.com/images/EotE/Ability/abilityS.png", - SA: "http://galacticcampaigns.com/images/EotE/Ability/abilitySA.png", - SS: "http://galacticcampaigns.com/images/EotE/Ability/abilitySS.png" - }, - BOOST: { - BLANK: "http://galacticcampaigns.com/images/EotE/Boost/boostBlank.png", - A: "http://galacticcampaigns.com/images/EotE/Boost/boostA.png", - AA: "http://galacticcampaigns.com/images/EotE/Boost/boostAA.png", - S: "http://galacticcampaigns.com/images/EotE/Boost/boostS.png", - SA: "http://galacticcampaigns.com/images/EotE/Boost/boostSA.png" - }, - CHALLENGE: { - BLANK: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeBlank.png", - F: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeF.png", - FF: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeFF.png", - FT: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeFT.png", - T: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeT.png", - TT: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeTT.png", - DESPAIR: "http://galacticcampaigns.com/images/EotE/Challenge/ChallengeDespair.png" - }, - DIFFICULTY: { - BLANK: "http://galacticcampaigns.com/images/EotE/Difficulty/DifficultyBlank.png", - F: "http://galacticcampaigns.com/images/EotE/Difficulty/DifficultyF.png", - FF: "http://galacticcampaigns.com/images/EotE/Difficulty/DifficultyFF.png", - FT: "http://galacticcampaigns.com/images/EotE/Difficulty/DifficultyFT.png", - T: "http://galacticcampaigns.com/images/EotE/Difficulty/DifficultyT.png", - TT: "http://galacticcampaigns.com/images/EotE/Difficulty/DifficultyTT.png" - }, - FORCE: { - D: "http://galacticcampaigns.com/images/EotE/Force/ForceD.png", - DD: "http://galacticcampaigns.com/images/EotE/Force/ForceDD.png", - L: "http://galacticcampaigns.com/images/EotE/Force/ForceL.png", - LL: "http://galacticcampaigns.com/images/EotE/Force/ForceLL.png" - }, - PROFICIENCY: { - BLANK: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencyBlank.png", - A: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencyA.png", - S: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencyS.png", - SA: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencySA.png", - SS: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencySS.png", - AA: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencyAA.png", - TRIUMPH: "http://galacticcampaigns.com/images/EotE/Proficiency/ProficiencyTriumph.png" - }, - SETBACK: { - BLANK: "http://galacticcampaigns.com/images/EotE/Setback/SetBackBlank.png", - F: "http://galacticcampaigns.com/images/EotE/Setback/SetBackF.png", - T: "http://galacticcampaigns.com/images/EotE/Setback/SetBackT.png" - }, - SYMBOLS: { - A: "http://galacticcampaigns.com/images/EotE/Symbols/A.png", - S: "http://galacticcampaigns.com/images/EotE/Symbols/S.png", - T: "http://galacticcampaigns.com/images/EotE/Symbols/T.png", - F: "http://galacticcampaigns.com/images/EotE/Symbols/F.png", - TRIUMPH: "http://galacticcampaigns.com/images/EotE/Symbols/Triumph.png", - DESPAIR: "http://galacticcampaigns.com/images/EotE/Symbols/Despair.png", - L: "http://galacticcampaigns.com/images/EotE/Symbols/L.png", - D: "http://galacticcampaigns.com/images/EotE/Symbols/D.png" - } - }, - regex: { - cmd: /!eed/, - log: /log (on|multi|single|off)/, - debug: /debug (on|off)/, - graphics: /graphics (on|off|s|m|l)/, - test: /test/, - resetdice: /(resetgmdice|resetdice)/, - initiative: /\bnpcinit|\bpcinit/, - characterID: /characterID\((.*?)\)/, - rollPlayer: /rollPlayer(\(.*?\))/, - label: /label\((.*?)\)/, - skill: /skill\((.*?)\)/g, - opposed: /opposed\((.*?)\)/g, - upgrade: /upgrade\((.*?)\)/g, - downgrade: /downgrade\((.*?)\)/g, - gmdice: /\(gmdice\)/, - encum: /encum\((.*?)\)/g, - dice: /(-?\d{1,2}blk)\b|(-?\d{1,2}b)\b|(-?\d{1,2}g)\b|(-?\d{1,2}y)\b|(-?\d{1,2}p)\b|(-?\d{1,2}r)\b|(-?\d{1,2}w)\b|(-?\d{1,2}a)\b|(-?\d{1,2}s)|(-?\d{1,2}t)\b|(-?\d{1,2}f)/g, - crit: /crit\((.*?)\)/, - critShip: /critship\((.*?)\)/, - unusable: /unusableWeapon/, - destiny: /destiny (useDark|useLight|registerPlayer|sendUpdate|doRoll|clearPool)/, - }, - destinyListeners: [] -} - -eote.createGMDicePool = function () { - - var charObj_DicePool = findObjs({ _type: "character", name: "-DicePool" })[0]; - - var attrObj_DicePool = [ - { - name: 'pcgm', - current: 3, - max: '', - update: true - }, - { - name: 'gmdicepool', - current: 2, - max: '', - update: true - } - ]; - - //create character -DicePool - if (!charObj_DicePool) { - - charObj_DicePool = createObj("character", { - name: "-DicePool", - bio: "GM Dice Pool" - }); - - } - - eote.defaults['-DicePoolID'] = charObj_DicePool.id; - - eote.updateAddAttribute(charObj_DicePool, attrObj_DicePool); - -} - -eote.createObj = function () {//Create Object Fix - Firebase.set failed - var obj = createObj.apply(this, arguments); - var id = obj.id; - var characterID = obj.get('characterid'); - var type = obj.get('type'); - if (obj && !obj.fbpath && obj.changed) { - obj.fbpath = obj.changed._fbpath.replace(/([^\/]*\/){4}/, "/"); - } else if (obj && !obj.changed && type == 'attribute') { //fix for dynamic attribute after in character created in game - obj.fbpath = '/char-attribs/char/' + characterID + '/' + id; - // /char-attribs/char/characterID/attributeID - } - - return obj; -} - -eote.setCharacterDefaults = function (characterObj) { - - var charObj = [characterObj]; - - if (!characterObj) { - charObj = findObjs({ _type: "character" }); - } - - //add/update characterID field - _.each(charObj, function (charObj) { - - //updates default attr:CharacterID to current character id - //_.findWhere(eote.defaults.character.attributes, {'name':'characterID'}).current = charObj.id; - - //Attributes - eote.updateAddAttribute(charObj, eote.defaults.character.attributes);//Update Add Attribute defaults - - //Abilities - - }); -} - -eote.updateListeners = function (attributes) { - - _.each(eote.defaults.destinyListeners, function (charID) { - - var charObj = findObjs({ - _type: "character", - _id: charID - }); - - //add/update characterID feild - _.each(charObj, function (charObj) { - - //Attributes - eote.updateAddAttribute(charObj, attributes); //Update Add Attribute defaults - - }); - }); - - //Update GM - var GMObj = findObjs({ - _type: "character", - _id: eote.defaults['-DicePoolID'] - }); - eote.updateAddAttribute(GMObj, attributes); -} - -eote.updateAddAttribute = function (charactersObj, updateAddAttributesObj) { // charactersObj = object or array objects, updateAddAttributesObj = object or array objects - - //check if object or array - if (!_.isArray(charactersObj)) { - charactersObj = [charactersObj]; - } - - if (!_.isArray(updateAddAttributesObj)) { - updateAddAttributesObj = [updateAddAttributesObj]; - } - - _.each(charactersObj, function (characterObj) {//loop characters - - var characterName = ''; - - if (characterObj.name) { - characterName = characterObj.name; - } else { - characterName = characterObj.get('name'); - } - - //find attribute via character ID - var characterAttributesObj = findObjs({ _type: "attribute", characterid: characterObj.id }); - - if (updateAddAttributesObj.length != 0) { - - log('UPDATE/ADD ATTRIBUTES FOR:----------------------->' + characterName); - - _.each(updateAddAttributesObj, function (updateAddAttrObj) { //loop attributes to update / add - - attr = _.find(characterAttributesObj, function (a) { - return (a.get('name') === updateAddAttrObj.name); - }); - - if (attr) { - if (updateAddAttrObj.update) { - log('Update Attr: ' + updateAddAttrObj.name); - attr.set({ current: updateAddAttrObj.current }); - attr.set({ max: updateAddAttrObj.max ? updateAddAttrObj.max : '' }); - } - } else { - // log('Add Attr: '+ updateAddAttrObj.name); - eote.createObj('attribute', { - characterid: characterObj.id, - name: updateAddAttrObj.name, - current: updateAddAttrObj.current, - max: updateAddAttrObj.max ? updateAddAttrObj.max : '' - }); - } - }); - } - }); - -} - -/* DICE PROCESS - * - * Matches the different regex commands and runs that dice processing step - * The order of step should not be change or dice could be incorrectly rolled. - * example: All dice needs to be 'upgraded" before it can be 'downgraded' - * ---------------------------------------------------------------- */ - -eote.defaults.dice = function () { - this.vars = { - characterName: '', - characterID: '', - playerName: '', - playerID: '', - label: '' - } - this.totals = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0 - } - this.graphicsLog = { - Boost: '', - Ability: '', - Proficiency: '', - SetBack: '', - Difficulty: '', - Challenge: '', - Force: '', - Success: '', - Advantage: '', - Threat: '', - Failure: '' - } - this.textLog = { - Boost: '', - Ability: '', - Proficiency: '', - SetBack: '', - Difficulty: '', - Challenge: '', - Force: '', - Success: '', - Advantage: '', - Threat: '', - Failure: '' - } - this.count = { - boost: 0, - ability: 0, - proficiency: 0, - setback: 0, - difficulty: 0, - challenge: 0, - force: 0, - success: 0, - advantage: 0, - threat: 0, - failure: 0 - } -} - -eote.process = {} - -eote.process.logger = function (functionName, cmd) { - if (eote.defaults.globalVars.debugScript) { - log(functionName + ' : ' + cmd); - } -} - -eote.process.setup = function (cmd, playerName, playerID) { - - if (!cmd.match(eote.defaults.regex.cmd)) { //check for api cmd !eed - return false; - } - - var debugMatch = cmd.match(eote.defaults.regex.debug); - if (debugMatch) { - eote.process.debug(debugMatch); - return false; - } - - eote.process.logger("eote.process.setup", "NEW ROLL"); - - eote.process.logger("eote.process.setup", "Original Command: " + cmd); - - /* reset dice - test, might not need this - * ------------------------------------------------------------- */ - - var diceObj = new eote.defaults.dice(); - diceObj.vars.playerName = playerName; - diceObj.vars.playerID = playerID; - - /* Dice config - * Description: Change dice roller default config - * --------------------------------------------------------------*/ - var logMatch = cmd.match(eote.defaults.regex.log); - - if (logMatch) { - eote.process.log(logMatch); - return false; //Stop current roll and run test - } - - var graphicsMatch = cmd.match(eote.defaults.regex.graphics); - - if (graphicsMatch) { - eote.process.graphics(graphicsMatch); - return false; //Stop current roll and run test - } - - var testMatch = cmd.match(eote.defaults.regex.test); - - if (testMatch) { - eote.process.test(testMatch); - return false; //Stop current roll and run test - } - - /* Roll information - * Description: Set default dice roll information Character Name and Skill Label - * --------------------------------------------------------------*/ - - var rollPlayerMatch = cmd.match(eote.defaults.regex.rollPlayer); - - if (rollPlayerMatch) { - diceObj = eote.process.rollPlayer(rollPlayerMatch, diceObj); - - if (!diceObj) { - return false; - } - } - - - var characterIDMatch = cmd.match(eote.defaults.regex.characterID); - - if (characterIDMatch) { - diceObj = eote.process.characterID(characterIDMatch, diceObj); - //Once Character ID is parsed, remove it from the cmd. - //it is possible that the character ID could contain dice values - //for ex. characterID(-JMBFmYX1i0L259bjb-X) will add 59 blue dice to the pool - cmd = cmd.replace(characterIDMatch[0], ''); - eote.process.logger("eote.process.setup.characterIDMatch", "New command: " + cmd); - } - - var unusableMatch = cmd.match(eote.defaults.regex.unusable); - - if (unusableMatch) { - eote.process.logger("eote.process.setup.unusableMatch", "Roll ended because of unusable weapon"); - /*sendChat(diceObj.vars.characterName, 'Weapon is too damaged to be used. Try repairing it.');*/ - sendChat(diceObj.vars.characterName, "&{template:base} {{title=" + diceObj.vars.characterName + "}} {{wide=Weapon is too damaged to be used. Try repairing it.}}"); - return false; - } - - var labelMatch = cmd.match(eote.defaults.regex.label); - - if (labelMatch) { - diceObj = eote.process.label(labelMatch, diceObj); - } - - /* Dice rolls - * Description: Create dice pool before running any custom roll - * script commands that may need dice evaluated. - * --------------------------------------------------------------*/ - var gmdiceMatch = cmd.match(eote.defaults.regex.gmdice); - - if (gmdiceMatch) { - cmd = eote.process.gmdice(cmd); // update the cmd string to contain the gmdice - eote.process.logger("eote.process.setup.gmDice", "New command: " + cmd); - } - - var encumMatch = cmd.match(eote.defaults.regex.encum); - - if (encumMatch) { - diceObj = eote.process.encum(encumMatch, diceObj); - //eote.process.logger("eote.process.setup.encumMatch","New dice:" + diceObj); - } - - var skillMatch = cmd.match(eote.defaults.regex.skill); - - if (skillMatch) { - diceObj = eote.process.skill(skillMatch, diceObj); - } - - var opposedMatch = cmd.match(eote.defaults.regex.opposed); - - if (opposedMatch) { - diceObj = eote.process.opposed(opposedMatch, diceObj); - } - - var diceMatch = cmd.match(eote.defaults.regex.dice); - - if (diceMatch) { - diceObj = eote.process.setDice(diceMatch, diceObj); - } - - var upgradeMatch = cmd.match(eote.defaults.regex.upgrade); - - if (upgradeMatch) { - diceObj = eote.process.upgrade(upgradeMatch, diceObj); - } - - var downgradeMatch = cmd.match(eote.defaults.regex.downgrade); - - if (downgradeMatch) { - diceObj = eote.process.downgrade(downgradeMatch, diceObj); - } - - /* Roll dice and update success / fail - * ------------------------------------------------------------- */ - diceObj = eote.process.rollDice(diceObj); - - /* Custom rolls - * Description: Custom dice components have thier own message, results and - * often will return false to not allow proceeding scripts to fire - * --------------------------------------------------------------*/ - var resetdiceMatch = cmd.match(eote.defaults.regex.resetdice); - - if (resetdiceMatch) { - eote.process.resetdice(resetdiceMatch, diceObj); - return false; - } - - var initiativeMatch = cmd.match(eote.defaults.regex.initiative); - - if (initiativeMatch) { - eote.process.initiative(initiativeMatch, diceObj); - //return false; - } - - var destinyMatch = cmd.match(eote.defaults.regex.destiny); - - if (destinyMatch) { - eote.process.logger("etoe.process.setup.destiny", "Destiny Point Command"); - var doRoll = eote.process.destiny(destinyMatch, diceObj); - if (!doRoll) { - return false; - } - } - - var critMatch = cmd.match(eote.defaults.regex.crit); - - if (critMatch) { - eote.process.crit(critMatch, diceObj); - return false; - } - - var critShipMatch = cmd.match(eote.defaults.regex.critShip); - - if (critShipMatch) { - eote.process.critShip(critShipMatch, diceObj); - return false; - } - - /* Display dice output in chat window - * ------------------------------------------------------------- */ - eote.process.diceOutput(diceObj, playerName, playerID); - -} - -/* DICE PROCESS FUNCTION - * - * ---------------------------------------------------------------- */ - -eote.process.log = function (cmd) { - - /* Log - * default: 'on' and 'single' - * Description: Sets the visual output in the chat window for the dice rolls - * Command: !eed log on|off|multi|single - * ---------------------------------------------------------------- */ - - //log(cmd[1]); - - switch (cmd[1]) { - case "on": //if 'on' outputs dice to chat window - eote.defaults.globalVars.diceLogChat = true; - sendChat("Dice Sytem", 'Output rolled dice to chat window "On"'); - break; - case "off": //if 'off' outputs only results to chat window - eote.defaults.globalVars.diceLogChat = false; - sendChat("Dice Sytem", 'Output rolled dice to chat window "Off"'); - break; - case "multi": //if 'multi' multiple sets dice per line - eote.defaults.globalVars.diceLogRolledOnOneLine = false; - sendChat("Dice Sytem", 'Mulitple line output "Off"'); - break; - case "single": //if 'single' single set of dice per line - eote.defaults.globalVars.diceLogRolledOnOneLine = true; - sendChat("Dice Sytem", 'Mulitple line output "On"'); - break; - } -} - -eote.process.debug = function (cmd) { - switch (cmd[1]) { - case "on": - eote.defaults.globalVars.debugScript = true; - sendChat("Dice Sytem", 'Debug Script "On"'); - break; - case "off": - eote.defaults.globalVars.debugScript = false; - sendChat("Dice Sytem", 'Debug Script "Off"'); - break; - } -} - -eote.process.graphics = function (cmd) { - - /* Graphics - * default: 'on' and 'm' - * Description: Sets chat window dice output as graphic, small, medium, or large if "on" or as text if "off" - * Command: !eed graphics on|off|s|m|l - * ---------------------------------------------------------------- */ - - //log(cmd[1]); - - switch (cmd[1]) { - case "on": - eote.defaults.globalVars.diceGraphicsChat = true; - sendChat("Dice Sytem", 'Chat graphics "On"'); - break; - case "off": - eote.defaults.globalVars.diceGraphicsChat = false; - sendChat("Dice Sytem", 'Chat graphics "Off"'); - break; - case "s": - eote.defaults.globalVars.diceGraphicsChatSize = eote.defaults.graphics.SIZE.SMALL; - sendChat("Dice Sytem", 'Chat graphics size "Small"'); - break; - case "m": - eote.defaults.globalVars.diceGraphicsChatSize = eote.defaults.graphics.SIZE.MEDIUM; - sendChat("Dice Sytem", 'Chat graphics size "Medium"'); - break; - case "l": - eote.defaults.globalVars.diceGraphicsChatSize = eote.defaults.graphics.SIZE.LARGE; - sendChat("Dice Sytem", 'Chat graphics size "Large"'); - break; - } - -} - -eote.process.test = function (cmd) { - - eote.process.logger("eote.process.test", cmd); - - //Set test vars to true - eote.defaults.globalVars.diceTestEnabled = true; - tmpLogChat = eote.defaults.globalVars.diceLogChat; - tmpGraphicsChat = eote.defaults.globalVars.diceGraphicsChat; - eote.defaults.globalVars.diceLogChat = true; - eote.defaults.globalVars.diceGraphicsChat = true; - - //Roll dice - eote.process.setup('!eed 1b 1g 1y 1blk 1p 1r 1w', 'GM', 'Dice Test'); - - //After test reset vars back - eote.defaults.globalVars.diceTestEnabled = false; - eote.defaults.globalVars.diceLogChat = tmpLogChat; - eote.defaults.globalVars.diceGraphicsChat = tmpGraphicsChat; - -} - -eote.process.rollPlayer = function (cmd, diceObj) { - //Build cmd string - //get characterID - //get skills - //get encum - //remove rollPlayer(xxxx) from string - var match = { - skill: /skill:(.*?)[\|\)]/, - encum: /encum/, - character: /character:(.*?)[\|\)]/, - } - - var charcterMatch = cmd[1].match(match.character); - - if (charcterMatch) { - - var charObj = findObjs({ _type: "character", name: charcterMatch[1] }); - - if (charObj.length > 0) { - - diceObj.vars.characterName = charObj[0].get('name'); - diceObj.vars.characterID = charObj[0].id; - - } else { - sendChat("Alert", "Can't find character. Please update character name field to match sheet character name and try again."); - return false; - } - } else { - sendChat("Alert", "Please update character name field."); - return false; - } - - var encumMatch = cmd[1].match(match.encum); - - if (encumMatch) { - //encumbrance - var attr_1 = getAttrByName(diceObj.vars.characterID, 'encumbrance', 'max'); - var attr_2 = getAttrByName(diceObj.vars.characterID, 'encumbrance'); - var cmdEncum = ['encum(' + attr_1 + '|' + attr_2 + ')']; //["encum(3|5)"] - - diceObj = eote.process.encum(cmdEncum, diceObj); - - } - - var skillMatch = cmd[1].match(match.skill); - - if (skillMatch) { - - var attrArray = skillMatch[1].split(',') - var attr_1 = getAttrByName(diceObj.vars.characterID, attrArray[0]); - var attr_2 = getAttrByName(diceObj.vars.characterID, attrArray[1]); - var cmdSkill = ['skill(' + attr_1 + '|' + attr_2 + ')']; //['skill(0|2)'] - - diceObj = eote.process.skill(cmdSkill, diceObj); - } - - return diceObj; - -} - -eote.process.destiny = function (cmd, diceObj) { - - var charObj_DicePool = findObjs({ _type: "character", name: "-DicePool" })[0]; - - var doRoll = false; - - if (!charObj_DicePool) { - sendChat("Dice System", "We can't find the DicePool player! SEND HELP!"); - return doRoll; - } - - //GM's Destiny Point Pool - var currentLightSidePoints = findObjs({ - _characterid: charObj_DicePool.get("_id"), - _type: "attribute", - _name: "lightSidePoints" - }); - var currentDarkSidePoints = findObjs({ - _characterid: charObj_DicePool.get("_id"), - _type: "attribute", - _name: "darkSidePoints" - }); - - if (!currentDarkSidePoints[0] || !currentLightSidePoints[0]) { - sendChat("Dice System", "No Destiny Points Defined. The GM has been whispered with instructions to reset the Destiny Pool."); - sendChat("GM", "/w " + "gm The Destiny Pool system needs to be (or has been) reset. To fix this functionality, go to the -DicePool Character Sheet and add 1 dark side and 1 light side destint point, then click the Force Player Update button. This should clear up the issue.") - return doRoll; - } - - var darkSide = parseInt(currentDarkSidePoints[0].get("current")); - var lightSide = parseInt(currentLightSidePoints[0].get("current")); - - switch (cmd[1]) { - case "useDark": - if (darkSide > 0) { - darkSide = darkSide - 1; - lightSide = lightSide + 1; - - var displayPool = '/direct &{template:base} {{title=' + 'The GM flips a Dark Side Destiny Point' + '}}' - displayPool = displayPool + '{{Dark Side points remaining=' + darkSide + '}}'; - displayPool = displayPool + '{{New Light Side total=' + lightSide + '}}'; - - sendChat('Dice System', displayPool); - } - else { - sendChat("GM", "/w " + "gm There are no Dark Side points left in the Destiny Pool. Encourage your Players to use a Light Side Point." ) - return doRoll; - } - break; - case "useLight": - if (lightSide > 0) { - lightSide = lightSide - 1; - darkSide = darkSide + 1; - - var displayPool = '/direct &{template:base} {{title=' + diceObj.vars.characterName + ' flips a Light Side Destiny Point' + '}}' - displayPool = displayPool + '{{New Dark Side total=' + darkSide + '}}'; - displayPool = displayPool + '{{Light Side points remaining=' + lightSide + '}}'; - - sendChat('Dice System', displayPool); - } - else { - sendChat("Dice System", "/w " + diceObj.vars.characterName + " There are no Light Side points left in the Destiny Pool. Suggest to your GM to use a Dark Side point to make one available.") - return doRoll; - } - break; - case "doRoll": - sendChat(diceObj.vars.characterName, "Rolling Destiny Point"); - doRoll = true; - case "registerPlayer": - if (!doRoll) { - sendChat(diceObj.vars.characterName, "Regestering with Destiny Pool"); - } - darkSide = darkSide + diceObj.totals.dark; - lightSide = lightSide + diceObj.totals.light; - - //Register - if (eote.defaults.destinyListeners.indexOf(diceObj.vars.characterID) == -1) { - eote.defaults.destinyListeners.push(diceObj.vars.characterID); - } - - break; - case "sendUpdate": - sendChat("Dice System", "Updating Players Destiny Pools"); - break; - case "clearPool": - sendChat("Dice System", "Clearing The Destiny Pool"); - lightSide = 0; - darkSide = 0; - break; - } - - var newDestPool = [ - { - name: 'lightSidePoints', - current: lightSide, - max: '', - update: true - }, - { - name: 'darkSidePoints', - current: darkSide, - max: '', - update: true - } - ]; - - eote.updateListeners(newDestPool); - - return doRoll; -} - -eote.process.characterID = function (cmd, diceObj) { - - /* CharacterId - * default: null - * Description: looks up the characters name based on character ID - * Command: !eed characterID(##########) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.characterID", cmd); - - var characterID = cmd[1]; - - if (characterID) { - - diceObj.vars.characterName = getObj("character", characterID).get('name'); - diceObj.vars.characterID = characterID; - - } - - return diceObj; - -} - -eote.process.label = function (cmd, diceObj) { - - /* Label - * default: null - * Description: set the skill name of the roll - * Command: !eed label(Name of Skill) - * ---------------------------------------------------------------- */ - //log(cmd); - - var label = cmd[1]; - - if (label) { - - var labelStr = ''; - var labelArray = label.split('|'); - - _.each(labelArray, function (labelVal) { - var labelArray = labelVal.split(':'); - var label = labelArray[0]; - var message = labelArray[1]; - - if (label == "Weapon") { - labelStr = labelStr + message + '}}'; - } - else if (label == "skill") { - labelStr = labelStr + message + '}}'; - } - else if (label == "Dice") { - labelStr = labelStr + message + '}}'; - } - else { - labelStr = labelStr + '{{' + label + '=' + message + '}}'; - } - }); - diceObj.vars.label = labelStr; - } - - return diceObj; - -} - -eote.process.resetdice = function (cmd, diceObj) { - - var characterObj = [{ name: diceObj.vars.characterName, id: diceObj.vars.characterID }]; - - eote.process.logger("eote.process.resetdice", cmd); - - if (cmd[1] == 'resetdice') { - var resetdice = [ - { - name: "b", - current: 0, - max: "", - update: true - }, - { - name: "g", - current: 0, - max: "", - update: true - }, - { - name: "y", - current: 0, - max: "", - update: true - }, - { - name: "blk", - current: 0, - max: "", - update: true - }, - { - name: "r", - current: 0, - max: "", - update: true - }, - { - name: "p", - current: 0, - max: "", - update: true - }, - { - name: "w", - current: 0, - max: "", - update: true - }, - { - name: "upgradeAbility", - current: 0, - max: "", - update: true - }, - { - name: "downgradeProficiency", - current: 0, - max: "", - update: true - }, - { - name: "upgradeDifficulty", - current: 0, - max: "", - update: true - }, - { - name: "downgradeChallenge", - current: 0, - max: "", - update: true - } - ] - } - - if (cmd[1] == 'resetgmdice') { - var resetdice = [ - { - name: "bgm", - current: 0, - max: "", - update: true - }, - { - name: "ggm", - current: 0, - max: "", - update: true - }, - { - name: "ygm", - current: 0, - max: "", - update: true - }, - { - name: "blkgm", - current: 0, - max: "", - update: true - }, - { - name: "rgm", - current: 0, - max: "", - update: true - }, - { - name: "pgm", - current: 0, - max: "", - update: true - }, - { - name: "wgm", - current: 0, - max: "", - update: true - }, - { - name: "upgradeAbilitygm", - current: 0, - max: "", - update: true - }, - { - name: "downgradeProficiencygm", - current: 0, - max: "", - update: true - }, - { - name: "upgradeDifficultygm", - current: 0, - max: "", - update: true - }, - { - name: "downgradeChallengegm", - current: 0, - max: "", - update: true - } - ] - } - - eote.updateAddAttribute(characterObj, resetdice); - -} - -eote.process.initiative = function (cmd, diceObj) { - - /* initiative - * default: false - * Description: Set NPC/PC initiative true - * Command: !eed npcinit or pcinit - * ---------------------------------------------------------------- */ - - var type = ''; - var NumSuccess = diceObj.totals.success; - var NumAdvantage = diceObj.totals.advantage; - var turnorder; - - eote.process.logger("eote.process.initiative.diceObj", diceObj); - eote.process.logger("eote.process.initiative.NumSuccess", NumSuccess); - eote.process.logger("eote.process.initiativeNumAdvantage", NumAdvantage); - - if (Campaign().get("turnorder") == "") turnorder = []; //NOTE: We check to make sure that the turnorder isn't just an empty string first. If it is treat it like an empty array. - else turnorder = JSON.parse(Campaign().get("turnorder")); - - if (cmd[0] == 'pcinit') { - type = 'PC'; - } - - if (cmd[0] == 'npcinit') { - type = 'NPC'; - } - - //Add a new custom entry to the end of the turn order. - turnorder.push({ - id: "-1", - pr: NumSuccess + ":" + NumAdvantage, - custom: type - }); - - turnorder.sort(function (x, y) { - var a = x.pr.split(":"); - var b = y.pr.split(":"); - - - if (b[0] - a[0] != 0) {//First rank on successes - return b[0] - a[0]; - } else if (b[1] - a[1] != 0) {//Then rank on Advantage - return b[1] - a[1]; - } else { //If they are still tied, PC goes first - - if (x.custom == y.custom) { - return 0; - } else if (x.custom == "NPC") { - return 1; - } else { - return -1; - } - } - }); - - Campaign().set("turnorder", JSON.stringify(turnorder)); - - //sendChat(diceObj.vars.characterName, 'Rolls initiative'); - -} - -eote.process.crit = function (cmd, diceObj) { - - /* Crit - * default: - * Description: Rolls critical injury table - * Command: !eed crit(roll) crit(roll|#) crit(heal|#) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.crit", ""); - - var characterObj = [{ name: diceObj.vars.characterName, id: diceObj.vars.characterID }]; - var critTable = [ - { - percent: '1 to 5', - severity: 1, - name: 'Minor Nick', - Result: 'Suffer 1 strain.', - effect: '', - }, - { - percent: '6 to 10', - severity: 1, - name: 'Slowed Down', - Result: 'May only act during last allied Initiative slot on next turn.', - effect: '', - }, - { - percent: '11 to 15', - severity: 1, - name: 'Sudden Jolt', - Result: 'May only act during last hero Initiative slot on next turn.', - effect: '', - }, - { - percent: '16 to 20', - severity: 1, - name: 'Distracted', - Result: 'Cannot perform free maneuver on next turn.', - effect: '', - }, - { - percent: '21 to 25', - severity: 1, - name: 'Off-Balance', - Result: 'Add 1 Setback die to next skill check.', - effect: '', - }, - { - percent: '26 to 30', - severity: 1, - name: 'Discouraging Wound', - Result: 'Flip one light destiny to dark.', - effect: '', - }, - { - percent: '31 to 35', - severity: 1, - name: 'Stunned', - Result: 'Staggered, cannot perform action on next turn.', - effect: '', - }, - { - percent: '36 to 40', - severity: 1, - name: 'Stinger', - Result: 'Increase difficulty of next check by 1 Difficulty die.', - effect: '', - }, - //----------------------------- Severity 2 - { - percent: '41 to 45', - severity: 2, - name: 'Bowled Over', - Result: 'Knocked prone and suffer 1 strain.', - effect: '', - }, - { - percent: '46 to 50', - severity: 2, - name: 'Head Ringer', - Result: 'Increase difficulty of all Intellect and Cunning checks by 1 Difficulty die until end of encounter.', - effect: '', - }, - { - percent: '51 to 55', - severity: 2, - name: 'Fearsome Wound', - Result: 'Increase difficulty of all Presence and Willpower checks by 1 Difficulty die until end of encounter.', - effect: '', - }, - { - percent: '56 to 60', - severity: 2, - name: 'Agonizing Wound', - Result: 'Increase difficulty of all Brawn and Agility checks by 1 Difficulty die until end of encounter.', - effect: '', - }, - { - percent: '61 to 65', - severity: 2, - name: 'Slightly Dazed', - Result: 'Add 1 Setback die to all skill checks until end of encounter.', - effect: '', - }, - { - percent: '66 to 70', - severity: 2, - name: 'Scattered Senses', - Result: 'Remove all Boost dice from all skill checks until end of encounter.', - effect: '', - }, - { - percent: '71 to 75', - severity: 2, - name: 'Hamstrung', - Result: 'Lose free maneuver until end of encounter.', - effect: '', - }, - { - percent: '76 to 80', - severity: 2, - name: 'Staggered', - Result: 'Attacker may immediately attempt another free attack against you using same dice pool as original attack.', - effect: '', - }, - { - percent: '81 to 85', - severity: 2, - name: 'Winded', - Result: 'Cannot voluntarily suffer strain to activate abilities or gain additional maneuvers until end of encounter.', - effect: '', - }, - { - percent: '86 to 90', - severity: 2, - name: 'Compromised', - Result: 'Increase difficulty of all skill checks by 1 Difficulty die until end of encounter.', - effect: '', - }, - //---------------------------------------- Severity 3 - { - percent: '91 to 95', - severity: 3, - name: 'At the Brink', - Result: 'Suffer 1 strain each time you perform an action.', - effect: '', - }, - { - percent: '96 to 100', - severity: 3, - name: 'Crippled', - Result: 'Limb crippled until healed or replaced. Increase difficulty of all checks that use that limb by 1 Difficulty die.', - effect: '', - }, - { - percent: '101 to 105', - severity: 3, - name: 'Maimed', - Result: 'Limb permanently lost. Unless you have a cybernetic replacement, cannot perform actions that use that limb. Add 1 Setback to all other actions.', - effect: '', - }, - { - percent: '106 to 110', - severity: 3, - name: 'Horrific Injury', - Result: 'Roll 1d10 to determine one wounded characteristic -- roll results(1-3 = Brawn, 4-6 = Agility, 7 = Intellect, 8 = Cunning, 9 = Presence, 10 = Willpower. Until Healed, treat characteristic as one point lower.', - effect: '', - }, - { - percent: '111 to 115', - severity: 3, - name: 'Temporarily Lame', - Result: 'Until healed, may not perform more than one maneuver each turn.', - effect: '', - }, - { - percent: '116 to 120', - severity: 3, - name: 'Blinded', - Result: 'Can no longer see. Upgrade the difficulty of Perception and Vigilance checks three times, and all other checks twice.', - effect: '', - }, - { - percent: '121 to 125', - severity: 3, - name: 'Knocked Senseless', - Result: 'You can no longer upgrade dice for checks.', - effect: '', - }, - //---------------------------------------- Severity 4 - { - percent: '126 to 130', - severity: 4, - name: 'Gruesome Injury', - Result: 'Roll 1d10 to determine one wounded characteristic -- roll results(1-3 = Brawn, 4-6 = Agility, 7 = Intellect, 8 = Cunning, 9 = Presence, 10 = Willpower. Characteristic is permanently one point lower.', - effect: '', - }, - { - percent: '131 to 140', - severity: 4, - name: 'Bleeding Out', - Result: 'Suffer 1 wound and 1 strain every round at the beginning of turn. For every 5 wounds suffered beyond wound threshold, suffer one additional Critical Injury (ignore the details for any result below this result).', - effect: '', - }, - { - percent: '141 to 150', - severity: 4, - name: 'The End is Nigh', - Result: 'Die after the last Initiative slot during the next round.', - effect: '', - }, - { - percent: '151', - severity: 4, - name: 'Dead', - Result: 'Complete, absolute death.', - effect: '', - } - ]; - - var critRoll = function (addCritNum) { - - var openSlot = false; - var diceRoll = ''; - var critMod = ''; - var rollTotal = ''; - var rollOffset = parseInt(getAttrByName(diceObj.vars.characterID, 'critAddOffset')); - rollOffset = rollOffset ? rollOffset : 0; - eote.process.logger("critRoll", "rollOffset: " + rollOffset) - var totalcrits = 0; - - //check open critical spot - for (i = 15; i >= 1; i--) { - - var slot = getAttrByName(diceObj.vars.characterID, 'critOn' + i); - - if (slot == '0' || slot == '') { - openSlot = i; - } else { - totalcrits = totalcrits + 1; - } - } - - if (!openSlot) { - sendChat("Alert", "&{template:base} {{title=Alert}} {{wide=Why are you not dead!?}}"); - return false; - } - - //roll random - if (!addCritNum) { - diceRoll = randomInteger(100); - critMod = (totalcrits * 10); - rollTotal = diceRoll + critMod + rollOffset; - eote.process.logger("critRoll", "diceRoll: " + diceRoll); - eote.process.logger("critRoll", "critMod: " + critMod); - eote.process.logger("critRoll", "rollTotal " + rollTotal); - } else { - rollTotal = parseInt(addCritNum); - } - - //find crit in crital table - for (var key in critTable) { - - var percent = critTable[key].percent.split(' to '); - var low = parseInt(percent[0]); - var high = percent[1] ? parseInt(percent[1]) : 1000; - - if ((rollTotal >= low) && (rollTotal <= high)) { - - critAttrs = [ - { - name: 'critName' + openSlot, - current: critTable[key].name, - max: '', - update: true - }, - { - name: 'critSeverity' + openSlot, - current: critTable[key].severity, - max: '', - update: true - }, - { - name: 'critRange' + openSlot, - current: critTable[key].percent, - max: '', - update: true - }, - { - name: 'critSummary' + openSlot, - current: critTable[key].Result, - max: '', - update: true - }, - { - name: 'critOn' + openSlot, - current: openSlot, - max: '', - update: true - } - ]; - - eote.updateAddAttribute(characterObj, critAttrs); - - var chat = '/direct &{template:base} {{title=' + diceObj.vars.characterName + '}}' - chat = chat + '{{subtitle=Critical Injury}}'; - chat = chat + '{{flavor=}}' - chat = chat + '{{Current Criticals=' + totalcrits + ' x 10}}'; - if (rollOffset) { - chat = chat + '{{Dice Roll Offset=' + rollOffset + '}}'; - } - chat = chat + '{{Dice Roll=' + diceRoll + '}}'; - chat = chat + '{{Total=' + rollTotal + '}}'; - chat = chat + '{{wide=' + critTable[key].name + '
'; - chat = chat + critTable[key].Result + '
}}'; - - sendChat(diceObj.vars.characterName, chat); - - } - } - } - - var critHeal = function (critID) { - - critAttrs = [ - { - name: 'critName' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critSeverity' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critRange' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critSummary' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critOn' + critID, - current: 0, - max: '', - update: true - } - ]; - - eote.updateAddAttribute(characterObj, critAttrs); - - } - - - var critArray = cmd[1].split('|'); - var prop1 = critArray[0]; - var prop2 = critArray[1] ? critArray[1] : null; - - if (prop1 == 'heal') { - critHeal(prop2); - } else if (prop1 == 'add') { - critRoll(prop2); - } else { // crit(roll) - critRoll(); - } - -} - -eote.process.critShip = function (cmd, diceObj) { - - /* CritShip - * default: - * Description: Rolls vehicle critical table, Both crit() and critShip() function the same - * Command: !eed critShip(roll) critShip(roll|#) critShip(heal|#) - * ---------------------------------------------------------------- */ - - var characterObj = [{ name: diceObj.vars.characterName, id: diceObj.vars.characterID }]; - - var critTable = [ - { - percent: '1 to 9', - severity: 1, - name: 'Mechanical Stress', - Result: 'Ship or vehicle suffers 1 system strain.', - effect: '', - }, - { - percent: '10 to 18', - severity: 1, - name: 'Jostled', - Result: 'All crew members suffer 1 strain.', - effect: '', - }, - { - percent: '19 to 27', - severity: 1, - name: 'Losing Power to Shields', - Result: 'Decrease defense in affected defense zone by 1 until repaired. If ship or vehicle has no defense, suffer 1 system strain.', - effect: '', - }, - { - percent: '28 to 36', - severity: 1, - name: 'Knocked Off Course', - Result: 'On next turn, pilot cannot execute any maneuvers. Instead, must make a Piloting check to regain bearings and resume course. Difficulty depends on current speed.', - effect: '', - }, - { - percent: '37 to 45', - severity: 1, - name: 'Tailspin', - Result: 'All firing from ship or vehicle suffers 2 setback dice until end of pilot\'s next turn.', - effect: '', - }, - { - percent: '46 to 54', - severity: 1, - name: 'Component Hit', - Result: 'One component of the attacker\'s choice is knocked offline, and is rendered inoperable until the end of the following round. See page 245 CRB for Small/Large Vehicle and Ship Component tables. ', - effect: '', - }, - // --------------- severity : 2 - { - percent: '55 to 63', - severity: 2, - name: 'Shields Failing', - Result: 'Decrease defense in all defense zones by 1 until repaired. If ship or vehicle has no defense, suffer 2 system strain.', - effect: '', - }, - { - percent: '64 to 72', - severity: 2, - name: 'Hyperdrive or Navicomputer Failure', - Result: 'Cannot make any jump to hyperspace until repaired. If ship or vehicle has no hyperdrive, navigation systems fail leaving it unable to tell where it is or is going.', - effect: '', - }, - { - percent: '73 to 81', - severity: 2, - name: 'Power Fluctuations', - Result: 'Pilot cannot voluntarily inflict system strain on the ship until repaired.', - effect: '', - }, - // --------------- severity : 3 - { - percent: '82 to 90', - severity: 3, - name: 'Shields Down', - Result: 'Decrease defense in affected defense zone to 0 and all other defense zones by 1 point until repaired. If ship or vehicle has no defense, suffer 4 system strain.', - effect: '', - }, - { - percent: '91 to 99', - severity: 3, - name: 'Engine Damaged', - Result: 'Ship or vehicle\'s maximum speed reduced by 1, to a minimum of 1, until repaired.', - effect: '', - }, - { - percent: '100 to 108', - severity: 3, - name: 'Shield Overload', - Result: 'Decrease defense in all defense zones to 0 until repaired. In addition, suffer 2 system strain. Cannot be repaired until end of encounter. If ship or vehicle has no defense, reduce armor by 1 until repaired.', - effect: '', - }, - { - percent: '109 to 117', - severity: 3, - name: 'Engines Down', - Result: 'Ship or vehicle\'s maximum speed reduced to 0. In addition, ship or vehicle cannot execute maneuvers until repaired. Ship continues on course at current speed and cannot be stopped or course changed until repaired.', - effect: '', - }, - { - percent: '118 to 126', - severity: 3, - name: 'Major System Failure', - Result: 'One component of the attacker\'s choice is heavily damages, and is inoperable until the critical hit is repaired. See page 245 CRB for Small/Large Vehicle and Ship Component tables. ', - effect: '', - }, - // --------------- severity : 4 - { - percent: '127 to 133', - severity: 4, - name: 'Major Hull Breach', - Result: 'Ships and vehicles of silhouette 4 and smaller depressurize in a number of rounds equal to silhouette. Ships of silhouette 5 and larger don\'t completely depressurize, but parts do (specifics at GM discretion). Ships and vehicles operating in atmosphere instead suffer a Destabilized Critical.', - effect: '', - }, - { - percent: '134 to 138', - severity: 4, - name: 'Destabilised', - Result: 'Reduce ship or vehicle\'s hull integrity threshold and system strain threshold to half original values until repaired.', - effect: '', - }, - { - percent: '139 to 144', - severity: 4, - name: 'Fire!', - Result: 'Fire rages through ship or vehicle and it immediately takes 2 system strain. Fire can be extinguished with appropriate skill, Vigilance or Cool checks at GM\'s discretion. Takes one round per two silhouette to put out.', - effect: '', - }, - { - percent: '145 to 153', - severity: 4, - name: 'Breaking Up', - Result: 'At the end of next round, ship is completely destroyed. Anyone aboard has one round to reach escape pod or bail out before they are lost.', - effect: '', - }, - { - percent: '154+', - severity: 4, - name: 'Vaporized', - Result: 'The ship or Vehicle is completely destroyed.', - effect: '', - } - ]; - - var critRoll = function (addCritNum) { - - var openSlot = false; - var diceRoll = ''; - var critMod = ''; - var rollTotal = ''; - var rollOffset = parseInt(getAttrByName(diceObj.vars.characterID, 'critShipAddOffset')); - rollOffset = rollOffset ? rollOffset : 0; - var totalcrits = 0; - - //check open critical spot - for (i = 15; i >= 1; i--) { - - var slot = getAttrByName(diceObj.vars.characterID, 'critShipOn' + i); - - if (slot == '0' || slot == '') { - openSlot = i; - } else { - totalcrits = totalcrits + 1; - } - } - - if (!openSlot) { - sendChat("Alert", "&{template:base} {{title=Alert}} {{wide=Why are you not dead!?}}"); - return false; - } - - //roll random - if (!addCritNum) { - diceRoll = randomInteger(100); - critMod = (totalcrits * 10); - rollTotal = diceRoll + critMod + rollOffset; - } else { - rollTotal = parseInt(addCritNum); - } - - //find crit in crital table - for (var key in critTable) { - - var percent = critTable[key].percent.split(' to '); - var low = parseInt(percent[0]); - var high = percent[1] ? parseInt(percent[1]) : 1000; - - if ((rollTotal >= low) && (rollTotal <= high)) { - - critAttrs = [ - { - name: 'critShipName' + openSlot, - current: critTable[key].name, - max: '', - update: true - }, - { - name: 'critShipSeverity' + openSlot, - current: critTable[key].severity, - max: '', - update: true - }, - { - name: 'critShipRange' + openSlot, - current: critTable[key].percent, - max: '', - update: true - }, - { - name: 'critShipSummary' + openSlot, - current: critTable[key].Result, - max: '', - update: true - }, - { - name: 'critShipOn' + openSlot, - current: openSlot, - max: '', - update: true - } - ]; - - eote.updateAddAttribute(characterObj, critAttrs); - - var chat = '/direct &{template:base} {{title=' + diceObj.vars.characterName + '}} ' - chat = chat + '{{subtitle=Vehicle Critical}}'; - chat = chat + '{{flavor=}}';//need new graphic - chat = chat + '{{Current Criticals=' + totalcrits + ' x 10}}'; - if (rollOffset) { - chat = chat + '{{Dice Roll Offset=' + rollOffset + '}}'; - } - chat = chat + '{{Dice Roll=' + diceRoll + '}}'; - chat = chat + '{{Total=' + rollTotal + '}}'; - chat = chat + '{{wide=' + critTable[key].name + '
'; - chat = chat + critTable[key].Result + '}}'; - - sendChat(diceObj.vars.characterName, chat); - - } - } - - } - - var critHeal = function (critID) { - - critAttrs = [ - { - name: 'critShipName' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critShipSeverity' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critShipRange' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critShipSummary' + critID, - current: '', - max: '', - update: true - }, - { - name: 'critShipOn' + critID, - current: 0, - max: '', - update: true - } - ]; - - eote.updateAddAttribute(characterObj, critAttrs); - - } - - var critArray = cmd[1].split('|'); - var prop1 = critArray[0]; - var prop2 = critArray[1] ? critArray[1] : null; - - if (prop1 == 'heal') { - critHeal(prop2); - } else if (prop1 == 'add') { - critRoll(prop2); - } else { // crit(roll) - critRoll(); - } - -} - -eote.process.gmdice = function (cmd) { - - /* gmdice - * default: - * Description: Update CMD string to include -DicePool dice - * Command: (gmdice) - * ---------------------------------------------------------------- */ - - //var charObj = findObjs({ _type: "character", name: "-DicePool" }); - var charID = eote.defaults['-DicePoolID'];//charObj[0].id; - - var g = getAttrByName(charID, 'ggm'); - var y = getAttrByName(charID, 'ygm'); - var p = getAttrByName(charID, 'pgm'); - var r = getAttrByName(charID, 'rgm'); - var b = getAttrByName(charID, 'bgm'); - var blk = getAttrByName(charID, 'blkgm'); - var w = getAttrByName(charID, 'wgm'); - var upAbility = getAttrByName(charID, 'upgradeAbilitygm'); - var upDifficulty = getAttrByName(charID, 'upgradeDifficultygm'); - var downProficiency = getAttrByName(charID, 'downgradeProficiencygm'); - var downChallenge = getAttrByName(charID, 'downgradeChallengegm'); - - var gmdiceCMD = g + 'g ' + y + 'y ' + p + 'p ' + r + 'r ' + b + 'b ' + blk + 'blk ' + w + 'w upgrade(ability|' + upAbility + ') downgrade(proficiency|' + downProficiency + ') upgrade(difficulty|' + upDifficulty + ') downgrade(challenge|' + downChallenge + ')'; - - eote.process.logger("eote.process.gmDice.charID", charID); - - cmd = cmd.replace('(gmdice)', gmdiceCMD); - - //log(cmd); - - return cmd; -} - -eote.process.encum = function (cmd, diceObj) { - - /* Encumberment - * default: - * Description: If the current encum is great than threshold add 1 setback per unit over current encum - * Command: !eed encum(encum_current|encum_threshold) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.encum", cmd); - - _.each(cmd, function (encum) { - - var diceArray = encum.match(/\((.*?)\|(.*?)\)/); - - if (diceArray && diceArray[1] && diceArray[2]) { - - var num1 = eote.process.math(diceArray[1]); - var num2 = eote.process.math(diceArray[2]); - var setbackDice = diceObj.count.setback; - - if (num2 > num1) { - diceObj.count.setback = setbackDice + (num2 - num1); - eote.process.logger("eote.process.encum.NewSetbackTotal", diceObj.count.setback + "blk"); - } - else { - eote.process.logger("eote.process.encum", "No New Setback"); - } - } - }); - - - return diceObj; - -} - -eote.process.skill = function (cmd, diceObj) { - - /* Skill - * default: - * Description: create the ability and proficiency dice for a skill check - * Command: !eed skill(char_value|skill_value) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.skill", cmd); - - _.each(cmd, function (skill) { - - var diceArray = skill.match(/\((.*?)\|(.*?)\)/); - - if (diceArray && diceArray[1] && diceArray[2]) { - - var num1 = eote.process.math(diceArray[1]); - var num2 = eote.process.math(diceArray[2]); - var totalAbil = Math.abs(num1 - num2); - var totalProf = (num1 < num2 ? num1 : num2); - var abilityDice = diceObj.count.ability; - var proficiencyDice = diceObj.count.proficiency; - - diceObj.count.ability = abilityDice + totalAbil; - diceObj.count.proficiency = proficiencyDice + totalProf; - - eote.process.logger("eote.process.skill.abilityTotal", diceObj.count.ability + "g"); - eote.process.logger("eote.process.skill.proficiencyTotal", diceObj.count.proficiency + "y"); - } - }); - - return diceObj; - -} - -eote.process.opposed = function (cmd, diceObj) { - /*Opposed - * default: - * Description: create the difficulty and challenge dice for an opposed skill check - * Command: !eed opposed(char_value|skill_value) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.opposed", cmd); - - _.each(cmd, function (opposed) { - - var diceArray = opposed.match(/\((.*?)\|(.*?)\)/); - - if (diceArray && diceArray[1] && diceArray[2]) { - var num1 = eote.process.math(diceArray[1]); - var num2 = eote.process.math(diceArray[2]); - var totalOppDiff = Math.abs(num1 - num2); - var totalOppChal = (num1 < num2 ? num1 : num2); - var opposeddifficultyDice = diceObj.count.difficulty; - var opposedchallengeDice = diceObj.count.challenge; - diceObj.count.difficulty = opposeddifficultyDice + totalOppDiff; - diceObj.count.challenge = opposedchallengeDice + totalOppChal; - } - }); - - return diceObj; -} - -eote.process.setDice = function (cmd, diceObj) { - - /* setDice - * default: - * Description: Loop thru the dice and adds or subtracts them from the dice object - * Command: !eed g# y# b# blk# r# p# w# or g#+# or g#-# - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.setDice", cmd); - - _.each(cmd, function (dice) { - - var diceArray = dice.match(/(-?\d{1,2})(\w{1,3})/); - - if (diceArray && diceArray[1] && diceArray[2]) { - - var diceQty = eote.process.math(diceArray[1]); - diceQty = (isNaN(diceQty) ? 0 : diceQty); - - var abilityDice = diceObj.count.ability; - var proficiencyDice = diceObj.count.proficiency; - var difficultyDice = diceObj.count.difficulty; - var challengeDice = diceObj.count.challenge; - var boostDice = diceObj.count.boost; - var setbackDice = diceObj.count.setback; - var forceDice = diceObj.count.force; - var success = diceObj.count.success; - var advantage = diceObj.count.advantage; - var threat = diceObj.count.threat; - var failure = diceObj.count.failure; - - switch (diceArray[2]) { - case 'b': - diceObj.count.boost = boostDice + diceQty; - break; - case 'g': - diceObj.count.ability = abilityDice + diceQty; - break; - case 'y': - diceObj.count.proficiency = proficiencyDice + diceQty; - break; - case 'blk': - diceObj.count.setback = setbackDice + diceQty; - break; - case 'p': - diceObj.count.difficulty = difficultyDice + diceQty; - break; - case 'r': - diceObj.count.challenge = challengeDice + diceQty; - break; - case 'w': - diceObj.count.force = forceDice + diceQty; - break; - case 's': - diceObj.count.success = success + diceQty; - break; - case 'a': - diceObj.count.advantage = advantage + diceQty; - break; - case 't': - diceObj.count.threat = threat + diceQty; - break; - case 'f': - diceObj.count.failure = failure + diceQty; - break; - } - } - }); - - diceObj = eote.process.checkNegative(diceObj); - - eote.process.logger("eote.process.setDice.DiceToRoll", diceObj.count.boost + "b," + diceObj.count.ability + "g," + diceObj.count.proficiency + "y," + diceObj.count.setback + "blk," + diceObj.count.difficulty + "p," + diceObj.count.challenge + "r," + diceObj.count.force + "w," + diceObj.count.advantage + "a," + diceObj.count.threat + "t," + diceObj.count.failure + "f"); - - return diceObj; -} - -eote.process.checkNegative = function (diceObj) { - if (diceObj.count.boost < 0) { - eote.process.logger("eote.process.checkNegative.boost", "Setting count to 0 for being negative.") - diceObj.count.boost = 0; - } - - if (diceObj.count.ability < 0) { - eote.process.logger("eote.process.checkNegative.ability", "Setting count to 0 for being negative.") - diceObj.count.ability = 0; - } - - if (diceObj.count.proficiency < 0) { - eote.process.logger("eote.process.checkNegative.proficiency", "Setting count to 0 for being negative.") - diceObj.count.proficiency = 0; - } - - if (diceObj.count.setback < 0) { - eote.process.logger("eote.process.checkNegative.setback", "Setting count to 0 for being negative.") - diceObj.count.setback = 0; - } - - if (diceObj.count.difficulty < 0) { - eote.process.logger("eote.process.checkNegative.difficulty", "Setting count to 0 for being negative.") - diceObj.count.difficulty = 0; - } - - if (diceObj.count.challenge < 0) { - eote.process.logger("eote.process.checkNegative.challenge", "Setting count to 0 for being negative.") - diceObj.count.challenge = 0; - } - - if (diceObj.count.force < 0) { - eote.process.logger("eote.process.checkNegative.force", "Setting count to 0 for being negative.") - diceObj.count.force = 0; - } - - if (diceObj.count.success < 0) { - eote.process.logger("eote.process.checkNegative.success", "Setting count to 0 for being negative.") - diceObj.count.success = 0; - } - - if (diceObj.count.advantage < 0) { - eote.process.logger("eote.process.checkNegative.advantage", "Setting count to 0 for being negative.") - diceObj.count.advantage = 0; - } - - if (diceObj.count.threat < 0) { - eote.process.logger("eote.process.checkNegative.threat", "Setting count to 0 for being negative.") - diceObj.count.threat = 0; - } - - if (diceObj.count.failure < 0) { - eote.process.logger("eote.process.checkNegative.failure", "Setting count to 0 for being negative.") - diceObj.count.failure = 0; - } - - return diceObj; -} - -eote.process.upgrade = function (cmd, diceObj) { - - /* Upgrade - * default: - * Description: upgrades ability and difficulty dice - * Command: !eed upgrade(ability|#) or upgrade(difficulty|#) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.upgrade", cmd); - - _.each(cmd, function (dice) { - - var diceArray = dice.match(/\((.*?)\|(.*?)\)/); - - if (diceArray && diceArray[1] && diceArray[2]) { - - var type = diceArray[1]; - var upgradeVal = eote.process.math(diceArray[2]); - var abilityDice = diceObj.count.ability; - var proficiencyDice = diceObj.count.proficiency; - var difficultyDice = diceObj.count.difficulty; - var challengeDice = diceObj.count.challenge; - - switch (type) { - case 'ability': - - var totalProf = (upgradeVal < abilityDice ? upgradeVal : abilityDice); - var totalAbil = Math.abs(upgradeVal - abilityDice); - - if (upgradeVal > abilityDice) { - totalProf = totalProf + Math.floor(totalAbil / 2); - totalAbil = totalAbil % 2; - } - - diceObj.count.ability = totalAbil; - diceObj.count.proficiency = proficiencyDice + totalProf; - - eote.process.logger("eote.process.upgrade.abilityTotal", diceObj.count.ability + "g"); - eote.process.logger("eote.process.upgrade.proficiencyTotal", diceObj.count.proficiency + "y"); - - break; - case 'difficulty': - - var totalChall = (upgradeVal < difficultyDice ? upgradeVal : difficultyDice); - var totalDiff = Math.abs(upgradeVal - difficultyDice); - - if (upgradeVal > difficultyDice) { - totalChall = totalChall + Math.floor(totalDiff / 2); - totalDiff = totalDiff % 2; - } - - diceObj.count.difficulty = totalDiff; - diceObj.count.challenge = challengeDice + totalChall; - - eote.process.logger("eote.process.upgrade.difficultyTotal", diceObj.count.difficulty + "p"); - eote.process.logger("eote.process.upgrade.challengeTotal", diceObj.count.challenge + "r"); - - break; - } - } - - }); - - return diceObj; -} - -eote.process.downgrade = function (cmd, diceObj) { - - /* Downgrade - * default: - * Description: downgrades proficiency and challenge dice - * Command: !eed downgrade(proficiency|#) or downgrade(challenge|#) - * ---------------------------------------------------------------- */ - - eote.process.logger("eote.process.downgrade", cmd); - - _.each(cmd, function (dice) { - - var diceArray = dice.match(/\((.*?)\|(.*?)\)/); - - if (diceArray && diceArray[1] && diceArray[2]) { - - var type = diceArray[1]; - var downgradeVal = eote.process.math(diceArray[2]); - var abilityDice = diceObj.count.ability; - var proficiencyDice = diceObj.count.proficiency; - var difficultyDice = diceObj.count.difficulty; - var challengeDice = diceObj.count.challenge; - - switch (type) { - case 'proficiency': - - var profConvertedToAbil = proficiencyDice * 2; - - if (downgradeVal > (abilityDice + profConvertedToAbil)) { - diceObj.count.ability = 0; - diceObj.count.proficiency = 0; - } else if (downgradeVal > profConvertedToAbil) { - downgradeVal = Math.abs(downgradeVal - profConvertedToAbil); - diceObj.count.ability = Math.abs(downgradeVal - abilityDice); - diceObj.count.proficiency = 0; - } else { - diceObj.count.ability = abilityDice + (profConvertedToAbil - downgradeVal) % 2; - diceObj.count.proficiency = Math.floor((profConvertedToAbil - downgradeVal) / 2); - } - - break; - case 'challenge': - - var challConvertedToDiff = challengeDice * 2; - - if (downgradeVal > (difficultyDice + challConvertedToDiff)) { - diceObj.count.difficulty = 0; - diceObj.count.challenge = 0; - } else if (downgradeVal > challConvertedToDiff) { - downgradeVal = Math.abs(downgradeVal - challConvertedToDiff); - diceObj.count.difficulty = Math.abs(downgradeVal - difficultyDice); - diceObj.count.challenge = 0; - } else { - diceObj.count.difficulty = difficultyDice + (challConvertedToDiff - downgradeVal) % 2; - diceObj.count.challenge = Math.floor((challConvertedToDiff - downgradeVal) / 2); - } - - break; - } - } - }); - - return diceObj; -} - -eote.process.math = function (expr) { - - /* Math - * Returns: Number - * Description: Evaluates a mathematical expression (as a string) and return the result - * ---------------------------------------------------------------- */ - - var chars = expr.split(""); - var n = [], op = [], index = 0, oplast = true; - - n[index] = ""; - - // Parse the expression - for (var c = 0; c < chars.length; c++) { - - if (isNaN(parseInt(chars[c])) && chars[c] !== "." && !oplast) { - op[index] = chars[c]; - index++; - n[index] = ""; - oplast = true; - } else { - n[index] += chars[c]; - oplast = false; - } - } - - // Calculate the expression - expr = parseFloat(n[0]); - for (var o = 0; o < op.length; o++) { - var num = parseFloat(n[o + 1]); - switch (op[o]) { - case "+": - expr = expr + num; - break; - case "-": - expr = expr - num; - break; - case "*": - expr = expr * num; - break; - case "/": - expr = expr / num; - break; - } - } - - return expr; -} - -eote.process.addDiceValues = function (diceTotalObj, diceResult) { - - diceTotalObj.success = diceTotalObj.success + diceResult.success; - diceTotalObj.failure = diceTotalObj.failure + diceResult.failure; - diceTotalObj.advantage = diceTotalObj.advantage + diceResult.advantage; - diceTotalObj.threat = diceTotalObj.threat + diceResult.threat; - diceTotalObj.triumph = diceTotalObj.triumph + diceResult.triumph; - diceTotalObj.despair = diceTotalObj.despair + diceResult.despair; - diceTotalObj.light = diceTotalObj.light + diceResult.light; - diceTotalObj.dark = diceTotalObj.dark + diceResult.dark; - - return diceTotalObj; -} - -eote.process.totalDiceValues = function (diceTotalObj) { - - var diceTS = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - - var i = 0; - - i = diceTotalObj.success - diceTotalObj.failure; - - if (i >= 0) { - diceTS.success = i; - } else { - diceTS.failure = Math.abs(i); - } - - i = diceTotalObj.advantage - diceTotalObj.threat; - - if (i >= 0) { - diceTS.advantage = i; - } else { - diceTS.threat = Math.abs(i); - } - - diceTS.triumph = diceTotalObj.triumph; - diceTS.despair = diceTotalObj.despair; - diceTS.light = diceTotalObj.light; - diceTS.dark = diceTotalObj.dark; - - return diceTS; -} - -eote.process.rollDice = function (diceObj) { - - results = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: '', - diceTextLog: '' - } - - eote.process.logger("eote.process.rollDice.FinalDiceToRoll", diceObj.count.boost + "b," + diceObj.count.ability + "g," + diceObj.count.proficiency + "y," + diceObj.count.setback + "blk," + diceObj.count.difficulty + "p," + diceObj.count.challenge + "r," + diceObj.count.force + "w," + diceObj.count.advantage + "a," + diceObj.count.threat + "t," + diceObj.count.failure + "f"); - - //Blue "Boost" die (d6) - if (diceObj.count.boost > 0) { - results = eote.roll.boost(diceObj.count.boost); - diceObj.graphicsLog.Boost = results.diceGraphicsLog; - diceObj.textLog.Boost = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //Green "Ability" die (d8) - if (diceObj.count.ability > 0) { - results = eote.roll.ability(diceObj.count.ability); - diceObj.graphicsLog.Ability = results.diceGraphicsLog; - diceObj.textLog.Ability = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //Yellow "Proficiency" die (d12) - if (diceObj.count.proficiency > 0) { - results = eote.roll.proficiency(diceObj.count.proficiency); - diceObj.graphicsLog.Proficiency = results.diceGraphicsLog; - diceObj.textLog.Proficiency = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //Black "SetBack" die (d6) - if (diceObj.count.setback > 0) { - results = eote.roll.setback(diceObj.count.setback); - diceObj.graphicsLog.SetBack = results.diceGraphicsLog; - diceObj.textLog.SetBack = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //Purple "Difficulty" die (d8) - if (diceObj.count.difficulty > 0) { - results = eote.roll.difficulty(diceObj.count.difficulty); - diceObj.graphicsLog.Difficulty = results.diceGraphicsLog; - diceObj.textLog.Difficulty = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //Red "Challenge" die (d12) - if (diceObj.count.challenge > 0) { - results = eote.roll.challenge(diceObj.count.challenge); - diceObj.graphicsLog.Challenge = results.diceGraphicsLog; - diceObj.textLog.Challenge = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //White "Force" die (d12) - if (diceObj.count.force > 0) { - results = eote.roll.force(diceObj.count.force); - diceObj.graphicsLog.Force = results.diceGraphicsLog; - diceObj.textLog.Force = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - // Free Successes (from skills) - if (diceObj.count.success > 0) { - results = eote.roll.success(diceObj.count.success); - diceObj.graphicsLog.Success = results.diceGraphicsLog; - diceObj.textLog.Success = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - // Free Advantage (from skills) - if (diceObj.count.advantage > 0) { - results = eote.roll.advantage(diceObj.count.advantage); - diceObj.graphicsLog.Advantage = results.diceGraphicsLog; - diceObj.textLog.Advantage = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - //Free Threat (from skills) - if (diceObj.count.threat > 0) { - results = eote.roll.threat(diceObj.count.threat); - diceObj.graphicsLog.Threat = results.diceGraphicsLog; - diceObj.textLog.Threat = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - // Free Failure (from skills) - if (diceObj.count.failure > 0) { - results = eote.roll.failure(diceObj.count.failure); - diceObj.graphicsLog.Failure = results.diceGraphicsLog; - diceObj.textLog.Failure = results.diceTextLog; - diceObj.totals = eote.process.addDiceValues(diceObj.totals, results); - } - - //finds the sum of each dice attribute - diceObj.totals = eote.process.totalDiceValues(diceObj.totals); - - return diceObj; -} - -eote.process.diceOutput = function (diceObj, playerName, playerID) { - - //log(diceObj); - var s1 = ''; - var chatGlobal = ''; - var diceGraphicsResults = ""; - var diceGraphicsRolled = ""; - var diceTextRolled = ""; - var diceTextResults = ""; - - diceTextResults = "[" - - if (diceObj.totals.success > 0) { - diceTextResults = diceTextResults + " Success:" + diceObj.totals.success; - for (i = 1; i <= diceObj.totals.success; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.S + s2 + "Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.failure > 0) { - diceTextResults = diceTextResults + " Fail:" + diceObj.totals.failure; - for (i = 1; i <= diceObj.totals.failure; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.F + s2 + "Failure" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.advantage > 0) { - diceTextResults = diceTextResults + " Advant:" + diceObj.totals.advantage; - for (i = 1; i <= diceObj.totals.advantage; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.A + s2 + "Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.threat > 0) { - diceTextResults = diceTextResults + " Threat:" + diceObj.totals.threat; - for (i = 1; i <= diceObj.totals.threat; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.T + s2 + "Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.triumph > 0) { - diceTextResults = diceTextResults + " Triumph:" + diceObj.totals.triumph; - for (i = 1; i <= diceObj.totals.triumph; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.TRIUMPH + s2 + "Triumph" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.despair > 0) { - diceTextResults = diceTextResults + " Despair:" + diceObj.totals.despair; - for (i = 1; i <= diceObj.totals.despair; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.DESPAIR + s2 + "Despair" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.light > 0) { - diceTextResults = diceTextResults + " Light:" + diceObj.totals.light; - - for (i = 1; i <= diceObj.totals.light; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.L + s2 + "Light" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - if (diceObj.totals.dark > 0) { - diceTextResults = diceTextResults + " Dark:" + diceObj.totals.dark; - for (i = 1; i <= diceObj.totals.dark; i++) { - diceGraphicsResults = diceGraphicsResults + s1 + eote.defaults.graphics.SYMBOLS.D + s2 + "Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - } - - diceTextResults = diceTextResults + "]"; - - //------------------------------------> - - if (eote.defaults.globalVars.diceTestEnabled === true) { - characterPlayer = 'TEST'; - } else if (diceObj.vars.characterName) { - characterPlayer = diceObj.vars.characterName; - } else { - characterPlayer = playerName; - } - - if (eote.defaults.globalVars.diceTestEnabled === true) { - chatGlobal = "/direct
6b 8g 12y 6blk 8p 12r 12w
"; - } else if (diceObj.vars.label) { - chatGlobal = "/direct &{template:base} {{title=" + diceObj.vars.label + "}} {{subtitle=" + characterPlayer + "}}"; - } else { - chatGlobal = "/direct &{template:base} {{title=" + characterPlayer + "}}"; - } - - - - //------------------------------------> - - if (eote.defaults.globalVars.diceLogChat === true) { - if (eote.defaults.globalVars.diceLogRolledOnOneLine === true) { - - diceGraphicsRolled = diceObj.graphicsLog.Boost + diceObj.graphicsLog.Ability + diceObj.graphicsLog.Proficiency + diceObj.graphicsLog.SetBack + diceObj.graphicsLog.Difficulty + diceObj.graphicsLog.Challenge + diceObj.graphicsLog.Force + diceObj.graphicsLog.Success + diceObj.graphicsLog.Advantage + diceObj.graphicsLog.Failure + diceObj.graphicsLog.Threat; - - if (diceObj.textLog.Boost != "") diceTextRolled = diceTextRolled + "Boost:" + diceObj.textLog.Boost; - if (diceObj.textLog.Ability != "") diceTextRolled = diceTextRolled + "Ability:" + diceObj.textLog.Ability; - if (diceObj.textLog.Proficiency != "") diceTextRolled = diceTextRolled + "Proficiency:" + diceObj.textLog.Proficiency; - if (diceObj.textLog.SetBack != "") diceTextRolled = diceTextRolled + "SetBack:" + diceObj.textLog.SetBack; - if (diceObj.textLog.Difficulty != "") diceTextRolled = diceTextRolled + "Difficulty:" + diceObj.textLog.Difficulty; - if (diceObj.textLog.Challenge != "") diceTextRolled = diceTextRolled + "Challenge:" + diceObj.textLog.Challenge; - if (diceObj.textLog.Force != "") diceTextRolled = diceTextRolled + "Force:" + diceObj.textLog.Force; - if (diceObj.textLog.Success != "") diceTextRolled = diceTextRolled + "Success:" + diceObj.textLog.Success; - if (diceObj.textLog.Advantage != "") diceTextRolled = diceTextRolled + "Advantage:" + diceObj.textLog.Advantage; - if (diceObj.textLog.Failure != "") diceTextRolled = diceGraphicsRolled + "Failure:" + diceObj.textLog.Failure; - if (diceObj.textLog.Threat != "") diceTextRolled = diceGraphicsRolled + "Threat:" + diceObj.textLog.Threat; - - if (eote.defaults.globalVars.diceGraphicsChat === true) { - chatGlobal = chatGlobal + '{{roll=' + diceGraphicsRolled + '}}'; - } else { - sendChat("", diceTextRolled); - } - - } else { - - if (eote.defaults.globalVars.diceGraphicsChat === true) { - - if (diceObj.vars.label) { - sendChat(characterPlayer, "/direct " + diceObj.vars.label + '
'); - } - - if (diceObj.graphicsLog.Boost != "") sendChat("", "/direct " + diceObj.graphicsLog.Boost); - if (diceObj.graphicsLog.Ability != "") sendChat("", "/direct " + diceObj.graphicsLog.Ability); - if (diceObj.graphicsLog.Proficiency != "") sendChat("", "/direct " + diceObj.graphicsLog.Proficiency); - if (diceObj.graphicsLog.SetBack != "") sendChat("", "/direct " + diceObj.graphicsLog.SetBack); - if (diceObj.graphicsLog.Difficulty != "") sendChat("", "/direct " + diceObj.graphicsLog.Difficulty); - if (diceObj.graphicsLog.Challenge != "") sendChat("", "/direct " + diceObj.graphicsLog.Challenge); - if (diceObj.graphicsLog.Force != "") sendChat("", "/direct " + diceObj.graphicsLog.Force); - if (diceObj.graphicsLog.Success != "") sendChat("", "/direct " + diceObj.graphicsLog.Success); - if (diceObj.graphicsLog.Advantage != "") sendChat("", "/direct " + diceObj.graphicsLog.Advantage); - if (diceObj.graphicsLog.Failure != "") sendChat("", "/direct " + diceObj.graphicsLog.Failure); - if (diceObj.graphicsLog.Threat != "") sendChat("", "/direct " + diceObj.graphicsLog.Threat); - } else { - - if (diceObj.vars.label) { - sendChat(characterPlayer, "/direct " + diceObj.vars.label + '
'); - } - - if (diceObj.textLog.Boost != "") sendChat("", "Boost:" + diceObj.textLog.Boost); - if (diceObj.textLog.Ability != "") sendChat("", "Ability:" + diceObj.textLog.Ability); - if (diceObj.textLog.Proficiency != "") sendChat("", "Proficiency:" + diceObj.textLog.Proficiency); - if (diceObj.textLog.SetBack != "") sendChat("", "SetBack:" + diceObj.textLog.SetBack); - if (diceObj.textLog.Difficulty != "") sendChat("", "Difficulty:" + diceObj.textLog.Difficulty); - if (diceObj.textLog.Challenge != "") sendChat("", "Challenge:" + diceObj.textLog.Challenge); - if (diceObj.textLog.Force != "") sendChat("", "Force:" + diceObj.textLog.Force); - if (diceObj.textLog.Success != "") sendChat("", "Success:" + diceObj.textLog.Success); - if (diceObj.textLog.Advantage != "") sendChat("", "Advantage:" + diceObj.textLog.Advantage); - if (diceObj.textLog.Failure != "") sendChat("", "Failure:" + diceObj.textLog.Failure); - if (diceObj.textLog.Threat != "") sendChat("", "Threat:" + diceObj.textLog.Threat); - - } - } - } - - if (eote.defaults.globalVars.diceGraphicsChat === true) { - - chatGlobal = chatGlobal + '{{results=' + diceGraphicsResults + '}}'; - - sendChat(characterPlayer, chatGlobal); - - } else { - sendChat("Roll", diceTextResults); - } - - eote.process.logger("eote.process.rollResult", diceTextResults); - //All DONE!!! -} - -//----------------------> - -eote.roll = { - - boost: function (diceQty) { - //Blue "Boost" die (d6) - //1 Blank - //2 Blank - //3 Success - //4 Advantage - //5 Advantage + Advantage - //6 Success + Advantage - var roll = 0; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 6; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } else { - roll = randomInteger(6); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.BOOST.BLANK + s2 + "Boost Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.BOOST.BLANK + s2 + "Boost Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.BOOST.S + s2 + "Boost Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.BOOST.A + s2 + "Boost Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 1; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.BOOST.AA + s2 + "Boost Advantage x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 2; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success + Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.BOOST.SA + s2 + "Boost Success + Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - diceResult.advantage = diceResult.advantage + 1; - break; - } - } - - return diceResult; - }, - - ability: function (diceQty) { - //Green "Ability" die (d8) - //1 Blank - //2 Success - //3 Success - //4 Advantage - //5 Advantage - //6 Success + Advantage - //7 Advantage + Advantage - //8 Success + Success - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 8; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } - else { - roll = randomInteger(8); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.BLANK + s2 + "Ability Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.S + s2 + "Ability Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.S + s2 + "Ability Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.A + s2 + "Ability Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 1; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.A + s2 + "Ability Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 1; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success + Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.SA + s2 + "Ability Success + Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - diceResult.advantage = diceResult.advantage + 1; - break; - case 7: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.AA + s2 + "Ability Advantage x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 2; - break; - case 8: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.ABILITY.SS + s2 + "Ability Success x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 2; - break; - } - } - return diceResult; - }, - - proficiency: function (diceQty) { - //Yellow "Proficiency" die (d12) - //1 Blank - //2 Triumph - //3 Success - //4 Success - //5 Advantage - //6 Success + Advantage - //7 Success + Advantage - //8 Success + Advantage - //9 Success + Success - //10 Success + Success - //11 Advantage + Advantage - //12 Advantage + Advantage - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 12; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } - else { - roll = randomInteger(12); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.BLANK + s2 + "Proficiency Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Triumph(+Success))"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.TRIUMPH + s2 + "Proficiency Triumph(+Success)" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.triumph = diceResult.triumph + 1; - diceResult.success = diceResult.success + 1; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.S + s2 + "Proficiency Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.S + s2 + "Proficiency Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.A + s2 + "Proficiency Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 1; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success + Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.SA + s2 + "Proficiency Success + Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - diceResult.advantage = diceResult.advantage + 1; - break; - case 7: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success + Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.SA + s2 + "Proficiency Success + Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - diceResult.advantage = diceResult.advantage + 1; - break; - case 8: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success + Advantage)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.SA + s2 + "Proficiency Success + Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 1; - diceResult.advantage = diceResult.advantage + 1; - break; - case 9: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.SS + s2 + "Proficiency Success x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 2; - break; - case 10: - diceResult.diceTextLog = diceResult.diceTextLog + "(Success x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.SS + s2 + "Proficiency Success x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.success = diceResult.success + 2; - break; - case 11: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.AA + s2 + "Proficiency Advantage x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 2; - break; - case 12: - diceResult.diceTextLog = diceResult.diceTextLog + "(Advantage x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.PROFICIENCY.AA + s2 + "Proficiency Advantage x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.advantage = diceResult.advantage + 2; - break; - } - } - return diceResult; - }, - - setback: function (diceQty) { - //Black "Setback" die (d6) - //1 Blank - //2 Blank - //3 Failure - //4 Failure - //5 Threat - //6 Threat - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 6; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } - else { - roll = randomInteger(6); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SETBACK.BLANK + s2 + "Setback Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SETBACK.BLANK + s2 + "Setback Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SETBACK.F + s2 + "Setback Failure" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SETBACK.F + s2 + "Setback Failure" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SETBACK.T + s2 + "Setback Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SETBACK.T + s2 + "Setback Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - } - } - return diceResult; - }, - - difficulty: function (diceQty) { - //Purple "Difficulty" die (d8) - //1 Blank - //2 Failure - //3 Threat - //4 Threat - //5 Threat - //6 Failure + Failure - //7 Failure + Threat - //8 Threat + Threat - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 8; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } - else { - roll = randomInteger(8); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.BLANK + s2 + "Difficulty Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.F + s2 + "Difficulty Failure" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.T + s2 + "Difficulty Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.T + s2 + "Difficulty Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.T + s2 + "Difficulty Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.FF + s2 + "Difficulty Failure x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 2; - break; - case 7: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure + Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.FT + s2 + "Difficulty Failure + Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - diceResult.threat = diceResult.threat + 1; - break; - case 8: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.DIFFICULTY.TT + s2 + "Difficulty Threat x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 2; - break; - } - } - return diceResult; - }, - - challenge: function (diceQty) { - //Red "Challenge" die (d12) - //1 Blank - //2 Despair - //3 Failure - //4 Failure - //5 Threat - //6 Threat - //7 Failure + Failure - //8 Failure + Failure - //9 Threat + Threat - //10 Threat + Threat - //11 Failure + Threat - //12 Failure + Threat - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 12; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } - else { - roll = randomInteger(12); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Blank)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.BLANK + s2 + "Challenge Blank" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Despair)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.DESPAIR + s2 + "Challenge Despair" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.despair = diceResult.despair + 1; - diceResult.failure = diceResult.failure + 1; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.F + s2 + "Challenge Failure" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.F + s2 + "Challenge Failure" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.T + s2 + "Challenge Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.T + s2 + "Challenge Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 1; - break; - case 7: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.FF + s2 + "Challenge Failure x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 2; - break; - case 8: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.FF + s2 + "Challenge Failure x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 2; - break; - case 9: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.TT + s2 + "Challenge Threat x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 2; - break; - case 10: - diceResult.diceTextLog = diceResult.diceTextLog + "(Threat x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.TT + s2 + "Challenge Threat x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.threat = diceResult.threat + 2; - break; - case 11: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure + Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.FT + s2 + "Challenge Failure + Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - diceResult.threat = diceResult.threat + 1; - break; - case 12: - diceResult.diceTextLog = diceResult.diceTextLog + "(Failure + Threat)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.CHALLENGE.FT + s2 + "Challenge Failure + Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.failure = diceResult.failure + 1; - diceResult.threat = diceResult.threat + 1; - break; - } - } - return diceResult; - }, - - force: function (diceQty) { - //White "Force" die (d12) - //1 Light - //2 Light - //3 Light + Light - //4 Light + Light - //5 Light + Light - //6 Dark - //7 Dark - //8 Dark - //9 Dark - //10 Dark - //11 Dark - //12 Dark + Dark - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - var i = 0; - var s1 = ''; - - if (eote.defaults.globalVars.diceTestEnabled === true) { - diceQty = 12; - } - - for (i = 1; i <= diceQty; i++) { - if (eote.defaults.globalVars.diceTestEnabled === true) { - roll = roll + 1; - } - else { - roll = randomInteger(12); - } - - switch (roll) { - case 1: - diceResult.diceTextLog = diceResult.diceTextLog + "(Light)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.L + s2 + "Force Light" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.light = diceResult.light + 1; - break; - case 2: - diceResult.diceTextLog = diceResult.diceTextLog + "(Light)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.L + s2 + "Force Light" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.light = diceResult.light + 1; - break; - case 3: - diceResult.diceTextLog = diceResult.diceTextLog + "(Light x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.LL + s2 + "Force Light x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.light = diceResult.light + 2; - break; - case 4: - diceResult.diceTextLog = diceResult.diceTextLog + "(Light x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.LL + s2 + "Force Light x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.light = diceResult.light + 2; - break; - case 5: - diceResult.diceTextLog = diceResult.diceTextLog + "(Light x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.LL + s2 + "Force Light x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.light = diceResult.light + 2; - break; - case 6: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.D + s2 + "Force Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 1; - break; - case 7: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.D + s2 + "Force Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 1; - break; - case 8: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.D + s2 + "Force Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 1; - break; - case 9: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.D + s2 + "Force Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 1; - break; - case 10: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.D + s2 + "Force Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 1; - break; - case 11: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.D + s2 + "Force Dark" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 1; - break; - case 12: - diceResult.diceTextLog = diceResult.diceTextLog + "(Dark x2)"; - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.FORCE.DD + s2 + "Force Dark x2" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - diceResult.dark = diceResult.dark + 2; - break; - } - } - return diceResult; - }, - - success: function (diceQty) { - //Free Success - var i = 0; - var s1 = ''; - - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - - diceResult.diceTextLog = diceTextLog + "(Success x" + diceQty + ")"; - diceResult.success = diceResult.success + diceQty; - for (i = 0; i < diceQty; i++) { - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SYMBOLS.S + s2 + "Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - - return diceResult; - }, - - advantage: function (diceQty) { - //Free Advantage - var i = 0; - var s1 = ''; - - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - - diceResult.diceTextLog = diceTextLog + "(Advantage x" + diceQty + ")"; - diceResult.advantage = diceResult.advantage + diceQty; - for (i = 0; i < diceQty; i++) { - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SYMBOLS.A + s2 + "Advantage" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - - return diceResult; - }, - - threat: function (diceQty) { - //Free threat - var i = 0; - var s1 = ''; - - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - - diceResult.diceTextLog = diceTextLog + "(Threat x" + diceQty + ")"; - diceResult.threat = diceResult.threat + diceQty; - for (i = 0; i < diceQty; i++) { - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SYMBOLS.T + s2 + "Threat" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - - return diceResult; - }, - - failure: function (diceQty) { - //Free Failure - var i = 0; - var s1 = ''; - - var roll = 0; - var diceTextLog = ""; - var diceGraphicsLog = ""; - - var diceResult = { - success: 0, - failure: 0, - advantage: 0, - threat: 0, - triumph: 0, - despair: 0, - light: 0, - dark: 0, - diceGraphicsLog: "", - diceTextLog: "" - }; - - diceResult.diceTextLog = diceTextLog + "(Failure x" + diceQty + ")"; - diceResult.failure = diceResult.failure + diceQty; - for (i = 0; i < diceQty; i++) { - diceResult.diceGraphicsLog = diceResult.diceGraphicsLog + s1 + eote.defaults.graphics.SYMBOLS.F + s2 + "Success" + s3 + eote.defaults.globalVars.diceGraphicsChatSize + s4 + eote.defaults.globalVars.diceGraphicsChatSize + s5; - } - - return diceResult; - } -} - -eote.events = function () { - - //event listener Add character defaults to new characters - on("add:character", function (characterObj) { - eote.setCharacterDefaults(characterObj); - }); - - on("chat:message", function (msg) { - - if (msg.type != 'api') { - return; - } - - eote.process.setup(msg.content, msg.who, msg.playerid); - }); - -} - -on('ready', function () { - eote.init(); -}); \ No newline at end of file diff --git a/Star Wars FFG API-Compatible/README.md b/Star Wars FFG API-Compatible/README.md index e44517cafd..39c6752709 100644 --- a/Star Wars FFG API-Compatible/README.md +++ b/Star Wars FFG API-Compatible/README.md @@ -1,7 +1,9 @@ # FFG-SWRPG-API-Compatible -Roll20 Character Sheet for Fantasy Flight Games Star Wars Role Playing Game - For Pro (API) GMs +Roll20 Character Sheet for Fantasy Flight Games Star Wars Role Playing Game - for Pro Level (API) GMs -4.0.2.18 to 4.0.3.12 updates; +4.0.4.2 updates; +Re-Added old Vehicle tabs to allow for smoother transitions. +Design Change of section headers. Added Roll Templates -Fixed display of Species/Career/Specialization to look more crisp. +Fixed display of Species/Career/Specialization to look more crisp. \ No newline at end of file