TES4:Oblivionの情報を集めたり、ユーザーの交流や妄想等を楽しむための休憩所です。ゲームの合間の一服にどうぞ。

※参考になりそうな情報や注意点などを皆さんでどんどん追記編集してください。


本ページには掲載されていない基本的な資料

まず始めに Loversシステム配布書庫に付属している「開発者向け資料」フォルダ内のテキストをよく読んでください。
Loversシステムの基本的な仕組みや、対応MODの作り方、モーションの組み込み方などが大まかに把握できると思います。

Loversシステム図解





Loversのv(version)とRev(Revision)の違い


Lovers v1.4.1 [Rev86] という感じで v(version)やら Rev(Revision)やら、ややこしいわ!と感じた方も多いかと思います。

v(version)の方は「Lovers with PK.esm」に対して使われ、重要なものです。
「Lovers with PK.esm」は対応MODやアドオンから必ずマスター指定されており、v(version)が更新された場合は全ての対応MODやアドオンがその影響を受けることとなります。
影響といっても悪い影響ではなく、実現可能な判定や処理などが追加されて良い意味での影響であることがほとんどです。
基本的には過去の v(version)で動いていた対応MODやアドオンはそのまま動くはずですが、ごく稀にシステムの根本的な仕様変更により対応作業が必須となってしまう場合もあり得ます。
対応MODやアドオンなどを開発なさっている方は、v(version)の更新には要注意です。

一方 Rev(Revision)は「Lovers with PK.esp」に対して使われるものです。
「Lovers with PK.esp」には Loversシステムの内部処理が実装されており、これが改変されたということになります。
バグ取りやちょっとした機能の追加変更などが行われるだけでもどんどん更新されていきます。
あくまでシステム内部の処理なので、これが変更されたとしても外部の対応MODやアドオン側から何か出来ることが増えたり減ったりするわけでもなく、対応修正をする必要もなく、まず影響はありません。

Lovers v1.3以降の大まかなスクリプト解説


スクリプトの文法や関数に関しては各マニュアルを参照してください。
TES CSのスクリプトエディタは非常に貧弱なので、それ単体で満足な解析や開発が行えるものではないと思われます。例えば TES CSで開いているMODファイルを別のテキストエディタで開いておき、そちらで関数名で検索したりマークしたりジャンプするなどの工夫が必要です。
また Loversシステムのスクリプト内部には多くのコメントが付いているので参考にしてみてください。

※TES CSのスクリプトエディッタは右クリックメニューからのコピペはできませんが、ホットキーでなら可能です。
 Ctrl+C(コピー)、Ctrl+X(カット)、Ctrl+V(ペースト)

対応MOD側からのH開始登録


  • xLoversMainSafeStart
両者がHを開始できる状態かを調べ、開始できる場合には xLoversPkrPairsEntry関数が呼ばれて Lovresシステムに両者のデータが登録されます。

Loversシステムの処理


  • xLoversPkrQuestScript
クエスト用スクリプトであり、毎フレーム呼ばれ続けています。Lovers with PK.esp全体で扱う変数群はこのスクリプトで定義されています。誰かがHをしている最中であれば下記 xLoversMainScriptExecuteが呼ばれます。

  • xLoversMainScriptExecute
進行中のHや事後着衣の処理を行うスクリプトの大本です。状況や必要に応じてこの中から別のスクリプトが Callされます。呼ばれるスクリプトは主に名前が xLoversMainScriptから始まっています。
常に呼ばれる共通処理
  • xLoversMainScriptModuleCommon
初期化1(H開始待ちに対する初期化)
  • xLoversMainScriptStepInitialize1
H開始待ち処理(着地や脱力解放待ちなど)
  • xLoversMainScriptStepWaitReady
初期化2(H開始に対する初期化)
  • xLoversMainScriptStepInitialize2
H最中
  • xLoversMainScriptModuleTimer
時間経過の処理
  • xLoversMainScriptModuleKeyControl
キー操作制御の処理
  • xLoversMainScriptStepH
モーション調整やH進行やセリフタイミングの処理
  • xLoversMainScriptModulePickIdle
