From 2369f342dd58178f78f9d7eb25e01f4077154a86 Mon Sep 17 00:00:00 2001 From: thzxx <1440196015@qq.com> Date: Sun, 23 Aug 2026 21:38:02 +0800 Subject: [PATCH] =?UTF-8?q?v0.1.33c:=20UI/=E5=8A=A8=E6=95=88=E6=89=93?= =?UTF-8?q?=E7=A3=A8=E2=80=94=E2=80=94=E8=BF=87=E6=B8=A1=E5=8A=A8=E7=94=BB?= =?UTF-8?q?/=E5=81=9C=E5=B8=A7=E8=8A=82=E8=83=BD/=E5=AD=A3=E8=8A=82?= =?UTF-8?q?=E5=AF=B9=E9=BD=90/=E5=8F=8D=E9=A6=88=E9=97=AD=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【动效】Modal 淡入+升起缓动(modalFadeIn/modalRise);LogFeed 入场动画(feedIn); fx std 档放行刀光(战场核心反馈);任务凯旋补 spark/战殁补 ripple 【节能】DriftLayer 2.6s 转 onAnimationEnd 删除节点(消除空转 setInterval×slice 定期 setState); fx-canvas 粒子空态停帧(空 rAF 取消+spawnBurst 唤醒)——低端机待机零开销 【季节】fx-canvas 季节色改读 data-season(游戏月驱动,不再用系统月——夏季粒子不再飘冬季色) 【性能】transition all 12 处→具体属性(background-color/color/transform/opacity); backdrop-filter 保留(视觉主) 【UI 修复】MemberModal 装备栏空守卫(未知名器)+职事按钮 disabled={maxed} 统一; 议和按钮灵石不足 disabled+title(不再静默);事件弹窗 RES_NAME 补新材料/增筑显示中文名; 回卷按钮无存点 disabled+title;速度按钮 sel/gel 类名统一;MarketPanel 删死变量 stock; debug 后门 __SMOKE__/DEV 门控(生产干净,冒烟仍可用——main 注入 __SMOKE__) 【测试】fx-timesense std 刀光断言更新 5030 全绿 --- src/main/index.ts | 1 + .../game/engine/runtime/Systems/combat.ts | 1 + src/renderer/ui/components/DriftLayer.tsx | 14 +++---- src/renderer/ui/components/EventModal.tsx | 9 ++++- src/renderer/ui/components/MemberModal.tsx | 4 +- src/renderer/ui/fx-canvas.ts | 10 ++++- src/renderer/ui/fx.ts | 2 +- src/renderer/ui/panels/DiplomacyPanel.tsx | 7 +++- src/renderer/ui/panels/MarketPanel.tsx | 1 - src/renderer/ui/screens/GameScreen.tsx | 8 ++-- src/renderer/ui/store.ts | 4 ++ src/renderer/ui/styles.css | 39 +++++++++++++------ tests/fx-timesense.test.ts | 5 +-- 13 files changed, 68 insertions(+), 37 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 0b0f024..b2f0fcb 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -63,6 +63,7 @@ function createWindow(): void { const title = await wc.executeJavaScript('document.title') let bootReady = 0 for (let i = 0; i < 40; i++) { + await wc.executeJavaScript('window.__SMOKE__ = true; void 0') bootReady = await wc.executeJavaScript( "Number(window.__cotycBootReady ?? 0)" ) diff --git a/src/renderer/game/engine/runtime/Systems/combat.ts b/src/renderer/game/engine/runtime/Systems/combat.ts index 5a0ba19..13bcd43 100644 --- a/src/renderer/game/engine/runtime/Systems/combat.ts +++ b/src/renderer/game/engine/runtime/Systems/combat.ts @@ -124,6 +124,7 @@ export function resolveEncounter( c.deathCause = `战殁于${opts.enemy.name}之手` loss.push(`${c.name} 陨落`) w.chronicle('death', `${c.name} 战殁于${opts.enemy.name},一身所学俱付尘烟。`, c.id, true) + w.emitFx('ripple', `death:${c.id}`) } else if (severity < 0.45) { const woundAmt = Math.round((40 + w.rng.int(0, 25)) * form.retreatWound * (talisman === 'shan' ? 0.5 : 1)) c.health = Math.max(1, c.health - woundAmt) diff --git a/src/renderer/ui/components/DriftLayer.tsx b/src/renderer/ui/components/DriftLayer.tsx index f87dbfe..f753c8a 100644 --- a/src/renderer/ui/components/DriftLayer.tsx +++ b/src/renderer/ui/components/DriftLayer.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' -interface DriftItem { id: number; text: string; cls: string } +interface DriftItem { id: number; text: string; cls: string; at: number } /** 资源漂字层:每次 fx:drift 事件追加独立节点(互不覆盖),超 8 条自动修剪尾部 */ export function DriftLayer() { @@ -12,22 +12,18 @@ export function DriftLayer() { const next: DriftItem[] = [] for (const [k, v] of Object.entries(detail)) { if (v === 0 || !Number.isFinite(v)) continue - next.push({ id: now + Math.random() + k.length, text: `${v > 0 ? '+' : ''}${v}`, cls: v > 0 ? 'pos' : 'neg' }) + next.push({ id: now + Math.random() + k.length, text: `${v > 0 ? '+' : ''}${v}`, cls: v > 0 ? 'pos' : 'neg', at: now }) } if (next.length === 0) return - setItems((old) => [...old, ...next].slice(-8)) + setItems((old) => (next.length + old.length > 8 ? [] : old).concat(next)) } window.addEventListener('fx:drift', onDrift) - const timer = setInterval(() => setItems((old) => old.slice(0)), 2600) // 到期清理由 CSS fade 承担 - return () => { - window.removeEventListener('fx:drift', onDrift) - clearInterval(timer) - } + return () => window.removeEventListener('fx:drift', onDrift) }, []) return (