見出し画像

Elona改造講座 第9回(MMAhでセシリアを仲間にする)

Elona改造講座、第9回です。今回は前回の続きで、MMAhでセシリアが降臨した時、仲間になる処理を追加してみましょう。


①仲間加入処理の追加

前回、願いの対象にセシリア(期間外ならUSC)の降臨を追加しました。セシリア降臨に関係する部分のコードはこのようになっていることかと思います。

// 独自拡張 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)
	}
	else {
		txt_select -1, lang("「さあ、殺戮の時間を楽しみましょう」", cnvtalk("Let's enjoy the slaughter hour.")), "", "", "", "", "", "", "", ""
		flt
		characreate -1, 355, cdata(1, 0), cdata(2, 0)
		return
	}
}

ここを次のように書き換えてみてください。
characreateの前後にいくつか処理が追加された他、characreate自体の引数にも変化がありますね。

// 独自拡張 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
		// PCのレベル/2+2の初期レベルで仲間に加入
		novoidlv = 1
		initlv = cdata(38, 0) / 2 + 2
		characreate 56, 354, cdata(1, 0), cdata(2, 0)
		rc = 56
		gosub *label_1122
		return
	}
	else {
		txt_select -1, lang("「さあ、殺戮の時間を楽しみましょう」", cnvtalk("Let's enjoy the slaughter hour.")), "", "", "", "", "", "", "", ""
		flt
		characreate -1, 355, cdata(1, 0), cdata(2, 0)
		return
	}
}

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

生成処理が少し複雑になりました

②説明

前回から追加・変更された部分は以下の5行です。順に解説していきましょう。

novoidlv = 1
initlv = cdata(38, 0) / 2 + 2
characreate 56, 354, cdata(1, 0), cdata(2, 0)
rc = 56
gosub *label_1122

novoidlv = 1は生成レベルにすくつ補正をかけない為のフラグです。
(すくつ内で日記を読んだり人体錬成をしたら超高レベルの仲間が加入した! という事態を防止する為のものみたいです)
 
initlv = cdata(38, 0) / 2 + 2は初期レベルの設定です。cdata(38, 0)はPCのレベルなので、次に生成されるキャラの初期レベルは「PCのレベル/2+2」になります。例えばPCがLv100の場合、生成されるキャラはLv52になります。
ちなみにinitlv = 0の場合、そのキャラのデフォルトの初期レベル(銀眼ならLv28、カオスドラゴンならLv50、各ギルドマスターならLv55、混沌三神ならLv80、といった具合)で生成されます。
 
