トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

BBS-StudyNote/4

BBS-StudyNote4

スクリプトの文字化け(5c文字) - geshi (2005年05月05日 22時09分47秒)

前書き
この学習ノートは微妙な位置づけなんですよねー。掲示板とかぶった感じだし、消そうかとも考えてました。
一応当初の狙いとしては、「雑談に近いかもしれないBBS」と「ある程度調べてまとめたものを公開する学習ノート」という感じです。
たとえばサイトを持っていない人の発表の場とかBBSでわかったことのまとめとか、そんな感じ。
だからページを新規作成ではなく(Wikiの新規ページ作成はちょっとわかりにくい)、テキスト・フィールドに(コピペなどで放り込むように)書き込めばページができるようにしています。
もっとも「お砂場」がいつの間にか出来てて <私が作ったものではない(w)、あっちでまとめるのもありかなーと思ったんですが、書き込みするのはこっちの学習ノートの方が楽だと思います。
そんなわけで、皆さんもご自由にどんどん使ってください!

スクリプトの文字化けについて(5c文字)

スクリプトのコンパイル時に5c文字と呼ばれる特定の文字が化けてしまいます。
化ける文字についてはこちらを参照
しかしNWNではこれら文字の後ろに「\」を付け足しても化けたままになっています。

対策2:「\」をストリング外で補完(fayさんに感謝)

string s5c = GetSubString(GetStringByStrRef(2636), 43, 1);

s5cとなっているものを
Dialog.tlkの2636:「ファイル名には以下の文字は使用できません:.\\/:*?\\"<>|」
の43番目の文字「\」から1文字追加する
ということですね


5c文字の後ろに「" + s5c + "」

の2つを追加することによって実現します。

void main()

{

object oPC = GetEnteringObject();

string s5c = GetSubString(GetStringByStrRef(2636), 43, 1); //この一行を追加

if (!GetIsPC(oPC)) return;

int DoOnce = GetLocalInt(oPC, GetTag(OBJECT_SELF));

if (DoOnce==TRUE) return;

SetLocalInt(oPC, GetTag(OBJECT_SELF), TRUE);

FloatingTextStringOnCreature("噂" + s5c + "を聞いたわ", oPC); //5c文字の後にs5cを追加

}

スクリプトを書くときに5c文字を意識しない方法として、コンパイル前に「" + s5c + "」をテキスト置換によって5c文字に追加します。

