0

古いゲームに機能を追加するプロジェクトに取り組んでいます。アイデアは、ウィンドウ表示で実行するオプションを追加することです (元は 800x600 フルスクリーンのみをサポートしています)。

これまでのところ、directDraw の初期化を変更してフルスクリーン排他モードを削除し、GDI で動作できるようにし、クリッパーを作成し、すべてを適切に設定しました。ポイントは、ゲームがフルスクリーン モードを 8 ビットの色深度に設定し、ウィンドウ表示で実行すると、出力が発生することです。この画像のようなゴミ:

ウィンドウ化されたゲーム出力

これまでのところ、問題を回避するために GetDIBits と SetDIBits を使用していくつかのトリックを試みましたが、成功しませんでした。

ゲームは非常に古いバージョンの directDraw で動作します (このバージョンに関するドキュメントはまったくありません。私の作業のほとんどは推測とテストに基づいています)。

このゲームは、BltFast を使用して画面に情報を取得します。

これは、DIBits を使用して問題を修正するために作成されたコードの一部です。

PrimarySurface = ゲームのプライマリ サーフェス自体

patch_1:
  ; Blt interface
  CALL DWORD [EDX+1Ch] ;<--- Surface->BltFast() Outputs game screen, params pushed to stack elsewhere

  pushad

  ; Get diBits and transform it properly to display
  push surfaceDC
  mov eax, [PrimarySurface]
  mov edx, [eax]
  push eax
  call dword [edx+44h] ; Surface->GetDC(&surfaceDC)
  test eax, eax
  je patch_1_abort
    invoke FindWindowA, 0, 'Rising Lands'
    mov [windowHandle], eax
    invoke GetDC, eax
    mov [windowDC], eax
    invoke CreateCompatibleDC, [surfaceDC]
    mov [compatibleDC], eax
    invoke CreateCompatibleDC, [windowDC]
    mov [compatibleWindowDC], eax
    invoke CreateCompatibleBitmap, [windowDC], 800, 600
    mov [zbitmap], eax

    ; Get screen header
    invoke GetDIBits, [compatibleWindowDC], [zbitmap], 0, 0, 0, bitmapHeader, 0

    ; Get game screen data
    invoke GetDIBits, [compatibleDC], [zbitmap], 0, 600, bbuffer, bitmapHeader, 0

    ; Copy content back to screen
    invoke SetDIBits, [compatibleWindowDC], [zbitmap], 0, 600, bbuffer, bitmapHeader, 0

    ; Release
    push [surfaceDC]
    mov eax, [PrimarySurface]
    mov edx, [eax]
    push eax
    call dword [edx+68h]

  patch_1_abort:
  popad

  ; Original code finalization
  MOV EDX,EAX
  TEST EAX, EAX
  jmp [p1r]

  surfaceDC dd 0
  windowHandle dd 0
  windowDC dd 0
  compatibleDC dd 0
  compatibleWindowDC dd 0
  zbitmap dd 0


  bitmapInfo dd bitmapHeader
  dd 0

  bitmapHeader:
  hSize dd endHeader - bitmapHeader
  hWidth dd 0;800
  hHeight dd 0;600
  hPlanes dw 0;1
  hBitCount dw 0;32
  hCompression dd 0
  hSizeImage dd 0
  hxPPm dd 0
  hyPPm dd 0
  hClrUsed dd 0
  hClrImp dd 0
  endHeader:

  bbuffer rb 800*600*10 

BltFast への呼び出しを変更して画面に正しく出力することで、8 ビット カラー フォーマットをバッファから直接変換する方法はありますか?

出力を別の DC に再ルーティングしてから、GetDIBits/SetDIBits を使用してイメージを修正する方が良い解決策ですか?

4

2 に答える 2