見出し画像

Elona改造講座 第6回(エーテル病の移植)

Elona改造講座、第6回です。今回はoo系列独自のエーテル病をMMA系列に移植してみましょう。本家ではエーテル病はフィートID:201(重力)~216(毒の滴る手)の全16種類です。
oo系列では新たに5種追加され、計21種類となっています。217(獣の耳)・218(鋭い爪)・219(マナ血)・220(強迫観念)・221(周囲からマナを奪う)が追加分ですね。今回はこのうち、217~219をMMAhに移植してみます。

①エーテル病の定義の追加

ooのstart.hspを「tid == 217」で検索すると追加エーテル病の定義が見つかります。ID:217~219をMMAに移植しましょう。悪食変異の時と同様、これはベタ移植でOKです。

// エーテル病:217 獣の耳 (13:感覚 57:音耐性)
if ( tid == 217 ) {
	if ( traitmode == 0 ) {
		traitref = 3, -2, 0, 1, 0, 100, -1
		if ( gettrait(r1, tid) < 0 ) {
			traitrefn(2) = "", lang("あなたの耳は獣の耳だ[頭装備不可 感覚+" + abs((-1) * 3 / 2) * (15 + cdata(38, r1) / 3) + " 音耐性弱化]", "You have animal's ears. [PER+" + abs((-1) * 3 / 2) * (15 + cdata(38, r1) / 3) + " RES Sound-]"), lang("あなたには獣の耳と尻尾がある[頭/腰装備不可 感覚+" + abs((-2) * 3 / 2) * (15 + cdata(38, r1) / 3) + " 音耐性大幅弱化]", "You have animal's ears and tail. [PER+" + abs((-2) * 3 / 2) * (15 + cdata(38, r1) / 3) + " RES Sound--]")
		}
		traitrefn = lang("あなたの体は元に戻った。", "Your ears become normal."), lang("あなたの体は獣に近づいた。", "Suddenly your body become animal's.")
		return 1
	}
	sdata(13, r1) = limit(sdata(13, r1) + abs(gettrait(r1, tid) * 3 / 2) * (15 + cdata(38, r1) / 3), sdata(13, r1) > 0, 9999)
	sdata(57, r1) = limit(sdata(57, r1) + abs(gettrait(r1, tid)) * (25 + cdata(38, r1) / 15 * 50) * (-1), sdata(57, r1) > 0, 9999)
	return 1
}
// エーテル病:218 鋭い爪 (230:素手攻撃の属性 に 61:出血属性 を付与)
if ( tid == 218 ) {
	if ( traitmode == 0 ) {
		traitref = 3, -1, 0, 1, 0, 100, -1
		if ( gettrait(r1, tid) < 0 ) {
			traitrefn(2) = "", lang("あなたの手には鋭く大きな爪が生えている[手装備不可 出血格闘]", "You have fine claw. [cut damage by unarmed attack. Can't have weapons]")
		}
		traitrefn = lang("あなたの手から爪が消えた。", "Your claw has subsided."), lang("あなたの手に強靭な爪が生えた。", "Fine claw come out from your hand.")
		return 1
	}
	cdata(230, r1) = 61 * 100000 + limit(100 + cdata(38, r1) * 5 / 3, 100, 9999)
	return 1
}
// エーテル病:219 マナ血 (154:自然治癒 3:マナ)
if ( tid == 219 ) {
	if ( traitmode == 0 ) {
		traitref = 3, -1, 0, 1, 0, 100, -1
		if ( gettrait(r1, tid) < 0 ) {
			traitrefn(2) = "", lang("あなたの血はマナで沸き立つ[自然治癒大幅強化 MP-50% 魔法使用不可]", "Your blood seethes with mana. [Regeneration+++ MP-50% Silence]")
		}
		traitrefn = lang("あなたの血は元通りになった。", "Your blood not gets hot by mana."), lang("あなたの血はマナを熱に変えるようになった。", "Your blood gets hot by mana.")
		return 1
	}
	sdata(154, r1) = limit(sdata(154, r1) + (16 + cdata(38, r1) * 3), sdata(154, r1) > 0, 9999)
	sdata(3, r1) = limit(sdata(3, r1) + (-50), sdata(3, r1) > 0, 9999)
	return 1
}

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