安全にPickIdleを行うための処理
  • xLoversMainScriptSetupHStep
Hの段階がひとつ進む時の処理
H終了
  • xLoversMainScriptStepFinalize
Hを終了して事後着衣管理へ移行させる処理
装備の着衣/脱衣管理(H終了後も引き続き処理されている)
  • xLoversMainScriptEquipFuncInitialize
脱衣着衣処理の初期化処理 (初回時のみ)
  • xLoversMainScriptEquipFunc
H終了後も着衣完了まで呼ばれ続ける処理

モジュール関数


改変対象となる機会が多いと思われるスクリプト群は「モジュール」と呼称し、xLoversMainScriptModuleから始まる名前のスクリプトとして作ってあります。
上記では解説されていないモジュール関数について補足します。
  • xLoversMainScriptModuleGetChinupo
Chinupo装備のRefを返す
  • xLoversMainScriptModuleGetFutanari
ふたなり装備のRefを返す
  • xLoversMainScriptModuleResetKf
制御不能状態から解放できるReset.kfを再生する
  • xLoversMainScriptModuleStun
事後のダウン状態を作る
  • xLoversMainScriptModuleSetupMotion
Hモーション関連の各種データ/識別アイテム所持数を構築する(Rev90以降)
  • xLoversMainScriptModuleAdjustPosition
H最中の両者の座標を再設定して位置を調整する(Rev90以降)

その他の重要なスクリプト


  • xLoversPkrCleanFunc
LoversでH最中に扱うアイテムを全削除する関数です。例えば「Hの最中にこういう新しい識別アイテムを持たせることにした」という追加仕様を実装した場合、この関数内で「そのアイテムの所持数を 0にする」という処理を必ず追加しなければなりません。注意していただきたいのは、Hが終わった後も「脱衣着衣処理」は続きますので、脱衣着衣関係のアイテムだけは削除してはいけません。

  • xLoversCmnInitQuestInterface
受け渡し変数用クエストである xLoversQuestのスクリプト xLoversQuestScriptに「新しい受け渡し変数」を追加した場合、必ずこの関数内にデフォルト値の設定を行う処理を追加してください。

それ以外のスクリプト


ほとんどのスクリプトはその名前から処理の内容が容易に想像できるようにしているつもりですが、念のため全て解説します。
  • xLoversPkrAbilityScript
H終了後も「Lovers 性的興奮」が残っていたら解除する
  • xLoversPkrAddSpermCount
(条件を満たすのであれば)射精カウントを1増やす
  • xLoversPkrAddSPosGroupItem
体位番号に合った体位グループ識別アイテムを持たせる
  • xLoversPkrAdjustEntry
座標調整データを登録する
  • xLoversPkrAdjustFind
座標調整データを探す
  • xLoversPkrBedPlayGetAdjustZ
ベッドの調整高さ(Z)を得る
  • xLoversPkrBedPlayGetAdjustZSubSI
〃のSI専用サブルーチン
  • xLoversPkrBedPlayGetAdjustZSubVanilla
〃のVanilla用サブルーチン
  • xLoversPkrBedPlaySetup
ベッドでH開始する際の設定準備を行う
  • xLoversPkrBUBreak
各パーツのBU装備に損傷を与えるべきか調べる
  • xLoversPkrBUBreakMain
BU装備破壊が発生するか適切に判定する
  • xLoversPkrBUBreakSub
実際にBU装備に損傷を与える
  • xLoversPkrBUCheck
その装備がBU装備なのか調べる
  • xLoversPkrCallbackCorrect
登録内容が不正化しているコールバック関数データを削除する
  • xLoversPkrCallbackEntrySub
コールバック登録用のサブルーチン
  • xLoversPkrCheckBoners
指定のChinupo/ふたなりが使用可能か調べる
  • xLoversPkrCheckFutanariFile
ふたなりメッシュデータが存在するか調べる
  • xLoversPkrCheckPairsContinuity
H中のアクターがHを継続できる状態か調べる
  • xLoversPkrCheckRapeVoiceExist
レイp音声が用意されているか調べる
  • xLoversPkrCheckSeparatedVoiceExist
段階別音声が存在しているか調べる
  • xLoversPkrCheckSoundDirectory
