aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorNipun Garg2019-07-05 04:09:38 +0530
committerEugene Sandulenko2019-09-03 17:17:12 +0200
commitde017b0ce96b85a1e30c7c8d49e5399712d9c3d1 (patch)
treec9b4e281f923d02fe128f2f64e61fe2e2b86f1d2 /engines
parentc3f409d0c959472d6c158ee17c91ce1e77945dba (diff)
downloadscummvm-rg350-de017b0ce96b85a1e30c7c8d49e5399712d9c3d1.tar.gz
scummvm-rg350-de017b0ce96b85a1e30c7c8d49e5399712d9c3d1.tar.bz2
scummvm-rg350-de017b0ce96b85a1e30c7c8d49e5399712d9c3d1.zip
HDB: Add PanicZone data and functions
Diffstat (limited to 'engines')
-rw-r--r--engines/hdb/gfx.cpp4
-rw-r--r--engines/hdb/gfx.h2
-rw-r--r--engines/hdb/window.cpp127
-rw-r--r--engines/hdb/window.h50
4 files changed, 177 insertions, 6 deletions
diff --git a/engines/hdb/gfx.cpp b/engines/hdb/gfx.cpp
index 6c14f57f63..d4315a060c 100644
--- a/engines/hdb/gfx.cpp
+++ b/engines/hdb/gfx.cpp
@@ -721,9 +721,9 @@ Graphics::Surface Picture::load(Common::SeekableReadStream *stream) {
uint16 *ptr;
- for (uint y = 0; y < _height; y++) {
+ for (int y = 0; y < _height; y++) {
ptr = (uint16 *)_surface.getBasePtr(0, y);
- for (uint x = 0; x < _width; x++) {
+ for (int x = 0; x < _width; x++) {
*ptr = TO_LE_16(stream->readUint16LE());
ptr++;
}
diff --git a/engines/hdb/gfx.h b/engines/hdb/gfx.h
index 83af1e49da..ae7927debc 100644
--- a/engines/hdb/gfx.h
+++ b/engines/hdb/gfx.h
@@ -221,7 +221,7 @@ public:
int drawMasked(int x, int y);
void free();
- uint _width, _height;
+ int _width, _height;
char *getName() { return _name; }
diff --git a/engines/hdb/window.cpp b/engines/hdb/window.cpp
index 71e16e9f82..d78ea00d62 100644
--- a/engines/hdb/window.cpp
+++ b/engines/hdb/window.cpp
@@ -109,7 +109,7 @@ void Window::drawPause() {
_gfxPausePlaque->drawMasked(480 / 2 - _gfxPausePlaque->_width / 2, kPauseY);
}
-void Window::checkPause(uint x, uint y) {
+void Window::checkPause(int x, int y) {
if (x >= 480 / 2 - _gfxPausePlaque->_width / 2 && 480 / 2 + _gfxPausePlaque->_width / 2 > x && y >= kPauseY && y < kPauseY + _gfxPausePlaque->_height) {
g_hdb->togglePause();
g_hdb->_sound->playSound(SND_POP);
@@ -882,6 +882,131 @@ void Window::checkDlvSelect(int x, int y) {
}
}
+void Window::loadPanicZoneGfx() {
+ _pzInfo.gfxPanic = g_hdb->_gfx->loadPic(PANIC_PANIC);
+ _pzInfo.gfxZone = g_hdb->_gfx->loadPic(PANIC_ZONE);
+ _pzInfo.gfxFace[0] = g_hdb->_gfx->loadPic(PANIC_POINTER1);
+ _pzInfo.gfxFace[1] = g_hdb->_gfx->loadPic(PANIC_POINTER2);
+ _pzInfo.gfxNumber[0] = g_hdb->_gfx->loadPic(PANIC_NUM0);
+ _pzInfo.gfxNumber[1] = g_hdb->_gfx->loadPic(PANIC_NUM1);
+ _pzInfo.gfxNumber[2] = g_hdb->_gfx->loadPic(PANIC_NUM2);
+ _pzInfo.gfxNumber[3] = g_hdb->_gfx->loadPic(PANIC_NUM3);
+ _pzInfo.gfxNumber[4] = g_hdb->_gfx->loadPic(PANIC_NUM4);
+ _pzInfo.gfxNumber[5] = g_hdb->_gfx->loadPic(PANIC_NUM5);
+ _pzInfo.gfxNumber[6] = g_hdb->_gfx->loadPic(PANIC_NUM6);
+ _pzInfo.gfxNumber[7] = g_hdb->_gfx->loadPic(PANIC_NUM7);
+ _pzInfo.gfxNumber[8] = g_hdb->_gfx->loadPic(PANIC_NUM8);
+ _pzInfo.gfxNumber[9] = g_hdb->_gfx->loadPic(PANIC_NUM9);
+}
+
+void Window::drawPanicZone() {
+ int xx, yy;
+
+ if (!_pzInfo.active)
+ return;
+
+ switch (_pzInfo.sequence) {
+ // Wait before displaying PANIC ZONE
+ case PANICZONE_TIMER:
+ _pzInfo.timer--;
+ if (!_pzInfo.timer) {
+ _pzInfo.sequence++;
+ g_hdb->_sound->playSound(SND_PANIC);
+ }
+ break;
+
+ // Move PANIC ZONE to screen center
+ case PANICZONE_START:
+ xx = g_hdb->_rnd->getRandomNumber(10) - 5;
+ yy = g_hdb->_rnd->getRandomNumber(10) - 5;
+ _pzInfo.x1 += _pzInfo.xv;
+ _pzInfo.y1++;
+ _pzInfo.x2 += _pzInfo.yv;
+ _pzInfo.y2--;
+ if (_pzInfo.x1 > kPanicXStop) {
+ _pzInfo.timer = 30;
+ _pzInfo.sequence++;
+ }
+ _pzInfo.gfxPanic->drawMasked(_pzInfo.x1 + xx, _pzInfo.y1 + yy);
+ _pzInfo.gfxZone->drawMasked(_pzInfo.x2 + yy, _pzInfo.y2 + xx);
+ break;
+
+ case PANICZONE_TITLESTOP:
+ xx = g_hdb->_rnd->getRandomNumber(10) - 5;
+ yy = g_hdb->_rnd->getRandomNumber(10) - 5;
+ _pzInfo.gfxPanic->drawMasked(_pzInfo.x1 + xx, _pzInfo.y1 + yy);
+ _pzInfo.gfxZone->drawMasked(_pzInfo.x2 + yy, _pzInfo.y2 + xx);
+ _pzInfo.timer--;
+ if (!_pzInfo.timer) {
+ _pzInfo.sequence++;
+ }
+ break;
+
+ case PANICZONE_BLASTOFF:
+ xx = g_hdb->_rnd->getRandomNumber(10) - 5;
+ yy = g_hdb->_rnd->getRandomNumber(10) - 5;
+ _pzInfo.y1 -= 10;
+ _pzInfo.y2 += 10;
+ _pzInfo.gfxPanic->drawMasked(_pzInfo.x1 + xx, _pzInfo.y1 + yy);
+ _pzInfo.gfxZone->drawMasked(_pzInfo.x2 + yy, _pzInfo.y2 + xx);
+ if (_pzInfo.y1 < -_pzInfo.gfxPanic->_height &&
+ _pzInfo.y2 > kScreenHeight) {
+ g_hdb->_sound->playSound(SND_PANIC_COUNT);
+ _pzInfo.sequence++;
+ _pzInfo.timer = 30 + g_hdb->getTime();
+ }
+ break;
+
+ case PANICZONE_COUNTDOWN:
+ {
+ static int last_seconds = 0, seconds = 0;
+ _pzInfo.gfxFace[seconds & 1]->drawMasked(kPanicZoneFaceX, kPanicZoneFaceY);
+
+ // make knocking timer sound
+ if (last_seconds != seconds)
+ g_hdb->_sound->playSound(SND_PANIC_COUNT);
+
+ last_seconds = seconds;
+ seconds = _pzInfo.timer - g_hdb->getTime();
+ if (seconds >= 10) {
+ _pzInfo.gfxNumber[seconds / 10]->drawMasked(kPanicZoneFaceX, kPanicZoneFaceY + 32);
+ _pzInfo.gfxNumber[seconds % 10]->drawMasked(kPanicZoneFaceX + 16, kPanicZoneFaceY + 32);
+ } else
+ _pzInfo.gfxNumber[seconds]->drawMasked(kPanicZoneFaceX + 8, kPanicZoneFaceY + 32);
+
+ // time until death!
+ if (!seconds) {
+ // dead
+ g_hdb->_ai->killPlayer(DEATH_PANICZONE);
+ _pzInfo.active = false;
+ return;
+ }
+ }
+ break;
+ }
+}
+
+void Window::startPanicZone() {
+ _pzInfo.active = true;
+ _pzInfo.sequence = PANICZONE_TIMER;
+
+ // load PANIC ZONE gfx if they aren't loaded
+ if (!_pzInfo.gfxPanic)
+ loadPanicZoneGfx();
+
+ _pzInfo.x1 = -(_pzInfo.gfxPanic->_width + 5);
+ _pzInfo.y1 = (kScreenHeight / 4) - (_pzInfo.gfxPanic->_height >> 1);
+ _pzInfo.x2 = 480 + (_pzInfo.gfxZone->_width >> 1);
+ _pzInfo.y2 = (kScreenHeight / 4) * 3 - (_pzInfo.gfxZone->_height >> 1);
+ _pzInfo.xv = 10; // horizontal speed
+ _pzInfo.yv = -12; // vertical speed
+ _pzInfo.timer = 30; // 30 seconds to get out!
+}
+
+void Window::stopPanicZone() {
+ _pzInfo.active = false;
+}
+
void Window::textOut(const char *text, int x, int y, int timer) {
TOut *t = new TOut;
diff --git a/engines/hdb/window.h b/engines/hdb/window.h
index 870d11df6f..1615dea271 100644
--- a/engines/hdb/window.h
+++ b/engines/hdb/window.h
@@ -40,11 +40,24 @@ enum {
kDlvItemSpaceY = (kTileHeight * 2 + 16),
kDlvItemPerLine = 3,
kDlvItemTextY = (kScreenHeight - 30),
+ kPanicXStop = 480 / 3,
+ kPanicZoneFaceX = 480 - 32,
+ kPanicZoneFaceY = 5,
kNumCrazy = 37,
kTextOutCenterX = ((kScreenWidth - kTileWidth * 5) / 2),
kPauseY = (kScreenHeight / 2 - 64)
};
+enum PZValue {
+ PANICZONE_TIMER,
+ PANICZONE_START,
+ PANICZONE_TITLESTOP,
+ PANICZONE_BLASTOFF,
+ PANICZONE_COUNTDOWN,
+
+ PANICZONE_END
+};
+
struct DialogInfo {
char title[64]; // TITLE string
int tileIndex; // this is for a character picture
@@ -126,7 +139,29 @@ struct DlvsInfo {
uint32 delay1, delay2, delay3;
bool go1, go2, go3;
- DlvsInfo() : x(0), y(0), width(0), height(0), active(false), selected(0), animate(false), delay1(0), delay2(0), delay3(0), go1(false), go2(false), go3(false) {}
+ DlvsInfo() : x(0), y(0), width(0), height(0), active(false), selected(0),
+ animate(false), delay1(0), delay2(0), delay3(0), go1(false), go2(false), go3(false) {}
+};
+
+struct PanicZone {
+ bool active;
+ int sequence;
+ int timer;
+ int x1, y1;
+ int x2, y2;
+ int xv, yv; // for both
+ int numberTime;
+ int numberTimeMaster;
+ int numberValue;
+ Picture *gfxPanic, *gfxZone;
+ Picture *gfxFace[2];
+ Picture *gfxNumber[10];
+
+ PanicZone() : active(false), sequence(0), timer(0), x1(0), y1(0), x2(0), y2(0), xv(0), yv(0),
+ numberTime(0), numberTimeMaster(0), numberValue(0), gfxPanic(NULL), gfxZone(NULL) {
+ memset(&gfxFace, 0, sizeof(gfxFace));
+ memset(&gfxNumber, 0, sizeof(gfxNumber));
+ }
};
struct TOut {
@@ -150,7 +185,7 @@ public:
// Pause Functions
void drawPause();
- void checkPause(uint x, uint y);
+ void checkPause(int x, int y);
// Dialog Functions
@@ -214,6 +249,15 @@ public:
}
void checkDlvSelect(int x, int y);
+ // Panic Zone Functions
+ void loadPanicZoneGfx();
+ void drawPanicZone();
+ void startPanicZone();
+ void stopPanicZone();
+ bool inPanicZone() {
+ return _pzInfo.active;
+ }
+
// TextOut functions
void textOut(const char *text, int x, int y, int timer);
void centerTextOut(const char *text, int y, int timer);
@@ -240,6 +284,8 @@ private:
Common::Array<TOut *> _textOutList;
DlvsInfo _dlvsInfo;
+ PanicZone _pzInfo, _tempPzInfo;
+
char _msgQueueStr[kMaxMsgQueue][128];
int _msgQueueWait[kMaxMsgQueue];
int _numMsgQueue;