見出し画像

Elona改造講座 第14回(生き武器の魔法威力強化/モンスター召喚の改造)

Elona改造講座、第14回です。
今回取り扱う内容は2つ。
1つ目はMMA系列で削除された生き武器の魔法威力強化を復活させること。
2つ目はMMAhで開発中の要素がONの場合のモンスター召喚の改造です。
 
本家Elonaやomake、oo系列でまず最初に何の生き武器を作るべきかと聞かれたら、大抵の人は「魔法威力強化」と答えるでしょう。ある程度慣れたElonaプレイヤーなら一度は「必ず紳士」の名前を聞いたことがあるはずです(血吸いが付かないように魔法威力強化を重ねていくとこの銘になる)。
 
ですがMMA系列では生き武器の追加エンチャントから「魔法威力強化」が削除されてしまっています。下の画像は「必ず紳士」の第1段階である「怪物を殺す砂漠」のエンチャント選択画面です。本来Lv1の近接武器でこの銘の場合に選択できるエンチャは
  魔法威力強化 [*****+] (強度527)
  演奏スキル強化 [*] (強度95)
  魔力維持 (強度7)
  変異保護 (強度7)
  魅力維持 (強度270)
  詠唱スキル強化 [*] (強度6)
  魔力維持 (強度39)
  耐久+6 (強度279)
の8個です。更にこの1つ下には
  魔力維持 (強度13)
があるはずですが、魔法威力強化が飛ばされてしまって、1つずつ上にずれてしまっています。
※スキル強化で選ばれるスキルが変化しているのはMMA系列の仕様によるもので、これは別問題です。

魔法威力強化は選択肢に出ません

詳しく検証した人によると、魔法威力強化が「選ばれない」のではなく、「選ばれた後にリストには追加せずにスルーする」といったような処理になっているらしいです。これを復活させてみましょう。


①魔法威力強化を除外する処理の特定

「なんだか様子がおかしい」で検索すると6行下に生き武器のエンチャリストを生成する処理が見つかります。repeat 50~loopがその処理です。この中のどこかに「魔法威力強化(ID:34)」を除外する処理が含まれています。どこだと思いますか?

どこで魔法威力強化が除去されているでしょう?

次の5行はいかにも怪しいですが違います。この処理は本家Elonaからあるもので、2/3の確率で魔法威力強化を除去する処理です。更に言えばMMA系列ではここよりも前の段階で魔法威力強化が除去されていることが分かっています。

if ( rtval == 34 ) {
	if ( rnd(3) ) {
		continue
	}
}

正解はこの行。より厳密に言えばencadd関数です。

encadd ci, randomenc(randomenclv(4)), randomencp(), 0, 0, 1

encadd関数を見てみましょう。下記画像のこの部分が魔法威力強化を除外しています。

f = 0
repeat length(encref) - 3, 3
	if ( encref(cnt, enc@m48) == 0 ) {
		break
	}
	if ( encflt(reftype, encref(cnt, enc@m48)) != 0 | encflt(reftypeminor, encref(cnt, enc@m48)) != 0 ) {
		f = 1
		break
	}
loop
if ( f == 0 ) {
	return
}
encadd関数で魔法威力強化が除外されています

実際のところ、コードを見てもこれがなぜ魔法威力強化を除外する処理になるのか分からないかと思います。私もまだ分かっていません。
……が、騙されたと思ってencadd関数のこの部分を本家Elonaと同一のものに書き換えてみましょう。
(確認した限りではTT・oo・elmも本家と同一でした)

if ( encflt(reftype, encref(3, enc@m48)) == 0 ) {
	if ( encref(4, enc@m48) == 0 ) {
		return
	}
	else {
		if ( encflt(reftype, encref(4, enc@m48)) == 0 ) {
			return
		}
	}
}

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

encadd関数を本家Elonaのものに戻しました

②動作確認

上記を変更した状態で、銘を「怪物を殺す砂漠」にしたLv1近接武器を使ってみましょう。1番目に魔法威力強化(強度527)が出現すれば成功です。これで必ず紳士が作れますね。

魔法威力強化が出現しました!

③MMAhのモンスター召喚

続いての変更はモンスター召喚の処理です。
MMAhでは開発中要素ONの場合、モンスター召喚で生成されたNPCは召喚者に友好的な状態で出現します。これを祝福されたサモンモンスターの杖限定の要素とし、通常品の場合はデフォルトの関係性で出現するようにしましょう。
この章を読み進める前に以下のことを覚えておいてください。
 ・ci番目のアイテムの祝福/呪い状態はinv(17, ci)に格納されている。
 ・アイテム使用時、inv(17, ci)の値は変数efstatusにロードされる。
 ・efstatusは 1:祝福 0:通常 -1:呪い -2:堕落 を意味する。
 
