[Scummvm-git-logs] scummvm master -> 15602e77c7ac729667fff4d440e15e7f490e9edd
sev-
noreply at scummvm.org
Wed Apr 24 22:42:40 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
15602e77c7 CHAMBERS: Refactor code for HGA compatibility
Commit: 15602e77c7ac729667fff4d440e15e7f490e9edd
https://github.com/scummvm/scummvm/commit/15602e77c7ac729667fff4d440e15e7f490e9edd
Author: yigithanyigit (yigit at Yigithans-MacBook-Pro.local)
Date: 2024-04-25T00:42:36+02:00
Commit Message:
CHAMBERS: Refactor code for HGA compatibility
Refactor the existing CGA rendering code to make it compatible with HGA rendering. The main changes include the introduction of engine variables and a move away from macros.
Changed paths:
engines/chamber/anim.cpp
engines/chamber/bkbuff.cpp
engines/chamber/cga.cpp
engines/chamber/cga.h
engines/chamber/chamber.cpp
engines/chamber/chamber.h
engines/chamber/cursor.cpp
engines/chamber/dialog.cpp
engines/chamber/input.cpp
engines/chamber/invent.cpp
engines/chamber/kult.cpp
engines/chamber/portrait.cpp
engines/chamber/print.cpp
engines/chamber/room.cpp
engines/chamber/script.cpp
diff --git a/engines/chamber/anim.cpp b/engines/chamber/anim.cpp
index 54d050e25c6..5c249123656 100644
--- a/engines/chamber/anim.cpp
+++ b/engines/chamber/anim.cpp
@@ -132,7 +132,7 @@ void copyScreenBlockWithDotEffect(byte *source, byte x, byte y, byte width, byte
void animDrawSprite(byte x, byte y, byte sprw, byte sprh, byte *pixels, uint16 pitch) {
uint16 delay;
byte ex, ey, updx, updy, updw, updh;
- uint16 ofs = cga_CalcXY_p(x, y);
+ uint16 ofs = CalcXY_p(x, y);
cga_BackupImage(backbuffer, ofs, sprw, sprh, sprit_load_buffer);
cga_BlitSprite(pixels, pitch, sprw, sprh, backbuffer, ofs);
ex = x + sprw;
@@ -152,7 +152,7 @@ void animDrawSprite(byte x, byte y, byte sprw, byte sprh, byte *pixels, uint16 p
}
updw = ex - updx;
updh = ey - updy;
- ofs = cga_CalcXY_p(updx, updy);
+ ofs = CalcXY_p(updx, updy);
/*TODO looks like here was some code before*/
for (delay = 0; delay < anim_draw_delay; delay++) {
g_system->delayMillis(1000 / 16 / 25);
@@ -175,7 +175,7 @@ void animDrawSprite(byte x, byte y, byte sprw, byte sprh, byte *pixels, uint16 p
}
void animUndrawSprite(void) {
- cga_CopyScreenBlock(backbuffer, last_anim_width, last_anim_height, CGA_SCREENBUFFER, cga_CalcXY_p(last_anim_x, last_anim_y));
+ cga_CopyScreenBlock(backbuffer, last_anim_width, last_anim_height, CGA_SCREENBUFFER, CalcXY_p(last_anim_x, last_anim_y));
last_anim_height = 0;
}
diff --git a/engines/chamber/bkbuff.cpp b/engines/chamber/bkbuff.cpp
index db6b7057b97..2b44edbf0c3 100644
--- a/engines/chamber/bkbuff.cpp
+++ b/engines/chamber/bkbuff.cpp
@@ -24,7 +24,7 @@
namespace Chamber {
-byte backbuffer[0x4000];
+byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
} // End of namespace Chamber
diff --git a/engines/chamber/cga.cpp b/engines/chamber/cga.cpp
index 464662e0d5d..3d08b00320c 100644
--- a/engines/chamber/cga.cpp
+++ b/engines/chamber/cga.cpp
@@ -28,36 +28,9 @@
#include "chamber/resdata.h"
#include "chamber/cga.h"
-namespace Chamber {
+#include "common/debug.h"
-#if 0
-#define HGA_WIDTH 720
-#define HGA_HEIGHT 348
-#define HGA_BASE_SEG 0xB000
-#define HGA_PAGE2_SEG 0xB800
-#define HGA_NEXT_LINES_OFS 0x2000
-#define HGA_BITS_PER_PIXEL 1
-#define HGA_PIXELS_PER_BYTE (8 / HGA_BITS_PER_PIXEL)
-#define HGA_BYTES_PER_LINE (HGA_WIDTH / HGA_PIXELS_PER_BYTE)
-#define HGA_CALCXY_RAW(x, y) ( ((y) % 4) * HGA_NEXT_LINES_OFS + ((y) / 4) * HGA_BYTES_PER_LINE + (x) / HGA_PIXELS_PER_BYTE )
-#define HGA_CENTERED_BASE_OFS HGA_CALCXY_RAW(32, 76)
-#ifdef __386__
-#define HGA_SCREENBUFFER ((byte*)(HGA_BASE_SEG * 16))
-#define HGA_BACKBUFFER ((byte*)(HGA_PAGE2_SEG * 16))
-#else
-#define HGA_SCREENBUFFER ((byte*)MK_FP(HGA_BASE_SEG, 0))
-#define HGA_BACKBUFFER ((byte*)MK_FP(HGA_PAGE2_SEG, 0))
-#endif
-#define HGA_FONT_HEIGHT 6
-#define frontbuffer HGA_SCREENBUFFER
-#define backbuffer HGA_BACKBUFFER
-/* Calc screen offset from normal pixel coordinates
-Out:
- screen offset
-*/
-uint16 HGA_CalcXY(uint16 x, uint16 y) {
- return HGA_CalcXY_p(x / 4, y);
-}
+namespace Chamber {
/* Calc screen offset from packed pixel coordinates
Out:
@@ -79,11 +52,19 @@ uint16 HGA_CalcXY_p(uint16 x, uint16 y) {
#endif
return ofs;
}
-#endif
-extern byte backbuffer[0x4000];
-byte CGA_SCREENBUFFER[0x4000];
-byte scrbuffer[320*200];
+
+/* Calc screen offset from normal pixel coordinates
+Out:
+ screen offset
+*/
+uint16 HGA_CalcXY(uint16 x, uint16 y) {
+ return HGA_CalcXY_p(x / 4, y);
+}
+
+extern byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
+byte CGA_SCREENBUFFER[0xB800];
+byte scrbuffer[720*348]; ///< Screen buffer for blitting, it is intentionally left larger instead of dynamic memory allocation
extern byte *scratch_mem2;
@@ -166,44 +147,51 @@ void cga_ColorSelect(byte csel) {
void cga_blitToScreen(int16 dx, int16 dy, int16 w, int16 h) {
dx = dy = 0;
- w = 320; h = 200;
- // Align x by 4
- int16 align = dx & 0x3;
+ w = g_vm->_screenW; h = g_vm->_screenH;
+
+ int16 align = dx & (0x8 / g_vm->_screenBits - 1);
dx -= align;
w += align;
- if (dy + h >= 200)
- h = 200 - dy;
+ if (dy + h >= g_vm->_screenH)
+ h = g_vm->_screenH - dy;
- if (dx + w >= 320)
- w = 320 - dx;
+ if (dx + w >= g_vm->_screenW)
+ w = g_vm->_screenW - dx;
- w = (w + 3) / 4;
+ w = (w + (0x8 / g_vm->_screenBits - 1)) / (0x8 / g_vm->_screenBits);
for (int16 y = 0; y < h; y++) {
- byte *src = CGA_SCREENBUFFER + cga_CalcXY(dx, dy + y);
- byte *dst = scrbuffer + (y + dy) * 320 + dx;
+ byte *src = CGA_SCREENBUFFER + CalcXY(dx, dy + y);
+ byte *dst = scrbuffer + (y + dy) * g_vm->_screenW + dx;
for (int16 x = 0; x < w; x++) {
byte colors = *src++;
-
- for (int16 c = 0; c < 4; c++) {
- byte color = (colors & 0xC0) >> 6;
- colors <<= 2;
-
- *dst++ = color;
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+ for (int16 c = 0; c < 4; c++) {
+ byte color = (colors & 0xC0) >> 6;
+ colors <<= 2;
+ *dst++ = color;
+ }
+ } else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+ for (int16 c = 0; c < 8; c++) {
+ byte color = (colors & 0x80) >> 7;
+ colors <<= 1;
+ *dst++ = color;
+ }
}
}
}
- g_system->copyRectToScreen(scrbuffer + dy * 320 + dx, 320, dx, dy, w * 4, h);
+ g_system->copyRectToScreen(scrbuffer + dy * g_vm->_screenW + dx, g_vm->_screenW, dx, dy, w * (0x8 / g_vm->_screenBits), h);
g_system->updateScreen();
}
void cga_blitToScreen(int16 ofs, int16 w, int16 h) {
- int16 dy = ofs / 80;
- int16 dx = (ofs % 80) * 4;
+ uint16 byte_per_line = w / (0x8 / g_vm->_screenBits);
+ int16 dy = ofs / byte_per_line;
+ int16 dx = (ofs % byte_per_line) * (0x8 / g_vm->_screenBits);
cga_blitToScreen(dx, dy, w, h);
}
@@ -211,7 +199,7 @@ void cga_blitToScreen(int16 ofs, int16 w, int16 h) {
void cga_BackBufferToRealFull(void) {
memcpy(CGA_SCREENBUFFER, backbuffer, sizeof(backbuffer));
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
void cga_RealBufferToBackFull(void) {
@@ -225,13 +213,13 @@ void cga_CopyScreenBlock(byte *source, uint16 w, uint16 h, byte *target, uint16
uint16 oofs = ofs;
while (h--) {
memcpy(target + ofs, source + ofs, w);
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (target == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, oh);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
}
/*
@@ -249,7 +237,7 @@ void cga_SwapRealBackBuffer(void) {
*d++ = t;
}
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
@@ -266,13 +254,13 @@ void cga_SwapScreenRect(byte *pixels, uint16 w, uint16 h, byte *screen, uint16 o
*old++ = screen[ofs + i];
screen[ofs + i] = *pixels++;
}
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, oh);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
}
/*
@@ -281,7 +269,25 @@ Out:
screen offset
*/
uint16 cga_CalcXY(uint16 x, uint16 y) {
- return cga_CalcXY_p(x / 4, y);
+ return CalcXY_p(x / 4, y);
+}
+
+uint16 CalcXY(uint16 x, uint16 y) {
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA)
+ return cga_CalcXY(x, y);
+ else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG)
+ return HGA_CalcXY(x, y);
+ else
+ return 0;
+}
+
+uint16 CalcXY_p(uint16 x, uint16 y) {
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA)
+ return cga_CalcXY_p(x, y);
+ else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG)
+ return HGA_CalcXY_p(x, y);
+ else
+ return 0;
}
/*
@@ -292,8 +298,8 @@ Out:
uint16 cga_CalcXY_p(uint16 x, uint16 y) {
uint16 ofs = 0;
if (y & 1)
- ofs += CGA_ODD_LINES_OFS;
- ofs += CGA_BYTES_PER_LINE * (y / 2);
+ ofs += g_vm->_line_offset;
+ ofs += g_vm->_screenBPL * (y / 2);
ofs += x;
return ofs;
}
@@ -311,9 +317,9 @@ byte *cga_BackupImage(byte *screen, uint16 ofs, uint16 w, uint16 h, byte *buffer
while (h--) {
memcpy(buffer, screen + ofs, w);
buffer += w;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
return buffer;
}
@@ -332,13 +338,13 @@ void cga_Blit(byte *pixels, uint16 pw, uint16 w, uint16 h, byte *screen, uint16
for (int16 y = 0; y < h; y++) {
memcpy(screen + ofs, src, w);
src += pw;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, h);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), h);
}
/*
@@ -354,13 +360,13 @@ void cga_Fill(byte pixel, uint16 w, uint16 h, byte *screen, uint16 ofs) {
uint16 oofs = ofs;
for (int16 y = 0; y < h; y++) {
memset(screen + ofs, pixel, w);
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, h);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), h);
}
void cga_FillAndWait(byte pixel, uint16 w, uint16 h, byte *screen, uint16 ofs) {
@@ -416,21 +422,26 @@ NB! Line must not wrap around the edge
*/
void cga_DrawVLine(uint16 x, uint16 y, uint16 l, byte color, byte *target) {
uint16 ofs;
+ uint16 mask = 0;
/*pixels are starting from top bits of byte*/
- uint16 mask = static_cast<uint16>((~(3 << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL))) & 0xffff);
- byte pixel = color << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL);
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA){
+ mask = static_cast<uint16>((~(3 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+ } else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+ mask = static_cast<uint16>((~(1 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+ }
+ byte pixel = color << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB);
- mask >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
- pixel >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
+ mask >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
+ pixel >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
- ofs = cga_CalcXY_p(x / CGA_PIXELS_PER_BYTE, y);
+ ofs = CalcXY_p(x / g_vm->_screenPPB, y);
uint16 ol = l;
while (l--) {
target[ofs] = (target[ofs] & mask) | pixel;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (target == CGA_SCREENBUFFER)
@@ -443,23 +454,34 @@ NB! Line must not wrap around the edge
*/
void cga_DrawHLine(uint16 x, uint16 y, uint16 l, byte color, byte *target) {
uint16 ofs;
+ uint16 mask = 0;
/*pixels are starting from top bits of byte*/
- uint16 mask = static_cast<uint16>((~(3 << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL))) & 0xffff);
- byte pixel = color << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL);
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA){
+ mask = static_cast<uint16>((~(3 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+ } else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+ mask = static_cast<uint16>((~(1 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+ }
+
+ byte pixel = color << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB);
- mask >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
- pixel >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
+ mask >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
+ pixel >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
+
+ ofs = CalcXY_p(x / g_vm->_screenPPB, y);
- ofs = cga_CalcXY_p(x / CGA_PIXELS_PER_BYTE, y);
uint16 ol = l;
while (l--) {
target[ofs] = (target[ofs] & mask) | pixel;
- mask >>= CGA_BITS_PER_PIXEL;
- pixel >>= CGA_BITS_PER_PIXEL;
+ mask >>= g_vm->_screenPPB;
+ pixel >>= g_vm->_screenPPB;
if (mask == 0xFF) {
ofs++;
- mask = static_cast<uint16>((~(3 << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL))) & 0xffff);
- pixel = color << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL);
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA){
+ mask = static_cast<uint16>((~(3 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+ } else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+ mask = static_cast<uint16>((~(1 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+ }
+ pixel = color << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB);
}
}
if (target == CGA_SCREENBUFFER)
@@ -476,9 +498,9 @@ uint16 cga_DrawHLineWithEnds(uint16 bmask, uint16 bpix, byte color, uint16 l, by
memset(target + ofs + 1, color, l);
target[ofs + 1 + l] = (target[ofs + 1 + l] & (bmask & 255)) | (bpix & 255);
uint16 oofs = ofs;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
if (target == CGA_SCREENBUFFER)
cga_blitToScreen(oofs, l * 4 + 2, 1);
@@ -491,19 +513,19 @@ Print a character at current cursor pos, then advance
*/
void cga_PrintChar(byte c, byte *target) {
uint16 i;
- byte *font = carpc_data + c * CGA_FONT_HEIGHT;
- uint16 ofs = cga_CalcXY_p(char_draw_coords_x++, char_draw_coords_y);
- for (i = 0; i < CGA_FONT_HEIGHT; i++) {
+ byte *font = carpc_data + c * g_vm->_fontHeight;
+ uint16 ofs = cga_CalcXY_p(char_draw_coords_x++, char_draw_coords_y); // TODO: hga_calcxy_p doesnt work with this??
+ for (i = 0; i < g_vm->_fontHeight; i++) {
c = *font++;
c = char_xlat_table[c];
target[ofs] = c;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (target == CGA_SCREENBUFFER)
- cga_blitToScreen((char_draw_coords_x - 1) * 4, char_draw_coords_y, 4, CGA_FONT_HEIGHT);
+ cga_blitToScreen((char_draw_coords_x - 1) * g_vm->_fontWidth, char_draw_coords_y, g_vm->_fontWidth, g_vm->_fontHeight);
}
@@ -521,13 +543,13 @@ void cga_BlitScratchBackSprite(uint16 sprofs, uint16 w, uint16 h, byte *screen,
for (x = 0; x < w; x++)
screen[ofs + x] = (backbuffer[ofs + x] & pixels[x * 2]) | pixels[x * 2 + 1];
pixels += w * 2;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, oh);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
}
void cga_BlitFromBackBuffer(byte w, byte h, byte *screen, uint16 ofs) {
@@ -546,13 +568,13 @@ void cga_BlitSprite(byte *pixels, int16 pw, uint16 w, uint16 h, byte *screen, ui
for (x = 0; x < w; x++)
screen[ofs + x] = (screen[ofs + x] & pixels[x * 2]) | pixels[x * 2 + 1];
pixels += pw;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, oh);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
}
/*
@@ -567,13 +589,13 @@ void cga_BlitSpriteFlip(byte *pixels, int16 pw, uint16 w, uint16 h, byte *screen
for (x = 0; x < w; x++)
screen[ofs - x] = (screen[ofs - x] & cga_pixel_flip[pixels[x * 2]]) | cga_pixel_flip[pixels[x * 2 + 1]];
pixels += pw;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, oh);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
}
/*
@@ -594,13 +616,13 @@ void cga_BlitSpriteBak(byte *pixels, int16 pw, uint16 w, uint16 h, byte *screen,
screen[ofs + x] = (screen[ofs + x] & pixels[x * 2 + 1]) | (pixels[x * 2] & mask);
}
pixels += pw * 2;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER)
- cga_blitToScreen(oofs, w * 4, oh);
+ cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
}
@@ -734,7 +756,7 @@ void drawSpriteN(byte index, uint16 x, uint16 y, byte *target) {
uint16 ofs;
byte *sprite;
sprite = loadSprit(index);
- ofs = cga_CalcXY_p(x, y);
+ ofs = CalcXY_p(x, y);
drawSprite(sprite, target, ofs);
}
@@ -742,7 +764,7 @@ void drawSpriteNFlip(byte index, uint16 x, uint16 y, byte *target) {
uint16 ofs;
byte *sprite;
sprite = loadSprit(index);
- ofs = cga_CalcXY_p(x, y);
+ ofs = CalcXY_p(x, y);
drawSpriteFlip(sprite, target, ofs);
}
@@ -750,7 +772,7 @@ void backupAndShowSprite(byte index, byte x, byte y) {
byte w, h;
uint16 ofs;
byte *sprite = loadSprit(index);
- ofs = cga_CalcXY_p(x, y);
+ ofs = CalcXY_p(x, y);
w = sprite[0];
h = sprite[1];
cga_BackupImageReal(ofs, w, h);
@@ -824,9 +846,9 @@ void cga_HideScreenBlockLiftToDown(uint16 n, byte *screen, byte *source, uint16
sofs = ofs;
tofs = ofs;
- tofs ^= CGA_ODD_LINES_OFS;
- if ((tofs & CGA_ODD_LINES_OFS) == 0)
- tofs += CGA_BYTES_PER_LINE;
+ tofs ^= g_vm->_line_offset;
+ if ((tofs & g_vm->_line_offset) == 0)
+ tofs += g_vm->_screenBPL;
/*shift whole block 1 line*/
for (i = 0; i < h; i++) {
@@ -837,23 +859,23 @@ void cga_HideScreenBlockLiftToDown(uint16 n, byte *screen, byte *source, uint16
tofs = sofs;
/*go 1 line up*/
- sofs ^= CGA_ODD_LINES_OFS;
- if ((sofs & CGA_ODD_LINES_OFS) != 0)
- sofs -= CGA_BYTES_PER_LINE;
+ sofs ^= g_vm->_line_offset;
+ if ((sofs & g_vm->_line_offset) != 0)
+ sofs -= g_vm->_screenBPL;
}
/*fill just freed line with new pixels*/
memcpy(target + tofs, source + tofs, w);
if (screen == CGA_SCREENBUFFER) {
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenW);
}
waitVBlank();
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
}
@@ -869,9 +891,9 @@ void cga_HideScreenBlockLiftToUp(uint16 n, byte *screen, byte *source, uint16 w,
sofs = ofs;
tofs = ofs;
- tofs ^= CGA_ODD_LINES_OFS;
- if ((tofs & CGA_ODD_LINES_OFS) != 0)
- tofs -= CGA_BYTES_PER_LINE;
+ tofs ^= g_vm->_line_offset;
+ if ((tofs & g_vm->_line_offset) != 0)
+ tofs -= g_vm->_screenBPL;
/*shift whole block 1 line*/
for (i = 0; i < h; i++) {
@@ -882,23 +904,23 @@ void cga_HideScreenBlockLiftToUp(uint16 n, byte *screen, byte *source, uint16 w,
tofs = sofs;
/*go 1 line down*/
- sofs ^= CGA_ODD_LINES_OFS;
- if ((sofs & CGA_ODD_LINES_OFS) == 0)
- sofs += CGA_BYTES_PER_LINE;
+ sofs ^= g_vm->_line_offset;
+ if ((sofs & g_vm->_line_offset) == 0)
+ sofs += g_vm->_screenBPL;
}
/*fill just freed line with new pixels*/
memcpy(target + tofs, source + tofs, w);
if (screen == CGA_SCREENBUFFER) {
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
waitVBlank();
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
}
}
@@ -924,13 +946,13 @@ void cga_HideScreenBlockLiftToLeft(uint16 n, byte *screen, byte *source, uint16
memcpy(target + tofs + w, source + tofs + w, 1);
/*go 1 line down*/
- sofs ^= CGA_ODD_LINES_OFS;
- if ((sofs & CGA_ODD_LINES_OFS) == 0)
- sofs += CGA_BYTES_PER_LINE;
+ sofs ^= g_vm->_line_offset;
+ if ((sofs & g_vm->_line_offset) == 0)
+ sofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER) {
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
waitVBlank();
@@ -961,13 +983,13 @@ void cga_HideScreenBlockLiftToRight(uint16 n, byte *screen, byte *source, uint16
memcpy(target + tofs - w, source + tofs - w, 1);
/*go 1 line down*/
- sofs ^= CGA_ODD_LINES_OFS;
- if ((sofs & CGA_ODD_LINES_OFS) == 0)
- sofs += CGA_BYTES_PER_LINE;
+ sofs ^= g_vm->_line_offset;
+ if ((sofs & g_vm->_line_offset) == 0)
+ sofs += g_vm->_screenBPL;
}
if (screen == CGA_SCREENBUFFER) {
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
waitVBlank();
@@ -1017,19 +1039,19 @@ static void screenToPieces(byte width, byte height, byte *screen, uint16 offs, s
if (pieces->delay == 0) /*ensure piece is alive*/
pieces->delay = 1;
pieces->pix0 = screen[bofs];
- pieces->pix2 = screen[bofs + CGA_BYTES_PER_LINE];
+ pieces->pix2 = screen[bofs + g_vm->_screenBPL];
- bofs ^= CGA_ODD_LINES_OFS;
- if ((bofs & CGA_ODD_LINES_OFS) == 0)
- bofs += CGA_BYTES_PER_LINE;
+ bofs ^= g_vm->_line_offset;
+ if ((bofs & g_vm->_line_offset) == 0)
+ bofs += g_vm->_screenBPL;
pieces->pix1 = screen[bofs];
- pieces->pix3 = screen[bofs + CGA_BYTES_PER_LINE];
+ pieces->pix3 = screen[bofs + g_vm->_screenBPL];
pieces++;
if (delays >= piecedelays + ARRAYSIZE(piecedelays))
delays = piecedelays;
}
- offs += CGA_BYTES_PER_LINE * 2; /*4 lines down*/
+ offs += g_vm->_screenBPL * 2; /*4 lines down*/
}
pieces->offs = 0; /*end of list*/
}
@@ -1045,17 +1067,17 @@ static void fallPieces(scrpiece_t *pieces, byte *source, byte *target) {
uint16 bofs = offs;
if (target[bofs] == piece->pix0)
target[bofs] = source[bofs];
- if (target[bofs + CGA_BYTES_PER_LINE] == piece->pix2)
- target[bofs + CGA_BYTES_PER_LINE] = source[bofs + CGA_BYTES_PER_LINE];
+ if (target[bofs + g_vm->_screenBPL] == piece->pix2)
+ target[bofs + g_vm->_screenBPL] = source[bofs + g_vm->_screenBPL];
- bofs ^= CGA_ODD_LINES_OFS;
- if ((bofs & CGA_ODD_LINES_OFS) == 0)
- bofs += CGA_BYTES_PER_LINE;
+ bofs ^= g_vm->_line_offset;
+ if ((bofs & g_vm->_line_offset) == 0)
+ bofs += g_vm->_screenBPL;
if (target[bofs] == piece->pix1)
target[bofs] = source[bofs];
- if (target[bofs + CGA_BYTES_PER_LINE] == piece->pix3)
- target[bofs + CGA_BYTES_PER_LINE] = source[bofs + CGA_BYTES_PER_LINE];
+ if (target[bofs + g_vm->_screenBPL] == piece->pix3)
+ target[bofs + g_vm->_screenBPL] = source[bofs + g_vm->_screenBPL];
/*dead?*/
if (piece->delay == 0)
@@ -1064,32 +1086,32 @@ static void fallPieces(scrpiece_t *pieces, byte *source, byte *target) {
/*fall n lines*/
switch ((piece->delay & 3) + 1) {
case 1:
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
- offs += CGA_BYTES_PER_LINE;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
+ offs += g_vm->_screenBPL;
break;
case 2:
- offs += CGA_BYTES_PER_LINE;
+ offs += g_vm->_screenBPL;
break;
case 3:
- offs += CGA_BYTES_PER_LINE;
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
- offs += CGA_BYTES_PER_LINE;
+ offs += g_vm->_screenBPL;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
+ offs += g_vm->_screenBPL;
break;
case 4:
- offs += CGA_BYTES_PER_LINE;
- offs += CGA_BYTES_PER_LINE;
+ offs += g_vm->_screenBPL;
+ offs += g_vm->_screenBPL;
break;
}
/*extra 2 lines*/
- offs += CGA_BYTES_PER_LINE;
+ offs += g_vm->_screenBPL;
piece->offs = offs;
/*past line 190?*/
- if ((offs | CGA_ODD_LINES_OFS) >= ((190 / 2 * CGA_BYTES_PER_LINE) | CGA_ODD_LINES_OFS)) {
+ if ((offs | g_vm->_line_offset) >= ((190 / 2 * g_vm->_screenBPL) | g_vm->_line_offset)) {
piece->delay = 0;
continue;
}
@@ -1097,20 +1119,20 @@ static void fallPieces(scrpiece_t *pieces, byte *source, byte *target) {
bofs = offs;
target[bofs] = piece->pix0;
- target[bofs + CGA_BYTES_PER_LINE] = piece->pix2;
+ target[bofs + g_vm->_screenBPL] = piece->pix2;
- bofs ^= CGA_ODD_LINES_OFS;
- if ((bofs & CGA_ODD_LINES_OFS) == 0)
- bofs += CGA_BYTES_PER_LINE;
+ bofs ^= g_vm->_line_offset;
+ if ((bofs & g_vm->_line_offset) == 0)
+ bofs += g_vm->_screenBPL;
target[bofs] = piece->pix1;
- target[bofs + CGA_BYTES_PER_LINE] = piece->pix3;
+ target[bofs + g_vm->_screenBPL] = piece->pix3;
}
again = 1;
}
if (target == CGA_SCREENBUFFER) {
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
waitVBlank();
@@ -1149,8 +1171,18 @@ void cga_TraceLine(uint16 sx, uint16 ex, uint16 sy, uint16 ey, byte *source, byt
}
dy = h * 2;
- ofs = cga_CalcXY_p(sx / 4, sy);
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+ ofs = CalcXY_p(sx / 4, sy);
+ mask = 0xC0 >> ((sx % 4) * 2);
+ } else {
+ ofs = CalcXY_p(sx / 8, sy);
+ mask = 0x80 >> (sx % 8); // TODO: check this
+ }
+
+ /*
+ ofs = CalcXY_p(sx / 4, sy);
mask = 0xC0 >> ((sx % 4) * 2);
+ */
val = dy + dx;
@@ -1161,13 +1193,13 @@ void cga_TraceLine(uint16 sx, uint16 ex, uint16 sy, uint16 ey, byte *source, byt
while (count--) {
if (val > 0) {
if (b1 == 0) {
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
} else {
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
}
val += dx;
} else {
@@ -1192,7 +1224,7 @@ void cga_TraceLine(uint16 sx, uint16 ex, uint16 sy, uint16 ey, byte *source, byt
}
if (target == CGA_SCREENBUFFER)
- cga_blitToScreen(0, 0, 320, 200);
+ cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
}
/*TODO: get rid of this structure and pass everything relevant as arguments?*/
@@ -1289,9 +1321,9 @@ static void cga_Zoom(zoom_t *params, byte tw, byte th, byte *source, byte *targe
/*ofs -= params->fw;*/
ofs = oofs;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
params->yval_l += params->ystep_l + ((params->yval_h + params->ystep_h) >> 8);
params->yval_h += params->ystep_h;
@@ -1358,9 +1390,9 @@ static void cga_ZoomOpt(zoom_t *params, byte tw, byte th, byte *source, byte *ta
ofs -= params->fw;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
yval += ystep;
@@ -1421,9 +1453,9 @@ void cga_AnimZoomOpt(zoom_t *zoom, uint16 w, uint16 h, byte steps, byte *target,
prev = yval;
yval += ystep;
if (((prev ^ yval) & 0xFF00) || ((yval & 0x100) == 0)) {
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
}
prev = xval;
@@ -1461,11 +1493,11 @@ void cga_AnimZoomIn(byte *pixels, byte w, byte h, byte *target, uint16 ofs) {
y = (h / 2) - 1;
ofs += x / 4;
if (y & 1) {
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
}
- ofs += (y / 2) * CGA_BYTES_PER_LINE;
+ ofs += (y / 2) * g_vm->_screenBPL;
maxside = w * 4;
if (maxside < h)
@@ -1533,9 +1565,9 @@ void cga_ZoomInplace(zoom_t *params, byte tw, byte th, byte *source, byte *targe
/*ofs -= params->fw;*/
ofs = oofs;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
params->yval_l += params->ystep_l + ((params->yval_h + params->ystep_h) >> 8);
params->yval_h += params->ystep_h;
@@ -1557,7 +1589,7 @@ void cga_ZoomInplaceXY(byte *pixels, byte w, byte h, byte nw, byte nh, uint16 x,
zoom.eh = h - 1;
zoom.xbase = x % 4;
- cga_ZoomInplace(&zoom, nw, nh, target, target, cga_CalcXY(x, y));
+ cga_ZoomInplace(&zoom, nw, nh, target, target, CalcXY_p(x, y));
}
-} // End of namespace Chamber
+} // End of namespace Chamber
\ No newline at end of file
diff --git a/engines/chamber/cga.h b/engines/chamber/cga.h
index 2abea7dde57..2a7da226e45 100644
--- a/engines/chamber/cga.h
+++ b/engines/chamber/cga.h
@@ -24,6 +24,33 @@
namespace Chamber {
+// HGA Constants
+#define HGA_WIDTH 720
+#define HGA_HEIGHT 348
+#define HGA_BASE_SEG 0xB000
+#define HGA_PAGE2_SEG 0xB800
+#define HGA_NEXT_LINES_OFS 0x2000
+#define HGA_BITS_PER_PIXEL 1
+#define HGA_PIXELS_PER_BYTE (8 / HGA_BITS_PER_PIXEL)
+#define HGA_BYTES_PER_LINE (HGA_WIDTH / HGA_PIXELS_PER_BYTE)
+#define HGA_CALCXY_RAW(x, y) ( ((y) % 4) * HGA_NEXT_LINES_OFS + ((y) / 4) * HGA_BYTES_PER_LINE + (x) / HGA_PIXELS_PER_BYTE )
+#define HGA_CENTERED_BASE_OFS HGA_CALCXY_RAW(-76, 8)
+#ifdef __386__
+#define HGA_SCREENBUFFER ((byte*)(HGA_BASE_SEG * 16))
+#define HGA_BACKBUFFER ((byte*)(HGA_PAGE2_SEG * 16))
+#else
+#if 0
+#define HGA_SCREENBUFFER ((byte*)MK_FP(HGA_BASE_SEG, 0))
+#define HGA_BACKBUFFER ((byte*)MK_FP(HGA_PAGE2_SEG, 0))
+
+
+#define HGA_FONT_HEIGHT 6
+#define frontbuffer HGA_SCREENBUFFER
+#define backbuffer HGA_BACKBUFFER
+#endif
+#endif
+
+// CGA Constants
#define CGA_WIDTH 320
#define CGA_HEIGHT 200
#define CGA_BASE_SEG 0xB800
@@ -32,7 +59,7 @@ namespace Chamber {
#define CGA_PIXELS_PER_BYTE (8 / CGA_BITS_PER_PIXEL)
#define CGA_BYTES_PER_LINE (CGA_WIDTH / CGA_PIXELS_PER_BYTE)
-extern byte CGA_SCREENBUFFER[0x4000];
+extern byte CGA_SCREENBUFFER[0xB800];
#define CGA_FONT_HEIGHT 6
@@ -40,7 +67,7 @@ extern byte CGA_SCREENBUFFER[0x4000];
#define CGA_PREV_LINE(offs) ((CGA_ODD_LINES_OFS ^ (offs)) - (((offs) & CGA_ODD_LINES_OFS) ? CGA_BYTES_PER_LINE : 0))
#define frontbuffer CGA_SCREENBUFFER
-extern byte backbuffer[0x4000];
+extern byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
extern byte sprit_load_buffer[1290];
@@ -67,6 +94,11 @@ void cga_SwapRealBackBuffer(void);
void cga_SwapScreenRect(byte *pixels, uint16 w, uint16 h, byte *screen, uint16 ofs);
+uint16 CalcXY(uint16 x, uint16 y);
+uint16 CalcXY_p(uint16 x, uint16 y);
+
+uint16 HGA_CalcXY(uint16 x, uint16 y);
+uint16 HGA_CalcXY_p(uint16 x, uint16 y);
uint16 cga_CalcXY(uint16 x, uint16 y);
uint16 cga_CalcXY_p(uint16 x, uint16 y);
diff --git a/engines/chamber/chamber.cpp b/engines/chamber/chamber.cpp
index 7de8b19412a..4cb07272ccb 100644
--- a/engines/chamber/chamber.cpp
+++ b/engines/chamber/chamber.cpp
@@ -52,6 +52,11 @@ ChamberEngine::ChamberEngine(OSystem *syst, const ADGameDescription *desc)
_prioritycommand_1 = false;
_prioritycommand_2 = false;
_pxiData = NULL;
+ _videoMode = Common::kRenderCGA;
+ _screenH = _screenW = _screenBits = _screenBPL = _screenPPB = 0;
+ _line_offset = _line_offset2 = _fontHeight = _fontWidth = 0;
+
+
_speakerHandle = NULL;
_speakerStream = NULL;
diff --git a/engines/chamber/chamber.h b/engines/chamber/chamber.h
index 3a8e7830c4b..0c63e5e684d 100644
--- a/engines/chamber/chamber.h
+++ b/engines/chamber/chamber.h
@@ -25,6 +25,7 @@
#include "common/random.h"
#include "common/serializer.h"
+#include "common/rendermode.h"
#include "engines/engine.h"
#include "gui/debugger.h"
@@ -69,8 +70,21 @@ public:
bool _prioritycommand_1;
bool _prioritycommand_2;
+ Common::RenderMode _videoMode;
+
byte *_pxiData;
+ uint16 _screenW; ///< Screen Width
+ uint16 _screenH; ///< Screen Height
+ uint8 _screenBits; ///< Bits per pixel
+ uint16 _line_offset; ///< Memory offset of blanks
+ uint16 _line_offset2; ///< Memory offset of blanks
+ uint8 _screenPPB; ///< Pixels per byte
+ uint16 _screenBPL; ///< Bytes per line
+ uint8 _fontHeight; ///< Font height
+ uint8 _fontWidth; ///< Font height
+
+
Audio::PCSpeaker *_speakerStream;
Audio::SoundHandle *_speakerHandle;
diff --git a/engines/chamber/cursor.cpp b/engines/chamber/cursor.cpp
index e773e257405..5ee65824b28 100644
--- a/engines/chamber/cursor.cpp
+++ b/engines/chamber/cursor.cpp
@@ -66,7 +66,7 @@ Select cursor shape and its hotspot
void selectCursor(uint16 num) {
cursor_x_shift = cursor_shifts[num][0];
cursor_y_shift = cursor_shifts[num][1];
- cursor_shape = souri_data + num * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / CGA_PIXELS_PER_BYTE;
+ cursor_shape = souri_data + num * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / g_vm->_screenPPB;
byte *src = cursor_shape;
byte *dst = cursorImage;
diff --git a/engines/chamber/dialog.cpp b/engines/chamber/dialog.cpp
index b3ddf5cc1f2..97677e6c89c 100644
--- a/engines/chamber/dialog.cpp
+++ b/engines/chamber/dialog.cpp
@@ -104,7 +104,7 @@ void desciTextBox(uint16 x, uint16 y, uint16 width, byte *msg) {
draw_y = y;
char_draw_max_width = width;
cga_DrawTextBox(msg, frontbuffer);
- addDirtyRect(DirtyRectText, draw_x, draw_y, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, cga_CalcXY_p(draw_x, draw_y));
+ addDirtyRect(DirtyRectText, draw_x, draw_y, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, CalcXY_p(draw_x, draw_y));
}
/*Draw dialog bubble with text and spike*/
@@ -123,7 +123,7 @@ void drawPersonBubble(byte x, byte y, byte flags, byte *msg) {
}
/*upper border*/
- ofs = cga_CalcXY_p(x, y);
+ ofs = CalcXY_p(x, y);
ofs = cga_DrawHLineWithEnds(0xF00F, 0, 0, char_draw_max_width, CGA_SCREENBUFFER, ofs);
ofs = cga_DrawHLineWithEnds(0xC003, 0x0FF0, 0xFF, char_draw_max_width, CGA_SCREENBUFFER, ofs);
ofs = cga_DrawHLineWithEnds(0, 0x3FFC, 0xFF, char_draw_max_width, CGA_SCREENBUFFER, ofs);
@@ -140,7 +140,7 @@ void drawPersonBubble(byte x, byte y, byte flags, byte *msg) {
char_draw_coords_x = x;
}
- ofs = cga_CalcXY_p(x, char_draw_coords_y);
+ ofs = CalcXY_p(x, char_draw_coords_y);
ofs = cga_DrawHLineWithEnds(0xC003, 0x0FF0, 0xFF, char_draw_max_width, CGA_SCREENBUFFER, ofs);
ofs = cga_DrawHLineWithEnds(0xF00F, 0, 0, char_draw_max_width, CGA_SCREENBUFFER, ofs);
@@ -150,32 +150,32 @@ void drawPersonBubble(byte x, byte y, byte flags, byte *msg) {
/*draw spike*/
switch (flags & SPIKE_MASK) {
case SPIKE_UPLEFT: /*upper-left spike*/
- ofs = cga_CalcXY_p(x + 1, y - 7);
+ ofs = CalcXY_p(x + 1, y - 7);
drawSpriteN(18, x + 1, y - 7, CGA_SCREENBUFFER);
break;
case SPIKE_UPRIGHT: /*upper-right spike*/
- ofs = cga_CalcXY_p(x + char_draw_max_width, y - 7) - 1;
+ ofs = CalcXY_p(x + char_draw_max_width, y - 7) - 1;
drawSpriteNFlip(18, x + char_draw_max_width, y - 7, CGA_SCREENBUFFER);
break;
case SPIKE_DNRIGHT: /*lower-right spike*/
- ofs = cga_CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 1) - 1;
+ ofs = CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 1) - 1;
drawSpriteNFlip(21, x + char_draw_max_width, char_draw_coords_y + 1, CGA_SCREENBUFFER);
break;
case SPIKE_DNLEFT: /*lower-left spike*/
- ofs = cga_CalcXY_p(x + 1, char_draw_coords_y + 1);
+ ofs = CalcXY_p(x + 1, char_draw_coords_y + 1);
drawSpriteN(21, x + 1, char_draw_coords_y + 1, CGA_SCREENBUFFER);
break;
case SPIKE_BUBRIGHT: /*lower-right bubbles*/
- ofs = cga_CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 4);
+ ofs = CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 4);
drawSpriteN(20, x + char_draw_max_width, char_draw_coords_y + 4, CGA_SCREENBUFFER);
break;
case SPIKE_BUBLEFT: /*lower-left bubbles*/
- ofs = cga_CalcXY_p(x + 1, char_draw_coords_y + 4);
+ ofs = CalcXY_p(x + 1, char_draw_coords_y + 4);
drawSpriteN(19, x + 1, char_draw_coords_y + 4, CGA_SCREENBUFFER);
break;
}
- addDirtyRect(DirtyRectBubble, ofs >> 8, ofs & 255, w, h, cga_CalcXY_p(x, y));
+ addDirtyRect(DirtyRectBubble, ofs >> 8, ofs & 255, w, h, CalcXY_p(x, y));
}
void showPromptAnim(void) {
diff --git a/engines/chamber/input.cpp b/engines/chamber/input.cpp
index a303b3dbe3b..1ca566924f2 100644
--- a/engines/chamber/input.cpp
+++ b/engines/chamber/input.cpp
@@ -175,7 +175,7 @@ int16 askQuitGame(void) {
}
}
}
- cga_CopyScreenBlock(backbuffer, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, frontbuffer, cga_CalcXY_p(draw_x, draw_y));
+ cga_CopyScreenBlock(backbuffer, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, frontbuffer, CalcXY_p(draw_x, draw_y));
return quit;
}
diff --git a/engines/chamber/invent.cpp b/engines/chamber/invent.cpp
index 3cfe14d0949..9f5adf31e45 100644
--- a/engines/chamber/invent.cpp
+++ b/engines/chamber/invent.cpp
@@ -79,7 +79,7 @@ void drawInventoryBox(uint16 filtermask, uint16 filtervalue) {
continue;
if (count == 0) {
/*once first valid item found, draw the box*/
- cga_FillAndWait(inv_bgcolor, 64 / 4, 64, CGA_SCREENBUFFER, cga_CalcXY_p(232 / 4, 56));
+ cga_FillAndWait(inv_bgcolor, 64 / 4, 64, CGA_SCREENBUFFER, CalcXY_p(232 / 4, 56));
playSound(20);
}
inventory_spots[count].name = inventory_items[i].name;
@@ -111,7 +111,7 @@ void checkInventoryItemHover(byte count) {
void openInventory(uint16 filtermask, uint16 filtervalue) {
the_command = 0;
- cga_BackupImageReal(cga_CalcXY_p(232 / 4, 56), 64 / 4, 64);
+ cga_BackupImageReal(CalcXY_p(232 / 4, 56), 64 / 4, 64);
drawInventoryBox(filtermask, filtervalue);
if (inv_count != 0) {
selectCursor(CURSOR_FINGER);
diff --git a/engines/chamber/kult.cpp b/engines/chamber/kult.cpp
index ae755874b11..9b048e5ce76 100644
--- a/engines/chamber/kult.cpp
+++ b/engines/chamber/kult.cpp
@@ -202,7 +202,30 @@ Common::Error ChamberEngine::init() {
byte c;
// Initialize graphics using following:
- initGraphics(320, 200);
+ if (_videoMode == Common::RenderMode::kRenderCGA) {
+ // 320x200x2
+ _screenW = 320;
+ _screenH = 200;
+ _screenBits = 2;
+ _screenPPB = 8 / _screenBits;
+ _screenBPL = _screenW / _screenPPB;
+ _line_offset = 0x2000;
+ _fontHeight = 6;
+ _fontWidth = 4;
+ initGraphics(_screenW, _screenH);
+ } else if (_videoMode == Common::RenderMode::kRenderHercG) {
+ // 720x348x1
+ _screenW = 720;
+ _screenH = 348;
+ _screenBits = 1;
+ _screenPPB = 8 / _screenBits;
+ _screenBPL = _screenW / _screenPPB;
+ _line_offset = 0x2000;
+ _line_offset2 = 0x2000;
+ _fontHeight = 6;
+ _fontWidth = 4;
+ initGraphics(_screenW, _screenH);
+ }
initSound();
/*TODO: DetectCPU*/
@@ -228,11 +251,20 @@ Common::Error ChamberEngine::init() {
exitGame();
}
- /* Select intense cyan-mageta palette */
- cga_ColorSelect(0x30);
+ if (_videoMode == Common::RenderMode::kRenderCGA) {
+ /* Select intense cyan-mageta palette */
+ cga_ColorSelect(0x30);
+ cga_BackBufferToRealFull();
+ } else if (_videoMode == Common::RenderMode::kRenderHercG) {
+ /* Select intense cyan-mageta palette */
+ cga_ColorSelect(0x30);
+ cga_BackBufferToRealFull();
+ }
+
+ /* Wait for a keypress */
+ clearKeyboard();
+ readKeyboardChar();
- /* Show the title screen */
- cga_BackBufferToRealFull();
if (g_vm->getLanguage() == Common::EN_USA) {
if (ifgm_loaded) {
diff --git a/engines/chamber/portrait.cpp b/engines/chamber/portrait.cpp
index e9df8322a66..a01676b02fd 100644
--- a/engines/chamber/portrait.cpp
+++ b/engines/chamber/portrait.cpp
@@ -234,11 +234,11 @@ void drawBoxAroundSpot(void) {
/*decode ofs back to x:y*/
/*TODO: this is CGA-only!*/
- y = (ofs & CGA_ODD_LINES_OFS) ? 1 : 0;
- ofs &= ~CGA_ODD_LINES_OFS;
- x = (ofs % CGA_BYTES_PER_LINE) * CGA_PIXELS_PER_BYTE;
- y += (ofs / CGA_BYTES_PER_LINE) * 2;
- w *= CGA_PIXELS_PER_BYTE; /*TODO: this will overflow on large sprite*/
+ y = (ofs & g_vm->_line_offset) ? 1 : 0;
+ ofs &= ~g_vm->_line_offset;
+ x = (ofs % g_vm->_screenBPL) * g_vm->_screenPPB;
+ y += (ofs / g_vm->_screenBPL) * 2;
+ w *= g_vm->_screenPPB; /*TODO: this will overflow on large sprite*/
cga_DrawVLine(x, y, h - 1, 0, CGA_SCREENBUFFER);
cga_DrawHLine(x, y, w - 1, 0, CGA_SCREENBUFFER);
@@ -275,7 +275,7 @@ int16 drawPortrait(byte **desc, byte *x, byte *y, byte *width, byte *height) {
cur_image_size_h = *image++;
cur_image_size_w = *image++;
cur_image_pixels = image;
- cur_image_offs = cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y);
+ cur_image_offs = CalcXY_p(cur_image_coords_x, cur_image_coords_y);
addDirtyRect(DirtyRectSprite, cur_image_coords_x, cur_image_coords_y, cur_image_size_w, cur_image_size_h, cur_image_offs);
/*TODO: remove and use only globals?*/
diff --git a/engines/chamber/print.cpp b/engines/chamber/print.cpp
index ad3c3e5a4b6..da93f04ecde 100644
--- a/engines/chamber/print.cpp
+++ b/engines/chamber/print.cpp
@@ -257,7 +257,7 @@ void drawMessage(byte *msg, byte *target) {
draw_x = x;
draw_y = y;
- cga_BackupImageReal(cga_CalcXY_p(x, y), char_draw_max_width + 2, char_draw_max_height); /*backup orig. screen data*/
+ cga_BackupImageReal(CalcXY_p(x, y), char_draw_max_width + 2, char_draw_max_height); /*backup orig. screen data*/
cga_DrawTextBox(msg, target); /*draw box with text*/
promptWait(); /*wait keypress*/
cga_RestoreBackupImage(target); /*restore screen data*/
diff --git a/engines/chamber/room.cpp b/engines/chamber/room.cpp
index 06fb5a7b38e..2d1e965b12e 100644
--- a/engines/chamber/room.cpp
+++ b/engines/chamber/room.cpp
@@ -188,7 +188,7 @@ int16 isInRect(byte x, byte y, rect_t *rect) {
Check if cursor is in rect
*/
int16 isCursorInRect(rect_t *rect) {
- return isInRect(cursor_x / CGA_PIXELS_PER_BYTE, cursor_y, rect);
+ return isInRect(cursor_x / g_vm->_screenPPB, cursor_y, rect);
}
/*
@@ -245,14 +245,16 @@ void selectSpotCursor(void) {
curs = CURSOR_CROSSHAIR;
}
}
- cursor_shape = souri_data + curs * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / CGA_PIXELS_PER_BYTE;
+ cursor_shape = souri_data + curs * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / g_vm->_screenPPB;
}
#define kBgW 8
#define kBgH 30
+static const int16 *background_draw_steps;
+
/*blocks draw order (clockwise inward spiral)*/
-static const int16 background_draw_steps[] = {
+static const int16 background_draw_steps_cga[] = {
kBgW, kBgW, kBgW, kBgW, kBgW, kBgW, kBgW,
kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE,
-kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW,
@@ -266,6 +268,21 @@ static const int16 background_draw_steps[] = {
-kBgW, -kBgW, -kBgW, -kBgW, 0
};
+/*blocks draw order (clockwise inward spiral)*/
+static const int16 background_draw_steps_hga[] = {
+ kBgW, kBgW, kBgW, kBgW, kBgW, kBgW, kBgW,
+ kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE,
+ -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW,
+ -kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE,
+ kBgW, kBgW, kBgW, kBgW, kBgW, kBgW, kBgW,
+ kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE,
+ -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW,
+ -kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE,
+ kBgW, kBgW, kBgW, kBgW, kBgW,
+ kBgH / 2 * HGA_BYTES_PER_LINE,
+ -kBgW, -kBgW, -kBgW, -kBgW, 0
+};
+
/*
Draw main backgound pattern, in spiral-like order
*/
@@ -278,6 +295,11 @@ void drawBackground(byte *target, byte vblank) {
cga_Blit(pixels + (i & 1 ? 0 : kBgW * kBgH), kBgW, kBgW, kBgH, target, offs);
if (vblank)
waitVBlank();
+ if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+ background_draw_steps = background_draw_steps_cga;
+ } else {
+ background_draw_steps = background_draw_steps_hga;
+ }
offs += background_draw_steps[i];
}
@@ -453,14 +475,14 @@ void initRoomDoorInfo(byte index) {
info->layer[i].width = w;
info->layer[i].height = h;
info->layer[i].pixels = sprite + 2;
- info->layer[i].offs = cga_CalcXY_p(x, y);
+ info->layer[i].offs = CalcXY_p(x, y);
aptr += 3;
}
info->width = bounds.ex - bounds.sx;
info->height = bounds.ey - bounds.sy;
- info->offs = cga_CalcXY_p(bounds.sx, bounds.sy);
+ info->offs = CalcXY_p(bounds.sx, bounds.sy);
}
/*
@@ -781,9 +803,9 @@ void drawRoomStaticObject(byte *aptr, byte *rx, byte *ry, byte *rw, byte *rh) {
/*TODO: check if this results in any glitches in Who Will Be Saved*/
if (aptr[1] & 0x80)
- cga_BlitSpriteFlip(sprite, pitch, w, h, backbuffer, cga_CalcXY_p(x, y));
+ cga_BlitSpriteFlip(sprite, pitch, w, h, backbuffer, CalcXY_p(x, y));
else
- cga_BlitSprite(sprite, pitch, w, h, backbuffer, cga_CalcXY_p(x, y));
+ cga_BlitSprite(sprite, pitch, w, h, backbuffer, CalcXY_p(x, y));
}
/*
@@ -884,8 +906,8 @@ void drawRoomItemsIndicator(void) {
break;
}
}
- drawSpriteN(spridx, 296 / CGA_PIXELS_PER_BYTE, 14, CGA_SCREENBUFFER);
- drawSpriteN(spridx, 296 / CGA_PIXELS_PER_BYTE, 14, backbuffer);
+ drawSpriteN(spridx, 296 / g_vm->_screenPPB, 14, CGA_SCREENBUFFER);
+ drawSpriteN(spridx, 296 / g_vm->_screenPPB, 14, backbuffer);
/*recalculate the number of zapstiks we have*/
script_byte_vars.zapstiks_owned = 0;
@@ -972,7 +994,7 @@ Copy object hint from backbuffer to screen
void showObjectHint(byte *target) {
if (script_byte_vars.zone_index == 135)
return;
- cga_CopyScreenBlock(backbuffer, room_hint_bar_width + 2, 9, target, cga_CalcXY_p(room_hint_bar_coords_x - 1, room_hint_bar_coords_y - 2));
+ cga_CopyScreenBlock(backbuffer, room_hint_bar_width + 2, 9, target, CalcXY_p(room_hint_bar_coords_x - 1, room_hint_bar_coords_y - 2));
}
/*
@@ -990,7 +1012,7 @@ void drawCommandHint(void) {
Copy command hint from backbuffer to screen
*/
void showCommandHint(byte *target) {
- cga_CopyScreenBlock(backbuffer, cmd_hint_bar_width + 2, 9, target, cga_CalcXY_p(cmd_hint_bar_coords_x - 1, cmd_hint_bar_coords_y - 2));
+ cga_CopyScreenBlock(backbuffer, cmd_hint_bar_width + 2, 9, target, CalcXY_p(cmd_hint_bar_coords_x - 1, cmd_hint_bar_coords_y - 2));
}
void loadLutinSprite(uint16 lutidx) {
@@ -1040,7 +1062,7 @@ void drawCharacterSprite(byte spridx, byte x, byte y, byte *target) {
loadLutinSprite(spridx);
- drawSprite(scratch_mem2, target, cga_CalcXY_p(x, y));
+ drawSprite(scratch_mem2, target, CalcXY_p(x, y));
}
/*
@@ -1063,7 +1085,7 @@ char drawZoneAniSprite(rect_t *rect, uint16 index, byte *target) {
zsprite_w = scratch_mem2[0];
zsprite_h = scratch_mem2[1];
- zsprite_draw_ofs = cga_CalcXY_p(rect->sx, rect->sy);
+ zsprite_draw_ofs = CalcXY_p(rect->sx, rect->sy);
drawSprite(scratch_mem2, target, zsprite_draw_ofs);
@@ -1281,7 +1303,7 @@ uint16 getPuzzlSprite(byte index, byte x, byte y, uint16 *w, uint16 *h, uint16 *
byte *spr = loadPuzzlToScratch(index);
*w = spr[0];
*h = spr[1];
- *ofs = cga_CalcXY_p(x, y);
+ *ofs = CalcXY_p(x, y);
return 0; /*sprite offset in scratch buf*/
}
@@ -1390,7 +1412,7 @@ Open The Wall's right gate
TODO: move this to CGA?
*/
void theWallOpenRightDoor(byte x, byte y, byte width, byte height, byte limit) {
- uint16 offs = cga_CalcXY_p(x + width - 2, y);
+ uint16 offs = CalcXY_p(x + width - 2, y);
while (--width) {
cga_HideScreenBlockLiftToRight(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1406,8 +1428,8 @@ void theWallOpenRightDoor(byte x, byte y, byte width, byte height, byte limit) {
while (height--) {
memcpy(frontbuffer + offs, backbuffer + offs, 1);
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
offs += CGA_BYTES_PER_LINE;
}
@@ -1419,7 +1441,7 @@ Open The Wall's left gate
TODO: move this to CGA?
*/
void theWallOpenLeftDoor(byte x, byte y, byte width, byte height, byte limit) {
- uint16 offs = cga_CalcXY_p(x + 1, y);
+ uint16 offs = CalcXY_p(x + 1, y);
while (--width) {
cga_HideScreenBlockLiftToLeft(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1435,8 +1457,8 @@ void theWallOpenLeftDoor(byte x, byte y, byte width, byte height, byte limit) {
while (height--) {
memcpy(frontbuffer + offs, backbuffer + offs, 1);
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
offs += CGA_BYTES_PER_LINE;
}
cga_blitToScreen(ooffs, 1, oh);
@@ -1487,11 +1509,11 @@ void theWallPhase1_DoorClose1(void) {
spr = loadMursmSprite(0);
spr += cur_frame_width - 1;
cur_image_coords_x = 64 / 4;
- cga_AnimLiftToRight(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y));
+ cga_AnimLiftToRight(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y));
spr = loadMursmSprite(1);
cur_image_coords_x = 220 / 4;
- cga_AnimLiftToLeft(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y));
+ cga_AnimLiftToLeft(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y));
IFGM_StopSample();
@@ -1511,11 +1533,11 @@ void theWallPhase2_DoorClose2(void) {
spr = loadMursmSprite(0);
spr += cur_frame_width - 1;
cur_image_coords_x = 64 / 4;
- cga_AnimLiftToRight(10, spr - 10, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y));
+ cga_AnimLiftToRight(10, spr - 10, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y));
spr = loadMursmSprite(1);
cur_image_coords_x = 220 / 4;
- cga_AnimLiftToLeft(10, spr, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y) - 10);
+ cga_AnimLiftToLeft(10, spr, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y) - 10);
IFGM_PlaySample(30);
@@ -1529,18 +1551,18 @@ void drawTheWallDoors(void) {
switch (script_byte_vars.zone_index) {
case 9:
case 102:
- cga_Blit(loadMursmSprite(0) + 10, 20, 10, 59, CGA_SCREENBUFFER, cga_CalcXY_p(64 / CGA_PIXELS_PER_BYTE, 32));
+ cga_Blit(loadMursmSprite(0) + 10, 20, 10, 59, CGA_SCREENBUFFER, CalcXY_p(64 / g_vm->_screenPPB, 32));
if (g_vm->getLanguage() == Common::EN_USA) {
/*This fixes odd black patch on the right gate door*/
- cga_Blit(loadMursmSprite(1) , 20, 10, 59, CGA_SCREENBUFFER, cga_CalcXY_p(184 / CGA_PIXELS_PER_BYTE, 32));
+ cga_Blit(loadMursmSprite(1) , 20, 10, 59, CGA_SCREENBUFFER, CalcXY_p(184 / g_vm->_screenPPB, 32));
} else {
- cga_Blit(loadMursmSprite(1) , 20, 10, 59, CGA_SCREENBUFFER, cga_CalcXY_p(180 / CGA_PIXELS_PER_BYTE, 32));
+ cga_Blit(loadMursmSprite(1) , 20, 10, 59, CGA_SCREENBUFFER, CalcXY_p(180 / g_vm->_screenPPB, 32));
}
break;
case 95:
case 103:
- cga_Blit(loadMursmSprite(0), 20, 20, 59, CGA_SCREENBUFFER, cga_CalcXY_p(64 / CGA_PIXELS_PER_BYTE, 32));
- cga_Blit(loadMursmSprite(1), 20, 20, 59, CGA_SCREENBUFFER, cga_CalcXY_p(144 / CGA_PIXELS_PER_BYTE, 32));
+ cga_Blit(loadMursmSprite(0), 20, 20, 59, CGA_SCREENBUFFER, CalcXY_p(64 / g_vm->_screenPPB, 32));
+ cga_Blit(loadMursmSprite(1), 20, 20, 59, CGA_SCREENBUFFER, CalcXY_p(144 / g_vm->_screenPPB, 32));
break;
}
}
@@ -1587,7 +1609,7 @@ Return current and next free buffer ptr
*/
byte *backupSpotImage(spot_t *spot, byte **spotback, byte *buffer) {
*spotback = buffer;
- buffer = cga_BackupImage(backbuffer, cga_CalcXY_p(spot->sx, spot->sy), spot->ex - spot->sx, spot->ey - spot->sy, buffer);
+ buffer = cga_BackupImage(backbuffer, CalcXY_p(spot->sx, spot->sy), spot->ex - spot->sx, spot->ey - spot->sy, buffer);
return buffer;
}
diff --git a/engines/chamber/script.cpp b/engines/chamber/script.cpp
index 97e4280eaa9..3fa8de5a1e0 100644
--- a/engines/chamber/script.cpp
+++ b/engines/chamber/script.cpp
@@ -677,7 +677,7 @@ uint16 SCR_5_DrawPortraitLiftRight(void) {
return 0;
/*TODO: use local args instead of globals*/
- cga_AnimLiftToRight(width, cur_image_pixels + width - 1, width, 1, height, CGA_SCREENBUFFER, cga_CalcXY_p(x, y));
+ cga_AnimLiftToRight(width, cur_image_pixels + width - 1, width, 1, height, CGA_SCREENBUFFER, CalcXY_p(x, y));
return 0;
}
@@ -693,7 +693,7 @@ uint16 SCR_6_DrawPortraitLiftLeft(void) {
return 0;
/*TODO: use local args instead of globals*/
- cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, cga_CalcXY_p(x + width - 1, y));
+ cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, CalcXY_p(x + width - 1, y));
return 0;
}
@@ -797,7 +797,7 @@ uint16 SCR_B_DrawPortraitTwistEffect(void) {
if (!drawPortrait(&script_ptr, &x, &y, &width, &height))
return 0;
- offs = cga_CalcXY_p(x, y);
+ offs = CalcXY_p(x, y);
cga_SwapScreenRect(cur_image_pixels, width, height, backbuffer, offs);
twistDraw(x, y, width, height, backbuffer, frontbuffer);
@@ -848,7 +848,7 @@ uint16 SCR_C_DrawPortraitArcEffect(void) {
if (!drawPortrait(&script_ptr, &x, &y, &width, &height))
return 0;
- offs = cga_CalcXY_p(x, y);
+ offs = CalcXY_p(x, y);
cga_SwapScreenRect(cur_image_pixels, width, height, backbuffer, offs);
arcDraw(x, y, width, height, backbuffer, frontbuffer);
@@ -875,7 +875,7 @@ uint16 SCR_D_DrawPortraitDotEffect(void) {
int16 count = 0;
for (offs = 0; offs != cur_image_end;) {
- target[cga_CalcXY_p(x + offs % cur_image_size_w, y + offs / cur_image_size_w)] = cur_image_pixels[offs];
+ target[CalcXY_p(x + offs % cur_image_size_w, y + offs / cur_image_size_w)] = cur_image_pixels[offs]; // TODO check this
if (count % 5 == 0)
cga_blitToScreen(offs, 4, 1);
@@ -960,7 +960,7 @@ uint16 SCR_19_HidePortraitLiftLeft(void) {
/*TODO: This originally was done by reusing door sliding routine*/
- /*offs = cga_CalcXY_p(x + 1, y);*/
+ /*offs = CalcXY_p(x + 1, y);*/
offs++;
while (--width) {
@@ -976,9 +976,9 @@ uint16 SCR_19_HidePortraitLiftLeft(void) {
while (height--) {
memcpy(frontbuffer + offs, backbuffer + offs, 1);
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
- offs += CGA_BYTES_PER_LINE;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
+ offs += g_vm->_screenBPL;
}
cga_blitToScreen(ooffs, 1, oh);
@@ -1006,7 +1006,7 @@ uint16 SCR_1A_HidePortraitLiftRight(void) {
/*TODO: This originally was done by reusing door sliding routine*/
- offs = cga_CalcXY_p(x + width - 2, y);
+ offs = CalcXY_p(x + width - 2, y);
while (--width) {
cga_HideScreenBlockLiftToRight(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1021,9 +1021,9 @@ uint16 SCR_1A_HidePortraitLiftRight(void) {
while (height--) {
memcpy(frontbuffer + offs, backbuffer + offs, 1);
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
- offs += CGA_BYTES_PER_LINE;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
+ offs += g_vm->_screenBPL;
}
cga_blitToScreen(ooffs, 1, oh);
@@ -1049,7 +1049,7 @@ uint16 SCR_1B_HidePortraitLiftUp(void) {
return 0;
}
- offs = cga_CalcXY_p(x, y + 1);
+ offs = CalcXY_p(x, y + 1);
while (--height) {
cga_HideScreenBlockLiftToUp(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1057,9 +1057,9 @@ uint16 SCR_1B_HidePortraitLiftUp(void) {
/*hide topmost line*/
/*TODO: move this to CGA?*/
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) != 0)
- offs -= CGA_BYTES_PER_LINE;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) != 0)
+ offs -= g_vm->_screenBPL;
memcpy(CGA_SCREENBUFFER + offs, backbuffer + offs, width);
cga_blitToScreen(offs, width, 1);
return 0;
@@ -1085,7 +1085,7 @@ uint16 SCR_1C_HidePortraitLiftDown(void) {
return 0;
}
- offs = cga_CalcXY_p(x, y + height - 2);
+ offs = CalcXY_p(x, y + height - 2);
while (--height) {
cga_HideScreenBlockLiftToDown(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1093,9 +1093,9 @@ uint16 SCR_1C_HidePortraitLiftDown(void) {
/*hide bottommost line*/
/*TODO: move this to CGA?*/
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
- offs += CGA_BYTES_PER_LINE;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
+ offs += g_vm->_screenBPL;
memcpy(CGA_SCREENBUFFER + offs, backbuffer + offs, width);
cga_blitToScreen(offs, width, 1);
return 0;
@@ -1551,7 +1551,7 @@ Display a static sprite in the room (to screen)
uint16 SCR_11_DrawRoomObject(void) {
byte x, y, w, h;
SCR_DrawRoomObjectBack(&x, &y, &w, &h);
- cga_CopyScreenBlock(backbuffer, w, h, frontbuffer, cga_CalcXY_p(x, y));
+ cga_CopyScreenBlock(backbuffer, w, h, frontbuffer, CalcXY_p(x, y));
return 0;
}
@@ -1893,7 +1893,7 @@ uint16 SCR_30_Fight(void) {
player_image[1] = x;
player_image[2] = y;
if (drawPortrait(&image, &x, &y, &width, &height))
- cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, cga_CalcXY_p(x + width - 1, y));
+ cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, CalcXY_p(x + width - 1, y));
blinkToWhite();
@@ -2309,9 +2309,9 @@ uint16 SCR_45_DeProfundisRoomEntry(void) {
waitVBlank();
cga_BlitFromBackBuffer(w, 1, CGA_SCREENBUFFER, ofs);
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
cga_BlitScratchBackSprite(sprofs, w, h, CGA_SCREENBUFFER, ofs);
}
@@ -2370,9 +2370,9 @@ uint16 SCR_47_DeProfundisRiseMonster(void) {
for (; y; y--) {
waitVBlank();
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
h++;
@@ -2401,9 +2401,9 @@ uint16 SCR_48_DeProfundisLowerMonster(void) {
waitVBlank();
cga_BlitFromBackBuffer(w, 1, CGA_SCREENBUFFER, ofs);
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
h--;
cga_BlitScratchBackSprite(sprofs, w, h, CGA_SCREENBUFFER, ofs);
@@ -2473,9 +2473,9 @@ uint16 SCR_65_DeProfundisMovePlatform(void) {
waitVBlank();
cga_BlitFromBackBuffer(w, h, CGA_SCREENBUFFER, ofs);
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) == 0)
- ofs += CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) == 0)
+ ofs += g_vm->_screenBPL;
h--;
@@ -2699,11 +2699,11 @@ uint16 SCR_56_MorphRoom98(void) {
ofs = cga_CalcXY(0, 136);
for (h = 60; h; h--) {
- memcpy(frontbuffer + ofs, backbuffer + ofs, CGA_BYTES_PER_LINE);
+ memcpy(frontbuffer + ofs, backbuffer + ofs, g_vm->_screenBPL);
waitVBlank();
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
}
backupSpotImage(&zone_spots[3], &sprites_list[3], sprites_list[3]);
@@ -2720,43 +2720,43 @@ void ShowMirrored(uint16 h, uint16 ofs) {
uint16 x, ofs2 = ofs;
/*move 1 line up*/
- ofs2 ^= CGA_ODD_LINES_OFS;
- if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
- ofs2 -= CGA_BYTES_PER_LINE;
+ ofs2 ^= g_vm->_line_offset;
+ if ((ofs2 & g_vm->_line_offset) != 0)
+ ofs2 -= g_vm->_screenBPL;
while (h--) {
- for (x = 0; x < CGA_BYTES_PER_LINE; x++) {
+ for (x = 0; x < g_vm->_screenBPL; x++) {
frontbuffer[ofs2 + x] = frontbuffer[ofs + x] = backbuffer[ofs + x];
backbuffer[ofs + x] = 0;
}
/*move 1 line down*/
- ofs += CGA_BYTES_PER_LINE;
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs += g_vm->_screenBPL;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
/*move 1 line up*/
- ofs2 ^= CGA_ODD_LINES_OFS;
- if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
- ofs2 -= CGA_BYTES_PER_LINE;
+ ofs2 ^= g_vm->_line_offset;
+ if ((ofs2 & g_vm->_line_offset) != 0)
+ ofs2 -= g_vm->_screenBPL;
}
}
void LiftLines(int16 n, byte *source, uint16 sofs, byte *target, uint16 tofs) {
while (n--) {
- memcpy(target + tofs, source + sofs, CGA_BYTES_PER_LINE);
+ memcpy(target + tofs, source + sofs, g_vm->_screenBPL);
- sofs += CGA_BYTES_PER_LINE;
- sofs ^= CGA_ODD_LINES_OFS;
- if ((sofs & CGA_ODD_LINES_OFS) != 0)
- sofs -= CGA_BYTES_PER_LINE;
+ sofs += g_vm->_screenBPL;
+ sofs ^= g_vm->_line_offset;
+ if ((sofs & g_vm->_line_offset) != 0)
+ sofs -= g_vm->_screenBPL;
- tofs += CGA_BYTES_PER_LINE;
- tofs ^= CGA_ODD_LINES_OFS;
- if ((tofs & CGA_ODD_LINES_OFS) != 0)
- tofs -= CGA_BYTES_PER_LINE;
+ tofs += g_vm->_screenBPL;
+ tofs ^= g_vm->_line_offset;
+ if ((tofs & g_vm->_line_offset) != 0)
+ tofs -= g_vm->_screenBPL;
}
}
@@ -2816,23 +2816,23 @@ static void AnimSaucer(void) {
ofs2 = ofs = baseofs;
/*previous line*/
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
for (i = 0; i < 55; i++) {
- memcpy(backbuffer + ofs, backbuffer + ofs2, CGA_BYTES_PER_LINE);
+ memcpy(backbuffer + ofs, backbuffer + ofs2, g_vm->_screenBPL);
/*next line*/
- ofs2 += CGA_BYTES_PER_LINE;
- ofs2 ^= CGA_ODD_LINES_OFS;
- if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
- ofs2 -= CGA_BYTES_PER_LINE;
+ ofs2 += g_vm->_screenBPL;
+ ofs2 ^= g_vm->_line_offset;
+ if ((ofs2 & g_vm->_line_offset) != 0)
+ ofs2 -= g_vm->_screenBPL;
/*previous line line*/
- ofs ^= CGA_ODD_LINES_OFS;
- if ((ofs & CGA_ODD_LINES_OFS) != 0)
- ofs -= CGA_BYTES_PER_LINE;
+ ofs ^= g_vm->_line_offset;
+ if ((ofs & g_vm->_line_offset) != 0)
+ ofs -= g_vm->_screenBPL;
}
ofs2 = cga_CalcXY(0, 200 - 1);
@@ -2840,20 +2840,20 @@ static void AnimSaucer(void) {
for (i = 0; i < 108; i++) {
LiftLines(i + 1, backbuffer, ofs, frontbuffer, ofs2);
- ofs2 ^= CGA_ODD_LINES_OFS;
- if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
- ofs2 -= CGA_BYTES_PER_LINE;
+ ofs2 ^= g_vm->_line_offset;
+ if ((ofs2 & g_vm->_line_offset) != 0)
+ ofs2 -= g_vm->_screenBPL;
waitVBlank();
waitVBlank();
}
/*wipe 56 lines*/
- memset(backbuffer + ofs2, 0, 56 / 2 * CGA_BYTES_PER_LINE);
- ofs2 ^= CGA_ODD_LINES_OFS;
- if ((ofs2 & CGA_ODD_LINES_OFS) == 0)
- ofs2 += CGA_BYTES_PER_LINE;
- memset(backbuffer + ofs2, 0, 54 / 2 * CGA_BYTES_PER_LINE);
+ memset(backbuffer + ofs2, 0, 56 / 2 * g_vm->_screenBPL);
+ ofs2 ^= g_vm->_line_offset;
+ if ((ofs2 & g_vm->_line_offset) == 0)
+ ofs2 += g_vm->_screenBPL;
+ memset(backbuffer + ofs2, 0, 54 / 2 * g_vm->_screenBPL);
for (i = 0xFFFF; i--;) ; /*TODO: weak delay*/
@@ -3412,7 +3412,7 @@ void DrawStickyNet(void) {
w = room_bounds_rect.ex - x;
h = room_bounds_rect.ey - y;
- ofs = cga_CalcXY_p(x, y);
+ ofs = CalcXY_p(x, y);
/*16x30 is the net sprite size*/
@@ -3420,7 +3420,7 @@ void DrawStickyNet(void) {
int16 i;
for (i = 0; i < w; i += 16 / 4)
drawSprite(sprite, frontbuffer, ofs + i);
- ofs += CGA_BYTES_PER_LINE * 30 / 2;
+ ofs += g_vm->_screenBPL * 30 / 2;
}
}
@@ -3527,7 +3527,7 @@ uint16 CMD_E_PsiZoneScan(void) {
IFGM_PlaySample(26);
- offs = cga_CalcXY_p(room_bounds_rect.sx, room_bounds_rect.sy);
+ offs = CalcXY_p(room_bounds_rect.sx, room_bounds_rect.sy);
w = room_bounds_rect.ex - room_bounds_rect.sx;
h = room_bounds_rect.ey - room_bounds_rect.sy;
@@ -3548,9 +3548,9 @@ uint16 CMD_E_PsiZoneScan(void) {
}
}
- offs ^= CGA_ODD_LINES_OFS;
- if ((offs & CGA_ODD_LINES_OFS) == 0)
- offs += CGA_BYTES_PER_LINE;
+ offs ^= g_vm->_line_offset;
+ if ((offs & g_vm->_line_offset) == 0)
+ offs += g_vm->_screenBPL;
}
restoreScreenOfSpecialRoom();
More information about the Scummvm-git-logs
mailing list