Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions STATUS.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name_zh: 離岸風場・運維傳說
category: edtech
progress: 100
status: active
last_updated: "2026-07-09"
next_milestone: "出海決策支援與學習迴路閉環已完成:出海前工期預估vs天氣窗(航線/登船/檢查/維修+保留餘裕,含磨耗/疲勞/擇日/缺料提醒)、審慎返港再規劃(不計安全事件)+半途成果保留(#carry)、⚡加班搶修風險抉擇(#rush,快vs穩三選一)、任務復盤星級+一句takeaway、診斷連對streak(封頂XP加成+🔥里程碑)、錯題本主動回想(檢索練習)、無障礙(減少動態:系統偏好+遊戲內開關;色覺友善雙重編碼)、戰情室SLA季末風險+母港預算續航提醒、Pages部署來源鎖定GitHub Actions(configure-pages)。內容系統全面查核與修正(事件/案例/任務/故障×消費端交叉驗證):每日任務維持型項目改日結算(deferred,修正開局白拿)、安全事件數夾0(堵刷分漏洞)、備品資料誤植修正(感測器/變槳故障)、交易所主線防卡(進行中工單備品永遠可見)、移除3組重複任務模板、案例研究資料誤植修正;判斷型任務引擎擴充至192題。先前:循序漸進難度與長線動機已完成:運維層級 Tier 系統(依進度自動推進,故障/備品/經濟壓力分層)、入門引導+UI 漸進揭露、每日任務(遊戲內日曆)、每週主題挑戰(風暴/斷料週等,綁戰情室事件池)、情境包匯入(教師自訂題組)、真實度深化(jack-up 安裝船動員前置期+計畫性定期保養)、故障/備品分層擴充(25 故障/33 備品)、真實案例研究事件(經查核的真實風場事故,具名+出處/去識別兩類,Tier 偶發+母港案例檔)。併發壓力測試通過(npm run stress);雲端後端 v2.1 加併發鎖(LockService);PWA 可安裝/離線(手機網頁並存);教師面板 CSV 匯出;營運趨勢儀表板/賽後復盤;登入畫面教師入口;存檔版本化遷移;code-split(初始包 653KB→268KB);知識點掌握度(答題正確率+弱點補強建議);HSE 科別加厚(LOTO 能量隔離/高處墜落防護/SIMOPS 同時作業,含圖鑑+鑑別診斷+戰情室事件);直升機進場與電網限電真實運維權衡判斷任務;真實/擬真案例擴充至 24 則,並可在自由營運中心任務清單以『案例演練』自然出現(略過 Tier、答後揭示 O&M 教訓並收錄圖鑑);手機直向專屬精簡版面(母港+交易所+出海+維修+所有彈窗,自動偵測裝置;PWA 快取版本化+錯誤邊界+啟動安全網防更新後空白);學習成效分析(各科別能力雷達圖 + 錯題本/維修檢討反思);母港建設視覺成長(用獲利升級碼頭/倉儲/起重機/燈塔,母港畫面隨之長大,純視覺不影響計分);新手友善漸進式揭露(Tier 1 隱藏三日預報/技師疲勞細節,Tier 2 解鎖)+ 圖鑑生活化比喻 + 戲劇性非技術事件(環團/媒體/社區/稽查)。本輪續作(邏輯完整性):人力短缺/罷工事件實效化(缺工直接折抵戰情室「可同時開的現場作業面」effectiveJobCapOf,滿編不懲罰、下限1、遠端重啟不占名額、每日休整回復;開局改滿編30/30、戰情室顯示缺工折抵——事件從純展示變成先遠端重啟/批次搶修/靠港補人的真實取捨)、軸承備品正名(新增Tier3「傳動軸承組」drive_bearing,主軸承振動/發電機振動改指專屬備品、與Tier4主軸承全換區隔,補pitch_bearing_wear事件避免孤兒備品;見GAME_DESIGN §18)。後續延伸候選:掌握度同步雲端供教師端個別鑽取、獨立測驗模式(Exam Mode)、母港視覺疊到實景背景"
last_updated: "2026-07-10"
next_milestone: "出海決策支援與學習迴路閉環已完成:出海前工期預估vs天氣窗(航線/登船/檢查/維修+保留餘裕,含磨耗/疲勞/擇日/缺料提醒)、審慎返港再規劃(不計安全事件)+半途成果保留(#carry)、⚡加班搶修風險抉擇(#rush,快vs穩三選一)、任務復盤星級+一句takeaway、診斷連對streak(封頂XP加成+🔥里程碑)、錯題本主動回想(檢索練習)、無障礙(減少動態:系統偏好+遊戲內開關;色覺友善雙重編碼)、戰情室SLA季末風險+母港預算續航提醒、Pages部署來源鎖定GitHub Actions(configure-pages)。內容系統全面查核與修正(事件/案例/任務/故障×消費端交叉驗證):每日任務維持型項目改日結算(deferred,修正開局白拿)、安全事件數夾0(堵刷分漏洞)、備品資料誤植修正(感測器/變槳故障)、交易所主線防卡(進行中工單備品永遠可見)、移除3組重複任務模板、案例研究資料誤植修正;判斷型任務引擎擴充至192題。先前:循序漸進難度與長線動機已完成:運維層級 Tier 系統(依進度自動推進,故障/備品/經濟壓力分層)、入門引導+UI 漸進揭露、每日任務(遊戲內日曆)、每週主題挑戰(風暴/斷料週等,綁戰情室事件池)、情境包匯入(教師自訂題組)、真實度深化(jack-up 安裝船動員前置期+計畫性定期保養)、故障/備品分層擴充(25 故障/33 備品)、真實案例研究事件(經查核的真實風場事故,具名+出處/去識別兩類,Tier 偶發+母港案例檔)。併發壓力測試通過(npm run stress);雲端後端 v2.1 加併發鎖(LockService);PWA 可安裝/離線(手機網頁並存);教師面板 CSV 匯出;營運趨勢儀表板/賽後復盤;登入畫面教師入口;存檔版本化遷移;code-split(初始包 653KB→268KB);知識點掌握度(答題正確率+弱點補強建議);HSE 科別加厚(LOTO 能量隔離/高處墜落防護/SIMOPS 同時作業,含圖鑑+鑑別診斷+戰情室事件);直升機進場與電網限電真實運維權衡判斷任務;真實/擬真案例擴充至 24 則,並可在自由營運中心任務清單以『案例演練』自然出現(略過 Tier、答後揭示 O&M 教訓並收錄圖鑑);手機直向專屬精簡版面(母港+交易所+出海+維修+所有彈窗,自動偵測裝置;PWA 快取版本化+錯誤邊界+啟動安全網防更新後空白);學習成效分析(各科別能力雷達圖 + 錯題本/維修檢討反思);母港建設視覺成長(用獲利升級碼頭/倉儲/起重機/燈塔,母港畫面隨之長大,純視覺不影響計分);新手友善漸進式揭露(Tier 1 隱藏三日預報/技師疲勞細節,Tier 2 解鎖)+ 圖鑑生活化比喻 + 戲劇性非技術事件(環團/媒體/社區/稽查)。本輪續作(邏輯完整性):人力短缺/罷工事件實效化(缺工直接折抵戰情室「可同時開的現場作業面」effectiveJobCapOf,滿編不懲罰、下限1、遠端重啟不占名額、每日休整回復;開局改滿編30/30、戰情室顯示缺工折抵——事件從純展示變成先遠端重啟/批次搶修/靠港補人的真實取捨)、軸承備品正名(新增Tier3「傳動軸承組」drive_bearing,主軸承振動/發電機振動改指專屬備品、與Tier4主軸承全換區隔,補pitch_bearing_wear事件避免孤兒備品;見GAME_DESIGN §18)。再一輪(收尾三延伸候選,見GAME_DESIGN §19):獨立測驗模式(#exam,exam.ts/ExamModal —— 跨科別均衡抽題、無提示單次作答、A–F等第+各類別對錯+錯題覆盤;RECORD_EXAM計入掌握度與錯題本但不動xp/streak,最佳成績bestExam存紀錄;入口在課程模式)、掌握度雲端同步供教師端個別鑽取(#mastery-cloud,存檔夾帶掌握度精簡摘要、後端Code.gs v2.2存/回mastery、教師面板點列展開各科別正確率鑽取,向後相容)、母港建設疊實境/漫畫背景(#port,PortScene依背景模式疊harbor.jpg/comic_harbor.jpg)。後續延伸候選:每機獨立健康度/RUL預測性維護、內容編輯器讓教師資料驅動新增故障"
technologies:
- React
- TypeScript
Expand All @@ -16,4 +16,4 @@ outputs:
- presentation
description: "An Uncharted-Waters-style educational game for offshore wind O&M training."
description_zh: "大航海時代風格、以離岸風電運維為核心的教學遊戲。"
key_metrics: "四畫面UI+三模式背景(模擬/實境/漫畫)+俯瞰60°、192題判斷型任務引擎(7類,含直升機進場/電網限電權衡)+情境包匯入、雙層架構(計分主線+無限沙盒)、運維層級Tier循序漸進難度、每日任務(維持型日結算)+每週主題挑戰、出海決策支援(工期預估/半途成果保留/加班搶修)、25故障/34備品分層(含HSE:LOTO/墜落防護/SIMOPS;傳動軸承組正名)、人力短缺/罷工實效化(缺工折抵現場作業面)、jack-up動員+計畫保養、多風場+突發事件+安全KPI、知識點掌握度(正確率+弱點補強)+錯題本主動回想、無障礙(減少動態+色覺友善)、學號帳號+通關碼(後端驗證)+雲端為主存檔/紀錄、15項成就+個人檔案頁、教師檢視面板、雲端班級排行榜(Apps Script,併發壓測通過)、每週開放、中英雙語"
key_metrics: "四畫面UI+三模式背景(模擬/實境/漫畫)+俯瞰60°、192題判斷型任務引擎(7類,含直升機進場/電網限電權衡)+情境包匯入、雙層架構(計分主線+無限沙盒)+獨立測驗模式(跨科別評量/錯題覆盤)、運維層級Tier循序漸進難度、每日任務(維持型日結算)+每週主題挑戰、出海決策支援(工期預估/半途成果保留/加班搶修)、25故障/34備品分層(含HSE:LOTO/墜落防護/SIMOPS;傳動軸承組正名)、人力短缺/罷工實效化(缺工折抵現場作業面)、jack-up動員+計畫保養、多風場+突發事件+安全KPI、知識點掌握度(正確率+弱點補強;雲端同步供教師端個別鑽取)+錯題本主動回想、無障礙(減少動態+色覺友善)、學號帳號+通關碼(後端驗證)+雲端為主存檔/紀錄、15項成就+個人檔案頁、教師檢視面板、雲端班級排行榜(Apps Script,併發壓測通過)、每週開放、中英雙語"
5 changes: 5 additions & 0 deletions docs/CLOUD_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@

