This commit is contained in:
33333-33333 2026-08-01 16:06:14 +09:00
commit 4c4e767ec6
73 changed files with 3502 additions and 741 deletions

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>&#x66F2;&#x7DDA;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;</title>
<title>LinkFieldリンクフィールド</title>
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<link rel="alternate icon" href="favicon.ico">
<link rel="stylesheet" href="style.css">
@ -11,12 +11,12 @@
<body class="loading" data-ready="false" data-loading-text="&#x8AAD;&#x307F;&#x8FBC;&#x307F;&#x4E2D;">
<div id="app">
<div id="topbar">
<div class="brand">&#x66F2;&#x7DDA;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9; <small></small></div>
<a class="room-back-link" href="https://host.nishi.boats/~333/">333の部屋に戻る</a>
<div class="brand">LinkFieldリンクフィールド <small></small></div>
<div class="stat sr-data">&#x30AF;&#x30EA;&#x30A2; <b id="solvedCount">0</b></div>
<div class="stat score" aria-label="&#x6240;&#x6301;&#x6570;"><span aria-hidden="true">&#x25C6;</span> <b id="scoreCount">0</b></div>
<div class="stat sr-data">&#x76E4;&#x9762; <b id="worldCount">1</b></div>
<div class="stat fps-stat" aria-label="描画フレームレート"><b id="fpsCounter" data-fps="idle">FPS 待機</b></div>
<div class="stat compact-selected"><b id="selectedInfo" aria-live="polite">&#x30EC;&#x30D9;&#x30EB;1</b></div>
<div class="stat fps-stat" aria-label="FPS"><b id="fpsCounter" data-fps="idle">FPS 待機</b></div>
<div class="spacer"></div>
<div class="toolbar" aria-label="&#x30B2;&#x30FC;&#x30E0;&#x64CD;&#x4F5C;">
<button class="pill inventory-button" id="inventoryBtn" aria-label="&#x30A2;&#x30A4;&#x30C6;&#x30E0;&#x3092;&#x958B;&#x304F;" aria-haspopup="dialog" aria-expanded="false"><span aria-hidden="true">&#x25A3;</span><span>&#x30A2;&#x30A4;&#x30C6;&#x30E0; <b id="inventoryCount">0</b></span></button>
@ -24,10 +24,10 @@
<button class="pill settings" id="settingsBtn" type="button" aria-label="設定を開く" aria-haspopup="dialog" aria-expanded="false"></button>
<button class="pill help" id="helpBtn" aria-label="&#x904A;&#x3073;&#x65B9;&#x3092;&#x958B;&#x304F;" aria-haspopup="dialog" aria-expanded="false">?</button>
<button class="pill player-name" id="playerNameBtn" type="button" title="プレイヤー名を変更">旅人</button>
<button class="pill cloud-status" id="cloudBtn" type="button" title="&#x540C;&#x671F;">&#x7AEF;&#x672B;&#x306E;&#x307F;</button>
</div>
<button id="saveStatus" type="button" aria-live="polite" aria-label="&#x4FDD;&#x5B58;&#x72B6;&#x614B;" title="&#x4FDD;&#x5B58;&#x72B6;&#x614B;&#x3092;&#x78BA;&#x8A8D;">&#x4FDD;&#x5B58;&#x6E08;&#x307F;</button>
</div>
<div class="shared-indicator" id="cloudBtn" data-state="connecting" role="status" aria-live="off" aria-label="共有接続状態" title="共有サーバーへ接続中"><i aria-hidden="true"></i><span>共有</span></div>
<div id="viewport" tabindex="-1" aria-label="&#x66F2;&#x7DDA;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;"><canvas id="noiseCanvas" width="80" height="64" aria-hidden="true"></canvas><canvas id="reactionCanvas" aria-hidden="true"></canvas><canvas id="overviewCanvas" aria-hidden="true" hidden></canvas><div id="world"></div><canvas id="presenceCanvas" aria-hidden="true"></canvas><div id="boardHudLayer" aria-live="polite"></div></div>
<aside id="minimap" aria-label="&#x30DE;&#x30C3;&#x30D7;">
<div id="clearFeed" class="clear-feed" aria-live="polite" aria-label="共有クリア速報"></div>
@ -41,21 +41,18 @@
</aside>
<div id="reactionRadial" role="menu" aria-label="リアクションを選択" hidden></div>
<div id="toast" role="status" aria-live="polite"></div>
<div id="timeAttackCountdownOverlay" aria-live="assertive" aria-atomic="true" hidden><span></span></div>
<div id="specialTooltip" role="tooltip" hidden></div>
<section id="statusPanel" hidden aria-live="assertive">
<p id="statusMessage"></p>
<div class="status-actions">
<button class="pill" id="retryBtn" type="button">&#x518D;&#x8A66;&#x884C;</button>
<button class="pill" id="exportBtn" type="button">&#x66F8;&#x304D;&#x51FA;&#x3057;</button>
<button class="pill" id="importBtn" type="button">&#x8AAD;&#x307F;&#x8FBC;&#x307F;</button>
<input id="importFile" type="file" accept="application/x-bend-field-save,.bfsave,application/json,.json" hidden>
<button class="pill danger" id="freshBtn" type="button">&#x6700;&#x521D;&#x304B;&#x3089;</button>
<button class="pill" id="dismissStatusBtn" type="button">&#x9589;&#x3058;&#x308B;</button>
</div>
</section>
<div id="modal" aria-hidden="true" inert>
<div class="panel" role="dialog" aria-modal="true" aria-labelledby="helpTitle" aria-describedby="helpDescription" tabindex="-1">
<h2 id="helpTitle">&#x66F2;&#x7DDA;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;</h2>
<h2 id="helpTitle">LinkFieldリンクフィールド</h2>
<div id="helpDescription">
<div class="tutorial-grid">
<article class="tutorial-card">
@ -100,7 +97,6 @@
<div id="inventoryModal" aria-hidden="true" inert>
<div class="panel inventory-panel" role="dialog" aria-modal="true" aria-labelledby="inventoryTitle" tabindex="-1">
<div class="inventory-heading"><div><small>&#x30A2;&#x30A4;&#x30C6;&#x30E0;</small><h2 id="inventoryTitle">&#x6240;&#x6301;&#x30A2;&#x30A4;&#x30C6;&#x30E0;</h2></div><strong id="inventoryTotal">0</strong></div>
<label class="debug-items-toggle"><input id="debugAllItemsToggle" type="checkbox"><span><b>DEBUG</b><small id="debugAllItemsState">OFF · 通常所持数を使用</small></span></label>
<p id="inventoryTarget">&#x30AB;&#x30FC;&#x30BD;&#x30EB;&#x306F;&#x30C7;&#x30B6;&#x30A4;&#x30F3;&#x3092;&#x30AF;&#x30EA;&#x30C3;&#x30AF;&#x3057;&#x3066;&#x5207;&#x308A;&#x66FF;&#x3048;&#x307E;&#x3059;&#x3002;</p>
<div id="inventoryList" class="inventory-list"></div>
<div class="modal-actions"><button class="pill close" id="closeInventory" type="button">&#x9589;&#x3058;&#x308B;</button></div>
@ -109,7 +105,7 @@
<div id="settingsModal" aria-hidden="true" inert>
<div class="panel settings-panel" role="dialog" aria-modal="true" aria-labelledby="settingsTitle" tabindex="-1">
<div class="settings-heading"><div><small>SETTINGS</small><h2 id="settingsTitle">設定</h2></div></div>
<div class="settings-heading"><div><small>設定</small><h2 id="settingsTitle">設定</h2></div></div>
<label class="settings-field"><span>プレイヤー名</span><input id="settingsPlayerName" type="text" maxlength="24" autocomplete="nickname" spellcheck="false"></label>
<label class="settings-toggle"><input id="lightweightRenderingToggle" type="checkbox"><span><b>軽量描画</b><small>背景ノイズ、光、粒子など一部の視覚効果を抑えます。</small></span></label>
<label class="settings-toggle"><input id="soundEnabledToggle" type="checkbox"><span><b>効果音</b><small>操作音とクリア音を再生します。</small></span></label>
@ -118,19 +114,19 @@
</div>
<div id="timeAttackModal" aria-hidden="true" inert>
<div class="panel time-attack-panel" role="dialog" aria-modal="true" aria-labelledby="timeAttackTitle" tabindex="-1">
<div class="time-attack-heading"><div><small>TIME ATTACK</small><h2 id="timeAttackTitle">タイムアタック</h2></div><strong id="timeAttackHeadingScore">タイム加算</strong></div>
<div class="time-attack-heading"><div><small>タイムアタック</small><h2 id="timeAttackTitle">タイムアタック</h2></div><strong id="timeAttackHeadingScore">挑戦結果</strong></div>
<section id="timeAttackSetup">
<p class="time-attack-intro">制限時間内に盤面を解き、獲得ジェムを伸ばします。集めた量に応じて報酬倍率が上がります。</p>
<p class="time-attack-intro">制限時間内に盤面を解き、ジェムを伸ばします。獲得ジェムに応じて次の通り倍率が上昇します。</p>
<p class="time-attack-kicker">コースを選択</p>
<div class="time-attack-durations">
<button type="button" data-time-minutes="3"><span class="duration-value"><b>3</b><small></small></span><strong>QUICK</strong><em class="duration-status">短時間で集中</em></button>
<button type="button" data-time-minutes="5"><span class="duration-value"><b>5</b><small></small></span><strong>STANDARD</strong><em class="duration-status">標準コース</em></button>
<button type="button" data-time-minutes="10"><span class="duration-value"><b>10</b><small></small></span><strong>LONG</strong><em class="duration-status">じっくり挑戦</em></button>
<button type="button" data-time-minutes="3"><span class="duration-value"><b>3</b><small></small></span><strong>短時間</strong><em class="duration-status">短時間で集中</em></button>
<button type="button" data-time-minutes="5"><span class="duration-value"><b>5</b><small></small></span><strong>標準</strong><em class="duration-status">標準コース</em></button>
<button type="button" data-time-minutes="10"><span class="duration-value"><b>10</b><small></small></span><strong>長時間</strong><em class="duration-status">じっくり挑戦</em></button>
</div>
<div class="time-attack-rules">
<div><b>獲得ジェムで倍率UP</b><span>時間内の合計獲得量に応じて、自動的に最も高い倍率が適用されます。</span></div>
<div><b>獲得ジェムの倍率UP</b><span>獲得ジェムに応じて次の通り倍率が上昇します。</span></div>
<div class="time-attack-ladder" aria-label="報酬倍率">
<span><small>獲得</small><b>0+</b><strong>×1.25</strong></span><span><small>獲得</small><b>100+</b><strong>×1.50</strong></span><span><small>獲得</small><b>250+</b><strong>×2.00</strong></span><span><small>獲得</small><b>500+</b><strong>×2.50</strong></span><span><small>獲得</small><b>1000+</b><strong>×3.00</strong></span>
<span><small>基礎累計</small><b>0+</b><strong>×1.25</strong></span><span><small>基礎累計</small><b>100+</b><strong>×1.50</strong></span><span><small>基礎累計</small><b>250+</b><strong>×2.00</strong></span><span><small>基礎累計</small><b>500+</b><strong>×2.50</strong></span><span><small>基礎累計</small><b>1000+</b><strong>×3.00</strong></span>
</div>
</div>
</section>
@ -140,8 +136,8 @@
<div class="time-attack-stats"><span>獲得ジェム <b id="timeAttackCollected">0</b></span><span>現在倍率 <b id="timeAttackMultiplier">×1.25</b></span><span>現在合計 <b id="timeAttackProjected">0</b></span></div>
</section>
<section id="timeAttackResult" hidden>
<p class="time-attack-kicker">RESULT</p>
<div class="time-attack-result-grid"><span>制限時間 <b id="timeAttackResultLimit">3分</b></span><span>クリア数 <b id="timeAttackResultSolves">0</b></span><span>獲得ジェム <b id="timeAttackResultCollected">0</b></span><span>実効倍率 <b id="timeAttackResultMultiplier">×1.25</b></span><span>タイム加算 <b id="timeAttackResultBonus">+0</b></span><span>合計 <b id="timeAttackResultTotal">0</b></span></div>
<p class="time-attack-kicker">結果</p>
<div class="time-attack-result-grid"><span>制限時間 <b id="timeAttackResultLimit">3分</b></span><span>クリア数 <b id="timeAttackResultSolves">0</b></span><span>合計 <b id="timeAttackResultTotal">0</b></span></div>
<pre id="timeAttackShareText" aria-label="タイムアタックの結果"></pre>
</section>
<div class="modal-actions time-attack-actions"><button class="pill" id="copyTimeAttack" type="button" hidden>📋 結果をコピー</button><button class="pill close" id="closeTimeAttack" type="button">&#x9589;&#x3058;&#x308B;</button></div>