独自チューニング付きオブジェクトの簡単な作り方(シムズ3 MOD 作成練習5)

体力回復の早いベッドを作ってみた」で作ったベッドを TSRW と s3pe で作る方法を順に書いていってみたいと思います~。

C# 何それ? な方でも、この通りにやったら作れるように書いたつもりです(そうなってなかったらすみません)。
正直私もプログラミングの専門用語とかはよく解ってないですし、判りやすいかな? と思った言い方で説明したりしているので、間違ったこと言ってるかもしれません(^_^;) ご指摘いただければ直します!

具体的に何をするのか

まず、オブジェクトが持つ環境値やムードレットのスコア(+10 とか -30 とか)、欲求回復スピードなどの細かい設定は、XML チューニング MOD で有名な _XML リソースで管理しています(ITUN もだけどややこしくなるので省略)。

オブジェクトにも基本的にこの調整ファイルをオブジェクトの種類ごとに1つは持っています。中にはベッドのように、「真鍮のシングルベッド」「真鍮のダブルベッド」「カントリーなシングルベッド」「カントリーなダブルベッド」…と一番小さいカテゴリでひとつずつ持っているオブジェクトもあり、そういうものは同じ種類のオブジェクトでも各々違う効果を得られるようになっています。

だから Same Energy Gain For Every Bed のようなスクリプト MOD を使わずに、チューニングファイルのみで全てのデフォベッドの体力回復スピードを変えようと思ったらかなり面倒くさいことになりますw(でも一度作っちゃえば便利ですね! もうゲームアップデートはないだろうし)

自作オブジェクトの場合のチューニングファイルは、元にしたオブジェクトのものが使われています。「このベッド、もっと回復スピードを早くしたいわ~」と思って、その元のオブジェクトの _XML リソースを変更してしまうと、元オブジェクト、またそれを元に作られたその他のユーザーメイドオブジェクトにまで影響が出てしまいます。

というわけで、自作オブジェクトにだけ適用させたい場合は、新たにチューニングファイルを用意しなければなりません。しかもそれ用にスクリプトも作らなくてはなりません(!)。

スクリプトはプログラミングの知識も必要で、まず Visual Studio を用意するのも面倒でなかなか気軽に作れませんが、なんと TSRW で簡単に作れる方法があったので、ご紹介したいと思ったのがこの記事ですw(本題まで長いw ここまでの説明で余計に何をするのかイメージ遠のいたらごめんなさい)

今回の方法では、オブジェクトに新しい機能をつけることは出来ません。あくまで変えられるのは、デフォルトで設定されていることだけです。
ベースゲームだけでもそれなりにオブジェクトは揃ってるので、わざわざ付けることはないかもしれませんが、スクリプト MOD の取っ掛かりにいかがでしょうか?!

必要ツール

  • s3pe・・・もしかしたら s3pi-wrappers も必要かも。
  • TSRW
  • ILSpy・・・フリーの逆コンパイラ。これでゲームのソースファイルを見れます! 右上の Download Binaries より zipファイルを保存して解凍するだけです。同様のソフトをお持ちなら、ILSpy は不要です。

s3pe と ILSpy を使用するには、.Net Framework 4.0 が必要です。
もしチュートリアル内で書いている項目が s3pe で出てこなかったら、s3pi-wrappers も入れてください。導入方法は「フリーソフトのみで作るシムズ3オブジェクト【1】 準備編」を参考にしてください。

前準備

ゲームライブラリの抽出

  1. s3pe を開き、File > Open... から[シムズ3本体インストールフォルダ]\Game\Bin まで行きます。そこには gameplay.package、scripts.package、simcore.package の3つの package ファイルがあると思います。

    間違って変更してしまったら再インストールする羽目になるので、読み取り専用で開いたり、別のフォルダにこの3つの package をコピーしてから、以降の手順を進めるといいかもしれません。

  2. まずは gameplay.package を開いてください。4つある S3SA リソースをひとつずつ選択、右クリックメニューから Export DLL を押して、全部エクスポートします。名前は付けられていると思うので、そのまま保存すれば OK です。

  3. 残りの scripts.package、simcore.package も同様にして全てエクスポートしてください。

  4. これで以下の dll ファイル 10個を抽出できたと思います。全部同じフォルダに一纏めにして保管しておきましょう(まだパッチが出ていた頃は、MOD 職人の方々はバージョンごとにフォルダ作って保管されていたそうです…!)。
    以下は Tutorial:Sims 3 Pure Scripting Modding からの引用。

    • Sims3StoreObjects.dll (from gameplay.package)
    • Sims3GameplayObjects.dll (from gameplay.package)
    • Sims3GameplaySystems.dll (from gameplay.package)
    • UI.dll (from gameplay.package)
    • SimIFace.dll (from scripts.package)
    • ScriptCore.dll (from scripts.package)
    • Sims3Metadata.dll (from scripts.package)
    • System.Xml.dll (from simcore.package)
    • System.dll (from simcore.package)
    • mscorlib.dll (from simcore.package)
  5. s3pe を閉じます。

