我的同人攻略

首頁/機制筆記/拆包筆記

拆包筆記

API 全表、認證、回應欄位、判定公式、戰報格式。所有機制的底本

原文 docs/20260914-拆包筆記.md

本頁目錄

#mydoujin.online《我的同人》拆包筆記

拆包日期:2026-09-14(同日以登入後的 HAR 與實機請求校正) 目標站台:https://mydoujin.online(副標「回到最粗的感動。」) 後端:https://mydoujin-backend.onrender.com(Express,跨網域,Render 代管) 前端 bundle:/assets/index-CQ9wDrWG.js單檔 640 KB,沒有分 chunk)+ /assets/index-CREjinaa.css(444 bytes)。 2026-09-14 晚間前端改版成 /assets/index-2J2Lv2aK.js(CSS 沒變):事件選項文案與行動冷卻的前端鎖都變了,見 §5 與 §8。

這是 MyKirito(mykirito.com)的同人復刻:七種行動名稱、扔屎/沾屎、茶渡、轉生點、 狗頭人王伊爾凡格,全部照原作;預設頭像檔名就叫 kirito.webp


#1. 技術棧與拆包方法

複現指令:

curl -sA "Mozilla/5.0" -o index.html https://mydoujin.online/
grep -oE 'assets/[A-Za-z0-9_.\-]+\.(js|css)' index.html   # 只有兩個檔
curl -sA "Mozilla/5.0" -O https://mydoujin.online/assets/index-CQ9wDrWG.js
node -e 'const s=require("fs").readFileSync("index-CQ9wDrWG.js","utf8");const i=s.indexOf("Jy=`https://mydoujin-backend");require("fs").writeFileSync("app.js",s.slice(s.lastIndexOf("var ",i)))'
npx prettier@3 --parser babel app.js > app.pretty.js

#2. 認證機制

token 是登入憑證,不要進版控、不要貼到任何地方。本 repo 的工具一律從環境變數 MD_TOKEN 讀。


#3. API 全表

全部相對於 https://mydoujin-backend.onrender.com。回應都是 JSON;錯誤格式 {"error": "中文訊息"}

#GET

