在開始之前先簡短聲明:當我說「情感」時,我指的是狀態機、羈絆進程與互動歷史——不是 LLM。Mochi 並沒有在任何 AI 模型上執行,也沒有語言模型在決定他的反應。這裡的每個「情緒」都是可決定性的:狀態生命週期、計時器,以及對過往互動的記憶,而不是推論。只是先把這個期待說清楚。繼續吧 🌱


我最近一直在打造一隻住在 Linux 桌面的綠色小生物。

他叫 Mochi。
mochi001
這是 Mochi 的 0.01 版,我知道看起來很可笑,但他真的很可愛!

一開始,目標老實說很單純:讓這坨東西動起來。

後來變成:讓這坨東西看起來像活的。

而我現在顯然已經走到這一步了:給這坨東西一套生產力系統、情感進展、零食,以及多到嚇人的動畫。

所以……對,Mochi v0.3 就這樣誕生了。🌱

feeding mochi

原始想法其實小得多

Mochi 最初是一個給 Linux 用的像素風桌面夥伴。

Python。GTK4。PyGObject。Cairo。

沒有雲端服務。沒有帳號。沒有某個巨大到會躲在背景裡的 Electron 視窗。只是個在你桌面上晃來晃去的小生物。

早期版本主要在嘗試把這個基本幻覺做出來。Mochi 可以待機、眨眼、走動、睡覺、在你點他時反應、注意到你在打字,偶爾對桌面正在發生的事做出回應。

說真的,就連把這些功能穩定做出來,都讓我學到比預期多得多的桌面開發知識。因為當你的可愛果凍可以走路、睡覺、被抱起、對輸入做反應、顯示 UI,還能獨立觸發動畫時,你其實不小心做出了一個狀態管理問題。

一個意外可愛的狀態管理問題。

但 v0.3 讓我重新思考 Mochi 到底是什麼。

mochispin

mochi in pixelorama

我不想做一個會讓人產生罪惡感的電子寵物

當我開始思考進度機制時,最直覺的方向就是某種虛擬寵物系統。

飢餓。健康。每日連續登入。你不在的時候數值慢慢掉下去。

而我基本上討厭這一切。

我不希望自己在經歷了好幾天的艱難時光後打開筆電,結果桌面寵物像這樣盯著我:

媽媽。你拋棄我了。😭

軟體已經向我們要求夠多了。Mochi 應該是讓桌面感覺更溫暖一點,而不是變成另一個要求維護的通知。

所以 v0.3 的設計原則變成:

  1. 照顧應該帶來喜愛,而不是義務。
  2. 你和 Mochi 的羈絆可以成長,但不會因為你出門了就衰退。沒有每日連續登入。Mochi 不會餓死。關掉應用程式不是道德失敗。
  3. 進程機制主要是為了解鎖更多個性、反應、對話、動畫,以及小驚喜。

這個決定最後幾乎塑造了整個版本。

Mochi 現在有羈絆系統了

v0.3 引入了持久化的羈絆進度。

這裡重要的字是「持久化」。Mochi 開始慢慢記住你和他建立起來的關係,而不是每次程式啟動都把情感歸零。

互動可以推進羈絆,而達到新等級後,我就有地方可以在之後掛上越來越有表現力的行為。

不是更強的數值。不是「+5 Mochi 傷害」。

而是表現。不同的反應。不同的小瞬間。更多個性。

這對於這個專案正在變成的樣子來說,感覺合適得多。

而且是的,有升級動畫。當然有。這就是我的優先順序。

coding w/ mochi

你可以餵他

這大概是那種主要因為「看 Mochi 吃東西讓我很開心」而存在的功能。而我完全沒問題。

餵食是一個小型互動,而不是某種持續消耗的飢餓機制的基礎。這是很重要的差別。

我希望你會想跟 Mochi 互動,是因為它可愛、你也想這麼做,而不是因為某個進度條被拿來對付你。

這聽起來像是我在非常誇張地思考怎麼餵一坨綠色像素果凍。或許確實是。但像這樣的小設計決策,會徹底改變軟體陪伴你的感受。

我做了一整套表情動作目錄

emote catologue

這已經變成這個專案裡我最喜歡的部分之一。Mochi 一直在累積反應,而且很多。

我沒有把這些動畫當成彼此獨立、隨機的 GIF,而是開始打造一個真正的目錄與狀態系統,讓 Mochi 能夠一致地使用它們。

難的不是畫出動畫。難的是回答這些問題:

  • 如果 Mochi 想要做表情時正在走路,會怎樣?
  • 如果你在動畫到一半時把他抱起來呢?
  • 如果他正在睡覺呢?
  • 動畫結束時會發生什麼?
  • 如果一個舊計時器在他的狀態已經改變後才觸發呢?

