aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Mettifogo2007-12-15 20:56:05 +0000
committerNicola Mettifogo2007-12-15 20:56:05 +0000
commitd632206248f2910afe6a9628d82c08e5b180fd6b (patch)
treea3d9aeead84f51a94494253c87148a2d1c4ce99e
parent3dd11b260b49aa524897eaff1c7eeca1b20886cb (diff)
downloadscummvm-rg350-d632206248f2910afe6a9628d82c08e5b180fd6b.tar.gz
scummvm-rg350-d632206248f2910afe6a9628d82c08e5b180fd6b.tar.bz2
scummvm-rg350-d632206248f2910afe6a9628d82c08e5b180fd6b.zip
Added halfbrite effect to Nippon Safes Amiga. Implementation is not complete, since the spotlight during Donna's dance is not moving yet.
svn-id: r29863
-rw-r--r--engines/parallaction/callables_ns.cpp44
-rw-r--r--engines/parallaction/graphics.cpp73
-rw-r--r--engines/parallaction/graphics.h5
3 files changed, 83 insertions, 39 deletions
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp
index 9de1dbb14b..f4ef310b09 100644
--- a/engines/parallaction/callables_ns.cpp
+++ b/engines/parallaction/callables_ns.cpp
@@ -620,21 +620,17 @@ void Parallaction_ns::_c_shade(void *parm) {
}
void Parallaction_ns::_c_projector(void*) {
-#ifdef HALFBRITE
static int dword_16032 = 0;
-// Bitmap bm;
-// InitBitMap(&bm);
-
- if (dword_16032 != 0) {
-/* // keep drawing spotlight in its final place
- _gfx->flatBlitCnv(&scnv, 110, 25, Gfx::kBitFront);
- BltBitMap(&bm, 0, 0, &_screen._bitMap, 110, 25, a3->??, a3->??, 0x20, 0x20);
-*/ return;
- }
+ _gfx->setHalfbriteMode(true);
- _gfx->setHalfbriteMode(true);
-/*
+// if (dword_16032 != 0) {
+ // keep drawing spotlight in its final place
+ _gfx->setProjectorPos(110, 25);
+ printf("FIXED: %i, %i\n", 110, 25);
+ return;
+// }
+#ifdef HALFBRITE
// move spot light around the stage
int d7, d6;
for (d7 = 0; d7 < 150; d7++) {
@@ -647,7 +643,7 @@ void Parallaction_ns::_c_projector(void*) {
d1 >>= 1;
d6 = 50 - d1;
} else {
- int d1 = d7 / 100;
+ int d1 = d7 % 100;
if (d1 < 0)
d1++;
@@ -655,36 +651,28 @@ void Parallaction_ns::_c_projector(void*) {
d6 = d1;
}
- BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+20, d6, a3->??, a3->??, 0x20, 0x20);
- sub_1590C(d6 + a3->??);
- BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+20, d6, a3->??, a3->??, 0xFA, 0x20);
+ printf("%i, %i, ", d7+20, d6);
+// BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+20, d6, a3->??, a3->??, 0x20, 0x20);
}
for (d7 = 50; d7 > -10; d7--) {
- BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+120, d6, a3->??, a3->??, 0x20, 0x20);
- sub_1590C(d6 + a3->??);
- BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+120, d6, a3->??, a3->??, 0xFA, 0x20);
+ printf("%i, %i, ", d7+120, d6);
+// BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+120, d6, a3->??, a3->??, 0x20, 0x20);
}
- BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+120, d6, a3->??, a3->??, 0x20, 0x20);
- _gfx->flatBlitCnv(&scnv, d7+120, d6, Gfx::kBitFront);
-*/
-
+ printf("%i, %i\n", d7+120, d6);
+// BltBitMap(&bm, 0, 0, &_screen._bitMap, d7+120, d6, a3->??, a3->??, 0x20, 0x20);
+#endif
dword_16032 = 1;
return;
-#endif
}
void Parallaction_ns::_c_HBOff(void*) {
-#ifdef HALFBRITE
_gfx->setHalfbriteMode(false);
-#endif
}
void Parallaction_ns::_c_HBOn(void*) {
-#ifdef HALFBRITE
_gfx->setHalfbriteMode(true);
-#endif
}
diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp
index 41f818a8a8..5b1c292ead 100644
--- a/engines/parallaction/graphics.cpp
+++ b/engines/parallaction/graphics.cpp
@@ -25,6 +25,7 @@
#include "common/system.h"
#include "common/file.h"
+#include "graphics/primitives.h"
#include "parallaction/parallaction.h"
@@ -32,6 +33,40 @@
namespace Parallaction {
+void halfbritePixel(int x, int y, int color, void *data) {
+ byte *buffer = (byte*)data;
+ buffer[x + y * _vm->_screenWidth] &= ~0x20;
+}
+
+void drawCircleLine(int xCenter, int yCenter, int x, int y, int color, void (*plotProc)(int, int, int, void *), void *data){
+ Graphics::drawLine(xCenter + x, yCenter + y, xCenter - x, yCenter + y, color, plotProc, data);
+ Graphics::drawLine(xCenter + x, yCenter - y, xCenter - x, yCenter - y, color, plotProc, data);
+ Graphics::drawLine(xCenter + y, yCenter + x, xCenter - y, yCenter + x, color, plotProc, data);
+ Graphics::drawLine(xCenter + y, yCenter - x, xCenter - y, yCenter - x, color, plotProc, data);
+}
+
+void drawCircle(int xCenter, int yCenter, int radius, int color, void (*plotProc)(int, int, int, void *), void *data) {
+ int x = 0;
+ int y = radius;
+ int p = 1 - radius;
+
+ /* Plot first set of points */
+ drawCircleLine(xCenter, yCenter, x, y, color, plotProc, data);
+
+ while (x < y) {
+ x++;
+ if (p < 0)
+ p += 2*x + 1;
+ else {
+ y--;
+ p += 2 * (x-y) + 1;
+ }
+ drawCircleLine(xCenter, yCenter, x, y, color, plotProc, data);
+ }
+}
+
+
+
Palette::Palette() {
@@ -110,7 +145,7 @@ void Palette::fadeTo(const Palette& target, uint step) {
uint Palette::fillRGBA(byte *rgba) {
byte r, g, b;
- byte *hbPal = rgba + _size;
+ byte *hbPal = rgba + _colors * 4;
for (uint32 i = 0; i < _colors; i++) {
r = (_data[i*3] << 2) | (_data[i*3] >> 4);
@@ -269,22 +304,24 @@ void Gfx::animatePalette() {
void Gfx::setHalfbriteMode(bool enable) {
-#ifdef HALFBRITE
if (_vm->getPlatform() != Common::kPlatformAmiga) return;
if (enable == _halfbrite) return;
- byte *buf = _buffers[kBitBack];
- for (uint32 i = 0; i < SCREEN_SIZE; i++)
- *buf++ ^= 0x20;
+ _halfbrite = !_halfbrite;
- buf = _buffers[kBitFront];
- for (uint32 i = 0; i < SCREEN_SIZE; i++)
- *buf++ ^= 0x20;
+ if (!enable) {
+ _hbCircleRadius = 0;
+ }
+}
- _halfbrite = !_halfbrite;
-#endif
+#define HALFBRITE_CIRCLE_RADIUS 48
+void Gfx::setProjectorPos(int x, int y) {
+ _hbCircleRadius = HALFBRITE_CIRCLE_RADIUS;
+ _hbCirclePos.x = x + _hbCircleRadius;
+ _hbCirclePos.y = y + _hbCircleRadius;
}
+
void Gfx::drawInventory() {
if ((_engineFlags & kEngineInventory) == 0) {
@@ -325,7 +362,20 @@ void Gfx::drawBalloons() {
}
void Gfx::updateScreen() {
- g_system->copyRectToScreen((const byte*)_buffers[kBitFront]->pixels, _buffers[kBitFront]->pitch, _screenX, _screenY, _vm->_screenWidth, _vm->_screenHeight);
+ if (_halfbrite) {
+ Graphics::Surface *surf = g_system->lockScreen();
+ byte *src = (byte*)_buffers[kBitFront]->pixels;
+ byte *dst = (byte*)surf->pixels;
+ for (int i = 0; i < surf->w*surf->h; i++) {
+ *dst++ = *src++ | 0x20;
+ }
+ if (_hbCircleRadius > 0) {
+ drawCircle(_hbCirclePos.x, _hbCirclePos.y, _hbCircleRadius, 0, &halfbritePixel, surf->pixels);
+ }
+ g_system->unlockScreen();
+ } else {
+ g_system->copyRectToScreen((const byte*)_buffers[kBitFront]->pixels, _buffers[kBitFront]->pitch, _screenX, _screenY, _vm->_screenWidth, _vm->_screenHeight);
+ }
drawInventory();
@@ -854,6 +904,7 @@ Gfx::Gfx(Parallaction* vm) :
memset(_palettefx, 0, sizeof(_palettefx));
_halfbrite = false;
+ _hbCircleRadius = 0;
_font = NULL;
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index 7eacff4f5d..a165a08fab 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -283,6 +283,7 @@ public:
// amiga specific
void setHalfbriteMode(bool enable);
+ void setProjectorPos(int x, int y);
// misc
int16 queryMask(int16 v);
@@ -315,6 +316,10 @@ protected:
Font *_font;
bool _halfbrite;
+ Common::Point _hbCirclePos;
+ int _hbCircleRadius;
+
+
protected:
struct Balloon {
uint16 x;