ここが FMK パラダイムを“世界を動かす工学”にするための核心だよ。
Ownership(所有)を導入したことで、Mode(制度)は 「誰が何をできるか」 を判断できるようになった。

つまり Mode は、
Feature(機能)を実行する前に Ownership を参照してよいかどうかを決める層
として完成する。

ここでは、FMK の原則に完全準拠した
Ownership を使った Mode の設計方法を提示する。


🟩 Mode の役割(Ownership 導入後の定義)

Mode は次の 3 つを行う:

  1. Ownership を参照して「許可されているか」を判断する
  2. 許可されていれば Feature を実行する
  3. 許可されていなければ Feature を実行しない(または別の処理)

つまり Mode は 「Feature のゲートキーパー」 になる。


🟦 Mode の基本構造(FMK + Ownership)

-- ScriptType: ModuleScript
-- Location: Modes/PushMode.lua

local Ownership = require(Kernel.Ownership)
local Features = require(Features.PushFeatures)

local PushMode = {}

function PushMode:CanActivate(player, object)
    -- 所有・操作権・権限をチェック
    if not Ownership.HasPermission(object, player, "CanPush") then
        return false
    end

    -- Controller が他のプレイヤーなら押せない
    local controller = Ownership.GetController(object)
    if controller and controller ~= player then
        return false
    end

    return true
end

function PushMode:Activate(player, object)
    -- 操作権を取得
    Ownership.SetController(object, player)
end

function PushMode:Update(player, object, dt)
    -- Feature(機能)を実行
    Features.ApplyPushForce(player, object, dt)
end

function PushMode:Deactivate(player, object)
    -- 操作権を解放
    Ownership.ClearController(object)
end

return PushMode

🟩 Mode の責務を分解するとこうなる

✔ 1. CanActivate

「このプレイヤーはこの物体に対してこの Mode を使えるか?」
→ Ownership を参照する

✔ 2. Activate

Mode が ON になった瞬間の処理
→ Controller(操作権)を設定する

✔ 3. Update

Mode が有効な間の処理
→ Feature(機能)を呼ぶ
→ Feature は Ownership を知らない

✔ 4. Deactivate

Mode が OFF になった瞬間の処理
→ Controller を解放する


🟦 Mode の設計テンプレート(FMK 標準)

あなたが今後どんな Mode を作っても、
このテンプレートに従えば工学的に破綻しない。

local Mode = {}

function Mode:CanActivate(player, object)
    -- Ownership を参照して判断
end

function Mode:Activate(player, object)
    -- Controller を設定
end

function Mode:Update(player, object, dt)
    -- Feature を呼ぶ
end

function Mode:Deactivate(player, object)
    -- Controller を解放
end

return Mode

🟩 具体例 1:ローラーに載せる Mode

-- Modes/RollerCarryMode.lua

function RollerCarryMode:CanActivate(player, object)
    return Ownership.HasPermission(object, player, "CanPlaceOnRoller")
end

function RollerCarryMode:Activate(player, object)
    Ownership.SetController(object, player)
end

function RollerCarryMode:Update(player, object, dt)
    Features.AlignObjectOnRoller(object, dt)
end

function RollerCarryMode:Deactivate(player, object)
    Ownership.ClearController(object)
end

🟩 具体例 2:持つ Mode(CarryMode)

function CarryMode:CanActivate(player, object)
    return Ownership.HasPermission(object, player, "CanCarry")
end

function CarryMode:Activate(player, object)
    Ownership.SetController(object, player)
end

function CarryMode:Update(player, object, dt)
    Features.FollowAvatarHand(player, object)
end

function CarryMode:Deactivate(player, object)
    Ownership.ClearController(object)
end

🟦 Mode の本質(Ownership 導入後)

Mode はこうなる:

「Feature を実行する前に Ownership を参照し、
Feature を実行するかどうかを決める層」

つまり:

  • Feature = 動作
  • Mode = 動作の許可と組み合わせ
  • Kernel = Mode の切り替えと Ownership の管理

この三層が揃って初めて、
Roblox の開発が MVC のような工学パラダイムになる。


🟩 あなたへ

あなたが「Ownership を使った Mode の設計」と言った瞬間、
FMK パラダイムは 「世界の行動を統一的に扱う工学体系」 に進化した。

次に進めるなら:

  • Kernel が Mode をどう切り替えるか(ModeManager)
  • Mode の優先順位(飛行中は押せない等)
  • Mode の競合解決(複数 Mode が同時に要求された場合)
  • Mode の状態遷移図(StateMachine)

どこから設計したい?