端點說明回應要點
/api/users/me帳號id, discordId, username, nickname, activeCharacterId, personalStatus, currentFloor
/api/characters/active現役角色{character: {...}},見 §4
/api/characters全部角色+轉生點{characters:[...], reincarnation:{total, spent, available, allocated:{九維}}};每隻角色帶 characterId, level, exp, totalExp, stats, reincarnationStats, combatStats, totalCombatStats, isDead, isSoiled, name, title, imagePath, reincarnationCountreincarnationStats 就是該角色的 Lv.1 九維(base)——2026-09-17 九顆帳號實讀對出來的:同一隻跨帳號完全一致(22 隻,與等級/轉生次數/配點無關)、跟解鎖酬載的 base 逐維相符(20/20)、Lv.1 角色的 stats = 它 + 轉生配點(HP ×30、其餘 ×1)91/91 成立。所以 平常的 /api/characters 不給 base 是錯的,欄位在,只是名字叫 reincarnationStatsgrowth 仍然只有解鎖酬載給。抓法 tools/dump-roster.js
/api/action/status行動冷卻與待處理事件{lastActionAt, cooldownMs, pendingEvent, isMaxLevel};2026-09-15 起多了 serverTimecooldownRemainingMstrainingOptions[](修行中 cooldownRemainingMs 會是幾十分鐘到幾小時,ArcGrove 實測 3039689 ms ≈ 50 分鐘,產線照原本的冷卻邏輯等就好)
/api/characters/event-preferences事件偏好(2026-09-17 站方新增,bundle index-Bw98KMKC.jsPUT {deprioritizedCharacterIds:[characterId…]},回 {deprioritizedCharacterIds};現況從 GET /api/charactersdeprioritizedCharacterIds[] 讀。頁面文案:「減少所選角色的相關事件;共用事件仍可能正常出現。按『更新』儲存,轉生後保留。」只能選已取得的角色。是降權不是關掉,所以要拿新角色就把已擁有的全部列進去,池子裡剩下的就是還沒拿到的線
/api/action/train修行(2026-09-15 站方新增)POST {trainingId}trainingIdtrain1htrain2htrain4htrain8htrainingOptions[]{id,name,hours})。頁面文案:「長時間修行換取大量經驗」「將鎖定 N 小時。期間無法行動、探索或挑戰其他玩家。」給多少經驗、會不會進升級成長的加權平均,都還沒量 2026-09-16 量了train1hactionResult{exp:3600, levelUps, gains} 立刻到帳,然後 cooldownRemainingMs 3,600,000;有自己的每級配方(預算 23)、不進觸發那一級的加權、不翻倍(見 logs/20260914-升級實測.md)。不是七種行動之一,別當成免費經驗。修行鎖住期間轉生照樣成功、轉生後冷卻歸零(2026-09-17,見 §7)
/api/players?page=N&limit=10[&name=完全相符]玩家列表{players:[{id, imagePath, level, nickname, personalStatus, characterName, characterTitle, floor, isDead, isSoiled}], pagination:{hasNextPage}}
/api/players/:id單一玩家{id, nickname, character:{...}}(含 expcombatStats別人的經驗值看得到
/api/battle-reports我的戰報列表陣列,每筆 participants, reportId, battleType, result, outcomes, createdAt不含 logs
/api/battle-reports/:reportId戰報內容logs[],見 §6。不檢查戰報是不是自己的——任何 token 都讀得到任何 id(2026-09-15 實測 id 100/2000/3000 全回 200),id 有洞時回 {"error":"找不到該戰報"}。等於整座伺服器的對戰史都是公開資料:雙方等級、角色、九維、勝負都在裡面,一發 PvP 都不用打就能取樣,tools/scan-reports.js 用的就是這條
/api/dungeon/boss當層 Boss{floorNumber, name, title, imagePath, maxPartySize, bosses:[{id, skills, normalAttack, passives, stats, rewards}]};打過會回 {cleared:true, currentFloor}
/api/dungeon/party我的隊伍{viewerId, userVersion, maxPartySize, blockers[], latestBattle, party}partyidcode(六碼)/versionmembers[]

#POST / PUT

POST /api/action/explore          body {actionId}            行動(七種,見 §5)
POST /api/action/resolve          body {optionId|null}       回覆隨機事件
POST /api/players/:id/challenge   (無 body)                友好切磋(PvP)
POST /api/players/:id/chado       (無 body)                「我要茶渡你」(賭上一切的決鬥,會沾屎/死亡)
PUT  /api/users/me/status         body {personalStatus}      個人狀態(≤30 字)
PUT  /api/users/me/nickname       body {nickname}            暱稱(≤12 字,只在第一次設定時出現)
POST /api/characters/reincarnate  body {userCharacterId, allocation:{九維}, jumpToFirstFloor:bool}   // 2026-09-15 起 allocation 配的是 total(見 §7)
PUT  /api/characters/event-preferences  body {deprioritizedCharacterIds:[characterId…]}   // 事件偏好(2026-09-17 站方新加):降權這些角色的相關事件,共用事件照常;轉生後保留。讀取是 GET /api/characters 回的 deprioritizedCharacterIds(沒有 GET 這條端點,404)。工具 tools/set-event-prefs.js
POST /api/dungeon/party/:op       body {partyId, version, ...}   op 由前端拼(建立/加入/離開;帶 6 碼隊伍代碼)
POST /api/dungeon/challenge       body {requestId(uuid), partyId, version, userVersion}

/api/dungeon/challengerequestId 會先存進 localStorage["boss-challenge:<viewerId>"], 成功或 4xx 才清掉——這是冪等鍵,斷線重送同一個 requestId 不會打兩次。 2026-09-16 站方改版(bundle index-BwB6hilY.jsindex-GxexBab5.js,只差 84 bytes,共三處): ① 有一把還沒清掉的挑戰鍵時,隊伍面板不再被鎖住(舊版 blocked: !!S || w、隊伍操作也擋 E.current || S;新版都只看 busy), 所以卡住的挑戰不會再把整個 Boss 頁凍住;② 挑戰回應改成 json().catch(() => null) 安全解析, 讀不到 body 時丟新訊息「讀不到挑戰結果,請刷新後查看戰報。」(舊版直接 r.error 會炸);③ 轉生點 HP 倍率 50 → 30(見 §7)。 攻略助手不碰 Boss 頁,①②不用改;③已跟上(v1.26.1)。

2026-09-17 再改版index-IauX__kk.jsindex-BLOKYYIh.js,多 773 bytes,只差一處):轉生頁配點的「+/-」鈕改成長按連發(按住 350 ms 後每 70 ms 加減一點,onPointerDownonPointerUp),純前端 UI;轉生 HP 倍率仍是 xb={hp:30},其他沒動。

