Skip to content

おみくじ演出に「弾き玉」(スリングショット)を追加し、装置を差し替え式にする - #242

Merged
kojira merged 5 commits into
mainfrom
claude/ranking-feature-bug-a8nq2k
Sep 1, 2026
Merged

おみくじ演出に「弾き玉」(スリングショット)を追加し、装置を差し替え式にする#242
kojira merged 5 commits into
mainfrom
claude/ranking-feature-bug-a8nq2k

Conversation

@kojira

@kojira kojira commented Sep 1, 2026

Copy link
Copy Markdown
Member

目的

おみくじの演出パターンを増やす。第1弾として Angry Birds のように玉を引き絞って放つ
「弾き玉」(スリングショット) を追加する。ピンボールは次の PR。

変更

装置(からくり)を差し替え式に

OmikujiScene.vue から装置固有の座標・操作(鈴の緒を振る等)を抜き、共通インターフェース
(omikujiMachines.js)だけで「儀式 → 見せ場 → 狐が本命へ着地」の3幕を進める形にした。
鈴の緒装置は本体(buildMachineWorld 等)をそのままに、同じ形に包んだ。

  • 引くたびにランダムに選ばれる(machines.pick())
  • ?scene=slingshot / ?scene=bell で固定できる(確認用)
  • 抽選の正しさは装置に依存しない(狐の最終着地は omikujiFox.js のまま)

弾き玉(omikujiSlingshot.js)

御神玉をつまんで引き絞り、放す → 木札の櫓に直撃して崩れる → 木札か玉が寝ている狐に当たる。

ヘッドレス検証で潰した問題:

問題 対処
垂直気味に引くと永久に切り離されずぶら下がる 「放した時の引いた向き」との内積で支点通過を判定
最大引きで 45px/step に達し、壁を突き抜けて場外へ 射出速度に上限(15)、ゴムを柔らかく、壁を 60px に
柔らかいゴムが重力でたわみ、玉が支点から下がって眠れない 繋がっている間は自重を打ち消す(水車と同じ手 #199)
狙いが外れると 17 秒のタイムボックス待ち 玉と木札が静まったら物音で狐が起きる(createSettleDetector)

scripts/simulate-omikuji-slingshot.js で引きの角度×強さ 45 点を掃引:

無操作 20s: 木札の最大変位 0.000px / 角度 0.0000rad, 玉の支点からのずれ 0.00px
掃引 45 点: 未到達 1 / 最遅到達 3.7s / 無操作静止 OK
  角度70° 引き30: ... 静止=2.8s   ← 静止検知で狐が起きる

鈴の緒装置の既存検証(simulate-omikuji.js --sweep 31)は変わらず失敗 0。

確認方法(dev)

  • /omikuji?scene=slingshot で弾き玉を固定して引く。玉をつまんで左下へ引き、放す
  • 「うまく放てないときはここをタップ」で既定の引きで放てる
  • わざと真上や弱く放って、数秒で狐が起きることを見る
  • /omikuji?scene=bell で従来の鈴の緒が変わっていないことを見る
  • ?scene= 無しで引くと、どちらかがランダムに出る

yarn generate 通過。

🤖 Generated with Claude Code

https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU


Generated by Claude Code

kojira and others added 5 commits September 1, 2026 18:25
演出のパターンを増やしたい。まず Angry Birds のように玉を引き絞って放つ
「弾き玉」を追加する。

装置(からくり)を差し替えられるよう、OmikujiScene から装置固有の座標や操作を
抜き、共通インターフェース(omikujiMachines.js)だけで幕を進める形にした。
鈴の緒装置は本体をそのままに、同じ形に包んだ。引くたびにランダムに選ばれ、
?scene= で固定もできる。

弾き玉の設計:
- 放して支点を通り過ぎた瞬間に切り離す。判定は引いた向きとの内積
  (固定条件だと垂直気味の引きで永久にぶら下がった)
- 射出速度に上限。速すぎると壁を突き抜けて場外へ落ちる。壁も厚く
- 繋がっている間は玉の自重を打ち消す。柔らかいゴムがたわんで眠れないため
- 櫓の木札はスリープで凍結。触られるまで完全静止
- 狙いが外れても、玉と木札が静まったら物音で狐が起きる。タイムボックスを
  待たずに数秒で進む

ヘッドレス検証(simulate-omikuji-slingshot.js)で引きの角度×強さ45点を掃引:
44点が最遅3.7秒で狐に到達、残り1点も2.8秒で静止、無操作の静止OK。
鈴の緒装置の既存検証も変わらず通る。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
data に入れると Vue 2 が装置モジュール(共有オブジェクト)を丸ごとリアクティブ化
して __ob__ を生やし、ヘッドレス検証と共有しているモジュールの中身を書き換えて
しまう。装置は生成時に確定して以後変わらないので computed で十分。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
bodyB を null にして残すと、拘束が描画に残ったり、点と点の空拘束が毎ステップ
解かれたりする。切り離した時点で Composite.remove する。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
ゴムを世界から外しても elastic.bodyB が玉のままだったため、「繋がっている間は
自重を打ち消す」処理が放った後も効き続け、玉が無重力で漂って静止しなかった
(掃引で静止 24.8s、未到達が増えて発覚)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
静まれば物音で狐が起きる設計なので、届かなくても 8 秒以内に静まれば演出は
完走する。放てない・場外へ抜ける・いつまでも転がり続ける、だけを失敗にする。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant