aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruruk2013-08-11 00:21:15 +0200
committeruruk2013-08-11 00:21:15 +0200
commita41736e698f31364219c8d904342a8fcff8d16d0 (patch)
tree89a98a0ed14d2496079bf5f0b815883d4e18852f
parent288abffafa889de25766f6c12c74a6d613c3b3bc (diff)
downloadscummvm-rg350-a41736e698f31364219c8d904342a8fcff8d16d0.tar.gz
scummvm-rg350-a41736e698f31364219c8d904342a8fcff8d16d0.tar.bz2
scummvm-rg350-a41736e698f31364219c8d904342a8fcff8d16d0.zip
AVALANCHE: Introduce Graphics::drawTriangle(), use it in Scrolls::bubble(). Modify Graphics::drawPieSlice(), update functions using it accordingly.
-rw-r--r--engines/avalanche/graphics.cpp39
-rw-r--r--engines/avalanche/graphics.h3
-rw-r--r--engines/avalanche/scrolls2.cpp109
3 files changed, 143 insertions, 8 deletions
diff --git a/engines/avalanche/graphics.cpp b/engines/avalanche/graphics.cpp
index d6e1eac612..aa341f383e 100644
--- a/engines/avalanche/graphics.cpp
+++ b/engines/avalanche/graphics.cpp
@@ -208,9 +208,46 @@ Common::Point Graphics::drawArc(const ::Graphics::Surface &surface, int16 x, int
void Graphics::drawPieSlice(const ::Graphics::Surface &surface, int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, byte color) {
while (radius > 0)
drawArc(surface, x, y, stAngle, endAngle, radius--, color);
- *(byte *)surface.getBasePtr(x + 1, y) = color;
}
+void Graphics::drawTriangle(const ::Graphics::Surface &surface, Common::Point *p, byte color) {
+ // Draw the borders with a marking color.
+ _scrolls.drawLine(p[0].x, p[0].y, p[1].x, p[1].y, 255);
+ _scrolls.drawLine(p[1].x, p[1].y, p[2].x, p[2].y, 255);
+ _scrolls.drawLine(p[2].x, p[2].y, p[0].x, p[0].y, 255);
+
+ // Get the top and the bottom of the triangle.
+ uint16 maxY = p[0].y, minY = p[0].y;
+ for (byte i = 1; i < 3; i++) {
+ if (p[i].y < minY)
+ minY = p[i].y;
+ if (p[i].y > maxY)
+ maxY = p[i].y;
+ }
+
+ // Fill the triangle.
+ for (uint16 y = minY; y <= maxY; y++) {
+ uint16 x = 0;
+ while (*(byte *)_scrolls.getBasePtr(x, y) != 255)
+ x++;
+ uint16 minX = x;
+ uint16 maxX = x;
+ x++;
+ while ((*(byte *)_scrolls.getBasePtr(x, y) != 255) && (x != 639))
+ x++;
+ if (x != 639)
+ maxX = x;
+ if (minX != maxX)
+ _scrolls.drawLine(minX, y, maxX, y, color);
+ }
+
+ // Redraw the borders with the actual color.
+ _scrolls.drawLine(p[0].x, p[0].y, p[1].x, p[1].y, color);
+ _scrolls.drawLine(p[1].x, p[1].y, p[2].x, p[2].y, color);
+ _scrolls.drawLine(p[2].x, p[2].y, p[0].x, p[0].y, color);
+}
+
+
::Graphics::Surface Graphics::loadPictureGraphic(Common::File &file) {
diff --git a/engines/avalanche/graphics.h b/engines/avalanche/graphics.h
index e371651dc1..787eb6ded3 100644
--- a/engines/avalanche/graphics.h
+++ b/engines/avalanche/graphics.h
@@ -95,6 +95,9 @@ public:
void drawPieSlice(const ::Graphics::Surface &surface, int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, byte color);
+ void drawTriangle(const ::Graphics::Surface &surface, Common::Point *p, byte color);
+
+
// The caller has to .free() the returned Surfaces!!!
::Graphics::Surface loadPictureGraphic(Common::File &file); // Reads Graphic-planar EGA data.
diff --git a/engines/avalanche/scrolls2.cpp b/engines/avalanche/scrolls2.cpp
index 556658c5b6..8a95d44887 100644
--- a/engines/avalanche/scrolls2.cpp
+++ b/engines/avalanche/scrolls2.cpp
@@ -375,8 +375,8 @@ void Scrolls::drawscroll(func2 gotoit) { // This is one of the oldest procs in t
// The body of the scroll.
_vm->_graphics->_scrolls.fillRect(Common::Rect(mx - lx - 30, my + ly, mx + lx, my + ly + 6), lightgray);
- _vm->_graphics->_scrolls.fillRect(Common::Rect(mx - lx - 30, my - ly - 6, mx + lx, my - ly), lightgray);
- _vm->_graphics->_scrolls.fillRect(Common::Rect(mx - lx - 15, my - ly, mx + lx + 15, my + ly), lightgray);
+ _vm->_graphics->_scrolls.fillRect(Common::Rect(mx - lx - 30, my - ly - 6, mx + lx, my - ly + 1), lightgray);
+ _vm->_graphics->_scrolls.fillRect(Common::Rect(mx - lx - 15, my - ly, mx + lx + 15, my + ly + 1), lightgray);
// The left corners of the scroll.
_vm->_graphics->drawPieSlice(_vm->_graphics->_scrolls, mx - lx - 31, my - ly, 0, 180, 15, darkgray);
@@ -485,6 +485,101 @@ void Scrolls::drawscroll(func2 gotoit) { // This is one of the oldest procs in t
}
void Scrolls::bubble(func2 gotoit) {
+ int16 xl, yl, my, xw, yw;
+ byte fv;
+ Common::Point p[3];
+ byte *rp1, *rp2; /* replace: 1=bubble, 2=pointer */
+ int16 xc; /* x correction */
+
+ /*setvisualpage(cp);
+ setactivepage(1 - cp);*/
+ _vm->_gyro->oncandopageswap = false; /* On can now no longer swap pages. So we can do what we want without its interference! */
+ //mousepage(1 - cp); /* Mousepage */
+
+ //setfillstyle(1, talkb);
+ //setcolor(talkb);
+ _vm->_gyro->off();
+
+ xl = 0;
+ yl = _vm->_gyro->scrolln * 5;
+ for (int8 fv = 0; fv < _vm->_gyro->scrolln; fv++) {
+ uint16 textWidth = _vm->_gyro->scroll[fv].size() * 8;
+ if (textWidth > xl)
+ xl = textWidth;
+ }
+ xl = xl / 2;
+
+ xw = xl + 18;
+ yw = yl + 7;
+ my = yw * 2 - 2;
+ xc = 0;
+
+ if ((_vm->_gyro->talkx - xw) < 0)
+ xc = -(_vm->_gyro->talkx - xw);
+ if ((_vm->_gyro->talkx + xw) > 639)
+ xc = 639 - (_vm->_gyro->talkx + xw);
+
+ p[0].x = _vm->_gyro->talkx - 10;
+ p[0].y = yw;
+ p[1].x = _vm->_gyro->talkx + 10;
+ p[1].y = yw;
+ p[2].x = _vm->_gyro->talkx;
+ p[2].y = _vm->_gyro->talky;
+
+ /* mblit(talkx-xw+xc,7,talkx+xw+xc,my,0,3);
+ mblit(talkx-10,my,talkx+10,talky,0,3);*/
+
+ _vm->_graphics->_scrolls.copyFrom(_vm->_graphics->_surface);
+
+ // The body of the bubble.
+ _vm->_graphics->_scrolls.fillRect(Common::Rect(xc + _vm->_gyro->talkx - xw + 9, 7, _vm->_gyro->talkx + xw - 8 + xc, my + 1), _vm->_gyro->talkb);
+ _vm->_graphics->_scrolls.fillRect(Common::Rect(xc + _vm->_gyro->talkx - xw - 1, 12, _vm->_gyro->talkx + xw + xc + 2, my - 4), _vm->_gyro->talkb);
+
+ // Top right corner of the bubble.
+ _vm->_graphics->drawPieSlice(_vm->_graphics->_scrolls, xc + _vm->_gyro->talkx + xw - 10, 11, 0, 90, 9, _vm->_gyro->talkb);
+ // Bottom right corner of the bubble.
+ _vm->_graphics->drawPieSlice(_vm->_graphics->_scrolls, xc + _vm->_gyro->talkx + xw - 10, my - 4, 270, 360, 9, _vm->_gyro->talkb);
+ // Top left corner of the bubble.
+ _vm->_graphics->drawPieSlice(_vm->_graphics->_scrolls, xc + _vm->_gyro->talkx - xw + 10, 11, 90, 180, 9, _vm->_gyro->talkb);
+ // Bottom left corner of the bubble.
+ _vm->_graphics->drawPieSlice(_vm->_graphics->_scrolls, xc + _vm->_gyro->talkx - xw + 10, my - 4, 180, 270, 9, _vm->_gyro->talkb);
+
+ // "Tail" of the speech bubble.
+ _vm->_graphics->drawTriangle(_vm->_graphics->_scrolls, p, _vm->_gyro->talkb);
+
+ //setcolor(talkf);
+ yl -= 3;
+ //settextjustify(1, 2);
+ /*for (fv = 0; fv < _vm->_gyro->scrolln; fv++)
+ outtextxy(_vm->_gyro->talkx + xc, (fv * 10) + 12, _vm->_gyro->scroll[fv + 1]);*/
+
+ for (fv = 0; fv < _vm->_gyro->scrolln; fv++) /* These should be separate loops. */
+ _vm->_logger->log_bubbleline(fv, param, _vm->_gyro->scroll[fv]);
+
+ _vm->_logger->log_divider();
+
+ //setvisualpage(1 - cp);
+ dingdongbell();
+ _vm->_gyro->oncandopageswap = false;
+ _vm->_gyro->on();
+ _vm->_gyro->dropsok = false;
+
+ (this->*gotoit)();
+
+ _vm->_gyro->off();
+ _vm->_gyro->dropsok = true;
+ /*mblit((talkx - xw + xc) / 8, 7, 1 + (talkx + xw + xc) / 8, my, 3, 1 - cp);
+ mblit((talkx - 10) / 8, my, 1 + (talkx + 10) / 8, talky, 3, 1 - cp);
+ blitfix();*/
+
+ /*setvisualpage(cp);
+ settextjustify(0, 0);*/
+ _vm->_gyro->on(); /*sink;*/
+ _vm->_gyro->oncandopageswap = true;
+ resetscrolldriver();
+ if (_vm->_gyro->mpress > 0)
+ _vm->_gyro->after_the_scroll = true;
+
warning("STUB: Scrolls::bubble()");
}
@@ -629,7 +724,7 @@ void Scrolls::calldrivers() {
if (param == 0)
natural();
else if ((1 <= param) && (param <= 9))
- if ((param > _vm->_trip->numtr) || (!_vm->_trip->tr[param].quick)) { // Not valid.
+ if ((param > _vm->_trip->numtr) || (!_vm->_trip->tr[param - 1].quick)) { // Not valid.
_vm->_lucerna->errorled();
natural();
} else
@@ -638,11 +733,11 @@ void Scrolls::calldrivers() {
/* Quasi-peds. (This routine performs the same
thing with QPs as triptype.chatter does with the
sprites.) */
- _vm->_gyro->talkx = _vm->_gyro->peds[_vm->_gyro->quasipeds[param].whichped].x;
- _vm->_gyro->talky = _vm->_gyro->peds[_vm->_gyro->quasipeds[param].whichped].y; // Position.
+ _vm->_gyro->talkx = _vm->_gyro->peds[_vm->_gyro->quasipeds[param - 10].whichped - 1].x;
+ _vm->_gyro->talky = _vm->_gyro->peds[_vm->_gyro->quasipeds[param - 10].whichped - 1].y; // Position.
- _vm->_gyro->talkf = _vm->_gyro->quasipeds[param].fgc;
- _vm->_gyro->talkb = _vm->_gyro->quasipeds[param].bgc; // Colours.
+ _vm->_gyro->talkf = _vm->_gyro->quasipeds[param - 10].fgc;
+ _vm->_gyro->talkb = _vm->_gyro->quasipeds[param - 10].bgc; // Colours.
} else {
_vm->_lucerna->errorled(); // Not valid.
natural();