TOP > プログラミング関係解説&調査 > マップタイマー

マップタイマー(概要)

本作には、マップにおいてリアルタイムでイベントが進む、いわゆる時間制限イベントが存在する。
西部編の罠仕掛け、幕末編の1分毎に鳴る鐘、最終編の時のダンジョンでジャギィイエッグ出現までのカウントダウンなどが上げられる。
スーパーファミコンの時代以降のスクウェアのRPGには、時間制限イベントが数多く登場するが、スーパーファミコンというハードの性能だからできるようになったイベントなのだろう。

ここでは、それら時間制限イベントのカウントダウンがどのようにして行われているかの仕組みを説明する。
戦闘時には戦闘用タイマーが存在していて、初期戦闘乱数の計算に使われていることは紹介しているが、タイマーはマップに居る時にもあり、時間制限イベントに使われている。
マップ用のタイマーなので、とりあえず「マップタイマー」という名称にしておく。
ただし、戦闘用タイマーの値(アドレスだと[$7E:FEF0]と[$7E:FEF1])は、マップ上では0のまま動かないので、マップタイマーとは別物である。

まずは世界の合言葉は森部様の「その他メモ」にある、時間制限イベントについて記された箇所を転載する。

■時間イベント関連

西部鐘:1分
幕末鐘:1分(最初の鐘イベントを見てから開始)
最終編鐘:13秒
カラクリ丸水没:10秒

カラクリ丸の水没は、出入り口付近ではカウントが進まない。
境界のマス(詳細省略)を踏むとカウンタがリセットされ、減り始める。
境界以降では減るのみ。

少なくとも上に記された4つはマップタイマーを使ったカウントダウンのイベントになるが、西部編については他にも、罠を頼んだ住人が戻ってくるまでも一定の時間がかかることから、マップタイマーを使っているだろう。
罠を頼むことができるのは12人(保安官、アニー、マスター、ジェンマ、ウェイン夫人、ウェイン、クリント、サンチョ、パンチョ、ビリー、セザール、デロス)。
そして同時に鐘のカウントダウンも行っていることから、マップタイマーは最低でも同時に13個動かせるのでは? という予想ができる。
コンピュータの数値として13は半端なので、実際には16までは動かせるのかもしれない、という予想もできる。
ゲーム開発中は予備として、同時に動かせるタイマーを多めに用意していた可能性もある。

という推測ばかり書き連ねるのはここまでとして、実際に何が起きているのか述べる。
軽い気持ちで始めた調査だったのだが、結構なボリュームになってしまったので、2ページに分けて解説する。

まずは、調査でわかった概要を記す。

マップタイマーは16個ある

上の推測通り、本作で同時に動かせるマップタイマーは16個ある。
各マップタイマーが動作しているかのON・OFFが記録されているメモリが4バイト分(16進数4文字、2進数16文字分)確保されている。
そのメモリのアドレスは、[$00:0AC0]~[$00:0AC1]で、[$00:0AC1]を上2桁、[$00:0AC0]を下2桁の16進数4桁の数値として、プログラム上では計算に使っている。
[$00:0AC0]~[$00:0AC1]に入っている16進数4桁の数値を、ここでは便宜上「マップタイマー判定値」と呼ぶことにする。
また、16個ある各マップタイマーを、便宜上、0~15の番号を振って「マップタイマー00」~「マップタイマー15」と呼ぶことにする。
マップタイマーの番号は下の桁から順に振っている。

マップタイマー
判定値
2進数の桁マップタイマーNo.
[$00:0AC1]21515
21414
21313
21212
21111
21010
2909
2808
[$00:0AC0]2707
2606
2505
2404
2303
2202
2101
2000

どのマップタイマーが動いているかは「マップタイマー判定値」でわかる、ということである。
例えば西部編で、「マップタイマー判定値」が$2403だったとする。
$2403は2進数だと%0010 0100 0000 0011である。
上の表と照らし合わせると、マップタイマーの13, 10, 01, 00が2進数で「1」なので動作中である。
西部編でのマップタイマー13はマスター、マップタイマー10はサンチョ、マップタイマー01はアニー、マップタイマー00は鐘である。
よって、「マップタイマー判定値」が$2403の時は、「西部編の罠仕掛けで鐘のカウントダウンが進行中、罠を仕掛けている人物はマスター、サンチョ、アニー」である。
タイマーの番号と対応するタイマーなど、一覧は後にまとめて掲載する。

