2018/05/31

アンレジスト(登録削除)ボタンが欲しい(3)

昨日の空スロットを詰める問題、なんとか解決しました。
まずはいったんこんな感じ↓で空じゃないアニメーションのレジスト名をカンマ区切りで繋げたひとつの文字列にしまして、

string function GetAnimsRegistryString(sslBaseAnimation[] Anims)
 string output = ""
 int i = 0
 While(i < Anims.length)
  if Anims[i] && Anims[i].Registry
   output += Anims[i].Registry + ","
  endif
  i += 1
 endWhile
 int nn = StringUtil.GetLength(output)
 output = StringUtil.Substring(output, 0, nn - 1)
 return output
endFunction
(↑一番最後のカンマをカットするのがポイントです)
こうして繋げた4ページ分のアニメーションのレジスト名を、PapyrusUtilのStringSplit関数を使ってstringの配列に変換してもらうのです。
stringとかboolとかであれば、Papyrusの配列128の限界はありませんので、これでSexLabのアニメーションのすべてを1つの配列で扱うことができます。
後はその配列を、PapyrusUtilのSliceStringArray関数を使って125個ずつに分けて、そこからsslBaseAnimationの配列を再構築してやるだけ。

奇数の番号のみ選択してゴミ箱にポイっすると、
アンレジストされたアニメは綺麗に無くなって、2ページ250個になりました。
これでアニメーションの整理がはかどるな。
動作確認のデバッグがてら、サムネ用のスクショでも撮影しようかと思います。

2018/05/30

アンレジスト(登録削除)ボタンが欲しい(2)

さて、いちおう、選んだアニメーションをアンレジストすること自体は実装できました。
(ゴミ箱行きを選んだものはナンバリングが黄色くなります。メニューを閉じた時点で削除)
しかし、実装してみて改めてわかったSexLabの仕様の問題が。
SexLabのアニメーションって、Max500個になった今でもいまだにPapyrusの配列128の壁の制限内にありまして、すべてのアニメーションを1つの配列として取得することはできないのです。つまり500個を128以下の個数で分割した複数の配列でしか受け取れないのです。
(Directorでは1ページ125個ずつの4配列でSexLabからアニメ情報を引き出しています)
また、SexLabでアニメーションを「アンレジスト」すると、SexLabは欠番になったアニメの分を自動的に詰めてくれたりはせず、配列の個数はそのまま、アンレジストされたアニメが入っていたスロットは「何もない」空っぽの状態が保持されるという仕様になってるのです。
この仕様のせいで、アニメーションをアンレジストすると、Directorではいくつか困ったことが発生します。

もともとDirectorでは途中でアニメーションが個別にアンレジストされて、ところどころ欠番が出るということを想定していなかったので、今のままでは欠番になったアニメーションのスロットは「何もない」空っぽの状態のまま表示されることになります。
表示されるだけならまだしも、その空スロットに対し「Enabled」や「Aggressive」などの付け外しを行えてしまえるという……だからアニメーションが入っていないスロットは詰めてやらないといかんわけですが、しかしSexLabの登録アニメーションをすべて一括で受け取る手段が無いので、空きスロット分を詰めて、レジスト済のものだけで配列を再構築、というのがかなりややこしいです。(しかも無駄に連番とか振っちゃってるしさ)

いや、まあ、私の頭が悪いだけなんですが……うん。もう少しやり方を考えます。

<本日の制作メモ>
ゲーム起動中にFlashのAction ScriptのデバッグをPapyrusログ内でするためには、Papyru内に下記のようなイベントを用意して、

Event OnUIlog(String asEventName, String asStringArg, Float afNumArg, Form akSender)
 Debug.Trace( "@@ [UI] - [SexLabDirector - HUD] - " + asStringArg)
EndEvent
Action Scriptの方で、そのイベントにコメントを送ってやればよい。

skse.SendModEvent("UIlog", "デバッグ用コメント");

Sublime text2で連番を自動入力するプラグイン……Input Sequence。
ショートカットキーは私は「ctrl+shift+B」に変更してた。
(設定はPreferences>Key Bindings - User を見ればよい)

2018/05/29

アンレジスト(登録削除)ボタンが欲しい

SexLab Animation Loader(SLAL)とか、今は凄い便利なModがありますね。アニメーションをEnabledする感覚で気軽にパコパコ突っ込めちゃう。まあ、調子にのって目に付くもの片っ端から突っ込んだらFNIS先生に怒られましたけども;

ところでアニメーションをぶっこむ方はいいのですが、「いや~、これは面白いんだけど……一生使わんやろう」と思うものを削除する方法が以外とないです。まあ、500も枠があればそのままにしときゃいいんですが、500もあるとかえって管理しずらくて……SLALのMCM上でアンレジストもできるといいんだけどいいんですが(できないよね??)
SexLab ToolsというあのDefeatの作者さまのお作りになったModを使えば、再生中のアニメーションをアンレジストできるみたいですが、せっかく久々にFlash触ったので、Directorにアンレジストボタンを実装してみることにしました。

アンレジストボタンはゴミ箱のマークにしました。
Sex中にDirectorを開くと、再生されているアニメーションの詳細画面が自動で開くようになってるので、そこで使わないアニメはポイっとゴミ箱へ。
それから他の「Enabled」「Leadin」「Aggresive」ボタンと同じようにいくつかのアニメをまとめて選択して捨てられるように、上部にボタンも付けることにしました。
もうスペースぎちぎちだったから、少しずつ他のボタンを詰めたり、短くリサイズしたりしてなんとか入れましたよ……
あとはPapyrus側の実装ですが。がんばります。

2018/05/28

SexLabアニメーションのインフレ

SexLab v1.61までのアニメーション数350(375?)にしか対応していなかったDirectorをv1.62のMAX500までのスロット数になんとか直しました。いやあ、久しぶりにFlashを触りましたが、何をどうしたら良いのかもうさっぱり忘れ去ってます。
いやでも作成環境がまるまる残ってて本当に良かった。
コンパイルが無事通った時には思わず拍手してしまいました。

そんなわけで「かなメニュー」を作った時のFlashの覚え書きが出てきたので転記しておきます。私が書いたものだけど、もう半分も意味がわからなくなってしまいました。

<インポートする各種クラス>
●import gfx.managers.FocusHandler;
たぶん選択肢やボタンなどをフォーカスさせたりするのに使ってる
handleInputというメソッドで、上下左右のキー入力によってフォーカスが移動するのを定義してるっぽい
●import gfx.ui.InputDetails;
謎。わからん。名前からして入力したキーの詳細データが入るのかな、と思うけど…
ちなみにskyuiバージョンでは、skseKeycodeという引数が新たに設定されている。
●import gfx.ui.NavigationCode;
TABやENTERといったキーの名称を定義したもの
●import Shared.GlobalFunc;
よくわからん。基本的な動作の定義をしてるっぽい。
●import skyui.components.ButtonPanel;
skiui独自のボタンパネル。第一引数のbuttonRendererを使って「button+数字」のボタンインスタンスを生成する。
「isReversed」(trueで右揃え)などのプロパティを持つ
●import skyui.defines.Input;
キーの名称を定義したもの。gfx.ui.NavigationCodeとはまた別。
●import skyui.util.GlobalFunctions;
skyuiの基本的動作の定義集か?
●import skyui.util.Translator;
$つきのテキストを加工する機能か?

(1)MovieClipクラスを拡張した、KanaMenuクラスを作る
(記述例)class uilib_1.KanaMenu extends MovieClip { ... }
flaファイルの階層下の「uilib_1」フォルダにasファイルを入れているため、クラス名の指定は「uilib_1.KanaMenu」となる
またクラスを記述したasファイルのファイル名はクラス名と同一でなくてはならない。
KanaMenuクラスのファイルは「KanaMenu.as」になる
作成したクラスは、ライブラリのシンボル、またはコンポーネントに、「リンケージ」で指定する

(2)クラスのプロパティやメソッドを定義する。
クラスのプロパティ(変数みたいなもん)とメソッド(関数みたいなもん)をメンバーと呼ぶ。
メンバーには、そのクラス自身に存在する「クラスメンバー」と
クラスのインスタンスごとに作られる「インスタンスメンバー」がある。

「クラスメンバー」は「static」というキーワードを使って作成する(静的メンバーと呼ばれる)
「クラスメンバー」はインスタンスを作らなくても直接クラスをターゲットにしてアクセスできる

「インスタンスメンバー」には「public」と「private」のキーワードがある。
「public」がついているプロパティやメソッドには、他のクラスやインスタンスからもアクセスできるが、
「private」がついているものには、他からはアクセスできない。

※別のクラスのメソッドを呼び出す際に生じたコンパイルエラーが、そのエラーの原因を修復しても消えないことがある。
その場合は、.asファイルをコンパイルした.asoファイルを削除すると、それらクラスが新規にコンパイルし直されて、エラーが解消する
asoファイルの削除:Controlメニューの「Delete ASO Files and Test Movie」

