【PSP】エルミナージュ2のサイレントシェル周回をUWSCで完全自動化する方法【フェイム無限稼ぎ】

PSP

はじめに

PSP版『エルミナージュII ~双生の女神と運命の大地~』には、ゲームをやり込むうえで非常に重宝する有名な裏技・バグ技が存在します。それが「サイレントシェルを利用したフェイム大量稼ぎ」です。

通常、サイレントシェルはイベントNo.13「サイレントシェル」にてベルテに渡すことでフェイムを獲得できるアイテムです。しかし、ゲーム内の特定の仕様とバグを組み合わせることで、大量のサイレントシェルを安全に集め、酒場を出ずに何度も手渡してフェイムを一気に稼ぐことが可能になります。

特に、やり込み要素の目玉である「記憶のワンド」の攻撃力を限界まで強化したい場合、膨大な量のフェイムが必要となるため、この方法は非常に強力な選択肢となります。

ですが、実際にサイレントシェルを何十個も集めるために「移動・捨て・回収・鑑定・宿泊・売却」のルーチンを手動で繰り返すのはかなりの作業量を伴います。

そこで本記事では、Windows上でPSPエミュレーター(PPSSPP)を使用し、マクロツール「UWSC」を用いて一連のサイレントシェル周回操作を完全自動化するスクリプトをご紹介します。手動による単純作業を極力減らし、効率的にフェイム稼ぎを行いましょう。

※UWSC自体の導入方法や基本的な使い方については、別記事をご参照ください。

【動作確認・注意事項】

  • 本記事は PSP版『エルミナージュII』をPC上のエミュレーター「PPSSPP」で動作させている環境 を前提としています。
  • ゲーム内の仕様・バグを利用したテクニックです。予期せぬセーブデータへの影響を防止するため、作業実行前には必ずセーブデータのバックアップを作成してください。

エルミナージュIIの「サイレントシェル増殖&フェイム稼ぎ」の仕組み

スクリプトの解説に入る前に、今回利用する「サイレントシェル」を使った裏技の仕組みを正しく理解しておきましょう。この技は大きく分けて2つの仕様・バグで成り立っています。

1. 酒場でのフェイム無限納品バグ

イベントNo.13でサイレントシェルをベルテに渡すと通常フェイムを4獲得できます。通常は1回渡すとイベント達成となりますが、PSP版『エルミナージュII』ではベルテにサイレントシェルを手渡した後、酒場から出ずにそのまま会話を続けることで、手持ちにあるサイレントシェルの数だけ何度でも納品できるというバグが存在します。

このバグを利用して一気にフェイムを稼ぐには、事前に「大量のサイレントシェル」を手元(または商店の在庫)に用意しておく必要があります。

2. ゴミ箱システムを利用したサイレントシェルの大量複製

サイレントシェルは通常1個しか入手できませんが、エルミナージュII独自の「ゴミ箱システム」を利用することで一気に複数個(最大11個)手に入れることができます。

  1. 月光の滝(X:4, Y:6)で取得: オプションでBGMとSEの音量を「1」に設定してサイレントビーストに会うと、サイレントシェルを取得できる。
  2. その場で捨てる: 取得したサイレントシェルをその場で捨て、再度話しかけて取得する。これを繰り返すと、ゲーム内の「ゴミ箱」にアイテムが蓄積される(最大10個までプール可能)。
  3. ハイベリーの森で回収: ハイベリーの森にある「ゴブリンのゴミ捨て場」でゴミ漁りを行うと、捨てた10個のサイレントシェル(未鑑定の装飾品)をすべて拾い出すことができる。
  4. 街で鑑定: 拾ったアイテムをビステールで鑑定することで、無事に計11個のサイレントシェルを確保できる。

今回紹介するUWSCスクリプトは、この「月光の滝で10個捨てる ➔ ハイベリーの森で10個拾う ➔ ビステールで鑑定・宿泊・売却(在庫化)」という面倒な1サイクルを完全自動化するものです。