様々な音声が用意されているか一括で調べる
  • xLoversPkrCheckStart
両者がH開始可能なのか調べる
  • xLoversPkrCheckVoiceExist
個別音声が用意されているか調べる
  • xLoversPkrCleanBoners
所持しているChinupo関連アイテムを削除する為のバイパス関数
  • xLoversPkrConvertModListToModNumList
MOD文字列をMOD番号に変換する
  • xLoversPkrCorrectNudeFlag
対象のNudeFlagを適切に正規化する
  • xLoversPkrCorrectNudeFlagBU
BU装備を脱がないようにNudeFlagを正規化する
  • xLoversPkrCorrectNudeFlagNoUnequip
指定アイテムは脱がないようにNudeFlagを正規化する
  • xLoversPkrDebugSpellScript
デバッグ用魔法の処理
  • xLoversPkrEmergencyFinalize
想定外のH終了時の処理
  • xLoversPkrExecCallback
コールバックを呼び出す処理
  • xLoversPkrFinishTfc
TFCモードを終了させる
  • xLoversPkrFollowPlayerItemScript
見物人用スクリプト処理
  • xLoversPkrGetChinupo
現在のモーション用のChinupo番号を得る
  • xLoversPkrGetDefaultMotionFlag
デフォルトのmotionflag値を得る
  • xLoversPkrGetEquippedTorchIgniter
装備中のDropLitTorchesClean系松明を得る
  • xLoversPkrGetHeadOrHair
頭装備もしくは外しても構わない髪装備を得る
  • xLoversPkrGetMotionAdjustData
座標調整データを得る
  • xLoversPkrGetMotionFlag
motionflagを得る
  • xLoversPkrGetMotionParamBySPosIndex
現在の体位の任意iniパラメータを得る
  • xLoversPkrGetSameGroupSPos
指定体位番号と同じ体位グループでの別体位番号を得る
  • xLoversPkrGetSPosGroup
体位番号から体位グループ番号を得る
  • xLoversPkrGetUnequipbleHair
その髪装備が外しても良いものか判定する
  • xLoversPkrGetVoiceLabel
個別音声用のラベル名があるならそれを得る
  • xLoversPkrGetXZScale
モーションini値に従ったXZの計算式結果を得る
  • xLoversPkrInfoSpellScript
Lovers システム 情報表示の処理
  • xLoversPkrIsEquipFuncTarget
そのアクターが脱衣着衣処理の最中かを調べる
  • xLoversPkrIsGhostScript
H終了後にGhost状態に戻す為の処理
  • xLoversPkrLoadMotionFile
体位モーションiniデータをロードするメイン処理
  • xLoversPkrLoadMotionFileSub
体位モーションiniデータをロードするサブ処理
  • xLoversPkrNormalizeVoiceParameter
その状況でそのアクターがどの声を出すか正規化する
  • xLoversPkrNudeSettingGet
脱衣設定に従ったNudeFlagを生成する
  • xLoversPkrNudeSettingGetBool
脱衣設定の結果脱ぐのか脱がないのかを得る
  • xLoversPkrNudeSettingInit
脱衣設定をデフォルトに設定する
  • xLoversPkrPairsDelete
H最中として登録されていたペアを解除する
  • xLoversPkrPairsEntry
H最中(開始)としてペアを登録する
  • xLoversPkrPlayVoice
アクターの適切な声を再生する
  • xLoversPkrRemoveXPack
NPCの行動停止用AIを解除する
  • xLoversPkrRepairMotion
プレイヤーと周辺アクターのモーションをリセットする
  • xLoversPkrRepairNpcSpellScript
プレイヤーと周辺のバグの修正を試みる
  • xLoversPkrResetAnimClear
事後ダウン関係の識別魔法がかかっていたら解除する
  • xLoversPkrResetKnockedState
ダウン状態を解除し必要ならダメージ魔法効果も解除する
  • xLoversPkrResetMotion
モーションをリセットする
  • xLoversPkrSafePickIdle
三人称視点専用モーションを安全にPickIdleする
  • xLoversPkrSafeReset3DState