<KanaMenuクラスで定義しているプロパティ>

●クラス内の処理で使う変数はプライベートに
private var requestDataId_: Number;
private var cancelControls_: Object; // キャンセルボタンに使うキー
private var okControls_: Object; // OKボタンに使うキー
private var defaultKey_: Number = -1;

●ステージ上の要素(エレメント)はパブリックにしてアクセス可能にする
public var InputTextField: TextField; // テキスト入力欄
public var CancelButtonPanel: ButtonPanel; // キャンセルボタン
public var OkButtonPanel: ButtonPanel; // OKボタン

(3)コンストラクタを設定する。
クラスからインスタンスが作られる時に始めに呼ばれて、プロパティなどを設定するのがコンストラクタと呼ばれるものの機能(たぶん)コンストラクタの関数の名称はクラス名と同一。
KanaMenuクラスのコンストラクタは、KanaMenu()となる

何かを拡張しているクラスの場合、AS2.0では「super();」とやって、
親クラス(スーパークラス)のコンストラクタを自分で呼ばないといけないらしい。
public function KanaMenu()
{
 super();
}

2018/05/26

SexLabの表情jsonの書式

昔、ゲーム内で表情を確かめながらSexLab用の表情jsonファイルを作れるModを作った覚えがあるのに、どこに行ったかわからなくなりました。おまけに二年前の表情ファイルもMCMでSexLab自体の設定をエクスポートしたら上書きされて無くなってしまいました。
sex中の「表情」は「音声」の次に大事だと思ってるので、死活問題です。

とり急ぎ、SexLab用の表情jsonファイルがどんな仕様だったか、確認し直したのでメモっておきます。
SexLabの表情jsonとは「skse/plugins/SexLab/」に出力される奴のことですが、ぱっと見は数字の羅列で何がなんだかわかりません。
数字はそれぞれ「Phoneme」「Modifire」の各項目の強度になっており、最後に「MOOD TYPE」とその強度の「MOOD Strength」が並んでいます。
「female1」~「female5」、「male1」~「make5」の項目は受・攻の各フェイズを表しています。フェイズは最大5つまで、もちろん多い方が表情の変化をより楽しめます。

「Phoneme」は0から15の下記の16項目がそれぞれどのくらいの強さで適用されるかで並んでいます。強さは1~100を0.01~1.00として記載します。
0:Aah
1:BigAah
2:BMP
3:ChjSh
4:DST
5:Eee
6:Eh
7:FV
8:i
9:k
10:N
11:Oh
12:OohQ
13:R
14:Th
15:W
お次は「Modifire」。0~13まであります。カッコ内の日本語はRaceMenuの表情メニューの日本語訳です。
0:BlinkL(瞬き左)
1:BlinkR(瞬き右)
2.BrowDownL(左の眉を下げる)
3.BrowDownR(右の眉を下げる)
4.BrowInL(眉を左に)
5:BrowInR(眉を右に)
6:BrowUpL(左眉を上に)
7:BrowUpR(右眉を上に)
8:LockDown(視線を下に)
9:LockLeft(視線を左に)
10:LookRight(視線を右に)
11:LookUp(視線を上に)
12:SquintL(右斜視)
13:SquintR(左斜視)
最後に「MOD TYPE」。TYPEの数字を記載したら、最後にその強さも追加します。
0:Dialogue Anger(怒り)
1:Dialogue Fear(恐れ)
2:Dialogue Happy(喜び)
3:Dialogue Sad(悲しみ)
4:Dialogue Surprise(驚き)
5:Dialogue Puzzled(混乱)
6:Dialogue Disgusted(うんざり顔)
7:Mood Neutral
8:Mood Anger(ムード・怒り)
9:Mood Fear(ムード・恐れ)
10:Mood Happy(ムード・喜び)
11:Mood Sad(ムード・悲しみ)
12:Mood Surprise(ムード・驚き)
13:Mood Puzzled(ムード・混乱)
14:Mood Disgusted(ムード・うんざり)
15:Combat Anger(戦闘・怒り)
16:Conbat Shout(戦闘・シャウト)

2018/05/25

SexLabの音声の弄り方