> 🆕 **v2.1(併發加固)**:本版所有寫入加上 `LockService` 序列化,杜絕多人同時寫入時的
> 競態覆蓋/重複建號;`findRow` 改為只讀 key 欄以降低讀取量。**改用此版務必「新版本」重部署**。
>
> 🆕 **v2.2(掌握度雲端同步)**:`saves` 分頁新增**第 9 欄 `mastery`**(知識點掌握度精簡摘要 JSON),
> 隨存檔一併寫入;`teacher` 端回傳每位學生的 `mastery`,供**教師檢視面板「個別鑽取」**各科別/類別正確率。
> **改用此版務必「新版本」重部署**;既有 `saves` 舊列第 9 欄留空即可(教師端會優雅降級,其餘欄位不受影響)。
> 未升級後端時,前端一切照舊運作,只是教師面板不顯示掌握度鑽取資料。

## 併發與容量(單班 ~50 人)
- 後端為**單一試算表 + Apps Script Web App**。單班約 50 人課堂操作可負荷:存檔去抖 1.5 秒、
Expand Down
10 changes: 10 additions & 0 deletions docs/GAME_DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@
| **無障礙(減少動態+色覺友善雙重編碼)** | ✅ 已實作(見 §17)`useReducedMotion`|
| **人力短缺/罷工實效化(缺工折抵現場作業面)** | ✅ 已實作(見 §18)`effectiveJobCapOf`|
| **軸承備品正名(傳動軸承組 T3,與主軸承全換區隔)** | ✅ 已實作(見 §18)`drive_bearing`|
| **獨立測驗模式(跨科別評量+錯題覆盤)** | ✅ 已實作(見 §19)`exam.ts`/`ExamModal`|
| **掌握度雲端同步・教師端個別鑽取** | ✅ 已實作(見 §19,後端需 v2.2)`masterySummary`|
| **母港建設疊實境/漫畫背景** | ✅ 已實作(見 §19)`PortScene mode`|
| CC0 實體音樂 / 每機獨立健康度 | ⏳ 規劃中(見 §14)|

