Elona改造講座 第23回(小さなメダルの交換アイテム追加&すくつ捕獲玉の階層表記)

Elona改造講座、第23回です。お久しぶりの今回は小さなメダルの交換アイテムを追加してみましょう。
 
小さなメダルの交換アイテムを追加する場合、大きく分けて以下の3ステップが必要になります。
 ①価格の設定
 ②陳列する物品の設定
 ③実際に陳列
書き出してみれば当たり前の工程ですね。
順を追って見ていきましょう。
 
今回は例としてクミロミ像・マニ像・AF合成許可証の計3つのアイテムを追加してみます。クミロミ像(ID:776)・マニ像(ID:777)は本家Elonaからあるアイテムですが、AF合成許可証はカスタムアイテムです。カスタムアイテムを交換対象に追加する方法についても学んでみましょう。
 
この他に過去の講座の残件として、空のすくつ捕獲玉の場合に表示名を「LvXXX」ではなく「XXX階相当」に変化させる手順についても取り扱います。


①価格の設定

小さなメダルで交換するアイテムの価格は関数calcmedalvalueで定義されています。ソース内を「defcfunc calcmedalvalue」で検索してみましょう。すぐに見つかるはずです。

小さなメダル交換アイテムの価格はcalcmedalvalueで定義されています
名前通りですね

この数字だけを見てピンと来る方もいるかもしれませんが、念の為、簡単にコメント文を追記したものも置いておきます。引数prm_1098が指すアイテムのIDをinv(3, prm_1098)で取得して、これに応じて価格を返す仕組みになっているわけですね。例えばすくつ探索許可証(ID:742)なら72枚といった具合です。

/* 小さなメダルで交換できるアイテムの価格設定 */
#defcfunc calcmedalvalue int prm_1098
	// 成長の巻物 5枚
	if ( inv(3, prm_1098) == 430 ) {
		return 5
	}
	// 信仰の巻物 8枚
	if ( inv(3, prm_1098) == 431 ) {
		return 8
	}
	// *素材変化*の巻物 7枚
	if ( inv(3, prm_1098) == 502 ) {
		return 7
	}
	// 支配の杖 20枚
	if ( inv(3, prm_1098) == 480 ) {
		return 20
	}
	// アーティファクトの種 15枚
	if ( inv(3, prm_1098) == 421 ) {
		return 15
	}
	// ボスチェア 20枚
	if ( inv(3, prm_1098) == 603 ) {
		return 20
	}
<中略>
	// ディアボロス 65枚
	if ( inv(3, prm_1098) == 56 ) {
		return 65
	}
	// すくつ探索許可証 72枚
	if ( inv(3, prm_1098) == 742 ) {
		return 72
	}
	// ガロクの槌 94枚
	if ( inv(3, prm_1098) == 760 ) {
		return 94
	}
	return 1

ここのガロクの槌の下に以下を追記します。
クミロミ像とマニ像は本家からあるアイテムなので普通に設定したい価格(この例では70枚に設定)を返せばOKです。
AF合成許可証はカスタムアイテムなので一工夫必要で、まずカスタムアイテムのアイテムID(743)をチェックした後、関数finditemidで名前の一致するカスタムアイテムが存在するかどうかを確認しています。両方一致したら価格(500枚)を返します。

	// クミロミ像 70枚
	if ( inv(3, prm_1098) == 776 ) {
		return 70
	}
	// マニ像 70枚
	if ( inv(3, prm_1098) == 777 ) {
		return 70
	}
	// AF合成許可証 500枚 (カスタムアイテム)
	if ( inv(3, prm_1098) == 743 ) {
		if ( inv(31, prm_1098) + 1 == finditemid("artifacts fusion license") ) {
			return 500
		}
	}

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

価格設定を追加しました

②陳列する物品の設定

次に陳列する物品の設定を行います。
ミラルに話しかけた際のイベント(「ユニットイベント」と呼ばれるようで、cdata150に格納されています)のイベントIDは1016です。
これを手掛かりにして「cdata(150, tc) == 1016」で検索していくと、以下の処理が見つかるはずです。

ミラルの陳列物品の定義です

先ほどと同じようにコメント文を追記してみました。
cnt=0~18の場合は対応するアイテムが陳列され、19以上の場合は何も陳列しない設定になっています。

	if ( cdata(150, tc) == 1016 ) {
		if ( cnt == 0 ) {
			dbid = 430 // 成長の巻物
		}
		if ( cnt == 1 ) {
			dbid = 431 // 信仰の巻物
		}
		if ( cnt == 2 ) {
			dbid = 502 // *素材変化*の巻物
		}
	<中略>
		if ( cnt == 16 ) {
			dbid = 56 // ディアボロス
		}
		if ( cnt == 17 ) {
			dbid = 742 // すくつ探索許可証
		}
		if ( cnt == 18 ) {
			dbid = 760 // ガロクの槌
		}
		if ( cnt > 18 ) {
			continue
		}
	}