ILSpy にゲームライブラリをセットする

  1. ILSpy を開きます。


  2. 上記画像は画面を小さくしていますが、左側のツリービューに最初からあるものは削除しても大丈夫なので、シムでしか使う予定がない場合は削除しちゃいましょうw

  3. File > 開く から(うちの環境では何故か「開く」だけ日本語だった)、先ほど抽出した 10個のライブラリを開きます。全部選択して一度に開けます。

  4. 開いた 10ファイルがツリービューに並べられたのを確認して、ILSpy を閉じます。


これで前準備は完了です!
次項からいよいよ作成方法を説明していきます~。

1.オブジェクトをクローンする

TSRW で元にしたいオブジェクトを選んでクローンします。ここでの例はベッド。

クローンできたらプロジェクトを保存しておきましょう。
(オブジェクトクローンの基本は、オブジェクト制作過程2をご覧ください)

2.クローン元のスクリプトクラスをメモしておく

Edit > Project contents を開き、OBJK を選択します。

この次は、どちらかの方法を選んでください。

私の環境では TSRW 2.0.168.0 をインストール後、2-1.の方法の Script Class Editor を開けなかったんですよね~。PC を再起動したら開けるようになりましたが。
s3pe plugin を使える TSRW をお持ちの方は、s3pe で OBJK を開いて確認してもいいです。

2-1.Script Class Editor から確認する

右クリックメニューから、Edit → Script Class Editor をクリックします。

もしこのウィンドウが出てこなかったら、2-2.の方法をお試しください。

2-2.Generic DBPFEntry Editors から確認する

右クリックメニューから、Edit → Generic DBPFEntry Editors をクリックします。


Entries のラインの右端にある "..." ボタンを押します。


右側の画面の KeyName が scriptClass になっているものを左側のメンバから選びます。ここで必要なのは StringValue です。


いずれかの方法でスクリプトクラスの名前を見ることが出来たら、最後のドットより後ろの文字列をコピーしておきます(Sims3.Gameplay.Objects.Beds.Mimics.BedSingleCountry なら BedSingleCountry)。何度か使うので、メモ帳を開いたりしてそちらにも貼り付けておくといいでしょう。

コピーしたら、それぞれのウィンドウを閉じ("キャンセル" や "Close" ボタン押せば OK)、プロジェクトのメイン画面に戻っておいてください。

※重要

このスクリプトクラスの文字列の中に、Mimics という文字が入っていないオブジェクトは、独自チューニング付けるのはさくっとコピペで終わらないかも…。今回は対象外ということで(^_^;)

3.ゲームライブラリから、クローン元で使われているスクリプトをコピーしてくる

TSRW を開いたまま、ILSpy を起動します。
ツールバー(?)のセレクトボックスが C# になっていることを確認し、虫眼鏡のアイコンを押します。


現れた検索ボックスに、2.でコピーした文字列を貼り付けます。
出てくるのはたぶん1つだと思うので、それをダブルクリックして開きます。

曖昧な単語で検索したりして複数見つかった場合は、右側に表示されている「{} Sims3.Gameplay.Objects.」から始まる文字列の最後が Mimics って書かれているものを選んでください。同じ種類のオブジェクトなら、一部例外除いてどれも同じだと思います。

下の画面に出てきたコードを全部コピーします(下の画面をクリックし、Ctrl + A で全選択、Ctrl + C でコピー)。一部折りたたまれている部分があっても、わざわざ開かなくてもコピーされます。

4.Script Source Editor で編集

TSRW に戻り、Tools > Script Editor を開きます。


「このスクリプトクラスのソースが見つかりませんでした。新しいスタブクラスを作りますか?」みたいなことを聞かれるので、"はい" を押します。


Script Source Editor が開かれました。テンプレート作ってくれてますねー!
しかしこのテンプレは不要なので削除し、先ほどコピーしたコードを貼り付けます!