2年ぶりのSkyrimではSexLabを始めとするModがことごとくアップデートしていました。
私が愛用していた御三家Mod(SexLab・Defeat・Soulgem Oven)も全部新たなバージョンに入れ直すことになったので、ただいま絶賛魔改造中です。
ところでSexLabなんですが、二年経っても相変わらずSexLabの音声はイケてないですね。
SexLabを導入したら、まず真っ先に変更すべきはデフォルトの音声ファイルだと思うので、今日はSexLabの音声について覚え書きをまとめたいと思います。

まずSexLabのデフォルトの音声(女性用8種・男性用4種)は「Sound/fx/SexLab/」配下にあります。単純にこちらにあるwavファイルを同じ名前で別の物に差し替えてやれば、セックス中の音声が変わるわけです。各フォルダがどの音声名に対応しているかは下記の通りです。
vFemaleMoan01……Classic (Female)
vFemaleMoan02……Breathy (Female)
vFemaleMoan03……Young (Female)
vFemaleMoan04……Stimulated (Female)
vFemaleMoan05……Quiet (Female)
vFemaleMoan06……Excitable (Female)
vFemaleMoan07……Average (Female)
vFemaleMoan08……Mature (Female)
vMaleMoan01……Neutral (Male)
vMaleMoan02……Calm (Male)
vMaleMoan03……Rough (Male)
vMaleMoan04……Average (Male)
ちなみにこれらの音声フォルダの中はさらに「hot」「medium」「mild」のフォルダに分かれています(「hot」フォルダが無い音声もあります)。
名称からいって「mild」<「medium」<「hot」の順で再生されるのかなと思いきや、実はスクリプト上ではこんな設定だったりします。
上記はSexLabの音声全般を担当する「sslBaseVoice.psc」スクリプト内にある、セックス中に発生する音声を決定する関数です。
これを見る限り音声の出しわけはこんな風になっているのがわかります。
「Hot」……Strengthが76以上(ただしHotの音声が存在する場合)
「Medium」……レイプの被害者(ただしMediumの音声が存在する場合)
「Mild」……Strengthが75以下でレイプの被害者じゃない場合
「Strength(強さ)」はSex中は「Enjoyment」の値がそのまま放り込まれてます。
「Enjoyment(悦楽)」というのはSexLabのセックス中のステータスの一種で、Sexをどれだけ楽しんでいるかの数値です。SexLabのv1.6番台がリリースされた直後の頃は行為中にコンソール窓を開くと「Enjoyment」の値が確認できるように出力されてたんですが、今は開発モードにしても出なくなってますね。
この「Enjoyment」がどのような仕組みで増減するのかは、SexLabのv1.6になってからはSKSEのプラグインのdllの中で計算されるネイティブの関数になってしまったので詳細はわからないのですが、引数を見る限りでは「Sexのスキル」「前戯をしたかどうか」「Sex時間」「全ステージ内で現在どのステージにいるか」などが関係していることがわかります。
まあ私が観察する限り、Sexアニメーションのステージが高いほど「Enjoyment」が上がりまくって最終ステージではよっぽどの早漏でない限り100になってることが多いです。

まあそれはさておき、Sex中の音声がどのような法則で出し分けされてるかが分かったところで問題なのは、この「hot」「medium」「mild」の出し分けの条件が私の好みには全然合わなくて、単なる音声ファイルの差し替えでは何も改善されないということです。
私は、和姦と強姦とで声の出し分けは要りません。
ああ、イクイク…って極まってる時か、そこまでいってないか、くらいの区分けで結構。
(好みの音声ファイルを用意するのも大変だしね)
それよりも欲しいのは、女の子がフェラチオしている時の「んっ…んっ…」みたいな声です。
SexLabのオーラル系のアニメーションでは「silent」のフラグがつくので、いきなり音声が消えてシーンとなっちゃうんですが、今までアンアン言ってた娘が急に無言になるのは違和感ありまくりで結構萎えます。
そんなわけで私は「hot」をフェラチオ用の音声に、「medium」「mild」を和姦・強姦の区別なくEnjoyment(Strength)50を境目にして使い分けることにしました。

さきほどの「GetSound」関数をこんな風に変更。
これでStrength50以上と以下で「medium」「mild」のどちらかになります。
フェラチオ用の「Hot」はどうするのかというと、デフォルトの「PlayMoan」という関数をそっくり真似してフェラチオ専用に「PlayOralMoan」という関数を新たに作ってやります。
本当はデフォルトの「PlayMoan」関数の中でフェラチオ用とそうでない時の切り分けをしたいんですが、デフォのPlayMoanの引数だけでは「フェラチオしてる時」を判別できないのです。(勝手に引数を追加しちゃうと、SexLabの他のアドオンModでこの関数を呼び出している時にエラーになっちゃうので追加できないのよね)
なのでフェラチオ時かどうかの判定は、「PlayMoan」関数を呼び出している大元の「sslActorAlias.psc」でやります。
「sslActorAlias.psc」というのはその名前の通り、SexLabのセックス中のアクター全員にかかっているセックス中の人物の挙動を司るスクリプトです。

