From 44345629b2c8d659c3867522a65d986a8da9147b Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 20:10:24 +0900 Subject: [PATCH 01/37] Added blackhole icons --- icons/light/black-hole-bolas.png | Bin 0 -> 12052 bytes icons/light/entangled-typhoon.png | Bin 0 -> 17808 bytes icons/light/spiral-tentacle.png | Bin 0 -> 14007 bytes icons/light/star-swirl.png | Bin 0 -> 10464 bytes icons/light/vortex.png | Bin 0 -> 13390 bytes theory.js | 141 +++++++++++++++++++++++++++--- 6 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 icons/light/black-hole-bolas.png create mode 100644 icons/light/entangled-typhoon.png create mode 100644 icons/light/spiral-tentacle.png create mode 100644 icons/light/star-swirl.png create mode 100644 icons/light/vortex.png diff --git a/icons/light/black-hole-bolas.png b/icons/light/black-hole-bolas.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5d34c84d21190742d4d7c3d80c533acb3a6343 GIT binary patch literal 12052 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 literal 0 HcmV?d00001 diff --git a/icons/light/entangled-typhoon.png b/icons/light/entangled-typhoon.png new file mode 100644 index 0000000000000000000000000000000000000000..40cc5704455dfe07a31b434a1e8746ab232784d1 GIT binary patch literal 17808 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 literal 0 HcmV?d00001 diff --git a/icons/light/star-swirl.png b/icons/light/star-swirl.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7c888b286bf0e4d2bfcbd975fcf6c659a3803c GIT binary patch literal 10464 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 MK~uh3);#pT01DP**Z=?k literal 0 HcmV?d00001 diff --git a/icons/light/vortex.png b/icons/light/vortex.png new file mode 100644 index 0000000000000000000000000000000000000000..851ac257fda6256259f342c213d19e6f23c671c7 GIT binary patch literal 13390 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 b?62#0pIAj&bjjVH0C?)k+Ddg$>!|++WZ7__ literal 0 HcmV?d00001 diff --git a/theory.js b/theory.js index 4a3d333..4cf1075 100644 --- a/theory.js +++ b/theory.js @@ -5,6 +5,7 @@ import { QuaternaryEntry, theory } from '../api/Theory'; import { Utils } from '../api/Utils'; import { Vector3 } from '../api/Vector3'; import { ui } from '../api/ui/UI'; +import { LayoutOptions } from '../api/ui/properties/LayoutOptions'; var id = 'riemann_zeta_f'; var getName = (language) => @@ -87,22 +88,28 @@ var authors = 'propfeds, Eylanding\nMartin_mc, original idea\n\n' + 'for teaching the ancient Sim language\nSneaky, Gen & Gaunter, for maths ' + 'consultation & other suggestions\n\nTranslations:\nOmega_3301 - 简体中文、' + '繁體中文\nJooo#0529 & Warzen User - Español\npropfeds - Tiếng Việt'; -var version = 0.42; +var version = 0.5; -const versionName = 'v0.4.2'; +const versionName = 'v0.5 (WIP)'; let terms = 0; let pubTime = 0; + let t = 0; let t_dot = 0; let zResult = [-1.4603545088095868, 0, 1.4603545088095868]; let zTerm = BigNumber.from(zResult[2]); let dTerm = BigNumber.ZERO; + let lastZero = 0; let searchingRewind = false; let foundZero = false; let bhzTerm = null; let bhdTerm = null; + +let clipping_t = false; +let tClipThreshold = 0; + let quaternaryEntries = [ new QuaternaryEntry(null, ''), @@ -197,6 +204,7 @@ const locStrings = condition: '\\text{{if }}{{{0}}}', blackhole: 'Unleash a black hole', blackholeInfo: 'Pulls {0} backwards to the nearest zero of {1}', + blackholeMenu: 'Blackhole Settings', rotationLock: [ 'Unlock graph', @@ -648,7 +656,7 @@ let C = (n, z) => let logLookup = []; let sqrtLookup = []; -for(let i = 1; i <= 50000; ++i) +for(let i = 1; i <= 25000; ++i) { logLookup[i] = Math.log(i); sqrtLookup[i] = Math.sqrt(i); @@ -725,6 +733,90 @@ let getCoordString = (x) => x.toFixed(x >= -0.01 ? (x < -9.99 ? (x < -99.9 ? 0 : 1) : 2) ); +let getImageSize = (width) => +{ + if(width >= 1080) + return 48; + if(width >= 720) + return 36; + if(width >= 360) + return 24; + + return 20; +} + +// let createImageBtn = (params: {[x: string]: any}, callback: () => void, +// isAvailable: () => boolean, image: ImageSource): Frame +let createImageBtn = (params, callback, isAvailable, image) => +{ + let triggerable = true; + let borderColor = () => isAvailable() ? Color.BORDER : Color.TRANSPARENT; + let frame = ui.createFrame + ({ + cornerRadius: 1, + margin: new Thickness(2), + padding: new Thickness(1), + hasShadow: isAvailable, + heightRequest: getImageSize(ui.screenWidth), + widthRequest: getImageSize(ui.screenWidth), + content: ui.createImage + ({ + source: image, + aspect: Aspect.ASPECT_FIT, + useTint: true + }), + borderColor, + ...params + }); + frame.onTouched = (e) => + { + if(e.type == TouchType.PRESSED) + { + frame.borderColor = Color.TRANSPARENT; + // frame.hasShadow = false; + } + else if(e.type.isReleased()) + { + frame.borderColor = borderColor; + // frame.hasShadow = true; + if(triggerable && isAvailable()) + { + Sound.playClick(); + callback(); + } + else + triggerable = true; + } + else if(e.type == TouchType.MOVED && (e.x < 0 || e.y < 0 || + e.x > frame.width || e.y > frame.height)) + { + frame.borderColor = borderColor; + // frame.hasShadow = true; + triggerable = false; + } + }; + return frame; +} + +const bhImage = game.settings.theme == Theme.LIGHT ? +ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/lemmas-garden/perch/src/icons/dark/white-book.png') : +ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/lemmas-garden/perch/src/icons/light/white-book.png'); +// const mainMenuLabel = ui.createLatexLabel +// ({ +// row: 0, column: 1, +// verticalTextAlignment: TextAlignment.START, +// margin: new Thickness(0, 9), +// text: getLoc('blackholeSettingsLabel'), +// fontSize: 10, +// textColor: Color.TEXT_MEDIUM +// }); +const blackholeMenuFrame = createImageBtn +({ + row: 0, column: 0, + horizontalOptions: LayoutOptions.START +}, +() => {/*createBlackholeMenu().show()*/}, () => blackholeMs?.isAvailable ?? false, bhImage); + var c1, c2, b, w1, w2, w3; var c1ExpMs, derivMs, w2Ms, blackholeMs; var w3Perma, rotationLock, overlayToggle; @@ -1014,6 +1106,12 @@ var tick = (elapsedTime, multiplier) => t_dot = resolution; t += t_dot * elapsedTime; } + // when offline: lastZero is small (maybe even zero), if lastZero is smaller than t but t is greater than threshold then rewind + if(clipping_t && !blackholeMs.level && lastZero <= t && t >= tClipThreshold) + { + t = tClipThreshold; + blackholeMs.buy(1); + } let tTerm = BigNumber.from(t); let bonus = BigNumber.from(elapsedTime * multiplier) * @@ -1100,6 +1198,27 @@ var getEquationOverlay = () => fontSize: 9, textColor: Color.TEXT_MEDIUM }), + ui.createGrid + ({ + row: 0, column: 0, + margin: new Thickness(4), + horizontalOptions: LayoutOptions.END, + verticalOptions: LayoutOptions.END, + // rowDefinitions: + // [ + // 'auto', 'auto' + // ], + // columnDefinitions: + // [ + // 'auto', 'auto' + // ], + inputTransparent: true, + cascadeInputTransparent: false, + children: + [ + blackholeMenuFrame + ] + }), ] }); return result; @@ -1189,9 +1308,11 @@ var postPublish = () => var getInternalState = () => JSON.stringify ({ - version: version, - t: t, - pubTime: pubTime + version, + t, + pubTime, + clipping_t, + tClipThreshold }) var setInternalState = (stateStr) => @@ -1200,10 +1321,10 @@ var setInternalState = (stateStr) => return; let state = JSON.parse(stateStr); - if('t' in state) - t = state.t; - if('pubTime' in state) - pubTime = state.pubTime; + t = state.t ?? t; + pubTime = state.pubTime ?? pubTime; + clipping_t = state.clipping_t ?? clipping_t; + tClipThreshold = state.tClipThreshold ?? tClipThreshold; theory.invalidatePrimaryEquation(); theory.invalidateTertiaryEquation(); From ec4ecebc628c8cc296207f7b2ee797e28981c8a8 Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 20:16:24 +0900 Subject: [PATCH 02/37] Added new black hole icon --- icons/light/concentration-orb.png | Bin 0 -> 10056 bytes theory.js | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 icons/light/concentration-orb.png diff --git a/icons/light/concentration-orb.png b/icons/light/concentration-orb.png new file mode 100644 index 0000000000000000000000000000000000000000..72e0a7595af4562967f52fef3ca82b4b5eb8bccc GIT binary patch literal 10056 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�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 } const bhImage = game.settings.theme == Theme.LIGHT ? -ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/lemmas-garden/perch/src/icons/dark/white-book.png') : -ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/lemmas-garden/perch/src/icons/light/white-book.png'); +ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/dark/concentration-orb.png') : +ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/light/concentration-orb.png'); // const mainMenuLabel = ui.createLatexLabel // ({ // row: 0, column: 1, From 4bbc7b347b05d6da0c25ed6bf3be3ff634b44913 Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 20:19:35 +0900 Subject: [PATCH 03/37] Added black black hole image --- icons/dark/black-hole-bolas.png | Bin 0 -> 14459 bytes theory.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 icons/dark/black-hole-bolas.png diff --git a/icons/dark/black-hole-bolas.png b/icons/dark/black-hole-bolas.png new file mode 100644 index 0000000000000000000000000000000000000000..752ed6cd0fde12a20e4f46729e19cf680788d982 GIT binary patch literal 14459 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 } const bhImage = game.settings.theme == Theme.LIGHT ? -ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/dark/concentration-orb.png') : -ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/light/concentration-orb.png'); +ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/dark/black-hole-bolas.png') : +ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/light/black-hole-bolas.png'); // const mainMenuLabel = ui.createLatexLabel // ({ // row: 0, column: 1, From 2be0c252f0d2a89c8a49e652725c12cf0652c6ee Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 21:08:18 +0900 Subject: [PATCH 04/37] Implemented black hole settings --- theory.js | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 141 insertions(+), 8 deletions(-) diff --git a/theory.js b/theory.js index dfc2bfc..3fe860f 100644 --- a/theory.js +++ b/theory.js @@ -6,6 +6,7 @@ import { Utils } from '../api/Utils'; import { Vector3 } from '../api/Vector3'; import { ui } from '../api/ui/UI'; import { LayoutOptions } from '../api/ui/properties/LayoutOptions'; +import { TextAlignment } from '../api/ui/properties/TextAlignment'; var id = 'riemann_zeta_f'; var getName = (language) => @@ -204,7 +205,9 @@ const locStrings = condition: '\\text{{if }}{{{0}}}', blackhole: 'Unleash a black hole', blackholeInfo: 'Pulls {0} backwards to the nearest zero of {1}', - blackholeMenu: 'Blackhole Settings', + menuBlackhole: 'Black Hole Settings', + blackholeThreshold: 'Unleash black hole at: ', + blackholeCopyt: 'Take current t', rotationLock: [ 'Unlock graph', @@ -798,6 +801,37 @@ let createImageBtn = (params, callback, isAvailable, image) => return frame; } +// params: {[x: string]: any}, callback: () => void, +// isToggled: boolean | (() => boolean) +let createHesitantSwitch = (params, callback, isToggled) => +{ + let triggerable = true; + let element = ui.createSwitch + ({ + horizontalOptions: LayoutOptions.CENTER, + onColor: Color.BORDER, + isToggled, + onTouched: (e) => + { + if(e.type.isReleased()) + { + if(triggerable) + { + Sound.playClick(); + callback(); + } + else + triggerable = true; + } + else if(e.type == TouchType.MOVED && (e.x < 0 || e.y < 0 || + e.x > element.width || e.y > element.height)) + triggerable = false; + }, + ...params + }); + return element; +} + const bhImage = game.settings.theme == Theme.LIGHT ? ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/dark/black-hole-bolas.png') : ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/black-hole-automation/icons/light/black-hole-bolas.png'); @@ -815,7 +849,7 @@ const blackholeMenuFrame = createImageBtn row: 0, column: 0, horizontalOptions: LayoutOptions.START }, -() => {/*createBlackholeMenu().show()*/}, () => blackholeMs?.isAvailable ?? false, bhImage); +() => {createBlackholeMenu().show()}, () => blackholeMs?.isAvailable ?? false, bhImage); var c1, c2, b, w1, w2, w3; var c1ExpMs, derivMs, w2Ms, blackholeMs; @@ -1106,12 +1140,6 @@ var tick = (elapsedTime, multiplier) => t_dot = resolution; t += t_dot * elapsedTime; } - // when offline: lastZero is small (maybe even zero), if lastZero is smaller than t but t is greater than threshold then rewind - if(clipping_t && !blackholeMs.level && lastZero <= t && t >= tClipThreshold) - { - t = tClipThreshold; - blackholeMs.buy(1); - } let tTerm = BigNumber.from(t); let bonus = BigNumber.from(elapsedTime * multiplier) * @@ -1128,7 +1156,15 @@ var tick = (elapsedTime, multiplier) => let prevZ = zResult[2]; zResult = zeta(t); if(zResult[2] * prevZ <= 0 && !game.isCalculatingOfflineProgress) + { lastZero = t; + // when offline: lastZero is small (maybe even zero), if lastZero is smaller than t but t is greater than threshold then rewind + if(clipping_t && t >= lastZero && t >= tClipThreshold) + { + t = tClipThreshold; + blackholeMs.buy(1); + } + } if(derivMs.level) { let tmpZ = zeta(t + 1 / derivRes); @@ -1224,6 +1260,103 @@ var getEquationOverlay = () => return result; } + +let createBlackholeMenu = () => +{ + let clippingSwitch = createHesitantSwitch + ({ + row: 0, column: 1, + horizontalOptions: LayoutOptions.END + }, () => + { + clipping_t = !clipping_t; + clippingSwitch.isToggled = clipping_t; + // paramSwitch.isToggled = !paramSwitch.isToggled; + // clipping_t = paramSwitch.isToggled; + if(!clipping_t) + blackholeMs.refund(1); + }, clipping_t); + + let actuallyEditing = false; + + let thresholdEntry = ui.createEntry + ({ + row: 0, column: 1, + text: tClipThreshold.toString(), + fontSize: 14, + keyboard: Keyboard.NUMERIC, + horizontalTextAlignment: TextAlignment.END, + onTextChanged: (ot, nt) => + { + if(!actuallyEditing) + return; + let tmpML = parseFloat(nt) ?? tClipThreshold; + if(isNaN(tmpML)) + tmpML = tClipThreshold; + tClipThreshold = tmpML; + } + }); + let copytBtn = ui.createButton + ({ + row: 0, column: 2, + text: getLoc('blackholeCopyt'), + onClicked: () => + { + Sound.playClick(); + actuallyEditing = false; + tClipThreshold = t; + thresholdEntry.text = tClipThreshold.toString(); + actuallyEditing = true; + } + }) + + actuallyEditing = true; + + let menu = ui.createPopup + ({ + isPeekable: true, + title: getLoc('menuBlackhole'), + content: ui.createStackLayout + ({ + children: + [ + ui.createGrid + ({ + heightRequest: getImageSize(ui.screenWidth), + columnDefinitions: ['1*', 'auto'], + children: + [ + ui.createLatexLabel + ({ + row: 0, column: 0, + text: getLoc('blackholeThreshold'), + verticalTextAlignment: TextAlignment.CENTER + }), + clippingSwitch + ] + }), + ui.createGrid + ({ + columnDefinitions: ['auto', '1*', '1*'], + children: + [ + ui.createLatexLabel + ({ + text: '\$t>=\$', + row: 0, column: 0, + horizontalTextAlignment: TextAlignment.START, + verticalTextAlignment: TextAlignment.CENTER + }), + thresholdEntry, + copytBtn + ] + }), + ] + }) + }); + return menu; +} + var getPrimaryEquation = () => { let rhoPart = `\\dot{\\rho}=\\frac{t{\\mkern 1mu}c_1 From 3b8df18e84df0df2744f8ab1b3f8425b902682d8 Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 22:04:14 +0900 Subject: [PATCH 05/37] Fixed black hole automation not triggering while offline --- theory.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/theory.js b/theory.js index 3fe860f..3036a15 100644 --- a/theory.js +++ b/theory.js @@ -1156,14 +1156,12 @@ var tick = (elapsedTime, multiplier) => let prevZ = zResult[2]; zResult = zeta(t); if(zResult[2] * prevZ <= 0 && !game.isCalculatingOfflineProgress) - { lastZero = t; - // when offline: lastZero is small (maybe even zero), if lastZero is smaller than t but t is greater than threshold then rewind - if(clipping_t && t >= lastZero && t >= tClipThreshold) - { - t = tClipThreshold; - blackholeMs.buy(1); - } + // when offline: lastZero is small (maybe even zero), if lastZero is smaller than t but t is greater than threshold then rewind + if(clipping_t && t >= lastZero && t >= tClipThreshold) + { + t = tClipThreshold; + blackholeMs.buy(1); } if(derivMs.level) { From 3706ad102bd09f9a32fc2caf838e62966a298c22 Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 22:10:18 +0900 Subject: [PATCH 06/37] Fixed t pulling back waaay far after changing threshold --- theory.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/theory.js b/theory.js index 3036a15..e75aff0 100644 --- a/theory.js +++ b/theory.js @@ -1155,14 +1155,12 @@ var tick = (elapsedTime, multiplier) => { let prevZ = zResult[2]; zResult = zeta(t); - if(zResult[2] * prevZ <= 0 && !game.isCalculatingOfflineProgress) + if(zResult[2] * prevZ <= 0) lastZero = t; // when offline: lastZero is small (maybe even zero), if lastZero is smaller than t but t is greater than threshold then rewind if(clipping_t && t >= lastZero && t >= tClipThreshold) - { - t = tClipThreshold; blackholeMs.buy(1); - } + if(derivMs.level) { let tmpZ = zeta(t + 1 / derivRes); @@ -1442,6 +1440,7 @@ var getInternalState = () => JSON.stringify version, t, pubTime, + lastZero, clipping_t, tClipThreshold }) @@ -1454,6 +1453,7 @@ var setInternalState = (stateStr) => let state = JSON.parse(stateStr); t = state.t ?? t; pubTime = state.pubTime ?? pubTime; + lastZero = state.lastZero ?? lastZero; clipping_t = state.clipping_t ?? clipping_t; tClipThreshold = state.tClipThreshold ?? tClipThreshold; From f2e5320beafc947dcc110245c14a700502744d83 Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 23 Jul 2024 22:30:01 +0900 Subject: [PATCH 07/37] Added vi translations --- theory.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/theory.js b/theory.js index e75aff0..10db530 100644 --- a/theory.js +++ b/theory.js @@ -84,11 +84,17 @@ Trong lí thuyết này, chúng ta sẽ khám phá hàm zeta trên đường th return descs[language] || descs.en; } -var authors = 'propfeds, Eylanding\nMartin_mc, original idea\n\n' + -'Thanks to:\nGlen Pugh, for the Riemann-Siegel formula implementation\nXLII, ' + -'for teaching the ancient Sim language\nSneaky, Gen & Gaunter, for maths ' + -'consultation & other suggestions\n\nTranslations:\nOmega_3301 - 简体中文、' + -'繁體中文\nJooo#0529 & Warzen User - Español\npropfeds - Tiếng Việt'; +var authors = 'propfeds, Eylanding\n' + +'Martin_mc, original idea\n\n' + +'Thanks to:\n' + +'Glen Pugh, for the Riemann-Siegel formula implementation\n' + +'XLII, for teaching the ancient Sim language\n' + +'Sneaky, Gen & Gaunter, for maths consultation & other suggestions\n' + +'game-icons.net\n\n' + +'Translations:\n' + +'Omega_3301 - 简体中文、繁體中文\n' + +'Jooo#0529 & Warzen User - Español\n' + +'propfeds - Tiếng Việt'; var version = 0.5; const versionName = 'v0.5 wip'; @@ -295,6 +301,9 @@ const locStrings = condition: '\\text{{khi }}{{{0}}}', blackhole: 'Giải phóng hố đen', blackholeInfo: 'Kéo {0} ngược lại tới không điểm gần nhất của {1}', + menuBlackhole: 'Cài đặt hố đen', + blackholeThreshold: 'Giải phóng hố đen tại: ', + blackholeCopyt: 'Lấy t hiện tại', rotationLock: [ 'Mở khoá đồ thị', From 8c296f1cf1270de1ced87cf513b4369314d74e23 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 24 Jul 2024 09:26:02 +0900 Subject: [PATCH 08/37] Publishing now refunds black hole --- theory.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/theory.js b/theory.js index 10db530..d163e07 100644 --- a/theory.js +++ b/theory.js @@ -1437,6 +1437,8 @@ var postPublish = () => bhzTerm = null; bhdTerm = null; + blackholeMs.refund(1); + theory.invalidatePrimaryEquation(); theory.invalidateSecondaryEquation(); theory.invalidateTertiaryEquation(); From 36bca364cf7ae979ddbff18a738930188009e262 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 24 Jul 2024 13:10:11 +0900 Subject: [PATCH 09/37] Black hole button is no longer visible before unlock --- theory.js | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/theory.js b/theory.js index d163e07..90287eb 100644 --- a/theory.js +++ b/theory.js @@ -5,6 +5,7 @@ import { QuaternaryEntry, theory } from '../api/Theory'; import { Utils } from '../api/Utils'; import { Vector3 } from '../api/Vector3'; import { ui } from '../api/ui/UI'; +import { Color } from '../api/ui/properties/Color'; import { LayoutOptions } from '../api/ui/properties/LayoutOptions'; import { TextAlignment } from '../api/ui/properties/TextAlignment'; @@ -810,6 +811,57 @@ let createImageBtn = (params, callback, isAvailable, image) => return frame; } +let createActiveImageBtn = (params, callback, image) => +{ + let triggerable = true; + let borderColor = Color.BORDER; + let frame = ui.createFrame + ({ + cornerRadius: 1, + margin: new Thickness(2), + padding: new Thickness(1), + hasShadow: true, + heightRequest: getImageSize(ui.screenWidth), + widthRequest: getImageSize(ui.screenWidth), + content: ui.createImage + ({ + source: image, + aspect: Aspect.ASPECT_FIT, + useTint: true + }), + borderColor, + ...params + }); + frame.onTouched = (e) => + { + if(e.type == TouchType.PRESSED) + { + frame.borderColor = Color.TRANSPARENT; + // frame.hasShadow = false; + } + else if(e.type.isReleased()) + { + frame.borderColor = borderColor; + // frame.hasShadow = true; + if(triggerable) + { + Sound.playClick(); + callback(); + } + else + triggerable = true; + } + else if(e.type == TouchType.MOVED && (e.x < 0 || e.y < 0 || + e.x > frame.width || e.y > frame.height)) + { + frame.borderColor = borderColor; + // frame.hasShadow = true; + triggerable = false; + } + }; + return frame; +} + // params: {[x: string]: any}, callback: () => void, // isToggled: boolean | (() => boolean) let createHesitantSwitch = (params, callback, isToggled) => @@ -853,12 +905,13 @@ ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/bla // fontSize: 10, // textColor: Color.TEXT_MEDIUM // }); -const blackholeMenuFrame = createImageBtn +const blackholeMenuFrame = createActiveImageBtn ({ row: 0, column: 0, + isVisible: false, horizontalOptions: LayoutOptions.START }, -() => {createBlackholeMenu().show()}, () => blackholeMs?.isAvailable ?? false, bhImage); +() => {createBlackholeMenu().show()}, bhImage); var c1, c2, b, w1, w2, w3; var c1ExpMs, derivMs, w2Ms, blackholeMs; @@ -1134,6 +1187,7 @@ var updateAvailability = () => w2.isAvailable = w2Ms.level > 0; w3.isAvailable = w3Perma.level > 0; blackholeMs.isAvailable = c1ExpMs.level == c1ExpMaxLevel && w2Ms.level > 0; + blackholeMenuFrame.isVisible = blackholeMs.isAvailable; } var isCurrencyVisible = (index) => (index && derivMs.level > 0) || !index; From 904a659b4715b4cb6406f327a5296abd08a87c94 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 24 Jul 2024 13:19:27 +0900 Subject: [PATCH 10/37] Adjusted primary eq heights --- theory.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/theory.js b/theory.js index 90287eb..6411036 100644 --- a/theory.js +++ b/theory.js @@ -1424,14 +1424,14 @@ var getPrimaryEquation = () => if(!derivMs.level) { theory.primaryEquationScale = 0.96; - theory.primaryEquationHeight = 63; + theory.primaryEquationHeight = 60; return rhoPart; } let omegaPart = `\\,\\dot{\\delta}=w_1 ${w2Ms.level ? 'w_2' : ''}${w3Perma.level ? 'w_3' : ''}\\times |\\zeta '(\\textstyle\\frac{1}{2}+it)|^b`; theory.primaryEquationScale = 0.92; - theory.primaryEquationHeight = 75; + theory.primaryEquationHeight = 72; return `\\begin{array}{c}${rhoPart}\\\\${omegaPart}\\end{array}`; } From b134baee6b21acf17bbd6bee3242c7a8f601f678 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 24 Jul 2024 13:29:54 +0900 Subject: [PATCH 11/37] Fixed t number formatting breaking between 100 and 999 --- theory.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/theory.js b/theory.js index 6411036..2a60902 100644 --- a/theory.js +++ b/theory.js @@ -1460,7 +1460,8 @@ let getCommaNumString = (str) => var getQuaternaryEntries = () => { quaternaryEntries[1].value = t_dot.toFixed(2); - quaternaryEntries[2].value = getCommaNumString(t.toFixed(2)); + quaternaryEntries[2].value = t >= 1000 ? getCommaNumString(t.toFixed(2)) : + t.toFixed(2); if(derivMs.level) quaternaryEntries[3].value = (bhdTerm ?? dTerm).toString(3); else From 4b35b6eea7bbf94dd0a546233d4a2bf67619db13 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 24 Jul 2024 23:27:54 +0900 Subject: [PATCH 12/37] Added Chinese translations --- theory.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/theory.js b/theory.js index 2a60902..97e22ee 100644 --- a/theory.js +++ b/theory.js @@ -238,6 +238,9 @@ const locStrings = terms: '黎曼-西格尔项:{0}', blackhole: '释放一个黑洞', blackholeInfo: '将 {0} 拉至于离 {1} 最接近的零', + menuBlackhole: '黑洞设置', + blackholeThreshold: '黑洞释放的条件:', + blackholeCopyt: '利用现时的t值', rotationLock: [ '解锁图形', @@ -258,6 +261,9 @@ const locStrings = terms: '黎曼-西格爾項:{0}', blackhole: '釋放一個黑洞', blackholeInfo: '將 {0} 拉至於離 {1} 最接近的零', + menuBlackhole: '黑洞設置', + blackholeThreshold: '黑洞釋放的條件:', + blackholeCopyt: '利用現時的t值', rotationLock: [ '解鎖圖形', @@ -1401,7 +1407,7 @@ let createBlackholeMenu = () => [ ui.createLatexLabel ({ - text: '\$t>=\$', + text: '\$t\\ge\$', row: 0, column: 0, horizontalTextAlignment: TextAlignment.START, verticalTextAlignment: TextAlignment.CENTER From 2e3efe4c6e8665438a9dfaa7b022ea10f052060d Mon Sep 17 00:00:00 2001 From: Minh Date: Fri, 26 Jul 2024 10:18:54 +0900 Subject: [PATCH 13/37] Lookup tables now fill up automatically --- theory.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/theory.js b/theory.js index 97e22ee..f1be99d 100644 --- a/theory.js +++ b/theory.js @@ -100,7 +100,6 @@ var version = 0.5; const versionName = 'v0.5 wip'; -let terms = 0; let pubTime = 0; let t = 0; @@ -674,12 +673,7 @@ let C = (n, z) => let logLookup = []; let sqrtLookup = []; - -for(let i = 1; i <= 25000; ++i) -{ - logLookup[i] = Math.log(i); - sqrtLookup[i] = Math.sqrt(i); -} +let terms = 0; /** * Returns the Riemann zeta function evaluated at 0.5+it, with n layers of @@ -697,6 +691,12 @@ let riemannSiegelZeta = (t, n) => let N = Math.floor(fullN); let p = fullN - N; let th = theta(t); + + for(let j = terms + 1; j <= N; ++j) + { + logLookup[j] = Math.log(j); + sqrtLookup[j] = Math.sqrt(j); + } terms = N; for(let j = 1; j <= N; ++j) From ccdca76702030b774bed52b4619e763b411ccbb8 Mon Sep 17 00:00:00 2001 From: Minh Date: Fri, 26 Jul 2024 20:18:18 +0900 Subject: [PATCH 14/37] Removed redundant brackets --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index f1be99d..97494a3 100644 --- a/theory.js +++ b/theory.js @@ -917,7 +917,7 @@ const blackholeMenuFrame = createActiveImageBtn isVisible: false, horizontalOptions: LayoutOptions.START }, -() => {createBlackholeMenu().show()}, bhImage); +() => createBlackholeMenu().show(), bhImage); var c1, c2, b, w1, w2, w3; var c1ExpMs, derivMs, w2Ms, blackholeMs; From bf8cd53db00aef66c2dd03091bcd6d141f6995b4 Mon Sep 17 00:00:00 2001 From: Minh Date: Sun, 28 Jul 2024 12:55:37 +0900 Subject: [PATCH 15/37] Added Spanish translation --- theory.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/theory.js b/theory.js index 97494a3..a50d3b3 100644 --- a/theory.js +++ b/theory.js @@ -283,6 +283,9 @@ const locStrings = terms: 'Términos de Riemann-Siegel: {0}', blackhole: 'Desata un agujero negro', blackholeInfo: 'Jala {0} hacia atrás hasta el cero más cercano de {1}', + menuBlackhole: 'Configuraciónes del Agujero Negro', + blackholeThreshold: 'Desata el Agujero Negro en: ', + blackholeCopyt: 'Usar t actual', rotationLock: [ 'Desbloquear gráfica', From 916e1f3aa4c25489068bef3604d8c6f703dfcfd1 Mon Sep 17 00:00:00 2001 From: Minh Date: Sun, 28 Jul 2024 13:26:37 +0900 Subject: [PATCH 16/37] BH menu button no longer uses ActiveImageBtn --- theory.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/theory.js b/theory.js index a50d3b3..ff5317b 100644 --- a/theory.js +++ b/theory.js @@ -914,13 +914,12 @@ ImageSource.fromUri('https://raw.githubusercontent.com/propfeds/riemann-zeta/bla // fontSize: 10, // textColor: Color.TEXT_MEDIUM // }); -const blackholeMenuFrame = createActiveImageBtn +const blackholeMenuFrame = createImageBtn ({ row: 0, column: 0, - isVisible: false, horizontalOptions: LayoutOptions.START }, -() => createBlackholeMenu().show(), bhImage); +() => createBlackholeMenu().show(), () => true, bhImage); var c1, c2, b, w1, w2, w3; var c1ExpMs, derivMs, w2Ms, blackholeMs; From b2483676a178bb5c8f8391a6105cad2a59f57383 Mon Sep 17 00:00:00 2001 From: Minh Date: Sun, 28 Jul 2024 13:40:37 +0900 Subject: [PATCH 17/37] Tore off the wip plaster --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index ff5317b..86daa2b 100644 --- a/theory.js +++ b/theory.js @@ -98,7 +98,7 @@ var authors = 'propfeds, Eylanding\n' + 'propfeds - Tiếng Việt'; var version = 0.5; -const versionName = 'v0.5 wip'; +const versionName = 'v0.5'; let pubTime = 0; From 4c894159bc39380a54dbfa67f878b05db57c6713 Mon Sep 17 00:00:00 2001 From: Minh Date: Mon, 29 Jul 2024 09:43:33 +0900 Subject: [PATCH 18/37] Updated Spanish translation on old keys --- theory.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/theory.js b/theory.js index 86daa2b..870a2c9 100644 --- a/theory.js +++ b/theory.js @@ -281,7 +281,7 @@ const locStrings = wip: '(TEP)\\\\{0}', pubTime: 'Tiempo desde publicación: {0}', terms: 'Términos de Riemann-Siegel: {0}', - blackhole: 'Desata un agujero negro', + blackhole: 'Desatar el agujero negro', blackholeInfo: 'Jala {0} hacia atrás hasta el cero más cercano de {1}', menuBlackhole: 'Configuraciónes del Agujero Negro', blackholeThreshold: 'Desata el Agujero Negro en: ', @@ -291,13 +291,13 @@ const locStrings = 'Desbloquear gráfica', 'Bloquear gráfica' ], - rotationLockInfo: 'Alterna la habilidad de rotar y acercar la gráfica 3D', + rotationLockInfo: 'Alternar la abilidad de rotar y acercar la gráfica 3D', overlay: [ 'Mostrar info', 'Ocultar info', ], - overlayInfo: 'Alterna la presentación de los términos de Riemann-Siegel y tiempo desde publicación', + overlayInfo: 'Alternar la presentación de Riemann-Siegel en los términos y tiempo de publicación', }, vi: { From 05412248a30d526868b89dc9040412dfc292233a Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 30 Jul 2024 17:26:58 +0900 Subject: [PATCH 19/37] Added button to -1 t --- theory.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/theory.js b/theory.js index 870a2c9..0e29b58 100644 --- a/theory.js +++ b/theory.js @@ -227,6 +227,8 @@ const locStrings = ], overlayInfo: 'Toggles the display of Riemann-Siegel terms and ' + 'publication time', + rewind: 'Rewinds {0} by 1. This can help with landing the black hole ' + + 'at an earlier point.', warpFive: 'Get 5 penny with consequences', warpFiveInfo: 'Testing tool: {0}{1}\\ by {2}' }, @@ -1509,6 +1511,18 @@ var postPublish = () => updateAvailability(); } +var canResetStage = () => blackholeMs.isAvailable; + +var getResetStageMessage = () => Localization.format(getLoc('rewind'), '\$t\$'); + +var resetStage = () => +{ + t -= 1; + blackholeMs.refund(1); + // This points lastZero to a non-zero, but it is a necessary sacrifice. + lastZero = 0; +} + var getInternalState = () => JSON.stringify ({ version, From b9bb47f4ec515562acb7aaccc348d900d354d575 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 31 Jul 2024 00:41:02 +0900 Subject: [PATCH 20/37] Decreased zero detection threshold to e-9; Commented unused localisations --- theory.js | 52 +++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/theory.js b/theory.js index 0e29b58..fb7ceee 100644 --- a/theory.js +++ b/theory.js @@ -133,7 +133,7 @@ const scale = 4; const derivRes = 100000; const resolution = 1/4; -const getBlackholeSpeed = (z) => Math.min(z**2 + 0.004, resolution); +// const getBlackholeSpeed = (z) => Math.min(z**2 + 0.004, resolution); const c1ExpMaxLevel = 3; // The first 3 zeta zeroes lol @@ -202,13 +202,13 @@ const locStrings = { en: { - wip: '(WIP)\\\\{0}', + // wip: '(WIP)\\\\{0}', pubTime: 'Publication time: {0}', terms: 'Riemann-Siegel terms: {0}', - speed: '\\text{speed}', - zExp: '{{{0}}}\\text{{ exponent}}', - half: '\\text{half}', - condition: '\\text{{if }}{{{0}}}', + // speed: '\\text{speed}', + // zExp: '{{{0}}}\\text{{ exponent}}', + // half: '\\text{half}', + // condition: '\\text{{if }}{{{0}}}', blackhole: 'Unleash a black hole', blackholeInfo: 'Pulls {0} backwards to the nearest zero of {1}', menuBlackhole: 'Black Hole Settings', @@ -227,14 +227,14 @@ const locStrings = ], overlayInfo: 'Toggles the display of Riemann-Siegel terms and ' + 'publication time', - rewind: 'Rewinds {0} by 1. This can help with landing the black hole ' + - 'at an earlier point.', - warpFive: 'Get 5 penny with consequences', - warpFiveInfo: 'Testing tool: {0}{1}\\ by {2}' + rewind: 'Rewind t by 1.\nThis can help with landing the black hole ' + + 'at an earlier zero.', + // warpFive: 'Get 5 penny with consequences', + // warpFiveInfo: 'Testing tool: {0}{1}\\ by {2}' }, 'zh-Hans': { - wip: '(正在进行中)\n{0}', + // wip: '(正在进行中)\n{0}', pubTime: '出版时间:{0}', terms: '黎曼-西格尔项:{0}', blackhole: '释放一个黑洞', @@ -257,7 +257,7 @@ const locStrings = }, 'zh-Hant': { - wip: '(正在進行中)\n{0}', + // wip: '(正在進行中)\n{0}', pubTime: '出版時間:{0}', terms: '黎曼-西格爾項:{0}', blackhole: '釋放一個黑洞', @@ -280,7 +280,7 @@ const locStrings = }, es: { - wip: '(TEP)\\\\{0}', + // wip: '(TEP)\\\\{0}', pubTime: 'Tiempo desde publicación: {0}', terms: 'Términos de Riemann-Siegel: {0}', blackhole: 'Desatar el agujero negro', @@ -303,13 +303,13 @@ const locStrings = }, vi: { - wip: '(Đang dở)\\\\{0}', + // wip: '(Đang dở)\\\\{0}', pubTime: 'Thời gian xuất bản: {0}', terms: 'Riemann-Siegel: {0} số hạng', - speed: '\\text{tốc độ}', - zExp: '{{{0}}}\\text{{ số mũ}}', - half: '\\text{một nửa}', - condition: '\\text{{khi }}{{{0}}}', + // speed: '\\text{tốc độ}', + // zExp: '{{{0}}}\\text{{ số mũ}}', + // half: '\\text{một nửa}', + // condition: '\\text{{khi }}{{{0}}}', blackhole: 'Giải phóng hố đen', blackholeInfo: 'Kéo {0} ngược lại tới không điểm gần nhất của {1}', menuBlackhole: 'Cài đặt hố đen', @@ -327,8 +327,9 @@ const locStrings = 'Giấu thông tin', ], overlayInfo: 'Bật tắt số hạng hàm Riemann-Siegel và thời gian xuất bản', - warpFive: 'Nhận 5 đồng nhưng có hậu quả', - warpFiveInfo: 'Công cụ thử nghiệm: {0}{1}\\ với {2}' + rewind: 'Kéo ngược t lại 1 đơn vị.\nViệc này có thể giúp ngắm hố đen trúng vào các không điểm đã qua.' + // warpFive: 'Nhận 5 đồng nhưng có hậu quả', + // warpFiveInfo: 'Công cụ thử nghiệm: {0}{1}\\ với {2}' } }; @@ -1256,9 +1257,13 @@ var tick = (elapsedTime, multiplier) => { t_dot = bhdt / elapsedTime; t -= bhdt; + // log(bhdt.toExponential(2)); searchingRewind = false; - if(Math.abs(bhdt) < 1e-8) - foundZero = true; + if(Math.abs(bhdt) < 1e-9) + { + foundZero = true; + // log(`found zero, bhdt = ${bhdt.toExponential(2)}`); + } } } } @@ -1469,6 +1474,7 @@ let getCommaNumString = (str) => var getQuaternaryEntries = () => { + // let tmpValue = t_dot < 0.1 ? t_dot.toExponential(2) : t_dot.toFixed(2); quaternaryEntries[1].value = t_dot.toFixed(2); quaternaryEntries[2].value = t >= 1000 ? getCommaNumString(t.toFixed(2)) : t.toFixed(2); @@ -1513,7 +1519,7 @@ var postPublish = () => var canResetStage = () => blackholeMs.isAvailable; -var getResetStageMessage = () => Localization.format(getLoc('rewind'), '\$t\$'); +var getResetStageMessage = () => getLoc('rewind'); var resetStage = () => { From de5416922390388e9dd5969b5b65c8f8e5647fdf Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 31 Jul 2024 00:50:04 +0900 Subject: [PATCH 21/37] t_dot now hides decimals if zero is found --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index fb7ceee..7945a0d 100644 --- a/theory.js +++ b/theory.js @@ -1475,7 +1475,7 @@ let getCommaNumString = (str) => var getQuaternaryEntries = () => { // let tmpValue = t_dot < 0.1 ? t_dot.toExponential(2) : t_dot.toFixed(2); - quaternaryEntries[1].value = t_dot.toFixed(2); + quaternaryEntries[1].value = foundZero ? 0 : t_dot.toFixed(2); quaternaryEntries[2].value = t >= 1000 ? getCommaNumString(t.toFixed(2)) : t.toFixed(2); if(derivMs.level) From 59a2b62f4354fc988ca0902308744ddda5ec30b7 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 31 Jul 2024 00:51:19 +0900 Subject: [PATCH 22/37] |z| now hides decimals when zero is found --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index 7945a0d..eed74a4 100644 --- a/theory.js +++ b/theory.js @@ -1460,7 +1460,7 @@ var getSecondaryEquation = () => var getTertiaryEquation = () => { return `|\\zeta(\\textstyle\\frac{1}{2}+it)|= - ${(bhzTerm ?? zTerm).toString(3)}`; + ${foundZero ? 0 : (bhzTerm ?? zTerm).toString(3)}`; } /** From 3349f03419cfb4409c224a65ec57b5566ed3a3bf Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 31 Jul 2024 00:57:46 +0900 Subject: [PATCH 23/37] Fixed unlocked graph blocking BH menu button --- theory.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/theory.js b/theory.js index eed74a4..79bc216 100644 --- a/theory.js +++ b/theory.js @@ -1255,7 +1255,7 @@ var tick = (elapsedTime, multiplier) => } else { - t_dot = bhdt / elapsedTime; + t_dot = -bhdt / elapsedTime; t -= bhdt; // log(bhdt.toExponential(2)); searchingRewind = false; @@ -1298,6 +1298,7 @@ var getEquationOverlay = () => let result = ui.createGrid ({ inputTransparent: () => rotationLock.level ? true : false, + cascadeInputTransparent: false, children: [ ui.createLatexLabel From cef3f712a6b583d4077a6550e9d56fd5e1486abe Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 31 Jul 2024 01:34:10 +0900 Subject: [PATCH 24/37] Updated en & vi rewind descriptions --- theory.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/theory.js b/theory.js index 79bc216..e9c53f8 100644 --- a/theory.js +++ b/theory.js @@ -225,10 +225,8 @@ const locStrings = 'Display info', 'Hide info', ], - overlayInfo: 'Toggles the display of Riemann-Siegel terms and ' + - 'publication time', - rewind: 'Rewind t by 1.\nThis can help with landing the black hole ' + - 'at an earlier zero.', + overlayInfo: 'Toggles the display of Riemann-Siegel terms and publication time', + rewind: 'Rewind t by 1.\nThis can help with landing at previous zeroes when using the black hole.', // warpFive: 'Get 5 penny with consequences', // warpFiveInfo: 'Testing tool: {0}{1}\\ by {2}' }, @@ -327,7 +325,7 @@ const locStrings = 'Giấu thông tin', ], overlayInfo: 'Bật tắt số hạng hàm Riemann-Siegel và thời gian xuất bản', - rewind: 'Kéo ngược t lại 1 đơn vị.\nViệc này có thể giúp ngắm hố đen trúng vào các không điểm đã qua.' + rewind: 'Kéo ngược t lại 1 đơn vị.\nViệc này có thể giúp ngắm trúng vào các không điểm đã qua khi dùng hố đen.' // warpFive: 'Nhận 5 đồng nhưng có hậu quả', // warpFiveInfo: 'Công cụ thử nghiệm: {0}{1}\\ với {2}' } From e94ca907fe5144e41a264b09f7965be3e3d3fe6e Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 6 Aug 2024 01:51:49 +0900 Subject: [PATCH 25/37] Added rewind localisation for Spanish --- theory.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/theory.js b/theory.js index e9c53f8..7791956 100644 --- a/theory.js +++ b/theory.js @@ -283,7 +283,7 @@ const locStrings = terms: 'Términos de Riemann-Siegel: {0}', blackhole: 'Desatar el agujero negro', blackholeInfo: 'Jala {0} hacia atrás hasta el cero más cercano de {1}', - menuBlackhole: 'Configuraciónes del Agujero Negro', + menuBlackhole: 'Configuraciones del Agujero Negro', blackholeThreshold: 'Desata el Agujero Negro en: ', blackholeCopyt: 'Usar t actual', rotationLock: @@ -298,6 +298,7 @@ const locStrings = 'Ocultar info', ], overlayInfo: 'Alternar la presentación de Riemann-Siegel en los términos y tiempo de publicación', + rewind: 'Regresa t en 1.\nEsto puede ayudar a llegar a ceros previos cuando se use el agujero negro.' }, vi: { @@ -325,7 +326,7 @@ const locStrings = 'Giấu thông tin', ], overlayInfo: 'Bật tắt số hạng hàm Riemann-Siegel và thời gian xuất bản', - rewind: 'Kéo ngược t lại 1 đơn vị.\nViệc này có thể giúp ngắm trúng vào các không điểm đã qua khi dùng hố đen.' + rewind: 'Kéo ngược t lại 1 đơn vị.\nViệc này có thể giúp nhắm trúng vào các không điểm đã qua khi dùng hố đen.' // warpFive: 'Nhận 5 đồng nhưng có hậu quả', // warpFiveInfo: 'Công cụ thử nghiệm: {0}{1}\\ với {2}' } From 84f28c41eb859be5b052367816988d16dec09416 Mon Sep 17 00:00:00 2001 From: Minh Date: Thu, 8 Aug 2024 00:23:41 +0900 Subject: [PATCH 26/37] Changed en & vi descriptions --- theory.js | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/theory.js b/theory.js index 7791956..265896d 100644 --- a/theory.js +++ b/theory.js @@ -29,21 +29,12 @@ var getDescription = (language) => const descs = { en: -`The function now known as the Riemann zeta function was first defined by ` + -`Euler for integers greater than 1 as an infinite series: +`The function now known as the Riemann zeta function was first defined by Euler for integers greater than 1 as an infinite series: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -The definition was later extended to real numbers by Chebyshev, and to the ` + -`complex plane by Riemann. However, as it diverges on all s with a real ` + -`component less than 1, a special version of the function was to be defined ` + -`there in order to make the function continuous. This is known as an ` + -`analytic continuation, and it is related to this infamous meme: +The definition was later extended to real numbers by Chebyshev, and to the complex plane by Riemann. However, as it diverged on all s with a real component less than or equal to 1, a special version of the function had to be defined in order to preserve the continuity of its derivatives. This is known as an analytic continuation, and the zeta function's analytic continuation relates to this infamous meme: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -In this theory, we will be examining the zeta function on the line ` + -`perpendicular to the x-axis at x = 0.5, known as the critical line. In ` + -`1859, it was hypothesised by Riemann himself that, other than the so-called ` + -`'trivial zeroes' lying at negative even integers -2, -4, -6, ..., every ` + -`other root of the function lies on this critical line.`, +In this theory, we will be examining the zeta function on the line perpendicular to the x-axis at x = 0.5, known as the critical line. In 1859, it was hypothesised by Riemann himself that, other than the so-called 'trivial zeroes' lying at negative even integers -2, -4, -6, ..., every other root of the function lies on this critical line.`, 'zh-Hans': `黎曼ζ函数首次由欧拉定义的,将大于 1 的整数定义为无限系列。 ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... @@ -66,21 +57,12 @@ Luego, su definición fue extendida a los números reales por Chebyshev, y al pl En esta teoría, examinaremos la función de zeta en la línea perpendicular al eje X cuando x = 0.5, conocido como la ruta crítica. En 1859, fue hipotetizado por el mismo Riemann que, excluyendo a los conocidos "ceros triviales" que permanecen en los enteros negativos pares -2, -4, -6, ..., toda raíz de la función yace sobre la ruta crítica.`, vi: -`Trước khi được mang tên Riemann, hàm zeta được định nghĩa bởi Euler dưới ` + -`dạng chuỗi vô hạn trên miền các số tự nhiên lớn hơn 1: +`Trước khi được mang tên Riemann, hàm zeta được định nghĩa bởi Euler dưới dạng chuỗi vô hạn trên miền các số tự nhiên lớn hơn 1: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -Định nghĩa hàm zeta được mở rộng tới các số thực bởi Chebyshev, và sau đó ` + -`đến số phức bởi Riemann. Tuy nhiên, do chuỗi này phân kì đối với các giá ` + -`trị s với phần thực nhỏ hơn 1, một "phiên bản" khác của hàm zeta được định ` + -`nghĩa trên vùng này để hàm được liên thông trên toàn mặt phẳng số phức. Đây ` + -`được gọi là thác triển giải tích, và thác triển giải tích của hàm zeta có ` + -`mối liên hệ đến một meme nổi tiếng: +Định nghĩa hàm zeta được mở rộng tới các số thực bởi Chebyshev, và sau đó đến số phức bởi Riemann. Tuy nhiên, do chuỗi này phân kì đối với các giá trị s với phần thực nhỏ hơn hoặc bằng 1, một "phiên bản" khác của hàm zeta được định nghĩa để các đạo hàm của zeta được liên thông trên toàn mặt phẳng số phức. Đây được gọi là thác triển giải tích, và thác triển giải tích của hàm zeta có mối liên hệ đến một meme nổi tiếng: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -Trong lí thuyết này, chúng ta sẽ khám phá hàm zeta trên đường thẳng x = 0.5, ` + -`gọi là đường tới hạn. Vào năm 1859, Riemann đã giả thuyết rằng, ngoài những ` + -`"không điểm tầm thường" nằm trên các số âm chẵn -2, -4, -6, ..., tất cả các ` + -`nghiệm của hàm đều nằm trên đường tới hạn này.` +Trong lí thuyết này, chúng ta sẽ khám phá hàm zeta trên đường thẳng x = 0.5, gọi là đường tới hạn. Vào năm 1859, Riemann đã giả thuyết rằng, ngoài những "không điểm tầm thường" nằm trên các số âm chẵn -2, -4, -6, ..., tất cả các nghiệm của hàm đều nằm trên đường tới hạn này.` }; return descs[language] || descs.en; @@ -93,8 +75,8 @@ var authors = 'propfeds, Eylanding\n' + 'Sneaky, Gen & Gaunter, for maths consultation & other suggestions\n' + 'game-icons.net\n\n' + 'Translations:\n' + -'Omega_3301 - 简体中文、繁體中文\n' + -'Jooo#0529 & Warzen User - Español\n' + +'Omega_3301 & pacowoc - 简体中文、繁體中文\n' + +'Jooo & Warzen User - Español\n' + 'propfeds - Tiếng Việt'; var version = 0.5; From 90b46a27ca4cedc0f9655cefa01780ff7386aa91 Mon Sep 17 00:00:00 2001 From: Minh Date: Thu, 8 Aug 2024 00:29:04 +0900 Subject: [PATCH 27/37] Updated Chinese localisations (no descriptions) --- theory.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/theory.js b/theory.js index 265896d..f1f550f 100644 --- a/theory.js +++ b/theory.js @@ -43,12 +43,12 @@ In this theory, we will be examining the zeta function on the line perpendicular 在这个理论中,我们将探索在 x = 0.5 处垂直于 x 轴的直线(称为临界线)上的 zeta 函数。 1859 年,黎曼自己假设,除了位于负偶数 -2、-4、-6、... 处的所谓“平凡零点”之外,函数的所有其他根都位于这条临界线上。`, 'zh-Hant': -`黎曼ζ函數首次由歐拉定義的,將大於 1 的整數定義為無限系列: +`黎曼ζ函數由歐拉首次提出,其對任何大於 1 的整數定義下方的無窮級數: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -這個定義後來被切比雪夫擴展到實數,又被黎曼擴展到複數(a+bi)。然而,由於它在實數小於 1 的所有 s 上等於∞,因此要在此處改變函數的定義以使函數完全連續。這被稱為解析開拓。這也造成了一個臭名的笑話: +這個定義後來先由切比雪夫擴展到實數,再被黎曼擴展到複數(a+bi)。然而,由於它在實數部分小於等於 1 的所有 s 上皆發散至∞,因此要在這個區間改變函數的定義以使函數完全連續。這被稱為解析延拓。這也造成了一個著名的迷因: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上的 zeta 函數。 1859 年,黎曼自己假設,除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,函數的所有其他根都位於這條臨界線上。`, +在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼假設:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ函數的所有其他根都位於這條臨界線上。`, es: `La función conocida como Función Zeta de Riemann fue definida por Euler para los números enteros mayores a 1 como una serie infinita: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... @@ -217,7 +217,7 @@ const locStrings = // wip: '(正在进行中)\n{0}', pubTime: '出版时间:{0}', terms: '黎曼-西格尔项:{0}', - blackhole: '释放一个黑洞', + blackhole: '释放黑洞', blackholeInfo: '将 {0} 拉至于离 {1} 最接近的零', menuBlackhole: '黑洞设置', blackholeThreshold: '黑洞释放的条件:', @@ -234,29 +234,31 @@ const locStrings = '隐藏信息', ], overlayInfo: '切换 黎曼-西格尔项和出版时间的显示', + rewind: '将 t 倒回 1。\n在使用黑洞时,这有助于击中之前的零点。' }, 'zh-Hant': { // wip: '(正在進行中)\n{0}', pubTime: '出版時間:{0}', terms: '黎曼-西格爾項:{0}', - blackhole: '釋放一個黑洞', - blackholeInfo: '將 {0} 拉至於離 {1} 最接近的零', - menuBlackhole: '黑洞設置', + blackhole: '釋放黑洞', + blackholeInfo: '將 {0} 移到和{1} 最接近的零點', + menuBlackhole: '黑洞設定', blackholeThreshold: '黑洞釋放的條件:', - blackholeCopyt: '利用現時的t值', + blackholeCopyt: '利用現在的t值', rotationLock: [ '解鎖圖形', '鎖定圖形' ], - rotationLockInfo: '切換旋轉和縮放 3D 圖形的能力', + rotationLockInfo: '開啟/關閉 3D 圖形的旋轉和縮放', overlay: [ - '顯示信息', - '隱藏信息', + '顯示資訊', + '隱藏資訊', ], - overlayInfo: '切換 黎曼-西格爾項和出版時間的顯示', + overlayInfo: '顯示/隱藏 黎曼-西格爾項和出版時間', + rewind: '將 t 重新設為 1。\n在使用黑洞時有助於通過之前的零點。' }, es: { From 4401d61c03a87297866d0e5cdbd9b806a2f4a4f6 Mon Sep 17 00:00:00 2001 From: Minh Date: Thu, 8 Aug 2024 00:30:51 +0900 Subject: [PATCH 28/37] Adjusted 1 space on zh-Hant --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index f1f550f..867a52f 100644 --- a/theory.js +++ b/theory.js @@ -242,7 +242,7 @@ const locStrings = pubTime: '出版時間:{0}', terms: '黎曼-西格爾項:{0}', blackhole: '釋放黑洞', - blackholeInfo: '將 {0} 移到和{1} 最接近的零點', + blackholeInfo: '將 {0} 移到和 {1} 最接近的零點', menuBlackhole: '黑洞設定', blackholeThreshold: '黑洞釋放的條件:', blackholeCopyt: '利用現在的t值', From 2ab710dd0729efcde4a888a97414d432ea7df97e Mon Sep 17 00:00:00 2001 From: Minh Date: Thu, 8 Aug 2024 11:55:22 +0900 Subject: [PATCH 29/37] Adjusted Chinese localisation (8 Aug, 11:53) --- theory.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/theory.js b/theory.js index 867a52f..248a6fc 100644 --- a/theory.js +++ b/theory.js @@ -15,8 +15,8 @@ var getName = (language) => const names = { en: 'Riemann Zeta Function', - 'zh-Hans': '黎曼ζ函数', - 'zh-Hant': '黎曼ζ函数', + 'zh-Hans': '黎曼 ζ 函数', + 'zh-Hant': '黎曼 ζ 函数', es: 'Función Zeta de Riemann', es: 'Función Zeta de Riemann', vi: 'Hàm zeta Riemann' @@ -36,19 +36,19 @@ The definition was later extended to real numbers by Chebyshev, and to the compl In this theory, we will be examining the zeta function on the line perpendicular to the x-axis at x = 0.5, known as the critical line. In 1859, it was hypothesised by Riemann himself that, other than the so-called 'trivial zeroes' lying at negative even integers -2, -4, -6, ..., every other root of the function lies on this critical line.`, 'zh-Hans': -`黎曼ζ函数首次由欧拉定义的,将大于 1 的整数定义为无限系列。 +`黎曼 ζ 函数最早由欧拉提出,在大于 1 的整数上定义为以下无穷级数: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -这个定义后来被切比雪夫扩展到实数,又被黎曼扩展到複數(a+bi)。然而,由于它在实数小于 1 的所有 s 上等于∞,因此要在此处改变函数的定义以使函数完全连续。这被称为解析开拓.这也造成了一个臭名的笑话: +后来,这个定义被切比雪夫拓展到实数上,再被黎曼拓展到复数上。然而,由于它在所有实部不超过 1 的 s 上发散,函数必须被重新定义,以在拓展定义域的同时保持各阶导数连续。这被称之为解析延拓。黎曼函数的解析延拓还衍生出了一个著名的梗: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -在这个理论中,我们将探索在 x = 0.5 处垂直于 x 轴的直线(称为临界线)上的 zeta 函数。 1859 年,黎曼自己假设,除了位于负偶数 -2、-4、-6、... 处的所谓“平凡零点”之外,函数的所有其他根都位于这条临界线上。`, +在这个理论中,我们将研究黎曼 ζ 函数在 x = 0.5 处垂直于 x 轴的直线上的行为,这条线又被称为临界线。1859 年,黎曼本人猜想,除了位于负偶数 -2、-4、-6、…… 处的“平凡零点”之外,黎曼 ζ 函数的其它零点都位于这条临界线上。`, 'zh-Hant': -`黎曼ζ函數由歐拉首次提出,其對任何大於 1 的整數定義下方的無窮級數: +`黎曼 ζ 函數由歐拉首次提出,其原始定義是於s為任何大於 1 的整數時的無窮級數: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -這個定義後來先由切比雪夫擴展到實數,再被黎曼擴展到複數(a+bi)。然而,由於它在實數部分小於等於 1 的所有 s 上皆發散至∞,因此要在這個區間改變函數的定義以使函數完全連續。這被稱為解析延拓。這也造成了一個著名的迷因: +這個原始定義在後來先由切比雪夫擴展到實數,再被黎曼擴展到複數。然而,由於它在實部小於等於 1 的所有複數 s 上皆發散,為了保證該函數處處連續,數學家定義了另一個行為相同且定義域更廣的ζ函數。這被稱為解析延拓。這也造成了一個著名的迷因: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼假設:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ函數的所有其他根都位於這條臨界線上。`, +在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼臆測:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ函數的所有其他根都位於這條臨界線上。`, es: `La función conocida como Función Zeta de Riemann fue definida por Euler para los números enteros mayores a 1 como una serie infinita: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... @@ -75,7 +75,8 @@ var authors = 'propfeds, Eylanding\n' + 'Sneaky, Gen & Gaunter, for maths consultation & other suggestions\n' + 'game-icons.net\n\n' + 'Translations:\n' + -'Omega_3301 & pacowoc - 简体中文、繁體中文\n' + +'Omega_3301 & WYXkk - 简体中文\n' + +'Omega_3301 & pacowoc - 繁體中文\n' + 'Jooo & Warzen User - Español\n' + 'propfeds - Tiếng Việt'; var version = 0.5; @@ -218,23 +219,23 @@ const locStrings = pubTime: '出版时间:{0}', terms: '黎曼-西格尔项:{0}', blackhole: '释放黑洞', - blackholeInfo: '将 {0} 拉至于离 {1} 最接近的零', + blackholeInfo: '将 {0} 拉回至 {1} 的最近的零点', menuBlackhole: '黑洞设置', blackholeThreshold: '黑洞释放的条件:', - blackholeCopyt: '利用现时的t值', + blackholeCopyt: '使用现在的 t 值', rotationLock: [ '解锁图形', '锁定图形' ], - rotationLockInfo: '切换旋转和缩放 3D 图形的能力', + rotationLockInfo: '切换能否旋转和缩放 3D 图像', overlay: [ '显示信息', '隐藏信息', ], - overlayInfo: '切换 黎曼-西格尔项和出版时间的显示', - rewind: '将 t 倒回 1。\n在使用黑洞时,这有助于击中之前的零点。' + overlayInfo: '切换显示黎曼-西格尔项或出版时间', + rewind: '将 t 减少 1。\n这有助于在使用黑洞时击中之前的零点。' }, 'zh-Hant': { From 7f0f91eca0f3e10d957a54647b469749348776e5 Mon Sep 17 00:00:00 2001 From: Minh Date: Thu, 8 Aug 2024 16:56:15 +0900 Subject: [PATCH 30/37] Chinese localisations (8 Aug, 16:55) --- theory.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/theory.js b/theory.js index 248a6fc..f52763b 100644 --- a/theory.js +++ b/theory.js @@ -41,14 +41,14 @@ In this theory, we will be examining the zeta function on the line perpendicular 后来,这个定义被切比雪夫拓展到实数上,再被黎曼拓展到复数上。然而,由于它在所有实部不超过 1 的 s 上发散,函数必须被重新定义,以在拓展定义域的同时保持各阶导数连续。这被称之为解析延拓。黎曼函数的解析延拓还衍生出了一个著名的梗: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -在这个理论中,我们将研究黎曼 ζ 函数在 x = 0.5 处垂直于 x 轴的直线上的行为,这条线又被称为临界线。1859 年,黎曼本人猜想,除了位于负偶数 -2、-4、-6、…… 处的“平凡零点”之外,黎曼 ζ 函数的其它零点都位于这条临界线上。`, +在这个理论中,我们将研究黎曼 ζ 函数在 x = 0.5 处垂直于 x 轴的直线上的行为,这条线又被称为临界线。1859 年,黎曼本人猜想,除了位于负偶数 -2、-4、-6、... 处的“平凡零点”之外,黎曼 ζ 函数的其它零点都位于这条临界线上。`, 'zh-Hant': -`黎曼 ζ 函數由歐拉首次提出,其原始定義是於s為任何大於 1 的整數時的無窮級數: +`黎曼 ζ 函數由歐拉首次提出,其原始定義是於 s 為任何大於 1 的整數時的無窮級數: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... 這個原始定義在後來先由切比雪夫擴展到實數,再被黎曼擴展到複數。然而,由於它在實部小於等於 1 的所有複數 s 上皆發散,為了保證該函數處處連續,數學家定義了另一個行為相同且定義域更廣的ζ函數。這被稱為解析延拓。這也造成了一個著名的迷因: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼臆測:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ函數的所有其他根都位於這條臨界線上。`, +在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼臆測:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ 函數的所有其他根都位於這條臨界線上。`, es: `La función conocida como Función Zeta de Riemann fue definida por Euler para los números enteros mayores a 1 como una serie infinita: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... @@ -221,7 +221,7 @@ const locStrings = blackhole: '释放黑洞', blackholeInfo: '将 {0} 拉回至 {1} 的最近的零点', menuBlackhole: '黑洞设置', - blackholeThreshold: '黑洞释放的条件:', + blackholeThreshold: '释放黑洞的条件:', blackholeCopyt: '使用现在的 t 值', rotationLock: [ @@ -245,8 +245,8 @@ const locStrings = blackhole: '釋放黑洞', blackholeInfo: '將 {0} 移到和 {1} 最接近的零點', menuBlackhole: '黑洞設定', - blackholeThreshold: '黑洞釋放的條件:', - blackholeCopyt: '利用現在的t值', + blackholeThreshold: '釋放黑洞的條件:', + blackholeCopyt: '利用現在的 t 值', rotationLock: [ '解鎖圖形', @@ -259,7 +259,7 @@ const locStrings = '隱藏資訊', ], overlayInfo: '顯示/隱藏 黎曼-西格爾項和出版時間', - rewind: '將 t 重新設為 1。\n在使用黑洞時有助於通過之前的零點。' + rewind: '將 t 回溯 1。\n在使用黑洞時有助於通過之前的零點。' }, es: { From 400ba8735890c3a0f33096d616ea0535a5fde0f5 Mon Sep 17 00:00:00 2001 From: Minh Date: Fri, 9 Aug 2024 18:44:33 +0900 Subject: [PATCH 31/37] Changed black hole rewind length to be formatted --- theory.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/theory.js b/theory.js index f52763b..5ee350a 100644 --- a/theory.js +++ b/theory.js @@ -118,6 +118,8 @@ const derivRes = 100000; const resolution = 1/4; // const getBlackholeSpeed = (z) => Math.min(z**2 + 0.004, resolution); +const bhRewindLength = 1; + const c1ExpMaxLevel = 3; // The first 3 zeta zeroes lol const c1ExpTable = @@ -209,7 +211,7 @@ const locStrings = 'Hide info', ], overlayInfo: 'Toggles the display of Riemann-Siegel terms and publication time', - rewind: 'Rewind t by 1.\nThis can help with landing at previous zeroes when using the black hole.', + rewind: 'Rewind t by {0}.\nThis can help with landing at previous zeroes when using the black hole.', // warpFive: 'Get 5 penny with consequences', // warpFiveInfo: 'Testing tool: {0}{1}\\ by {2}' }, @@ -235,7 +237,7 @@ const locStrings = '隐藏信息', ], overlayInfo: '切换显示黎曼-西格尔项或出版时间', - rewind: '将 t 减少 1。\n这有助于在使用黑洞时击中之前的零点。' + rewind: '将 t 减少 {0}。\n这有助于在使用黑洞时击中之前的零点。' }, 'zh-Hant': { @@ -259,7 +261,7 @@ const locStrings = '隱藏資訊', ], overlayInfo: '顯示/隱藏 黎曼-西格爾項和出版時間', - rewind: '將 t 回溯 1。\n在使用黑洞時有助於通過之前的零點。' + rewind: '將 t 回溯 {0}。\n在使用黑洞時有助於通過之前的零點。' }, es: { @@ -283,7 +285,7 @@ const locStrings = 'Ocultar info', ], overlayInfo: 'Alternar la presentación de Riemann-Siegel en los términos y tiempo de publicación', - rewind: 'Regresa t en 1.\nEsto puede ayudar a llegar a ceros previos cuando se use el agujero negro.' + rewind: 'Regresa t en {0}.\nEsto puede ayudar a llegar a ceros previos cuando se use el agujero negro.' }, vi: { @@ -311,7 +313,7 @@ const locStrings = 'Giấu thông tin', ], overlayInfo: 'Bật tắt số hạng hàm Riemann-Siegel và thời gian xuất bản', - rewind: 'Kéo ngược t lại 1 đơn vị.\nViệc này có thể giúp nhắm trúng vào các không điểm đã qua khi dùng hố đen.' + rewind: 'Kéo ngược t lại {0} đơn vị.\nViệc này có thể giúp nhắm trúng vào các không điểm đã qua khi dùng hố đen.' // warpFive: 'Nhận 5 đồng nhưng có hậu quả', // warpFiveInfo: 'Công cụ thử nghiệm: {0}{1}\\ với {2}' } @@ -1504,14 +1506,20 @@ var postPublish = () => var canResetStage = () => blackholeMs.isAvailable; -var getResetStageMessage = () => getLoc('rewind'); +var getResetStageMessage = () => Localization.format(getLoc('rewind'), +bhRewindLength); var resetStage = () => { - t -= 1; - blackholeMs.refund(1); - // This points lastZero to a non-zero, but it is a necessary sacrifice. - lastZero = 0; + t -= bhRewindLength; + if(blackholeMs.level) + { + blackholeMs.refund(1); + blackholeMs.buy(1); + } + // This points lastZero to 0 (not a zeta zero), necessary sacrifice. + if(t < lastZero) + lastZero = 0; } var getInternalState = () => JSON.stringify From 35ecb1b1d4b14264f2711701d9f16445f5aab349 Mon Sep 17 00:00:00 2001 From: Minh Date: Fri, 9 Aug 2024 18:47:54 +0900 Subject: [PATCH 32/37] Fixed rewind sending black holes so far --- theory.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/theory.js b/theory.js index 5ee350a..b5c8af7 100644 --- a/theory.js +++ b/theory.js @@ -1517,9 +1517,9 @@ var resetStage = () => blackholeMs.refund(1); blackholeMs.buy(1); } - // This points lastZero to 0 (not a zeta zero), necessary sacrifice. + // This points lastZero to a non-zero, necessary sacrifice. if(t < lastZero) - lastZero = 0; + lastZero = t; } var getInternalState = () => JSON.stringify From 690b87e33af6a80501d7ba5a74cc2cf3da8c9285 Mon Sep 17 00:00:00 2001 From: Minh Date: Fri, 9 Aug 2024 18:49:19 +0900 Subject: [PATCH 33/37] Not sure what I'm doing anymore --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index b5c8af7..80b0088 100644 --- a/theory.js +++ b/theory.js @@ -1519,7 +1519,7 @@ var resetStage = () => } // This points lastZero to a non-zero, necessary sacrifice. if(t < lastZero) - lastZero = t; + lastZero = 0; } var getInternalState = () => JSON.stringify From 5f2949f2c7f4e0c62f3da5722849963ed7f96835 Mon Sep 17 00:00:00 2001 From: Minh Date: Sat, 10 Aug 2024 13:36:28 +0900 Subject: [PATCH 34/37] lastZero resets earlier to avoid death loop --- theory.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/theory.js b/theory.js index 80b0088..3ae0ba4 100644 --- a/theory.js +++ b/theory.js @@ -1512,14 +1512,14 @@ bhRewindLength); var resetStage = () => { t -= bhRewindLength; + // This points lastZero to a non-zero, necessary sacrifice. + lastZero = 0; + if(blackholeMs.level) { blackholeMs.refund(1); blackholeMs.buy(1); } - // This points lastZero to a non-zero, necessary sacrifice. - if(t < lastZero) - lastZero = 0; } var getInternalState = () => JSON.stringify From 40f95109e813f0acb29abeffd59f4e1a9aa582e2 Mon Sep 17 00:00:00 2001 From: Minh Date: Sat, 10 Aug 2024 13:38:23 +0900 Subject: [PATCH 35/37] Rewind length increased to 1.5 --- theory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theory.js b/theory.js index 3ae0ba4..0c5700d 100644 --- a/theory.js +++ b/theory.js @@ -118,7 +118,7 @@ const derivRes = 100000; const resolution = 1/4; // const getBlackholeSpeed = (z) => Math.min(z**2 + 0.004, resolution); -const bhRewindLength = 1; +const bhRewindLength = 1.5; const c1ExpMaxLevel = 3; // The first 3 zeta zeroes lol From 3b0dcc3b8a8ede79200e3eb6019b516881011642 Mon Sep 17 00:00:00 2001 From: Minh Date: Mon, 12 Aug 2024 11:31:28 +0900 Subject: [PATCH 36/37] Updated Spanish description (11 Aug, 06:38) --- theory.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/theory.js b/theory.js index 0c5700d..83e7656 100644 --- a/theory.js +++ b/theory.js @@ -50,12 +50,12 @@ In this theory, we will be examining the zeta function on the line perpendicular 在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼臆測:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ 函數的所有其他根都位於這條臨界線上。`, es: -`La función conocida como Función Zeta de Riemann fue definida por Euler para los números enteros mayores a 1 como una serie infinita: +`Esta función conocida como Riemann Zeta fue definida por Euler para los números enteros mayores a 1 como una serie de infinitos: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -Luego, su definición fue extendida a los números reales por Chebyshev, y al plano complejo por Riemann. Sin embargo, a medida que la función diverge para todo s con un componente real menor a 1, una versión especial de la misma habría que definirse para hacer la función continua. A esta se le conoce como la continuación analítica, y está relacionada al infame meme: +Su definición fue extendida a los números reales gracias a Chebyshev, y luego al plano complejo gracias a Riemann. Sin embargo, a medida que diverge para todo s con un componente real menor a 1, una versión especial de la función fue definida para hacer la función continua. Esta se le conoce como la continuación analítica, y está relacionada al infame meme: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -En esta teoría, examinaremos la función de zeta en la línea perpendicular al eje X cuando x = 0.5, conocido como la ruta crítica. En 1859, fue hipotetizado por el mismo Riemann que, excluyendo a los conocidos "ceros triviales" que permanecen en los enteros negativos pares -2, -4, -6, ..., toda raíz de la función yace sobre la ruta crítica.`, +En esta teoría, examinaremos la función de zeta en la línea perpendicular al eje X cuando x = 0.5, conocido como la ruta crítica. En 1859, fue hipotetizado por el mismo Riemann que, excluyendo a los conocidos "ceros triviales" que permanecen con negativos enteros pares -2, -4, -6, ... cada otra raíz de la función yace en esta ruta crítica.`, vi: `Trước khi được mang tên Riemann, hàm zeta được định nghĩa bởi Euler dưới dạng chuỗi vô hạn trên miền các số tự nhiên lớn hơn 1: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... From d2624cdb2b0648f43a36b0b8307a01cdcddc7518 Mon Sep 17 00:00:00 2001 From: Minh Date: Thu, 15 Aug 2024 11:39:55 +0900 Subject: [PATCH 37/37] Updated Spanish description (12 Aug, 15:23) --- theory.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/theory.js b/theory.js index 83e7656..12c6cca 100644 --- a/theory.js +++ b/theory.js @@ -50,12 +50,12 @@ In this theory, we will be examining the zeta function on the line perpendicular 在這個理論中,我們將探索在 x = 0.5 處垂直於 x 軸的直線(稱為臨界線)上 zeta 函數的行為。 1859 年,黎曼臆測:除了位於負偶數 -2、-4、-6、... 處的所謂“平凡零點”之外,ζ 函數的所有其他根都位於這條臨界線上。`, es: -`Esta función conocida como Riemann Zeta fue definida por Euler para los números enteros mayores a 1 como una serie de infinitos: +`Esta función conocida como la función de Riemann Zeta fue definida por Euler para los números enteros mayores a 1 como una serie de infinitos: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ... -Su definición fue extendida a los números reales gracias a Chebyshev, y luego al plano complejo gracias a Riemann. Sin embargo, a medida que diverge para todo s con un componente real menor a 1, una versión especial de la función fue definida para hacer la función continua. Esta se le conoce como la continuación analítica, y está relacionada al infame meme: +Su definición fue extendida a los números reales gracias a Chebyshev, y luego al plano complejo gracias a Riemann. Sin embargo, a medida que diverge para todo s con un componente real menor o igual a 1, una versión especial de la función fue definida para preservar la continuidad de sus valores derivados. Esta se le conoce como la continuación analítica, y la misma función analítica de la función zeta está relacionada a su infame meme: 1 + 2 + 3 + 4 + ... = -1/12 = ζ(-1) -En esta teoría, examinaremos la función de zeta en la línea perpendicular al eje X cuando x = 0.5, conocido como la ruta crítica. En 1859, fue hipotetizado por el mismo Riemann que, excluyendo a los conocidos "ceros triviales" que permanecen con negativos enteros pares -2, -4, -6, ... cada otra raíz de la función yace en esta ruta crítica.`, +En esta teoría, examinaremos la función de zeta en la línea perpendicular al eje X cuando x = 0.5, conocido como la ruta crítica. En 1859, fue hipotetizado por el mismo Riemann que, excluyendo a los conocidos "ceros triviales" que permanecen con negativos pares integros -2, -4, -6, ... cada otra raíz de la función yace en esta ruta crítica.`, vi: `Trước khi được mang tên Riemann, hàm zeta được định nghĩa bởi Euler dưới dạng chuỗi vô hạn trên miền các số tự nhiên lớn hơn 1: ζ(s) = 1 + 1/(2^s) + 1/(3^s) + ...