続いて、画像内のハイライトした部分を書き換えます(画像クリックで原寸。別タブ表示推奨)。

namespace はアドレスみたいなものらしいです。その中に入ってるクラスの名前(このベッド用スクリプトの名前と思っておけばいいかな?)はゲームやユーザーメイド MOD で使われてるクラス名と被らない名前にしなくてはいけないので、namespace は絶対に EA や他の MOD 職人さんが使っているものを使ってはいけません。ってチュートリアルに書かれてましたw 同姓同名でも住所が違えば別人と判断できますもんね!(そんな認識でいいのか?w)

そしてさらにオブジェクト MOD の場合、Sims3.Gameplay.Objects. から始まる名前にしないといけないそうです。そうしないと購入モードから設置しようとしたときに強制終了を引き起こすらしいです。
というわけで Mimics 削って、チュートリアルに倣い junaMod を追記しておきました。

クラス名は public class ○○ : △△ の ○○ の部分です。○○ には2.で控えた文字列が書かれていると思います。ここ以外にも、同じ文字列があったら変更しましょう。
この部分は TSRW が出力する S3SA リソースのインスタンス生成に使われるので、自分の名前を入れたほうがいいと思います。ここでは junaMoreComfyBedSingle としました。

これら2つはあとで変えると面倒くさいことになるので、ここで確定してください。


さらに using の最後の行と namespace の間に、[assembly: Tunable] を加えます。
そしてもしも using Sims3.SimIFace; がなかったら、付け加えておきます。
これらを忘れると、独自チューニング設定使われませんので重要です!

終わったら、Script Source Editor 左下の "Compile" ボタンを押して(エクスポート時にコンパイルされるっぽいですが)、その右にある赤い矢印ボタンをクリック(左画像の2つです)。名前を付けて保存画面が出てきますが、すでに名付けられていると思うので、そのまま保存しちゃいましょう。