↓これがオリジナルの「sslActorAlias.psc」中の音声呼び出し
SexLabのデフォルトの設定ではセックス中の音声は各アクターの「OnUpdate」のタイミングで「sslBaseVoice.psc」スクリプトの「PlayMoan」関数が呼ばれることで発声するようになっています。
条件としては「isSilent」、つまり再生されているアニメーションが「音声無し」のフラグがついているかどうかしか見ていません。
あまりに大ざっぱすぎるので、それをこんな風↓に改造してやります。
「OpenMouth」というのは「Silent」と同じく、各アニメーションごとに設定されているフラグです。この「OpenMouth」のフラグが立っていると、そのアニメーションを再生するアクターはMfgコンソールのSetPhonemeModifierでガバっと大口を開けるのです。
(もちろんアニメの各ステージの各アクターごとにフラグが設定されているのですよ)
単に「isSilent」かどうかの判断だと、たまに手コキしてる時まで「Silent」になってる時があるので、おしゃぶりしているかどうかの判定は「OpenMouth」で判断した方がよいと思います。
こうして条件わけして、フェラしている時(OpenMouth時)は、先ほど作ったフェラ専用Moan(呻き)関数「PlayOralMoan」を呼んでやります。
二年前はボイスの種類を新たに追加するアドオンModを作ったりしたものですが、もうそこまでやるのは面倒くさいので、デフォルトの音声ファイルの差し替えだけで済むように改造しています。
とりあえずフェラしてる時、それ用の声が出ればいいよ、うん。

ところでデフォルトの音声ファイルを差し替えただけだと、どのフォルダにどんなタイプの声を入れたか、わからなくなりません?
「Classic (Female)」とか「Breathy (Female)」とかデフォルトの音声名のままだと判別つかないので、名前を変えてやりましょう。
MCM上のこの音声名を変えてやるには、デフォルトのボイス設定をしている「sslVoiceDefaults.psc」を弄ってやります。
たとえば「Average (Female)」だったら「FemaleAverage」という関数で設定されているので、その中にある「Base.Name」という項目のところを変更すればOK。
すでにSexLabを導入中でも、MCMの音声をリセットする項目でレジストし直してやれば、名前が変わってくれます。
セックス中の声って、キャラクターの見た目より大事だと思います(しみじみ)。


2018/05/17

MCMのMod名を変更する方法

調べたけど探し方が悪いのかどこにもやり方が載ってなかったのでメモ。
ただいま二年ぶりにMod環境構築中なんですが、しょっちゅう設定を弄るModは毎回探すの大変なんでMCMの一番上に登録されてて欲しいです。でもこのリストの並び順は勝手にMod名のアルファベット順で並んでしまうようになってる。
…というわけでMCMのMod名を変更して並び順を一番上に来るようにします。
まず変更したいModの、MCMを設定しているスクリプトを探す。大抵ファイル名に「mcm」とか「config」とかいう名称が入っているのでそれで見当をつけて、ファイルを開いたら一行目を見る。

Scriptname sslConfigMenu extends SKI_ConfigBase
こんな感じで「SKI_ConfigBase」の拡張スクリプトになってればアタリ。

そうしたら「OnGameReload()」イベントにMod名を変更する記述を加えます。
「OnGameRelad()」イベントはゲームをリロードするたびに呼ばれる処理。
これから新規で入れるModの場合は「OnConfigInit()」イベントの方がいいんだけど、既に導入してしまっている場合は「OnGameReload()」イベントの方がいいかと。
「ModName」というのはMCMで使われてるMod名の変数なので、元々あるその変数に変更したい名称をぶち込みます。

「OnGameRelad()」イベントがスクリプト内に無い場合は自分で追加しちゃって良し。
んでスクリプトをコンパイルしたらゲームを起動して、最後にコンソールコマンドでMCMをリセットします。

setstage ski_configmanagerinstance 1
これでMCMが再度Modをレジストし直してくれるので、変更した名前に変わってくれます。
このコマンドはMCMになかなかModが登録されない場合も有効。
batでいつでも実行できるようにtxtファイルにしてskyrimフォルダに入れておくべし。