毒の滴る手の下に追加エーテル病の定義を移植します

②エーテル病の発症処理

「エーテルの病が発症した」で検索してください。30行ほど下に次のような部分が見つかるはずです。

repeat 100000
	await
	tid = rnd(217 - 200) + 200
	traitmode = 0
	r1 = 0

注目すべきは「tid = rnd(217 - 200) + 200」の部分です。rnd(x)は0~x-1の乱数を生成する関数でしたよね。つまりここでは200~216の乱数を生成しています。
 
今回は新たに217~219のエーテル病を追加した為、200~219の乱数を生成する必要があります。「tid = rnd(220 - 200) + 200」に書き換えましょう。

repeat 100000
	await
	// エーテル病の乱数 200~219
	tid = rnd(220 - 200) + 200
	traitmode = 0
	r1 = 0
217~219も発症の対象になります

更に20行ほど下を見てください。「あなたはエーテルに侵食された」のすぐ下に次のような部分が見つかります。蹄・羽・太い首。これらのエーテル病に共通する要素と言えば?
そう! 特定部位の装備が不可能になることですよね。

txtef 8
txt_select -1, lang("あなたはエーテルに侵食された。", "Your disease is getting worse."), "", "", "", "", "", "", "", ""
txtef 3
txt_select -1, traitrefn(1), "", "", "", "", "", "", "", ""
// エーテル病:203 蹄 (足装備不可)
if ( tid == 203 ) {
	body = 9
	r1 = 0
	gosub *label_1043
}
// エーテル病:205 羽 (背中装備不可)
if ( tid == 205 ) {
	body = 3
	r1 = 0
	gosub *label_1043
}
// エーテル病:206 太い首 (首装備不可)
if ( tid == 206 ) {
	body = 2
	r1 = 0
	gosub *label_1043
}

ooだと獣の耳と鋭い爪の定義がここに追加されているので、それを参考にして移植しましょう。gosubでジャンプする先のラベルはお使いの環境に合わせてください。

// エーテル病:217 獣の耳 (頭装備不可,2段階目で腰装備不可)  ※ooから移植
if ( tid == 217 ) {
	if ( gettrait(0, tid) != (-1) ) {
		body = 8
		r1 = 0
		gosub *label_1043
	}
	body = 1
	r1 = 0
	gosub *label_1043
}
// エーテル病:218 鋭い爪 (手装備不可)  ※ooから移植
if ( tid == 218 ) {
	body = 5
	r1 = 0
	gosub *label_1043
}

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

手装備が外れるのは痛い。
ooでは邪武器を安全に外す手段なのですが……

③エーテル病の治療処理

②の20~30行下に次のような処理が見つかります。こちらは治療するエーテル病を選択する時の乱数ですね。200~216になっています。

tid = rnd(217 - 200) + 200
if ( cnt == 0 ) {
	i@m134 = 700 + org@m134 - cnt2@m134 - 1
	if ( gdata(i@m134) != 0 ) {
		tid = gdata(i@m134)
	}
}
traitmode = 0
r1 = 0

こちらも同様に200~219に増やしておきましょう。

tid = rnd(220 - 200) + 200
if ( cnt == 0 ) {
	i@m134 = 700 + org@m134 - cnt2@m134 - 1
	if ( gdata(i@m134) != 0 ) {
		tid = gdata(i@m134)
	}
}
traitmode = 0
r1 = 0
217~219が治療対象になりました

④addtraitとsettraitの変更

悪食変異の追加でも出てきた、addtraitとsettraitの変更です。「#deffunc addtrait」で検索してください。悪食変異を追加済の場合、addtraitはこうなっていることでしょう。200~216, 150~169, 0~45が対象になっていますね。

#deffunc addtrait int prm_1692, int prm_1693, int prm_1694
	if ( prm_1692 == 0 ) {
//		if ( prm_1693 >= 200 & prm_1693 < 217 | (prm_1693 >= 150 & prm_1693 < 170) | (prm_1693 >= 0 & prm_1693 < 45) ) {
		if ( prm_1693 >= 200 & prm_1693 < 217 | (prm_1693 >= 150 & prm_1693 < 170) | (prm_1693 >= 0 & prm_1693 < 46) ) {
			trait(prm_1693) += prm_1694
			return 1
		}
	}

