SSEEditのスクリプトを書く

Modを作ろう

スクリプトを使って大量のレコードを一括処理しよう。

SSEEditはespを簡単に編集できるツールです。軽量で安定しているので、Mod制作に慣れた人ほど、CKよりSSEEditを操作している時間の方が増えます。

SSEEditのスクリプトとは

SSEEditはGUIツールですので、マウスとキーボードで操作するのですが、強力なスクリプト機能を持っています。大量のレコードを一括処理するにはスクリプトの利用が不可欠となってきます。

しかし、SSEEditのスクリプトはPascalという言語なので、あまり馴染みがなくて参考文献も少なく、難しいかもしれません。私もPascalは初めて触りました。SSEEditのEdit Scriptsディレクトリの中にスクリプトがたくさん入っています。ここのスクリプトとウェブを参考に、なんとか書けました。

ドキュメントはここここにあります。(スクリプトの解説に直接飛ぶとNot Foundになることがあるようです)

スクリプトの使い方

スクリプトを書いたら、Edit Scriptsディレクトリの中に置きます。SSEEditを再起動する必要はありません。

SSEEditで左ペインに並んでいるプラグインの中からスクリプトを適用したい項目を選んで右クリックします。そこから「Apply Scripts…」を選択します。使いたいスクリプトを選んでOKを押します。

大抵のスクリプトは選んだ項目にたいして処理を行います。1個だけ選べば1個、10個選んだら10個に処理を行います。ツリーの親を選ぶと全ての子を処理します。

スクリプトの基本構造

Sample xEdit script.pas (pascal)

{
  ここにスクリプトの説明を書く。
}


unit userscript;


// ここにスクリプト全体で共有する変数を定義する。
var
  sl1: TStringList;
  sl2: TStringList;


// ここに最初の1回だけ実行する処理を書く。
// レコードをいくつ選んでも実行するのは最初の1回だけ。
function Initialize: integer;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
end;


// ここに選んだレコード毎に実行する処理を書く。
// レコードを10個選んだら10回、100個選んだら100回実行する。
// eに当該レコードのエレメントが入っている。
function Process(e: IInterface): Integer;
var
i, j, id, mask: integer;
s: string;
ee: IInterface;
begin
  // abort if this element is not an armor
  if Signature(e) <> 'ARMO' then Exit;

  // 以下略
end;


// ここに最後の1回だけ実行する処理を書く。
// レコードをいくつ選んでも実行するのは最後の1回だけ。
function Finalize: integer;
var
  fname: string;
begin
  sl1.Free;
  sl2.Free;
end;


// スクリプトの終了の目印
end.

トラブル

少ないレコードを選ぶと速いのに、レコードをたくさん選ぶと徐々に遅くなってしまうことがありました。

これは、配列を大量に確保すると、途端に効率が低下してしまい、雪だるま式に遅くなってしまうようです。

例えばTStringListにたいして何度もAddをしていくと、どんどん遅くなっていきます。TStringListはProcess内で定義して、毎回Freeで解放するのがいいようです。

スクリプトのサンプル

スクリプト置き場

SSEで始まるのがSkyrim用です。ファイル名で何をするのかわかるようにしてあります。

補足が必要ないくつかのスクリプトについて、以下に解説します。

ファイル名内容
Armor - Add slot 52 for body armor.pas装備スロットに52番を追加します。
さらにArmor AddonのBiped Slotにも52番を追加します。
ArmorからArmor Addonを操作する例として。
Armor - Remove slot 54 from body armor.pasBiped Slotの54番を取り除きます。
The Ultimate Dodge Modがなぜか54番を追加しているので。
Armor - Remove non body armor.pas胴装備ではないものを削除します。
胴装備の選別用に。
Armor - Remove non body armor addon.pas胴装備ではないものを削除します。
胴装備の選別用に。
Armor - Fix Armor Rate.pas防御力をバニラ準拠に調整します。
上下一体型の防具向けです。
Armor - Fix Armor Rate Bikini.pas防御力をバニラ準拠に調整します。
上下別の防具向けです。
Armor - Fix Armor Keyword.pas不適切なキーワードを除去します。
Constructible - Add conditions.pasレシピの条件に「材料を持っていること」を追加します。
表示されるレシピが多すぎて困る場合に。
塩のように対象が多すぎるものは除外しています。
Landscape - merge.pas草を混ぜます。
Landscapeをひと通り網羅したespを作ります。
そのespにたいして本スクリプトを適用します。
機械的に混ぜるため重複しますので、適宜削除します。
Cell - Copy XCLL from parent.pasWSEnhancer.espのXCLLをコピーします。
自作のセル競合解決パッチにたいして使います。
コピー元のプラグイン名とレコードを指定できるので、他にも応用できると思います。
タイトルとURLをコピーしました