aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/script_v80he.cpp122
1 files changed, 54 insertions, 68 deletions
diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp
index 99d8e8e337..ac55b75ff8 100644
--- a/scumm/script_v80he.cpp
+++ b/scumm/script_v80he.cpp
@@ -613,118 +613,104 @@ void ScummEngine_v80he::o80_drawWizPolygon() {
displayWizImage(&wi);
}
-void ScummEngine_v80he::drawLine(int x1, int y1, int x, int y, int unk2, int type, int id) {
- debug(0,"drawLine: x1 %d y1 %d x %d y %d, unk2 %d type %d id %d", x1, y1, x, y, unk2, type, id);
-
- int eax, ebx, ecx, edp, esi, edx;
- int var_C;
-
- ebx = 0;
- var_C = 0;
+/**
+ * Draw a 'line' between two points.
+ *
+ * @param x1 the starting x coordinate
+ * @param y1 the starting y coordinate
+ * @param x the ending x coordinate
+ * @param y the ending y coordinate
+ * @param step the step size used to render the line, only ever 'step'th point is drawn
+ * @param type the line type -- points are rendered by drawing actors (type == 2),
+ * wiz images (type == 3), or pixels (any other type)
+ * @param id the (optional) id of an actor or wizimage
+ */
+void ScummEngine_v80he::drawLine(int x1, int y1, int x, int y, int step, int type, int id) {
+ debug(0,"drawLine: x1 %d y1 %d x %d y %d, step %d type %d id %d", x1, y1, x, y, step, type, id);
- if (unk2 < 0) {
- unk2 = -unk2;
+ if (step < 0) {
+ step = -step;
}
- if (unk2 == 0) {
- unk2 = 1;
+ if (step == 0) {
+ step = 1;
}
- eax = x;
- ecx = x1;
- int edi = y1;
-
const int dx = x - x1;
const int dy = y - y1;
- edp = ABS(dx);
- eax = ABS(dy);
+ const int absDX = ABS(dx);
+ const int absDY = ABS(dy);
- if (eax > edp) {
- esi = eax;
- } else {
- esi = edp;
- }
+ const int maxDist = MAX(absDX, absDY);
- y1 = eax;
+ y = y1;
x = x1;
- x1 = 0;
+
+ const int tmpA = absDY;
+ int tmbB = 0;
if (type == 2) {
Actor *a = derefActor(id, "drawLine");
- a->drawActorToBackBuf(ecx, edi);
+ a->drawActorToBackBuf(x, y);
} else if (type == 3) {
WizImage wi;
wi.flags = 0;
- wi.y1 = edi;
- wi.x1 = ecx;
+ wi.y1 = y;
+ wi.x1 = x;
wi.resNum = id;
wi.state = 0;
displayWizImage(&wi);
} else {
- drawPixel(ecx, edi, id);
+ drawPixel(x, y, id);
}
- for (int i = 0; i <= esi; i++) {
- ecx = x1;
- eax = y1;
- ebx += edp;
- ecx += eax;
-
- eax ^= eax;
- x1 = ecx;
+ int var_C = 0;
+ int ebx = 0;
+ for (int i = 0; i <= maxDist; i++) {
+ ebx += absDX;
+ tmbB += tmpA;
- if (ebx > esi) {
- edx = dx;
- edx -= esi;
+ int eax = 0;
+ if (ebx > maxDist) {
eax = 1;
- int tmp = edx;
- edx = x;
- if (tmp >= 0) {
- edx++;
+ if (dx >= maxDist) {
+ x++;
} else {
- edx--;
+ x--;
}
-
- x = edx;
}
- if (ecx > esi) {
+ if (tmbB > maxDist) {
eax = dy;
- ecx -= esi;
+ tmbB -= maxDist;
- x1 = ecx;
- if (eax >= 0) {
- edi++;
+ if (dy >= 0) {
+ y++;
} else {
- edi--;
+ y--;
}
}
if (eax == 0)
continue;
- ecx = var_C;
- eax = ecx;
- edx = eax % unk2;
- ecx++;
- var_C = ecx;
-
- if (edx != 0 && esi != i)
+ var_C++;
+ if (((var_C - 1) % step) != 0 && maxDist != i)
continue;
if (type == 2) {
Actor *a = derefActor(id, "drawLine");
- a->drawActorToBackBuf(x, edi);
+ a->drawActorToBackBuf(x, y);
} else if (type == 3) {
WizImage wi;
wi.flags = 0;
- wi.y1 = edi;
+ wi.y1 = y;
wi.x1 = x;
wi.resNum = id;
wi.state = 0;
displayWizImage(&wi);
} else {
- drawPixel(x, edi, id);
+ drawPixel(x, y, id);
}
}
}
@@ -763,9 +749,9 @@ void ScummEngine_v80he::drawPixel(int x, int y, int flags) {
}
void ScummEngine_v80he::o80_drawLine() {
- int id, unk2, x, y, x1, y1;
+ int id, step, x, y, x1, y1;
- unk2 = pop();
+ step = pop();
id = pop();
y = pop();
x = pop();
@@ -776,13 +762,13 @@ void ScummEngine_v80he::o80_drawLine() {
switch (subOp) {
case 55:
- drawLine(x1, y1, x, y, unk2, 2, id);
+ drawLine(x1, y1, x, y, step, 2, id);
break;
case 63:
- drawLine(x1, y1, x, y, unk2, 3, id);
+ drawLine(x1, y1, x, y, step, 3, id);
break;
case 66:
- drawLine(x1, y1, x, y, unk2, 1, id);
+ drawLine(x1, y1, x, y, step, 1, id);
break;
default:
error("o80_drawLine: default case %d", subOp);