通信テキスト関連


説明
初代:文字一覧 / 通信一覧
PP:文字一覧 / 通信一覧
MA:文字一覧 / 通信一覧


ここではPSACの通信テキストについて調べたことを適当にまとめてます。これが戦術やアセンに役立つかというと全ッ然無関係なのでネタとして読み流してください。テキストを改造して遊ぼうとかそういった使い方をするならある程度は参考になるかも?そんな感じの内容です。いつものように作りかけの中途半端なところで公開。


PPのメモリ上にある先頭のテキストの

【スミカ】
ここから二手に分かれて
試験場を挟撃します

を例に解説。なんでPPを使ったかというとPPの最初のミッション「強行索敵」では2種類の通信が交互に流れ続けるので「この辺かなぁ?」と思ったメモリをまとめて改造してテキスト表示が変化しないか確認するにはうってつけだったため。

先頭アドレスとなる1F43C9から8ビット値の文字列が数文字分続き、末尾は半角スペースで終わる。この場合は”4D 33 58 30 4E 30 20”となるため、”M3X0N0 ”となる。とりあえずここで使われる半角スペースと数字とアルファベットの大文字のみの表を以下に。

文字 文字
20 半角
スペース
49 I
30 0 4A J
31 1 4B K
32 2 4C L
33 3 4D M
34 4 4E N
35 5 4F O
36 6 50 P
37 7 51 Q
38 8 52 R
39 9 53 S
41 A 54 T
42 B 55 U
43 C 56 V
44 D 57 W
45 E 58 X
46 F 59 Y
47 G 5A Z
48 H - -

この”M3X0N0 ”のような文字列が音声の指定となる。この文字列がどんな形式で音声を指定しているかは不明。とりあえず対応した別の文字列に書き換えることで別の音声を再生させることが出来たことは確認。対応する音声が無い場合は無音。ちなみにBGMが鳴っている最中に効果音ではないストリーミングの音声を鳴らした場合は音声再生時にBGMが止まり、音声再生後もBGMは復帰しない。

音声指定の末尾のスペースの直後には”43 30 32”という値が続き、文字列としては”C02”になる。まず”C(0x43)”に関しては以降の文字の中央寄せの効果がある。Cによる中央寄せはPPからで初代には無い。Cの仕様はPPとMAで違うのか、改行で途切れるので次の行頭でまた指定し直したり、改行後なのに指定無しで中央寄せになっていたりとなんかよくわからんです。見た感じでは3行目以降は2行目の設定を引き継ぐとかかなぁ?


その次の”3032”に関しては以降の文字を文字の色を黄色にする効果があり、ほぼ全ての通信は先頭に黄色い文字で表示される通信元があるため、こうなっているみたい。

テキストはPS本体のフォントを使っているメニューモードとは異なり、専用のフォントを使用している。戦闘中に表示される文字は以下のような1枚の画像に収められている。

この画像の中には別のパレットでもう1枚、別の文字群が入っている。1枚目の画像で使われているパレットを変えると以下の画像のような隠れていた文字が見えてくる。ファミコンのドラ〇エ1とかでもやっていた手法だっけ?

もう1枚の画像の文字の一覧はこんな感じ。何回かに分けて文字を追加してきたのか、記号・数字・アルファベット・ひらがな・カタカナ・漢字の順番で並んでいる塊が複数個あるような状態になっている。ちなみにPPでは697文字。ひらがな、カタカナは全て揃っていなかったり、数字は数字の8が無かったり、アルファベットは極一部しか無かったりする。

これらの文字は文字コードではなく、8ビット値×2で構成されている(PS1のCPUはリトルエンディアンなので16ビット値の並び方とは異なる)。

最初の8ビット値でセット番号、次の2バイトで何文字目かを指定する、といった形式。↑の画像では1行に21文字並んでいるけど、各セット辺り0x00から0xFFまでで256文字となる。ただし、そのうちの後半の値(0x80〜0xFF)は次のセットの前半の値(0x00〜0x7F)と重複している。ただ、実際には0x00〜0x7Fの方は使われていないっぽい(最初は文字一覧表に載せてたけど、使ってなさそうなので削除)。この一覧には無い半角文字に関しては後述。


文字以外には前述したような文字色の指定があり、これも8ビット値×2で指定する。

文字色 表記
3030 暗緑 -
3031 黄緑 <green>
3032 黄色 <yellow>
3033 <red>
3034 暗緑 -
3035 -

文字色の種類は少なく、限られた色から選択する形式で任意の色を使うことは出来ない。これ以外の値は↑のリストの色をループしたりテキスト表示がおかしくなるだけ。また、実際に使われるのは黄緑(通信内容)、黄色(通信元)、赤(キーワード)の3種類のみ。

文字色以外には改行があり、これは8ビット値×1だけで指定される。

効果 表記
0A 改行 <LF>

例として挙げた

【スミカ】
ここから二手に分かれて
試験場を挟撃します

は、実際には

<center><yellow>【スミカ】<LF>
<center><green>ここから二手に分かれて<LF>
<center>試験場を挟撃します<NL>

というように構成されている。

通信テキストは”00(NUL)”が終端となり、次のアドレスから次の通信の音声指定が始まる。


通信テキストが終わるとミッション放棄時の「ミッションを放棄しますか?YES:〇 NO:×」というメッセージ、以降は頭部COMの音声テキストが続く。頭部COMは使用中の頭部COMの種類のものだけ読み込まれる。頭部COMのテキストでは半角文字も使用される。