到這裡,這隻可愛的桌面寵物就悄悄變成了一個真正的軟體架構問題。

Mochi 現在有明確的行為/狀態所有權,因此高優先級的互動可以中斷低優先級的環境行為,而不會有一堆計時器在那裡互相搶著控制 sprite。

這句話非常嚴肅,儘管主角大概只有一顆口香糖大小。

Mochi 開始知道我在做什麼了

mochi hacking away

這大概是我長期最有興趣的方向。Mochi 可以對廣泛的桌面活動做出反應。如果我在終端機、編輯器、瀏覽器、媒體程式或其他可辨識的情境中待了一段時間,Mochi 就能以不同方式行動。

但我一直刻意嚴守隱私界線。

Mochi 不需要知道我正在輸入什麼。他不需要每個視窗標題。他不需要檔名。他不需要我桌面的逐字紀錄。

相對地,系統會嘗試把活動縮減成很小的語意訊號。比較像是:

terminal active
typing happening
media playing
user returned

而不是:

這是 Mika 目前正在做的所有事情

我認為這種區別非常重要。桌面夥伴應該能讓人感覺到它有在察覺環境,但不能變成桌面監控。

這個原則我會維持下去。

然後我不小心給我的桌面寵物加了番茄鐘

mochi focus

這大概是把 Mochi 推離「桌面玩具」最遠的一個功能。

它叫做「和 Mochi 一起專注」。你可以開始一段專注時段,選擇專注與休息時間,設定輪數,啟用溫和鼓勵,甚至還能使用下雨聲景。

當你工作時,Mochi 也會陪你一起工作。專注時間會累積羈絆。休息時間不會。而且——這點我刻意設計成這樣——Mochi 不會評斷你在休息時做了什麼。

我不想再做另一個瘋狂最佳化的生產力系統,整天對效率大吼大叫。這個想法溫和得多:

我工作一小段時間。Mochi 也在這裡。

就這樣。奇怪的是,我反而更喜歡這樣。

難的不是加功能

v0.3 最大的教訓是:現在要在 Mochi 裡加另一個功能已經不特別難了。難的是讓每個功能能共存。

  • 專注時段需要能承受互動。
  • 餵食不能弄壞狀態機。
  • 拖著 Mochi 到處走不該留下隱形視窗。
  • 名牌不該搶走滑鼠輸入。
  • 睡覺不該因為 UI 跳出來就被意外取消。
  • 舊回呼不該在三秒後醒來,覆蓋掉你目前所在的狀態。

而且因為 Mochi 是在 Linux 上實際作為桌面表層執行,我還得在意這些東西:

Wayland。XWayland。GTK 的生命週期行為。視窗定位。多螢幕。負座標螢幕。輸入抓取。GLib 計時器。關閉時清理。

這些都是我一開始畫出一坨綠色果凍時,完全沒想過自己會去考慮的東西。

這大概也是我最喜歡這個專案的原因。Mochi 一直在逼我學習那些原本不會碰到的系統。

而且我還是不想讓 Mochi 變得很煩

mochi table flip

像這種東西很容易讓人忍不住想把活動量拉滿。更多反應。更多彈出視窗。更多對話。更多通知。更多東西。

我正在努力克制這件事。

一個好的環境型夥伴要知道什麼時候該閉嘴。有時 Mochi 會注意到某件事並做出反應。有時不會。有時他就只是坐在那裡。

那份安靜也是個性的一部分。

目標不是:

看看我的桌面寵物有多少功能。

而是:

咦,感覺這個小東西真的住在這裡。

這才是我想追的標準。

接下來呢

v0.3 最後變成的架構性一步,比我原本預期的大得多。

羈絆系統讓 Mochi 有了記憶。互動系統讓那份羈絆有了意義。持續擴充的表情庫讓他有更多方式表達。情境感知則把他連接到桌面。而「和 Mochi 一起專注」則是我第一次嘗試在不把他變成另一個生產力儀表板的前提下,讓這位夥伴真的有用。

我還有很多想探索的方向:

  • 更有意義的羈絆里程碑
  • 更多情境化反應
  • 可解鎖的小行為
  • 更好的對話
  • 更多打磨
  • 大概還會有好幾個因為 GTK 做了我完全確信不會做的事而冒出來的 bug

你知道的。軟體開發。

但我真的很喜歡現在的方向。

Mochi 一開始是:如果我桌面上有個小傢伙會怎樣?

v0.3 則開始回答更有趣的問題:到底什麼才會讓我真的在意他住在那裡?

🌱


原文出處:https://dev.to/mikachu/i-built-a-green-blob-that-lives-on-my-desktop-and-now-it-has-feelings-4pjd


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝62   💬1  
825
🥈
NewsData
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登