独自仕様のステートとスクリプトとか
ちょっとしたスクリプトのお話。
自作戦闘において、
HP30%未満とMP5%未満で自動的にかかるステートというのを作っていまして、
以前は戦闘前に全アクターの最大HPと最大MPを変数に格納した上で、
割合にしてたんですよね。
なんでかって言うと、最大HPが31%の時にHPが50%上がる補助がかかったら、
直後、割合的には減っちゃいますよね?
それが嫌で、元々のステータスの最大HPから参照したかったんです。
そんな感じで変数をかなり使って計算してたんですが、
スクリプトの知識が増えてきた今、かなり簡潔に書けちゃったわけです。
コピペできるようにスクリプトの部分だけ書き出してみます。
変数の操作 #1 = $gameParty.members().length
//現在のパーティメンバーの数を取得します
変数の操作 #3 = $gameParty.members()[$gameVariables.value(2)].actorId()
//パーティメンバーn番(変数2の中身)のアクターIDを取得します
条件分岐:スクリプト
$gameActors.actor($gameParty.members()[$gameVariables.value(2)].actorId()).mp <= ($gameActors.actor($gameParty.members()[$gameVariables.value(2)].actorId()).paramBase(1) * 0.05)
//n番のアクターの現在MPが、バフや装備を除いた最大MP×0.05より低い時
スクリプト:$gameParty.members()[$gameVariables.value(2)].addState(4)
//n番のアクターに4番のステートを付与します
それ以外の時
スクリプト$gameParty.members()[$gameVariables.value(2)].removeState(4)
こんな感じ。
条件分岐のスクリプトで、ゲームアクターの指定に、
ゲームパーティから引っ張ってくるみたいな迂遠な処理をしているのですが、
これは、paramBase()にどうもゲームパーティは使えないみたいで、
ゲームアクターから指定する必要があったっぽいから・・・です。
言い切れないのは、正直、
あまりスクリプトに関しては色々と自信持って言えないというか。
書き出したのも昨日なのでテストが不十分ということもあります。
一応、71%ダメージ食らわせてみたり、
アクター変えてみたりということはしましたが・・・。
paramBase()は装備やバフを除いたステータスを参照するもので、
戦闘中に最大HPやMPが増えしても、
そのせいで意識混濁になったりすることも無いです。
かなり理想に近い形ですよね。
元々は装備補正だけは入っていた感じではありますが、
記述が極めて簡潔になったので、コレでいいかなという感じでもあります。
・・・HP増やす装備あんまり作る気無いですし。
データ保存と復元
少し前にTwitterの方でつぶやいたものですが、
有用かなぁと思うのでこちらも貼っておきます。
ただし、ゲームデータ
(プレイ中のデータという意味です。アイテムとかレベルとか)
を上書きしてしまうスクリプトなので取り扱いには十分お気をつけ下さい。
$gameVariables.setValue(1, JsonEx.makeDeepCopy($gameActors._data));
//変数1に現在のアクター情報の格納。
$gameActors._data = JsonEx.makeDeepCopy($gameVariables.value(1));
//変数1の情報をアクターデータへ上書き。
$gameVariables.setValue(2, JsonEx.makeDeepCopy($gameParty._items));
//変数2にアイテム情報の格納
$gameParty._items = JsonEx.makeDeepCopy($gameVariables.value(2));
//変数2の情報をアイテムへ上書き
$gameVariables.setValue(3, JsonEx.makeDeepCopy($gameSwitches._data));
//変数3に全スイッチ情報の格納
$gameSwitches._data = JsonEx.makeDeepCopy($gameVariables.value(3));
//変数3の情報を全スイッチ情報に上書き
$gameVariables.setValue(4, JsonEx.makeDeepCopy($gameSelfSwitches._data));
//変数4に全セルフスイッチ情報の格納
$gameSelfSwitches._data = JsonEx.makeDeepCopy($gameVariables.value(4));
//変数4の情報を全セルフスイッチ情報に上書き
$gameVariables.setValue(5, JsonEx.makeDeepCopy($gameVariables._data));
//変数5に全変数情報の格納
$gameVariables._data = JsonEx.makeDeepCopy($gameVariables.value(5));
//変数情報を変数5の内容に上書き
例えば戦闘前・或いは0ターン目に
アクター情報とアイテム情報を変数にセットしておけば、
全滅後にコレを読み込むことで、
アイテムやアクターの情報を、変数にセットした時の状態に戻すことが出来ます。
つまり、盗むとか実装してる方は、盗んだアイテムも戻りますね。
ダンジョンに入る前にスイッチ・変数の状態を記録しておいて、
全滅時に街に戻り、コレを復元するようにしておけば、
ダンジョン内に入る前の状態に戻ります。
宝箱のみセルフスイッチで作る設計にしておけば、簡単に宝箱だけはとったまま。
シナリオ状態だけ戻すということが出来ますね!
逆に仕掛けにもセルフスイッチを用いている場合に、
セルフスイッチも復元してしまおうとすると、
中身をとったはずの宝箱も戻ってしまう。(中身は所持したまま)
或いは、一部仕掛けを戻せない。みたいなことが発生してしまいますね。
この辺は設計次第だと思いますが・・・。
時の砂なんかも、コレを使えば割と簡単につくれそうです。
作るかどうかは別として。
終わり
本当はボス動画撮ろうと思ってたのですが、不備が出るわ出るわ。
多分全部直せたので、この記事を書いています。
次はそれかなぁ・・・。