見出し画像

Elona改造講座 第8回(MMAhでセシリアとU.S.C.を生成)

Elona改造講座、第8回です。
お久しぶりの今回は、elmの追加キャラであるセシリアとU.S.C.をMMAhで生成してみましょう。
当然ながら公式には推奨されない(というか暗に「やるな」と言われている)プレイなので、何が起きても自己責任でお願いします。
 
まずはMMAのreadmeの以下の記述に注目してください。

・ELMから光の嵐『セシリア』、『U.S.C.』の定義を移植して該当キャラが不具合を起こさないように
 ・枠だけなのでELMと同じ動作はしない
 ・user\graphicフォルダにchara_486.bmpが入っていないとキャラ絵が表示されないので注意
 ・何らかの理由でMMA/TrashThrowで光の嵐『セシリア』、『U.S.C.』が生成される場合は修道女に変化するように

MMAのreadmeより

続いてこちらの記述にも注目。

・elm、ore_hackの拡張キャラ、拡張アイテムはwizardモードでは願えるように

MMAのreadmeより

ご覧の通り、セシリアもU.S.C.もelmから引っ越してきたプレイヤーの為に枠だけ確保している状態で、万一生成されかけた時には別のキャラ(修道女)に置き換える処理まで入っています。
一応デバッグの為かウィザードモードだと「キャラ生成 <キャラ名>」で願えるようにされています。……が、決して推奨はされていないことが分かります。
 
実際にやった人ならご存知の通り、セシリアは正常に生成されるのに対し、U.S.C.は生成しようとした瞬間に落ちてしまいます。
(キャラ本体はもちろん、はく製を生成しようとしただけでも落ちる)
これはMMAhでのU.S.C.の生成処理にバグがある為です。
いや、バグと呼んでいいのかな……?
本来は起こりえない(生成を阻止する為の専用処理まである)状況をデバッグモードですり抜けて発生させてるわけだから、そんなことをやろうとしてる方が色々おかしい気もしますが……ともあれ今回はこれを解決してみましょう。あとせっかくなので通常モードでも願いで降臨させてみましょう。
 
とりあえずreadmeにある通り、user\graphicフォルダにchara_486.bmpを入れておいてください。
(elmから持ってくるのが一番ですが、適当なキャラのものをリネームして代用してもかまいません)

elmからセシリアのキャラ画像を持ってきました

①キャラ生成処理の比較

突然ですがここでクイズ。次の画像のコードを見てください。左はセシリア(キャラID:354)の、右はU.S.C.(キャラID:355)のキャラ生成処理です。何か決定的な違いがあることに気付きませんか?

キャラ生成処理を見比べてみましょう

初期レベル設定cdata(38, rc)が45と90で違う? PCとの関係性cdata(9, rc)とcdata(69, rc)が友好と敵対で違う? キャラ画像cdata(7, rc)に加算する値(すなわち色設定)が違う?
全て正解です。……が、いずれも生成した瞬間にエラー落ちするような要因ではなさそうです。答えは次章で。

②U.S.C.の生成処理の修正

先ほどのクイズの答えは7行目。initlvが0の場合の初期レベル設定処理にあります。セシリアの場合は関数limitmax()が呼び出されているのに対し、U.S.C.の場合はlimit()が呼ばれています。limitmax()とlimit()は引数の数さえ違うまったく別の関数です。これが原因となって落ちていたわけですね。
 
すぐ下にある頑嬢や微笑む斬殺者の生成処理を見てもらえれば分かる通り、ここで呼ぶべき関数はlimitmax()の方です。
書き直しておきましょう。

		cdata(27, rc) = 355
		if ( initlv != 0 ) {
			cdata(38, rc) = initlv
		}
		else {
			// U.S.C.生成時に落ちる現象の対策 limit()をlimitmax()に変更
//			cdata(38, rc) = limit(90, cfg_mmah_maxlevel)
			cdata(38, rc) = limitmax(90, cfg_mmah_maxlevel)
		}
		if ( voidlv != 0 ) {
			cdata(38, rc) = limit(voidlv * (50 + cdata(38, rc)) / 50, 1, cfg_mmah_maxlevel)
		}

変更したら「キャラ生成 U.S.C.」を願って、実際に生成してみましょう。ダークパワーが宿ってそうな色のセシリアが生成されたら成功です。

「キャラ生成 <キャラ名>」はウィザードモード専用の願いです
MMAhでU.S.C.が生成できました!

iキー(干渉)でステータスを見てみましょう。ノーランド魔法使いLv90と混沌三神クラスの実力者でした。おまけにデフォルトの関係性が敵対的なので半端なレベルや耐性で呼ぶと一瞬でミンチですw

高レベルかつ敵対的なのでご注意を……

③修道女への置き換え処理の削除

これで心置きなくセシリアやU.S.C.を生成できるようになりました。通常モードでセシリアやU.S.C.を修道女に置き換える処理を無効化してしまいましょう。dbid == 354で検索して、出てきた次の5行を削除orコメントアウトしてください。

if ( gdata(828) == 0 ) {
	if ( dbid == 354 | dbid == 355 ) {
		dbid = 270
	}
}

