Elona改造講座 第2回(自分を食べないようにする・妹化を無効にする)
Elona改造講座第2回です。
前回はカスタムアイテムを食べられるように改造しましたが、今回はこの調子で次のような改造をしてみましょう。
(1)「たべる」技能で自分を食べないようにする
(2)妹肉を食べた時の妹への変異を無効化する
①改造案:「たべる」で自分を食べないようにする
便利で楽しい「たべる」コマンド。ですが誤って自分を食べると即死してしまいます。oo系列のヴァリアントでは自分自身を食べられないようにする処理が入っているので、これを他のヴァリアントにも移植してみましょう。
食べた時のメッセージはご存知「んがぐっぐ」ですね。
MMAhのstart.hspを「んがぐっぐ」で検索するとこのような部分が見つかるはずです。
![](https://assets.st-note.com/img/1685708042391-O92L0J3t2G.png?width=1200)
同様にooのstart.hspを「んがぐっぐ」で検索するとこのような部分が見つかるはずです。
![](https://assets.st-note.com/img/1685708069678-bQ9HzmV8lg.png?width=1200)
細かい部分(txt_selectの引数や、処理からの抜け方がbreakかgotoかなど)が色々と違っていますがそれは置いておきましょう。ここで一番注目してほしいのは、「もっと弱らせないと食べられない」のすぐ上にooにのみ「自分を食べようとした」というメッセージがある点です。
②プログラム変更:自分を食べない処理
ooのstart.hspに着目すると、ccとtcという変数が目につきます。テキストから推測するに、ccはアクションを実行したキャラクター番号、tcはアクションの対象となるキャラクター番号を指していると予想できます(tc=target characterでしょうか?)。キャラクター番号0はPCを指しているようですね。
試しにooの自分を食べられないようにする処理をMMAhに移植してみます。当然ながら、書式は移植先のヴァリアント(ここではMMAh)に合わせる必要がある為、次のようにしましょう。txt_selectに引数が増えていること、処理を抜ける方法がbreakになっていることに注意してください。MMAh式に書き直すと……こんな感じでしょうか?
if ( tc == cc ) {
if ( cc == 0 ) {
txt_select -1, lang(name(cc) + "は自分を食べようとした。", "You try to eat yourself."), "", "", "", "", "", "", "", ""
}
break
}
変更後のソースは次のようになりました。
![](https://assets.st-note.com/img/1685708133068-92JrnwJozg.png?width=1200)
③コンパイルと実行:自分を食べない処理
コンパイルして実行します。「たべる」コマンドで自分を食べようとした時にメッセージが表示されれば成功です。
![](https://assets.st-note.com/img/1685546446519-3lKQHFeWZD.png?width=1200)
④改造案:妹変異防止
MMA系列ではNPCが妹肉を食べた時、妹に変異するという食事効果が追加されています(変異防止エンチャを装備していたり、品質6(特別)だと変化しません)。妹が増える嬉しい追加要素である反面、厄介な要素でもあります。これを無効化してみましょう。
「血の繋がっていない妹だ」で検索すると次のような箇所が見つかるはずです。*label_0633からreturnまでが妹肉の処理を記述した関数(というよりサブルーチン?)のようですね。
![](https://assets.st-note.com/img/1685708172218-LSOoxfVOA5.png?width=1200)
最初のifはcc==0、すなわち食べたキャラがPCの場合は無視することを意味します。
3番目のifはそのキャラのキャラIDが176(妹)、または249(店主妹)の場合は無視することを意味します。「妹は妹肉を食べても妹化しない」文章にすると意味不明ですがこれはMMAのreadmeに書かれている通りの挙動です。
4番目のifはrnd(4) == 0、すなわち1/4(25%)の確率で妹化が発生することを意味します。
5番目のifの前の条件encfind(cc, 33) != (-1)は「変異保護エンチャントがある時」、後ろの条件cdata(25, cc) >= 6は「品質が6(特別)以上の時」ですね。これらもMMAのreadmeに書かれている通りの挙動です。
⑤プログラム変更:妹変異防止
上記の部分を、最後のreturnを除いて全てコメントアウトしてしまいましょう。コメントにするには/*から*/で囲えばOKでしたね(この他に//と入力すると、その行のそれ以降がコメントになります。お好きな記法をお使いください)。
![](https://assets.st-note.com/img/1685708205407-HnIg9VsdYf.png?width=1200)
⑥コンパイルと実行:妹変異防止
妹肉をペットに食べさせて、妹化しなかったら成功です。妹肉が手元に無い場合は「錬成素材 妹」を願いましょう。元々の確率が25%なので1回だけではなく何度も試すことを忘れずに……
![](https://assets.st-note.com/img/1685546771654-kVG0TOXl6D.png?width=1200)
![](https://assets.st-note.com/img/1685546788457-6pKuh2CEtJ.png?width=1200)
補足
Q.改造したい箇所を探したいのにソースコードが16万行もあって読む気がしません……どうやって該当箇所を探したら良いですか?
A.一番のヒントはゲーム画面に表示されるテキストです。 例えば農作業なら「芽を摘み取った」「枯れた草を摘み取った」「収穫した」などのテキストが大きなヒントになるでしょう。テキスト表示の関数はtxt_selectです。
Q.「錬成素材 (NPC名)」で願ったけど何も起きない。
A.ヴァリアントによっては実装されていないかもしれません。また、どうもウィザードモード限定の願いのようなので、通常プレイではできないかもしれません。条件を満たしていれば肉と残骸一式が足元に生成されます。
Q.妹変異防止の動作確認、元々の確率が25%だから正しく反映できているのか分かりにくい。100回ほど試したけど、もしかしたら運悪く全て75%側を引いただけかもしれないし……
A.まずはtxt_selectだけ残して、それ以外をコメントアウトしてみると変化が分かりやすいかもしれません。上記の例だとcdataに代入している行と、cbitmodを呼び出している行だけをコメントアウトしてみましょう。