"魔法でモンスターが召喚された。"で検索してください。2箇所ヒットするはずですが、うち1箇所が今回変更すべきモンスター召喚処理になります。猫・駒・イーク・ドラゴンなど、系統を指定してからNPCを生成していますね。

モンスター召喚の処理です

注目すべきは2箇所ある、条件部にcfg_mmah_betaelementsを持つifです。これがMMAhで開発中要素ONのフラグになります。まずはすくつ補正をかけないフラグを立てるここを

if ( cfg_mmah_betaelements ) {
	novoidlv = 1
}

こう書き換えましょう。「開発中要素ONの場合にすくつ補正をかけない」だったのが「祝福品の場合にすくつ補正をかけない」になりました。

if ( efstatus >= 1 ) {
	novoidlv = 1
}

次にここを

if ( cdata(150, cc) == 24001 | cdata(150, cc) == 24002 | cdata(150, cc) == 24003 ) {
	cdata(150, rc) = cdata(150, cc)
	cdata(9, rc) = cdata(9, cc)
}
else {
	if ( cfg_mmah_betaelements ) {
		copy_relation cc, rc
	}
}

こう書き換えます。ここは敵対/有効関係をコピーする処理ですが、これも「祝福品の場合」が条件になりました。

if ( cdata(150, cc) == 24001 | cdata(150, cc) == 24002 | cdata(150, cc) == 24003 ) {
	cdata(150, rc) = cdata(150, cc)
	cdata(9, rc) = cdata(9, cc)
}
else : if ( efstatus >= 1 ) {
	copy_relation cc, rc
}

このままだと確認しにくいので、最後のメッセージも書き換えておきましょう。ここを

if ( synccheck(cc, -1) ) {
	txt_select -1, lang("魔法でモンスターが召喚された。", "Several monsters come out from a portal."), "", "", "", "", "", "", "", ""
}

このように書き換えます。

if ( synccheck(cc, -1) ) {
	// 検証用 確認の為にメッセージも変更
	if ( efstatus >= 1 ) {
		txt_select -1, lang("魔法で友好的なモンスターが召喚された。", "Several monsters come out from a portal."), "", "", "", "", "", "", "", ""
	}
	else {
		txt_select -1, lang("魔法でモンスターが召喚された。", "Several monsters come out from a portal."), "", "", "", "", "", "", "", ""
	}
}
break

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

モンスター召喚処理を変更しました

祝福サモンモンスターの杖と通常サモンモンスターの杖を投げてみてください。前者の場合は友好的なモンスターが、後者の場合は本来の関係性でのモンスターが生成されたら成功です。

祝福杖を投げると友好キャラが出現しました

④杖を振った場合の対応

杖を投げた場合はこれでOKです。……が、振った場合にはなぜか通常通りになってしまいます。なぜでしょうか? 原因を特定する為、"を振った。"で検索して杖を振った時の処理を見てみましょう。 検索するとlabel_1025がヒットしました。

杖を振った場合の処理です

ここのefstatusをロードしている処理に注目。祝福されている場合でも通常品として扱う処理が入っています。これが原因のようですね。

efstatus = inv(17, ci)
if ( efstatus >= 1 ) {
	efstatus = 0
}
efsource = 1
gosub *label_1028

サモンモンスターの杖(ID:121)の場合は条件から除外してしまいましょう。efstatus = inv(17, ci) のすぐ下のif文を次のように書き換えてください。

efstatus = inv(17, ci)
if ( (efstatus >= 1) & (inv(3, ci) != 121) ) {
	efstatus = 0
}
efsource = 1
gosub *label_1028

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

サモンモンスターの杖の場合はefstatusを保持します

祝福サモンモンスターの杖と通常サモンモンスターの杖を振って動作確認をしましょう。

祝福サモンモンスターの杖を振ると友好キャラが出現しました

⑤終わりに

今回は2点の改造を扱ってみました。
実は私はこのシリーズにおける目標として
 ・MMAhへのすくつ捕獲玉の移植
 ・MMAhでUSCを生成した場合にエラー落ちする原因の特定
 ・MMA,TTでセシリアを戦わせた場合にエラー落ちする原因の特定
 ・MMA(h)で生き武器の魔法威力強化を除外する処理の特定
の4点を掲げていたのですが、今回でめでたくその全てが達成できました。
そういうわけで本講座も次回で最終回となります(それ以降も検証回や単発改造回は上げるかもしれません)。
 
次回はSESTの追加カスタムゴッド「汐路のセリア」の特殊効果をMMAhに移植してみます。最終回ということで変更点が多くなりますが、一つ一つは難しくないので頑張りましょう!

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