🌾 農場遊戲交接手冊 v2.0c

D1 四張表 · Worker 八 API · 金幣 + 偷菜 + 公告牆 · 五件全通
2026-10-29 · 開心農場 v2.0c 正式上線

一、系統總覽

項目值
前端網址https://farm.ahpal.com
Worker URLhttps://ahpal-farm-api.praystone.workers.dev
Pages 專案ahpal-farm
D1 資料庫ahpal-farm-db(database_id 見 wrangler.toml)
GitHub repopraystone/ahpal-farm
部署方式GitHub Actions(push 即部署)
子網域farm.ahpal.com(CNAME 橘雲)
ID 不寫死在手冊:database_id 見 worker/wrangler.toml,account_id 見 GitHub Secret CLOUDFLARE_ACCOUNT_ID。

二、D1 四張表(2026-10-29 實測)

#表名用途
1crops農作物靜態資料(id, name, grow_seconds, sell_price, icon)
2farms每塊田(id, nickname, crop_id, planted_at, harvested, stolen_by, stolen_at)
3farm_logs播種/收成/偷菜紀錄(plant / harvest / steal / stolen)
4farm_players玩家金幣(nickname, coins, total_harvest, last_seen)

5 種基礎農作物:🥕蘿蔔 60 秒 / 🍅番茄 300 秒 / 🌽玉米 1800 秒 / 🍓草莓 7200 秒 / 🍉西瓜 28800 秒

三、Worker 八個 API

#端點方法用途
1/api/cropsGET農作物清單
2/api/plantPOST種植(body: nickname, cropId)
3/api/farmGET查看自己的田(query: nickname)
4/api/harvestPOST收成(body: id, nickname),寫入 farm_players.coins
5/api/playerGET讀玩家金幣(query: nickname)
6/api/stealPOST偷菜(body: farmId, nickname),偷者得 50% sell_price
7/api/random-farmGET隨機找一塊別人的成熟田(query: nickname)
8/api/recent-stealsGET最近 20 筆偷菜紀錄(公告牆用)
參數名注意:/api/harvest 讀的是 body.id,不是 body.farmId。

四、懶結算(核心設計)

農場跟寵物最大的差異:離線也在長。種下去,8 小時後回來就能收。

實作方式:不要用排程器。種下去時 D1 存 planted_at,玩家來看時 Worker 算 now - planted_at,超過 grow_seconds 就回「已成熟」,收成時才寫 D1。

零成本、離線也在長:時間是算出來的,不是跑出來的。D1 只在播種/收成時寫入。

五、v2.0c 已上線五件

#功能狀態
1種菜、收成✅ 已上線
2金幣系統(收成寫入、topbar 顯示、收成後即時刷新)✅ 已上線
3偷菜(隨機偷別人的成熟田)✅ 已上線
4偷菜 UI✅ 已上線
5偷菜公告牆(誰偷了什麼,最近 20 筆)✅ 已上線

六、v2.0c 缺口(v2.1 再補)

#功能狀態
1等級門檻(crops 沒 level_required)❌ v2.1
2多季作物(crops 沒 season_count)❌ v2.1
3化肥加速❌ v2.1
4偷竊次數上限❌ v2.1
5雜草蟲害❌ v2.1
6土地擴張❌ v2.1
結構正常 ≠ 內容正確:v2.0c 五件全通,但六個缺口仍在。下一個 AI 不要以為「公告牆通了就全好了」。

七、部署入口(不能混用)

目標指令觸發
前端 Pagesgit push → GitHub Actions自動
Worker 後端wrangler deploy永遠手動
D1 資料庫wrangler d1 execute --remote永遠手動

八、這幾輪踩的坑(給下一個 AI)

  1. cp950 解碼:subprocess.run 要用 text=True, encoding="utf-8", errors="replace"
  2. bytes 命令:Windows 不接受 b"git ...",用 str
  3. escapeHtml fallback:語法錯會炸整個 script 區塊,寧可內聯 replace
  4. topbar 破洞:插 <script> 前,先看 div 的 < > 閉合
  5. 驗證只驗「API 回 200」不夠,要看 Console 有沒有 SyntaxError
  6. 猜錨點必失敗:改 HTML/PS1 前,先印出真實碼再改

九、給下一個 AI 的話

🌾 2009 年,你在偷誰的菜?

2009 年,Facebook 開心農場。你半夜設鬧鐘起來,就為了偷同學那顆快熟的番茄。那時候,我們都還年輕。放學衝回家,打開電腦,偷菜、種菜、被偷,一個都不能少。

17 年後,開心農場回來了。不是 Facebook,是 AHPAL。

你的菜,還在長。你的青春,還在等你。