Opened 10 months ago

Last modified 2 days ago

#15049 new feature request

FREESCAPE: DOS/CGA render mode need work

Reported by: neuromancer Owned by: neuromancer
Priority: normal Component: Engine: Freescape
Version: Keywords:
Cc: Game:

Description

The DOS/CGA rendering mode in Freescape games need a good amount of work to match their original implementations. A few important points:

  • The palette selection is made manually using an C++ array, while it is likely to be contained in some table in the executables.
  • Flashing colors are not correct, the information should be there, but it is unclear where.

Attachments (1)

scummvm-darkside-00001.png (47.8 KB ) - added by neuromancer 3 months ago.

Download all attachments as: .zip

Change History (8)

comment:1 by shdon, 3 months ago

The palette selection is made using a very basic check. From disassembling the DRILLC.EXE, I find this code:

mov ah, 0B
mov bx, 0100
test byte ptr ds:[1E5F], 01
jne $+1
inc bx
int 10

This is a call to INT 10h AH=0B BH=01 which selects the palette according to what is in BL (if BL=0 it sets black/green/red/brown, if BL=1 it sets black/cyan/magenta/grey). The determining factor is whether the byte at offset [1E5F] is odd or even. For even values, palette 1 is used; for odd values, palette 0 is used. The byte at offset [1E5F] is the room ID. So basically, rooms with an odd room ID use red/green/brown and rooms with an even room ID use cyan/magenta/grey.

by neuromancer, 3 months ago

Attachment: scummvm-darkside-00001.png added

comment:2 by neuromancer, 3 months ago

Thanks a lot for the missing information. One additional anomaly that I noted is related with the color of the objects. In Dark Side, the expected palette will not match the original implementation. This is an screenshot of the first level:

https://cdn.mobygames.com/screenshots/3527727-dark-side-dos-in-game-cga.png

I have attached a screenshot of same view in ScummVM. You can see some objects have different colors. It is unclear where is the issue, but it could be related with some bug in fillColorPairArray.

comment:3 by shdon, 3 months ago

That is because of the hardcoded stipple patterns. Freescape defines its own dither patterns with their colour selections in the palette section of the database header (the same part that remaps the EGA and Tandy palettes). In Driller, some are checkerboards, some are staggered, and one of them is in the shape of a letter Y.

comment:4 by neuromancer, 3 months ago

Just to clarify, stipple patterns should be already supported, but the code could have some issues. For instance, for Dark Side (CGA), we have:

Color map:
0
0
0
0
---
ff
ff
ff
ff
---
aa
aa
aa
aa
---
55
55
55
55
---
22
88
22
88
---
33
cc
33
cc
---
11
44
11
44
---
bb
ee
bb
ee
---
99
66
99
66
---
dd
77
dd
77
---
88
22
88
22
---
cc
33
cc
33
---
ee
bb
ee
bb
---
44
11
44
11
---
fe
fe
fe
fe
---

They are loaded here: https://github.com/scummvm/scummvm/blob/master/engines/freescape/loaders/8bitBinaryLoader.cpp#L806-L827

and then they are parsed into pixel patterns here: https://github.com/scummvm/scummvm/blob/master/engines/freescape/gfx.cpp#L137-L231. But it is unclear why the rendering fails to match

comment:5 by neuromancer, 2 months ago

Type: defectfeature request

comment:6 by neuromancer, 3 days ago

Good news!:

  • It seems other CGA versions of the games (at least, Dark Side and Total Eclipse), have the same code discovered by shdon.

This means that the path is clear to have a decent support for CGA games. Besides finishing with the tasks in this ticket, the UI need to be fixed since there a number of hard-coded colors that need to fixed.

comment:7 by neuromancer, 2 days ago

Finally, palette selection looks good in Driller and Dark Side after this commit: https://github.com/scummvm/scummvm/commit/bc94b85391718d81c9f6f9eb2a0fdb931e010b3c

However, it seems that the same approach will not work to Total Eclipse (TOTEC.EXE), as it seems to be doing something different that needs to be investigated.

Note: See TracTickets for help on using tickets.