これを次のように変更しておきます。
これにより200~219, 150~169, 0~45が対象になりました。

#deffunc addtrait int prm_1692, int prm_1693, int prm_1694
	if ( prm_1692 == 0 ) {
//		if ( prm_1693 >= 200 & prm_1693 < 217 | (prm_1693 >= 150 & prm_1693 < 170) | (prm_1693 >= 0 & prm_1693 < 45) ) {
//		if ( prm_1693 >= 200 & prm_1693 < 217 | (prm_1693 >= 150 & prm_1693 < 170) | (prm_1693 >= 0 & prm_1693 < 46) ) {
		if ( prm_1693 >= 200 & prm_1693 < 220 | (prm_1693 >= 150 & prm_1693 < 170) | (prm_1693 >= 0 & prm_1693 < 46) ) {
			trait(prm_1693) += prm_1694
			return 1
		}
	}

settraitも同様です。200~219, 150~169, 0~45が対象になるよう、条件部を変更してください。

#deffunc settrait int prm_1695, int prm_1696, int prm_1697
	if ( prm_1695 == 0 ) {
//		if ( prm_1696 >= 200 & prm_1696 < 217 | (prm_1696 >= 150 & prm_1696 < 170) | (prm_1696 >= 0 & prm_1696 < 45) ) {
//		if ( prm_1696 >= 200 & prm_1696 < 217 | (prm_1696 >= 150 & prm_1696 < 170) | (prm_1696 >= 0 & prm_1696 < 46) ) {
		if ( prm_1696 >= 200 & prm_1696 < 220 | (prm_1696 >= 150 & prm_1696 < 170) | (prm_1696 >= 0 & prm_1696 < 46) ) {
			trait(prm_1696) = prm_1697
			return 1
		}
	}
ここは悪食変異の時と同じ要領です

⑤装備が外れる処理(その2)

ooを「deco_wear.bmp」で検索してください。30行ほど上に次のような部分が見つかるはずです(並んでいる症状を見て分かる通り、装備が外れるエーテル病に関する処理です)。

repeat 30, 100
	if ( cdata(cnt, cc) != 0 ) {
		if ( cc == 0 ) {
			// エーテル病:太い首
			if ( gettrait(0, 206) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 2 ) {
					continue
				}
			}
			// エーテル病:蹄
			if ( gettrait(0, 203) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 9 ) {
					continue
				}
			}
			// エーテル病:羽
			if ( gettrait(0, 205) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 3 ) {
					continue
				}
			}
			// エーテル病:獣の耳
			if ( gettrait(0, 217) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 1 ) {
					continue
				}
				if ( gettrait(0, 217) == (-2) ) {
					if ( cdata(cnt, cc) / 10000 == 8 ) {
						continue
					}
				}
			}
			// エーテル病:鋭い爪
			if ( gettrait(0, 218) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 5 ) {
					continue
				}
			}

MMAhだとこうなっています。太い首・蹄・羽の3つだけですね。

repeat 30, 100
	if ( cdata(cnt, cc) != 0 ) {
		if ( var_is_pet_wear == 0 ) {
			// エーテル病:太い首
			if ( gettrait(cc, 206) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 2 ) {
					continue
				}
			}
			// エーテル病:蹄
			if ( gettrait(cc, 203) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 9 ) {
					continue
				}
			}
			// エーテル病:羽
			if ( gettrait(cc, 205) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 3 ) {
					continue
				}
			}

ここに獣の耳と鋭い爪を追加します。
MMAではgettraitの第1引数がccになっていることに注意してください(とは言うもののここに入るのはvar_is_pet_wear=0の時に限られ、その場合cc=0が確定している為、実害はないでしょうが)。

			// エーテル病:獣の耳
			if ( gettrait(cc, 217) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 1 ) {
					continue
				}
				if ( gettrait(cc, 217) == (-2) ) {
					if ( cdata(cnt, cc) / 10000 == 8 ) {
						continue
					}
				}
			}
			// エーテル病:鋭い爪
			if ( gettrait(cc, 218) != 0 ) {
				if ( cdata(cnt, cc) / 10000 == 5 ) {
					continue
				}
			}

