From 493067d8281b6307553e3e0c1c221bbc251db95b Mon Sep 17 00:00:00 2001 From: Keith Date: Thu, 6 Nov 2025 22:20:43 -0600 Subject: [PATCH 01/14] Accessibility: achievements now have helpful screenreader text --- js/classes/Achievement.js | 6 +----- js/functions/achievements.js | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/js/classes/Achievement.js b/js/classes/Achievement.js index 62b3df6d..234a7b95 100644 --- a/js/classes/Achievement.js +++ b/js/classes/Achievement.js @@ -50,13 +50,9 @@ class Achievement { get desc() { return ( - this.title + - "\n" + (ACH_DATA.descs[this.name] !== undefined ? this.parse(ACH_DATA.descs[this.name]) - : "Not currently implemented.") + - "\n" + - (this.reward === "" ? "" : "Reward: " + this.reward) + : "Not currently implemented.") ); } diff --git a/js/functions/achievements.js b/js/functions/achievements.js index d885b9e8..b1e5aa0a 100644 --- a/js/functions/achievements.js +++ b/js/functions/achievements.js @@ -212,6 +212,27 @@ function checkR19Ach() { function updateAchievements() { tmp.nopathogenupgs = getTotalPathogenUpgrades().eq(0) for (let r=1;r<=ACH_DATA.rows;r++) if (!Achievement.hasRow(r)) window["checkR"+r+"Ach"](); + if (isTabShown("achievements")) { + for (let r = 1; r <= ACH_DATA.rows; r++) { + for (let c = 1; c <= ACH_DATA.cols; c++) { + let id = r * 10 + c; + let ach = tmp.ach[id]; + if (ach) { + let el = new Element("ach" + id); + let req = (ACH_DATA.descs[id] !== undefined ? ach.parse(ACH_DATA.descs[id]) : "Not currently implemented."); + let reward = ach.reward; + let txt = req; + if (ach.has) txt += " (completed)"; + if (reward !== "") txt += "
Reward: " + reward; + el.setHTML(txt); + el.setClasses({ + achCont: true, + [ach.has ? "completed" : "locked"]: true + }); + } + } + } + } } function rowComplete(r) { From faa1f5024efbd5b48423bcae6fbddc7fb38a7c35 Mon Sep 17 00:00:00 2001 From: Keith Date: Thu, 6 Nov 2025 23:01:22 -0600 Subject: [PATCH 02/14] Achievement: also describe names --- js/classes/Achievement.js | 4 +++- js/functions/achievements.js | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/js/classes/Achievement.js b/js/classes/Achievement.js index 234a7b95..65290acd 100644 --- a/js/classes/Achievement.js +++ b/js/classes/Achievement.js @@ -63,7 +63,9 @@ class Achievement { grant() { if (!player.achievements.includes(this.name) && getAllAchievements().includes(this.name)) { player.achievements.push(this.name); - notifier.success("Achievement gotten: " + ACH_DATA.names[this.name]); + const message = "Achievement gotten: " + ACH_DATA.names[this.name]; + notifier.success(message); + document.ariaNotify(message); // specifically do it here or we get "game saved!" every 5s } } diff --git a/js/functions/achievements.js b/js/functions/achievements.js index b1e5aa0a..26fb8e13 100644 --- a/js/functions/achievements.js +++ b/js/functions/achievements.js @@ -219,9 +219,10 @@ function updateAchievements() { let ach = tmp.ach[id]; if (ach) { let el = new Element("ach" + id); + let name = ach.title; let req = (ACH_DATA.descs[id] !== undefined ? ach.parse(ACH_DATA.descs[id]) : "Not currently implemented."); let reward = ach.reward; - let txt = req; + let txt = name + "
" + req; if (ach.has) txt += " (completed)"; if (reward !== "") txt += "
Reward: " + reward; el.setHTML(txt); From 0ad8117655c8fb66bf9aba27f13781b60ac59697 Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 7 Nov 2025 20:37:25 -0600 Subject: [PATCH 03/14] Accessibility: collapse milestones --- js/main/elements.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/main/elements.js b/js/main/elements.js index 105f3505..6517dd29 100644 --- a/js/main/elements.js +++ b/js/main/elements.js @@ -340,8 +340,9 @@ function updateCollpaseHTML(){ ); for (let i = 1; i <= EM_AMT; i++) { let ms = ESSENCE_MILESTONES[i]; - tmp.el["lem" + i].setHTML(ms.desc + "
Req: " + showNum(ms.req) + " Life Essence."); - if (ms.disp !== undefined) tmp.el["lem" + i].setTooltip("Currently: " + ms.disp()); + const active = hasCollapseMilestone(i) ? "
Active" : ""; + const reward = ms.disp !== undefined ? "Currently: " + ms.disp() +"
" : ""; + tmp.el["lem" + i].setHTML(ms.desc + active + "
" + reward + "Req: " + showNum(ms.req) + " Life Essence."); tmp.el["lem" + i].setClasses({ msCont: true, r: !hasCollapseMilestone(i) }); } } From ab6687083ff067a7aac35710d2610ba6255eb01b Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 7 Nov 2025 21:00:30 -0600 Subject: [PATCH 04/14] Accessibility: Time reversal upgrades --- js/main/elements.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/js/main/elements.js b/js/main/elements.js index 6517dd29..cde40222 100644 --- a/js/main/elements.js +++ b/js/main/elements.js @@ -297,9 +297,8 @@ function updateTimeReversalHTML(){ if (!tr2Pow().eq(1) && i == 2) desc += "(^" + showNum(tr2Pow()) + ")"; if (!tr11Pow().eq(1) && i == 11) desc += "(^" + showNum(tr11Pow()) + ")"; - tmp.el["tr" + i].setHTML(desc + "
Cost: " + showNum(upg.cost()) + " Time Cubes."); - if (upg.current !== undefined && (i > 15 ? modeActive("extreme") : true)) - tmp.el["tr" + i].setTooltip("Currently: " + upg.disp(upg.current())); + const effect = upg.current !== undefined && (i > 15 ? modeActive("extreme") : true) ? "Currently: " + upg.disp(upg.current()) + "
" : ""; + tmp.el["tr" + i].setHTML(desc + "
" + effect + "Cost: " + showNum(upg.cost()) + " Time Cubes."); tmp.el["tr" + i].setClasses({ btn: true, locked: !player.tr.upgrades.includes(i) && player.tr.cubes.lt(upg.cost()), From 8a68d226cd2abf94d28faf05bc21fc547bbff629 Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 7 Nov 2025 21:08:39 -0600 Subject: [PATCH 05/14] Accessibility: Time reversal upgrades --- js/main/elements.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/main/elements.js b/js/main/elements.js index cde40222..5e3ff2d0 100644 --- a/js/main/elements.js +++ b/js/main/elements.js @@ -298,7 +298,8 @@ function updateTimeReversalHTML(){ if (!tr11Pow().eq(1) && i == 11) desc += "(^" + showNum(tr11Pow()) + ")"; const effect = upg.current !== undefined && (i > 15 ? modeActive("extreme") : true) ? "Currently: " + upg.disp(upg.current()) + "
" : ""; - tmp.el["tr" + i].setHTML(desc + "
" + effect + "Cost: " + showNum(upg.cost()) + " Time Cubes."); + const cost = !player.tr.upgrades.includes(i) ? "Cost: " + showNum(upg.cost()) + " Time Cubes." : ""; + tmp.el["tr" + i].setHTML(desc + "
" + effect + cost); tmp.el["tr" + i].setClasses({ btn: true, locked: !player.tr.upgrades.includes(i) && player.tr.cubes.lt(upg.cost()), From 55cb15c9083fbc099c0bf6f19d31454f49ffd305 Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 9 Nov 2025 22:12:42 -0600 Subject: [PATCH 06/14] Accessibility: infinity upgrades --- js/main/elements.js | 31 +++++++++++++++++++++++++------ js/main/inf.js | 41 +++++++++++++++++------------------------ js/update.js | 31 ++++++++++++++++--------------- main.html | 2 +- 4 files changed, 59 insertions(+), 46 deletions(-) diff --git a/js/main/elements.js b/js/main/elements.js index 5e3ff2d0..d315d4cf 100644 --- a/js/main/elements.js +++ b/js/main/elements.js @@ -468,6 +468,14 @@ function updateDarkCircleHTML(){ } } + +function srInfUpgBuy(event, id) { +// if(event.shiftKey) { +// document.ariaNotify(tmp.inf.upgs.desc(id)); +// } else { + tmp.inf.upgs.buy(id); +// } +} function updateInfinityEndorsementStuffHTML(){ tmp.el.endorsementManual.setDisplay( player.inf.endorsements.gte(10) && ((tmp.inf.can && !player.automators["endorsements"]) || tmp.inf.stadium.canComplete) @@ -496,16 +504,27 @@ function updateInfinitySubtabHTML(){ tmp.el.nextEndorsement.setTxt(formatDistance(tmp.inf.req)); tmp.el.knowledge.setTxt(showNum(player.inf.knowledge)); tmp.el.knowledgeGain.setTxt(formatGain(player.inf.knowledge, tmp.inf.knowledgeGain, "knowledge")); + let infTable = new Element("infUpgs"); for (let r = 1; r <= INF_UPGS.rows; r++) { for (let c = 1; c <= INF_UPGS.cols; c++) { + const id = `${r};${c}`; let state = ""; - if (tmp.inf.upgs.repealed(r+";"+c) && !modeActive("easy")) state = "repealed"; - else if (!tmp.inf.upgs.canBuy(r+";"+c)) state = "locked"; - else if (player.inf.upgrades.includes(r+";"+c)) state = "bought"; - else if (player.inf.knowledge.gte(ExpantaNum.mul(INF_UPGS.costs[r+";"+c], tmp.inf.upgCostMult(r+";"+c)))) state = "unbought"; + if (tmp.inf.upgs.repealed(id) && !modeActive("easy")) state = "repealed"; + else if (!tmp.inf.upgs.canBuy(id)) state = "locked"; + else if (player.inf.upgrades.includes(id)) state = "bought"; + else if (player.inf.knowledge.gte(ExpantaNum.mul(INF_UPGS.costs[id], tmp.inf.upgCostMult(id)))) state = "unbought"; else state = "locked"; - tmp.el["inf" + (r+";"+c)].setDisplay(tmp.inf.upgs.shown(r+";"+c)); - tmp.el["inf" + (r+";"+c)].setClasses({ + let cell = tmp.el[`inf-cell-${id}`]; + let elem = tmp.el[`inf-${id}`]; +// let effectElem = tmp.el["inf-effect-" + id]; + + cell.setDisplay(tmp.inf.upgs.shown(id)); + elem.setHTML(tmp.inf.upgs.desc(id)); +// if(tmp.inf.upgs.effects[id]) { + //effectElem.setTxt(INF_UPGS.effects[id]()); +// } + //elem.setAttr("aria-pressed", state == "pressed"); + elem.setClasses({ btn: true, inf: state == "unbought", locked: state == "locked", diff --git a/js/main/inf.js b/js/main/inf.js index 80812f26..8666a7e6 100644 --- a/js/main/inf.js +++ b/js/main/inf.js @@ -123,30 +123,23 @@ function updateTempInfUpgs() { }; if (!tmp.inf.upgs.desc) tmp.inf.upgs.desc = function (sel) { if (sel === undefined) return ""; - return ( - ((sel=="10;1"&&hasMltMilestone(16))?"Superscaled Pathogen Upgrade scaling is weaker based on your Ascension Power, and Distance produces your last Derivative at a reduced rate (unaffected by Time Speed)":INF_UPGS.descs[sel]) + - "
" + - (!tmp.inf.upgs.has(sel) - ? "Cost: " + - showNum(ExpantaNum.mul(INF_UPGS.costs[sel], tmp.inf.upgCostMult(sel))) + - " knowledge
" + - (INF_UPGS.reqs[sel] - ? "Req: inf" + - INF_UPGS.reqs[sel].reduce( - (x, y, i) => x + (i == INF_UPGS.reqs[sel].length ? "" : ", ") + "inf" + y - ) + - "
" - : "") + - (INF_UPGS.repeals[sel] - ? "Repeals: inf" + - INF_UPGS.repeals[sel].reduce( - (x, y, i) => x + (i == INF_UPGS.repeals[sel].length ? "" : ", ") + "inf" + y - ) + - "
" - : "") - : "") + - (INF_UPGS.effects[sel] ? "Currently: " + tmp.inf.upgs.current(sel) : "") - ); + const description = sel=="10;1"&&hasMltMilestone(16)?"Superscaled Pathogen Upgrade scaling is weaker based on your Ascension Power, and Distance produces your last Derivative at a reduced rate (unaffected by Time Speed)":INF_UPGS.descs[sel]; + const isRepealed = tmp.inf.upgs.repealed(sel) ? "(repealed)" : ""; + const cost = !tmp.inf.upgs.has(sel) ? `Cost: ${showNum(ExpantaNum.mul(INF_UPGS.costs[sel], tmp.inf.upgCostMult(sel)))} knowledge ${isRepealed}
` : ""; + + const reqsArray = INF_UPGS.reqs[sel]; + const repealsArray = INF_UPGS.repeals[sel]; + + const reqs = reqsArray ? `Reqs: inf ${reqsArray.reduce((x, y, i) => x + (i == reqsArray.length ? "" : ", ") + "inf" + y)}
` : ""; + const repeals = repealsArray ? `Repeals: inf ${repealsArray.reduce((x, y, i) => x + (i == repealsArray.length ? "" : ", ") + "inf" + y)}
` : ""; + const effect = INF_UPGS.effects[sel] ? `Currently: ${tmp.inf.upgs.current(sel)}` : ""; + + return `${description}
+ ${cost} + ${reqs} + ${repeals} + ${effect} + `; }; if (!tmp.inf.upgs.buy) tmp.inf.upgs.buy = function (id) { if (!tmp.inf.upgs.canBuy(id)) return; diff --git a/js/update.js b/js/update.js index 0a45872d..70362875 100644 --- a/js/update.js +++ b/js/update.js @@ -122,26 +122,27 @@ function setupHTML() { // Infinity Upgrade Table let infTable = new Element("infUpgs"); - table = ""; for (let r = 1; r <= INF_UPGS.rows; r++) { - table += ""; + let row = document.createElement("tr"); + infTable.el.append(row); for (let c = 1; c <= INF_UPGS.cols; c++) { let id = r + ";" + c; - table += - ""; + let cell = document.createElement("td"); + row.append(cell); + let elem = document.createElement("button"); + cell.append(elem); + elem.id = `inf-${id}`; + cell.id = `inf-cell-${id}`; + elem.class='btn locked' + // elem.onmouseover = () => tmp.inf.upgs.hover(id); + elem.onclick = (event) => srInfUpgBuy(event, id); +/* + elem.innerHTML = `${INF_UPGS.descs[id]} + Currently: + Costs: ${INF_UPGS.costs[id]} knowledge`; +*/ } - table += ""; } - infTable.setHTML(table); - // Automators let au = new Element("automator"); autos = "
"; diff --git a/main.html b/main.html index 28803c2e..a3cc7066 100644 --- a/main.html +++ b/main.html @@ -1034,7 +1034,7 @@



-


+




From 1859d4d529e07c5ede96936b91db51ae9f5e09ac Mon Sep 17 00:00:00 2001 From: Keith Date: Mon, 10 Nov 2025 09:07:04 -0600 Subject: [PATCH 07/14] Accessibility: try adding a progress bar --- js/main/elements.js | 6 +++++- main.html | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/main/elements.js b/js/main/elements.js index d315d4cf..2caf3cc2 100644 --- a/js/main/elements.js +++ b/js/main/elements.js @@ -1655,7 +1655,11 @@ function updateHTML() { updateMiscHTML() // Features - tmp.el.nextFeature.setTxt(tmp.nf === "none" ? "All Features Unlocked!" : tmp.features[tmp.nf].desc); + let bar = tmp.el.nextFeature; + bar.setAttr("aria-label", tmp.nf === "none" ? "All Features Unlocked!" : tmp.features[tmp.nf].desc); + let oldProgress = bar.el.value; + let newProgress = tmp.nf == "none" ? 100 : (tmp.features[tmp.nf].progress() * 100).toFixed(); + if(newProgress !== oldProgress) bar.el.value = newProgress; } function updateHTMLPerSec() { diff --git a/main.html b/main.html index a3cc7066..1b53da8e 100644 --- a/main.html +++ b/main.html @@ -88,7 +88,7 @@