characreate 56, 354, cdata(1, 0), cdata(2, 0)はお馴染みのキャラ生成関数ですが、第1引数に56を指定しています。これは「56番目のキャラ枠に、セシリア(ID:354)を生成する」という命令になります。この56番目の枠は特殊で、解析wiki(https://w.atwiki.jp/elona_valiant/pages/15.html)によると

0~55のプレイヤー、ペット、冒険者は各々のユニットの現在居るマップに関係なく常時メモリ内に存在する。
57~244の領域はマップ移動ごとにセーブデータに対して保存、読込される。
0:プレイヤー
1~15:ペット
16~55:冒険者
56:一時領域
57~244:プレイヤー、ペット、冒険者以外の現在マップ上のユニット

とのことで、一時領域として使用されているようです。
 
rc = 56gosub *label_1122は先ほど56番目の枠に生成したキャラを仲間に加入する処理です。label_1122は「変数rcで指定されたキャラを加入させる」というサブルーチンなので、rcに値を設定した後でこれを呼び出せばそのキャラを仲間にできます。
なおラベル番号はバージョン次第で変化するので、必ずしもこの番号とは限りません。"仲間の最大数に達しているため、仲間にできなかった…"などで検索して、お使いのバージョンにおける仲間加入処理をチェックしておきましょう。

③仲間加入処理の動作確認

ゲーム内の日付を8/4~8/7にしてセシリアを願ってみましょう。F12のコンソールで "elapse_month" や "elapse_day" を使うと手軽に日付調整ができます。願って仲間にできれば成功です。


セシリアが仲間になりました(PCの右のキャラ)

ステータスも見てみましょう。この時のPCはLv59だった為、加入したセシリアは59/2+2でLv31でした。デフォルトのLv45以上のセシリアを加入させる為にはPCがLv86以上は必要みたいですね(結構上げないといけませんね……)。

Lv31なのでデフォルトより低いです……

④会話の追加

仲間に加入後のセシリアには関係が無い話ですが、仲間に加入していない状態のセシリアにはelmでは専用の会話が存在します。MMAやMMAhにはこの処理は移植されていない為、話しかけても「(あなたを無視している)」としか表示されません。せっかくなのでこれも追加しておきましょう。
 
まずは「_switch_val == 348」で検索して、着ぐるみのバイトの専用会話を見付けましょう。この下に「_switch_val == 354」を条件にしたif文を作って、セシリアの専用会話を追加します。次のような処理を追加してください。
(一応_switch_val == 355をOR条件で指定して、USCに話しかけた場合も同じ台詞が表示されるようにしていますが、元々敵対的なUSCと会話できる機会は恐らく無いでしょう)

	// 専用会話(セシリア,USC)
	if ( _switch_val == 354 | _switch_val == 355 ) {
		if ( rnd(2) ) {
			buff = lang("(彼女の周囲には、無数の光が飛び交っている。)", "(Innumerable light flits in her surroundings.)")
		}
		else {
			buff = lang("ごめんなさい、ちょっと眩しかったかしら。でもこの光は私の生命(いのち)の証。死ぬまで消えることはないの。", "I'm sorry this light was dazzled for you. However, this light proves my life. \nIt never disappears until dying.")
		}
		get_enter strbye
		break
	}

こんな感じになればOKです。2種類の会話内容がランダム(かつ等確率)で表示されます。ちなみにこれはMMAh式の書き方なので、他のヴァリアントをお使いの方は自分の環境に合った記述法で会話内容を定義してください。

会話内容は2種類がランダムに表示されます

「キャラ生成 光の嵐」を願って、友好的だが仲間ではない状態のセシリアを生成しましょう。話しかけて先ほど追加した内容が表示されれば成功です。

これで無視されることもなくなりました

⑤Q&A

Q.仲間にしたセシリアにも喋ってほしい
A.会話内容を書いたテキストファイルを用意して、口調を変えるで適用しましょう。カスタムテキストまとめwikiには無かったので自作になるかなぁ……
 
Q.USCを仲間にしたい
A.人体錬成でできるんじゃないでしょうか?
 8/4~7以外にセシリアを願ってUSCを降臨させる。
  ↓
 ショウルーム保存
  ↓
 残骸集め
という流れでできると思います。
手間はかかるけどLv90なので即戦力にはなりそうです。

Q.MMA系で生成したセシリアやUSCをelmに連れ込むとどうなるの?
A.分かりません……
そもそもMMA系からelmへの引っ越しってできるんでしょうか?

(2024/1/7(日)追記)
Q.セシリアやUSCをomakeに連れ込むとどうなるの?
A.omakeにはこれらのキャラの定義は存在しませんが、実際に試してみるとchara_486.bmpさえ用意しておけば問題なく表示されました。どうやら生成済のキャラはそのままの状態で残り続けるようです。
流石に倒した時に生成されるはく製等は無名になってしまいますが、それでもエラー落ちはしないようです。これもElonaの基本システムの優秀さゆえですね。
無論、黄金様の降臨を招きかねない行為であることは留意してください。

omakeに連れ込むとこうなります
(左:マップ上での表示 右:セシリアを倒した場合のドロップ)

⑥終わりに

前回と今回で願いの追加・会話処理の追加・仲間加入処理といった改造が可能になったことかと思います。これで好きなキャラを願えるようにしたり、デフォルトでは会話の無いキャラに会話内容を追加したりもできますね。

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