PC版 Skyrim Lab系列のまとめWiki

はじめに


既にModを作ったことがある人向けの内容で、知識共有を目的としています。記述もそういった人向けです。これを書けばOKではなく、実装の出発点になることを目的としています。
うそ、おおげさ、まぎらわしい部分、またより良い方法があればぜひ修正してください。記述は1.62のものです。1.61では機能しないものもあるかもしれませんが調べるのはめんどいので1.62を使ってください。

SexLabFramework.pscをSexLabとします。ファイル名.関数名()という記述を使います。オブジェクト名.関数名()という記述も使います。
LLのWikiはAshal氏が何回直しても落ちてしまうので、詳細はSexLabのソースを直接読みましょう。関数名の前に説明が書いてあります。Sourceフォルダで"grep function *"とかしておくと楽しいです。

網羅するつもりは全くなく、SexLab.GetGender()とか特に説明が必要なく有名なものは省きます。
ぜひ勝手に追加&修正してください。

この文書に書いてある知識はSexLabのソースはもとより、LoversLabのフォーラムやBBSPinkのスレッドの投稿、両者で公開されているModのコードなどから得たものです。
全てのModderに感謝するとともに、この文書が新たなModder誕生に役立つことを願います。

とりあえずSexする


めんどい時はSexLab.QuickStart()。Actor[]を作らなくて済む。

sslThreadController function QuickStart(Actor Actor1, Actor Actor2 = none, Actor Actor3 = none, Actor Actor4 = none, Actor Actor5 = none, Actor Victim = none, string Hook = "", string AnimationTags = "")

QuickStart()はほとんどデフォルト値を持っているので、SSLを使う最小コードは下記になる。

SexLab.QuickStart(Game.GetPlayer())

SexLabのプロパティをCKで間違いなく指定できれば上記だけでPCがオナニーする。

QuickStart()だけを使った簡単なModの実例は下記。



もうちょっと真面目にSexする


普通の時はSexLab.StartSex()。基本。

int function StartSex(Actor[] Positions, sslBaseAnimation[] Anims, Actor Victim = none, ObjectReference CenterOn = none, bool AllowBed = true, string Hook = "")

以下はより細かく設定したい時。前戯なしとか。
SexLabFramework.pscにあるStartSex()のコードを参照。例えば次みたいな感じで作る。

int Function QuickSex(Actor[] Positions, sslBaseAnimation[] Anims, Actor Victim = None, Actor CenterOn = None)
	
	; 脱衣スロットの前準備
	bool[] stripoverwrite = new bool[33]
	int i = 0
	while (i != 33)
		stripoverwrite[i] = false ; trueなら脱衣
		i += 1
	endwhile

	sslThreadModel Thread = SexLab.NewThread()
	if !Thread
		return -1
	elseIf !Thread.AddActors(Positions, Victim)
		return -1
	endIf
	
	; ここらへんから設定・もちろんどれかだけ指定が可能
	Thread.SetAnimations(Anims)
	Thread.DisableBedUse(true) ; ベッド使わない
	Thread.DisableLeadIn() ; 前戯なし
	Thread.CenterOnObject(CenterOn)
	Thread.SetStrip(Positions[0], stripoverwrite) ; 脱衣させない
	Thread.SetStrip(Positions[1], stripoverwrite) ; 脱衣させない
	Thread.DisableUndressAnimation() ; 脱衣アニメしない
	Thread.DisableRedress() ; 再着衣させない
	Thread.DisableRagdollEnd() ; ラグドールエンドさせない

	if Thread.StartThread()
		return Thread.tid
	endIf
	return -1
EndFunction

アニメーションの構築方法


SexLab.StartSex()とかに渡すsslBaseAnimation[]の話。

直打ちで、

	sslBaseAnimation[] anims
	anims = SexLab.GetAnimationsByTags(2, "mf,kissing", "sex")

こうやって用意するのもいいけど、3Pとか4Pとかゲイとかレズとか考えるとifelseの嵐になるので、同じコードはこう書ける。

	sslBaseAnimation[] anims
	string tag = SexLab.MakeAnimationGenderTag(sexActors)
	tag += ",kissing"
	anims = SexLab.GetAnimationsByTags(sexActors.Length, tag, "sex")

sexActorsが"MM","FF"の時、tagがそうなるので、それが嫌な場合はコードを足すこと。

アニメーションのタグの話(嘘あるかも)

  • "MF"と"fm"に違いはない
  • アニメ作者が"MF"とか指定していても、SSLのほうで登録時に勝手に(アニメの設定ファイルを元に)"fm"をつける
  • "fccc"とかも同じ

ActorがSex中かどうか


CKのConditionでも使えるやつ。

Actor.IsInFaction(SexLabAnimatingFaction)

↓はDefeat作者もおすすめしてる方法。Form.HasKeywordString()はSKSEの関数なので、SSL以外で使用する場合は注意。

Actor.HasKeyWordString("SexLabActive")

他にもSexLab.IsActorActive()とか、SexLab.IsValidActor()とかSexLab.ValidateActor()とかいろいろ。boolが返ってくるSexLab.IsValidActor(Actor)が使いやすいけど過信は禁物。詳細はsslActorLibrary.pscとかに。

ベッド探す


SexLab.FindBed()

ObjectReference function FindBed(ObjectReference CenterRef, float Radius = 1000.0, bool IgnoreUsed = true, ObjectReference IgnoreRef1 = none, ObjectReference IgnoreRef2 = none)

SSLの「ベッド」の取り扱い

  • SexLabBedsというFormListで管理されてる
  • 追加するにはそこにFurnitureを突っ込む
  • BedrollやDoubleBedはその後に、更にSexLabBedRollsとかのFormListに突っ込むと、Bedrollとかの判定になる
  • 1.62ではSexLab.AddCustomBed()ができた。SexLab.SetCustomBedOffset()とかもある。
  • ベッドのオフセットは「前、横、上、回転」。デフォルトは「30, 0, 37, 0」。ベッドロールは「30, 0, 0, 0」。

適当に相手を探す


SexLab.FindAvailableActor()

Actor function FindAvailableActor(ObjectReference CenterRef, float Radius = 5000.0, int FindGender = -1, Actor IgnoreRef1 = none, Actor IgnoreRef2 = none, Actor IgnoreRef3 = none, Actor IgnoreRef4 = none)

クリーチャー用とかの別の関数もあるよ。

Arousal値 (SSLの機能ではないが、細かいことは気にしない)


マスター指定がいらない取り方もあるが(思い違いで、なかったかも)、まあもう必要ないでしょう。

Actor.GetFactionRank(sla_Arousal)

精液関係


SexLabFramework.pscのここらへん。

function AddCum(Actor ActorRef, bool Vaginal = true, bool Oral = true, bool Anal = true)
function ClearCum(Actor ActorRef)

int function CountCum(Actor ActorRef, bool Vaginal = true, bool Oral = true, bool Anal = true)
int function CountCumVaginal(Actor ActorRef)
int function CountCumOral(Actor ActorRef)
int function CountCumAnal(Actor ActorRef)

今選択しているアニメーションの射精位置を取得して受け側に精液つけるのは下記な感じ(本当はSexLabがしていること)

int cumid = controller.Animation.GetCum(0)
SexLab.ActorLib.ApplyCum(controller.Positions[0], cumid)

ApplyCumは(DEPRECATED)で使うんじゃねえって言われてるんだけど、こういう用途ではこっちのが楽。

アニメーション実行できるクリーチャーかどうか


事前にActorTypeNPC使って人型は弾いた上で下みたいにする。要するに、SexLab.ValidateActorの実体のActorLib.ValidateActor(sslActorLibrary.psc)からクリーチャー部分を抜き出したもの。

int Function ValidateCreature(Actor ActorRef)  ; from ActorLib.ValidateActor
	ActorBase BaseRef = ActorRef.GetLeveledActorBase()
	
	if !SexLab.Config.AllowCreatures
		return -17
	elseIf !sslCreatureAnimationSlots.HasCreatureType(ActorRef)
		return -18
	elseIf !SexLab.CreatureSlots.HasAnimation(BaseRef.GetRace(), SexLab.GetGender(ActorRef))
		return -19
	endIf
	
	return 1
EndFunction

素のValidateActorは試した限りではFormListFindとFormListAddのせいでうまく判定できなかった。正しい仕様がわからないので何とも言えない。

アニメーションを制御するsslThreadController


SexLab自身が持っているSpace押すと次のステージとか、Shift+Spaceで前のステージとか、そういう制御をするにはsslThreadControllerを使う。
SSLは15本スレッドを持ってるんで、スレッドIDを指定して、

sslThreadController controller = SexLab.GetController(tid)

ゲットする。tidはStartSex()の返り値とか、↓のEventで勝手に入るtidとかで使われてる。

あとSSLが走っているActorからも、

sslThreadController controller = SexLab.GetActorController(Actor)

でsslThreadControllerをゲットできる。QuickStart()のほうの返り値もsslThreadController。

sslThreadControllerにはいろいろな機能があって、例えば、

sslThreadController controller = SexLab.GetActorController(Actor)

Actor aggr = controller.Positions[1] ; => Actorを取得できる
int stagecnt = controller.Animation.StageCount ; => アニメのステージ数を取得できる
controller.Stage ; => 現在のステージを取得できる
controller.GoToStage(stagecnt - 2) ; => 任意のステージに変更できる
controller.ChangeAnimation() ; => アニメを変更できる。いわゆる「O」キー
; controller.EndAnimation() ; => アニメを終了

とかとか。

sslThreadController活用法・(何かあったら)Sex止める


ReferenceAliasに以下のようなスクリプトをくっつける。かなりはしょったコード。
このコードではOnHit()なので、攻撃を受けたら中止する。

応用すると、敵を発見して戦闘状態になったら(赤丸状態の敵)Sex中止とかもできる。
試作した山賊さんの夜の営みModでは、見つかりまくってSexが見れないという本末転倒になった。
隠密プレイなら楽しいかもしれないと、Sex中は発見率を下げて……とかやってるうちにお蔵入り。

Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, Bool abPowerAttack, Bool abSneakAttack, Bool abBashAttack, Bool abHitBlocked) 
	Actor selfact = self.GetActorRef()
	
	if selfact.HasKeyWordString("SexLabActive")
		sslThreadController controller = SexLab.GetActorController(selfact)
		controller.EndAnimation()
	endif
