Elona改造講座 第18回(鍛冶ハンマーの移植:後編)

Elona改造講座第18回。
鍛冶ハンマーの移植、後編です。
今回は鍛冶の最大の目玉であるAF合成を使えるようにしましょう。


①高レベル鍛冶ハンマーの入手

鍛冶ハンマーでのAF合成にあたって最初の難関。それはハンマーのレベル上げでしょう。AF合成が可能になるのはLv21。全種のエンチャが合成できるようになるのはLv41です。
また、MMA系列にはエゴ付き鉱石(接頭語の付いた鉱石)なんてものは無いので、通常プレイでは高レベルモンスターの皮を地道に叩いて鍛える他は無いかと思います。
 
ですがそれだと動作確認にならないので、今回はてっとり早く願えるようにしてしまいましょう。前回鍛冶素材を願えるようにしましたが、その下に同じようにして"名工のハンマー"を願えるようにします。以下の処理を追加してください。

// CS追加 ハンマーLv41を願いの対象に追加(ウィザードモード限定)
if ( gdata(828) ) {
	if ( inputlog == "名工のハンマー" | inputlog == "master hammer" ) {
		flt
		if ( finditemid("blacksmith hammer") ) {
			inititemid = stat
			itemcreate -1, 743, cdata(1, 0), cdata(2, 0), 0
			inv(25, ci) = 41
		}
		txtgod godcheck(), 2415
		return
	}
}

アイテムの生成はお馴染みitemcreate関数を使用します。
ただしハンマーはカスタムアイテムなので、finditemid関数で名前からカスタムアイテムIDを取得し、それをinititemidに代入したうえでitemcreate関数で743(カスタムアイテム)を生成するといった手順が必要になります。
inv(25, ci) = 41が生成されたハンマーをLv41に設定する処理です。
(余談ですがハンマーのLvとExpは生き武器と同じ記憶領域を使っているようです)

ハンマーLv41を願えるようにしました
名前を指定してカスタムアイテムを生成する手順は覚えておきましょう

②ハンマーでAF合成許可証を選択(失敗例)

AF合成許可証を入手して実際にAF合成を試してみましょう。と言っても今はまだAF合成許可証の入手手段がウィザードモードでの願いしか無いはずなので願って入手しましょう。"アーティファクト合成許可証"で願えるはずです。
さて、ハンマーLv41を使ってAF合成許可証を選択したらAF合成が始まるはずですが……
恐らく「部屋が一杯で出来ない」と表示されるだけでしょう。
マップ内のアイテムを十分に減らしても結果は同じ。変ですね。

あれれ? AF合成ができませんね……

それではここでクイズを。以下はAF合成の処理ですが、ここにこの現象の原因があります。どこだと思いますか?

/* 鍛冶 AF合成の処理 */
*label_smith_2833
	gsel 4
	repeat 8
		pos cnt \ 4 * 180, cnt / 4 * 300
		picload exedir + "\\graphic\\g" + (cnt + 1) + ".bmp", 1
	loop
	gsel 0
	listmax = 0
	page = 0
	pagesize = 14
	cs = 0
	cc = 0
	cs_bk = -1
	inhmax = 0
	inh_ci = craftref(4)
	getinheritance inh_ci, inhlist, inhmax
	if ( stat == 0 ) {
		txt_select -1, lang("部屋が一杯で出来ない。", "Your home has no empty spot."), "", "", "", "", "", "", "", ""
		return 0
	}
	base_ci = craftref(2)
	repeat inhmax
		<略>
	loop
	if ( listmax == 0 ) {
		list(0, listmax) = -1
		listn(0, listmax) = "継承効果なし"
		listmax++
	}
	windowshadow = 1

正解はこれ。
getinheritance関数です。

getinheritance inh_ci, inhlist, inhmax

「部屋が一杯で出来ない」と表示される直接の原因がgetinheritanceの戻り値(stat)なんですからバレバレですよね。

③AF合成を可能にする

ここで一旦MMAhのgetinheritanceを見てみましょう。中略部分にはcontinueや2重ループからのbreakはあれど、returnはありません。必ず10回ループを回したうえで最後のreturnで関数を抜けます。

#deffunc getinheritance int prm_625, array prm_626, var prm_627
	randomize inv(30, prm_625) + 1
	dim prm_626, 15
	prm_627 = 0
	repeat 10
		p@m42 = rnd(15)
		if ( inv(40 + p@m42 * 2, prm_625) == 0 ) {
			continue
		}
		<中略>
		if ( rnd(4) > prm_627 | inv(40 + p@m42 * 2 + 1, prm_625) < 0 ) {
			prm_626(prm_627) = p@m42
			prm_627++
		}
	loop
	randomize
	return

ooのgetinheritanceも見てみます。こちらもやはり中略部分にはcontinueや2重ループからのbreakはあれど、returnはありません。必ず10回ループを回したうえで最後のreturnで1を返して関数を抜けます。

