From e3cd92d77c8fb8a2c3f005d6c2025db072422911 Mon Sep 17 00:00:00 2001 From: BeautiDemise Date: Sun, 4 Aug 2024 01:05:49 +0200 Subject: [PATCH] AutoEffects: part 17 - Added styling rules for the icons of conditional buttons and messages - AutoScript editor has a button to view and edit the AutoScript styling rules --- ProjectMoonTRPG/ProjectMoonTRPG.html | 228 +++++++++++++------ ProjectMoonTRPG/ProjectMoonTRPGStyle.css | 13 +- ProjectMoonTRPG/images/icons/lose.png | Bin 0 -> 4458 bytes ProjectMoonTRPG/images/icons/win.png | Bin 0 -> 4655 bytes ProjectMoonTRPG/imagesResized/icons/lose.png | Bin 0 -> 969 bytes ProjectMoonTRPG/imagesResized/icons/win.png | Bin 0 -> 973 bytes ProjectMoonTRPG/translation.json | 4 +- 7 files changed, 174 insertions(+), 71 deletions(-) create mode 100644 ProjectMoonTRPG/images/icons/lose.png create mode 100644 ProjectMoonTRPG/images/icons/win.png create mode 100644 ProjectMoonTRPG/imagesResized/icons/lose.png create mode 100644 ProjectMoonTRPG/imagesResized/icons/win.png diff --git a/ProjectMoonTRPG/ProjectMoonTRPG.html b/ProjectMoonTRPG/ProjectMoonTRPG.html index a998aa5726..9687fb5929 100644 --- a/ProjectMoonTRPG/ProjectMoonTRPG.html +++ b/ProjectMoonTRPG/ProjectMoonTRPG.html @@ -107,11 +107,13 @@
- + + +
@@ -13384,9 +13386,9 @@ on('clicked:applyDamage', (info) => { /* Damage helper functions beginning */ function getIcon(iconFolder, iconName, settingLimbusStyle = "false") { if (settingLimbusStyle == "true") { - return ``; + return ``; } else { - return `` + return `` } } @@ -14887,14 +14889,14 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals /* Get relevant attributes */ getAttrs(["settingMuteMessage", "settingWhisperRolls", "settingWhisperTarget", "settingLimbusStyle", "settingHideNextTurn", "HP", "HP_max", "StagRes", "StagRes_max", "SP", "SP_max", "thisRoundSpeed", "nextRoundSpeed", - "StaggerState", "distortState", "egoActiveState", "egoType"], function(values) { + "StaggerState", "distortState", "egoActiveState", "egoType", "autoScriptStyling"], function(values) { let settingMuteMessage = values.settingMuteMessage; let settingWhisperRolls = values.settingWhisperRolls; let settingWhisperTarget = values.settingWhisperTarget; let settingLimbusStyle = values.settingLimbusStyle; let settingHideNextTurn = values.settingHideNextTurn; - + let HP = values.HP; let ST = values.StagRes; let SP = values.SP; @@ -14921,10 +14923,15 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals let conditionalMessageList = {}; let conditionalButtonList = {}; let conditionalButtonSilent = ""; + let errorMessageList = {}; + + let stylingList = parseAutoScriptStyling(values.autoScriptStyling); + + console.log(stylingList) let output = {}; let tempOutput = {}; - let returnValues = { checkResult:"success", error:false, }; + let returnValues = { checkResult:"success", error:false }; let challengeRollList = {}; let message = ""; let messageValues = {}; @@ -15045,7 +15052,7 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals case "FlatDamage": tempOutput = autoEffectDamage(AutoEffect[0], barList, scaling); break; case "ChallengeRoll": tempOutput = autoEffectChallengeRoll(AutoEffect[0], scaling); break; case "Speed": tempOutput = autoEffectSpeed(AutoEffect[0], scaling, thisRoundSpeed, nextRoundSpeed); break; - default: tempOutput = {error:true}; autoEffectErrorMessage(`${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); break; + default: tempOutput = autoEffectErrorMessage("Invalid AutoEffect", `${AutoEffect[0][0].replace("Unknown: ","")} is not a valid AutoEffect`, AutoEffect[0]); break; } } console.log(tempOutput) @@ -15053,7 +15060,17 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals /* Handle errors. Continues executing AutoEffects for the sake of finding additional errors, */ /* but does not apply any changes to attributes */ if (tempOutput.hasOwnProperty("error") || returnValues.error == true) { - returnValues.error == true; + if (tempOutput.errorType != undefined) { + if (errorMessageList[tempOutput.errorType] != undefined) { + errorMessageList[tempOutput.errorType] += tempOutput.errorMessage; + } else { + errorMessageList[tempOutput.errorType] = tempOutput.errorMessage; + } + } + + if (returnValues.error != true) { + returnValues.error = tempOutput.error; + } output = {}; return; } @@ -15145,9 +15162,6 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals } } }); - - // console.log(output) - setAttrs(output); /* Create conditional buttons */ for (const [buttonName, buttonAutoScript] of Object.entries(conditionalButtonList)) { @@ -15163,7 +15177,7 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals } /* Message handling */ - if (settingMuteMessage != "true" && message != "") { + if (settingMuteMessage != "true" && message != "" && returnValues.error != true) { if (returnMessage == "false") { let messageHeaderIcon = getIcon("icons", "gear"); @@ -15184,20 +15198,42 @@ function AutoScriptMain(inputAutoScript, triggerType="None", returnMessage="fals } /* Conditional message handling */ - for (const [conditionName, conditionMessage] of Object.entries(conditionalMessageList)) { - if (returnValues.message == undefined) { - returnValues.message = autoEffectEntry(conditionName, conditionMessage, "gear"); - } else { - returnValues.message += autoEffectEntry(conditionName, conditionMessage, "gear"); + if (returnValues.error != true) { + for (const [conditionName, conditionMessage] of Object.entries(conditionalMessageList)) { + let iconName = "gear"; + let iconColor = "#85a874"; + if (stylingList[conditionName] != undefined) { + iconName = stylingList[conditionName][0]; + iconColor = stylingList[conditionName][1]; + } + + if (returnValues.message == undefined) { + returnValues.message = autoEffectEntry(conditionName, conditionMessage, iconName, iconColor); + } else { + returnValues.message += autoEffectEntry(conditionName, conditionMessage, iconName, iconColor); + } } } - + /* Error handling and returnValues callback */ if (returnValues.error == true) { + returnValues.message = ""; + + /* Error message */ + for (const [errorType, errorMessage] of Object.entries(errorMessageList)) { + if (errorType) + if (returnValues.message == undefined) { + returnValues.message = autoEffectEntry(errorType, errorMessage, "exit", "Red"); + } else { + returnValues.message += autoEffectEntry(errorType, errorMessage, "exit", "Red"); + } + } + resetConditionals(); - callback({error: true}); } + // console.log(output) + setAttrs(output); callback(returnValues); }); }); @@ -15283,7 +15319,7 @@ function translateAutoScriptArrayToEnglish(AutoScript) { /* Translate Options */ for (let j = 0; j < AutoScript[i][0].length; j++) { - if(getOptionFromTranslation(AutoScript[i][0][j]) != "Unknown Option") { + if(getOptionFromTranslation(AutoScript[i][0][j]) != "Unknown: " + AutoScript[i][0][j]) { AutoScript[i][0][j] = getOptionFromTranslation(AutoScript[i][0][j]); } } @@ -15301,16 +15337,56 @@ function translateAutoScriptArrayToEnglish(AutoScript) { } return AutoScript; } + +function parseAutoScriptStyling(AutoScriptStyling) { + let stylingList = {}; + let stylingRule = ""; + + /* Remove all newlines, tab spaces and comments */ + AutoScriptStyling = cleanAutoScript(AutoScriptStyling); + + do { + AutoScriptStyling = AutoScriptStyling.trim(); + + /* Checks if an styling rule still remains in the AutoScript */ + if (AutoScriptStyling.indexOf("(") == 0 && AutoScriptStyling.indexOf(")")) { + + /* Removes the next styling rule from the string. Removes the parentheses */ + stylingRule = AutoScriptStyling.substring(1, AutoScriptStyling.indexOf(")")); + AutoScriptStyling = AutoScriptStyling.substring(AutoScriptStyling.indexOf(")")+1); + + stylingRule = stylingRule.trim().split(","); + stylingRule = stylingRule.map(e => e.trim()); + + stylingList[stylingRule[0]] = [stylingRule[1], stylingRule[2]]; + } else { + break; + } + } while (AutoScriptStyling.length > 1) + + /* Return the styling list */ + return stylingList; +} /*--- AutoScript functions end ---*/ /*--- AutoEffect functions ---*/ -function autoEffectEntry(header, message, iconName) { +function autoEffectEntry(header, message, iconName="gear", iconColor="#85a874") { + if (!(/^#(?:[0-9a-fA-F]{3}){1,2}$/).test(iconColor)) { + switch (iconColor.toLowerCase()) { + case "red": iconColor = "#c25944"; break; + case "blue": iconColor = "#7397d1"; break; + case "yellow": iconColor = "#dbb748"; break; + case "purple": iconColor = "#8e7cc3"; break; + default: iconColor = "#85a874"; + } + } + let newEntry = "
" newEntry += `
` - newEntry += `
` + newEntry += `
` newEntry += `${getIcon("icons", iconName)}` newEntry += `
`; newEntry += `
${header}
` @@ -15403,8 +15479,10 @@ function autoEffectTranslateMessage(message) { } /* Whispers an error message to the user detailing an AutoEffect error */ -function autoEffectErrorMessage(errorString, autoEffect) { - console.log(errorString + autoEffect) +function autoEffectErrorMessage(errorType, errorString, AutoEffect) { + AutoEffect = AutoEffect.join(" ").replace("Unknown: ",""); + errorMessage = `(${AutoEffect}) - ${errorString}` + return { errorType: errorType, errorMessage: errorMessage, error: true}; } /* Creates a new conditional button*/ @@ -15426,6 +15504,7 @@ function resetConditionals() { } function autoEffectCustomMessage(AutoEffect, messageValues = {}) { + if (AutoEffect.length > 2) { AutoEffect.slice(3).forEach(option => { if (!["checksuccess", "checkfailure", "checkignore"].includes(option.toLowerCase())) { return autoEffectErrorMessage("Invalid Option", `Option "${option}" is not a valid option`, AutoEffect); } }); } let messageFormat = ""; let checkResultOption = "success"; @@ -15463,8 +15542,11 @@ function autoEffectCustomMessage(AutoEffect, messageValues = {}) { } function autoEffectRequire(AutoEffect, ailmentList, barList, barDamageList) { + let returnValues = {}; + /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 5) { autoEffectErrorMessage(`Expected format: (Require N #Ailment/#Bar/#BarDamage #Scaling(optional) #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 5) { return autoEffectErrorMessage("Format Error", `Expected format: (Require N #Ailment/#Bar/#BarDamage #Scaling(optional) #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { AutoEffect.slice(3).forEach(option => { if (!["scaling", "silent"].includes(option.toLowerCase())) { returnValues = autoEffectErrorMessage("Invalid Option", `Option "${option}" is not a valid option`, AutoEffect); } }); } /* Get target count */ let effectName = AutoEffect[2]; @@ -15475,7 +15557,7 @@ function autoEffectRequire(AutoEffect, ailmentList, barList, barDamageList) { else if (barList.hasOwnProperty(effectName)) { count = barList[effectName]; } /* Handle bar damage count */ else if (barDamageList.hasOwnProperty("-" + effectName)) { count = barDamageList[effectName]; } - else { autoEffectErrorMessage(`Ailment, Bar or BarDamage "${effectName}" does not exist`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Target", `Ailment, Bar or BarDamage "${effectName}" does not exist`, AutoEffect); } /* Get required value. Recalculate count if percentage */ let effectVal = AutoEffect[1]; @@ -15494,11 +15576,10 @@ function autoEffectRequire(AutoEffect, ailmentList, barList, barDamageList) { } effectVal = barMax*percentage; } - else { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number or percentage`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number or percentage`, AutoEffect); } /* Handle the optional scaling property */ let scaling = 1; - let returnValues = {}; if (AutoEffect[3] != undefined) { if (AutoEffect[3].toLowerCase() == "scaling") { scaling = Math.floor(count/effectVal); @@ -15532,12 +15613,15 @@ function autoEffectRequire(AutoEffect, ailmentList, barList, barDamageList) { } function autoEffectConsume(AutoEffect, ailmentList, barList) { - /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 5) { autoEffectErrorMessage(`Expected format: (Consume N #Ailment/#Bar #Scaling(optional) #Silent(optional))`, AutoEffect); return {error: true}; } + let returnValues = {}; + /* Check format */ + if (AutoEffect.length < 3 || AutoEffect.length > 5) { return autoEffectErrorMessage("Format Error", `Expected format: (Consume N #Ailment/#Bar #Scaling(optional) #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { AutoEffect.slice(3).forEach(option => { if (!["scaling", "silent"].includes(option.toLowerCase())) { returnValues = autoEffectErrorMessage("Invalid Option", `Option "${option}" is not a valid option`, AutoEffect); } }); } + /* Get consumed value */ let effectVal = parseInt(Math.abs(AutoEffect[1])); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } let count = 0; /* Get target */ @@ -15555,11 +15639,10 @@ function autoEffectConsume(AutoEffect, ailmentList, barList) { effectTarget = effectName; count = barList[effectName]; } - else { autoEffectErrorMessage(`Ailment or Bar "${effectName}" does not exist`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Target", `Ailment or Bar "${effectName}" does not exist`, AutoEffect); } /* Handle the optional scaling property */ let scaling = 1; - let returnValues = {}; if (AutoEffect[3] != undefined) { if (AutoEffect[3].toLowerCase() == "scaling") { scaling = Math.floor(count/effectVal); @@ -15600,29 +15683,32 @@ function autoEffectConsume(AutoEffect, ailmentList, barList) { } function autoEffectAilment(AutoEffect, ailmentList, scaling, settingLimbusStyle) { + let returnValues = {}; + /* Check if Gain, Inflict or Give */ let autoEffectVariant = ""; switch (AutoEffect[0]) { case "Gain": autoEffectVariant = "Gain"; break; case "Inflict": autoEffectVariant = "Inflict"; break; case "Give": autoEffectVariant = "Give"; break; - default: autoEffectErrorMessage(`${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); return {error: true} + default: return autoEffectErrorMessage("Invalid AutoEffect", `${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); } /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 6) { autoEffectErrorMessage(`Expected format: (${autoEffectVariant} N #Ailment #Round(optional) #Silent(optional))`, AutoEffect); return {error: true}; } - + if (AutoEffect.length < 3 || AutoEffect.length > 6) { return autoEffectErrorMessage("Format Error", `Expected format: (${autoEffectVariant} N #Ailment #Round(optional) #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { AutoEffect.slice(3).forEach(option => { if (!["this", "next", "thisround", "nextround", "thisturn", "nextturn", "turn", "round", "silent"].includes(option.toLowerCase())) { returnValues = autoEffectErrorMessage("Invalid Option", `Option "${option}" is not a valid option`, AutoEffect); } }); } + /* Handle scaling */ AutoEffect[1] *= scaling; if (scaling == 0) { return {}; } /* Get ailment name */ let effectAilment = AutoEffect[2]; - if (!ailmentList.hasOwnProperty(effectAilment)) { autoEffectErrorMessage(`Ailment "${effectAilment}" does not exist`, AutoEffect); return {error: true}; } + if (!ailmentList.hasOwnProperty(effectAilment)) { return autoEffectErrorMessage("Invalid Target", `Ailment "${effectAilment}" does not exist`, AutoEffect); } /* Get values */ let effectVal = parseInt(Math.abs(AutoEffect[1])); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } let count = ailmentList[effectAilment][1]; /* Handle the optional turn override */ @@ -15665,14 +15751,15 @@ function autoEffectAilment(AutoEffect, ailmentList, scaling, settingLimbusStyle) messageValues = { effectTarget: effectIcon, effectVal: effectVal/scaling, effectCount: count, scaling: scaling, checkResult: "success", settingLimbusStyle: settingLimbusStyle } /* Execute AutoEffect */ - let returnValues = { message: message, messageValues: messageValues }; + returnValues = {...returnValues, message: message, messageValues: messageValues }; if (autoEffectVariant == "Gain") { returnValues = { ...returnValues, [effectTarget]: parseInt(effectVal), count: parseInt(count) } } return returnValues; } function autoEffectSetBar(AutoEffect, barList, scaling) { /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 4) { autoEffectErrorMessage(`Expected format: (Set N #Bar #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 4) { return autoEffectErrorMessage("Format Error", `Expected format: (Set N #Bar #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { if (AutoEffect[3].toLowerCase() != "silent") { return autoEffectErrorMessage("Invalid Option", `Option "${AutoEffect[3]}" is not a valid option`, AutoEffect); } } /* Handle scaling */ AutoEffect[1] *= scaling; @@ -15680,7 +15767,7 @@ function autoEffectSetBar(AutoEffect, barList, scaling) { /* Get value */ let effectVal = parseInt(Math.abs(AutoEffect[1])); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } let count = 0; /* Get target */ @@ -15690,7 +15777,7 @@ function autoEffectSetBar(AutoEffect, barList, scaling) { effectTarget = effectBar.replace("ST", "StagRes"); count = barList[effectBar]; } - else { autoEffectErrorMessage(`Bar "${effectBar}" does not exist`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Target", `Bar "${effectBar}" does not exist`, AutoEffect); } /* Handle message */ let message = ""; @@ -15707,7 +15794,8 @@ function autoEffectSetBar(AutoEffect, barList, scaling) { } function autoEffectAddBar(AutoEffect, barList, scaling) { /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 4) { autoEffectErrorMessage(`Expected format: (Add N #Bar #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 4) { return autoEffectErrorMessage("Format Error", `Expected format: (Add N #Bar #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { if (AutoEffect[3].toLowerCase() != "silent") { return autoEffectErrorMessage("Invalid Option", `Option "${AutoEffect[3]}" is not a valid option`, AutoEffect); } } /* Handle scaling */ AutoEffect[1] *= scaling; @@ -15715,7 +15803,7 @@ function autoEffectAddBar(AutoEffect, barList, scaling) { /* Get value */ let effectVal = parseInt(AutoEffect[1]); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } let count = 0; /* Get target */ @@ -15725,7 +15813,7 @@ function autoEffectAddBar(AutoEffect, barList, scaling) { effectTarget = effectBar.replace("ST", "StagRes"); count = barList[effectBar]; } - else { autoEffectErrorMessage(`Bar "${effectBar}" does not exist`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Target", `Bar "${effectBar}" does not exist`, AutoEffect); } /* Handle message */ let message = ""; @@ -15743,7 +15831,8 @@ function autoEffectAddBar(AutoEffect, barList, scaling) { } function autoEffectMultiBar(AutoEffect, barList, scaling) { /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 4) { autoEffectErrorMessage(`Expected format: (Multi N #Bar #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 4) { return autoEffectErrorMessage("Format Error", `Expected format: (Multi N #Bar #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { if (AutoEffect[3].toLowerCase() != "silent") { return autoEffectErrorMessage("Invalid Option", `Option "${AutoEffect[3]}" is not a valid option`, AutoEffect); } } /* Handle scaling */ AutoEffect[1] *= scaling; @@ -15751,7 +15840,7 @@ function autoEffectMultiBar(AutoEffect, barList, scaling) { /* Get value */ let effectVal = parseFloat(Math.abs(AutoEffect[1])); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } /* Get target */ let effectBar = AutoEffect[2]; @@ -15760,7 +15849,7 @@ function autoEffectMultiBar(AutoEffect, barList, scaling) { effectTarget = effectBar.replace("ST", "StagRes"); count = barList[effectBar]; } - else { autoEffectErrorMessage(`Bar "${effectBar}" does not exist`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Target", `Bar "${effectBar}" does not exist`, AutoEffect); } /* Handle message */ let message = ""; @@ -15783,11 +15872,12 @@ function autoEffectDice(AutoEffect, scaling) { case "DicePower": autoEffectVariant = "DicePower"; break; case "DiceMax": autoEffectVariant = "DiceMax"; break; case "DiceCount": autoEffectVariant = "DiceCount"; break; - default: autoEffectErrorMessage(`${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); return {error: true} + default: return autoEffectErrorMessage("Invalid AutoEffect", `${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); } /* Check format */ - if (AutoEffect.length < 2 || AutoEffect.length > 3) { autoEffectErrorMessage(`Expected format: (${autoEffectVariant} N #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 2 || AutoEffect.length > 3) { return autoEffectErrorMessage("Format Error", `Expected format: (${autoEffectVariant} N #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 2) { if (AutoEffect[2].toLowerCase() != "silent") { return autoEffectErrorMessage("Invalid Option", `Option "${AutoEffect[2]}" is not a valid option`, AutoEffect); } } /* Handle scaling */ AutoEffect[1] *= scaling; @@ -15795,7 +15885,7 @@ function autoEffectDice(AutoEffect, scaling) { /* Get values */ let effectVal = parseInt(AutoEffect[1]); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } /* Handle message */ let message = ""; @@ -15814,7 +15904,8 @@ function autoEffectDice(AutoEffect, scaling) { function autoEffectChallengeRoll(AutoEffect, scaling) { /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 3 ) { autoEffectErrorMessage(`Expected format: (ChallengeRoll #Stat N #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 3 ) { return autoEffectErrorMessage("Format Error", `Expected format: (ChallengeRoll #Stat N #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { if (AutoEffect[3].toLowerCase() != "silent") { return autoEffectErrorMessage("Invalid Option", `Option "${AutoEffect[3]}" is not a valid option`, AutoEffect); } } /* Handle scaling */ AutoEffect[2] *= scaling; @@ -15822,14 +15913,14 @@ function autoEffectChallengeRoll(AutoEffect, scaling) { /* Get values */ let effectVal = parseInt(AutoEffect[2]); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } /* Get target stat */ let statTarget = ""; if (["fortitude", "instinct", "prudence", "wisdom", "justice", "charm", "insight", "temperance"].includes(AutoEffect[1].toLowerCase())) { statTarget = AutoEffect[1].toLowerCase(); } - else { autoEffectErrorMessage(`Stat "${AutoEffect[1]}" does not exist.`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Stat", `Stat "${AutoEffect[1]}" does not exist.`, AutoEffect); } /* Handle message */ let message = ""; @@ -15848,7 +15939,7 @@ function autoEffectChallengeRoll(AutoEffect, scaling) { function autoEffectSpeed(AutoEffect, scaling, prevThisRoundSpeed, prevNextRoundSpeed) { /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 5) { autoEffectErrorMessage(`Expected format: (Speed N #Duration #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 5) { return autoEffectErrorMessage("Format Error", `Expected format: (Speed N #Duration #Silent(optional))`, AutoEffect); } /* Handle scaling */ AutoEffect[1] *= scaling; @@ -15856,14 +15947,14 @@ function autoEffectSpeed(AutoEffect, scaling, prevThisRoundSpeed, prevNextRoundS /* Get values */ let effectVal = parseInt(AutoEffect[1]); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } /* Get duration */ let effectDuration = ""; - if (AutoEffect[2].toLowerCase() == "this combat") { effectDuration = "Combat"; } + if (["thiscombat"].includes(AutoEffect[2].toLowerCase()) || AutoEffect[3].toLowerCase() == "combat" ) { effectDuration = "Combat"; } else if (["this", "thisround", "this round, thisturn, this turn"].includes(AutoEffect[2].toLowerCase())) { effectDuration = "ThisRound"; } else if (["next", "nextround", "next round, nextturn, next turn"].includes(AutoEffect[2].toLowerCase())) { effectDuration = "NextRound"; } - else { autoEffectErrorMessage(`Duration "${AutoEffect[2]}" does not exist. Expected "Combat", "This round" or "Next round"`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Option", `Duration "${AutoEffect.slice(2).join(" ")}" does not exist. Expected "This Combat", "This round" or "Next round"`, AutoEffect); } /* Handle message */ let message = ""; @@ -15895,11 +15986,12 @@ function autoEffectDamage(AutoEffect, barList, scaling) { switch (AutoEffect[0]) { case "BaseDamage": autoEffectVariant = "BaseDamage"; break; case "FlatDamage": autoEffectVariant = "FlatDamage"; break; - default: autoEffectErrorMessage(`${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); return {error: true} + default: return autoEffectErrorMessage("Invalid AutoEffect", `${AutoEffect[0]} is not a valid AutoEffect`, AutoEffect); } /* Check format */ - if (AutoEffect.length < 3 || AutoEffect.length > 4) { autoEffectErrorMessage(`Expected format: (${autoEffectVariant} N #Bar #Silent(optional))`, AutoEffect); return {error: true}; } + if (AutoEffect.length < 3 || AutoEffect.length > 4) { return autoEffectErrorMessage("Format Error", `Expected format: (${autoEffectVariant} N #Bar #Silent(optional))`, AutoEffect); } + if (AutoEffect.length > 3) { if (AutoEffect[3].toLowerCase() != "silent") { return autoEffectErrorMessage("Invalid Option", `Option "${AutoEffect[3]}" is not a valid option`, AutoEffect); } } /* Handle scaling */ AutoEffect[1] *= scaling; @@ -15907,7 +15999,7 @@ function autoEffectDamage(AutoEffect, barList, scaling) { /* Get value */ let effectVal = parseInt(Math.abs(AutoEffect[1])); - if (isNaN(effectVal) == true) { autoEffectErrorMessage(`Value "${AutoEffect[1]}" is not a number`, AutoEffect); return {error: true}; } + if (isNaN(effectVal) == true) { return autoEffectErrorMessage("Invalid Value", `Value "${AutoEffect[1]}" is not a number`, AutoEffect); } let count = 0; /* Get target */ @@ -15917,7 +16009,7 @@ function autoEffectDamage(AutoEffect, barList, scaling) { effectTarget = effectBar.replace("ST", "StagRes"); count = barList[effectBar]; } - else { autoEffectErrorMessage(`Bar "${effectBar}" does not exist`, AutoEffect); return {error: true}; } + else { return autoEffectErrorMessage("Invalid Target", `Bar "${effectBar}" does not exist`, AutoEffect); } /* Handle message */ let message = ""; @@ -17075,7 +17167,7 @@ function getAutoEffectFromTranslation(autoEffect) { if (getTranslationByKey("autoeffect-dicecount") == autoEffect) { return "DiceCount"; } if (getTranslationByKey("autoeffect-challengeroll") == autoEffect) { return "ChallengeRoll"; } if (getTranslationByKey("autoeffect-speed") == autoEffect) { return "Speed"; } - return "Unknown AutoEffect: " + autoEffect; + return "Unknown: " + autoEffect; } /* Inputs a trigger written in the current language and returns it back to English */ @@ -17095,7 +17187,7 @@ function getTriggerFromTranslation(trigger) { if (getTranslationByKey("autoeffect-trigger-defensive") == trigger) { return "Defensive"; } if (getTranslationByKey("autoeffect-trigger-block") == trigger) { return "Block"; } if (getTranslationByKey("autoeffect-trigger-evade") == trigger) { return "Evade"; } - return "Unknown Trigger" + return "Unknown: " + trigger; } /* Inputs an ailment written in the current language and returns it back to English */ @@ -17128,11 +17220,11 @@ function getBarFromTranslation(bar) { if ("-" + getTranslationByKey("bar-sanity-shortened") == bar) { return "-SP"; } if (getTranslationByKey("bar-health-temp-shortened") == bar) { return "THP"; } if (getTranslationByKey("bar-stagres-temp-shortened") == bar) { return "TST"; } - return "Unknown Bar"; + return "Unknown: " + bar; } function getAilmentOrBarFromTranslation(input) { - if (getBarFromTranslation(input) != "Unknown Bar") { return getBarFromTranslation(input); } + if (getBarFromTranslation(input) != "Unknown: " + input) { return getBarFromTranslation(input); } return getAilmentFromTranslation(input); } @@ -17143,7 +17235,7 @@ function getStatFromTranslation(stat) { if (getTranslationByKey("stats-charm") == stat) { return "Charm"; } if (getTranslationByKey("stats-insight") == stat) { return "Insight"; } if (getTranslationByKey("stats-temperance") == stat) { return "Temperance"; } - return "Unknown Stat"; + return "Unknown: " + stat; } function getOptionFromTranslation(option) { @@ -17155,7 +17247,7 @@ function getOptionFromTranslation(option) { if (getTranslationByKey("autoeffect-option-checksuccess") == option) { return "CheckSuccess"; } if (getTranslationByKey("autoeffect-option-checkfailure") == option) { return "CheckFailure"; } if (getTranslationByKey("autoeffect-option-checkignore") == option) { return "CheckIgnore"; } - return "Unknown Option"; + return "Unknown: " + option; } diff --git a/ProjectMoonTRPG/ProjectMoonTRPGStyle.css b/ProjectMoonTRPG/ProjectMoonTRPGStyle.css index b9c7deaa4a..fc1ebc179c 100644 --- a/ProjectMoonTRPG/ProjectMoonTRPGStyle.css +++ b/ProjectMoonTRPG/ProjectMoonTRPGStyle.css @@ -2598,7 +2598,7 @@ justify-content: center; /* Assorted buttons */ -.shareButton, .editButton, .autoScriptButton, .closeAutoScriptButton, .saveAutoScriptButton, .copyButton, .displayButton, .lockButton { +.shareButton, .editButton, .autoScriptButton, .closeAutoScriptButton, .saveAutoScriptButton, .styleAutoScriptButton, .copyButton, .displayButton, .lockButton { position: absolute; height: 25px; width: 25px; @@ -2613,7 +2613,7 @@ justify-content: center; } -:is(.closeAutoScriptButton, .saveAutoScriptButton):hover { +:is(.closeAutoScriptButton, .saveAutoScriptButton, .styleAutoScriptButton):hover { background-color: #000 !important; } @@ -2655,6 +2655,15 @@ justify-content: center; width: auto; } +.styleAutoScriptButton { + top: 4px; + right: 80px; + z-index: 20; + padding-left: 4px; + padding-right: 4px; + width: auto; +} + :is(.augmentBlock, .specialBlock, .skillBlock) .autoScriptButton { right: 35px; } diff --git a/ProjectMoonTRPG/images/icons/lose.png b/ProjectMoonTRPG/images/icons/lose.png new file mode 100644 index 0000000000000000000000000000000000000000..3c73848acf54a560d44991300fd54dcc30f57bc1 GIT binary patch literal 4458 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 literal 0 HcmV?d00001 diff --git a/ProjectMoonTRPG/images/icons/win.png b/ProjectMoonTRPG/images/icons/win.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfc48cb24f642ddebf2ab483758a126619a2f3c GIT binary patch literal 4655 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 Tw5fCA009VkM!MzNw;%lv!-QA1 literal 0 HcmV?d00001 diff --git a/ProjectMoonTRPG/imagesResized/icons/lose.png b/ProjectMoonTRPG/imagesResized/icons/lose.png new file mode 100644 index 0000000000000000000000000000000000000000..1b993b0abe2abb37045c20abc4744a9a144378bd GIT binary patch literal 969 zcmV;)12+7LP)Px&gGod|RA@u(S&MBOF$@(aX){ThNt#TOWRj+nG?^snB&^?oJkSay@+A9G7(O5f zVDltCzQ>PbDi`w5h2SVxApaYaS4J+15oZ2QL?0PYu!UXLKC`B^nUWSWzn4<(GR`sc zV=3h?5xs16GGjjr=2c0t2H zfIn^lJqrXN07jorV3-+<0f;`3;%h77%&ftABBJLkGqXTyC$aAl7|Ek0(dBU+Wac_3 zA#*27c98))QCpmq1b?c&e{`5>a3EE}+!Vnl!-iEYGne^e*UpV}vN z5;C#?x~%npodSqWaj@VU28olzl z_5oA1JXvW4^KvFFDK*^0h`wZWjuMPyM53zXY^3q|t&A(y;dPv!mDDg08L@S=&`85! zdkRF<1JvpOSq1@`of1WYk*;v8Y z%Ckf`nw6Y@c=>YrF}?%h(^vu9-oeS_nMNMx7iH8Qz`)S&s1c^6l>mXYR*7|Im&TW! zgip(>TeX~1ThGttnZ5N=RXAE^sddBhs|k9Tk1*2PGFxwabn=Us5fG_KA#-670`VLY zaJK@?9*|NA>Lh!FJCyDa5T`NfN1+S`KH&HlhO}#(w=o(kK37Jvk=o1dVi@@c8=US!XvI`c00000NkvXXu0mjfzZPx&heb)Ex@Fdgf$uV*pioGjM{0OKj1I9(~FO|t4r ztFX@6CdKDl(&Br*n>F7s06q7xthzu9=kZ8qvf|7b5}jI^92}Ugfrm9fy9?ovYo(OR zdeM{6ycy+8(q}Ojpq>ng2@pQ{hoomY*A{o%uOk;&@U>=}iUktcsxel8nuXLQEj_aZ z<}95>P;|efn3>q>NUQ|Ztt)Oul)h^PY|%qyIpR=6a*|3)N!l6y7K!N=XSE#<0kM*` zWJEDQQcHedyMRDqlKcPxRO@lM*f0>Ib}Tfk?3;Fj&CY$8?7CyeW?pFI!$7h;Y7uO; z@mMVh&gU#M6%d)LwBw-)KLo@8!M>^sb28)%l5^%B*HVc-oi1yv)Xc-OG&c}OPgOlM z@gAqbym^wJN2>i?_=@@Y|Dj{C3y1>*n=^r^F5#^_B{pmwFc(r>&4_VcXw6wm_=ypf z+~f*{^W^Be+<9U$k{6Oz!gJ>E0AU`$5OJ#u7VPH5#!#=N>IVzoXN@m5(Wvf|Yw1RC zuy>Q->NK