2006-04-29 13:38:07 +00:00
|
|
|
/* ScummVM - Scumm Interpreter
|
2006-05-05 00:42:37 +00:00
|
|
|
* Copyright (C) 2001 Ludvig Strigeus
|
2006-04-29 13:38:07 +00:00
|
|
|
* Copyright (C) 2001-2006 The ScummVM project
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
2006-04-29 14:11:29 +00:00
|
|
|
* $URL$
|
|
|
|
* $Id$
|
2006-04-29 13:38:07 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "common/stdafx.h"
|
|
|
|
|
2006-09-29 08:14:27 +00:00
|
|
|
#include "agos/agos.h"
|
|
|
|
#include "agos/intern.h"
|
2006-04-29 13:38:07 +00:00
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
namespace AGOS {
|
2006-04-29 13:38:07 +00:00
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
uint AGOSEngine::getWindowNum(WindowBlock *window) {
|
2006-04-29 13:38:07 +00:00
|
|
|
uint i;
|
|
|
|
|
|
|
|
for (i = 0; i != ARRAYSIZE(_windowArray); i++)
|
|
|
|
if (_windowArray[i] == window)
|
|
|
|
return i;
|
|
|
|
|
|
|
|
error("getWindowNum: not found");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-10-11 14:03:40 +00:00
|
|
|
WindowBlock *AGOSEngine::openWindow(uint x, uint y, uint w, uint h, uint flags, uint fillColor, uint textColor) {
|
2006-04-29 13:38:07 +00:00
|
|
|
WindowBlock *window;
|
|
|
|
|
|
|
|
window = _windowList;
|
|
|
|
while (window->mode != 0)
|
|
|
|
window++;
|
|
|
|
|
2006-10-17 01:04:14 +00:00
|
|
|
if (getGameType() == GType_ELVIRA1 && y >= 133)
|
|
|
|
textColor += 16;
|
|
|
|
|
2006-04-29 13:38:07 +00:00
|
|
|
window->mode = 2;
|
|
|
|
window->x = x;
|
|
|
|
window->y = y;
|
|
|
|
window->width = w;
|
|
|
|
window->height = h;
|
|
|
|
window->flags = flags;
|
2006-10-11 14:03:40 +00:00
|
|
|
window->fill_color = fillColor;
|
|
|
|
window->text_color = textColor;
|
2006-04-29 13:38:07 +00:00
|
|
|
window->textColumn = 0;
|
|
|
|
window->textRow = 0;
|
|
|
|
window->textColumnOffset = 0;
|
|
|
|
window->textMaxLength = window->width * 8 / 6; // characters are 6 pixels
|
|
|
|
window->scrollY = 0;
|
2006-10-13 02:22:33 +00:00
|
|
|
|
2006-10-17 01:04:14 +00:00
|
|
|
if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2 || getGameType() == GType_WW)
|
2006-10-13 02:22:33 +00:00
|
|
|
clearWindow(window);
|
|
|
|
|
2006-04-29 13:38:07 +00:00
|
|
|
return window;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::changeWindow(uint a) {
|
2006-04-29 13:38:07 +00:00
|
|
|
a &= 7;
|
|
|
|
|
|
|
|
if (_windowArray[a] == NULL || _curWindow == a)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_curWindow = a;
|
2006-10-21 01:51:59 +00:00
|
|
|
justifyOutPut(0);
|
2006-04-29 13:38:07 +00:00
|
|
|
_textWindow = _windowArray[a];
|
2006-10-27 13:28:32 +00:00
|
|
|
justifyStart();
|
2006-04-29 13:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::closeWindow(uint a) {
|
2006-04-29 13:38:07 +00:00
|
|
|
if (_windowArray[a] == NULL)
|
|
|
|
return;
|
|
|
|
removeIconArray(a);
|
|
|
|
resetWindow(_windowArray[a]);
|
|
|
|
_windowArray[a] = NULL;
|
|
|
|
if (_curWindow == a) {
|
|
|
|
_textWindow = NULL;
|
|
|
|
changeWindow(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::clearWindow(WindowBlock *window) {
|
2006-04-29 13:38:07 +00:00
|
|
|
if (window->flags & 0x10)
|
|
|
|
restoreWindow(window);
|
|
|
|
else
|
|
|
|
colorWindow(window);
|
|
|
|
|
|
|
|
window->textColumn = 0;
|
|
|
|
window->textRow = 0;
|
|
|
|
window->textColumnOffset = 0;
|
|
|
|
window->textLength = 0;
|
|
|
|
window->scrollY = 0;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::colorWindow(WindowBlock *window) {
|
2006-04-29 13:38:07 +00:00
|
|
|
byte *dst;
|
|
|
|
uint h, w;
|
|
|
|
|
|
|
|
_lockWord |= 0x8000;
|
|
|
|
|
2006-09-29 03:25:08 +00:00
|
|
|
if (getGameType() == GType_FF || getGameType() == GType_PP) {
|
2006-04-29 13:38:07 +00:00
|
|
|
dst = getFrontBuf() + _dxSurfacePitch * window->y + window->x;
|
|
|
|
|
|
|
|
for (h = 0; h < window->height; h++) {
|
|
|
|
for (w = 0; w < window->width; w++) {
|
|
|
|
if (dst[w] == 113 || dst[w] == 116 || dst[w] == 252)
|
|
|
|
dst[w] = window->fill_color;
|
|
|
|
}
|
|
|
|
dst += _screenWidth;
|
|
|
|
}
|
|
|
|
} else {
|
2007-05-09 15:36:05 +00:00
|
|
|
if (getGameType() == GType_ELVIRA2 && window->y == 146) {
|
|
|
|
if (window->fill_color == 1) {
|
|
|
|
_displayPalette[33 * 4 + 0] = 48 * 4;
|
|
|
|
_displayPalette[33 * 4 + 1] = 40 * 4;
|
|
|
|
_displayPalette[33 * 4 + 2] = 32 * 4;
|
|
|
|
} else {
|
|
|
|
_displayPalette[33 * 4 + 0] = 56 * 4;
|
|
|
|
_displayPalette[33 * 4 + 1] = 56 * 4;
|
|
|
|
_displayPalette[33 * 4 + 2] = 40 * 4;
|
|
|
|
}
|
2007-05-13 05:58:18 +00:00
|
|
|
|
|
|
|
_paletteFlag = 2;
|
2007-05-09 15:36:05 +00:00
|
|
|
}
|
|
|
|
|
2006-04-29 13:38:07 +00:00
|
|
|
dst = getFrontBuf() + _dxSurfacePitch * window->y + window->x * 8;
|
|
|
|
h = window->height * 8;
|
|
|
|
w = window->width * 8;
|
|
|
|
|
2006-11-05 06:26:45 +00:00
|
|
|
uint8 color = window->fill_color;
|
|
|
|
if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW)
|
|
|
|
color += dst[0] & 0xF0;
|
|
|
|
|
2006-04-29 13:38:07 +00:00
|
|
|
do {
|
2006-11-05 06:26:45 +00:00
|
|
|
memset(dst, color, w);
|
2006-04-29 13:38:07 +00:00
|
|
|
dst += _dxSurfacePitch;
|
|
|
|
} while (--h);
|
|
|
|
}
|
|
|
|
|
|
|
|
_lockWord &= ~0x8000;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::resetWindow(WindowBlock *window) {
|
2006-04-29 13:38:07 +00:00
|
|
|
if (window->flags & 8)
|
|
|
|
restoreWindow(window);
|
|
|
|
window->mode = 0;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::restoreWindow(WindowBlock *window) {
|
2006-04-29 13:38:07 +00:00
|
|
|
_lockWord |= 0x8000;
|
|
|
|
|
2006-09-29 03:25:08 +00:00
|
|
|
if (getGameType() == GType_FF || getGameType() == GType_PP) {
|
2006-04-29 13:38:07 +00:00
|
|
|
restoreBlock(window->y + window->height, window->x + window->width, window->y, window->x);
|
|
|
|
} else if (getGameType() == GType_SIMON2) {
|
|
|
|
if (_restoreWindow6 && _windowArray[2] == window) {
|
|
|
|
window = _windowArray[6];
|
|
|
|
_restoreWindow6 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
restoreBlock(window->y + window->height * 8, (window->x + window->width) * 8, window->y, window->x * 8);
|
2007-05-22 10:31:51 +00:00
|
|
|
} else if (getGameType() == GType_SIMON1) {
|
2006-04-29 13:38:07 +00:00
|
|
|
restoreBlock(window->y + window->height * 8 + ((window == _windowArray[2]) ? 1 : 0), (window->x + window->width) * 8, window->y, window->x * 8);
|
2007-05-22 10:31:51 +00:00
|
|
|
} else {
|
|
|
|
restoreBlock(window->y + window->height * 8, (window->x + window->width) * 8, window->y, window->x * 8);
|
2006-04-29 13:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
_lockWord &= ~0x8000;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::restoreBlock(uint h, uint w, uint y, uint x) {
|
2006-04-29 14:11:29 +00:00
|
|
|
byte *dst, *src;
|
|
|
|
uint i;
|
|
|
|
|
|
|
|
dst = getFrontBuf();
|
2007-05-09 15:36:05 +00:00
|
|
|
src = getBackGround();
|
2006-04-29 14:11:29 +00:00
|
|
|
|
|
|
|
dst += y * _dxSurfacePitch;
|
|
|
|
src += y * _dxSurfacePitch;
|
|
|
|
|
|
|
|
while (y < h) {
|
|
|
|
for (i = x; i < w; i++)
|
|
|
|
dst[i] = src[i];
|
|
|
|
y++;
|
|
|
|
dst += _dxSurfacePitch;
|
|
|
|
src += _dxSurfacePitch;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-11-06 13:59:11 +00:00
|
|
|
void AGOSEngine::setTextColor(uint color) {
|
2007-02-12 11:27:11 +00:00
|
|
|
WindowBlock *window = _windowArray[_curWindow];
|
|
|
|
|
|
|
|
if ((getFeatures() & GF_32COLOR) && color != 0) {
|
|
|
|
if (window->fill_color == 17)
|
|
|
|
color = 25;
|
|
|
|
else
|
|
|
|
color = 12;
|
|
|
|
}
|
2006-11-06 13:59:11 +00:00
|
|
|
|
|
|
|
window->text_color = color;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::windowPutChar(uint a) {
|
2007-05-22 11:31:31 +00:00
|
|
|
if (_textWindow != _windowArray[0]) {
|
|
|
|
if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) {
|
|
|
|
if (!(_textWindow->flags & 1)) {
|
|
|
|
haltAnimation();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-04-29 13:38:07 +00:00
|
|
|
windowPutChar(_textWindow, a);
|
2007-05-22 11:31:31 +00:00
|
|
|
}
|
2006-04-29 13:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-11-15 13:11:53 +00:00
|
|
|
void AGOSEngine::waitWindow(WindowBlock *window) {
|
|
|
|
HitArea *ha;
|
|
|
|
const char *message;
|
|
|
|
|
|
|
|
window->textColumn = (window->width / 2) - 3;
|
|
|
|
window->textRow = window->height - 1;
|
|
|
|
window->textLength = 0;
|
|
|
|
|
|
|
|
message = "[ OK ]";
|
|
|
|
for (; *message; message++)
|
|
|
|
windowPutChar(window, *message);
|
|
|
|
|
|
|
|
ha = findEmptyHitArea();
|
2007-05-06 09:31:32 +00:00
|
|
|
ha->x = (window->width / 2 + window->x - 3) * 8;
|
|
|
|
ha->y = window->height * 8 + window->y - 8;
|
2006-11-15 13:11:53 +00:00
|
|
|
ha->width = 48;
|
|
|
|
ha->height = 8;
|
|
|
|
ha->flags = kBFBoxInUse;
|
|
|
|
ha->id = 0x7FFF;
|
|
|
|
ha->priority = 999;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
_lastHitArea = NULL;
|
|
|
|
_lastHitArea3 = NULL;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
if (_lastHitArea3 != 0)
|
|
|
|
break;
|
|
|
|
delay(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
ha = _lastHitArea;
|
|
|
|
if (ha == NULL) {
|
|
|
|
} else if (ha->id == 0x7FFF) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
undefineBox(0x7FFF);
|
|
|
|
}
|
|
|
|
|
2007-05-07 01:11:10 +00:00
|
|
|
void AGOSEngine::writeChar(WindowBlock *window, int x, int y, int offs, int val) {
|
|
|
|
int chr;
|
|
|
|
|
|
|
|
// Clear background of first digit
|
|
|
|
window->textColumnOffset = offs;
|
|
|
|
window->text_color = 0;
|
|
|
|
windowDrawChar(window, x * 8, y, 129);
|
|
|
|
|
|
|
|
if (val != -1) {
|
|
|
|
// Print first digit
|
|
|
|
chr = val / 10 + 48;
|
|
|
|
window->text_color = 15;
|
|
|
|
windowDrawChar(window, x * 8, y, chr);
|
|
|
|
}
|
|
|
|
|
|
|
|
offs += 6;
|
|
|
|
if (offs >= 7) {
|
|
|
|
offs -= 8;
|
|
|
|
x++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clear background of second digit
|
|
|
|
window->textColumnOffset = offs;
|
|
|
|
window->text_color = 0;
|
|
|
|
windowDrawChar(window, x * 8, y, 129);
|
|
|
|
|
|
|
|
if (val != -1) {
|
|
|
|
// Print second digit
|
|
|
|
chr = val % 10 + 48;
|
|
|
|
window->text_color = 15;
|
|
|
|
windowDrawChar(window, x * 8, y, chr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
} // End of namespace AGOS
|