UWSC自動化スクリプトの使い方

1. PPSSPPの動作環境・ウィンドウタイトルの確認

今回使用するスクリプトは、PPSSPPのウィンドウを直接指定してキー送信を行います。コード内では以下のようにウィンドウタイトルを指定しています。

ACW(GETID("PPSSPP v1.20.3 - ULJM05488 : エルミナージュⅡ","PPSSPPWnd"))

お使いのPPSSPPのバージョンやゲームのROM名(ウィンドウ上部の表示)が異なる場合、マクロがウィンドウを認識できず動作しません。必ずご自身の環境のウィンドウタイトルに合わせて、GETID() 内の文字列を変更してください。

2. 自動化スクリプト(UWSCコード)

以下のコードをテキストエディタに貼り付け、拡張子を .uws にして保存してください(例:Elminage2_Shell.uws)。

// ==================================================
// エルミナージュII サイレントシェル自動周回スクリプト
// ==================================================

// 定数定義
PUBLIC sleepTime_Loading = 1    // マップ遷移等のローディング待ち時間(秒)
PUBLIC sleepTime_KeySend = 0.05 // キー入力間のウェイト時間(秒)

// --------------------------------------------------
// メイン処理
// --------------------------------------------------
// PPSSPPのウィンドウをアクティブ化
ACW(GETID("PPSSPP v1.20.3 - ULJM05488 : エルミナージュⅡ","PPSSPPWnd"))

MoveToGekkou()         // ビステールから月光の滝へ移動
FirstEncounter()       // サイレントビーストとの初回遭遇
GetSilentShellLoop()   // サイレントシェル取得&廃棄ループ(10個プール)
MoveToHighberry()      // ハイベリーの森へ移動
Scavenge()             // ゴミ漁り(10個回収)
ReturnToTown()         // ビステールへ帰還
AppraiseItems()        // アイテム鑑定
RestAtInn()            // 宿屋で宿泊
SellItems()            // アイテム売却(または保存)


// --------------------------------------------------
// 各アクション手続き(PROCEDURE)
// --------------------------------------------------

// ビステールから月光の滝へ移動
PROCEDURE MoveToGekkou()
	U(5)
	Z(1, sleepTime_Loading)
	
	// ティオメンテで X:4 Y:6 へ移動
	X()
	Z(4)
	D()
	Z(2)
	L(7)
	U(6)
	Z()
FEND

// サイレントビーストとの遭遇(初回1個分)
PROCEDURE FirstEncounter()
	Z(5)
	X()
	Z(2)
	D()
	Z()
	D(3)
	Z(2)
	U()
	Z()
	X(3)
FEND

// サイレントシェルを「貰う ➔ 捨てる」ループ(計9個作成)
PROCEDURE GetSilentShellLoop()
	FOR i = 1 TO 9
		S()
		Z(5)
		X()
		Z(5)
		U()
		Z()
		X(3)
	NEXT
	// 最後に1回貰って所持(合計11個分)
	S()
	Z(5)
FEND

// ワールドマップ経由でハイベリーの森へ移動
PROCEDURE MoveToHighberry()
	// ティオメンテで X:11 Y:0 へ移動
	X()
	Z(2)
	U()
	Z(2)
	D()
	Z(2)
	R(7)
	D(6)
	Z()
	D(1, sleepTime_Loading)
	
	// ハイベリーの森へ入る
	X()
	D(2)
	Z(1, sleepTime_Loading)
	
	// ティオメンテで X:4 Y:2 へ移動(ゴミ捨て場)
	X()
	Z(4)
	D()
	Z(2)
	L(4)
	U(2)
	Z()
FEND

// ゴミ漁り(捨てたアイテムの回収)
PROCEDURE Scavenge()
	S()
	Z(44)
	D()
	Z(3)
FEND