ここでエクスポートされたファイルは、.package と .cs(Visual C# Source file)の2つのはずです。
.cs のほうは、一度スクリプトをこのプロジェクトにインポートした後に編集したいときに使用します。最後に説明します~。

5.GameplayData.package から、XML リソースをコピーしてくる

さて、次は s3pe を起動します。ILSpy はもう使わないので終了させて大丈夫です。

[シムズ3本体インストールフォルダ]\Game\Bin\Gameplay\GameplayData.package を読み取り専用で開いてください。この中から、元にする XML リソースを探し出します。
(頻繁にこのファイルは開くので、File > Bookmarked packages > Bookmark current でブックマークしておくと便利です)

1万超えの中から目視で探すのは大変なので、画面下にあるフィルター機能を使って絞り込みましょう。

Name にクローン元のオブジェクトタイプを入力します。bed だけだとまだ多かったので、bedsingle にしました。2.で控えた文字列でももちろん OK です。
そして、Name 入力フォーム左の □ にチェックを入れ、"Set" ボタンを押します。ここまで出来たら、上記画像と同じ表示になっていると思います。

最後に Filter active にチェックを入れましょう。

19個まで絞られました!

とりあえず、クローン元のリソースを選びましょうか。右クリックしてメニューを出し、Copy を押してください。

別にクローン元でなくても、<Current_Tuning></Current_Tuning> の各変数名がクローン元と全く同じものなら何でもいいです。同じ種類のオブジェクトなら基本的に同じ内容になってると思いますが、中には BedSingleTrashHeap のように違うものもあるので注意してください。

6.コピーした XML リソースをスクリプトと関連付ける

次に 4.で保存された package を開きます。デフォルトのままなら、OBJK_override_ から始まる package になっているはずです。
GameplayData.package を開いた状態で File > Open から開いてもいいですし、s3pe を新しく起動しても大丈夫です。

開いた package の中身は、OBJK と S3SA の2つのラインがあると思います。

Resource > Paste で先ほどコピーした XML リソースを貼り付けます。Resource Details ウィンドウが出ますが、何もいじらないで一旦 OK します。

続いて OBJK を右クリックし、その中から Edit OBJK を選びます。

Script の String を一字ももらさずコピーします。
"Abandon" ボタンで OBJK Resource Editor を閉じます。

次に _XML をダブルクリックし、Resource Details ウィンドウを出します。

Name にコピーした文字列を貼り付け、FNV64 ボタンを押します。すると Instance の英数字が変わったと思います。OK 押して確定させましょう。

7.XML チューニング設定をいじる

ここでもう、チューニング設定を変えておきましょうかね。
_XML を右クリックし、Text Editor または Notepad で編集します。XML ファイルに対応しているテキストエディタで開けるように設定しておくと(設定方法はフォント変更記事の「s3pe にテキストエディタを設定する」をご覧ください)、自動的に色分けされて見やすいと思います。

変更する箇所は、それぞれ value="" の中身です。
基本的に英語で書かれているので、<> の中だけ見ててもなんとなく判ると思います。詳しい説明は <!-- --> の中に書かれますしね! それに添って変えていきましょう!

例えばシングルベッドの場合。簡単に日本語化しますと、

EnvironmentScore
環境値。プラス、マイナス、どちらでも入れられるみたいですね。小数点も扱える模様。
WellRestedStrength
「十分に休んだ」ムードレットに与えるスコア(+10 の部分ですね)。0 より上の数字にしたときにだけ、このムードレットを出す模様。
ComfyBuffStrength
睡眠中の「心地良さ」ムードレットのスコア。
GivesBadNightsSleep
「最悪な眠り」ムードレットを付加するかどうか。出す場合は True、出さない場合は False。
EnergyMultiplier
これが体力回復スピードの設定ですね。1 が普通で、0.5 は遅く、2 はとても早い。
前回記事をご参考にどうぞ。
AllowIntersectionWithCeilingObjects
シーリングライトなどの天井から吊り下げるタイプのオブジェクトを、ベッドの上に置けるようにするかどうか。True で許可、False で置けない。False はたぶん、二段ベッド用?
WooHooEffectName
ウフフ用のなんか。どのベッドでも設定されていないので詳細は判らぬw 名前的にハートが飛び散るエフェクトを変えられるのですかね?w
HygieneDelta
正の値を入れると衛生が回復し、負の値だと汚くします。
1 にしただけで寝てる間 少しずつ回復していきました。何分かごとに、入れた数値分回復していくのかも。

ついでに <Deprecated_Tuning> から </Deprecated_Tuning> までも消すといいと思います。昔使われていた記述なんでしょう。

保存後、テキストエディタを閉じます。Commit changes? ダイアログが出てくるので Yes。


最後に _KEY を消して(残しててもいいけど)、package を保存しましょう。
s3pe での作業はこれで終わりです。

8.プロジェクトにスクリプト類を挿入する

TSRW に戻りまして、Edit > Project contens を開きます。

Import > From .package から先ほど編集した package を開きます。

「インポート完了、2つ追加され、プロジェクトパッケージ内の1つのエントリーを入れ替えました」とか出てくるので "OK"。
Project Contens ウィンドウの "OK" ボタンも押して TSRW のメイン画面へ戻り、プロジェクトをセーブします。

これで、スクリプト挿入作業が完了しました!
package でエクスポートしてみてゲームに入れてみてください。狙い通りに動作したら完成です!

また後にスクリプトを編集したいと思った場合

一度8.の作業をしてスクリプトをインポートしてしまうと、次に Script Source Editor を開くと何故かまた以下のダイアログが出てきます。

今度は "いいえ" を押してください!

空っぽになってると思いますが、焦らないでください~。
File > Load から、.package と一緒にエクスポートされた .cs(Visual C# Source file)を開いたら元通りです。

ただ、ここで namespace やクラス名に変更を加えてしまうと、S3SA リソースのインスタンスが変更になり、_XML リソースのインスタンスもまた変更しなくてはいけなくなるので、ご注意ください。

終わりに

以上です! 意外と簡単でしたでしょう?ヽ(o´∀`o)ノ 前回、ほぼコピペって言った理由がこれですw

ちょっと気になるのは、Visual Studio でコンパイルした場合と出力内容が若干違うことですが、うちの環境ではシムズ3でちゃんと動作してました。[assembly: Tunable] と同じように不足分を追記しておいたほうがいいんですかね?(´ー`;)

まあとにかく、これであなたも簡単にスクリプトデビュー!? ってことで(笑)、色々設定いじって遊んでみてください~!

このエントリーへのコメント

Disqus のほかにも Twitter や Google、Facebook アカウントでもログイン出来ます。
ログインしないで投稿するにはメールアドレスが必要ですが、サイト上には表示されませんのでお気軽にどうぞ(*^_^*)("アカウントを作成せず投稿する" にチェックを入れてください)

blog comments powered by Disqus