見出し画像

Elona改造講座 第3回(悪食変異の移植)

Elona改造講座、第3回です。
今回はより実践的な改造としてMMAhにooの悪食変異を移植するという例を扱ってみます。変異を扱う都合上、進化のポーション・突然変異のポーション・変異治療のポーションはあらかじめ大量に入手しておきましょう。
(ウィザードモードで願うのがてっとり早いかと思います。元々デバッグ専用モードなのでこれが一番正しい使い方だったり……)

①悪食のフィート定義を追加

ooで追加された悪食変異はフィートID:45です。ooのstart.hspを「悪食」や「tid == 45」で検索すると次の場所が見つかります。これがフィートを定義している部分になります
※ここで言う「フィート」には種族特性・秘宝により獲得したフィート・変異・エーテル病を含みます。
※コメント(//で始まる行)は私が勝手に追加したものです。処理内容が判明した箇所にはどんどんコメントを追加していきましょう。

ooの悪食変異を定義している箇所が見つかりました

この定義をMMAhに移植しましょう。場所は「tid == 41」でヒットしたフィートID:41 人肉食の定義のすぐ下あたりが良いでしょうか? ここに以下の処理を追加します。

if ( tid == 45 ) {
	if ( traitmode == 0 ) {
		traitref = 1, 0, 1, 1, 0, 100, -1
		if ( gettrait(r1, tid) >= 0 ) {
			traitrefn(2) = lang("悪食", "Swallowser"), lang("あなたは何でも食べられる", "You have no trouble eating anything.")
		}
		traitrefn = lang("あなたは何でも食べられるようになった。", "You are eating anything."), lang("あなたの胃袋は元に戻った。", "You are eating food only.")
		return 1
	}
	return 1
}

画像のようになっていれば成功です。

MMAhに定義を移植しました!

②変異対象に悪食を追加

ooのstart.hspを「変容した」で検索すると、次のような部分が見つかります。選択している部分に「tid = rnd(46)」とあります。rnd(46)は0~45までの乱数を生成する関数です。tidや45でピンと来た方は鋭い! これは悪食(フィートID:45)を含めた全ての変異の中から、発生させる変異の抽選を行う箇所なのです。

0~45の乱数を生成しています

MMAhの同じ部分を見ると「tid = rnd(45)」、すなわち0~44までの乱数になっています。これだと悪食が抽選対象外になってしまいますね。tid = rnd(46)に変更しておきましょう。

乱数の範囲を増やしました

続いてMMAhのstart.hspを「#deffunc addtrait」で検索してください。
関数addtraitの定義が見つかります。ここのifに「変数prm_1696が0以上45未満」という条件が含まれている為、0以上46未満に変更しておきましょう。すぐ下にある関数settraitの定義も同様に0以上46未満に変更してください。画像のようになれば成功です。

addtraitとsettraitも変更しておきます

③餓死ダメージ増加の処理

「あなたは眠りを必要としている」で検索すると、1つ上に餓死ダメージの処理が見つかります。餓死ダメージは通常は最大HPの1/50ですが、悪食持ちの場合は1/30に増加する仕様になっています。ooにはこの為の処理が含まれています。pが分母で、通常はp=50ですが悪食持ちならp=50-20=30にするという処理ですね。

p = 50
if ( gettrait(r1, 45) ) {
	p -= 20
}
dmghp r1, rnd(2) + cdata(51, 0) / p, -3
ooでは悪食持ちの場合、餓死ダメージが増加します

これも移植してしまいましょう。画像のようになれば成功です。

マイナス効果も移植完了

④コンパイルと動作確認(途中経過)

一旦コンパイルして動作確認します。次の(a)~(c)を確認してください。
 (a)進化のポーションで悪食が獲得できたか?
 (b)変異治療のポーションで悪食が削除できたか?
 (c)突然変異のポーションで悪食が獲得・削除できたか?
余裕があれば悪食持ちの場合に餓死ダメージが増加することも確認しておきましょう。

MMA系列のAA拡張で訪れた街にてooの悪食を獲得
治療もできました!

⑤食べるアイテム選択画面の変更

ooのstart.hspを「invctrl == 5」で検索すると食べるアイテムの選択処理が見つかります。条件が多いうえ、ここの条件は「食べられない場合に真となる」と逆になっている為に余計にややこしいですが、じっくり見ていきましょう。

ooの食べられるアイテム選択処理

「reftype != 57000」 これは「アイテム分類が食品類でない」
「reftype != 91000」 これは「アイテム分類が旅糧でない」
「inv(3, cnt) != 340」 これは「アイテムIDが心臓でない」
「gettrait(0, 45) == 0 & inv(24, cnt) != 35」 これは「悪食なし、かつ素材が生ものでない」
「(gettrait(0, 45) == 1 & reftype >= 50000 & reftype != 60000 & inv(3, cnt) != 341 & inv(3, cnt) != 339 & inv(3, cnt) != 337)」 これは「悪食あり、かつ、アイテム分類が装備でも家具でもない、かつアイテムIDが皮でも瞳でも骨片でもない」
……となります。
 
MMAhにこれを移植します。単にifの条件部分をooのものに書き換えるだけでOKです。

if ( reftype != 57000 & reftype != 91000 & inv(3, cnt) != 340 & (gettrait(0, 45) == 0 & inv(24, cnt) != 35 | (gettrait(0, 45) == 1 & reftype >= 50000 & reftype != 60000 & inv(3, cnt) != 341 & inv(3, cnt) != 339 & inv(3, cnt) != 337)) ) {
ここはベタ移植でOKです

⑥悪食用の食事効果の追加

生もの以外を食べた場合の食事効果を追加します。ooのstart.hspを「inv(3, ci) == 571」で検索してください。1つ下に「if ( inv(24, ci) != 35 ) {」で始まるブロックが見つかるはずです(これは「素材が生もの以外の場合」を意味します)。

ooには悪食専用の食事効果があります

分かりやすくする為、もう少しコメント文を追加してみましょう。

// 変異:45 悪食により生もの以外を食べた場合の食事効果
if ( inv(24, ci) != 35 ) {
	i = refitem(inv(3, ci), 5, ci)
	if ( i < 50000 | i == 60000 ) {
		// アイテム種別10000(近接武器)の場合「胃はズタズタになった」
		if ( i == 10000 ) {
			if ( cdata(143, cc) == 0 ) {
				gosub *label_1577
				cdata(143, cc) = 0
			}
			else {
				gosub *label_1577
			}
		}
		// 素材データ0(比重)に応じて満腹度に倍率をかける
		if ( mtref(0, inv(24, ci)) != mtref(0, 35) ) {
			nutrition = nutrition * mtref(0, inv(24, ci)) / mtref(0, 35)
		}
		// 素材データ5(PV倍率)が鉄のPV倍率以上の場合「まるで鉄のように硬い」
		if ( mtref(5, inv(24, ci)) >= mtref(5, 10) ) {
			gosub *label_1548
		}
		// 素材ID:8(エーテル)の場合「体内はエーテルで満たされた」
		if ( inv(24, ci) == 8 ) {
			gosub *label_1569
		}
		else {
			// 素材ID:14(霊布)の場合「胃の調子がおかしい」
			if ( inv(24, ci) == 14 ) {
				gosub *label_1563
			}
		}
	}
}

「i == 10000」 これは近接武器を食べた場合の処理です。悪食オリジナルの食事効果です。
「mtref(0, inv(24, ci)) != mtref(0, 35)」 これは重量の比率に応じて満腹度を変化させる処理です。倍率をかけるだけなので特に問題は無いでしょう。
「mtref(5, inv(24, ci)) >= mtref(5, 10) )」 これは鉄よりPV倍率が高い素材を食べた場合の処理(まるで鉄のように硬い
「inv(24, ci) == 8」 これはエーテル製を食べた場合の処理(体内はエーテルで満たされた
「inv(24, ci) == 14」 これは霊布製を食べた場合の処理(胃の調子がおかしい
最後の3つは既存の食事効果を呼び出していますね。それぞれどのキャラを食べた時の効果かすぐに分かったそこのあなた、一人前のElona通です!
 
MMAh版にするとこうなります。「胃はズタズタになった」のジャンプ先 *label_zutazuta は後ほど作成します。他の3つは既存の食事効果なので、メッセージを参考にして対応するラベルにジャンプするようにします。

// 変異:45 悪食により生もの以外を食べた場合の食事効果  ※ooから移植
if ( inv(24, ci) != 35 ) {
	i = refitem(inv(3, ci), 5, ci)
	if ( i < 50000 | i == 60000 ) {
		// アイテム種別10000(近接武器)の場合「胃はズタズタになった」
		if ( i == 10000 ) {
			if ( cdata(143, cc) == 0 ) {
				gosub *label_zutazuta
				cdata(143, cc) = 0
			}
			else {
				gosub *label_zutazuta
			}
		}
		// 素材データ0(比重)に応じて満腹度に倍率をかける
		if ( mtref(0, inv(24, ci)) != mtref(0, 35) ) {
			nutrition = nutrition * mtref(0, inv(24, ci)) / mtref(0, 35)
		}
		// 素材データ5(PV倍率)が鉄のPV倍率以上の場合「まるで鉄のように硬い」
		if ( mtref(5, inv(24, ci)) >= mtref(5, 10) ) {
			gosub *label_0604
		}
		// 素材ID:8(エーテル)の場合「体内はエーテルで満たされた」
		if ( inv(24, ci) == 8 ) {
			gosub *label_0625
		}
		else {
			// 素材ID:14(霊布)の場合「胃の調子がおかしい」
			if ( inv(24, ci) == 14 ) {
				gosub *label_0619
			}
		}
	}
}

移植してみました。ジャンプ先ラベルは私の環境の場合です。ヴァリアントによって、また、同じヴァリアントでもバージョンによって、ジャンプ先ラベルの番号は異なります。

MMAhに食事効果を移植しました!

⑦新規食事効果の追加

ooのstart.hspを「胃はズタズタになった」で検索すると、近接武器を食べた場合の食事効果のサブルーチンが見つかります。エイリアン肉のすぐ下で定義されているようですね。

*label_1577
	if ( synccheck(cc, -1) ) {
		txtef 8
		txtvalid = 0
		txt_select lang(name(cc) + "の胃はズタズタになった。", name(cc) + " get" + _s(cc) + " a cut."), "", "", "", "", "", "", "", ""
	}
	dmghp cc, rolemax(inv(10, ci), inv(11, ci), inv(12, ci) + inv(20, ci) + (inv(17, ci) == 1)), -16
	return
oo独自の食事効果です(痛そう……)

MMAhの同じ場所にこれを移植します。ラベル名は⑥でジャンプ先に指定したのと同じ *label_zutazuta にしましょう。MMAhの記法に合わせてtxtvalidは削除、txt_selectの第1引数にccを追加します。こんな感じでいかがでしょうか?

*label_zutazuta
	if ( synccheck(cc, -1) ) {
		txtef 8
		txt_select cc, lang(name(cc) + "の胃はズタズタになった。", name(cc) + " get" + _s(cc) + " a cut."), "", "", "", "", "", "", "", ""
	}
	dmghp cc, rolemax(inv(10, ci), inv(11, ci), inv(12, ci) + inv(20, ci) + (inv(17, ci) == 1)), -16
	return

移植してみました。

やっぱり痛そう……

⑧コンパイルと動作確認(完成)

いよいよお待ちかねの動作確認です。適当な固定アーティファクトを願って、所定の食事効果が得られたことを確認してください。以下に一例を掲載します。
確認例.1 「★《破壊の斧》」を食べて以下の効果が得られたか?
 (a)近接武器の「胃はズタズタになった」
 (b)鉄以上に硬い素材の「まるで鉄のように硬い」
 (c)生命力の発達(ルビナスの素材効果)
確認例.2 「★《レールガン》」食べて以下の効果が得られたか?
 (d)エーテル侵食
 (e)神経属性攻撃の付与
 (f)速度の発達(エーテルの素材効果)

破壊の斧を食べました!
レールガンを食べました!

無事に効果が得られているようですね。霊布製であるクミロミサイズも確認に便利そうです。フリージアの尻尾を食べてみるのも面白いぞ(ニヤリ)

⑨終わりに

今回で別ヴァリアントへの移植の手順が一通り掴めたことかと思います。慣れればMODのように、あるヴァリアントの機能を別のヴァリアントに導入したりもできるようになることでしょう。「別のヴァリアントのあの機能が欲しい」とか「このヴァリアントのこの機能は自分には不要」といった要望も叶えられるはずです。皆さんも自分だけのElonaを作り上げてください。

補足

Q.①で見慣れないエーテル病があるんだけど……「周囲からマナを奪う」ってそんなエーテル病あったっけ?
A.ooで追加されたエーテル病です。200番台のフィートはエーテル病ですが、このうち217(獣の耳)~221(周囲からマナを奪う)が追加分です。
 
Q.⑤でアイテムID:340(心臓)が悪食無しでも食べられる対象に入ってるけど何ででしょう?
A.ooには心臓を食べることでその生物の体質を獲得できる効果があるらしいので、その為のものでしょう。体質という概念の無いヴァリアントでは食料が増える以外に意味はありません。
 
Q.⑧で固定アーティファクトが願えない……
A.固定アーティファクトはウィザードモードでないと願えません。願えたらチートすぎるから残当(残念でもないし当然)。
 
Q.悪食で体液は飲めないの?
A.「invctrl == 8」で飲むアイテムの選択処理が出てきます。ここを改造してみましょう。MMAhの場合は「itemdb.csv」をExcelで開き、効果種別IDと効果IDを指定する必要もあります。次回、第3回の補講として改造例を掲載してみます。

いいなと思ったら応援しよう!