みんなに親切に、私は256色の時代からの古いゲームのカラーパレット、フォント、そして少しのDelphiについて話したいです。
以下に説明するクエストに関するクエストでは、約100時間を費やしました。
物語は方法についてです。

パレット
ウィキから:
コンピューターグラフィックスでは、パレットはコンピューターのグラフィックスシステムが表示できる限られた色のセットです。
N色はすべて広い色空間から選択され、その座標(通常:R、G、B)は特別なテーブル(パレット)に保存されます。 パレットを使用するラスターグラフィックスデータは、パレット内の色の数(インデックス)が格納される配列です。

自分から。 パレットは、768バイト(R、G、Bの3バイトの256インデックス)または1024バイト(4 * 256、RGBと予備)のファイルまたはデータブロックです。
通常、彼らは絵のグループのために別々にパレットを置きます、そして、ゲームの異なる部分のために異なるパレットがあるかもしれません。
画像には最大X、Y座標があり、サイズはX * Y、左上隅はゼロです。原点、フォントのXY値、これらの変数がデータストリームのどこかに格納されているかなど、ゲームごとに判断する必要があります。
フォント画像自体は、インデックスバイトのストリームで構成され、1バイトを読み取り、パレット配列から取得します。
R = buf_pal [インデックス* 3 + 0]
G = buf_pal [インデックス* 3 + 1]
B = buf_pal [インデックス* 3 + 2]
buf_palは、パレットファイルから読み取られたデータの配列です。
これまでのところ、ストライプ(RGB)で768バイトのストライプしか見ていません。
色がRGB-RGBではなく、たとえばBGR-BGRである場合があります。
画像が暗すぎる場合があり、R、G、Bごとに少し左に2シフトする必要があります(4の乗算)。
決定方法-目で見ると、すぐにノックダウンパレットが認識されます。

Delphiでは、RGB(r、g、b)関数を使用して色を取得できます。
Harvesterでは、パレットは非圧縮ファイルharv_cd \ GRAPHIC \ PAL \ INVHELP.PALにあります
素晴らしい、パレットでのクエストは完了です。 彼女を見つけ、彼女は隠されていません。 フォントの検索と研究に目を向けます。
フォント
フォントは、画像の開始点、シンボル画像へのポインタを持つテーブルです。 古いゲームでは、すべてのゲームが256文字のテーブルを使用していたことを受け入れることができますが、記憶にあるすべての種類のUnicodeは見つかりませんでした。
まず第一に、ゲームの主題の場合、テーブル全体を見る方法の手がかりが必要です-これはゲームプレイのヒントです、ゲームの最初のヒントフレーズはファイル\ harv_cd \ ADJHEAD.RCSに書かれています! 16進エディタですべてのコードを32から255まで、または必要なものだけを順番に駆動し、ゲームの標準フォントを表示できるものを確認します。


いいね! ウムラウトの数は、一組のロシア文字(小文字または大文字)で十分です。 良いニュースはすでに。
ここで、フォントデータが物理的にどこにあり、それらで何ができるかを見つける必要があります。
このゲームでは、これは簡単なタスクであり、HARVFNT2.CFT、HARVFONT.CFTなどの名前を持つフォントファイルです。 \ harv_cd \ GRAPHIC \ FONT \ディレクトリにあります。
GBSプログラムのファイル(old-games.ruのGraphBitStream)を調べ始めます。 これは、ヘッダーと文字の長方形の画像のデータ配列で構成されています。 多くの場合、フォントは1ビットですが、このゲームでは8ビットです。 各バイトはカラーインデックスであり、フォント画像のサイズは約800 x 12ピクセルです。
次のようになります。

TEXTFONT.CFTフォント文字シーケンス
0454hのファイルで始まる、幅6〜8、高さ〜12のフォント。 これはゼロの左上隅になり、行はX座標に沿って右に移動し、2行目は801バイトで始まります。


ファイルデータストリームでは、何かをフックし、ファイルのネタバレを開始し、キャラクターイメージの高さと幅のおおよその寸法を決定し、10-20-30バイトのグループでEEhのような同じバイトを書き込み、ゲームで何が起こるかを確認する必要があります。 フォントは256色で描画できることがわかりましたが、これは非常に珍しいことです。 すべてのフォントについて、データは0454hで始まることがわかりました。
次のようになりました。

この知識があれば、既存のウムラウトを再描画してロシア語の文字を取得することはすでに可能です。 マイナスはすぐに出てきます。 たとえば、各文字の幅は異なり、変更しない場合、文字の順序はばらばらになり、インデックストランスコーダを実行してテキストを挿入する必要があります。
フォントファイルのヘッダーを調べる必要がありました。次のようになりました。

次のことが判明しました。 一番下の行は次のとおりです。
各文字コードには256個の値のテーブルがあり、文字の幅と特定の文字のデータストリームの先頭へのポインタがリストされています。 一部のキャラクター、たとえば「@」にはゼロがありました。つまり、ゲームではこれは空の場所です。 目的の幅と、テーブル内のデータの先頭への必要なポインターを入力すると、ピクセルの色を考慮してデータを挿入できるようになりました。
素晴らしい、以前よりもはるかに良い。
Delphiにグラフィックエディターをアップロードし、フォントファイルのパーサーをアップロードし、最終的にプロトタイプを取得しました。

そして、フォント全体を再描画するオプション。 マウスの左ボタンは選択した色の鉛筆で、マウスの右ボタンは消しゴムです。 増やすことができ、パレットから色を選択できます。

最初の実験:


そして結果:

同様に、残りのフォントを6個だけ再描画しました。
CP1251、フォントArialから取得したコード。
フォントを使用したクエストは終了しました。結果とツールがあります。
テキストの検索に移ります。
テキスト
NPCとのダイアログのテキストは、ファイル\ harv_cd \ DIALOGUE.IDXに保存されます
ファイルは非常に面白いエンコードされています。 コード0Dh、0Ahがある場合、そのバイトをスキップします。そうでない場合は、xor 170を実行します。つまり、単純なxorエンコーディングがあります。 リソーステキストをpr索好きな目から隠すことができ、デコードにあまりお金をかけません。
この部分はフォーラムold-games.ruで見張られていました
ゲームにテキストを挿入しても問題はありません。cp1251のファイルはxorでエンコードされ、元のファイルに置き換えられます。
次に、ダイアログ内の質問がプレーンテキストで入力されるファイルDIALOG.RSPがあります。
次に、LOOK、TALKなど、harvest.exeファイルにいくつかのテキストがあります。 ちなみに、テキストテーブルを検索するデバッガーで.exeファイルを選択せずにフレーズの長さを増やすことはできません。 問題ナンバーワンが判明しました。
次に、xor'enom番号のHARVEST.SCRファイルに番号170がゲームのスクリプトです。
問題番号
w wa。 オブジェクトの説明のテキストが見つかりません。そこにはかなり広範囲にわたるはずです。
そして、彼は翻訳されたダイアログの段階で停止しました:

ヨーヨーテスト。



そしてデモビデオ: