見出し画像

Elona改造講座 第4回(Plus拡張・ヤカテクト様の降臨)

Elona改造講座、第4回です。今回はMMA系列の隠し機能(没機能?)であるPlus拡張を利用して、MMAhでPlusのヤカテクト様を降臨させてみましょう。
(2024/01/13追記)
このページの情報は古くなっています。
ヤカテクトのキャラ定義を追加する場合、o_creature.csvには手を加えず、セシリア(ID:354)や頑嬢(ID:363)と同じように、ソースコード中で直接定義した方が安全でしょう。


①事の始まり

ソース内を調べていたら、何やらヤカテクトなる神の名前が。私はPlusもプレイ経験がある為(と言っても第2部の途中までの版なのでかなり昔ですが)、存在は知っていますが「なぜここに?」という疑問が。

なんでおるん?

更に調べていくと、ヤカテクト関係の処理には「変数plusextendedが真の場合のみ」という条件が。どうやらAA拡張と似たような機能としてPlus拡張が予定されていたようです(ただしヤカテクト周り等、一部機能のみ実装予定だった様子です。変数plusextendedとセットで文字列"yacatect"が頻出する為)。

変数plusextendedとヤカ様の名前は大抵セットで登場します

気になったら早速実験です。MMAhのstart.hspを「aaextended」で検索しましょう。AA拡張のON/OFFを管理する変数aaextendedの設定を行っている箇所や、タイトルに表示するバージョン情報「title "Elona" + " ver " + "1.22" + " " + mmahver」の設定を行っている箇所が見つかるはずです。

ここに以下のように追記しましょう(必須なのは「plusextended = 1」の行だけですが、確認の為、Plus拡張が有効ならタイトルにPlusextendedと表示するようにしています)。

/* Plus拡張 */
plusextended = 1
if ( plusextended ) {
	mmahver = mmahver + " Plusextended"
}

画像のようになったら成功です。コンパイルして実行してみましたが……

Plus拡張を有効にした、はず……

実際に降臨を願ってみると、ヤカ様の声はすれども姿は見えず。無名のNPCが生成されただけでした。ここまでが私の2021年5月の経過になります。

声はすれども姿は見えず……

②NPCデータの追加

こうなる原因は単純明快で「ヤカ様のNPCデータが存在しない」ことにあります。ソースの降臨処理の部分をもう一度見返してみましょう。注目すべきはcharacreate関数キャラID:482を生成していますね。これがヤカ様のキャラデータになります。

if ( inputlog == "ヤカテクト" | inputlog == "yacatect" ) {
	txt_select -1, lang("「お呼びとあらば即参上!なんや?商談やろか?」", cnvtalk("You call on me and I appear! What's up? Got a business transaction for me?")), "", "", "", "", "", "", "", ""
	flt
	characreate -1, 482, cdata(1, 0), cdata(2, 0)
	throwsstpevent "AdventGod", rc, inputlog, 0
	adventothergod "yacatect"
	return
}

比較用にみんなのアイドルエヘ様の降臨処理も。こちらはキャラID:331を生成しています。

if ( inputlog == "エヘカトル" | inputlog == "ehekatl" ) {
	txt_select -1, lang("「うみみゅみゅぁ!」", cnvtalk("Meeewmew!")), "", "", "", "", "", "", "", ""
	flt
	characreate -1, 331, cdata(1, 0), cdata(2, 0)
	throwsstpevent "AdventGod", rc, inputlog, 0
	adventothergod "ehekatl"
	return
}

MMAhの場合、キャラの定義はo_creature.csvで行われているのでこれをExcelで開いてみましょう。公式版から存在するエヘ様はちゃんと331番目に存在していますね。ですが別のヴァリアントで追加されたヤカ様のキャラ定義が存在するはずがありません。

キャラ定義は353まで!

キャラバンの隊長のすぐ下にヤカ様を追加しましょう。エヘ様の行をコピーして末尾に貼り付けます。名前を《富のヤカテクト》にして、キャラID:482, 画像ID:495に設定します。職業や行動はお好みでどうぞ。私は職業はwarmage(魔法戦士)、行動はactMelee(打撃)とspMagicArrow(魔法の矢)を指定してみました。
 
また、ヤカ様の後ろに名前が空のキャラを500行目まで追加しておきましょう(一見無意味な作業ですが、o_creature.csvの行数はNPCデータ登録枠の数に関係してくる為)。テキストエディタで開いてこんな感じになっていればOKです。

