aboutsummaryrefslogtreecommitdiff
path: root/engines/queen
diff options
context:
space:
mode:
Diffstat (limited to 'engines/queen')
-rw-r--r--engines/queen/command.cpp12
-rw-r--r--engines/queen/command.h6
-rw-r--r--engines/queen/cutaway.cpp12
-rw-r--r--engines/queen/defs.h21
-rw-r--r--engines/queen/display.cpp181
-rw-r--r--engines/queen/display.h10
-rw-r--r--engines/queen/graphics.cpp10
-rw-r--r--engines/queen/grid.cpp2
-rw-r--r--engines/queen/journal.cpp4
-rw-r--r--engines/queen/logic.cpp266
-rw-r--r--engines/queen/logic.h12
-rw-r--r--engines/queen/queen.cpp11
-rw-r--r--engines/queen/resource.cpp4
-rw-r--r--engines/queen/talk.cpp8
14 files changed, 341 insertions, 218 deletions
diff --git a/engines/queen/command.cpp b/engines/queen/command.cpp
index 8366eb2b72..50982420ce 100644
--- a/engines/queen/command.cpp
+++ b/engines/queen/command.cpp
@@ -46,12 +46,12 @@ void CmdText::clear() {
memset(_command, 0, sizeof(_command));
}
-void CmdText::display(uint8 color) {
- _vm->display()->textCurrentColor(color);
+void CmdText::display(InkColor color) {
+ _vm->display()->textCurrentColor(_vm->display()->getInkColor(color));
_vm->display()->setTextCentered(_y, _command, false);
}
-void CmdText::displayTemp(uint8 color, Verb v, const char *name, bool outlined) {
+void CmdText::displayTemp(InkColor color, Verb v, const char *name, bool outlined) {
char temp[MAX_COMMAND_LEN] = "";
if (_isReversed) {
if (name != NULL)
@@ -64,17 +64,17 @@ void CmdText::displayTemp(uint8 color, Verb v, const char *name, bool outlined)
strcat(temp, name);
}
}
- _vm->display()->textCurrentColor(color);
+ _vm->display()->textCurrentColor(_vm->display()->getInkColor(color));
_vm->display()->setTextCentered(_y, temp, outlined);
}
-void CmdText::displayTemp(uint8 color, const char *name, bool outlined) {
+void CmdText::displayTemp(InkColor color, const char *name, bool outlined) {
char temp[MAX_COMMAND_LEN];
if (_isReversed)
sprintf(temp, "%s %s", name, _command);
else
sprintf(temp, "%s %s", _command, name);
- _vm->display()->textCurrentColor(color);
+ _vm->display()->textCurrentColor(_vm->display()->getInkColor(color));
_vm->display()->setTextCentered(_y, temp, outlined);
}
diff --git a/engines/queen/command.h b/engines/queen/command.h
index daec799b90..98218ee1b3 100644
--- a/engines/queen/command.h
+++ b/engines/queen/command.h
@@ -38,13 +38,13 @@ struct CmdText {
void clear();
//! display the command sentence using the specified color
- void display(uint8 color);
+ void display(InkColor color);
//! display a temporary command sentence using the specified parameters
- void displayTemp(uint8 color, Verb v, const char *name = NULL, bool outlined = false);
+ void displayTemp(InkColor color, Verb v, const char *name = NULL, bool outlined = false);
//! display a temporary command sentence using the specified parameters
- void displayTemp(uint8 color, const char *name, bool outlined = false);
+ void displayTemp(InkColor color, const char *name, bool outlined = false);
//! set the verb for the command sentence
void setVerb(Verb v);
diff --git a/engines/queen/cutaway.cpp b/engines/queen/cutaway.cpp
index 4acf25cf46..d92ccd6c21 100644
--- a/engines/queen/cutaway.cpp
+++ b/engines/queen/cutaway.cpp
@@ -41,11 +41,9 @@ void Cutaway::run(
const char *filename,
char *nextFilename,
QueenEngine *vm) {
- if (vm->resource()->fileExists(filename)) {
- Cutaway *cutaway = new Cutaway(filename, vm);
- cutaway->run(nextFilename);
- delete cutaway;
- }
+ Cutaway *cutaway = new Cutaway(filename, vm);
+ cutaway->run(nextFilename);
+ delete cutaway;
}
Cutaway::Cutaway(
@@ -495,6 +493,7 @@ const byte *Cutaway::getCutawayAnim(const byte *ptr, int header, CutawayAnim &an
anim.bank = 15;
} else {
if (anim.bank != 13) {
+ assert(anim.bank - 1 < MAX_BANK_NAME_COUNT);
_vm->bankMan()->load(_bankNames[anim.bank-1], CUTAWAY_BANK);
anim.bank = 8;
} else {
@@ -518,7 +517,8 @@ const byte *Cutaway::getCutawayAnim(const byte *ptr, int header, CutawayAnim &an
anim.scale = (int16)READ_BE_INT16(ptr);
ptr += 2;
- if (_vm->resource()->isDemo()) {
+ if ((_vm->resource()->isDemo() && _vm->resource()->getPlatform() == Common::kPlatformPC) ||
+ (_vm->resource()->isInterview() && _vm->resource()->getPlatform() == Common::kPlatformAmiga)) {
anim.song = 0;
} else {
anim.song = (int16)READ_BE_INT16(ptr);
diff --git a/engines/queen/defs.h b/engines/queen/defs.h
index 4c465eae4f..b6c21b38f9 100644
--- a/engines/queen/defs.h
+++ b/engines/queen/defs.h
@@ -53,16 +53,17 @@ enum Direction {
DIR_BACK = 4
};
-enum {
- INK_BG_PANEL = 226,
- INK_JOURNAL = 248,
- INK_PINNACLE_ROOM = 243,
- INK_CMD_SELECT = 255,
- INK_CMD_NORMAL = 225,
- INK_CMD_LOCK = 234,
- INK_TALK_NORMAL = 7,
- INK_JOE = 14,
- INK_OUTLINED_TEXT = 16
+enum InkColor {
+ INK_BG_PANEL = 0,
+ INK_JOURNAL,
+ INK_PINNACLE_ROOM,
+ INK_CMD_SELECT,
+ INK_CMD_NORMAL,
+ INK_TALK_NORMAL,
+ INK_JOE,
+ INK_OUTLINED_TEXT,
+
+ INK_COUNT
};
enum {
diff --git a/engines/queen/display.cpp b/engines/queen/display.cpp
index 7d74c994b8..35282440e1 100644
--- a/engines/queen/display.cpp
+++ b/engines/queen/display.cpp
@@ -76,6 +76,8 @@ Display::Display(QueenEngine *vm, OSystem *system)
memset(_texts, 0, sizeof(_texts));
memset(&_dynalum, 0, sizeof(_dynalum));
+
+ setupInkColors();
}
Display::~Display() {
@@ -174,15 +176,19 @@ void Display::palSet(const uint8 *pal, int start, int end, bool updateScreen) {
}
void Display::palSetJoeDress() {
- memcpy(_pal.room + 144 * 3, _palJoeDress, 16 * 3);
- memcpy(_pal.screen + 144 * 3, _palJoeDress, 16 * 3);
- palSet(_pal.screen, 144, 159, true);
+ if (_vm->resource()->getPlatform() == Common::kPlatformPC) {
+ memcpy(_pal.room + 144 * 3, _palJoeDress, 16 * 3);
+ memcpy(_pal.screen + 144 * 3, _palJoeDress, 16 * 3);
+ palSet(_pal.screen, 144, 159, true);
+ }
}
void Display::palSetJoeNormal() {
- memcpy(_pal.room + 144 * 3, _palJoeClothes, 16 * 3);
- memcpy(_pal.screen + 144 * 3, _palJoeClothes, 16 * 3);
- palSet(_pal.screen, 144, 159, true);
+ if (_vm->resource()->getPlatform() == Common::kPlatformPC) {
+ memcpy(_pal.room + 144 * 3, _palJoeClothes, 16 * 3);
+ memcpy(_pal.screen + 144 * 3, _palJoeClothes, 16 * 3);
+ palSet(_pal.screen, 144, 159, true);
+ }
}
void Display::palSetPanel() {
@@ -260,30 +266,71 @@ void Display::palScroll(int start, int end) {
*palStart = b;
}
+void Display::palSetAmigaColor(uint8 color, uint16 rgb) {
+ uint8 b = rgb & 0xF; rgb >>= 4;
+ uint8 g = rgb & 0xF; rgb >>= 4;
+ uint8 r = rgb & 0xF;
+ _pal.room[color * 3] = (r << 4) | r;
+ _pal.room[color * 3 + 1] = (g << 4) | g;
+ _pal.room[color * 3 + 2] = (b << 4) | b;
+}
+
void Display::palCustomColors(uint16 roomNum) {
debug(9, "Display::palCustomColors(%d)", roomNum);
- int i;
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ switch (roomNum) {
+ case 28:
+ palSetAmigaColor(27, 0xC60);
+ palSetAmigaColor(28, 0xA30);
+ palSetAmigaColor(29, 0x810);
+ palSetAmigaColor(30, 0x600);
+ break;
+ case 29:
+ palSetAmigaColor(27, 0X58B);
+ palSetAmigaColor(28, 0x369);
+ palSetAmigaColor(29, 0x158);
+ palSetAmigaColor(30, 0x046);
+ break;
+ case 30:
+ palSetAmigaColor(27, 0x5A4);
+ palSetAmigaColor(28, 0x384);
+ palSetAmigaColor(29, 0x171);
+ palSetAmigaColor(30, 0x056);
+ break;
+ case 31:
+ palSetAmigaColor(27, 0xDA4);
+ palSetAmigaColor(28, 0xB83);
+ palSetAmigaColor(29, 0x873);
+ palSetAmigaColor(30, 0x652);
+ break;
+ case 45:
+ palSetAmigaColor(20, 0xA58);
+ palSetAmigaColor(21, 0x845);
+ break;
+ }
+ return;
+ }
switch (roomNum) {
case 31:
- for (i = 72; i < 84; i++) {
+ for (int i = 72; i < 84; i++) {
_pal.room[i * 3 + 1] = _pal.room[i * 3 + 1] * 90 / 100;
_pal.room[i * 3 + 2] = _pal.room[i * 3 + 2] * 70 / 100;
}
break;
case 29:
- for (i = 72; i < 84; i++) {
+ for (int i = 72; i < 84; i++) {
_pal.room[i * 3 + 1] = _pal.room[i * 3 + 1] * 60 / 100;
_pal.room[i * 3 + 2] = _pal.room[i * 3 + 2] * 60 / 100;
}
break;
case 30:
- for (i = 72; i < 84; i++) {
+ for (int i = 72; i < 84; i++) {
_pal.room[i * 3 + 0] = _pal.room[i * 3 + 0] * 60 / 100;
_pal.room[i * 3 + 1] = _pal.room[i * 3 + 1] * 80 / 100;
}
break;
case 28:
- for (i = 72; i < 84; i++) {
+ for (int i = 72; i < 84; i++) {
_pal.room[i * 3 + 0] = _pal.room[i * 3 + 0] * 80 / 100;
_pal.room[i * 3 + 2] = _pal.room[i * 3 + 1] * 60 / 100;
}
@@ -304,6 +351,25 @@ void Display::palCustomScroll(uint16 roomNum) {
int i;
++scrollx;
+
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ switch (roomNum) {
+ case 4:
+ if ((scrollx & 1) == 0) {
+ palScroll(24, 64);
+ loPal = 24;
+ hiPal = 64;
+ }
+ break;
+ case 74:
+ palScroll(28, 31);
+ loPal = 28;
+ hiPal = 31;
+ break;
+ }
+ return;
+ }
+
switch (roomNum) {
case 123: {
static int16 j = 0, jdir = 2;
@@ -511,36 +577,38 @@ void Display::palCustomFlash() {
}
void Display::palCustomLightsOff(uint16 roomNum) {
- int end = 223;
- int start = (roomNum == ROOM_FLODA_FRONTDESK) ? 32 : 16;
- int n = end - start + 1;
-
- memset(_pal.screen + start * 3, 0, n * 3);
- palSet(_pal.screen, start, end, true);
-
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ memset(_pal.screen, 0, 31 * 3);
+ _pal.screen[31 * 3] = 15;
+ _pal.screen[31 * 3 + 1] = 15;
+ _pal.screen[31 * 3 + 2] = 0;
+ palSet(_pal.screen, 0, 31, true);
+ } else {
+ const int end = 223;
+ const int start = (roomNum == ROOM_FLODA_FRONTDESK) ? 32 : 16;
+ const int n = end - start + 1;
+ memset(_pal.screen + start * 3, 0, n * 3);
+ palSet(_pal.screen, start, end, true);
+ }
_pal.scrollable = false;
}
void Display::palCustomLightsOn(uint16 roomNum) {
- int end = 223;
- int start = (roomNum == ROOM_FLODA_FRONTDESK) ? 32 : 0;
- int n = end - start + 1;
-
- memcpy(_pal.screen + start * 3, _pal.room + start * 3, n * 3);
- palSet(_pal.screen, start, end, true);
-
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ memcpy(_pal.screen, _pal.room, 32 * 3);
+ palSet(_pal.screen, 0, 31, true);
+ } else {
+ const int end = 223;
+ const int start = (roomNum == ROOM_FLODA_FRONTDESK) ? 32 : 0;
+ const int n = end - start + 1;
+ memcpy(_pal.screen + start * 3, _pal.room + start * 3, n * 3);
+ palSet(_pal.screen, start, end, true);
+ }
_pal.dirtyMin = 0;
_pal.dirtyMax = 223;
_pal.scrollable = true;
}
-void Display::palSetPanelColor(uint8 color, uint8 r, uint8 g, uint8 b) {
- color -= 144;
- _pal.panel[color * 3] = r;
- _pal.panel[color * 3 + 1] = g;
- _pal.panel[color * 3 + 2] = b;
-}
-
int Display::getNumColorsForRoom(uint16 room) const {
int n = 224;
if (room >= 114 && room <= 125) {
@@ -599,7 +667,7 @@ void Display::update(bool dynalum, int16 dynaX, int16 dynaY) {
if (_fullRefresh) {
memset(_dirtyBlocks, 0, _dirtyBlocksWidth * _dirtyBlocksHeight);
}
- debug(7, "Display::update() - Full blit (%d)", _fullRefresh);
+ debug(9, "Display::update() - Full blit (%d)", _fullRefresh);
} else {
uint16 count = 0;
uint8 *scrBuf = _screenBuf;
@@ -628,7 +696,7 @@ void Display::update(bool dynalum, int16 dynaX, int16 dynaY) {
if (count != 0) {
_system->updateScreen();
}
- debug(7, "Display::update() - Dirtyblocks blit (%d)", count);
+ debug(9, "Display::update() - Dirtyblocks blit (%d)", count);
}
}
@@ -642,14 +710,6 @@ void Display::setupPanel() {
if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
decodeLBM(data, dataSize, _panelBuf, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 0, 32, 144);
- // setup special colors
- // XXX set correct color values
- palSetPanelColor(INK_BG_PANEL, 255, 255, 255);
- palSetPanelColor(INK_JOURNAL, 255, 255, 255);
- palSetPanelColor(INK_PINNACLE_ROOM, 255, 255, 255);
- palSetPanelColor(INK_CMD_SELECT, 255, 255, 255);
- palSetPanelColor(INK_CMD_NORMAL, 255, 255, 255);
- palSetPanelColor(INK_CMD_LOCK, 255, 255, 255);
} else {
WRITE_LE_UINT16(data + 14, PANEL_H - 10);
decodePCX(data, dataSize, _panelBuf + PANEL_W * 10, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 144, 256);
@@ -692,8 +752,8 @@ void Display::drawBobPasteDown(const uint8 *data, uint16 x, uint16 y, uint16 w,
}
void Display::drawInventoryItem(const uint8 *data, uint16 x, uint16 y, uint16 w, uint16 h) {
- if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
- if (data != NULL) {
+ if (data != NULL) {
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
uint8 *dst = _panelBuf + y * PANEL_W + x;
while (h--) {
for (int i = 0; i < w; ++i) {
@@ -702,14 +762,10 @@ void Display::drawInventoryItem(const uint8 *data, uint16 x, uint16 y, uint16 w,
dst += PANEL_W;
}
} else {
- fill(_panelBuf, PANEL_W, x, y, w, h, 144 + 2);
- }
- } else {
- if (data != NULL) {
blit(_panelBuf, PANEL_W, x, y, data, w, w, h, false, false);
- } else {
- fill(_panelBuf, PANEL_W, x, y, w, h, INK_BG_PANEL);
}
+ } else {
+ fill(_panelBuf, PANEL_W, x, y, w, h, getInkColor(INK_BG_PANEL));
}
setDirtyBlock(x, 150 + y, w, h);
}
@@ -975,6 +1031,29 @@ void Display::clearTexts(uint16 y1, uint16 y2) {
}
}
+void Display::setupInkColors() {
+ memset(_inkColors, 0, sizeof(_inkColors));
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ _inkColors[INK_BG_PANEL] = 144 + 2;
+ _inkColors[INK_JOURNAL] = 144 + 16;
+ _inkColors[INK_PINNACLE_ROOM] = 144 + 14;
+ _inkColors[INK_CMD_SELECT] = 144 + 17;
+ _inkColors[INK_CMD_NORMAL] = 144 + 1;
+ _inkColors[INK_TALK_NORMAL] = 144 + 1;
+ _inkColors[INK_JOE] = 144 + 17;
+ _inkColors[INK_OUTLINED_TEXT] = 0;
+ } else {
+ _inkColors[INK_BG_PANEL] = 226;
+ _inkColors[INK_JOURNAL] = 248;
+ _inkColors[INK_PINNACLE_ROOM] = 243;
+ _inkColors[INK_CMD_SELECT] = 255;
+ _inkColors[INK_CMD_NORMAL] = 225;
+ _inkColors[INK_TALK_NORMAL] = 7;
+ _inkColors[INK_JOE] = 14;
+ _inkColors[INK_OUTLINED_TEXT] = 16;
+ }
+}
+
void Display::setFocusRect(const Common::Rect& rect) {
_system->setFocusRectangle(rect);
}
@@ -1024,7 +1103,7 @@ void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool o
const uint8 *ftch = _font + ch * 8;
if (outlined) {
for (int i = 0; i < 8; ++i) {
- drawChar(x + dx[i], y + dy[i], INK_OUTLINED_TEXT, ftch);
+ drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
}
}
drawChar(x, y, color, ftch);
diff --git a/engines/queen/display.h b/engines/queen/display.h
index 1cba119630..a23716f873 100644
--- a/engines/queen/display.h
+++ b/engines/queen/display.h
@@ -72,6 +72,8 @@ public:
//! scroll some palette colors
void palScroll(int start, int end);
+ void palSetAmigaColor(uint8 color, uint16 rgb);
+
//! custom palette effect for the specified room
void palCustomColors(uint16 roomNum);
@@ -84,8 +86,6 @@ public:
void palCustomLightsOff(uint16 roomNum);
void palCustomLightsOn(uint16 roomNum);
- void palSetPanelColor(uint8 color, uint8 r, uint8 g, uint8 b);
-
//! mark all palette entries as dirty
void palSetAllDirty() { _pal.dirtyMin = 0; _pal.dirtyMax = 255; }
@@ -151,6 +151,10 @@ public:
//! remove entries from the texts list
void clearTexts(uint16 y1, uint16 y2);
+ void setupInkColors();
+
+ uint8 getInkColor(InkColor color) const { return _inkColors[color]; }
+
//! change the current text color
void textCurrentColor(uint8 color) { _curTextColor = color; }
@@ -239,6 +243,8 @@ private:
//! font justification sizes
uint8 _charWidth[256];
+ uint8 _inkColors[INK_COUNT];
+
Common::RandomSource _rnd;
Dynalum _dynalum;
OSystem *_system;
diff --git a/engines/queen/graphics.cpp b/engines/queen/graphics.cpp
index 6d79a71197..1993ec47e4 100644
--- a/engines/queen/graphics.cpp
+++ b/engines/queen/graphics.cpp
@@ -295,17 +295,21 @@ void Graphics::setupMouseCursor() {
0x00, 0x00, 0x00, 0x20
};
uint8 cursorData[16 * 15];
+ memset(cursorData, 0, sizeof(cursorData));
const uint8 *src = defaultAmigaCursor;
int i = 0;
for (int h = 0; h < 15; ++h) {
for (int b = 0; b < 16; ++b) {
const uint16 mask = (1 << (15 - b));
- cursorData[i] = 0;
+ uint8 color = 0;
if (READ_BE_UINT16(src + 0) & mask) {
- cursorData[i] |= 4;
+ color |= 1;
}
if (READ_BE_UINT16(src + 2) & mask) {
- cursorData[i] |= 8;
+ color |= 2;
+ }
+ if (color != 0) {
+ cursorData[i] = 0x90 + color;
}
++i;
}
diff --git a/engines/queen/grid.cpp b/engines/queen/grid.cpp
index 0dc7d045df..e23ec6c59f 100644
--- a/engines/queen/grid.cpp
+++ b/engines/queen/grid.cpp
@@ -72,6 +72,7 @@ void Grid::readDataFrom(uint16 numObjects, uint16 numRooms, byte *&ptr) {
void Grid::setZone(GridScreen screen, uint16 zoneNum, uint16 x1, uint16 y1, uint16 x2, uint16 y2) {
debug(9, "Grid::setZone(%d, %d, (%d,%d), (%d,%d))", screen, zoneNum, x1, y1, x2, y2);
+ assert(zoneNum < MAX_ZONES_NUMBER);
ZoneSlot *pzs = &_zones[screen][zoneNum];
pzs->valid = true;
pzs->box.x1 = x1;
@@ -82,6 +83,7 @@ void Grid::setZone(GridScreen screen, uint16 zoneNum, uint16 x1, uint16 y1, uint
void Grid::setZone(GridScreen screen, uint16 zoneNum, const Box &box) {
debug(9, "Grid::setZone(%d, %d, (%d,%d), (%d,%d))", screen, zoneNum, box.x1, box.y1, box.x2, box.y2);
+ assert(zoneNum < MAX_ZONES_NUMBER);
ZoneSlot *pzs = &_zones[screen][zoneNum];
pzs->valid = true;
pzs->box = box;
diff --git a/engines/queen/journal.cpp b/engines/queen/journal.cpp
index 5e722ef111..11213e9714 100644
--- a/engines/queen/journal.cpp
+++ b/engines/queen/journal.cpp
@@ -117,7 +117,7 @@ void Journal::setup() {
_vm->graphics()->clearBobs();
_vm->display()->clearTexts(0, GAME_SCREEN_HEIGHT - 1);
_vm->bankMan()->eraseFrames(false);
- _vm->display()->textCurrentColor(INK_JOURNAL);
+ _vm->display()->textCurrentColor(_vm->display()->getInkColor(INK_JOURNAL));
_vm->grid()->clear(GS_ROOM);
for (int i = 0; i < MAX_ZONES; ++i) {
@@ -159,7 +159,7 @@ void Journal::update() {
if (_textField.enabled) {
int16 x = _textField.x + _textField.posCursor;
int16 y = _textField.y + _currentSaveSlot * _textField.h + 8;
- _vm->display()->drawBox(x, y, x + 6, y, INK_JOURNAL);
+ _vm->display()->drawBox(x, y, x + 6, y, _vm->display()->getInkColor(INK_JOURNAL));
}
_vm->display()->forceFullRefresh();
_vm->display()->update();
diff --git a/engines/queen/logic.cpp b/engines/queen/logic.cpp
index 848efb68b4..3b95e788fc 100644
--- a/engines/queen/logic.cpp
+++ b/engines/queen/logic.cpp
@@ -57,6 +57,7 @@ Logic::Logic(QueenEngine *vm)
_journal = new Journal(vm);
_scene = 0;
readQueenJas();
+ setupSpecialMoveTable();
}
Logic::~Logic() {
@@ -1451,10 +1452,76 @@ void Logic::changeRoom() {
_vm->display()->showMouseCursor(true);
}
+void Logic::setupSpecialMoveTable() {
+ memset(_specialMoves, 0, sizeof(_specialMoves));
+ if (_vm->resource()->isDemo()) {
+ _specialMoves[4] = &Logic::asmMakeJoeUseUnderwear;
+ _specialMoves[5] = &Logic::asmSwitchToDressPalette;
+ _specialMoves[14] = &Logic::asmEndDemo;
+ } else if (_vm->resource()->isInterview()) {
+ _specialMoves[1] = &Logic::asmInterviewIntro;
+ _specialMoves[2] = &Logic::asmEndInterview;
+ } else {
+ _specialMoves[2] = &Logic::asmMakeJoeUseDress;
+ _specialMoves[3] = &Logic::asmMakeJoeUseNormalClothes;
+ _specialMoves[4] = &Logic::asmMakeJoeUseUnderwear;
+ _specialMoves[5] = &Logic::asmSwitchToDressPalette;
+ _specialMoves[6] = &Logic::asmSwitchToNormalPalette;
+ _specialMoves[7] = &Logic::asmStartCarAnimation; // room 74
+ _specialMoves[8] = &Logic::asmStopCarAnimation; // room 74
+ _specialMoves[9] = &Logic::asmStartFightAnimation; // room 69
+ _specialMoves[10] = &Logic::asmWaitForFrankPosition; // c69e.cut
+ _specialMoves[11] = &Logic::asmMakeFrankGrowing; // c69z.cut
+ _specialMoves[12] = &Logic::asmMakeRobotGrowing; // c69z.cut
+ _specialMoves[13] = &Logic::asmShrinkRobot;
+ _specialMoves[14] = &Logic::asmEndGame;
+ _specialMoves[15] = &Logic::asmPutCameraOnDino;
+ _specialMoves[16] = &Logic::asmPutCameraOnJoe;
+ _specialMoves[17] = &Logic::asmAltIntroPanRight; // cintr.cut
+ _specialMoves[18] = &Logic::asmAltIntroPanLeft; // cintr.cut
+ _specialMoves[19] = &Logic::asmSetAzuraInLove;
+ _specialMoves[20] = &Logic::asmPanRightFromJoe;
+ _specialMoves[21] = &Logic::asmSetLightsOff;
+ _specialMoves[22] = &Logic::asmSetLightsOn;
+ _specialMoves[23] = &Logic::asmSetManequinAreaOn;
+ _specialMoves[24] = &Logic::asmPanToJoe;
+ _specialMoves[25] = &Logic::asmTurnGuardOn;
+ _specialMoves[26] = &Logic::asmPanLeft320To144;
+ _specialMoves[27] = &Logic::asmSmooch;
+ _specialMoves[28] = &Logic::asmMakeLightningHitPlane;
+ _specialMoves[29] = &Logic::asmScaleBlimp;
+ _specialMoves[30] = &Logic::asmScaleEnding;
+ _specialMoves[31] = &Logic::asmWaitForCarPosition;
+ _specialMoves[32] = &Logic::asmShakeScreen;
+ _specialMoves[33] = &Logic::asmAttemptPuzzle;
+ _specialMoves[34] = &Logic::asmScaleTitle;
+ _specialMoves[36] = &Logic::asmPanRightToHugh;
+ _specialMoves[37] = &Logic::asmMakeWhiteFlash;
+ _specialMoves[38] = &Logic::asmPanRightToJoeAndRita;
+ _specialMoves[39] = &Logic::asmPanLeftToBomb; // cdint.cut
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ _specialMoves[5] = 0;
+ _specialMoves[6] = 0;
+ _specialMoves[13] = 0;
+ _specialMoves[17] = 0;
+ _specialMoves[18] = 0;
+ _specialMoves[27] = &Logic::asmSmoochNoScroll;
+ _specialMoves[32] = 0;
+ _specialMoves[34] = &Logic::asmScrollTitle;
+ _specialMoves[35] = 0;
+ _specialMoves[36] = 0;
+ _specialMoves[37] = 0;
+ _specialMoves[38] = 0;
+ _specialMoves[39] = 0;
+ }
+ }
+}
+
void Logic::executeSpecialMove(uint16 sm) {
debug(6, "Special move: %d", sm);
- if (!handleSpecialMove(sm))
- warning("unhandled / invalid special move : %d", sm);
+ if (sm < ARRAYSIZE(_specialMoves) && _specialMoves[sm] != 0) {
+ (this->*_specialMoves[sm])();
+ }
}
void Logic::asmMakeJoeUseDress() {
@@ -1505,14 +1572,21 @@ void Logic::asmMakeFrankGrowing() {
_vm->bankMan()->unpack(1, 38, 15);
BobSlot *bobFrank = _vm->graphics()->bob(5);
bobFrank->frameNum = 38;
- bobFrank->curPos(160, 200);
-
- int i;
- for (i = 10; i <= 100; i += 4) {
- bobFrank->scale = i;
- _vm->update();
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ bobFrank->x = 160;
+ bobFrank->scale = 100;
+ for (int i = 300; i >= 200; i -= 5) {
+ bobFrank->y = i;
+ _vm->update();
+ }
+ } else {
+ bobFrank->curPos(160, 200);
+ for (int i = 10; i <= 100; i += 4) {
+ bobFrank->scale = i;
+ _vm->update();
+ }
}
- for (i = 0; i <= 20; ++i) {
+ for (int i = 0; i <= 20; ++i) {
_vm->update();
}
@@ -1528,14 +1602,21 @@ void Logic::asmMakeRobotGrowing() {
_vm->bankMan()->unpack(1, 38, 15);
BobSlot *bobRobot = _vm->graphics()->bob(5);
bobRobot->frameNum = 38;
- bobRobot->curPos(160, 200);
-
- int i;
- for (i = 10; i <= 100; i += 4) {
- bobRobot->scale = i;
- _vm->update();
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ bobRobot->x = 160;
+ bobRobot->scale = 100;
+ for (int i = 350; i >= 200; i -= 5) {
+ bobRobot->y = i;
+ _vm->update();
+ }
+ } else {
+ bobRobot->curPos(160, 200);
+ for (int i = 10; i <= 100; i += 4) {
+ bobRobot->scale = i;
+ _vm->update();
+ }
}
- for (i = 0; i <= 20; ++i) {
+ for (int i = 0; i <= 20; ++i) {
_vm->update();
}
@@ -1708,6 +1789,19 @@ void Logic::asmSmooch() {
}
}
+void Logic::asmSmoochNoScroll() {
+ _vm->graphics()->putCameraOnBob(-1);
+ BobSlot *bobAzura = _vm->graphics()->bob(5);
+ BobSlot *bobJoe = _vm->graphics()->bob(6);
+ for (int i = 0; i < 320; i += 8) {
+ if (bobJoe->x - bobAzura->x > 128) {
+ bobAzura->x += 2;
+ bobJoe->x -= 2;
+ }
+ _vm->update();
+ }
+}
+
void Logic::asmMakeLightningHitPlane() {
_vm->graphics()->putCameraOnBob(-1);
short iy = 0, x, ydir = -1, j, k;
@@ -1717,7 +1811,11 @@ void Logic::asmMakeLightningHitPlane() {
planeBob->y = 135;
- planeBob->scale = 20;
+ if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) {
+ planeBob->scale = 100;
+ } else {
+ planeBob->scale = 20;
+ }
for (x = 660; x > 163; x -= 6) {
planeBob->x = x;
@@ -1791,11 +1889,13 @@ void Logic::asmScaleBlimp() {
BobSlot *bob = _vm->graphics()->bob(7);
int16 x = bob->x;
int16 y = bob->y;
+ bob->scale = 100;
while (bob->x > 150) {
bob->x = x * 256 / z + 150;
bob->y = y * 256 / z + 112;
- bob->scale = 100 * 256 / z;
-
+ if (_vm->resource()->getPlatform() != Common::kPlatformAmiga) {
+ bob->scale = 100 * 256 / z;
+ }
++z;
if (z % 6 == 0) {
--x;
@@ -1808,14 +1908,14 @@ void Logic::asmScaleBlimp() {
void Logic::asmScaleEnding() {
_vm->graphics()->bob(7)->active = false; // Turn off blimp
BobSlot *b = _vm->graphics()->bob(20);
- b->x = 160;
- b->y = 100;
- int i;
- for (i = 5; i <= 100; i += 5) {
- b->scale = i;
- _vm->update();
+ b->curPos(160, 100);
+ if (_vm->resource()->getPlatform() != Common::kPlatformAmiga) {
+ for (int i = 5; i <= 100; i += 5) {
+ b->scale = i;
+ _vm->update();
+ }
}
- for (i = 0; i < 50; ++i) {
+ for (int i = 0; i < 50; ++i) {
_vm->update();
}
_vm->display()->palFadeOut(_currentRoom);
@@ -1858,6 +1958,18 @@ void Logic::asmScaleTitle() {
}
}
+void Logic::asmScrollTitle() {
+ BobSlot *bob = _vm->graphics()->bob(5);
+ bob->animating = false;
+ bob->x = 161;
+ bob->y = 300;
+ bob->scale = 100;
+ while (bob->y >= 120) {
+ bob->y -= 4;
+ _vm->update();
+ }
+}
+
void Logic::asmPanRightToHugh() {
BobSlot *bob_thugA1 = _vm->graphics()->bob(20);
BobSlot *bob_thugA2 = _vm->graphics()->bob(21);
@@ -2063,23 +2175,6 @@ bool LogicDemo::preChangeRoom() {
return false;
}
-bool LogicDemo::handleSpecialMove(uint16 sm) {
- switch (sm) {
- case 4:
- asmMakeJoeUseUnderwear();
- break;
- case 5:
- asmSwitchToDressPalette();
- break;
- case 14:
- asmEndDemo();
- break;
- default:
- return false;
- }
- return true;
-}
-
void LogicInterview::useJournal() {
// no-op
}
@@ -2096,19 +2191,6 @@ bool LogicInterview::preChangeRoom() {
return false;
}
-bool LogicInterview::handleSpecialMove(uint16 sm) {
- switch (sm) {
- case 1:
- asmInterviewIntro();
- break;
- case 2:
- asmEndInterview();
- break;
- default:
- return false;
- }
- return true;
-}
void LogicGame::useJournal() {
_vm->command()->clear(false);
@@ -2124,13 +2206,13 @@ bool LogicGame::preChangeRoom() {
displayRoom(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("copy.cut");
playCutaway("clogo.cut");
-
- if (ConfMan.getBool("alt_intro") && _vm->resource()->isCD()) {
- playCutaway("cintr.cut");
- } else {
- playCutaway("cdint.cut");
+ if (_vm->resource()->getPlatform() != Common::kPlatformAmiga) {
+ if (ConfMan.getBool("alt_intro") && _vm->resource()->isCD()) {
+ playCutaway("cintr.cut");
+ } else {
+ playCutaway("cdint.cut");
+ }
}
-
playCutaway("cred.cut");
_vm->display()->palSetPanel();
sceneReset();
@@ -2145,64 +2227,4 @@ bool LogicGame::preChangeRoom() {
return false;
}
-bool LogicGame::handleSpecialMove(uint16 sm) {
- typedef void (LogicGame::*SpecialMoveProc)();
- static const SpecialMoveProc asmTable[] = {
- /* 00 */
- 0,
- 0,
- &LogicGame::asmMakeJoeUseDress,
- &LogicGame::asmMakeJoeUseNormalClothes,
- /* 04 */
- &LogicGame::asmMakeJoeUseUnderwear,
- &LogicGame::asmSwitchToDressPalette,
- &LogicGame::asmSwitchToNormalPalette,
- &LogicGame::asmStartCarAnimation, // room 74
- /* 08 */
- &LogicGame::asmStopCarAnimation, // room 74
- &LogicGame::asmStartFightAnimation, // room 69
- &LogicGame::asmWaitForFrankPosition, // c69e.cut
- &LogicGame::asmMakeFrankGrowing, // c69z.cut
- /* 12 */
- &LogicGame::asmMakeRobotGrowing, // c69z.cut
- &LogicGame::asmShrinkRobot,
- &LogicGame::asmEndGame,
- &LogicGame::asmPutCameraOnDino,
- /* 16 */
- &LogicGame::asmPutCameraOnJoe,
- &LogicGame::asmAltIntroPanRight, // cintr.cut
- &LogicGame::asmAltIntroPanLeft, // cintr.cut
- &LogicGame::asmSetAzuraInLove,
- /* 20 */
- &LogicGame::asmPanRightFromJoe,
- &LogicGame::asmSetLightsOff,
- &LogicGame::asmSetLightsOn,
- &LogicGame::asmSetManequinAreaOn,
- /* 24 */
- &LogicGame::asmPanToJoe,
- &LogicGame::asmTurnGuardOn,
- &LogicGame::asmPanLeft320To144,
- &LogicGame::asmSmooch,
- /* 28 */
- &LogicGame::asmMakeLightningHitPlane,
- &LogicGame::asmScaleBlimp,
- &LogicGame::asmScaleEnding,
- &LogicGame::asmWaitForCarPosition,
- /* 32 */
- &LogicGame::asmShakeScreen,
- &LogicGame::asmAttemptPuzzle,
- &LogicGame::asmScaleTitle,
- 0,
- /* 36 */
- &LogicGame::asmPanRightToHugh,
- &LogicGame::asmMakeWhiteFlash,
- &LogicGame::asmPanRightToJoeAndRita,
- &LogicGame::asmPanLeftToBomb // cdint.cut
- };
- if (sm >= ARRAYSIZE(asmTable) || asmTable[sm] == 0)
- return false;
- (this->*asmTable[sm])();
- return true;
-}
-
} // End of namespace Queen
diff --git a/engines/queen/logic.h b/engines/queen/logic.h
index 2721951f4e..1c0868babc 100644
--- a/engines/queen/logic.h
+++ b/engines/queen/logic.h
@@ -207,6 +207,8 @@ public:
//! enter the Journal (save/load, configuration)
virtual void useJournal() = 0;
+ void setupSpecialMoveTable();
+
//! execute a special move
void executeSpecialMove(uint16 sm);
@@ -222,6 +224,8 @@ public:
TALK_SELECTED_COUNT = 86
};
+ typedef void (Logic::*SpecialMoveProc)();
+
protected:
void readQueenJas();
@@ -252,6 +256,7 @@ protected:
void asmTurnGuardOn();
void asmPanLeft320To144();
void asmSmooch();
+ void asmSmoochNoScroll();
void asmMakeLightningHitPlane();
void asmScaleBlimp();
void asmScaleEnding();
@@ -259,6 +264,7 @@ protected:
void asmShakeScreen();
void asmAttemptPuzzle();
void asmScaleTitle();
+ void asmScrollTitle();
void asmPanRightToHugh();
void asmMakeWhiteFlash();
void asmPanRightToJoeAndRita();
@@ -268,7 +274,6 @@ protected:
void asmEndInterview();
virtual bool preChangeRoom() = 0;
- virtual bool handleSpecialMove(uint16 sm) = 0;
uint16 _currentRoom;
@@ -361,6 +366,8 @@ protected:
//! cutscene counter
int _scene;
+
+ SpecialMoveProc _specialMoves[40];
Credits *_credits;
Journal *_journal;
@@ -377,7 +384,6 @@ public:
protected:
bool preChangeRoom();
- bool handleSpecialMove(uint16 sm);
};
class LogicInterview : public Logic {
@@ -389,7 +395,6 @@ public:
protected:
bool preChangeRoom();
- bool handleSpecialMove(uint16 sm);
};
class LogicGame : public Logic {
@@ -401,7 +406,6 @@ public:
protected:
bool preChangeRoom();
- bool handleSpecialMove(uint16 sm);
};
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 87f7030b71..a5b40ec3f9 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -127,6 +127,7 @@ QueenEngine::~QueenEngine() {
void QueenEngine::registerDefaultSettings() {
ConfMan.registerDefault("talkspeed", Logic::DEFAULT_TALK_SPEED);
ConfMan.registerDefault("subtitles", true);
+ _subtitles = true;
}
void QueenEngine::checkOptionSettings() {
@@ -137,15 +138,15 @@ void QueenEngine::checkOptionSettings() {
_talkSpeed = MAX_TEXT_SPEED;
}
- // ensure text is always on when voice is off
- if (!_sound->speechOn()) {
- _subtitles = true;
- }
-
// demo and interview versions don't have speech at all
if (_sound->speechOn() && (_resource->isDemo() || _resource->isInterview())) {
_sound->speechToggle(false);
}
+
+ // ensure text is always on when voice is off
+ if (!_sound->speechOn()) {
+ _subtitles = true;
+ }
}
void QueenEngine::readOptionSettings() {
diff --git a/engines/queen/resource.cpp b/engines/queen/resource.cpp
index 9724963884..c7eabebc95 100644
--- a/engines/queen/resource.cpp
+++ b/engines/queen/resource.cpp
@@ -90,6 +90,10 @@ Resource::~Resource() {
}
ResourceEntry *Resource::resourceEntry(const char *filename) const {
+ if (filename[0] == 0 || strlen(filename) >= 14) {
+ uint8 *p = 0;
+ *p = 0x1234;
+ }
assert(filename[0] && strlen(filename) < 14);
Common::String entryName(filename);
diff --git a/engines/queen/talk.cpp b/engines/queen/talk.cpp
index 17cf56d60b..37bb10ff86 100644
--- a/engines/queen/talk.cpp
+++ b/engines/queen/talk.cpp
@@ -1178,7 +1178,7 @@ int16 Talk::selectSentence() {
int talkZone[5];
int i;
- _vm->display()->textCurrentColor(INK_TALK_NORMAL);
+ _vm->display()->textCurrentColor(_vm->display()->getInkColor(INK_TALK_NORMAL));
_vm->graphics()->setupArrows();
BobSlot *arrowBobUp = _vm->graphics()->bob(Graphics::ARROW_BOB_UP);
@@ -1269,7 +1269,7 @@ int16 Talk::selectSentence() {
int16 y;
const Box *b = _vm->grid()->zone(GS_PANEL, oldZone);
for (y = b->y1; y < b->y2; y += 10)
- _vm->display()->textColor(150 + y, INK_TALK_NORMAL);
+ _vm->display()->textColor(150 + y, _vm->display()->getInkColor(INK_TALK_NORMAL));
oldZone = 0;
}
if (mouseButton != 0) {
@@ -1292,13 +1292,13 @@ int16 Talk::selectSentence() {
if (zone > 0) {
const Box *b = _vm->grid()->zone(GS_PANEL, zone);
for (y = b->y1; y < b->y2; y += 10)
- _vm->display()->textColor(150 + y, INK_JOE);
+ _vm->display()->textColor(150 + y, _vm->display()->getInkColor(INK_JOE));
}
if (oldZone > 0) {
const Box *b = _vm->grid()->zone(GS_PANEL, oldZone);
for (y = b->y1; y < b->y2; y += 10)
- _vm->display()->textColor(150 + y, INK_TALK_NORMAL);
+ _vm->display()->textColor(150 + y, _vm->display()->getInkColor(INK_TALK_NORMAL));
}
oldZone = zone;