弓装備時のバグを避けて安全にReset3DStateする
  • xLoversPkrSafeReset3DStatePairs
↑の処理のペア版
  • xLoversPkrSayTopic
H最中のセリフ(字幕)をしゃべらせる
  • xLoversPkrSearchVisitor
周辺で見物人となり得るアクターを探す
  • xLoversPkrSetGlobalVar
外部読み出し用のグローバル変数へデータをセットする
  • xLoversPkrSetMotionAdjustArraySub
座標調整データを登録する為のサブルーチン
  • xLoversPkrSetScale
身長スケールを指定の値に変更する
  • xLoversPkrSetTfc
TFCモードへ移行する
  • xLoversPkrSettingEffectSpellScript
演出関係の設定魔法処理
  • xLoversPkrSettingModListSpellScript
MODを一覧から選択する設定魔法処理
  • xLoversPkrSettingMotionSpellScript
モーション関係の設定魔法処理
  • xLoversPkrSettingNudeSpellScript
脱衣関係の設定魔法処理
  • xLoversPkrSettingSpellScript
Lovers システム設定魔法のルート処理
  • xLoversPkrSettingStepSpellScript
H段階関係の設定魔法処理
  • xLoversPkrSetVoiceSpellScript
個別音声関係の設定魔法処理
  • xLoversPkrSpermSplash
必要であれば射精演出処理を行う
  • xLoversPkrUpdateAdjustPositionFormatVersion
過去verの座標調整データを現行verのフォーマットへ変換する
  • xLoversPkrVerRevWarning
上書き更新でverやRevが変わった時の警告を表示する
  • xLoversQuestScript
対応MODが受け渡し変数として使うクエストのスクリプト
  • xLoversPkrPearlScript
見物人の目標となる「真珠アイテム」に添付してあるスクリプト(Rev90以降)
  • xLoversPkrResetVisitor
全ての見物人を見物状態から解放する(Rev90以降)
  • xLoversPkrQuestInit
ゲーム初回起動や再起動後に行われる初期化処理を関数化したもの(Rev90以降)
  • xLoversPkrSetFov
FoVの数値を変更する(Rev90以降)
  • xLoversPkrCheckUnnecessaryMod
システム本体に統合済の個別旧MODがアクティベートされていたら警告する(Rev90以降)
  • xLoversPkrNoGreetingExecute
NoGreeting処理を継続実行する(Rev90以降)
  • xLoversPkrNoGreetingReset
NoGreeting処理を終わらせる(Rev90以降)

v1.3改変を行った者からのお詫びとお礼
  • 当時 Oblivion+OBSEのスクリプトを触り始めたばかりだったので試行錯誤の勉強をしながら作業を行うこととなりました。その結果、関数名/変数名の命名規則がない、全体の処理の流れなどに一貫性がない、構成が汚すぎる、後付け処理が多くつぎはぎだらけ、他人には理解しづらい、という惨状となってしまいました、本当にごめんなさい orz
  • コールバック処理はスレで情報提供を頂いたおかげで実装できたシステムです、ありがとうございました。
  • スクリプトの細分化(モジュール化)はスレでのご要望により実装されたシステムです、アイディア提供ありがとうございました。
  • 動作検証にご協力してくださった皆様、いろいろなアイディアやアドバイスを提供してくださった皆様、対応MODやリソースデータを提供してくださった皆様、本当にありがとうございました。当時はたまたま私がMODを改変しましたが、実際に Loversシステムが進化したのは関係したすべての人たちの力によるものです。これからも Loversシステムが進化し続けることを願っています。


Loversシステムにおける Idle Animation管理について


Loversシステムにおける「Idle Animation(待機アニメーション)項目」は、
  • Lovers with PK.esm … モーション番号1〜9
  • LoversIdleAnimsPriority.esp … モーション番号10以降(最大数は任意)
というように分割管理されています。

「Lovers with PK.esm」の方に 1〜9番だけが残っているのは、旧Lovres v1.2システムとの完全な互換性を保つためでした。
しかし現在のシステムでは Lovers v1.2用に作られた旧MODは動作させることができないので、この分割管理に何の意味もなくなってしまいました orz