#deffunc getinheritance int prm_570, array prm_571, var prm_572
	randomize inv(23, prm_570)
	dim prm_571, 15
	prm_572 = 0
	cibk2 = ci
	ci = 5480
	dbid = inv(3, prm_570)
	if ( dbid == 743 ) {
		inv(31, ci) = inv(31, prm_570)
	}
	dbmode = 3
	gosub *label_0482
	inv(0, ci) = 0
	ci = cibk2
	repeat 10
		p@m42 = rnd(15)
		if ( inv(40 + p@m42 * 2, prm_570) == 0 ) {
			continue
		}
		<中略>
		if ( rnd(4) > prm_572 | inv(40 + p@m42 * 2 + 1, prm_570) < 0 ) {
			prm_571(prm_572) = p@m42
			prm_572++
		}
	loop
	randomize
	return 1

どちらも10回ループを回したうえで末尾のreturnで関数を抜ける仕組みですが、ここで「MMAhの方は値を返さないのに対して、ooでは必ず1を返す」
という違いがあることに気付くかと思います。
このgetinheritanceの仕様の違いが原因で「部屋が一杯で出来ない」になっていたようです。getinheritanceを戻り値1を返すようにしてしまってもかまいませんが、他への影響が懸念される為、呼び出し元の*label_smith_2833側で戻り値チェックの方をコメントアウトしておきます。

getinheritanceの戻り値をチェックしないようにしました

これだとアイテム数の空きのチェックが機能しない為、400個制限にひっかかるとアイテム破壊(トラッシュカン送り)が起きる気がしますが、元のooの時点で必ず1を返す関数なのでそもそもこのifの中に入る方法があるのか不明です。
(この辺の仕様に詳しい方は情報ください)

④AF合成!

実際にAF合成をしてみましょう。
AF合成許可証を選択後、まずは素体を選んで……

素体となる装備を選択します

次に取り出し対象(※消滅します)を選びます。この時、継承マークが付いているエンチャに注目してください(この例だと隠密強化にのみ付いています)。

取り出し対象選択
この例の場合、隠密強化が継承されます

継承されるエンチャが表示されます。取り出し対象には*3個分の強度のエンチャが付いていますが、AF合成では一度に*1個分相当の強度しか継承できない制約があります。この為、画面では*が2個付いているものの、継承可能な強度は200になります(スキル強化系エンチャはおおむね強度200で*1個相当になるそうです)。

スキル強化系エンチャの場合は1回のAF合成で強度200の継承が限度です

合成完了です。隠密強化(強度200)が付与されました!

隠密強化(強度200)が付与されました!

手元にもう1つ隠密強化(強度248)の装備がありました。
これも合成してみましょう。

隠密強化を重ねがけします(継承マークの位置に注目!)

合成すると1回目で+200になったところに2回目で更に+200された為、隠密強化の強度は計400になりました!
一方で大工強化(強度-6なので実際は弱化)という余計なエンチャまで付いてしまいましたね。こういう場合はあらかじめ名前の巻物を使って継承マークの位置を変更して……と言いたいところですがMMA系だと銘を変えても継承マークの位置は変わらないようです。地道に装備を探すしかありませんね。

隠密強化を2回重ねたので強度400になりました
余計なエンチャも付いてしまっていますが……

⑤AF合成許可証の入手

AF合成は可能になりましたが、このままだと通常プレイでAF合成許可証の入手手段がありません。"この階の封印が解けたようだ!"で検索して140行ほど上に、地獄のネフィアの場合にAF合成許可証をドロップする処理を追加します(すくつ捕獲玉ドロップ処理を追加した120行ほど上です)。

// 孤独のネフィアの場合、ハーブ10個をドロップ
if ( oabit(2, gdata(20)) ) {
	repeat 10
		flt
		itemcreate -1, 422 + rnd(6), cdata(1, 0), cdata(2, 0), 0
	loop
}
// CS追加(v1.1) 地獄のネフィアの場合、AF合成許可証をドロップ  ※ooから移植
if ( oabit(5, gdata(20)) ) {
	flt
	if ( finditemid("artifacts fusion license") ) {
		inititemid = stat
		itemcreate -1, 743, cdata(1, 0), cdata(2, 0), 0
	}
}
// MMAh追加 羅刹のネフィアの場合、宝の地図をドロップ
if ( oabit(7, gdata(20)) ) {
	flt
	itemcreate -1, 621, cdata(1, 0), cdata(2, 0), 0
}

画像のようになれば成功です。
冒頭でも使用したfinditemid関数が早速登場しましたね。

地獄のネフィアクリア時にAF合成許可証をドロップするようにしました

⑥終わりに

これにて鍛冶ハンマーの目玉であるAF合成も含めて、全ての処理の移植が完了しました。ちなみにAF合成許可証は消耗品です。合成したい回数だけ地獄のネフィアを攻略しましょう。
calcmedalvalue関数でメダル交換品のラインナップが定義されているので、そこにAF合成許可証を追加して交換できるようにしてみるのも良いかもしれませんね。
(参考として、oorやSE系だとミラルが小さなメダル500枚でAF合成許可証を交換してくれるらしいです)

その他のカスタマイズ案としては鍛冶に使える素材を増やしてみるのも良いかもしれません。魔力の結晶他結晶系で硝子製、金塊でゴールデン製、骨や骸でボーン製などなど……実用性はさておき色々な案が思い浮かびますね。

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