また、マップタイマーに対応した2進数の桁の値と「マップタイマー判定値」で論理積を取ると、該当のマップタイマーが動作中なら0、動作していないなら2進数の桁の値になる。
$2403とマップタイマー01の「21」、つまり$0002と論理積を取ると、$0002が返ってくることになるが、これで「マップタイマー01が動作中」という判定に使えることがわかる。
論理積計算用に、[$00:0030][$00:0031]には対応した数値$0001~$8000が入るようになっているのだが、これは実際のプログラムの話の時に詳しく説明する。

なお、筆者が調べた限りでは、マップタイマー00~14まではゲーム内で実際に使われているものの、マップタイマー15については使われている箇所がないようだった。

マップタイマー関連フラグ値

上で「西部編での」と断り書きをして説明をしたが、マップタイマーの動作判定は「マップタイマー判定値」と、「マップタイマー関連のフラグ」の判定もある。
筆者が調べた限りでは、マップタイマーを使ったイベントが存在するのは、西部・幕末・SF・原始・最終編の5つのシナリオである。
ストーリー進行に関係し、以降は二度と使わないタイマーの管理など、フラグ管理用の数値が[$00:0AC2][$00:0AC3]に入っている。
ここでは「マップタイマー関連フラグ値」と呼ぶことにする。
入る数値は16進数4桁で、2進数にすると16文字分であり、マップタイマー00~15に対応している。
「マップタイマー判定値」とは異なり、「0」が入っているタイマーは動かし、「1」が入っているタイマーは動かさない、という処理になる。
「マップタイマー判定値」も「マップタイマー関連フラグ値」も、シナリオ単位でマップタイマー関連のフラグ管理をしているため、各シナリオ開始時にリセットされるようである。

ストーリー進行上のフラグが多数存在する幕末編では、マップタイマー関連フラグ管理も複雑で、[$00:0AC2][$00:0AC3]に入る数値はストーリー進行度合いにより大きく変動するが、他シナリオではさほど変わらない。
西部編なら、鐘が鳴っている間はずっと鐘タイマーは動きっぱなしだし、街の人たちへの罠設置依頼も鐘が鳴っている最中なら何回でもできるので、フラグ管理は複雑ではない。[$00:0AC2][$00:0AC3]はほとんど$00が入ったままである。
原始編のマップタイマーは、最初に荒野に来た時に20秒間隔で画面が暗くなっていく時に3回繰り返して使われるが、3回使った後は[$00:0AC2]に$01が入り、それ以降は使わない、というフラグ管理がされるようである。
最終編の時のダンジョンも同様で、ジャギィイエッグを撃破して時のダンジョンのタイマーが必要なくなると[$00:0AC2]に$01が入って、時のダンジョンのタイマーは起動しなくなる。

幕末編の例として、カラクリ丸の水没用タイマーと、それに関するフラグについて説明する。
幕末編のマップタイマー一覧表は、この後に載せている通りだが、マップタイマー06がカラクリ丸の水没用タイマーである。
また、カラクリ丸の水没用タイマーが動くということは、パーティにカラクリ丸が加入していることになる。
つまりからくり源内を撃破しているため、「地下3階に落とし穴で落下することはない(天草四郎&とりまきのひとだまとの戦闘はない)」「本丸2階・天井裏の落とし穴は停止」という状況である。
このため幕末編のマップタイマー01(ひとだま復活タイマー)と、マップタイマー03(本丸2階・天井裏の落とし穴開閉タイマー)は、カラクリ丸が加入したら、仮に地下3階に行っても、本丸2階・天井裏に行っても起動しないよう、プログラム側で処理しなければならない。
よって、[$00:0AC2]のタイマー01とタイマー03に対応した値に「1」が入る。
このため[$00:0AC2]の下1桁を2進数で表すと「%1010」で(状況によってはタイマー02も終了していることがあり、その時は「%1110」)、「%1010」は16進数の「$A」である。
そしてカラクリ丸の水没用タイマーにあたるマップタイマー06だが、「カラクリ丸がパーティにいる、かつ、水没判定のあるマスの上におぼろ丸が載っている」時にだけ、[$00:0AC2]の上から2桁目を0に変更し、それ以外の時には1にしておく、という処理が入るようになっている。

ということで、「カラクリ丸がパーティにいる、かつ、水没判定のあるマスの上におぼろ丸が載っていない」という時は、[$00:0AC2]に「%0100 1010」、16進数の「$4A」が入る。
「カラクリ丸がパーティにいる、かつ、水没判定のあるマスの上におぼろ丸が載っている」時は、[$00:0AC2]に「%0000 1010」、16進数の「$0A」が入る。
というようになっている。

また、「マップタイマー関連フラグ値」とは別に、[$00:0200]には、マップタイマーを一時停止しているかどうかのフラグが入り、メニュー画面、セリフウィンドウ表示中、戦闘中、マップ切り替えの暗転中などに$01$02が入り、それ以外では$00が入る。

マップタイマーのタイマー残り時間

「マップタイマー00」~「マップタイマー15」は、動作している間、1フレームで1ずつ減っていくカウントダウンタイマーになっている。
つまり、16個分のタイマーの残り時間を記録しておくメモリが必要である。
残り時間を記録しておくメモリのアドレスは、[$00:0AE0]~[$00:0AFF]である。
残り時間は4バイトの容量を使って記録されるので、[$00:0AE0]以降の4バイト×16の領域が確保されているのである。
(ただし、タイマーを1つしか使わない最終編などは、マップタイマー00用メモリ以外は他のことの記録に使っているようでもある。詳しいことは不明)

対応表は以下の通り。
論理積計算用に[$00:0030][$00:0031]に入る数値も併記した(下では[$00:0030]と省略)。

マップタイマー
No.
[$00:0030]
の値
タイマー残り時間メモリアドレス
下2桁上2桁
00$0001[$00:0AE0][$00:0AE1]
01$0002[$00:0AE2][$00:0AE3]
02$0004[$00:0AE4][$00:0AE5]
03$0008[$00:0AE6][$00:0AE7]
04$0010[$00:0AE8][$00:0AE9]
05$0020[$00:0AEA][$00:0AEB]
06$0040[$00:0AEC][$00:0AED]
07$0080[$00:0AEE][$00:0AEF]
08$0100[$00:0AF0][$00:0AF1]
09$0200[$00:0AF2][$00:0AF3]
10$0400[$00:0AF4][$00:0AF5]
11$0800[$00:0AF6][$00:0AF7]
12$1000[$00:0AF8][$00:0AF9]
13$2000[$00:0AFA][$00:0AFB]
14$4000[$00:0AFC][$00:0AFD]
15$8000[$00:0AFE][$00:0AFF]

マップタイマーの開始

各マップタイマーに対応したイベントが始まると、「マップタイマー判定値」の[$00:0AC0]~[$00:0AC1]にはマップタイマーに対応した値が入り、上のタイマー残り時間のアドレスに所定の残り時間初期値がセットされる。
西部編の鐘であれば、マッドドッグがパーティに加わった時のメッセージウィンドウを消した直後がタイマーの開始である。
幕末編には鐘やカラクリ丸の水没以外にも多数のタイマーがあるのだが、例えば本丸2階天井裏で落とし穴が開いたり閉じたりするのもマップタイマーが使われており、おぼろ丸が落とし穴近くの特定のマスを踏むことでマップタイマーが起動して落とし穴の開閉が開始される。