ここのガロクの槌の下をこのように書き換えます。
ここでも再び関数finditemidが登場しました。
末尾の「cnt > 18」も「 cnt > 21」に書き換えておきます。

		if ( cnt == 18 ) {
			dbid = 760 // ガロクの槌
		}
		if ( cnt == 19 ) {
			dbid = 776 // クミロミ像
		}
		if ( cnt == 20 ) {
			dbid = 777 // マニ像
		}
		if ( cnt == 21 ) {
			if ( finditemid("artifacts fusion license") ) {
				inititemid = stat
				dbid = 743
			}
			else {
				continue
			}
		}
		if ( cnt > 21 ) {
			continue
		}
	}

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

陳列物品を追加しました

③陳列処理

このままコンパイルして実行しても、恐らくクミロミ像しか追加されないはずです。これは陳列数をデフォルトの20個から変更していない為です。
 
先ほどと同様に「cdata(150, tc) == 1016」で検索してください。次のような部分が見つかるはずです。デフォルトでは20個(0~19まで)しか陳列しない設定になっていることが分かります。

デフォルトの陳列数は20個です

今回は0~21までの計22個にしたいので、p=22に増やします。

	if ( cdata(150, tc) == 1016 ) {
		p = 22
	}

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

陳列数を22個に増やしました

④動作確認

お待ちかねの動作確認タイムです。
工房ミラル・ガロクに飛んでミラルに話しかけ、交換対象にアイテムが追加されていることを確認してください。

ミラルの交換アイテムの追加に成功しました!
(自動的に価格順にソートされます)

もし追加されていない場合はゲーム内で3日ほど時間を経過させてからまた話しかけてみてください。
ちなみにこの結果を見て分かる通り、自動で価格順にソートしてくれる処理が入っているようです。便利!!

⑤宿題:すくつ捕獲玉の表示名の変更

ここからは過去の残件です。
以前すくつ捕獲玉を実装した時には省略していましたが、ooでは空のすくつ捕獲玉の場合、表記が「LvXXX (空)」ではなく「XXX階相当 (空)」になるという仕様があります。別に動作には影響は無いのですが、ここも本家ooに合わせてみましょう。

まずは「" (空)"」で検索して、すくつ捕獲玉の表示名を定義している部分に移動しましょう。
ここを

if ( inv(3, prm_706) == 685 ) {
	if ( inv(23, prm_706) == 0 ) {
		s@m63 += lang(" Lv", " Level ") + inv(26, prm_706) + lang(" (空)", "(Empty)")
	}
	else {
		s@m63 += " (" + refcharai(prm_706, 2, 1) + ")"
		if ( inv(27, prm_706) > 0 ) {
			s@m63 += lang(" Lv", " Level ") + inv(27, prm_706)
		}
	}
}

このように書き換えます。
ibit5は★フラグ(貴重品フラグ)です。復習になりますが、すくつ捕獲玉は「貴重品フラグが立ったモンスターボール」のことでしたね。
このフラグが立っていない場合は通常通りの「LvXXX (空)」表記、立っている場合は「XXX階相当 (空)」表記になるように変更しました。

if ( inv(3, prm_706) == 685 ) {
	if ( inv(23, prm_706) == 0 ) {
		if ( ibit(5, prm_706) ) {
			s@m63 += lang(" ", " Approximate danger level: ") + inv(26, prm_706) + lang("階相当 (空)", "(Empty)")
		}
		else {
			s@m63 += lang(" Lv", " Level ") + inv(26, prm_706) + lang(" (空)", "(Empty)")
		}
	}
	else {
		s@m63 += " (" + refcharai(prm_706, 2, 1) + ")"
		if ( inv(27, prm_706) > 0 ) {
			s@m63 += lang(" Lv", " Level ") + inv(27, prm_706)
		}
	}
}

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

空のすくつ捕獲玉の表示名を変更します

コンパイル&実行して、空のすくつ捕獲玉の場合に限り表示名が「XXX階相当 (空)」に変化することを確認してください。捕獲済の場合は通常通り「(中身の名前) LvXXX」になることも確認しておきましょう。

空のすくつ捕獲玉の表示名を変更できました!

⑥補足:ヴァリアントによる違い

SE・SEST系ではすくつ捕獲玉のレベル制限とエリア制限が撤廃されています。その為、「貴重品フラグが立ったモンスターボール」の場合、レベル表記そのものを行わない設定になっています。
(また、それに伴って名前も「★すくつ捕獲玉」ではなく、本来の「★モンスターボール」に戻っています)
 
もう一つ余談として、SE・SEST系で新規生成される★モンスターボールは内部的にはLv10000固定になっているようです。もちろん画面表示はされないし、捕獲判定にも使用されない(レベル判定・階層判定自体をスキップしている様子)ようなので、実質的には特に意味は無いようです。
(他の環境に持ち込んだ場合は単にLv10000のMB、もしくは10000階相当のすくつ捕獲玉として機能するかと思います)


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