例えば

       
  COM : メインシステム  
    戦闘モードを起動します  
       

は、実際には

COM<SP>:<SP>メインシステム<LF>
<SP><SP><SP><SP><SP><SP>戦闘モードを起動します<NL>

というように構成されている。”COM : ”は半角文字6文字なので2行目は位置合わせのために半角スペースを6個置いてからテキストを配置している。


少し順番が入れ替わるけど、初代の通信テキストでは文字色の変更が無く、センタリングも無いため、頭部COMのように半角スペースを使ってテキストの位置調整を行っている。

例えば

       
  通信 : レ、レイヴンか!!  
    目標はこの奥だ! 頼んだぞ!  
       

は、実際には

通信<SP>:<SP>レ、レイヴンか!!<LF>
<SP><SP><SP><SP><SP><SP><SP>目標はこの奥だ!<SP>頼んだぞ!<NL>

というように構成されている。こちらは”通信 : ”で全角2文字+半角3文字で半角7文字分となるため、2行目以降には半角スペースが7個置かれている。


ASCII文字ではC以外にWが特殊な用途で使われている。Wの後ろに半角数字で10進数の値を付けるとその値のフレーム数だけ次の文字を表示せずに待機する。

例えば

『5・4・3・2・1』

は、実際には

『5[w11]・[w11]4[w11]・[w11]3[w11]・[w11]2[w11]・[w11]1』<NL>

というように構成されている(見やすくするため、[W11]のようにWと数字部分は[ ]で挟んで表記。通信一覧でもこうしてます)。W11で11フレーム待機。PSACは22フレーム/秒なので0.5秒の待機となる。0.5秒おきに・と数字を表示するため、このカウントダウンはちゃんとタイミングが合った状態で表示される。

間違えてW以外を指定した時にも変な効果があったけど(Fだとそこで一度通信ウィンドウが閉じる演出が入る)、実際には使われていないので詳細は調べてないです。


半角文字は8ビット値×1だけで指定。

ミッション放棄メッセージでは文字一覧の画像とは別の画像にある〇ボタンと×ボタンを8ビット値×2で指定して表示している。使用するのは以下の画像。

余談になるけど、↑の画像も複数のパレットを使用することで複数の画像を1枚に収めている。他の画像は以下の3種類。

このうちの最初の画像の〇×ボタンが使われている。こちらの画像にも半角文字があり、戦闘中に表示されるシステムメッセージ(対戦中に通信エラーが出た時のSYSTEM ERRORやポリゴン表示オーバーの!!!WARNING PRIM OVER!!!など)はこちらを使用しているのかもしれない(通常の半角文字でエラーメッセージの文字列の一部を検索したけどそれっぽいアドレスを見つけられなかったため)。これを見つけられると戦闘中に通信とは別に任意の文字を表示出来そうな気もするんだけど、よくわからんです。


・おまけ

テキスト一覧に「bytes」という項目があるけど、これはコピーコードを使って既存の通信と任意の通信を置き換える場合にあると便利なため。

使い方としては

C2XXXXXX ZZZZ (コピー先)
80YYYYYY 0000 (コピー元)

のように2つのコードを並べて使用する。コピー先のC2コードを先に、コピー元の80コードを次に書く。

コピー先のC2コードのXXXXXX部分にはコピー先の先頭アドレスを入力。ZZZZはコピー元から何bytes分のデータを書き込むか指定。テキスト一覧に書いたbytesの値を入力する。

コピー元の80コードのYYYYYY部分にはコピー元の先頭アドレスを入力。値は0000にする必要がある。

これだと分かりにくいと思うので、実際の使用例として開けられないゲートを調べた時のコードを載せておきます。

初代 PP MA
#DETAILED
C21EF673 ZZZZ
80YYYYYY 0000
#DETAILED
C21F6560 ZZZZ
80YYYYYY 0000
#DETAILED
C20B09BB ZZZZ
80YYYYYY 0000
#STANDARD
C21EF659 ZZZZ
80YYYYYY 0000
#STANDARD
C21F6546 ZZZZ
80YYYYYY 0000
#STANDARD
C20B092D ZZZZ
80YYYYYY 0000
#ROUGH
C21EF63D ZZZZ
80YYYYYY 0000
#ROUGH
C21F6544 ZZZZ
80YYYYYY 0000
#ROUGH
C20B08FC ZZZZ
80YYYYYY 0000

↑の表のYYYYYYにテキスト一覧から表示したいテキストの先頭アドレスを(MAの場合は5桁なので先頭に0を入れて6桁にすること)、ZZZZにそのテキストのbytesの値を入力する。

例えば初代で

       
  通信 : 見ての通り説得は失敗だ  
    我々は撤退する  
    後の処理は頼む  
       

というテキストをDETAILEDの頭でゲートを開けられない時のテキストの代わりに表示する場合は、

C21EF673 004F
801EDD9F 0000

というコードになる。

コピーコードを使わない場合は書き換えたい通信の先頭アドレスから30コードや80コードで音声指定の文字列やテキスト内容をチマチマと変えて最後にNULを置けばOK。

現状は好きなテキストを好きなタイミングで表示する方法がわからないのでこんなものになりました。00ならこのテキスト、01ならこのテキスト…というようなアドレスがあると思ったんだけど、見つからないんだよねぇ…。


戻る