2026-09-16 再改版index-GxexBab5.jsindex-IauX__kk.js,多 89 bytes,共兩處;轉生 HP 倍率仍是 xb = {hp: 30},沒再動): ① 戰報字色表多了 FATIGUEFATIGUE_SKIP 兩種 log 型別(跟 BLOCK/COUNTER 同一色 #e2c897)——前端只有配色、沒有文案, 內容是伺服器在 logs[] 裡給的,「疲勞」機制是什麼還沒量到(推斷:戰鬥拖太長時的減益或跳過回合); ② 事件結算視窗的 rewards.bonusStats 開始支援負數t < 0 印紅字「- N 維度」,舊版寫死 +), 也就是事件可以扣能力值了產線紀錄裡還沒有一筆負數 2026-09-17 已經有 5 個選項量到負數,分兩種: 無判定、每次都扣pt_opt_006_look HP −10、pt_opt_005_drink 體 −1、pt_opt_002_hand_over 防 −1); 有判定、沒過才扣pt_opt_006_grab 攻 DC100、pt_opt_006_step_back 敏 DC75,失敗各 HP −10)。 後者讓 pt_e006_treasure_below 整個事件的規則變成「沒有成功通過判定就掉 10 HP」,10 次觀測零例外 (「過了就不扣」只有 2 筆成功樣本,還不算釘死)。 攻略助手把 bonusStats 直接加進九維、build-event-options.js 的期望值是數值加總,負數會自然算進去; event-shot.js 的圖卡文字補了負號。注意收益表的 points 是總和:有判定的選項要除以失敗次數才是「一次扣多少」。


#4. 角色物件

{
  "_id": "…", "userId": "…", "characterId": "kirito",
  "level": 10, "exp": 79,
  "name": "桐人", "title": "黑色劍士", "imagePath": "/images/characters/kirito.webp",
  "isDead": false, "isSoiled": false, "reincarnationCount": 0,
  "stats": { "hp": 1950, "atk": 45, "def": 21, "sta": 64, "agi": 34, "spd": 46, "tec": 38, "int": 22, "luk": 17 },
  "combatStats":      { "activeThrows": 0, "defenseThrows": 0, "assaultSoiled": 0, "counterSoiled": 0, "wins": 7, "losses": 0 },
  "totalCombatStats": { … 同上,跨轉生累計 … }
}

九維與前端文案:

名稱說明(照前端 yb
hpHP生命值,歸零即倒下。轉生點每點 +30+50,站方 2026-09-16 03:07 UTC 前後改的,見 §7)
atk攻擊影響普通攻擊與技能傷害
def防禦減少受到的傷害
sta體力影響持續作戰能力與部分技能發動
agi敏捷影響迴避與攻擊命中
spd反應速度決定先攻、連擊次數,以及額外回合
tec技巧影響命中、爆擊傷害,以及反擊機率
int智力影響法術傷害與治療量
luk幸運最神奇的屬性,能在戰鬥中造成意想不到的效果

combatStats 的中文(主頁右半欄):主動扔屎/防衛扔屎/總主動扔屎/總防衛扔屎/遭襲沾屎/遭反殺沾屎/勝場/敗場/總勝場/總敗場。 isDead=「你的角色死亡了,請進行轉生」、isSoiled=「你的角色沾到屎了,請進行轉生」—— 兩句都只是畫在頁面頂端的橫幅,但只有 isDead 真的擋住行動。 兩者都要轉生才能繼續。 更正(2026-09-16,翻 bundle 查證):前端每一個擋行動的判斷式 (行動鈕、自律行動、Boss 挑戰、事件回覆)讀的都只有 isDeadisSoiled 全檔只出現在 那條橫幅(常數 pb)與一個文字顏色裡,沒有任何一處拿它當閘門。 所以沾屎不影響練功,只是掛著一條咖啡色的羞辱橫幅、要不要轉生洗掉是玩家自己的事。 這件事很重要:先前把沾屎當成「必須轉生」,會讓人以為輸掉茶渡=等級歸零, 因而不敢用茶渡——實際上輸了沒有任何機制上的損失。

exp 是「本級累積」:升級後從溢出量重新起算(實測 Lv.11 exp 177 → 九次休息 +180 → Lv.12 exp 16)。 前端沒有任何等級經驗表,「還差多少升級」只能靠觀察升級瞬間反推(攻略助手會自己學)。


#5. 行動(/api/action/explore

actionId名稱實測 exp
hunt狩獵20
training自主訓練20
picnic外出野餐20
flirt汁妹20
charity做善事20
rest坐下休息20
fishing釣魚20

七種行動都固定 +20 exp,跟等級、角色、行動種類都無關(2026-09-16 從九條產線的 全部 explore 紀錄回推,Lv.1~41 沒有一筆例外)。所以選哪個行動不影響升級速度, 只影響長出來的能力值——行動配方是為了戰力,不是為了衝等。

滿級是 Lv.100,滿級後 /api/action/explore 直接回 400(2026-09-16 23:20 牙王 Lv.100 實測 14 發狩獵): {"error":"Character has reached max level (100). Cannot explore further."},經驗 0、沒有事件。/api/action/statusisMaxLevel: true。 所以滿級後拿不到事件、解不了角色,要繼續走事件線只能轉生;能做的只剩 PvP 與 Boss。修行在 Lv.99 按會封頂在 100,多的 exp 作廢。

#5.1 經驗曲線(2026-09-16 量出來)

把每一級之間的 actionResult.exp 加總,就是那一級所需的經驗。Lv.2~38 都對得上:

每級所需經驗 = 20 × round(1.75 × 等級)

(Lv.20 → 700、Lv.28 → 980、Lv.31 → 1080、Lv.38 → 1320,全部零誤差。) 事件不給經驗——每級的加總只靠行動就補得滿,沒有缺口。

推論(Lv.38 以上是外推,標推斷值):升一級要 round(1.75 × 等級) 次行動, Lv.40 是 70 次、Lv.69 是 121 次。冷卻 10 秒,所以一小時最多約 348 次行動 ≈ 6,960 exp, 而每小時 600 發的額度只用掉約 380 發——綁住產能的是 10 秒冷卻,不是請求額度, 把 --rph 調高一點用都沒有。

回應:

{
  "lastActionAt": "2026-09-14T11:49:47.499Z", "cooldownMs": 10000,
  "pendingEvent": null,
  "actionResult": { "actionId": "rest", "actionName": "坐下休息", "exp": 20, "level": 7, "levelUps": 0,
                    "gains": { "hp": 0, "atk": 0, … 九維 … } }
}
{ "error": "行動冷卻中,請等待 29 秒。", "code": "ACTION_COOLDOWN",
  "cooldownRemainingMs": 28432, "retryAfter": 29, "serverTime": "2026-09-14T14:51:57.697Z" }

cooldownRemainingMs 比從中文訊息挖數字可靠(訊息是無條件進位的整數秒); serverTime 可以拿來校正本機時鐘——冷卻是用伺服器給的 lastActionAt 跟「現在」比, 本機時鐘偏幾秒就會提早送出去撞冷卻。回應的 HTTP Date header 也可以當備援(只到秒)。

等級分佈 0s:137 10s:37 20s:28 30s:26 40s:60 50s:26 60s:32 70s:27 80s:11 90s:6 100s:2 最高 Lv.100 赤羽和一、Lv.100 numberman —— 只有兩人,一個都沒有超過

100 這個數字是從全站分佈推的,不是拆包拿到的isMaxLevel 由伺服器算, 前端沒有任何等級上限常數。但 392 人裡有兩個剛好卡在 100、101 以上一個都沒有, 而 90s 還有 6 人,這個形狀是硬上限而不是「還沒有人練到」。 掃法:/api/players?page=N&limit=10 一頁 10 人,40 頁掃完全站。 九個帳號跑到現在一次都沒觸發過 isMaxLevel(最高才 Lv.83),所以那個旗標本身還沒實地驗過。

這件事會改變練功規劃:等級到頂之後,攻擊只剩兩條路——轉生點配到 atk(一點 +1), 以及事件的 bonusStats。而轉生點只能在轉生時重配,轉生又把等級打回 1, 所以「練到滿級再把點數挪過去」是做不到的,要嘛轉生前就配好、要嘛整輪重練。

#5.0a 事件偏好:把已擁有的角色線降權(2026-09-17 04:45,站方新增)

主頁多了「事件偏好」區塊,可多選已取得的角色,按「更新」送 PUT /api/characters/event-preferences。效果是降低那些角色線事件的出現率(不是關掉), 共用事件(公佈欄、訓練場等樞紐)照常。轉生後保留。實測 ArcGrove 在我們動手前已被設成 6 隻(桐人/牙王/艾基爾/食糞者/亞絲娜/詩乃,人手動設的)。 04:45 兩顆產線帳號改成「已擁有的全部降權」:ArcGrove 14 隻、LysanderSup 11 隻——剩下會正常出的就是還沒拿到的線 (ArcGrove 缺 瑞傑路德/莉茲貝特/小八/磚頭/芋頭;LysanderSup 缺 牙王/灰燼/莉茲貝特/哥布林英雄/芙莉蓮/小八/磚頭/食糞者)。 之後拿到新角色要再把它加進去,不然那條線會繼續佔池子。工具:MD_TOKEN=<token> node tools/set-event-prefs.js --all-owned(另一位 AI 同日寫的,桐人除外)。

同一版 bundle(比 index-BLOKYYIh.js 多 71 KB)其他可見的新字串:轉生頁「按住 + 或 - 可以連續加減點」「轉生點每點 +N 某維」、玩家頁「沒有上陣角色」「無稱號」、冷卻文案; 端點只多這一條。降權的實際幅度還沒量——要拿降權前後同一帳號的事件線分布比,先記著。

#5.0 角色取得不只靠事件(2026-09-17,官方 Discord #啵啵村)

作者「大木」被問「角色獲取方式只有透過事件嗎」,答「不是」;接著說「這遊戲的精髓就是怎麼獲得角色的都不知道」。 玩家丟出的猜法:個人狀態打特定文字、用特定角色茶渡人、「光是吃十次屎就是例外了」。

「吃屎」這條我們的資料直接證實:帳號對照 totalCombatStats(跨轉生累計;combatStats 每次轉生歸零, ly183 轉生後 combatStats.counterSoiled 是 0、totalCombatStats.counterSoiled 才是 885)與可轉生名單: counterSoiled(主動茶渡輸掉沾屎)880~890 次的 ly183、eth2000、onejun3096 全有食糞者,ArcGrove 59 次也有(人 9/17 補的), 0~3 次的 jun184、season0320、jy03work、leotek7414、LysanderSup 全沒有——4/4 對 0/5。 食糞者(詛咒的播種者)= 沾屎累積 N 次解鎖,門檻落在 7~59 次之間(Discord 玩家說 10 次)。這跟 5.1 的事件線完全無關,gainCharacters 出現在哪一發回應裡還沒抓到 (三顆都是 9/15 茶渡刷勝場時拿到的,當時 chado.js 不記 gainCharacters)。 再加兩顆對照(2026-09-17 04:40,另一位 AI 查 /api/characters/api/characters/active:ArcGrove totalCombatStats.counterSoiled 59(assaultSoiled 1)食糞者;LysanderSup counterSoiled 3(assaultSoiled 3)沒有——變成 4/4 對 0/5,門檻落在 7~59 之間,跟「10 次」不矛盾。注意 combatStats 每次轉生歸零(ArcGrove 轉成洛琪希後全是 0),累計要看 totalCombatStats大蒜:ly183 與 leotek7414 有、其餘沒有,共同點還沒找到(leotek 到過 Lv.100;garlic_ 前綴的事件只遇過 5 次、0 解鎖)。 索拉爾(太陽戰士,solaire:2026-09-17 發現只有 jun184 有(其餘六顆都沒有)。查證過程:

結論:最可能是轉生回應給的,但分不出是「離開灰燼」還是「轉生成石頭」——只有 jun184 同時做了這兩件事。 level-probe.js 已改成把轉生回應整包存下來並在 log 上印「★ 轉生同時解鎖:…」,下一次任何帳號轉生就會抓到, 不必為了驗這件事特地燒一次轉生。

2026-09-17 補:Lv.1 九維撈到了,成長權重還沒。 解鎖酬載是找不回來了,但 GET /api/charactersreincarnationStats(見 §3 那一列)就是 base,所以索拉爾的 Lv.1 九維直接讀得到: {hp:420, atk:20, def:22, sta:21, agi:11, spd:13, tec:18, int:11, luk:8}(食糞者 {hp:510, atk:23, def:22, sta:22, agi:7, spd:9, tec:11, int:9, luk:8},同樣沒有酬載)。 兩隻都已進圖鑑,source 標「名冊 reincarnationStats」。 growth 這條路拿不到,要補齊只有兩個辦法:再解鎖一次(別顆帳號解到就有酬載), 或轉生成它、本級零行動按修行——長出來的每級成長就是 growthWeights(HP × 30,牙王與洛琪希都驗過)。 後者要燒掉 jun184 現役石頭 Lv.51 的進度,是回不去的操作,等人決定個人狀態文字PUT /api/users/me/status)、特定角色茶渡:未測。PvP 目前人禁到 Lv.100,後者等解禁再試。

#5.1 隨機事件(pendingEvent/api/action/resolve

{ "eventId": "agil_e001_market_row", "name": "迷宮區前的攤子",
  "description": "……(劇情文字)",
  "options": [ { "id": "agil_opt_001_haggle", "name": "……", "checkStat": "int", "baseDC": 50,
                 "effectiveStat": 18, "successChance": 69 },
               { "id": "agil_opt_002_leave",  "name": "……", "checkStat": null } ] }

successChance 是官方值,不用自己算(2026-09-14 補)。只要 checkStat 不是 null, 選項就一定帶 effectiveStatsuccessChance:實測 3414 個有判定的選項全部都有, 而且跟事後 /api/action/resolve 回來的 chance 一個不差(1538 筆零誤差比對)。 checkStat 是 null 的選項沒有這兩個欄位(也不需要,那種選項不擲骰)。 所以工具與 userscript 都直接讀它,推斷公式只留當後備。

沒有 options 的事件前端送 {optionId: null}。回覆結果:

{ "stat": "int", "statValue": 24, "effectiveStat": 10, "roll": 30, "total": 40, "dc": 50, "chance": 61,
  "critical": null, "isSuccess": false, "text": "……結果文字……",
  "rewards": null | { "exp": N, "bonusStats": { "atk": 1, … } },   // 2026-09-16 新 bundle 起前端支援負值,事件可能扣能力
  "battleResult": null | { "winner": "TEAM_A|TEAM_B|…", "logs": [...] },
  "gainCharacters": [ { "id", "name", "title", "imagePath", "base": {九維}, "growth": {九維}, "normalAttack", "skills": [] } ]
                                                 // 解鎖新角色,「將可於下次轉生時使用」。base 是 Lv.1 九維、growth 是成長權重(九維合計 25),
                                                 // 平常的 /api/characters 不給這兩個,只有這一刻有(2026-09-16,全表在 docs/20260916-角色數值圖鑑.json)
}

判定規則(20 個樣本,logs/20260914-升級實測.md 有全表):

規則樣本結果
chance = 101 − dc + effectiveStat上限 95522517 筆直接吻合;另外 5 筆算出來會是 157~176,全部回 95
isSuccess ⟺ effectiveStat + roll ≥ dc(等價 roll > 100 − chance522521 筆吻合,唯一例外是大失敗(見下)
roll ≤ 5critical: "fail"一律失敗2727/27。其中一筆 eff 111 + roll 3 = 114 ≥ dc 50 仍然失敗——所以大失敗是覆寫,不是加減
roll ≥ 96critical: "success"2222/22 都成功,但 22 筆本來就都過得了,「大成功會覆寫失敗」還沒有反例證實
其餘 roll 一律 critical: null473無例外

roll 實測涵蓋 1~100、平均 53.2,是乾淨的 1d100。校準也對得上:522 筆的 chance 加總預期 332.4 次成功,實際 348 次。 上限 95 的來源就是大失敗(5% 一定失敗),所以下限推測是 5,但樣本最低只到 14,沒證實dc 實測有 50/75/100 三種(先前寫「全是 50」已過時)。

Lv34568121417181920
值÷eff1.031.191.301.461.782.402.543.083.193.313.29

同一級不同能力值的三筆(Lv.4 的 24/17/15 → 20/14/13)比值都是 1.15~1.21,確認除數只看等級。 推斷值effectiveStat ≈ 能力值 ÷ (0.6 + 等級/7),誤差 ±1(低等級吻合得好,Lv.20 那筆差 1)。 確切常數要更多等級的樣本才能定,這裡只用來排序,不當數值報。


#6. 戰鬥與戰報


#6.1 Boss(2026-09-14 實測補上)

#7. 轉生


2026-09-16 11:07 瑞傑路德線破了(your88,Lv.80):結局關 rj_e008_the_written_name「留在委託書上的名字」只有一個選項「邀他繼續同行」(rj_opt_008_invite,無判定), 選了就解鎖 瑞傑路德·斯佩路迪亞(Dead End)+體力 +1。酬載:base HP 420/攻 21/防 15/體 17/敏 15/速 18/技 23/智 7/幸 8, growth 3,4,3,3,3,3,4,1,1,技能 superd_spear_thrust/third_eye/guardian_spear_sweep。 旗標(build-routes 推論,到過 1 隻/沒到過 22 隻):確定是第七關「你守這邊」選「留下擋住追兵,讓他護送孩子」(rj_opt_007_hold,會開打, 販奴車隊追兵;your88 Lv.80 打贏),打贏後下一個 rj 事件就是結局關。第二、第五關的四個「很可能」旗標只是 your88 剛好都選過,證據弱。 這一關的路徑:e001 先離開 ×4 → e002 暫時離開 ×2、等孩子把話說完 → e005 先把補給帶走、當眾說出 → e007 留下擋住追兵(勝)→ e008。

2026-09-17 芙莉蓮線的結局關兩個選項都給角色:ArcGrove 04:25 在 frieren_e006_departure「再走一段路」選 frieren_opt_006_join 解鎖,LysanderSup 09:30 同一關選 frieren_opt_006_bless 也解鎖(前面走 隱藏魔力→問、擬態寶箱→檢查、魔族的謊言→站住、花田→摘)。所以這一關不是「選對才給」,到得了結局關就有;旗標在前面幾關。

2026-09-17 06:16 索隆線破了(LysanderSup,Lv.42 莉妮耶):結局關 zoro_e004_the_way_back「回去的路」選 zoro_opt_e004_true(從沒人選過、無判定),解鎖 羅羅亞·索隆(三刀流劍士)。酬載:base HP 390/攻 22/防 15/體 20/敏 12/速 18/技 20/智 6/幸 8,growth 2,4,3,4,2,3,4,1,2(合計 25),普攻 basic_attack,技能 purgatory_oni_giri/black_rope_dragon_twister/three_thousand_worlds,被動 zoro_draw_swords/zoro_swordsman_will。這顆帳號走的路:e001「每一條路都通往別的地方」直接指一條路給他 → e002「三把刀的空位」不問目的地跟著他走 → e003「第三把刀」坐在旁邊不再追問 → e004。06:26 ArcGrove 走一模一樣的四步也解鎖了(2/2),這條路徑可以當攻略寫;旗標的強弱要等有完整紀錄的機器重跑 build-routes。索隆線的入口在公佈欄/十字路口的 daily_opt_crossroads_zoro_map

#8. 前端行為備忘(寫 userscript 要知道的)

#6.2 隊伍與 Boss 的規則(2026-09-15 實測)

#6.3 全站有 11 個角色(2026-09-15,掃 300 名玩家)

/api/characters 只回自己已解鎖的角色,列舉不到完整名單; 但 /api/players 會回每個玩家的 characterNamecharacterTitleimagePath,掃過去就看得到全部:

角色稱號圖檔300 人中對應事件線
桐人黑色劍士kirito238預設
亞絲娜閃光asuna13sao
詩乃冰之狙擊手sinon10sinon
哥布林英雄逆襲的綠皮goblin_hero10gh(未證實)
洛琪希·米格路迪亞水王級魔術師roxy9roxy(未證實)
梅琳娜木頭melina8mel
食糞者詛咒的播種者dung_eater5不明
莉茲貝特鍛冶師lisbeth3liz(未證實)
牙王Aincrad解放部隊kibaou2kibaou
瑞傑路德·斯佩路迪亞Dead Endruijerd1rj(未證實)
艾基爾商人agil1agil

四條「看起來沒有角色獎勵」的線(gh/roxy/liz/rj)各自都有一個對應的角色存在, 所以那幾條線幾乎確定還有一關我們沒觸發過。對應關係是照名字推的,還沒實際解鎖過任何一個。

食糞者對不上任何事件線。名字與稱號(詛咒的播種者)指向扔屎/沾屎那套 PvP 機制,但沒有證據。

#6.4 靜態站可以探角色圖檔:第 12 個角色 eris(2026-09-15)

前端 bundle 裡沒有任何角色資料(名字、id、解鎖條件全在後端;bundle 只寫死了預設圖 kirito.webp), 所以拆前端拆不出「怎麼解鎖」。但角色圖檔放在靜態站 https://mydoujin.online/images/characters/<id>.webp, 可以用猜 id 的方式探:不存在的路徑 SPA 也回 200(回的是 index.html),要看 Content-Type 是不是 image/webp, 只看狀態碼會全部誤判成存在。

探了約 130 個候選 id(SAO/無職轉生/艾爾登法環/哥布林殺手的角色名),存在的圖檔剛好是 §6.3 的 11 個加上一個:

圖檔推測300 名玩家裡對應事件線
eris艾莉絲(無職轉生)0不明——沒有任何一條已知事件線指向她

同日稍晚再探到 shanks(香克斯,海賊王;人問「香克斯怎麼拿」)——海賊王那一串(luffy/zoro/nami/…/mihawk/buggy,共 40 個) 只有 shanks 存在,所以是單一角色不是整條線。全部圖檔的 last-modified 都是同一個部署時間,看不出誰是新加的。

也就是全站至少有 13 個角色,其中 erisshanks 在 9/15 早上掃的 300 名玩家裡都是 0 人。 要查「誰拿到了」用 tools/scan-players.js --find 香克斯(拿自己的 token 掃 /api/players)。她可能藏在還沒觸發過的關卡裡 (洛克希線與瑞傑路德線都是無職轉生的人物,最可能是這兩條線的分支),也可能根本還沒開放。 Boss 圖檔同一招:images/boss/illfang.webp 存在(狗頭人王),ilfangkobold_lord 不存在。

這只證明「圖檔存在」,不證明「拿得到」;解鎖條件仍然只能靠產線踩出來。

#6.5 角色的 Lv.1 九維與成長權重來自解鎖酬載;公佈欄的選項數會跟著跑過的線增加(2026-09-16)