皇女『シルヴィア』,352,,<Silvia> The princess,/man/,norland,tourist,humanoid,,1,100,400,,,,,cNeutral,1,479,0,,,,,,,,aiSpecial,,,,,,,SpUnique,,「何よ、この、ばか豹!いじわるの、ばかの、何もわかってない唐変木のでくのぼう!」#{Come on  you stupid leopard! You ignorant  mean  stupid  uncouth numbnut!}\n「触らないで!私に触らないでよ、この豹!」#{Don't touch! Don't touch me  leopard!}\n誰かが足で床を踏み鳴らす音が聞こえる。#You hear someone stamping her feet.\n「どうせ私は姉さんとはメダカとクジラほど違う、ガリガリの痩せっぽっちで貧相なちびの妹よ。私の味方なんて、一人もいやしないんだわ!」\n「あんたが***してくれないんなら、宮廷中の男をくわえこんで***してやる!」,「ムチをくれるわよ!」#{I will beat you with a whip!}\n「こ、この、無礼者!お前なんか死刑にするわよ!」#{You...you insolent peasant! I will bring you to the scaffold!}\n「よくも切ったな!よくも私を切ったな!」\n「アアアアア!ヒィィィィ!人殺し!お父様にいってやる!」\n「いまやっとわかったわ。あなたは私が死ねばいいと本気で思ってるのね!」,「私なんか、生まれてこなければよかったんだわ!」#{To hell with me!}\n「非人!悪魔!鬼!人殺し、人殺し、人殺し!」#{Villain! Devil! Fiend! Murderer  murderer murderer!},「私を一人にしないでって約束した、あんなに固く約束したのに」#{And you promised you wouldn't leave me alone...},,,,,,
キャラバンの隊長,353,,caravan master,/man/,juere,gunner,humanoid,,22,100,400,,,,,cNeutral,,443,0,,0,,n*,,,,aiStand,,,,,,,Sp,,,,,,,,,,,
《富のヤカテクト》,482,,<Yacatect>,/god/,god,warmage,lich,,350,100,400,eqTwoHand=true\neqWeapon1=739,,,,cNeutral,1,495,0,,,,,,,,,60,2,,actMelee spMagicArrow,,15,SpUnique,,,,,,,,,,,
,,,,,norland,predator,humanoid,,1,100,400,,,,,,0,347,0,,53,,,,,,,,,,,,,Sp,gosub *eatPlayer,「Qy@」#{Qy@},「Qy@!!」#{Qy@!!},「Q…Qy@…」#{Q...Qy...@},「Qy@!」#{Qy@!},,,,,,
,,,,,norland,predator,humanoid,,1,100,400,,,,,,0,347,0,,53,,,,,,,,,,,,,Sp,gosub *eatPlayer,「Qy@」#{Qy@},「Qy@!!」#{Qy@!!},「Q…Qy@…」#{Q...Qy...@},「Qy@!」#{Qy@!},,,,,,
	<中略>
,,,,,norland,predator,humanoid,,1,100,400,,,,,,0,347,0,,53,,,,,,,,,,,,,Sp,gosub *eatPlayer,「Qy@」#{Qy@},「Qy@!!」#{Qy@!!},「Q…Qy@…」#{Q...Qy...@},「Qy@!」#{Qy@!},,,,,,
,,,,,norland,predator,humanoid,,1,100,400,,,,,,0,347,0,,53,,,,,,,,,,,,,Sp,gosub *eatPlayer,「Qy@」#{Qy@},「Qy@!!」#{Qy@!!},「Q…Qy@…」#{Q...Qy...@},「Qy@!」#{Qy@!},,,,,,

Excelで見るとこのようになっています。

ヤカ様の定義を追加しました!

③プログラム修正

start.hspを「#deffunc load_o_creature」で検索して、そこから80行ほど下を見てください。o_creature.csvを1行ずつリードする処理が見つかります。

// csvを1行ずつリードするループ
repeat maxcharaid
	noteget buff2, cnt + 1
	csvstr2d splitcsv, 1, buff2, 50
	cnt2 = int(getcsvfield(splitcsv, "id"))
	npcdb_name(cnt2) = getcsvfield(splitcsv, lang("name1", "name2"))
	if ( npcdb_name(cnt) == "" ) {
		break
	}
	p(3)++
	repeat 5

ここのifの条件部分は誤りです。npcdb_name(cnt2)にキャラ名を読み込んでいるのに、npcdb_name(cnt)が空かどうかを判定条件にしています。本来はcsvから取得したIDで判定するはずが、行数で判定してしまっているんですね。npcdb_name(cnt2)に修正しておきましょう。

	// csvを1行ずつリードするループ
	repeat maxcharaid
		noteget buff2, cnt + 1
		csvstr2d splitcsv, 1, buff2, 50
		cnt2 = int(getcsvfield(splitcsv, "id"))
		npcdb_name(cnt2) = getcsvfield(splitcsv, lang("name1", "name2"))
//		if ( npcdb_name(cnt) == "" ) {
		if ( npcdb_name(cnt2) == "" ) {
			break
		}
		p(3)++
		repeat 5
読み込んだ先の要素で判定

④キャラ画像の登録と読み込み