// ビステール(街)へ帰還
PROCEDURE ReturnToTown()
	// ティオメンテで X:11 Y:0 へ移動
	X()
	Z(4)
	D()
	Z(2)
	R(4)
	D(2)
	Z()
	D(1, sleepTime_Loading)
	
	// ビステールへ移動
	X()
	Z(1, sleepTime_Loading)
	Z(1, sleepTime_Loading)
FEND

// アイテムの鑑定
// 一発で鑑定できない場合を考慮してAppraisalは30で設定
PROCEDURE AppraiseItems()
	DIM Appraisal = 30
	D(3)
	Z(Appraisal)
	X()
	Z(1, sleepTime_Loading)
FEND

// 宿屋で宿泊(MP回復)
PROCEDURE RestAtInn()
	D()
	Z(1, sleepTime_Loading)
	Z(5)
	X()
	Z(1, sleepTime_Loading)
FEND

// アイテムの売却
PROCEDURE SellItems()
	D()
	Z(1, sleepTime_Loading)
	D(2)
	Z(23)
	X()
	Z(1, sleepTime_Loading)
	X()
	Z()
FEND


// --------------------------------------------------
// キー入力共通関数 & ショートカット
// --------------------------------------------------

PROCEDURE KeyPush(vkCode, count = 1, waitAfter = 0)
	FOR c = 1 TO count
		KBD(vkCode, DOWN)
		SLEEP(sleepTime_KeySend)
		KBD(vkCode, UP)
		SLEEP(sleepTime_KeySend) // チャタリング防止・キー解放の安定化
	NEXT
	IF waitAfter > 0 THEN SLEEP(waitAfter)
FEND

// 入力短縮用エイリアス関数
PROCEDURE Z(count = 1, waitAfter = 0); KeyPush(VK_Z, count, waitAfter); FEND
PROCEDURE X(count = 1, waitAfter = 0); KeyPush(VK_X, count, waitAfter); FEND
PROCEDURE U(count = 1, waitAfter = 0); KeyPush(VK_UP, count, waitAfter); FEND
PROCEDURE D(count = 1, waitAfter = 0); KeyPush(VK_DOWN, count, waitAfter); FEND
PROCEDURE L(count = 1, waitAfter = 0); KeyPush(VK_LEFT, count, waitAfter); FEND
PROCEDURE R(count = 1, waitAfter = 0); KeyPush(VK_RIGHT, count, waitAfter); FEND
PROCEDURE S(count = 1, waitAfter = 0); KeyPush(VK_S, count, waitAfter); FEND

スクリプトの解説と調整のコツ

1. 「直前の1回 + 9回ループ + 1回取得」で限界までゴミ箱にプールする

スクリプトの要となるのが GetSilentShellLoop() です。

PROCEDURE GetSilentShellLoop()
	FOR i = 1 TO 9
		S() // 捨てる操作
		Z(5)
		...
	NEXT
	// 最後に1回貰う
	S()
	Z(5)
FEND

FOR i = 1 TO 9 により、サイレントシェルを「受け取っては捨てる」動作を9回繰り返します。ゴミ箱システムで保持できる最大数は10個であるため、直前の1回分の操作と合わせて、計10個分をゴミ箱に溜めた後、最後にもう1個を直接所持することで、一気に上限の11個のサイレントシェルを確保する処理を行っています。

2. キー入力関数による簡潔な記述

スクリプト下部にあるエイリアス関数により、複雑なキー入力を短縮して管理しています。

  • Z() : 決定キー(Z)を1回押す
  • Z(5) : 決定キー(Z)を連続で5回押す
  • U(), D(), L(), R() : 上下左右の移動キー
  • X(), S() : キャンセル、特殊操作キー

この記法により、移動や会話イベントのキー操作ログが可読性の高いコードとして整理されています。

3. 入力ズレが起きる場合の対処法(Wait時間の調整)

エミュレーターの動作速度やパソコンの処理スペックによっては、画面切り替えよりもキー送信が早すぎて操作がズレてしまう場合があります。その場合は、スクリプト冒頭のウェイト変数を変更してください。
※なお、筆者の実行環境では作業効率化のため、PPSSPP側のエミュレーション速度を400%に設定して動作させています。

