Back to discovery
三界
Interactive · 简体中文

三界

Experience the love and hate of cultivators in a completely fictional world. The game is still in the works. The main service is currently inaccessible. It will be opened again after the production of the subsequent game is completed. Thank you for your support (Note that the game is not completely free. In the future, when the completion of the game production reaches a certain stage, the premium membership subscription and payment 🎬 在线互动短剧入口:https://media.huangguodrama.ai/motion/interactive/steam-fmv-2442960/index.html

Interactive

Now playing

Original audio

Confirm you are 18 or older to enable playback.

Continue With Interactive Roleplay & Novel Adaptation

Keep exploring the world of 三界: chat with AI characters in interactive roleplay, read full web novel adaptations, or binge multi-episode vertical dramas across the Huangguo network.

Watch and read details

Available now
4 available images · preview available
Audio
Not specified
Preview runtime
Not recorded
Preview subtitles
No subtitle tracks listed
Reading language
简体中文

Content record updated .

Availability describes the media currently listed here. A preview is not a complete series; more episodes or a release schedule are not promised.

Read & Watch 三界 Online — FAQ

Explore 三界 online in your browser on Reelshorts. 4 available images · preview available.

Where can I read or watch 三界 online?
You can explore 三界 directly in your browser on Reelshorts (https://reelshorts.app/title/1014409). Current availability: 4 available images · preview available.
What other collections are available on Reelshorts?
Browse Readable Novels, Short Dramas to Watch Online, Alpha King & Fated Mate Wolf Pack Dramas, Revenge Heiress & Betrayed Wife Comeback, Secret Billionaire Baby & Hidden Identity, Best Free DramaBox & ShortMax Alternatives, Top Chinese Short Dramas with English Subtitles, and Visual Stories in the Huangguo catalog.
简体中文

互动短剧分支指南与在线入口

【三界 · 互动短剧分支指南】

来源/类型:Steam FMV (TheWorldGameStudio)

在线互动播放器:https://media.huangguodrama.ai/motion/interactive/steam-fmv-2442960/index.html

总节点数:12 个视频分支节点

■ 剧情简介:

Experience the love and hate of cultivators in a completely fictional world.

The game is still in the works. The main service is currently inaccessible. It will be opened again after the production of the subsequent game is completed. Thank you for your support

(Note that the game is not completely free. In the future, when the completion of the game production reaches a certain stage, the premium membership subscription and payment

■ 完整分支节点图谱:

• [open] 第1幕:命运序章 · 三界 —— 选项/结局:A 正面破局:直视她的眼睛追问真相(主线A) / B 暗中布局:顺着她的心意继续试探(主线B) / C 隐藏支线:触发特殊信物开启秘密契约(隐藏线) (https://media.huangguodrama.ai/motion/drama-episodes/7de93dfc836da0877e3af119f43598aea289862dab2e4777edaa9c7f897bcb0c.mp4)

• [a1] 第2幕【A线】:近距离交锋与心跳抉择 —— 选项/结局:坚定握住她的手表露真心 / 保留底牌直接进入终局对峙 (https://media.huangguodrama.ai/motion/drama-episodes/7dfe88d60b210bc43a3df628ad1430956b668e9c21d4536788048e1962454ba8.mp4)

• [a2] 第3幕【A线】:卸下防备后的深夜独处 —— 选项/结局:许下专属承诺直通高甜结局 / 携手迎战最终风暴 (https://media.huangguodrama.ai/motion/drama-episodes/7e2808ba76a63c62d4eb007ef29c29beafec09288e9daaf83a0d5d08ae493ef4.mp4)

• [b1] 第2幕【B线】:微醺光影下的暗流涌动 —— 选项/结局:顺水推舟应下她的私人邀约 / 识破伏笔反客为主 (https://media.huangguodrama.ai/motion/drama-episodes/7e4c9ed5751610f482f8b1be58ef4a1a3d42bedf56875d752e558158a31267d9.mp4)

• [b2] 第3幕【B线】:天台夜风里的真情流露 —— 选项/结局:用行动证明心意解锁甜蜜结局 / 带着关键线索进入终极决断 (https://media.huangguodrama.ai/motion/drama-episodes/7ec62b6f44923ce7f31ab247f055002d63a2f646c98da2fa39d0e071b7b69c00.mp4)

• [c1] 第2幕【C线】:密室暗格与隐藏同盟 —— 选项/结局:与她结成秘密同盟共渡难关 / 孤身犯险闯入禁区 (https://media.huangguodrama.ai/motion/drama-episodes/7ec7d6aeae1fa11a062698bf72da0be05801cd88caf6c35983eeb0c5824a0199.mp4)

• [c2] 第3幕【C线】:反转揭晓前的生死默契 —— 选项/结局:亮出最终底牌进入终局审判 / 急流勇退远走高飞 (https://media.huangguodrama.ai/motion/drama-episodes/7ed8e7e393243bd72a5e1f6c25417d09354d28d001a893b4b79775cb51a5a995.mp4)

• [climax] 第4幕【终极抉择】:命运分岔口的最后十秒 —— 选项/结局:★ 集齐所有线索与羁绊(解锁完美真结局) / 坚定选择挚爱共度余生(甜蜜结局) / 全身而退保留潇洒转身(普通结局) / 一步踏错跌入宿命迷局(遗憾结局) (https://media.huangguodrama.ai/motion/drama-episodes/7ef8cf1eb52b846711d5ea5563da4af8c9df8646848ad9901dc9643c25ff96c6.mp4)

• [end_happy] 甜蜜结局:星光落满肩头的相拥 —— 选项/结局:[HAPPY END] (https://media.huangguodrama.ai/motion/drama-episodes/7f0025f16089623ba270de38afa12f4c7da7f4e76816a3a5c17581390f03614d.mp4)

• [end_normal] 普通结局:风平浪静后的重逢之约 —— 选项/结局:[NORMAL END] (https://media.huangguodrama.ai/motion/drama-episodes/7f046d9528414fa35a6f4b10a5b6a0e31a7d9ae62f4b7ac13b317f780cf29dac.mp4)

• [end_bad] 遗憾结局:错失良机的午夜背影 —— 选项/结局:[BAD END] (https://media.huangguodrama.ai/motion/drama-episodes/7f0ffe8f46496598c204c62df454364c39b456f3c2db9941b820965a918cc2a0.mp4)

• [end_true] 完美真结局:三界·宿命圆满 —— 选项/结局:[TRUE END] (https://media.huangguodrama.ai/motion/drama-episodes/7f28492109c5082479c39a2c918e458ec752b651cd3d9587a8a6517ba6fb8889.mp4)

分支剧情节点图谱 (JSON Graph)

{

"slug": "steam-fmv-2442960",

"title": "三界",

"en_title": "三界 (Interactive FMV #2442960)",

"player_url": "https://media.huangguodrama.ai/motion/interactive/steam-fmv-2442960/index.html",

"start": "open",

"nodes": {

"open": {

"id": "open",

"title": "第1幕:命运序章 · 三界",

"act": 1,

"route": "序章主线",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7de93dfc836da0877e3af119f43598aea289862dab2e4777edaa9c7f897bcb0c.mp4",

"ending": false,

"choices": [

{

"label": "A 正面破局:直视她的眼睛追问真相(主线A)",

"to": "a1"

},

{

"label": "B 暗中布局:顺着她的心意继续试探(主线B)",

"to": "b1"

},

{

"label": "C 隐藏支线:触发特殊信物开启秘密契约(隐藏线)",

"to": "c1"

}

]

},

"a1": {

"id": "a1",

"title": "第2幕【A线】:近距离交锋与心跳抉择",

"act": 2,

"route": "A线·破局",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7dfe88d60b210bc43a3df628ad1430956b668e9c21d4536788048e1962454ba8.mp4",

"ending": false,

"choices": [

{

"label": "坚定握住她的手表露真心",

"to": "a2"

},

{

"label": "保留底牌直接进入终局对峙",

"to": "climax"

}

]

},

"a2": {

"id": "a2",

"title": "第3幕【A线】:卸下防备后的深夜独处",

"act": 3,

"route": "A线·升温",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7e2808ba76a63c62d4eb007ef29c29beafec09288e9daaf83a0d5d08ae493ef4.mp4",

"ending": false,

"choices": [

{

"label": "许下专属承诺直通高甜结局",

"to": "end_happy"

},

{

"label": "携手迎战最终风暴",

"to": "climax"

}

]

},

"b1": {

"id": "b1",

"title": "第2幕【B线】:微醺光影下的暗流涌动",

"act": 2,

"route": "B线·博弈",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7e4c9ed5751610f482f8b1be58ef4a1a3d42bedf56875d752e558158a31267d9.mp4",

"ending": false,

"choices": [

{

"label": "顺水推舟应下她的私人邀约",

"to": "b2"

},

{

"label": "识破伏笔反客为主",

"to": "climax"

}

]

},

"b2": {

"id": "b2",

"title": "第3幕【B线】:天台夜风里的真情流露",

"act": 3,

"route": "B线·倾心",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7ec62b6f44923ce7f31ab247f055002d63a2f646c98da2fa39d0e071b7b69c00.mp4",

"ending": false,

"choices": [

{

"label": "用行动证明心意解锁甜蜜结局",

"to": "end_happy"

},

{

"label": "带着关键线索进入终极决断",

"to": "climax"

}

]

},

"c1": {

"id": "c1",

"title": "第2幕【C线】:密室暗格与隐藏同盟",

"act": 2,

"route": "C线·暗涌",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7ec7d6aeae1fa11a062698bf72da0be05801cd88caf6c35983eeb0c5824a0199.mp4",

"ending": false,

"choices": [

{

"label": "与她结成秘密同盟共渡难关",

"to": "c2"

},

{

"label": "孤身犯险闯入禁区",

"to": "end_bad"

}

]

},

"c2": {

"id": "c2",

"title": "第3幕【C线】:反转揭晓前的生死默契",

"act": 3,

"route": "C线·共鸣",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7ed8e7e393243bd72a5e1f6c25417d09354d28d001a893b4b79775cb51a5a995.mp4",

"ending": false,

"choices": [

{

"label": "亮出最终底牌进入终局审判",

"to": "climax"

},

{

"label": "急流勇退远走高飞",

"to": "end_normal"

}

]

},

"climax": {

"id": "climax",

"title": "第4幕【终极抉择】:命运分岔口的最后十秒",

"act": 4,

"route": "终章抉择",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7ef8cf1eb52b846711d5ea5563da4af8c9df8646848ad9901dc9643c25ff96c6.mp4",

"ending": false,

"choices": [

{

"label": "★ 集齐所有线索与羁绊(解锁完美真结局)",

"to": "end_true"

},

{

"label": "坚定选择挚爱共度余生(甜蜜结局)",

"to": "end_happy"

},

{

"label": "全身而退保留潇洒转身(普通结局)",

"to": "end_normal"

},

{

"label": "一步踏错跌入宿命迷局(遗憾结局)",

"to": "end_bad"

}

]

},

"end_happy": {

"id": "end_happy",

"title": "甜蜜结局:星光落满肩头的相拥",

"act": 4,

"route": "结局",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7f0025f16089623ba270de38afa12f4c7da7f4e76816a3a5c17581390f03614d.mp4",

"ending": "HAPPY END",

"choices": []

},

"end_normal": {

"id": "end_normal",

"title": "普通结局:风平浪静后的重逢之约",

"act": 4,

"route": "结局",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7f046d9528414fa35a6f4b10a5b6a0e31a7d9ae62f4b7ac13b317f780cf29dac.mp4",

"ending": "NORMAL END",

"choices": []

},

"end_bad": {

"id": "end_bad",

"title": "遗憾结局:错失良机的午夜背影",

"act": 4,

"route": "结局",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7f0ffe8f46496598c204c62df454364c39b456f3c2db9941b820965a918cc2a0.mp4",

"ending": "BAD END",

"choices": []

},

"end_true": {

"id": "end_true",

"title": "完美真结局:三界·宿命圆满",

"act": 4,

"route": "真结局",

"video": "https://media.huangguodrama.ai/motion/drama-episodes/7f28492109c5082479c39a2c918e458ec752b651cd3d9587a8a6517ba6fb8889.mp4",

"ending": "TRUE END",

"choices": []

}

}

}

HTML5 互动短剧独立播放器 (index.html)

<!doctype html>

<html lang="zh-CN">

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">

<title>三界 · 三界 (Interactive FMV #2442960) | 互动短剧播放器</title>

<style>

:root {

--bg: #0c0a12; --surface: #161222; --surface-2: #221c34;

--line: rgba(255,255,255,0.14); --text: #f8f5ff; --muted: rgba(248,245,255,0.65);

--accent: #ec4899; --accent2: #38bdf8;

--good: #34d399; --gold: #fbbf24; --bad: #f87171;

}

* { box-sizing: border-box; }

html, body { margin: 0; background: var(--bg); color: var(--text); font: 15px/1.6 -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; min-height: 100svh; }

button { font: inherit; color: inherit; cursor: pointer; }

.app { max-width: 1024px; margin: 0 auto; min-height: 100svh; display: flex; flex-direction: column; }

.bar { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: rgba(22,18,34,0.88); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line); }

.bar h1 { flex: 1; margin: 0; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.bar .sub { font-size: 12px; color: var(--muted); margin-left: 8px; font-weight: 400; }

.chip { border: 1px solid var(--line); background: rgba(255,255,255,0.05); border-radius: 999px; padding: 5px 12px; font-size: 12px; white-space: nowrap; transition: .2s; }

.chip:hover { border-color: var(--accent); background: rgba(255,255,255,0.12); }

.stage-wrap { position: relative; background: #000; width: 100%; aspect-ratio: 16 / 9; max-height: 76svh; overflow: hidden; }

video { width: 100%; height: 100%; object-fit: contain; display: block; background: #000; }

.stage-wrap.frozen video { filter: brightness(0.48) saturate(0.85) blur(2px); transition: filter .35s; }

.hud { position: absolute; inset: auto 0 0; padding: 20px 14px 10px; background: linear-gradient(transparent, rgba(0,0,0,0.82)); display: flex; align-items: center; gap: 10px; font-size: 12px; }

.track { flex: 1; height: 5px; border-radius: 99px; background: rgba(255,255,255,0.24); position: relative; cursor: pointer; }

.fill { position: absolute; inset: 0 auto 0 0; background: linear-gradient(90deg, var(--accent), var(--accent2)); border-radius: 99px; width: 0%; }

.skip-btn { position: absolute; right: 14px; top: 14px; border: 1px solid rgba(255,255,255,0.35); background: rgba(12,10,18,0.68); backdrop-filter: blur(8px); border-radius: 999px; padding: 6px 14px; font-size: 13px; z-index: 5; }

.skip-btn:hover { border-color: var(--accent); }

.choice-overlay { position: absolute; inset: 0; display: none; flex-direction: column; justify-content: flex-end; padding: 28px 24px; background: linear-gradient(180deg, rgba(12,10,18,0.15) 0%, rgba(12,10,18,0.92) 65%); z-index: 10; }

.choice-overlay.show { display: flex; animation: fadeIn .3s ease; }

.choice-kicker { font-size: 12px; letter-spacing: .14em; text-transform: uppercase; color: var(--accent2); font-weight: 700; margin-bottom: 4px; }

.choice-title { margin: 0 0 14px; font-size: 20px; font-weight: 800; text-shadow: 0 2px 10px rgba(0,0,0,0.6); }

.options { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px; }

.opt { display: flex; align-items: center; gap: 12px; padding: 13px 16px; border-radius: 14px; border: 1px solid rgba(255,255,255,0.22); background: rgba(22,18,34,0.82); backdrop-filter: blur(10px); text-align: left; transition: transform .15s, border-color .15s, background .15s; }

.opt:hover { transform: translateY(-2px); border-color: var(--accent); background: rgba(255,255,255,0.12); }

.opt .key { width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; background: linear-gradient(135deg, var(--accent), var(--accent2)); color: #fff; font-weight: 800; font-size: 14px; flex: none; }

.opt .lbl { flex: 1; font-size: 15px; font-weight: 600; }

.timer-bar { height: 4px; border-radius: 4px; background: rgba(255,255,255,0.16); overflow: hidden; margin-top: 12px; }

.timer-bar i { display: block; height: 100%; background: linear-gradient(90deg, var(--accent), var(--accent2)); width: 100%; transition: width 12s linear; }

.below { padding: 16px; display: flex; flex-direction: column; gap: 12px; }

.status-card { padding: 14px 16px; border-radius: 14px; background: var(--surface); border: 1px solid var(--line); display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; }

.status-card .route-tag { color: var(--accent2); font-size: 12px; font-weight: 700; letter-spacing: .08em; }

.status-card h2 { margin: 2px 0 0; font-size: 17px; }

.breadcrumbs { display: flex; flex-wrap: wrap; gap: 6px; }

.breadcrumbs span { font-size: 12px; padding: 3px 10px; border-radius: 999px; background: var(--surface-2); color: var(--muted); }

.ending-modal { display: none; padding: 20px; border-radius: 16px; background: linear-gradient(145deg, var(--surface), var(--surface-2)); border: 1px solid var(--accent); flex-direction: column; gap: 12px; }

.ending-modal.show { display: flex; }

.ending-badge { display: inline-block; align-self: flex-start; padding: 4px 12px; border-radius: 999px; background: linear-gradient(90deg, var(--accent), var(--accent2)); color: #fff; font-size: 12px; font-weight: 800; letter-spacing: .1em; }

.map-sheet { position: fixed; inset: 0; background: rgba(0,0,0,0.78); z-index: 30; display: none; align-items: center; justify-content: center; padding: 16px; }

.map-sheet.show { display: flex; }

.map-box { width: min(680px, 100%); max-height: 84svh; overflow: auto; background: var(--surface); border: 1px solid var(--line); border-radius: 18px; padding: 18px; display: flex; flex-direction: column; gap: 10px; }

.map-node { padding: 10px 12px; border-radius: 12px; background: var(--surface-2); border: 1px solid var(--line); display: flex; align-items: center; justify-content: space-between; gap: 10px; }

.map-node.visited { border-color: var(--accent); }

@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }

</style>

</head>

<body>

<div class="app">

<header class="bar">

<button class="chip" id="restartBtn">↺ 重头开始</button>

<h1>三界 <span class="sub">三界 (Interactive FMV #2442960)</span></h1>

<button class="chip" id="endingsBtn">结局 0/4</button>

<button class="chip" id="mapBtn">剧情图谱</button>

</header>

<div class="stage-wrap" id="stageWrap">

<video id="video" playsinline preload="auto" controls></video>

<button class="skip-btn" id="skipBtn">跳到选择 ›</button>

<div class="choice-overlay" id="choiceOverlay">

<div class="choice-kicker" id="choiceKicker">MAKE YOUR CHOICE · 关键抉择</div>

<h3 class="choice-title" id="choiceTitle"></h3>

<div class="options" id="optionsBox"></div>

<div class="timer-bar"><i id="timerFill"></i></div>

</div>

</div>

<div class="below">

<div class="status-card">

<div>

<div class="route-tag" id="routeTag">第 1 幕 · 主线</div>

<h2 id="nodeTitle">三界</h2>

</div>

<div class="breadcrumbs" id="pathBox"></div>

</div>

<div class="ending-modal" id="endingModal">

<span class="ending-badge" id="endingBadge">TRUE END</span>

<h3 id="endingTitle" style="margin:0;font-size:22px;"></h3>

<p id="endingHint" style="margin:0;color:var(--muted);">已收录至你的互动结局图鉴。你可以回溯到任意分支节点解锁其他路线!</p>

<div style="display:flex;gap:10px;flex-wrap:wrap;">

<button class="chip" id="backChoiceBtn" style="background:var(--accent);color:#fff;border:0;padding:8px 16px;font-weight:700;">返回上一选择</button>

<button class="chip" id="openMapEndBtn">查看完整剧情图谱</button>

<button class="chip" id="restartEndBtn">重新开始</button>

</div>

</div>

</div>

</div>

<div class="map-sheet" id="mapSheet">

<div class="map-box">

<div style="display:flex;justify-content:space-between;align-items:center;">

<h3 style="margin:0;">互动剧情分支图谱 · 三界</h3>

<button class="chip" id="closeMapBtn">关闭 ✕</button>

</div>

<div id="mapList" style="display:flex;flex-direction:column;gap:8px;"></div>

</div>

</div>

<script>

const NODES = {"open": {"id": "open", "title": "第1幕:命运序章 · 三界", "act": 1, "route": "序章主线", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7de93dfc836da0877e3af119f43598aea289862dab2e4777edaa9c7f897bcb0c.mp4", "ending": false, "choices": [{"label": "A 正面破局:直视她的眼睛追问真相(主线A)", "to": "a1"}, {"label": "B 暗中布局:顺着她的心意继续试探(主线B)", "to": "b1"}, {"label": "C 隐藏支线:触发特殊信物开启秘密契约(隐藏线)", "to": "c1"}]}, "a1": {"id": "a1", "title": "第2幕【A线】:近距离交锋与心跳抉择", "act": 2, "route": "A线·破局", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7dfe88d60b210bc43a3df628ad1430956b668e9c21d4536788048e1962454ba8.mp4", "ending": false, "choices": [{"label": "坚定握住她的手表露真心", "to": "a2"}, {"label": "保留底牌直接进入终局对峙", "to": "climax"}]}, "a2": {"id": "a2", "title": "第3幕【A线】:卸下防备后的深夜独处", "act": 3, "route": "A线·升温", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7e2808ba76a63c62d4eb007ef29c29beafec09288e9daaf83a0d5d08ae493ef4.mp4", "ending": false, "choices": [{"label": "许下专属承诺直通高甜结局", "to": "end_happy"}, {"label": "携手迎战最终风暴", "to": "climax"}]}, "b1": {"id": "b1", "title": "第2幕【B线】:微醺光影下的暗流涌动", "act": 2, "route": "B线·博弈", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7e4c9ed5751610f482f8b1be58ef4a1a3d42bedf56875d752e558158a31267d9.mp4", "ending": false, "choices": [{"label": "顺水推舟应下她的私人邀约", "to": "b2"}, {"label": "识破伏笔反客为主", "to": "climax"}]}, "b2": {"id": "b2", "title": "第3幕【B线】:天台夜风里的真情流露", "act": 3, "route": "B线·倾心", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7ec62b6f44923ce7f31ab247f055002d63a2f646c98da2fa39d0e071b7b69c00.mp4", "ending": false, "choices": [{"label": "用行动证明心意解锁甜蜜结局", "to": "end_happy"}, {"label": "带着关键线索进入终极决断", "to": "climax"}]}, "c1": {"id": "c1", "title": "第2幕【C线】:密室暗格与隐藏同盟", "act": 2, "route": "C线·暗涌", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7ec7d6aeae1fa11a062698bf72da0be05801cd88caf6c35983eeb0c5824a0199.mp4", "ending": false, "choices": [{"label": "与她结成秘密同盟共渡难关", "to": "c2"}, {"label": "孤身犯险闯入禁区", "to": "end_bad"}]}, "c2": {"id": "c2", "title": "第3幕【C线】:反转揭晓前的生死默契", "act": 3, "route": "C线·共鸣", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7ed8e7e393243bd72a5e1f6c25417d09354d28d001a893b4b79775cb51a5a995.mp4", "ending": false, "choices": [{"label": "亮出最终底牌进入终局审判", "to": "climax"}, {"label": "急流勇退远走高飞", "to": "end_normal"}]}, "climax": {"id": "climax", "title": "第4幕【终极抉择】:命运分岔口的最后十秒", "act": 4, "route": "终章抉择", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7ef8cf1eb52b846711d5ea5563da4af8c9df8646848ad9901dc9643c25ff96c6.mp4", "ending": false, "choices": [{"label": "★ 集齐所有线索与羁绊(解锁完美真结局)", "to": "end_true"}, {"label": "坚定选择挚爱共度余生(甜蜜结局)", "to": "end_happy"}, {"label": "全身而退保留潇洒转身(普通结局)", "to": "end_normal"}, {"label": "一步踏错跌入宿命迷局(遗憾结局)", "to": "end_bad"}]}, "end_happy": {"id": "end_happy", "title": "甜蜜结局:星光落满肩头的相拥", "act": 4, "route": "结局", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7f0025f16089623ba270de38afa12f4c7da7f4e76816a3a5c17581390f03614d.mp4", "ending": "HAPPY END", "choices": []}, "end_normal": {"id": "end_normal", "title": "普通结局:风平浪静后的重逢之约", "act": 4, "route": "结局", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7f046d9528414fa35a6f4b10a5b6a0e31a7d9ae62f4b7ac13b317f780cf29dac.mp4", "ending": "NORMAL END", "choices": []}, "end_bad": {"id": "end_bad", "title": "遗憾结局:错失良机的午夜背影", "act": 4, "route": "结局", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7f0ffe8f46496598c204c62df454364c39b456f3c2db9941b820965a918cc2a0.mp4", "ending": "BAD END", "choices": []}, "end_true": {"id": "end_true", "title": "完美真结局:三界·宿命圆满", "act": 4, "route": "真结局", "video": "https://media.huangguodrama.ai/motion/drama-episodes/7f28492109c5082479c39a2c918e458ec752b651cd3d9587a8a6517ba6fb8889.mp4", "ending": "TRUE END", "choices": []}};

const START = "open";

const ENDINGS = ["end_happy", "end_normal", "end_bad", "end_true"];

const STORAGE_KEY = "hg-interactive-steam-fmv-2442960-v1";

let state = JSON.parse(localStorage.getItem(STORAGE_KEY) || "null") || {

current: START,

history: [],

visited: [START],

endings: []

};

let autoTimer = null;

const video = document.getElementById("video");

const stageWrap = document.getElementById("stageWrap");

const choiceOverlay = document.getElementById("choiceOverlay");

const endingModal = document.getElementById("endingModal");

function saveState() {

try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (e) {}

}

function enterNode(nodeId, pushHistory = false) {

clearTimeout(autoTimer);

const node = NODES[nodeId] || NODES[START];

state.current = node.id;

if (!state.visited.includes(node.id)) state.visited.push(node.id);

stageWrap.classList.remove("frozen");

choiceOverlay.classList.remove("show");

endingModal.classList.remove("show");

document.getElementById("routeTag").textContent = `第 ${node.act || 1} 幕 · ${node.route || "主线"}`;

document.getElementById("nodeTitle").textContent = node.title;

document.getElementById("endingsBtn").textContent = `结局 ${state.endings.length}/${ENDINGS.length}`;

const pathBox = document.getElementById("pathBox");

pathBox.innerHTML = "";

state.history.slice(-5).forEach(h => {

const s = document.createElement("span");

s.textContent = h.label;

pathBox.appendChild(s);

});

video.src = node.video;

video.currentTime = 0;

video.play().catch(() => {});

saveState();

}

function onClipEnd() {

const node = NODES[state.current];

if (!node) return;

stageWrap.classList.add("frozen");

if (node.ending) {

if (!state.endings.includes(node.id)) state.endings.push(node.id);

document.getElementById("endingsBtn").textContent = `结局 ${state.endings.length}/${ENDINGS.length}`;

document.getElementById("endingBadge").textContent = `${node.ending} · 已收集 ${state.endings.length}/${ENDINGS.length}`;

document.getElementById("endingTitle").textContent = node.title;

endingModal.classList.add("show");

saveState();

return;

}

if (!node.choices || !node.choices.length) return;

document.getElementById("choiceTitle").textContent = node.title;

const box = document.getElementById("optionsBox");

box.innerHTML = "";

node.choices.forEach((c, idx) => {

const btn = document.createElement("button");

btn.className = "opt";

btn.innerHTML = `<span class="key">${"ABCD"[idx] || (idx+1)}</span><span class="lbl"></span>`;

btn.querySelector(".lbl").textContent = c.label;

btn.onclick = () => {

state.history.push({ from: node.id, label: c.label });

enterNode(c.to);

};

box.appendChild(btn);

});

choiceOverlay.classList.add("show");

const fill = document.getElementById("timerFill");

fill.style.transition = "none";

fill.style.width = "100%";

requestAnimationFrame(() => {

requestAnimationFrame(() => {

fill.style.transition = "width 12s linear";

fill.style.width = "0%";

});

});

autoTimer = setTimeout(() => {

if (choiceOverlay.classList.contains("show") && node.choices[0]) {

state.history.push({ from: node.id, label: node.choices[0].label });

enterNode(node.choices[0].to);

}

}, 12000);

}

video.addEventListener("ended", onClipEnd);

document.getElementById("skipBtn").onclick = () => {

video.pause();

onClipEnd();

};

document.getElementById("restartBtn").onclick = () => {

state.history = [];

enterNode(START);

};

document.getElementById("restartEndBtn").onclick = () => {

state.history = [];

enterNode(START);

};

document.getElementById("backChoiceBtn").onclick = () => {

const last = state.history.pop();

enterNode(last ? last.from : START);

};

function openMap() {

const list = document.getElementById("mapList");

list.innerHTML = "";

Object.values(NODES).forEach(n => {

const visited = state.visited.includes(n.id);

const row = document.createElement("div");

row.className = "map-node" + (visited ? " visited" : "");

row.innerHTML = `<div><strong>${visited ? n.title : "??? (未解锁节点)"}</strong><div style="font-size:12px;color:var(--muted);">第 ${n.act || 1} 幕 · ${n.ending || n.route || "分支"}</div></div>`;

if (visited) {

const jb = document.createElement("button");

jb.className = "chip";

jb.textContent = "跳转至此";

jb.onclick = () => {

document.getElementById("mapSheet").classList.remove("show");

enterNode(n.id);

};

row.appendChild(jb);

}

list.appendChild(row);

});

document.getElementById("mapSheet").classList.add("show");

}

document.getElementById("mapBtn").onclick = openMap;

document.getElementById("endingsBtn").onclick = openMap;

document.getElementById("openMapEndBtn").onclick = openMap;

document.getElementById("closeMapBtn").onclick = () => document.getElementById("mapSheet").classList.remove("show");

enterNode(state.current || START);

</script>

</body>

</html>