o_creature.csvでヤカ様の定義を追加する時、画像IDに495を指定したのは覚えているでしょうか? 本来Plusのキャラであるヤカ様の画像はゲーム本体には存在しません。自分で追加する必要があります。
 
まず下記サイトからヤカ様の画像(chara_495.bmp)を入手してください。このchara_495.bmpをゲームフォルダのuser\graphic\フォルダに置きます。
 外部リンク:ELONA用差し替え画像置き場

ヤカ様の画像を用意しました

次にstart.hspを「chipc(3, 447)」で検索してください。ここは「何番のキャラ画像IDを大型キャラ用(48x96)にするか」等を定義している箇所です。ここの設定を忘れると小型キャラ用(48x48)とみなされてしまい、上半分しか読み込まれません。「降臨したヤカ様が半分地面に埋まってた!」という方は十中八九これが原因でしょう。
ここを次のように変更します(余談ですが413がエヘ様の、447がマニ様の画像になります。ヤカ様の画像はこの2人と近いタイプなので、この2人と同じ設定にしました)。

chipc(3, 439) = inf_tiles * 2, inf_tiles + 8
chipc(3, 442) = inf_tiles * 2, inf_tiles + 8
chipc(3, 447) = inf_tiles * 2, inf_tiles + 16
// キャラ画像ID:495 ヤカテクト追加
chipc(3, 495) = inf_tiles * 2, inf_tiles + 16

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

画像の読み込み設定を大型キャラ用にしました!

⑤実行

まだ途中ですが、ここで一旦コンパイル&実行して降臨を願ってみましょう。遂にヤカテクト様にご降臨いただけました!

ヤカテクト様ご降臨!

⑥ジュア様の降臨処理の競合防止

ここからは上記の変更による副作用の対処になります。
start.hspを「inputlog == "ジュア"」で検索してみてください。2箇所ヒットしたことかと思います。
 
先にヒットしたこちらはPlus版ジュア様(キャラID:359)
Plus拡張が有効な場合にのみここに入ります。

if ( inputlog == "ジュア" | inputlog == "jure" ) {
	txt_select -1, lang("「べ、別に来たくて来たわけじゃないんだからね!」", cnvtalk("Untranslated sentences!")), "", "", "", "", "", "", "", ""
	flt
	characreate -1, 359, cdata(1, 0), cdata(2, 0)
	throwsstpevent "AdventGod", rc, inputlog, 0
	adventothergod "jure"
	return
}

次にヒットしたこちらはAA版ジュア様(キャラID:1502+1000)
MMA系列で降臨を願えるジュア様は通常はこちらです。

if ( inputlog == "ジュア" | inputlog == "jure" ) {
	txt_select -1, lang("工事中。", cnvtalk("Under construction.")), "", "", "", "", "", "", "", ""
	flt
	characreate -1, 1502 + 1000, cdata(1, 0), cdata(2, 0)
	throwsstpevent "AdventGod", rc, inputlog, 0
	adventothergod "jure"
	return
}

ご覧のようにMMA系列には2種類のジュア様がいます(IDが違う為、別キャラ扱いです)。Plus拡張が有効な場合、願いによる降臨では上にあるPlus版ジュア様が優先されます。……が、当然Plus版ジュア様(キャラID:359)の定義は存在しない為、空白のキャラが生成されてしまいます。
 
てっとり早い対策として、Plus版ジュア様を出現させる箇所をAA版ジュア様に差し替えましょう。こんな感じの変更でいかがでしょうか?

	if ( inputlog == "ジュア" | inputlog == "jure" ) {
		txt_select -1, lang("「べ、別に来たくて来たわけじゃないんだからね!」", cnvtalk("Untranslated sentences!")), "", "", "", "", "", "", "", ""
		flt
//		characreate -1, 359, cdata(1, 0), cdata(2, 0) // Plus版ジュア
		characreate -1, 1502 + 1000, cdata(1, 0), cdata(2, 0) // AA版ジュア
		throwsstpevent "AdventGod", rc, inputlog, 0
		adventothergod "jure"
		return
	}

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

Plus拡張ONの場合でもAA版ジュア様を降臨させます

⑦イベント用キャラとの競合防止

これで最後の変更です。
start.hspを「dbid > (-1) & dbid < maxcharaid」で検索してください。次のような処理が見つかります。このifブロックは非常に長く、700行ほど続きます。

if ( dbid > (-1) & dbid < maxcharaid ) {
	if ( dbmode > 99 & dbmode < 105 ) {
		repeat 9
			s(cnt) = npcdb_txt(dbid, dbmode - 100, cnt)
			if ( dbid == 176 | dbid == 205 | dbid == 249 | dbid == 210 ) {
				if ( jp ) {
					sreplace s(cnt), s(cnt), "\"", ""
				}
				if ( dbid == 205 ) {
					sreplace s(cnt), s(cnt), "+_syujin(cSex(pc))+", _syujin(cdata(8, 0))
				}
				else {
					sreplace s(cnt), s(cnt), "+_onii(cSex(pc))+", _onii(cdata(8, 0))
				}
			}
		loop
		<中略>
	}
	return 0
}