タイマーの残り時間であるが、例えば西部編や幕末編の鐘は、1分のタイマーであるから、残り時間初期値は1分。
マップタイマーは1フレームに1減る仕組みなので、1分をフレーム単位にした16進数の値を該当のメモリに入れなければならない。
1フレームは1/60秒だから、
1秒 = 60フレーム
1分 = 60×60フレーム = 3600フレーム
である。
16進数にすると$0E10なので、$0Eが上位2桁、$10が下位2桁として、タイマー残り時間のメモリにセットされることになる。
この「$0E10」という数値は、ゲーム内のデータから読み出している。
例えば幕末編の鐘であれば、メモリのアドレス[$7F:CB70][$7F:CB71]に入っている値が「$10」「$0E」であり、ここからロードしている。
どのタイマーがどのメモリのアドレスから残り時間初期値を読み出しているのかは決まっているが、当ページではそれらアドレスの位置は省略する(初期値はまとめて記されているのではなく、割と散らばっているようだ)。

マップタイマーのカウントダウンと終了

マップタイマーのカウントダウン用サブルーチンは1フレームに1回呼び出されるが、

  • $C0/1A69$C0/1A97
    マップタイマー00~15までの動作状況を確認し、動作しているマップタイマーのタイマー残り時間を-1する。
  • $C0/1A98$C0/1ADB
    マップタイマー00~15までのタイマー残り時間を調べ、残り時間が0になっているタイマーは「マップタイマー判定値」の動作状況を0にしてから、タイマー終了時の処理に飛ぶ。

この2つの処理に分かれている。


以上、概要という割に長くなってしまったが、これがマップタイマーの種類・動作についてのだいたいの説明である。
この後はマップタイマーに対応したイベントの一覧と、マップタイマーを動かすサブルーチンの紹介をするが、長くなるので、サブルーチンの説明は次ページに掲載している。

マップタイマー番号と対応イベント

ここでは筆者が確認できたマップタイマーイベントと、それに対応したマップタイマー番号を記す。
あくまでも筆者が確認できた分なので、抜けがある可能性もあることをご了承いただきたい。

西部編

マップタイマー01以降は、罠設置依頼イベントでのキャラ名。
また、マスターに話しかけ、選択肢「いっぱいくれ」で時間を進めた時は、残り時間が最も少ないタイマー分だけ他タイマーの数値が減り、該当タイマーの残り時間を0にする、という処理が入る。
マップタイマー14の「コールタール」は、8つ目の鐘が鳴るまでにコールタールを仕掛けていた場合のみ、7つ目の鐘のタイマーが終わった直後に動きはじめる。この時キャラのセリフなどはなく、画面上での変化はない。コールタールのタイマーが終わると8つ目の鐘が鳴る。

No.内容タイマー時間
001分
01アニー50秒
02ビリー3分30秒
03--
04保安官30秒
05ウェイン2分10秒
06ウェイン夫人1分50秒
07ジェンマ1分30秒
08クリント2分30秒
09セザール3分40秒
10サンチョ2分50秒
11デロス
12パンチョ3分10秒
13マスター1分
14コールタール2分
15--

※デロスのタイマー初期設定時間は乱数で決まる。確率1/3で4分、確率1/3で1分、確率1/3で1秒。
初期設定時間に関係なく、デロスのタイマーはマップタイマー11である。
アイテム改造などの確率の仕様解説の一番下、「西部編・デロスに罠アイテムを依頼」の項目も参照。

幕末編

鐘とカラクリ丸だけではなく、多くのタイマーが存在している。
わかりにくいものもあるため、後に説明も付けてある。
余談だが、般若丸が強藩士を倒すまでわずか1秒、本丸2階・天井裏落とし穴の開閉時間がほぼフレーム単位、という、RPGとしてはシビアな部分は、リメイク版でかなり緩和されている。

No.内容タイマー時間
00合言葉切り替えの鐘1分
01地下3階・ひとだま復活時間3秒
02地下1階・地下牢前強藩士イベント10フレーム(1/6秒)
03本丸2階・天井裏の落とし穴(後述)
04般若丸が強藩士を倒すまで1秒
05本丸1階・隠れている忍者1分
06カラクリ丸水没10秒
07--
08箱入り娘出現待ち時間30秒
09「いんろう」の女性待ち時間10秒
10--
11--
12--
13--
14--
15--
マップタイマー00

鐘が鳴る度に合言葉が切り替わる1分のタイマー。三の丸入口で合言葉のチュートリアルを聞き終えてからは幕末編プレイ中、ずっとこのタイマーが動き続けることになる。
鐘が鳴る時に合言葉を切り替えるサブルーチンも同時に動いているはずだが、未確認。
二の丸天井裏では、覗き穴のひとつが合言葉についての会話で、この会話を見ると合言葉が強制的に『もと』に変更されてマップタイマー00の残り時間も初期値にリセットされる。

マップタイマー01

本丸地下3階では、天草四郎戦前にひとだまのシンボル(全8体)に接触しすべて倒す必要があるが、このひとだまのシンボルが復活するまでのタイマー。
撃破後にタイマーが起動し3秒で復活する。
タイマーが終了するまでに他のひとだまのシンボルに接触するとタイマーはリセットで、撃破後は再び3秒からカウントされる。
天草四郎を倒すまで、このタイマーは何度でも起動。

マップタイマー02

落とし穴から本丸地下1階地下牢に落下した時、「地下ろうの鍵」がないと廊下の強藩士が話しかけてくるイベントが起こるが、話しかけられた後に隠れ蓑を使い、かつ強藩士が牢屋の前に来ると、強藩士が牢屋の中に入ってくるイベントが発生する。
この時、隠れ蓑で隠れる時間は10フレーム(1/6秒)必要であるらしく、マップタイマー02が動くようになっている。

マップタイマー03

本丸2階天井裏の開閉する落とし穴用のマップタイマーだが、落とし穴の開閉タイマーはおぼろ丸が落とし穴近くの特定のマスを踏むと起動し、離れると停止する。
落とし穴は6ヶ所あり、場所により開閉の間隔が異なる。

上図のように①~⑥と番号をつけると、開閉時間は以下のように設定されており、例えば①の落とし穴だったら1秒タイマー→0.5秒タイマー→……を繰り返す。

落とし穴開いている時間閉じている時間
1秒0.5秒
1秒10フレーム(1/6秒)
1秒10フレーム(1/6秒)
1秒0.5秒
0.5秒0.5秒
2秒10フレーム(1/6秒)
マップタイマー04

本丸3階で般若丸が出現し強藩士4人に囲まれるが、強藩士のシンボルを1体倒すまではわずか1秒。
最大4体倒すまで1秒タイマーを繰り返す。おぼろ丸が先に強藩士に話しかけて撃破した場合はその数だけタイマー回数が減る。

マップタイマー05

本丸1階の左上フロアに入るとマップタイマー05が起動し、1分経過すると隠れていた忍者が出現するイベントが発生する。
このタイマーは他フロアに移動しても動いたままになっているが、他フロアでカウントダウンが終了しても何も起こらない。
他のタイマーもそうだが、タイマーによってはカウントダウン終了時にどこに居るかもタイマー終了後のイベント発生判定に関わっているはずである(未確認)。
また、該当フロアに入り直すとリセットされ初期値が入る。

マップタイマー06

カラクリ丸水没判定タイマー。
水堀の中に居る時に動くが、実際には水堀の中にタイマーが動きだす境界のマスがあり、扉に近い位置だと水の中でもタイマーは動かない。
水堀から戻るとタイマーはリセット。つまり10秒連続して水没判定のある水堀マスにいるとタイマーが0になった時、水没扱いになる。
また、水没判定になるマスを踏んでいるかどうかの判定はおぼろ丸のみで行われ、後ろについてくるカラクリ丸のいるマスは関係ない。
マップタイマー06が動いているかどうかは、「マップタイマー判定値」とマップタイマー06の残り時間を見る以外に、[$00:0AC2]内の上1桁の数値でも判断できる。
[$00:0AC2]の上1桁は水堀の境界以降のマスを踏んでいる時に0が入る仕組み。

水没判定のマスは以下の通り。□は水没しないマスで、■は水没判定になるマス。矢印から先はすべて水没判定。

尾手城外観マップ(画像)の扉Nから水堀に出る場合:

□N□□
□□□□
□□□□
□□□□
■■■■
↓↓↓↓

扉Mから出る場合:

←■□M□
←■□□□
←■□□□
マップタイマー08

本丸1階の箱入り娘出現カウントダウン用タイマー。
箱入り娘がいる部屋の宝箱を取ってから部屋に入り直し、隠れ蓑を使うと30秒のカウントが開始になるが、30秒後カウントが0になる瞬間に隠れ蓑を使ってあれば箱入り娘が出現する仕様で、30秒の間、隠れ蓑を解除していてもカウントダウンは進む。

マップタイマー09

本丸6階、女性をひとりも倒していない時に発生するイベント用タイマー。
「腰元のおび」を受け取った後に10秒のカウントが開始になり、10秒後に「いんろう」を渡すために女性が戻ってくる。
こちらのタイマーは、カウントが0になった時に隠れ蓑状態だと女性が戻ってこない。

SF編

No.内容タイマー時間
00カトゥーたちが部屋を出るまで10秒
伍長の通信10秒
01--
02--
03レベル3の通路の罠1.5秒

筆者が確認できたSF編のタイマーは上の2種類。

マップタイマー00は何度か動く場面があるが、最初に動くのは、SF編攻略の20.、リフレッシュ・ルームでレイチェルにコーヒーを渡し、船長の様子がおかしくなっているのがわかった後、レイチェルに続いてヒューイが部屋から飛び出して行った直後。
この場面では10秒待つとカトゥーと伍長も部屋から出ていくのだが、この10秒のカウントをマップタイマー00で行っている。

また、「通信ユニット」を受け取り伍長から別行動になってからも、マップタイマー00が動く。
これも10秒のカウントダウンタイマーで、このカウントが0になるたびに、伍長から通信が入る仕組み。
タイマーが始まるのは、以下の2パターン。

  1. 「通信ユニット」を受け取った直後(カウントダウン後、「私だ。 今どこにいる?~」という通信が来る)
  2. 最初の通信を受けた後、端末室で伍長と会話してから端末室を出た直後(カウントダウン後、「どうだ わかったか?~」という通信が来る)

「通信ユニット」を受け取ってから、ラストバトルが発生するリフレッシュ・ルームまで、最短距離をダッシュ移動でも10秒以上かかるので、1.は必ず発生する(はずである)。
2.のタイマーは何度でも動くが、通信が入るのは最初の一度だけ。

マップタイマー03は、キューブひとりだけでベヒーモスから逃げている最中、レベル3の通路で液体が吹き出る罠があるが、ここでは通路の上側のマスをキューブが踏んだタイミングでタイマーが開始になり、1.5秒(90フレーム)カウント後に液体が吹き出る仕組みになっている。
液体が吹き出ると、「マップタイマー関連フラグ値」のマップタイマー03に当たる箇所に%1が立つ。つまり[$7E:08C2]に$08が入るようになっているが、これは「罠が作動中にキューブが通路の上側のマスを再度踏んでも、同じタイマーを動かさないようにする」という処理のためと思われる。
この罠はラストバトルに勝利するまで何度でも発生する。

原始編

No.内容タイマー時間
00荒野・暗くなるまでのタイマー20秒

原始編は、荒野に追放された直後から動き、3段階で暗くなっていく時のタイマーの1個のみ使われているようである。
上のタイマーが3回使われ夜になると、「マップタイマー関連フラグ値」の[$7E:08C2]に$01が入り、タイマーは使われなくなる。

最終編

No.内容タイマー時間
00時のダンジョンの鐘13秒

時のダンジョンの鐘のカウントは、時のダンジョンに入ったタイミングで開始。
8回使われた直後にジャギィイエッグ戦のイベントが入り、ジャギィイエッグを倒した後は「マップタイマー関連フラグ値」の[$7E:08C2]に$01が入ってタイマーは使われなくなる。
また、タイマーが動いている時にダンジョンの外に出た時にも[$7E:08C2]に$01が入ってタイマーが止まり、再度中に入ると[$7E:08C2]に$00が入りタイマーがリセットされて動き出す。
最終編のタイマーはこの1個のみのようである。

次ページでは、マップタイマーのサブルーチンの紹介・説明を行う。



このページをシェアする

上へ