画像のようになれば完了です。

今回は変更箇所が多いですね

⑥全フィートについてのループ1

まだ終わりではありません。忘れやすい処理です。
ooのstart.hspを「◆ 特徴と体質」で検索してください。
50行ほど上を見ると「repeat 224」というループがあるはずです。これは0~223までのループを回す処理ですね。ご想像の通り、ここは変異やエーテル病を含めた全フィートについてのループを回す箇所です。

f = 0
repeat 224
	traitmode = 0
	tid = cnt
	r1 = tc

MMAhのstart.hspを「◆ 特徴と体質」で検索してください。
50行ほど上を見ると同様の処理がありますが、こちらは0~216までのループを回しています。エーテル病217~219を追加したので、ループ回数を0~219に増やしておきます。

	f = 0
//	repeat 217
	repeat 220
		if ( tc != 0 & cfg_mmah_changefeats == 0 ) {
			break
		}
		traitmode = 0
		tid = cnt
		r1 = tc
全フィートについてループを回します

⑦全フィートについてのループ2

⑥と同様の箇所がもう1つあります。
ooを「◆ 装備による能力の修正」で検索。
30行ほど下を見てください。0~223までのループが回っています。

traitmode = 1
repeat 224
	if ( gettrait(r1, cnt) != 0 ) {
		tid = cnt
		gosub *label_0057
	}
loop

MMAhを「◆ 装備による能力の修正」で検索。
30行ほど下に同様の部分があります。
ループ回数は0~216になっているので、ここも0~219に増やしておきます。

	// 全フィートについてのループ (0~216)  エーテル病追加の為0~219に増やす
	traitmode = 1
//	repeat 217
	repeat 220
		if ( gettrait(r1, cnt) != 0 ) {
			tid = cnt
			gosub *label_0067
		}
	loop

⑧マナ血の発症時、魔法使用不可の処理

最後の変更箇所です。マナ血の発症時のデメリットとして、マナ減少の他に、魔法使用不可というものがあります。
start.hspを「は魔法を使えない」「それでも詠唱を試みる?」で検索して、以下を追加してください。
※oo系列の中でもoorだと仕様が変更されており、魔法使用不可ではなく瞑想弱体化になっています。お好みの方を適用してください。

	// エーテル病:219 マナ血の場合、魔法使用不可
 	if ( gettrait(cc, 219) ) {
		if ( synccheck(cc, -1) ) {
			txt_select -1, name(cc) + lang("の血は熱くなった。", " "), "", "", "", "", "", "", "", ""
		}
		efsource = 0
		return 0
	}
すぐ下にマイナスフィート「無魔法」の時の魔法使用不可処理も見えますね

⑨動作確認

コンパイルして実行してみましょう。エーテル病の発症は輝くハリねずみを殴るか、エーテルダガーでも願って食べると良いでしょう。
以下を確認してください。
 (a)新規追加のエーテル病3種が全て発症したか?
 (b)抗体でそれらが治療できたか?
 (c)獣の耳と鋭い爪の発症時、該当部位が装備不能になったか?
  またその時、装備が外れたか?
 (d)マナ血の発症時、魔法が使用不可になったか?

追加エーテル病が発症しました(例では2種類のみ)


該当部位が装備不可になりました
(猫神なので腰装備は元々不可ですが…)
マナ血が発症すると魔法が使えません

⑩終わりに

意外と変更点が多くなってしまいました。発症と治療だけなら悪食変異の時と同じ要領でできますが、フィートの最大数を公式版よりも増やしている関係で細かい変更点が多くなってしまいます。あと特定部位の装備が不可能になるエーテル病の処理が②と⑤で分かれているのも難しい点ですね(実はなぜ2箇所に分かれているのか把握しきれていなかったりします)。
 
実は私も1~2時間ほど悩み、
「あれ? 獲得も治療もできるのにフィート欄に表示されない?」
「表示はされるようになった……けれど効果が適用されてない?」
となってしまいました。
ですが落ち着いて1つずつ原因を探っていけばこの通り。
いつかは必ず実現できます。

この記事が気に入ったらサポートをしてみませんか?