「LoversIdleAnimsPriority.esp」の方に主たる Idle Animation項目が含まれていますが、Loversシステム自体が LoversIdleAnimsPriority.espという特定のMODに依存しているわけではありません。
Loversシステム側では「xLoversSPosM」+「xLoversStageM」+「xLoversOff か xLoversDef」これらのアイテムを適切な数所持している状態で PickIdle を行った結果、いずれかのMODの影響により ani2フォルダ内のモーションが再生できてさえいればそれでOKだと判断します(PickIdleの結果は知らないどこかの誰かに任せている、という感じです)。
従って極端な例ですが、LoversIdleAnimsPriority.espを a.espという名前にリネームして、この a.espをアクティベートした状態で起動させても Loversシステムは正常に動作します。
LoversIdleAnimsPriority.espというファイルの存在を決め打ちで見ようとしているMODは、すでに更新が停止している診断MOD「LoversDiag.esp」だけだと思います(見ているのは LoversIdleAnimsPriority.espのアクティベート状態とMOD並び順のみで内容は見ていません)。

※2011/1/27 追記
[モーション]まとめ付属「LoversAnimObjectsPriority.esp」は「LoversIdleAnimsPriority.esp」をマスターファイルとして直接参照しており、「LoversIdleAnimsPriority.esp」内部の1〜200番のIdle Animation項目のFormID変更も厳禁だと思われます。

また、Idle Animation項目の管理を LoversIdleAnimsPriority.espひとつに集約させる必要はなく、複数のespに分割して管理することも可能です。
その場合、まったく新しいツリーに Idle Animationリストを作成してもOKです。

例)ツリーを3本に分けてみる
待機アニメーションのルート
  • Characters\_Male\IdleAnims
    • xLoversIdleAnims (モーション番号1〜9、esmの内容そのままで変更しない) → Lovers with PK.esm
      • xLanims01 〜 xLanims09
    • xLoversIdleAnims100 (モーション番号10〜100までを新しく格納してみる) → LoversIdleAnims100.esp
      • xLanims10 〜 xLanims100
    • xLoversIdleAnims200 (モーション番号101〜200までを新しく格納してみる) → LoversIdleAnims200.esp
      • xLanims101 〜 xLanims200
    • RaceMenuAnims
    • (以下略)

またモーションの最大数はオーバーライド用の関数 xLoversCmnGetMotionNumberMaxの戻り値によって決定するので、「最もモーション番号の大きいMOD」を「MOD並び順では後ろの方」にすればOKです。

例)複数のMODが xLoversCmnGetMotionNumberMaxをオーバーライドしている場合
〜MOD並び順:上〜
LoversIdleAnims100.esp … 戻り値 100
LoversIdleAnims200.esp … 戻り値 200 (こちらが優先される)
〜MOD並び順:下〜


モーション番号とUMIDについて


有志の方が様々なMODで使用されているモーション番号/UMIDの使用状況リストを作成してくださいました。
システム上、モーション番号が被っていても対処は可能ですが、少なからずとも混乱と手間がかかってしまうので、該当ページのリストを参考にして被っていないモーション番号にて配布を行って頂けますと幸いです。
また UMIDの方は他とは絶対に被ってはいけない識別番号なので、該当ページを参考にユニークな番号を付けるようにしてください。
Loversのモーション番号とumidの使用状況

「モーション番号」は iniファイルや kfファイルの頭に付いている数字のことで、これはユーザーが自由に変更してインストールすることが可能です。
「UMID」(UniqueMotionID/ユニークモーションID)というのは iniファイルの中に直接記入されている「固有の識別ID」です。
ユーザーが自由にモーション番号を変更してインストールしていた場合でも、UMIDという固有の識別IDがあるおかげで探し出して使用することが可能になります。

例) 以下のモーションの「モーション番号」は 77 です

77_Motion.ini
77_DefMotionx0
77_DefMotionx1
77_DefMotionx2
77_DefMotionx3
77_OffMotionx0
77_OffMotionx1
77_OffMotionx2
77_OffMotionx3

