diff --git a/css/rulesAssistant/conditionEditor.css b/css/rulesAssistant/conditionEditor.css index a84be73f23a161bb6857d698520f36decc11be97..25933dc095660540bd5c1115e72f3e9879dee8a5 100644 --- a/css/rulesAssistant/conditionEditor.css +++ b/css/rulesAssistant/conditionEditor.css @@ -123,12 +123,22 @@ margin: 4px; color: black; } +.rule-trash:first-child { + display: inline-block; + padding: 8px; + width: 1.9em; + height: 1.9em; +} .rule-trash::before { font-family: "tme-fa-icons"; content: "\e828"; } +.condition-custom { + width: 90%; +} + /* Encyclopedia help entry */ .rule-help-table { diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index a2f47bec7530a3a8189af8e9a672e2548c5c45a9..cc3943da33549fc91b1c36005b6f3bbf3b64f104 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -233,6 +233,7 @@ App.Data.defaultGameStateVariables = { findName: "", findBackground: "", findData: "", + underperformersCount: 7, // eslint-disable-next-line camelcase pedo_mode: 0, diff --git a/js/rulesAssistant/conditionEditorSimple.js b/js/rulesAssistant/conditionEditorSimple.js index 2384dc9d021c315f23681650b755995b47469e76..64a557a95a6c1a5711122843a60841f5700dc6b5 100644 --- a/js/rulesAssistant/conditionEditorSimple.js +++ b/js/rulesAssistant/conditionEditorSimple.js @@ -4,7 +4,7 @@ App.RA.Activation.SimpleEditor = (function() { /** * @typedef {object} RuleState - * @property {"always"|"never"|"boolean"|"number"|"string"} activeRuleType + * @property {"always"|"never"|"boolean"|"number"|"string"|"custom"} activeRuleType * @property {string} boolGetter * @property {boolean} negateBool * @property {string} stringGetter @@ -17,6 +17,8 @@ App.RA.Activation.SimpleEditor = (function() { * @property {"gt"|"gte"|""} numberLowerComparator * @property {string[]} assignments * @property {"include"|"exclude"|"ignore"} assignmentMode + * @property {string} customGetter + * @property {"b"|"s"|"n"} customMode */ /** @@ -90,6 +92,10 @@ App.RA.Activation.SimpleEditor = (function() { currentRule.activeRuleType = "string"; refreshEditor(); }; + App.UI.DOM.appendNewElement("button", selectorDiv, "Custom", currentRule.activeRuleType === "custom" ? ["selected", "disabled"] : []).onclick = () => { + currentRule.activeRuleType = "custom"; + refreshEditor(); + }; // add bool if (currentRule.activeRuleType === "boolean") { @@ -192,6 +198,20 @@ App.RA.Activation.SimpleEditor = (function() { stringDiv.append(" ", App.UI.DOM.makeTextBox(currentRule.stringValue, val => { currentRule.stringValue = val; })); + } else if (currentRule.activeRuleType === "custom") { + const options = new App.UI.OptionsGroup(); + options.addOption("Mode", "customMode", currentRule) + .addValueList([["Boolean", "b"], ["Number", "n"], ["String", "s"]]).addCallbackToEach(refreshEditor); + outerDiv.append(options.render()); + const textArea = document.createElement("textarea"); + textArea.classList.add("condition-custom"); + textArea.append(currentRule.customGetter); + textArea.onchange = ev => { + // @ts-ignore + currentRule.customGetter = ev.target.value; + refreshEditor(); + }; + App.UI.DOM.appendNewElement("div", outerDiv, textArea); } // Assignments @@ -251,6 +271,8 @@ App.RA.Activation.SimpleEditor = (function() { numberLowerComparator: "", assignments: [], assignmentMode: "ignore", + customGetter: "context => false", + customMode: "b", }; // we know there is only main one rule. let i = 0; @@ -290,6 +312,10 @@ App.RA.Activation.SimpleEditor = (function() { ruleState.stringValue = rule[i + 1].slice(1); ruleState.stringComparator = rule[i + 2]; i += 2; + } else if (typeof rulePart === "string" && rulePart.startsWith("?")) { + ruleState.activeRuleType = "custom"; + ruleState.customMode = rulePart.charAt(1); + ruleState.customGetter = rulePart.slice(2); } else { throw new Error("Rule is not in simple mode format!"); } @@ -344,8 +370,7 @@ App.RA.Activation.SimpleEditor = (function() { } counter++; break; - case "number": - // eslint-disable-next-line no-case-declarations + case "number": { let any = false; if (ruleState.numberLowerComparator !== "") { any = true; @@ -365,6 +390,7 @@ App.RA.Activation.SimpleEditor = (function() { rule.push(true); counter++; } + } break; case "string": rule.push(ruleState.stringGetter); @@ -372,6 +398,9 @@ App.RA.Activation.SimpleEditor = (function() { rule.push(ruleState.stringComparator); counter++; break; + case "custom": + rule.push("?" + ruleState.customMode + ruleState.customGetter); + counter++; } if (ruleState.assignmentMode !== "ignore" && ruleState.assignments.length > 0) { diff --git a/js/rulesAssistant/conditionEditorTree.js b/js/rulesAssistant/conditionEditorTree.js index 87b8831b4c84ac0ce7038e4de05b276dee6b1f02..9f661a5bcb4582eef8e00175233ccd07c194b69d 100644 --- a/js/rulesAssistant/conditionEditorTree.js +++ b/js/rulesAssistant/conditionEditorTree.js @@ -90,6 +90,7 @@ App.RA.Activation.TreeEditor = (function() { App.UI.DOM.appendNewElement("h3", container, "Part Browser"); const div = document.createElement("div"); div.classList.add("rule-part-browser"); + div.append(new RulePartTrash().render()); div.append(new RulePartProvider(() => new RuleGroup("and")).render()); div.append(new RulePartProvider(() => new RuleGroup("add")).render()); div.append(new RulePartProvider(() => new RuleNegate()).render()); diff --git a/src/js/underperformingSlaves.js b/src/js/underperformingSlaves.js index 108896f970fea4cbb2d603e662105e0a6ec8f4ac..fe567d7e61292388c0d844ddcfa6a37f97e46b3f 100644 --- a/src/js/underperformingSlaves.js +++ b/src/js/underperformingSlaves.js @@ -19,7 +19,7 @@ App.Underperformers.highSale = function() { const ratio = slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave)); return ratio > 0 ? ratio : 100000000 + ratio; }, - count: 7, + count: V.underperformersCount, filter: App.Underperformers.expectIncome } ), @@ -42,7 +42,7 @@ App.Underperformers.expensive = function() { { part: (slave) => (slave.lastWeeksCashIncome - getSlaveCost(slave)), largest: false, - count: 7, + count: V.underperformersCount, filter: App.Underperformers.expectIncome } ), @@ -80,5 +80,10 @@ App.Underperformers.passage = function() { tabBar.addTab("Costing vs earning", "earning", App.Underperformers.expensive()); node.append(tabBar.render()); + const g = new App.UI.OptionsGroup(); + g.addOption("Maximum number of slaves", "underperformersCount") + .addValue("Default", 7).showTextBox(); + node.append(g.render()); + return node; };