EndEvent

特定のSSL Eventに割り込み処理を入れる


要するにこのStartSexしたSexが終わったら(はじまったら、ステージが変わったら、絶頂に達したら、とか色々可能)〜〜したいという時。
TrackActor()でもできるはず。TrackActorのほうは指定できるフックが「Added / Start / Orgasm / End」の4種類。特定のActorに対して、このEvent時にCallbackを起動する。
Hookの方はあげるのが面倒なほどたくさんあるので、SexLabFramework.pscの"HOOK"のところを参照のこと。

Function Something(Actor act)
	SexLab.QuickStart(act, Hook="SomethingHookName")
	RegisterForModEvent("HookAnimationEnd_SomethingHookName", "EndSexEventSomethingHookName")
EndFunction

Event EndSexEventSomethingHookName(int tid, bool HasPlayer)
	sslThreadController controller = SexLab.GetController(tid)
	; dosomething()
EndEvent

全てのSSL Eventに割り込み処理を入れる


他のModで発生するすべてのSSLのアニメに割り込みを入れる時に使う。
以下はコードの例。常時立ち上げのQuestのスクリプトにすること。

Event OnInit()
	RegisterForModEvent("HookOrgasmEnd", "SSLSomethingPluginOrgasmEnd")
EndEvent

Event SSLSomethingPluginOrgasmEnd(int tid, bool hasPlayer) ; 引数はこのまま
	sslThreadController controller = SexLab.GetController(tid)
	; dosomething()
EndEvent

SSLアニメ中に死んだActorが固まったりするのを防止する


アニメーション中に死ぬとおかしくなるやつ。死んでるのに足踏みしてたり、空中で固定されていたり。
多分誰でも一度は遭遇していると思う。

ReferenceAliasに以下のスクリプトをくっつける。

Event OnDying(Actor akKiller)
	ObjectReference wobj = self.GetActorRef() as ObjectReference
	wobj.SetPosition(wobj.GetPositionX(), wobj.GetPositionY() + 10.0, wobj.GetPositionZ())
	debug.sendAnimationEvent(wobj, "ragdoll")
EndEvent

SSLのアニメで脱がせない


ArmorにSexLabNoStrip Keywordをつける。SOSとかがこうしているらしい。

CK上で日本語で開発を進める(クエストとか、ダイアログとか)


SSLとは全く関係ない。
クエストModとか複雑に入り組んだダイアログとかで、CK上で英語で入力→xTranslatorで翻訳を通す、がやってられない時に。

CK上で何もなしに入力された日本語はcp932になる。Skyrim上ではUTF-8しか正常に表示できないため、xTranslatorで強制的にUTF-8に変換する。
昔おばちゃんところでString LocalizerのほうのSSLでしていた方法のxTranslator版。赤丸のところが強制変換。


  1. (元々日本語化されているespの場合は、ここでUTF-8→932に変換する)
  2. CKで932のespを開いて作業して保存する。保存後もCKは終了させない
  3. xTranslatorでUTF-8に強制変換して、espを保存
  4. Skyrimを立ち上げてテストして、終わったら終了する
  5. 開きっぱなしのCKで修正など作業、終わったら保存
  6. xTranslatorでCtrl+Wで一度espを閉じる
  7. xTranslatorで再度espを開いてUTF-8に変換して、espを保存
  8. Skyrimを立ち上げて……以下ループ

いったん終了して、続いてそのまま作業を進めたい場合は最後にCKで保存。配布する場合はxTranslatorでUTF-8になった状態で保存すること。

その他


  • SexLabUtil.pscにいろいろ便利そうな関数がたくさんある
  • 長くModを作るなら、
    • 必ずエディタからコンパイルできるようにするべき。作業効率が全然違う
    • 何らかのバージョン管理システムは必ず使うべき。人間はバックアップしない生き物だから
  • 以下のページをブラウザにピン止めするのをお勧め
  • あまり紹介されていない開発に便利なコンソールコマンド
    • sqv questid => ShowQuestVars : クエストが立ち上がっているんだかいないんだか、エイリアスが埋まっているんだかいないんだか調べるときに
    • (キャラクリックして) sv => ShowVars : そのキャラのエイリアスの状態とか調べるときに

このページへのコメント

エロmod弄りやり出すとこう言う経験に基づいた細かい便利テクの話は有難いね。ゲージンさんの書いたスクリプトソースを何の指標も無しに調べるのって結構疲れるし。DDやDCLの特定イベントの挙動にどのスクリプトが関わってるのか調べるだけで素人には半月掛かったりしたよ・・・

0
Posted by 名無し(ID:7m87ZFY7ug) 2018年06月12日(火) 10:20:01 返信

素晴らしい。こういうの。

0
Posted by 名無し(ID:UEf/agd/bg) 2018年05月12日(土) 02:54:40 返信

コメントをかく


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

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

どなたでも編集できます