Commit Graph
4 Commits
Author SHA1 Message Date
JianMiauandClaude Fable 5 7d4c5d849c 滑鼠移到寵物身上時跳躍,對齊 Codex 的 hover 行為
摘要:
游標壓在人物像素上時播 jumping 3 次再沉澱回慢速 idle,離開後回到原本狀態。

根本原因:
Codex 的寵物元件(codex-pet-assets)在 hover 時會把顯示狀態換成 jumping
(respondToHover && hovered ? "jumping" : state),桌面寵物那層透過
pet-area-hover-changed 事件驅動它。本程式只有點擊會揮手,滑鼠停上去沒有反應。

影響:
滑鼠移到她身上沒有任何回饋,與 Codex 的手感不同。

修法:
- 把 overOpaque 拆成 overBubble 與 overSprite:點穿判定兩者都算,hover 反應只看人物像素,
  游標停在氣泡上不會觸發跳躍。
- 新增 setHovered:進入人物像素時 play("jumping", STATE_REPEATS),與 Codex 的 f("jumping")
  相同是播 3 次;一次性動作或拖曳進行中不打斷。mouseout 離開視窗時清除 hover 狀態。
- 移除已無人使用的 overOpaque。

驗證:
以 ELECTRON_RUN_AS_NODE 讀打包後 app.asar 內的 renderer.js,確認 setHovered、
play("jumping", STATE_REPEATS)、mousemove/mouseout 的呼叫都在出貨檔案裡,overOpaque 已不存在。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 14:49:34 +08:00
JianMiauandClaude Fable 5 c96dcccb80 動畫時序照 Codex 校正,並修掉 look 列被畫小造成的縮水
摘要:
待機動畫放慢成 Codex 的速度、非 idle 狀態播 3 次後沉澱,並自動補正 spritesheet 裡整列 look 格子被畫小的缺陷。

根本原因:
1. idle 直接用合約上的幀時長無限循環,一輪只有 1.1 秒,看起來一直在動。Codex 的 codex-pet-assets 裡有一個放慢倍率 6,idle 實際是一輪 6.6 秒,其他狀態則是播 3 次後接上慢速 idle 並從那裡循環。
2. 內附的小念 spritesheet 第 10 列(看向 180 度到 337.5 度)整列被畫成 idle 的 78%,寬高同時縮小。游標移到人物身上或左邊時會切到那一列,人物就突然矮一截。第 9 列尾端只有高度變矮、寬度不變,那是低頭姿勢,不能一起改。
3. 追視參考點取在頭部高度(0.3),與 Codex 的方框中心不同,使得更多游標位置被判成「在下方」,更容易踩到第 10 列。

影響:
待機時一直晃;游標一靠近或移到左側,人物就明顯縮水又彈回來。

修法:
- 動畫改成序列模型(frames = [{row, col, ms}] + loopStart),對應 Codex 的 f(state):
  IDLE_SLOWDOWN = 6、STATE_REPEATS = 3、播完 3 次後循環慢速 idle。
- 每個 hook 事件都重播一次動畫(pulse),對應 Codex 每次狀態更新都會重跑動畫效果;
  否則狀態播完 3 次後就再也看不出 Claude Code 在忙。
- 載入寵物時量測 16 個 look 格子,以整列中位數判斷是否整列被縮小(門檻 0.9),
  是的話以腳底為支點放大回 idle 身高;單格差異不動,避免把低頭姿勢拉直。
- 追視參考點改為人物方框中心、死區改為 1 px,與 Codex 相同。
- 拖曳用的 running-left / running-right 維持持續循環,不套用沉澱規則。

刻意不同於 Codex 的地方:
Codex 的追視會覆蓋所有狀態,本程式只在 idle 時追視。否則工作中的動畫會被靜態擺姿蓋掉,
寵物就失去反映 Claude Code 狀態的作用。

驗證:
- 抽出序列邏輯單獨執行:idle 一輪 6600 ms(幀長 1680/660/660/840/840/1920);
  running / waiting / review 皆為 24 幀、第 18 幀起循環列 0;拖曳維持循環;一次性動作播完即止。
- 以 PIL 重現量測與繪製:小念第 9 列中位數比 0.995 不補正,第 10 列 0.783 補正倍率 1.2774,
  補正後畫面身高 128.7-132.1 px(idle 為 130.4),且無任何一格超出畫布;
  xiao-nian-realistic 兩列都是 0.99,判定不需補正而未受影響。
- 以 ELECTRON_RUN_AS_NODE 讀打包後 app.asar 內的 renderer.js 與 main.js,確認六項改動都在出貨的檔案裡。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 14:41:42 +08:00
JianMiauandClaude Fable 5 a014f9a279 把 100% 的顯示尺寸對齊 Codex 桌面寵物(126 × 137)
摘要:
原本 100% 直接用 spritesheet 的單格尺寸 192 × 208 顯示,比並排的 Codex 桌面寵物大了一半,就算縮到 75% 還是明顯偏大。

根本原因:
把「spritesheet 來源格子大小」直接當成「畫面顯示大小」在用。Codex 是另外算的:mascot 以寬度為基準,高度用 ceil(寬 × 208/192) 求得,跟單格 192 × 208 無關。

影響:
兩隻並排時大小不一致;使用者得手動調到某個非整數的縮放才勉強接近,而每一級縮放又都以 192 × 208 為基礎,永遠對不準。

修法:
- 新增 PET_W / PET_H(126 × 137),與 CELL_W / CELL_H 分家:後者只負責從 spritesheet 取格子,前者才是畫到畫面上的大小。
- 高度沿用 Codex 的 ake() 公式 ceil(寬 × 208/192),長寬比與 Codex 一致。
- 尺寸取自實測:Codex 與本程式並排截圖比對,因 xiao-nian 每一格的人物輪廓都固定是 208 中的 198 px,兩者輪廓高度比即等於顯示尺寸比(與螢幕 DPI 無關),推得 Codex 為 137.3 × 126.7。
- 視窗寬度加上 MIN_WIN_W = 240 下限:寵物縮小後視窗跟著變窄會讓氣泡被截斷,Codex 的氣泡(315 px)同樣遠寬於寵物本身。
- 追視死區 56 → 38,維持與寵物尺寸相同的比例。
- 視窗高度與游標追視的頭部位置一併改用 PET_H。

驗證:
scale 1 時人物實高 130.4 px,實測 Codex 為 130.7 px,誤差 0.2%。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 10:53:08 +08:00
JianMiauandClaude Fable 5 b1d57249f8 初始提交:Codex Pets 相容的 Claude Code 桌面寵物
摘要:
Electron 桌面寵物,透過 Claude Code hooks 即時反映工作狀態(思考、等待授權、失敗、完成),並支援 16 方向追視游標。

根本原因:
專案尚未納入版控,需要建立初始 repo 以便後續追蹤與協作。

影響:
建立 main 分支的第一個版本,包含完整可執行的程式碼與內附寵物「小念」。

修法:
納入以下內容:
- main.js / preload.js:Electron 主程序、透明置頂視窗、系統匣選單、HTTP 事件伺服器、游標輪詢與拖曳
- renderer/:Codex V2 spritesheet 幀動畫播放器、session 狀態機、氣泡、alpha 點穿判定
- hook/claude-pet-hook.js:Claude Code hook 端,stdin → POST /event,永遠 exit 0
- lib/、scripts/:hooks 安裝/移除、Windows 開機自動啟動
- pets/xiao-nian:內附寵物包(pet.json + spritesheet.webp)
- README.md、docs/states.png:使用說明與狀態總覽圖

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 10:32:39 +08:00