<判定方法>
iniファイルと kfファイルの先頭の数字で判別できます。
ややこしくて申し訳ありませんが【番号が一桁の場合には頭に0を付けて下さい】
× 3_Motion.ini
○ 03_Motion.ini

例) 以下のモーションの「UMID」は 12345678 です

(モーション設定 iniファイルの中身を一部抜粋)
set xLoversPkrQuest.umid to 12345678

<判別方法>
そのモーション用の iniファイルの中で「umid変数」に対して設定している数値が UMIDです。
umid変数に対する設定がない場合、このモーションは UMIDを持たないモーションとなります。

番号の被りについて

前述の通り、「モーション番号」は番号がかぶっていて使えなかったとしても、自分でファイル名を変更するだけで対処が可能です。
一方「UMID」に関しては「ユニーク」という言葉が表すように、他とは被ってはいけない唯一無二の数値でなければなりません。

なぜこのような面倒な方式になっているのか

限りある「モーション番号」が全て使用された後でも、ユーザー各自で好きなモーションデータを好きなモーション番号に変更して自由にインストールして使える為にです。
そのような柔軟性を持たせつつ、特定のモーションが何番にあるのかを「UMID」というユニークなIDを使うことで探し出して特定することも可能になります。

例えば「Ero.esp」という名の対応MODがあり、このMODにはオリジナルのモーションが同梱されていたとします。
そのモーションファイル一式は標準では「モーション番号」が 50 のファイル名だったとします。
しかしユーザーによってはすでにモーション番号 50は使用済なので、51にする人がいたり、100にする人がいたりします。
そうすると「Ero.esp」側では「うちのMODのオリジナルモーションを再生するぞ」となった時に、何番のモーションを再生すべきなのかが判断できません。
配布時には「モーション番号 50番」でしたが、ユーザーが変更している可能性があるので「モーション番号は 50である」と決め打ちできないからです。
そこで「UMID」の出番となります。
モーション設定 iniファイルの中で「UMID」の値を、例えば「12345678」に設定しておきます。
そうすると Lovers共通関数の「xLoversCmnGetMotionNumberByUMID」を呼び出すことで、該当する UMIDを持つモーションの「モーション番号」を探し出すことが可能になります。
上記の例ですと「Call xLoversCmnGetMotionNumberByUMID 12345678」とすれば、その UMIDを持つ「モーション番号」が帰ってきます。
環境によっては 50だったり、51だったり、100だったり、いろいろな数値が返ってきます。
これを Loversシステムの受け渡し変数の体位番号(SPos)に代入すればOKです。


資料が不足している場合

わからない点があったり資料が足りない場合には、下のコメントで【具体的な内容を質問】してみてください。誰かわかる人からの返答や情報の掲載があるかもしれません。

このページへのコメント

ovXc4H <a href="http://bbmgbkttooua.com/">bbmgbkttooua</a>, [url=http://qpcddxamlycm.com/]qpcddxamlycm[/url], [link=http://ppodneliiobs.com/]ppodneliiobs[/link], http://gzprixhxpqew.com/

0
Posted by ogyujzfgqk 2013年11月21日(木) 09:50:06 返信

RU6R01 <a href="http://zyjodgihcmuk.com/">zyjodgihcmuk</a>, [url=http://pxyiyqhkmikd.com/]pxyiyqhkmikd[/url], [link=http://nvcsenwjihgn.com/]nvcsenwjihgn[/link], http://xbeyueeopfsi.com/

0
Posted by fpudmyyw 2013年11月15日(金) 08:42:52 返信

特定の体位モーション「だけ」を再生させたい場合はどうしたらいいでしょう?
現状だと、追加体位も含め体位グループの中で行為段階ごとにランダムで再生されてしまうので、状況に合わない体位が選択されてしまうことがあります。非挿入グループの場合が特に悲惨で、パイズリ→クンニ→イラマ→足コキとか笑えない組み合わせができてしまったりしますw

UMID指定で特定の体位番号だけ再生出来れば一番いいのですが、これを改善するにはどうしたら良いでしょう?(勿論1〜9番など含めた全てのモーションにUMIDを付与するという前提で)

0
Posted by あ 2013年04月18日(木) 13:28:14 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

フリーエリア


どなたでも編集できます