> 兩層架構:**評量層**=全班相同的主線 7 關(教師按週開放、計成績);**自由營運層**=沙盒無限判斷型任務(永遠開放、只進排行榜)。
Expand Down Expand Up @@ -256,3 +259,10 @@ scores(user_id, score, availability, generation_mwh, missions_done, day, updated
- **戰情室透明化**(`FleetOpsModal`):新增「可出勤班組」統計;短手時顯示 👷 橫幅(`vesselCap → cap`、少 N 面)與「現場已滿」時的成因區分(人力 vs 船舶)。事件不再是純展示,而是「先遠端重啟軟故障、批次搶修、靠港補人」的真實取捨。
- **軸承備品正名(#bearing,`drive_bearing`)**:主軸承振動事件(`bearing`)與發電機振動圖鑑故障(`gen_vibration`)原本權宜共用「變槳軸承」(`pitch_bearing`)備品(規避 Tier 閘門)。新增 Tier 3 專屬備品**「傳動軸承組(發電機/主軸)」**(`drive_bearing`, ◎130 萬)並重新指派兩者——與 Tier 4「主軸承」全換(`main_bearing`)語意區隔(振動維修級 vs 重吊更換)。同時新增 `pitch_bearing_wear`(變槳軸承磨耗)事件,讓 `pitch_bearing` 備品保有真實消費端(與既有 `cs_pitch_bearing_wear` 案例研究呼應),不成孤兒。

## 19. 獨立測驗模式・掌握度雲端鑽取・母港疊實景(本輪新增)
收尾三項延伸候選,把既有「判斷型任務/掌握度/母港建設」延展為評量、教師洞察與視覺收束。

- **獨立測驗模式(#exam,`state/exam.ts` + `ExamModal`)**:把判斷型題庫抽成一份正式評量——固定 10/20 題、跨科別均衡抽題(各類別洗牌後 round-robin)、**排除需輔助圖者**以確保純文字公平作答;**作答當下不給提示、不揭示對錯**,結束才公布 `pct`、A–F 等第、各類別對錯與**錯題覆盤**(揭示正解+教訓)。純函式引擎 `buildExam`(可決定性種子)/`gradeExam` 集中於 `exam.ts`;作答經 **`RECORD_EXAM`** 批次計入知識點掌握度與錯題本(供主動回想),但**不動 xp/answerStreak** → 評量與遊戲經濟隔離。最佳成績 `bestExam` 存學習紀錄(只增不減、雲端聯集取大),個人檔案頁顯示。入口在 ⚙ 課程模式。
- **掌握度雲端同步・教師端個別鑽取(#mastery-cloud)**:存檔上傳時夾帶**掌握度精簡摘要**(`masterySummary`:只帶 n>0 的格、[n,ok] 元組);後端 `Code.gs` v2.2 於 `saves` 新增第 9 欄 `mastery`,`teacher` 端回傳。教師檢視面板可**點任一學生列展開鑽取**:以 `parseMasterySummary` 還原後,沿用個人檔案頁同一套 `masteryRows(disc/cat)` 顯示各科別/類別正確率條與最弱項。全程**向後相容**:舊後端不回傳 `mastery` → 教師端優雅降級並提示需升級 v2.2(見 [CLOUD_SETUP.md](CLOUD_SETUP.md))。
- **母港建設疊實境/漫畫背景(#port)**:`PortScene` 依全域背景模式(模擬/實境/漫畫)選底——實境→`harbor.jpg`、漫畫→`comic_harbor.jpg`,母港建設 sprite(碼頭/倉庫/起重機/燈塔/貨櫃/停泊船)疊其上,加下半暗化 scrim 保可讀;模擬模式維持原 CSS 漸層(向後相容)。呼應 §16「後續可把 PortScene 疊到母港實景背景」的收尾。

4 changes: 2 additions & 2 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@
- **新手友善・漸進式揭露強化** — ✅ 已完成(對應 WM3 報告建議 1.2)。Tier 1(見習運維員)隱藏進階資訊以專注核心循環:三日天氣預報、技師疲勞細節改於 Tier 2 解鎖(母港與出海畫面皆然),並附「Tier 2 解鎖」提示降低認知負荷。
- **生活化比喻** — ✅ 已完成(對應 WM3 報告建議 1.2)。圖鑑為入門常見故障(齒輪箱過熱/偏航/變槳/變流器/發電機過溫·振動)加上「💡 生活化比喻」(汽車引擎、腳踏車輪軸、電腦風扇等),幫無背景玩家秒懂。
- **戲劇性(非技術)事件** — ✅ 已完成(對應 WM3 報告建議 2.2)。事件池新增環保團體抗議、負面/正面媒體報導、地方社區支持、主管機關稽查,以聲望/合規成本呈現,增加張力與代入感(不需新機制)。
- **母港建設・視覺成長** — ✅ 已完成(對應 WM3 評估報告建議 2.2)。新增「🏗 母港建設」設施:用獲利升級碼頭/倉儲/起重機/燈塔(各 3 級),母港即時預覽畫面隨之長大(更多停泊船、貨櫃、起重機、點亮燈塔招牌),把數值成長轉化為視覺成就感(純視覺、不影響計分)。後續可把 PortScene 疊到母港實景背景
- **學習成效分析(能力雷達圖 + 錯題本)** — ✅ 已完成(對應 WM3 評估報告建議 3.1/3.3)。個人檔案頁新增**各科別能力雷達圖**(視覺化既有知識點掌握度),與**錯題本**:答錯自動收錄情境/你的選擇/正解/教訓,可寫「維修檢討」反思(形成性評量)後標記已複習。純本機,免後端。後續可把掌握度同步雲端 → 教師端個別學生鑽取(報告建議 3.1)、以及獨立「測驗模式」(報告建議 3.2,需後端)。
- **母港建設・視覺成長** — ✅ 已完成(對應 WM3 評估報告建議 2.2)。新增「🏗 母港建設」設施:用獲利升級碼頭/倉儲/起重機/燈塔(各 3 級),母港即時預覽畫面隨之長大(更多停泊船、貨櫃、起重機、點亮燈塔招牌),把數值成長轉化為視覺成就感(純視覺、不影響計分)。**✅ 後續已完成:PortScene 依全域背景模式疊到母港實境(`harbor.jpg`)/漫畫(`comic_harbor.jpg`)背景**(見 [GAME_DESIGN.md](GAME_DESIGN.md) §19)
- **學習成效分析(能力雷達圖 + 錯題本)** — ✅ 已完成(對應 WM3 評估報告建議 3.1/3.3)。個人檔案頁新增**各科別能力雷達圖**(視覺化既有知識點掌握度),與**錯題本**:答錯自動收錄情境/你的選擇/正解/教訓,可寫「維修檢討」反思(形成性評量)後標記已複習。純本機,免後端。**✅ 後續已完成:掌握度同步雲端 → 教師端個別學生鑽取(#mastery-cloud,後端 v2.2)、以及獨立「測驗模式」(#exam,`exam.ts`/`ExamModal`,跨科別評量+錯題覆盤,計入掌握度但不動遊戲分數)**(見 [GAME_DESIGN.md](GAME_DESIGN.md) §19)。
- **在地化擴充** — 介面字串抽離與第三語言(如英文以外)擴充流程整理;既有雙語架構已就緒。
- **效能與測試覆蓋率提升** — 擴大 state 層測試、加入關鍵 UI 流程的回歸測試,整理大型畫面元件。

Expand Down
14 changes: 10 additions & 4 deletions docs/leaderboard-appsscript/Code.gs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@
*
* 分頁(自動建立):
* accounts: key | studentId | classCode | nickname | pinHash | createdAt
* saves: key | savedAt | state | score | day | availability | generation | nickname
* saves: key | savedAt | state | score | day | availability | generation | nickname | mastery
* records: key | updatedAt | record
* Sheet1(排行,沿用):時間 | 暱稱 | 班級碼 | 績效分 | 可用率 | 發電量 | 天數 | 學號
*
* v2.2 變更(#mastery-cloud):saves 新增第 9 欄 mastery(掌握度精簡摘要 JSON),隨存檔一併寫入;
* teacher 端回傳每位學生的 mastery,供教師面板「個別鑽取」各科別正確率。改檔後務必「新版本」重部署;
* 既有 saves 分頁的舊列第 9 欄留空即可(教師端優雅降級,不影響原有欄位)。
*/

var SIGN_SECRET = 'wfg-2026-oandm'; // 與前端 src/cloud/sheet.ts 一致(排行送分簽章)
Expand Down Expand Up @@ -120,7 +124,8 @@ function doGet(e) {
nickname: String(row2[7] || ''),
savedAt: Number(row2[1]) || 0, updatedAt: Number(row2[1]) || 0,
score: Number(row2[3]) || 0, day: Number(row2[4]) || 0,
availability: Number(row2[5]) || 0, generation: Number(row2[6]) || 0
availability: Number(row2[5]) || 0, generation: Number(row2[6]) || 0,
mastery: String(row2[8] || '') // #mastery-cloud:掌握度精簡摘要,供教師端個別鑽取
});
}
out.sort(function (a, b) { return b.score - a.score; });
Expand Down Expand Up @@ -159,10 +164,11 @@ function doPost(e) {
var key = keyOf(cls, sid);
var nick = (getAccount(cls, sid) || {}).nickname || '';
var state = String(p.state || '').slice(0, 90000);
var mastery = String(p.mastery || '').slice(0, 4000); // #mastery-cloud:掌握度精簡摘要(第 9 欄)
var rowVals = [key, Number(p.savedAt) || (new Date()).getTime(), state,
clampInt(p.score, 0, 9e8), clampInt(p.day, 0, 3650), clampInt(p.availability, 0, 100), clampInt(p.generation, 0, 9e8), nick];
clampInt(p.score, 0, 9e8), clampInt(p.day, 0, 3650), clampInt(p.availability, 0, 100), clampInt(p.generation, 0, 9e8), nick, mastery];
var row = findRow(sh, key);
if (row > 0) sh.getRange(row, 1, 1, 8).setValues([rowVals]);
if (row > 0) sh.getRange(row, 1, 1, 9).setValues([rowVals]);
else sh.appendRow(rowVals);
return json({ ok: true });
});
Expand Down
Loading
Loading