aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/vgagrafx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/dreamweb/vgagrafx.cpp')
-rw-r--r--engines/dreamweb/vgagrafx.cpp61
1 files changed, 57 insertions, 4 deletions
diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp
index 3c92640768..53db811313 100644
--- a/engines/dreamweb/vgagrafx.cpp
+++ b/engines/dreamweb/vgagrafx.cpp
@@ -43,6 +43,8 @@ void DreamGenContext::multiget() {
}
void DreamGenContext::multiget(uint8 *dst, uint16 x, uint16 y, uint8 w, uint8 h) {
+ assert(x < 320);
+ assert(y < 200);
const uint8 *src = workspace() + x + y * kScreenwidth;
if (y + h > 200)
h = 200 - y;
@@ -64,6 +66,8 @@ void DreamGenContext::multiput() {
}
void DreamGenContext::multiput(const uint8 *src, uint16 x, uint16 y, uint8 w, uint8 h) {
+ assert(x < 320);
+ assert(y < 200);
uint8 *dst = workspace() + x + y * kScreenwidth;
if (y + h > 200)
h = 200 - y;
@@ -150,11 +154,10 @@ void DreamGenContext::frameoutfx(uint8 *dst, const uint8 *src, uint16 pitch, uin
void DreamGenContext::doshake() {
uint8 &counter = data.byte(kShakecounter);
- _cmp(counter, 48);
- if (flags.z())
+ if (counter == 48)
return;
- _add(counter, 1);
+ ++counter;
static const int shakeTable[] = {
0, -2, 3, -2, 0, 2, 4, -1,
1, -3, 3, 2, 0, -2, 3, -2,
@@ -282,11 +285,23 @@ void DreamGenContext::showpcx() {
pcxFile.close();
}
-void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) {
+void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, int16 x, int16 y) {
// NB : These resilience checks were not in the original engine, but did they result in undefined behaviour
// or was something broken during porting to C++?
assert(pitch == 320);
+ if(x < 0) {
+ assert(width >= -x);
+ width -= -x;
+ src += -x;
+ x = 0;
+ }
+ if(y < 0) {
+ assert(height >= -y);
+ height -= -y;
+ src += (-y) * width;
+ y = 0;
+ }
if(x >= 320)
return;
if(y >= 200)
@@ -411,5 +426,43 @@ void DreamGenContext::zoom() {
data.byte(kDidzoom) = 1;
}
+void DreamGenContext::paneltomap() {
+ multiget(segRef(data.word(kMapstore)).ptr(0, 0), data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
+}
+
+void DreamGenContext::maptopanel() {
+ multiput(segRef(data.word(kMapstore)).ptr(0, 0), data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
+}
+
+void DreamGenContext::dumpmap() {
+ multidump(data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
+}
+
+void DreamGenContext::transferinv() {
+ const Frame *freeFrames = (const Frame *)segRef(data.word(kFreeframes)).ptr(kFrframedata, 0);
+ const Frame *freeFrame = freeFrames + (3 * data.byte(kItemtotran) + 1);
+ Frame *exFrames = (Frame *)segRef(data.word(kExtras)).ptr(kExframedata, 0);
+ Frame *exFrame = exFrames + (3 * data.byte(kExpos) + 1);
+ exFrame->width = freeFrame->width;
+ exFrame->height = freeFrame->height;
+ exFrame->x = freeFrame->x;
+ exFrame->y = freeFrame->y;
+ uint16 byteCount = freeFrame->width * freeFrame->height;
+ const uint8 *src = segRef(data.word(kFreeframes)).ptr(kFrframes + freeFrame->ptr(), byteCount);
+ uint8 *dst = segRef(data.word(kExtras)).ptr(kExframes + data.word(kExframepos), byteCount);
+ memcpy(dst, src, byteCount);
+ exFrame->setPtr(data.word(kExframepos));
+ data.word(kExframepos) += byteCount;
+}
+
+bool DreamGenContext::pixelcheckset(const ObjPos *pos, uint8 x, uint8 y) {
+ x -= pos->xMin;
+ y -= pos->yMin;
+ SetObject *setObject = getsetad(pos->index);
+ Frame *frame = (Frame *)segRef(data.word(kSetframes)).ptr(kFramedata, 0) + setObject->index;
+ const uint8 *ptr = segRef(data.word(kSetframes)).ptr(kFrames, 0) + frame->ptr() + y * frame->width + x;
+ return *ptr != 0;
+}
+
} /*namespace dreamgen */