私はテキスト置換にRepl-Aceを使いました(http://www.sirmiles.com/software/repl_ace.htm)。
このソフトは指定フォルダにある複数のファイルを一括処理することができます。また、置換する組み合わせも保存することが出来ます。

まず、スクリプトを書きます。このときは5c文字も何も気にしないで、普通に書きます。
ツールセットでモジュールを開いた状態で(module\temp0に中身が展開されている状態で)Repl-Aceを使います。

1:探索ディレクトリはモジュールが展開されているフォルダ(module\temp0)を指定します。
2:探索ファイル名は*.nssでスクリプトファイルを全て指定して、探索開始。
3:置換計画でNWN用5c文字.RPLを選びます。
NWN用5c文字.zip(116)
(このファイルの中身をRepl-Aceのplansフォルダに入れてください)
4:一括実行すると、処理対象ファイル一覧に対して置換計画にあるもの全てが実行されます。

この後コンパイルするとゲーム内で5c文字が正常表示されるようになってます。

対策1:バイナリ編集

コンパイルしたスクリプト自体をバイナリ編集して無理矢理直すことができます。

今回のサンプル・モジュールです。
5c.zip(118)
ツールセットでモジュールを開くと、moduleフォルダの下にtemp0というフォルダ(たぶん)が作られて、モジュールの中身が全部一時的に展開されます。
このフォルダ内にある.ncsを編集します。

それでは今回の方法を説明開始ー。

スクリプトのコンパイルは最後に一括でやるので、「オプション」の「一般」にある「セーブ時にモジュールのビルドを実行する」と「スクリプト・エディタ」の「セーブ時にスクリプトをコンパイルする」のチェックをはずします。
スクリプトのコンパイル自体はツールセットからではなく、PRC Neverwinter Script Compilerを使いました。
ま、ツールセットのコンパイラを使っても問題はないと思いますが、これは外部プログラムで処理が早いらしいです。

それからスクリプトを書きます。

Temp0フォルダの中に〜.nssファイルが増えていくはず。
(スクリプトをいじるときに、重いスクリプト・エディタを使うんじゃなくて、ここにあるファイルを修正すれば早かったのかと今気がついた...)

今回使用した文字列を参考にすると

元々の文字化けする状態

FloatingTextStringOnCreature("5c文字はスクリプトのコンパイラに問題があり。「噂を聞いたわ。この私を欺くなんて。ソンナことが可能だなんてわけないでしょ。その位のことは蚕程度にも十分予見できるんじゃない?ま、とりあえず皮を剥いで表に貼り付けることにするわ。暴れても構わないわよ(ひひひ」", oPC);

後でバイナリ編集するために「@」等を使って削られてしまう1バイト分を補完 (ここが重要)。

FloatingTextStringOnCreature("5c文字はスクリプトのコンパイラに問題があり。「噂@を聞いたわ。この私を欺@くなんて。ソ@ンナことが可能@だなんてわけないでしょ。その位のことは蚕@程度にも十@分予@見できるんじゃない?ま、とりあえず皮を剥いで表@に貼@り付けることにするわ。暴@れても構@わないわよ(ひひひ」", oPC);

これをPRCコンパイラを使ってコンパイルします。

一番楽なのがTemp0フォルダにnwnnsscomp.exeをコピーして、コマンドプロンプトから

nwnnsscomp.exe -c *.nss

でやると、全部コンパイルしてくれます。
ただしこの状態ではまだ文字化けしたままです(からコンパイラを対応させることができたら何とかなるんじゃないのかなーと思う。プログラムのことは何もわからんけど)。

次に文字化けを起こしている.nssファイルをバイナリエディタで修正します。

文字化けを起こしている状態です。

「欺」は「8B5C」ですが「5c」が削られて、1バイトぶん前に詰まっています。この状態からは修正できません。

修正後のものです。

.nssで書いたスクリプトで、「@」などを使って削られる1バイト分を補完しておきます。
この状態ならバイナリ編集しても大丈夫です。

最後にツールセットでセーブします。

流れをもう一度説明すると、

  1. ツールセットでモジュールを開く
  2. スクリプトを書く
  3. nwnnsscomp.exeでコンパイル
  4. コンパイル済.ncsファイルをバイナリ編集
  5. ツールセットでセーブ

となります。

  • 目視で足すなら static で

string s5c = GetSubString(GetStringByStrRef(2636), 43, 1);

としておいて、@を足した箇所で「" + s5c + "」とした方が楽かと・・・。

FloatingTextStringOnCreature("5c文字はスクリプトのコンパイラに問題があり。「噂" + s5c + "を聞いたわ。この私を欺" + s5c + "くなんて。ソ" + s5c + "ンナことが可能" + s5c + "だなんてわけないでしょ。その位のことは蚕" + s5c + "程度にも十" + s5c + "分予" + s5c + "見できるんじゃない?ま、とりあえず皮を剥いで表" + s5c + "に貼" + s5c + "り付けることにするわ。暴" + s5c + "れても構" + s5c + "わないわよ(ひひひ」", oPC); - fay (2005年05月09日 18時17分52秒)

  • ちなみにテキスト置換を使って

検索する文字列:\
置換後の文字列:\" + s5c + "
置換→全て上書きにチェック

として置換すると、文字を識別する必要もありません。

#ここに書いちゃって良かったのかな・・・諸事情で匿名だし。 - fay (2005年05月09日 18時23分26秒)

  • ほうほう……

String内部で”〜ソ\〜”という形ではなくて、ストリングの外に5Cを置いて補完してやればいいのか……

- Dsss (2005年05月09日 21時33分03秒)
  • うぉぉ、すげぇ!

これは解決策になりますね。
テキスト置換というのは「\」を5c文字の後ろに追加しておくということですよね? - geshi (2005年05月09日 22時42分44秒)

  • ご提示のリンク先の最後の解決策をやってるだけです。>geshiさん

ただ、NWNコンパイラが馬鹿なので、「\\」としても解決されず、コンパイラを通さないで「\」文字を作ってやらなければならない。
そこでResRef文字の2636番「ファイル名には以下の文字は使用できません:.\\/:*?\\"<>|」の43バイト目を使っているわけです。>Dsssさん

#日本語版専用な解決策・・・(汗 - fay (2005年05月10日 00時48分31秒)

  • 関係ないけど、俺もRepl-Ace仕事で使ってる。 - Bowen (2005年05月10日 01時45分46秒)
  • ああ、対策2が追加されてるのに気がつかなかった・・・。orz<前コメント。失礼しちゃったかなぁ。

ちなみに置換は普通にツールセットのスクリプトエディタの「置換」でいけますよー。 - fay (2005年05月10日 02時24分16秒)

  • ああ、そういえばスクリプトエディタにも置換があったんだ(w - geshi (2005年05月10日 08時49分56秒)
  • そうか、そうだったのか...

1.スクリプトエディタだと日本語表示が出来ない
2.日本語が化けて「\」が表示されてる
3.「\」を「\" + s5c + "」に置換
ということで、ツールセットの欠点を逆手に取った方法だったのか! - geshi (2005年05月11日 23時00分44秒)

  • ずいぶんと遅レスになりますが、

この技術はNWNX2(APS)の「半角チルダ(~)がらみの文字化け」にも応用できます。
またNWNX2のもう一つの問題「半角ヤ(0xac)がらみの文字化け」は、この手法では回避できませんが、
別の手法として GetPersistentString() を改造する事で、これもまた回避できます。
必要な方がいらっしゃれば情報を提供しようと思いますが・・・
・・・NWNX2自体が利用されてないような感じなので出すぎたマネかもしれませんね。(苦笑 - fay (2005年09月26日 18時01分43秒)

ブランド激安市場 (ルイ ヴィトン直営店) 特価活動開催中

09年人気の商品を超えて、当店が売買する中.

すべての商品はすべて新しく着きます.

すべての商品の品質がすべて検査するのが合格です.

みんなを歓迎して選り取りで買います.

当店の誠実と信用は取引して、品質は至上です.

みんなを頼んで、安心して買います.

みんなに感謝して、当店に対する支持と信頼.

■当社の唯一URL: http://www.go-vuitton.com/
店&#38271;名:飯田 正樹
■連絡先:bestvuitton@188.com OR vuitton@188.com - 飯田 正樹 (2009年05月04日 18時56分41秒)

commentプラグインは存在しません。