himika’s lock on (stradivuckos updated version) SSE

Modの紹介

ロックオンの仕組みを実現します。一部を除いてPapyrusベースなので改造しやすいのが特徴です。

Nexus

インストール手順

Mod Managerでインストールすればいいのですが、DLLを含んでおり、最新のSEに対応していません。

postsにて1.5.97に対応したDLLのリンクがありますので、それもダウンロードして上書きすればOKです。

設定

MCMで好きなように設定できます。

カーソルの形を3種類から選べます。デフォルト以外のを選んでも、何かの拍子に元に戻ってしまうので、設定はデフォルトのままにして、interfaceフォルダにあるswfファイルをリネームする方がいいです。marker0.swfがデフォルトです。

改造

ロックオンキーの単押しを検知してロックオンをオンオフする

単押しとはロックオンキーだけを押して離した場合のことを言います。

なぜこれが必要なのかというと、コントローラーはボタンが限られているため、修飾キーを用意して同時押しすることが必須になってきます。

私の場合はLTとRTが修飾キーになっています。A、B、X、Yで4通りですが、修飾キーを押しながらで12通りに増やせます。十字キーやLB、RBも増えますので、ボタンの組み合わせを大幅に増やせます。

組み合わせが増えるのと遊びやすいのは別で、色々試した結果、ロックオンキーはRTの単押しが一番しっくりきたので、これを検知できるようにしてみました。

LockOn_Main.psc (papyrus)

Event OnKeyDown(int KeyCode)
    ; メニューモードでは何もしない
    if Utility.IsInMenuMode()
        return
    endif

    ; ロックオンキーを押したとき
    if KeyCode == keyLockon
        _bPressLockonKey = true
        _bChangeTarget = false
        _bStartViaModEvent = false
        return
    endif

    ; ロックオンキーを押している最中に他のキーを押したとき
    if _bPressLockonKey
        if KeyCode == keyDown
            ; ロックオン対象の切り替え
            OnKey_Down(0, false)
        elseif KeyCode == keyLeft
            ; ロックオン対象の切り替え
            OnKey_Left(0, false)
        elseif KeyCode == keyRight
            ; ロックオン対象の切り替え
            OnKey_Right(0, false)
        elseif KeyCode == keyUp
            ; ロックオン対象の切り替え
            OnKey_Up(0, false)
        else
            ; その他のキーが押されたらロックオンキーの単押しではないということ
            _bPressLockonKey = false
        endif
    endif
EndEvent

Event OnKeyUp(int KeyCode, float HoldTime)
    Debug.TraceUser("HimikaLockOn", "[] OnKeyUp")

    ; ロックオンキーを離したとき
    if KeyCode == keyLockon
        ; ロックオンキーを押して離したとき(ロックオンキーの単押し)
        if _bPressLockonKey
            _bPressLockonKey = false

            if Utility.IsInMenuMode()
                return
            endif

            ; ロックオンがまだならロックオンを開始する
            if !_bChangeTarget
                OnKey_Lockon(false)
            endif
        endif
    endif
EndEvent

Function SetLockOnKey(string Option = "")
    ; (中略)
    RegisterForKey(0x10A) ; 266 DPAD_UP
    RegisterForKey(0x10B) ; 267 DPAD_DOWN
    RegisterForKey(0x10C) ; 268 DPAD_LEFT
    RegisterForKey(0x10D) ; 269 DPAD_RIGHT
    RegisterForKey(0x10E) ; 270 START
    RegisterForKey(0x10F) ; 271 BACK
    RegisterForKey(0x110) ; 272 LEFT_THUMB
    RegisterForKey(0x111) ; 273 RIGHT_THUMB
    RegisterForKey(0x112) ; 274 LEFT_SHOULDER
    RegisterForKey(0x113) ; 275 RIGHT_SHOULDER
    RegisterForKey(0x114) ; 276 A
    RegisterForKey(0x115) ; 277 B
    RegisterForKey(0x116) ; 278 X
    RegisterForKey(0x117) ; 279 Y
EndFunction

RTの単押しでロックオンのトグル、RTを押しながら左スティックでターゲットの切り替えになっています。

Combat Gameplay Overhaul SEの360度戦闘機能と連動

ロックオン中は360度戦闘機能を一時的に無効にして、ロックオンを解除したら元に戻します。

lockon_main.pscのActor Property refLockon~EndPropertyの部分を以下のようにまるごと書き換えます。

ロックオンと360度戦闘機能の連動 (papyrus)

bool Restore360Combat ; この行を追加する
Actor Property refLockon
    Function Set(Actor ref)
        if !ref
            ;SendModEvent("LockedOff")
            PlayerRef.SetAnimationVariableBool("bUse360Combat", Restore360Combat)
        elseif !_refLockon
            ;SendModEvent("LockedOn")
            Restore360Combat = PlayerRef.GetAnimationVariableBool("bUse360Combat")
            if Restore360Combat
                PlayerRef.SetAnimationVariableBool("bUse360Combat", false)
            endif
        endif
        (_refLockon) && Target.Clear()
        _refLockon = ref
        (_refLockon) && Target.ForceRefTo(ref)
    EndFunction
    Actor Function Get()
        return _refLockon
    EndFunction
EndProperty

タイトルとURLをコピーしました