700行ほど下を見ると、今度はこんな処理が見つかります。ここは他ヴァリアントのキャラやイベント専用キャラの設定をしている箇所です。例えばID:354は光の嵐『セシリア』(elmの追加キャラらしいです)、ID:356は微笑む斬殺者イベントの銀眼の斬殺者(ooからMMAhに移植)、ID:363は頑張るお嬢様(同上)、ID:364は追いかけっこイベントの無邪気な妹猫(同上)といった具合です。

// キャラID:354 光の嵐『セシリア』
if ( dbid == 354 ) {
	if ( dbmode == 12 ) {
		resistmod cc, 53, 50
		return -1
	}
	<中略>
// キャラID:356 銀眼の斬殺者(微笑む斬殺者イベント)
if ( dbid == 356 ) {
	if ( dbmode == 3 ) {
		cdata(27, rc) = 317
		if ( initlv != 0 ) {
			cdata(38, rc) = initlv
		}
	<中略>
// キャラID:363 頑張るお嬢様
if ( dbid == 363 ) {
	if ( dbmode == 3 ) {
		cdata(27, rc) = 211
		if ( initlv != 0 ) {
			cdata(38, rc) = initlv
		}

もう一度最初のifを見返してください。ここのmaxcharaidはo_creature.csvの行数です。そしてここのif内に入った場合、それ以降の処理は実行されません。

if ( dbid > (-1) & dbid < maxcharaid ) {
	if ( dbmode > 99 & dbmode < 105 ) {
		repeat 9

この場合何が起きるか? 本来なら無邪気な妹猫や頑張るお嬢様が生成されるべき状況で、空白のキャラが出現してしまいます。
 
対策は難しくはありません。ID:353(キャラバンの隊長)とID:482(ヤカテクト)の間にあたるIDの場合、最初のifに入らないようにすればOKです。こんな感じでいかがでしょうか?

// 条件追加 ID:482 ヤカテクトまでの空白領域のキャラ(ID:354~481)の場合はこのifブロックに入らないこと
//	if ( dbid > (-1) & dbid < maxcharaid ) {
	if ( (dbid > (-1) & dbid < maxcharaid) & (dbid < 354 | 481 < dbid) ) {
	if ( dbmode > 99 & dbmode < 105 ) {
		repeat 9

⑧終わりに

変更箇所が多岐に渡りましたが、無事にヤカテクト様に降臨いただけました。冒頭画像のようにAAのジュア様・ooのイナリ様・MMAのフラメア様・Plusのヤカテクト様と各ヴァリアントを代表する神々を一堂に会させることも可能です。
 
余談ですがPlus拡張が有効な場合、ヤカ様の祭壇が自然生成されます。残骸集めに有用なので、気が向いたら信仰してみるのも良いかもしれませんね
(ただし捧げ物はできるもののご褒美は貰えません。アイテムデータや化身のキャラデータが無い為、別のものが生成されてしまいます)。
 
気が向いたら補講として、ヤカ様信仰に関連した記事や、イツ様の降臨方法についても触れる予定です。

補足

Q.既存の神の降臨には影響無いの?
A.Plus拡張を有効にするとオパ様・クミ様・マニ様の降臨時に台詞が追加されるようです(通常は「工事中」としか表示されない)。
 
Q.イツ様の降臨を願ったけどダミーNPCが生成された……
A.o_creature.csvにはイツ様(キャラID:484)のデータは存在しません。 本講座と同様の手順で追加してみましょう。画像(chara_496.bmp)の用意とその読み込み設定の変更もお忘れなく。ELONA用差し替え画像置き場様ではイツ様の画像も配布されています。
 
Q.街に入ったら変なNPCが生成されたけど……これ何?
A.追いかけっこイベントの無邪気な妹猫です。⑦の対応をしていないとこうなります。
 
Q.闘技場に『』というキャラが出現したけど……これ何?
A.頑張るお嬢様です。原因は無邪気な妹猫と同様です。
 
Q.TrashThrowの場合どうすればいいの?
A.TrashThrowはstart.hspに直接キャラ定義を記述するタイプのようです。 「dbid == 342」で検索すると3番目にマニ様の定義が見つかるので、 その下に同じ要領で「dbid == 482」としてヤカ様のキャラ定義を追加しましょう。私はこれでTrashThrowでもヤカ様の降臨に成功しました。
(書いてて思ったけれど、MMAhでもこの方式にした方が良かったかもしれませんね。o_creature.csvとその読み込み処理に手を付けなくて済むので)


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