PUBLIC sleepTime_Loading = 1    // マップ遷移等の待ち時間
PUBLIC sleepTime_KeySend = 0.05 // キー入力間のウェイト
  • 画面切り替えやロードでズレる場合: sleepTime_Loading = 2(2秒待機)のように数値を増やします。
  • メニュー選択や連打で選択肢が飛ぶ場合: sleepTime_KeySend = 0.1 のようにキー入力間隔を広げます。

自動化においては、スピードよりも「エラーなく確実にループが回ること」が重要なため、最初は余裕を持たせたウェイト設定にするのがおすすめです。


スクリプト実行時の注意点と事前確認

1. 開始時のパーティ状態と前提条件を合わせる

本マクロは、特定の初期状態からスタートすることを前提に設計されています。実行前に以下の準備が整っているか確認してください。

  • スタート地点が「ビステール」であること。
  • 移動呪文「ティオメンテ」を使用できるパーティ構成であること(回数に余裕があること)。
  • システムオプションでBGM音量・SE音量が「1」に設定されていること(サイレントビーストとの戦闘を回避するため)。
  • 鑑定を行う司教(ビショップ)などの準備、または所持金・インベントリの空き枠があること。

2. 必ず初回は手動テスト(目視確認)を行う

いきなり放置して長時間運用するのではなく、まずは1〜2周ほどスクリプトを走らせて以下の点を目視チェックしてください。

  • [ ] PPSSPPのウィンドウが正しくアクティブになるか
  • [ ] ティオメンテの座標指定(X:4 Y:6 など)にズレがないか
  • [ ] ゴミ漁りでサイレントシェルが正しく回収できているか
  • [ ] 宿屋での宿泊・売却時に選択肢がズレていないか

一度でもキー入力がズレると、その後の操作がすべて意図しない挙動になってしまいます。問題なく1サイクル回ることを確認してから本格的な運用に入りましょう。


【動画】UWSCによる自動周回の実際の動作

言葉やコードだけでは動作イメージが掴みにくい方のために、実際にUWSCスクリプトを起動してサイレントシェルの自動収集から鑑定・売却までを行っているプレイ動画を用意しました。

動画の主なチェックポイント

動画内では以下の流れがスムーズに処理されているかをご確認いただけます(※PPSSPPの動作速度400%設定時)。

  • 月光の滝での収集&連続破棄: サイレントシェルを取得し、その場で捨てる操作が正確に10回分(ゴミ箱の上限まで)行われているか
  • ハイベリーの森での一括回収: ゴブリンのゴミ捨て場へ移動し、捨てたアイテムを全回収するタイミング
  • ビステールでの一連処理: 帰還後の「鑑定 ➔ 宿泊 ➔ 売却(または在庫化)」までが無駄なく完了しているか

実際の移動速度やメニュー操作のテンポ感を掴む参考にしてみてください。自分の環境で動作がズレてしまう場合は、動画のテンポと比較しながらウェイト(sleepTime_LoadingsleepTime_KeySend)の数値を調整するのがおすすめです。


おわりに

今回は、PSP版『エルミナージュII ~双生の女神と運命の大地~』におけるサイレントシェルの増殖テクニックと、UWSCによる周回自動化スクリプトをご紹介しました。

月光の滝とハイベリーの森を往復するルーチンを自動化すれば、手動では膨大な時間を要するサイレントシェルの収集作業をあっという間に完了できます。集めた大量のサイレントシェルを酒場で連投すれば、記憶のワンドの攻撃力最大化に必要な大量のフェイムも簡単に確保することが可能です。

やり込みプレイの壁となる単純作業を効率化し、最強の装備作成やダンジョン攻略の準備に時間を活用してみてください。

※自動操作を行う際は、必ずセーブデータのバックアップを取ったうえで、自己責任にてお試しくださいますようお願いいたします。

コメント