この5行が何をしているかは分かってしまえばとても簡単です。「ウィザードモードフラグ(gdata(828))が立っていない場合に、キャラIDがセシリア(354)またはU.S.C.(355)なら、修道女(270)に置き換える」という意味になります。
コメントアウトして画像のようになれば成功です。

これで通常モードでもセシリアやUSCが生成できます

④降臨処理の追加

このままだと通常モードで出現させる手段がありません。せっかくだから願いで降臨させられるようにしましょう。神々やランドアーチンやブラックプチを呼べるアレのことです。
"ブラックプチ"で検索すると降臨に関係した処理が出てくるので、こんな風にしてみましょう。

if ( inputlog == "ランドアーチン" | inputlog == "ultimate snail" ) {
	flt
	characreate -1, 225 + 1000, cdata(1, 0), cdata(2, 0)
	return
}
if ( inputlog == "ブラックプチ" | inputlog == "black putit" ) {
	flt
	characreate -1, 227 + 1000, cdata(1, 0), cdata(2, 0)
	return
}
// elm追加キャラの降臨(セシリア,U.S.C.)
// 8/4~8/7の間はセシリアが、それ以外の場合はU.S.C.が出現
if ( inputlog == "セシリア" | inputlog == "cecilia" ) {
	if (gdata(11) == 8 & gdata(12) >= 4 & gdata(12) <= 7) {
		txt_select -1, lang("「あなたに…光の加護がありますように」", cnvtalk("When does the slaughter hour end...?")), "", "", "", "", "", "", "", ""
		flt
		characreate -1, 354, cdata(1, 0), cdata(2, 0)
		return
	}
	else {
		txt_select -1, lang("「さあ、殺戮の時間を楽しみましょう」", cnvtalk("Let's enjoy the slaughter hour.")), "", "", "", "", "", "", "", ""
		flt
		characreate -1, 355, cdata(1, 0), cdata(2, 0)
		return
	}
}
// elm追加キャラの降臨 ここまで

gdata(11)とgdata(12)を条件にしたif文がありますが、これらはゲーム内の現在の月日を格納する為の変数です。
すなわちこの条件は「現在の月日が8/4~8/7の間なら」を意味しています。
月日がその範囲内ならcharacreateでセシリア(ID:354)を、それ以外ならU.S.C.(ID:355)を生成しています。
特に効果はありませんが、雰囲気作りの為にelm準拠の降臨時の台詞も追加してみました。
 
こんな感じになればOKです。

願いの対象にセシリアを追加しました
(同じ要領で自由に願える対象を増やすこともできます)

「セシリア」で願ってU.S.C.が降臨したら成功です。念の為、8/4~8/7まで日付を進めて、セシリアが降臨することも確認しておきましょう。

セシリアを願ってみると……
6/13だった為、USCが降臨してしまいました

⑤その他

elmだと8/4~8/7のセシリア降臨時、PCの半分程度のレベルで仲間に加入する処理がありますが、これについては次回取り扱います。
 
MMAhはomake系列の為に人体錬成が使えるので、現状でも素材を集めて人体錬成することで仲間に加入させることは可能でしょう。ちなみにユニークなのでウィザードモードでない限り捕獲や支配はできません。

余談

セシリアはレイストームというSTGに出てくる衛星の名前らしいです。
レイストーム……名前はよく聞くものの未プレイなんですよね……
レイフォースなら昔プレイしたことがあるのですが。
(と言っても5面が精一杯でした。BGMは1,2,5面が大好き)

(2024/01/13追記)
一部ヴァリアント(MMAやTT等)ではセシリアが交戦モードになると配列の範囲外アクセスによりエラー落ちしてしまいます。これは音声再生処理(snd 134)が原因です。
音声ファイル配列soundfileはデフォルトでは要素数が122個しか無い為、134番の音声を再生しようとすると範囲外アクセスになってしまいます。

対策としては下記のようにsnd 134(2箇所)をコメントアウトするか、配列soundfileの要素数を増やしましょう。
なお、セシリアの取り込み元のelmでは138要素、MMAhでは201要素まで拡張されている為、snd 134による範囲外アクセスは発生しないようになっています。

	if ( dbmode == 101 ) {
		txtmore
		txtef 9
		if ( jp ) {
			txtvalid = 0
			if ( rnd(4) == 0 ) {
				txt_select " *ピッピッピッ* ", "", "", "", "", "", "", "", ""
				//snd 134 // 配列範囲外アクセスを防ぐ為コメントアウト
			}
			else {
				txt_select "セシリアは物悲しげな表情を浮かべながら、無言で照準を敵に合わせた。", "セシリアの指から緑色に輝く槍と紫色の稲妻が次々と放たれ、彼女の敵を正確に射貫いていく。", "「何故あなたは殺戮の時間に加わるの?」", "", "", "", "", "", ""
			}
			return 1
		}
		else {
			txtvalid = 0
			if ( rnd(4) == 0 ) {
				//snd 134 // 配列範囲外アクセスを防ぐ為コメントアウト
			}
			else {
				txtvalid = 0
				txt_select "Cecilia matched aim to the enemy silently with a melancholic expression.", "Cecilia shot a shining green spear from the finger. It pierces her enemy accurately.", "Cecilia shot purple lightning from the finger. It pierces the person who blocks her enemy and between those.", cnvtalk("Why do you join the slaughter hour?"), "", "", "", "", ""
			}
			return 1
		}
	}

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