fix: refine heaven readings and heart breathing

This commit is contained in:
leefer
2026-07-23 20:15:30 +08:00
parent 95789c837c
commit e6db73f9ba
4 changed files with 170 additions and 23 deletions
+11 -10
View File
@@ -10,6 +10,9 @@ const {
todayString,
} = window.XiaobaiUI;
const HEART_BREATH_TOTAL_MS = 40_000;
const HEART_BREATH_PHASE_MS = 4_000;
const state = {
user: null,
csrfToken: "",
@@ -81,7 +84,7 @@ const state = {
heavenReadingError: "",
heartStage: "intro",
heartTimer: null,
heartSeconds: 30,
heartSeconds: HEART_BREATH_TOTAL_MS / 1000,
heartBreathingEndsAt: 0,
heartLines: [],
heartThrows: [],
@@ -3791,11 +3794,11 @@ function waitForHeartMotion(duration, token = state.heartStageToken) {
async function startHeartBreathing() {
if (state.heartTimer) clearInterval(state.heartTimer);
state.heartSeconds = 30;
state.heartSeconds = HEART_BREATH_TOTAL_MS / 1000;
state.heartBreathingEndsAt = 0;
document.querySelector("#beginCastingButton")?.classList.remove("is-ready");
if (!await transitionHeartStage("breathing")) return;
state.heartBreathingEndsAt = Date.now() + 30_000;
state.heartBreathingEndsAt = Date.now() + HEART_BREATH_TOTAL_MS;
const ember = document.querySelector("#heartIncenseEmber");
ember?.classList.remove("is-burning");
if (ember) void ember.offsetWidth;
@@ -3821,22 +3824,20 @@ function finishHeartBreathing() {
}
function updateBreathingDisplay() {
setText("breathingSeconds", Math.max(0, state.heartSeconds));
const remainingMs = state.heartBreathingEndsAt
? Math.max(0, state.heartBreathingEndsAt - Date.now())
: Math.max(0, state.heartSeconds * 1000);
const elapsedMs = 30_000 - remainingMs;
const inhaling = Math.floor(elapsedMs / 4000) % 2 === 0;
const elapsedMs = HEART_BREATH_TOTAL_MS - remainingMs;
const inhaling = Math.floor(elapsedMs / HEART_BREATH_PHASE_MS) % 2 === 0;
const phase = state.heartSeconds <= 0 ? "settled" : inhaling ? "inhale" : "exhale";
const scene = document.querySelector("#breathingScene");
scene.dataset.phase = phase;
setText("breathingPhase", phase === "settled" ? "已静" : inhaling ? "吸气" : "呼气");
document.querySelector("#breathingProgress").style.width = `${clamp(elapsedMs / 300, 0, 100)}%`;
const prompt = state.heartSeconds <= 0
? "静心已成,可以起卦"
: state.heartSeconds > 20
: elapsedMs < 16_000
? inhaling ? "缓慢吸气,放下对答案的预设" : "缓慢呼气,让预设随之松开"
: state.heartSeconds > 10
: elapsedMs < 32_000
? inhaling ? "吸气,只留下真正想问的事" : "呼气,不急着寻找答案"
: inhaling ? "吸气,让心停在此刻" : "呼气,不追逐经过的念头";
setText("breathingPrompt", prompt);
@@ -4185,7 +4186,7 @@ function resetHeartCoins() {
async function resetHeartRitual() {
if (state.heartTimer) clearInterval(state.heartTimer);
state.heartTimer = null;
state.heartSeconds = 30;
state.heartSeconds = HEART_BREATH_TOTAL_MS / 1000;
state.heartBreathingEndsAt = 0;
state.heartLines = [];
state.heartThrows = [];