mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
KYRA: (EOB/PC98) - fix level loading and some cleanup
(no block drawing yet)
This commit is contained in:
@@ -282,7 +282,7 @@ void CharacterGenerator::init() {
|
||||
_screen->fadeToBlack(32);
|
||||
|
||||
_screen->loadEoBBitmap("CHARGEN", _vm->_cgaMappingDefault, 5, 3, 0);
|
||||
_screen->loadPC98Palette(4, _screen->getPalette(0));
|
||||
_screen->selectPC98Palette(4, _screen->getPalette(0));
|
||||
|
||||
if (_vm->gameFlags().platform == Common::kPlatformAmiga || (_vm->game() == GI_EOB1 && _vm->gameFlags().platform == Common::kPlatformPC98))
|
||||
_screen->fadeFromBlack(32);
|
||||
|
||||
@@ -67,10 +67,11 @@ Common::Error DarkMoonEngine::init() {
|
||||
_screen->loadPalette(_flags.platform == Common::kPlatformFMTowns ? "MENU.PAL" : "PALETTE.COL", _screen->getPalette(0));
|
||||
_screen->setScreenPalette(_screen->getPalette(0));
|
||||
|
||||
// adjust menu settings for EOB II FM-Towns
|
||||
if (_flags.platform == Common::kPlatformFMTowns) {
|
||||
// adjust menu settings for EOB II FM-Towns
|
||||
_screen->modifyScreenDim(6, 10, 100, 21, 40);
|
||||
_screen->modifyScreenDim(27, 0, 0, 21, 2);
|
||||
_vcnFilePattern = "%s.VCC";
|
||||
}
|
||||
|
||||
return Common::kNoError;
|
||||
|
||||
@@ -72,6 +72,7 @@ Common::Error EoBEngine::init() {
|
||||
_screen->modifyScreenDim(9, 0x01, 0x7D, 0x26, 0x3F);
|
||||
_screen->modifyScreenDim(12, 0x01, 0x04, 0x14, 0xA0);
|
||||
|
||||
// adjust main menu coords for EOB I PC-98
|
||||
if (_flags.platform == Common::kPlatformPC98)
|
||||
_screen->modifyScreenDim(28, 0x0A, 0xA4, 0x15, 0x18);
|
||||
|
||||
@@ -85,6 +86,14 @@ Common::Error EoBEngine::init() {
|
||||
_screen->loadPalette("PALETTE.COL", _screen->getPalette(0));
|
||||
}
|
||||
|
||||
if (_flags.platform == Common::kPlatformPC98) {
|
||||
_vcnFilePattern = "%s.ECB";
|
||||
_vmpFilePattern = "%s.EMP";
|
||||
} else if (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA) {
|
||||
_vcnFilePattern = "%s.ECN";
|
||||
_vmpFilePattern = "%s.EMP";
|
||||
}
|
||||
|
||||
return Common::kNoError;
|
||||
}
|
||||
|
||||
@@ -387,9 +396,9 @@ void EoBEngine::loadDoorShapes(int doorType1, int shapeId1, int doorType2, int s
|
||||
if (doorType1 != 0xFF) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
const uint8 *enc = &_doorShapeEncodeDefs[(doorType1 * 3 + i) << 2];
|
||||
_doorShapes[shapeId1 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_doorShapes[shapeId1 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
enc = &_doorSwitchShapeEncodeDefs[(doorType1 * 3 + i) << 2];
|
||||
_doorSwitches[shapeId1 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_doorSwitches[shapeId1 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_doorSwitches[shapeId1 + i].x = _doorSwitchCoords[doorType1 * 6 + i * 2];
|
||||
_doorSwitches[shapeId1 + i].y = _doorSwitchCoords[doorType1 * 6 + i * 2 + 1];
|
||||
}
|
||||
@@ -398,9 +407,9 @@ void EoBEngine::loadDoorShapes(int doorType1, int shapeId1, int doorType2, int s
|
||||
if (doorType2 != 0xFF) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
const uint8 *enc = &_doorShapeEncodeDefs[(doorType2 * 3 + i) << 2];
|
||||
_doorShapes[shapeId2 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_doorShapes[shapeId2 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
enc = &_doorSwitchShapeEncodeDefs[(doorType2 * 3 + i) << 2];
|
||||
_doorSwitches[shapeId2 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_doorSwitches[shapeId2 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_doorSwitches[shapeId2 + i].x = _doorSwitchCoords[doorType2 * 6 + i * 2];
|
||||
_doorSwitches[shapeId2 + i].y = _doorSwitchCoords[doorType2 * 6 + i * 2 + 1];
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace Kyra {
|
||||
|
||||
class EoBEngine : public EoBCoreEngine {
|
||||
friend class GUI_EoB;
|
||||
friend class EoBSeqPlayerCommon;
|
||||
friend class EoBIntroPlayer;
|
||||
friend class EoBAmigaFinalePlayer;
|
||||
public:
|
||||
@@ -84,8 +85,6 @@ private:
|
||||
void seq_playFinale();
|
||||
void seq_xdeath();
|
||||
|
||||
void boxMorphTransition(int targetDestX, int targetDestY, int targetFinalX, int targetFinalY, int targetSrcX, int targetSrcY, int targetFinalW, int targetFinalH, int originX1, int originY1, int originW, int originH, int fillColor = -1);
|
||||
|
||||
const char *const *_finBonusStrings;
|
||||
|
||||
// characters
|
||||
|
||||
@@ -59,6 +59,8 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE
|
||||
_envAudioTimer = 0;
|
||||
_flashShapeTimer = 0;
|
||||
_drawSceneTimer = 0;
|
||||
_vcnFilePattern = "%s.VCN";
|
||||
_vmpFilePattern = "%s.VMP";
|
||||
|
||||
_largeItemShapes = _smallItemShapes = _thrownItemShapes = _spellShapes = _firebeamShapes = 0;
|
||||
_itemIconShapes = _amigaBlueItemIconShapes = _wallOfForceShapes = _teleporterShapes = _sparkShapes = _compassShapes = 0;
|
||||
|
||||
@@ -629,6 +629,8 @@ protected:
|
||||
int8 _currentSub;
|
||||
Common::String _curGfxFile;
|
||||
Common::String _curBlockFile;
|
||||
Common::String _vcnFilePattern;
|
||||
Common::String _vmpFilePattern;
|
||||
|
||||
uint32 _drawSceneTimer;
|
||||
uint32 _flashShapeTimer;
|
||||
|
||||
@@ -94,7 +94,7 @@ void EoBCoreEngine::loadLevel(int level, int sub) {
|
||||
if (_flags.gameID == GI_EOB1 && level == 7 && _levelBlockProperties[0x035C].assignedObjects == 0x0E89)
|
||||
_levelBlockProperties[0x035C].assignedObjects = 0x0E8D;
|
||||
|
||||
loadVcnData(gfxFile.c_str(), (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[level - 1]] : 0);
|
||||
loadVcnData(gfxFile.c_str(), _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[level - 1]] : 0);
|
||||
_screen->loadEoBBitmap("INVENT", _cgaMappingInv, 5, 3, 2);
|
||||
if (_flags.platform == Common::kPlatformAmiga && _flags.gameID == GI_EOB1)
|
||||
_screen->getPalette(0).copy(_screen->getPalette(1), 1, 5, 1);
|
||||
@@ -107,6 +107,9 @@ void EoBCoreEngine::loadLevel(int level, int sub) {
|
||||
_sceneDrawPage2 = 1;
|
||||
_screen->setCurPage(0);
|
||||
setHandItem(_itemInHand);
|
||||
|
||||
if (_flags.platform == Common::kPlatformPC98)
|
||||
snd_playSong(level + 1);
|
||||
}
|
||||
|
||||
void EoBCoreEngine::readLevelFileData(int level) {
|
||||
@@ -159,8 +162,8 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
|
||||
loadBlockProperties((const char *)pos);
|
||||
pos += slen;
|
||||
|
||||
const char *vmpPattern = (_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.EMP" : "%s.VMP";
|
||||
Common::SeekableReadStreamEndian *s = _res->createEndianAwareReadStream(Common::String::format(vmpPattern, (const char *)pos));
|
||||
Common::SeekableReadStreamEndian *s = _res->createEndianAwareReadStream(Common::String::format(_vmpFilePattern.c_str(), (const char *)pos));
|
||||
assert(s);
|
||||
uint16 size = (_flags.platform == Common::kPlatformFMTowns) ? 2916 : s->readUint16();
|
||||
delete[] _vmpPtr;
|
||||
_vmpPtr = new uint16[size];
|
||||
@@ -203,6 +206,8 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
|
||||
_screen->setScreenPalette(_screen->getPalette(0));
|
||||
} else if (_flags.platform == Common::kPlatformAmiga) {
|
||||
// Amiga versions don't have shape shading
|
||||
} else if (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformPC98) {
|
||||
|
||||
} else if (_configRenderMode != Common::kRenderCGA) {
|
||||
Palette backupPal(256);
|
||||
backupPal.copy(_screen->getPalette(0), 224, 32, 224);
|
||||
@@ -320,12 +325,11 @@ void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
|
||||
uint32 vcnSize = 0;
|
||||
|
||||
if (_flags.platform == Common::kPlatformFMTowns) {
|
||||
_vcnBlocks = _res->fileData(Common::String::format("%s.VCC", _lastBlockDataFile).c_str(), &vcnSize);
|
||||
_vcnBlocks = _res->fileData(Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile).c_str(), &vcnSize);
|
||||
return;
|
||||
}
|
||||
|
||||
const char *filePattern = ((_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.ECN" : "%s.VCN");
|
||||
Common::String fn = Common::String::format(filePattern, _lastBlockDataFile);
|
||||
Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile);
|
||||
|
||||
if (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformAmiga) {
|
||||
Common::SeekableReadStream *in = _res->createReadStream(fn);
|
||||
@@ -495,7 +499,7 @@ void EoBCoreEngine::assignWallsAndDecorations(int wallIndex, int vmpIndex, int d
|
||||
if (r->w == 0 || r->h == 0)
|
||||
error("Error trying to make decoration %d (x: %d, y: %d, w: %d, h: %d)", decIndex, r->x, r->y, r->w, r->h);
|
||||
|
||||
_levelDecorationShapes[t] = _screen->encodeShape(r->x, r->y, r->w, r->h, false, (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_levelDecorationShapes[t] = _screen->encodeShape(r->x, r->y, r->w, r->h, false, _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
}
|
||||
|
||||
decIndex = _levelDecorationProperties[_mappedDecorationsCount++].next;
|
||||
@@ -706,7 +710,7 @@ int EoBCoreEngine::calcNewBlockPositionAndTestPassability(uint16 curBlock, uint1
|
||||
|
||||
void EoBCoreEngine::notifyBlockNotPassable() {
|
||||
_txt->printMessage(_warningStrings[0]);
|
||||
snd_playSoundEffect(29); //PC98 : 45
|
||||
snd_playSoundEffect(_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformPC98 ? 45 : 29);
|
||||
removeInputTop();
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ Screen::Screen(KyraEngine_v1 *vm, OSystem *system, const ScreenDim *dimTable, co
|
||||
_sjisMixedFontMode = false;
|
||||
|
||||
_useHiColorScreen = _vm->gameFlags().useHiColorMode;
|
||||
_use256ColorMode = true;
|
||||
_screenPageSize = SCREEN_PAGE_SIZE;
|
||||
_16bitPalette = 0;
|
||||
_16bitConversionPalette = 0;
|
||||
@@ -189,6 +190,7 @@ bool Screen::init() {
|
||||
// We allow 256 color palettes in EGA mode, since original EOB II code does the same and requires it
|
||||
const int numColors = _use16ColorMode ? 16 : (_isAmiga ? 32 : (_renderMode == Common::kRenderCGA ? 4 : 256));
|
||||
const int numColorsInternal = _useAmigaExtraColors ? 64 : numColors;
|
||||
_use256ColorMode = (_bytesPerPixel != 2 && !_isAmiga && !_use16ColorMode && _renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA);
|
||||
|
||||
_interfacePaletteEnabled = false;
|
||||
|
||||
|
||||
@@ -690,6 +690,7 @@ protected:
|
||||
bool _useOverlays;
|
||||
bool _useSJIS;
|
||||
bool _use16ColorMode;
|
||||
bool _use256ColorMode;
|
||||
bool _4bitPixelPacking;
|
||||
bool _useHiResEGADithering;
|
||||
bool _useHiColorScreen;
|
||||
|
||||
@@ -63,10 +63,8 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system,
|
||||
_cgaMappingDefault = 0;
|
||||
_cgaDitheringTables[0] = _cgaDitheringTables[1] = 0;
|
||||
_useHiResEGADithering = _dualPaletteMode = false;
|
||||
_cpsFileExt = 0;
|
||||
_decodeTempBuffer = 0;
|
||||
_curPalID = 0;
|
||||
_curPal = 0;
|
||||
_cpsFilePattern = "%s.";
|
||||
for (int i = 0; i < 10; ++i)
|
||||
_palette16c[i] = 0;
|
||||
}
|
||||
@@ -133,7 +131,7 @@ bool Screen_EoB::init() {
|
||||
} else if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
|
||||
ci = 2;
|
||||
}
|
||||
_cpsFileExt = cpsExt[ci];
|
||||
_cpsFilePattern += cpsExt[ci];
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -261,12 +259,15 @@ void Screen_EoB::loadBitmap(const char *filename, int tempPage, int dstPage, Pal
|
||||
str->skip(2);
|
||||
uint16 imgSize = str->readUint16LE();
|
||||
assert(imgSize == str->size() - 4);
|
||||
loadFileDataToPage(str, tempPage, imgSize);
|
||||
uint8 *buf = new uint8[SCREEN_W * SCREEN_H];
|
||||
str->read(buf, imgSize);
|
||||
delete str;
|
||||
|
||||
decodeBIN(_pagePtrs[tempPage], _pagePtrs[dstPage], imgSize);
|
||||
decodeBIN(buf, _pagePtrs[dstPage], imgSize);
|
||||
if (!skip)
|
||||
decodePC98PlanarBitmap(dstPage, tempPage);
|
||||
decodePC98PlanarBitmap(_pagePtrs[dstPage], buf, SCREEN_W * SCREEN_H);
|
||||
|
||||
delete[] buf;
|
||||
} else {
|
||||
Screen::loadBitmap(filename, tempPage, dstPage, pal);
|
||||
}
|
||||
@@ -296,7 +297,7 @@ void Screen_EoB::loadBitmap(const char *filename, int tempPage, int dstPage, Pal
|
||||
}
|
||||
|
||||
void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage) {
|
||||
Common::String tmp = Common::String::format("%s.%s", file, _cpsFileExt);
|
||||
Common::String tmp = Common::String::format(_cpsFilePattern.c_str(), file);
|
||||
Common::SeekableReadStream *s = _vm->resource()->createReadStream(tmp);
|
||||
bool loadAlternative = false;
|
||||
|
||||
@@ -1563,24 +1564,19 @@ void Screen_EoB::shadeRect(int x1, int y1, int x2, int y2, int shadingLevel) {
|
||||
_16bitShadingLevel = l;
|
||||
}
|
||||
|
||||
void Screen_EoB::loadPC98Palette(int palID, Palette &dest) {
|
||||
if (palID < 0 || palID > 9)
|
||||
void Screen_EoB::selectPC98Palette(int paletteIndex, Palette &dest, int brightness, bool set) {
|
||||
if (paletteIndex < 0 || paletteIndex > 9)
|
||||
return;
|
||||
if (!_use16ColorMode || !_palette16c[palID])
|
||||
if (!_use16ColorMode || !_palette16c[paletteIndex])
|
||||
return;
|
||||
_curPalID = palID;
|
||||
_curPal = &dest;
|
||||
loadPalette(_palette16c[palID], dest, 48);
|
||||
}
|
||||
|
||||
void Screen_EoB::setPC98PaletteBrightness(int modifier) {
|
||||
if (!_use16ColorMode || !_palette16c[_curPalID])
|
||||
return;
|
||||
uint8 pal[48];
|
||||
for (int i = 0; i < 48; ++i)
|
||||
pal[i] = CLIP<int>(_palette16c[_curPalID][i] + modifier, 0, 15);
|
||||
loadPalette(pal, *_curPal, 48);
|
||||
setScreenPalette(*_curPal);
|
||||
pal[i] = CLIP<int>(_palette16c[paletteIndex][i] + brightness, 0, 15);
|
||||
loadPalette(pal, dest, 48);
|
||||
|
||||
if (set)
|
||||
setScreenPalette(dest);
|
||||
}
|
||||
|
||||
void Screen_EoB::decodeBIN(const uint8 *src, uint8 *dst, uint16 inSize) {
|
||||
@@ -1631,14 +1627,14 @@ void Screen_EoB::decodeBIN(const uint8 *src, uint8 *dst, uint16 inSize) {
|
||||
}
|
||||
}
|
||||
|
||||
void Screen_EoB::decodePC98PlanarBitmap(int srcDstPage, int tempPage) {
|
||||
assert(tempPage != srcDstPage);
|
||||
copyPage(srcDstPage, tempPage);
|
||||
const uint8 *src = getCPagePtr(tempPage);
|
||||
uint8 *dst1 = _pagePtrs[srcDstPage];
|
||||
uint8 *dst2 = _pagePtrs[srcDstPage] + 4;
|
||||
uint16 len = (SCREEN_W * SCREEN_H) >> 3;
|
||||
while (len--) {
|
||||
void Screen_EoB::decodePC98PlanarBitmap(uint8 *srcDstBuffer, uint8 *tmpBuffer, uint16 size) {
|
||||
assert(tmpBuffer != srcDstBuffer);
|
||||
memcpy(tmpBuffer, srcDstBuffer, size);
|
||||
const uint8 *src = tmpBuffer;
|
||||
uint8 *dst1 = srcDstBuffer;
|
||||
uint8 *dst2 = srcDstBuffer + 4;
|
||||
size >>= 3;
|
||||
while (size--) {
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
uint8 col1 = 0;
|
||||
uint8 col2 = 0;
|
||||
@@ -1862,7 +1858,7 @@ void Screen_EoB::drawShapeSetPixel(uint8 *dst, uint8 col) {
|
||||
if (_bytesPerPixel == 2) {
|
||||
*(uint16*)dst = _16bitPalette[(_dsShapeFadingLevel << 8) + col];
|
||||
return;
|
||||
} else if ((!_isAmiga && _renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA) || _useHiResEGADithering) {
|
||||
} else if (_use256ColorMode || _useHiResEGADithering) {
|
||||
if (_dsBackgroundFading) {
|
||||
if (_dsShapeFadingLevel) {
|
||||
col = *dst;
|
||||
|
||||
@@ -91,14 +91,11 @@ public:
|
||||
void shadeRect(int x1, int y1, int x2, int y2, int shadingLevel);
|
||||
|
||||
// PC-98 specific
|
||||
void loadPC98Palette(int palID, Palette &dest);
|
||||
void setPC98PaletteBrightness(int modifier);
|
||||
void selectPC98Palette(int paletteIndex, Palette &dest, int brightness = 0, bool set = false);
|
||||
void decodeBIN(const uint8 *src, uint8 *dst, uint16 inSize);
|
||||
void decodePC98PlanarBitmap(int srcDstPage, int tempPage);
|
||||
void decodePC98PlanarBitmap(uint8 *srcDstBuffer, uint8 *tmpBuffer, uint16 size = 64000);
|
||||
|
||||
uint8 *_decodeTempBuffer;
|
||||
int _curPalID;
|
||||
Palette *_curPal;
|
||||
|
||||
// Amiga specific
|
||||
void loadSpecialAmigaCPS(const char *fileName, int destPage, bool isGraphics);
|
||||
@@ -148,7 +145,7 @@ private:
|
||||
// hard coded 16 color palettes for PC98 version of EOB1
|
||||
const uint8 *_palette16c[10];
|
||||
|
||||
const char *_cpsFileExt;
|
||||
Common::String _cpsFilePattern;
|
||||
|
||||
const uint16 _cursorColorKey16Bit;
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ void EoBCoreEngine::gui_drawPlayField(bool refresh) {
|
||||
}
|
||||
|
||||
void EoBCoreEngine::gui_restorePlayField() {
|
||||
loadVcnData(0, (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
loadVcnData(0, _cgaLevelMappingIndex ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0);
|
||||
_screen->_curPage = 0;
|
||||
gui_drawPlayField(true);
|
||||
gui_drawAllCharPortraitsWithStats();
|
||||
|
||||
@@ -181,9 +181,9 @@ friend class ::KyraMetaEngine;
|
||||
friend class GUI;
|
||||
friend class GUI_v1;
|
||||
friend class GUI_EoB;
|
||||
friend class SoundMidiPC; // For _eventMan
|
||||
friend class SeqPlayer_HOF; // For skipFlag()
|
||||
friend class TransferPartyWiz; // For save state API
|
||||
friend class SoundMidiPC; // For _eventMan
|
||||
friend class SeqPlayer_HOF; // For skipFlag()
|
||||
friend class TransferPartyWiz; // For save state API
|
||||
public:
|
||||
KyraEngine_v1(OSystem *system, const GameFlags &flags);
|
||||
virtual ~KyraEngine_v1();
|
||||
|
||||
@@ -33,10 +33,29 @@
|
||||
|
||||
namespace Kyra {
|
||||
|
||||
class EoBIntroPlayer {
|
||||
class EoBSeqPlayerCommon {
|
||||
public:
|
||||
EoBSeqPlayerCommon(EoBEngine *vm, Screen_EoB *screen);
|
||||
virtual ~EoBSeqPlayerCommon() {}
|
||||
|
||||
protected:
|
||||
void boxMorphTransition(int targetDestX, int targetDestY, int targetFinalX, int targetFinalY, int targetSrcX, int targetSrcY, int targetFinalW, int targetFinalH, int originX1, int originY1, int originW, int originH, int fillColor = -1);
|
||||
void printSubtitle(const char *str, int textmodeX, int textmodeY, int col, int mode = 0);
|
||||
|
||||
const uint8 _fillColor1;
|
||||
const uint8 _fillColor2;
|
||||
|
||||
EoBEngine *_vm;
|
||||
Screen_EoB *_screen;
|
||||
|
||||
private:
|
||||
uint8 _textColor;
|
||||
};
|
||||
|
||||
class EoBIntroPlayer : public EoBSeqPlayerCommon {
|
||||
public:
|
||||
EoBIntroPlayer(EoBEngine *vm, Screen_EoB *screen);
|
||||
~EoBIntroPlayer() {}
|
||||
virtual ~EoBIntroPlayer() {}
|
||||
|
||||
enum IntroPart {
|
||||
kOnlyCredits = 0,
|
||||
@@ -59,12 +78,6 @@ private:
|
||||
void loadAndSetPalette(const char *dosPaletteFile, int pc98PaletteID);
|
||||
void copyBlurRegion(int x1, int y1, int x2, int y2, int w, int h, int step);
|
||||
void whirlTransition();
|
||||
void printSubtitle(const char *str, int textmodeX, int textmodeY, int col, int mode = 0);
|
||||
|
||||
uint8 _textColor;
|
||||
|
||||
EoBEngine *_vm;
|
||||
Screen_EoB *_screen;
|
||||
|
||||
int _lastFileOpening;
|
||||
const char *const *_filesOpening;
|
||||
@@ -94,15 +107,12 @@ private:
|
||||
const uint8 *_tvlY2;
|
||||
const uint8 *_tvlW;
|
||||
const uint8 *_tvlH;
|
||||
|
||||
const uint8 _fillColor1;
|
||||
const uint8 _fillColor2;
|
||||
};
|
||||
|
||||
class EoBAmigaFinalePlayer {
|
||||
class EoBAmigaFinalePlayer : public EoBSeqPlayerCommon {
|
||||
public:
|
||||
EoBAmigaFinalePlayer(EoBEngine *vm, Screen_EoB *screen);
|
||||
~EoBAmigaFinalePlayer();
|
||||
virtual ~EoBAmigaFinalePlayer();
|
||||
|
||||
void start();
|
||||
|
||||
@@ -128,13 +138,129 @@ private:
|
||||
const uint8 *_textFrameDuration;
|
||||
|
||||
int _animCurFrame;
|
||||
|
||||
EoBEngine *_vm;
|
||||
Screen_EoB *_screen;
|
||||
};
|
||||
|
||||
EoBIntroPlayer::EoBIntroPlayer(EoBEngine *vm, Screen_EoB *screen) : _vm(vm), _screen(screen),
|
||||
_fillColor1(vm->gameFlags().platform == Common::kPlatformAmiga ? 19 : (vm->gameFlags().platform == Common::kPlatformPC98 ? 0 : 12)), _fillColor2(vm->gameFlags().platform == Common::kPlatformAmiga ? 10 : 157) {
|
||||
EoBSeqPlayerCommon::EoBSeqPlayerCommon(EoBEngine *vm, Screen_EoB *screen) : _vm(vm), _screen(screen), _textColor(0xE1),
|
||||
_fillColor1(vm->gameFlags().platform == Common::kPlatformAmiga ? 19 : (vm->gameFlags().platform == Common::kPlatformPC98 ? 0 : 12)),
|
||||
_fillColor2(vm->gameFlags().platform == Common::kPlatformAmiga ? 10 : 157) {
|
||||
}
|
||||
|
||||
void EoBSeqPlayerCommon::boxMorphTransition(int targetDestX, int targetDestY, int targetFinalX, int targetFinalY, int targetSrcX, int targetSrcY, int targetFinalW, int targetFinalH, int originX1, int originY1, int originW, int originH, int fillColor) {
|
||||
int originX2 = originX1 + originW;
|
||||
int originY2 = originY1 + originH;
|
||||
if (originY2 > 21)
|
||||
originY2 = 21;
|
||||
|
||||
if (fillColor != -1) {
|
||||
_screen->fillRect(0, 170, 319, 186, fillColor, 0);
|
||||
_screen->fillRect(0, 170, 319, 186, fillColor, 2);
|
||||
}
|
||||
|
||||
int w = 1;
|
||||
int h = 1;
|
||||
for (bool runloop = true; runloop && !_vm->shouldQuit() && !_vm->skipFlag(); ) {
|
||||
uint32 end = _vm->_system->getMillis() + _vm->tickLength();
|
||||
_screen->copyRegion(targetSrcX << 3, targetSrcY << 3, targetDestX << 3, targetDestY << 3, w << 3, h << 3, 2, 0, Screen::CR_NO_P_CHECK);
|
||||
if (originX1 < targetDestX)
|
||||
_screen->copyRegion(312, 0, originX1 << 3, 0, 8, 176, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
if (originY1 < targetDestY)
|
||||
_screen->copyRegion(0, 192, 0, originY1 << 3, 320, 8, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
if ((targetFinalX + targetFinalW) <= originX2)
|
||||
_screen->copyRegion(312, 0, originX2 << 3, 0, 8, 176, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
if ((targetFinalY + targetFinalH) <= originY2)
|
||||
_screen->copyRegion(0, 192, 0, originY2 << 3, 320, 8, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
|
||||
if (!(targetDestX != targetFinalX || targetDestY != targetFinalY || w != targetFinalW || h != targetFinalH || originX1 < targetFinalX || originY1 < targetFinalY || (targetFinalX + targetFinalW) < originX2 || (targetFinalY + targetFinalH) < originY2))
|
||||
runloop = false;
|
||||
|
||||
int v = targetFinalX - targetDestX;
|
||||
v = (v < 0) ? -1 : ((v > 0) ? 1 : 0);
|
||||
targetDestX += v;
|
||||
v = targetFinalY - targetDestY;
|
||||
v = (v < 0) ? -1 : ((v > 0) ? 1 : 0);
|
||||
targetDestY += v;
|
||||
|
||||
if (w != targetFinalW)
|
||||
w += 2;
|
||||
if (w > targetFinalW)
|
||||
w = targetFinalW;
|
||||
|
||||
if (h != targetFinalH)
|
||||
h += 2;
|
||||
if (h > targetFinalH)
|
||||
h = targetFinalH;
|
||||
|
||||
if (++originX1 > targetFinalX)
|
||||
originX1 = targetFinalX;
|
||||
|
||||
if (++originY1 > targetFinalY)
|
||||
originY1 = targetFinalY;
|
||||
|
||||
if ((targetFinalX + targetFinalW) < originX2)
|
||||
originX2--;
|
||||
|
||||
if ((targetFinalY + targetFinalH) < originY2)
|
||||
originY2--;
|
||||
|
||||
_screen->updateScreen();
|
||||
_vm->delayUntil(end);
|
||||
}
|
||||
}
|
||||
|
||||
void EoBSeqPlayerCommon::printSubtitle(const char *str, int textmodeX, int textmodeY, int col, int mode) {
|
||||
if (col)
|
||||
_textColor = col & 0xFF;
|
||||
|
||||
char charStr[3];
|
||||
charStr[2] = 0;
|
||||
int curX = 0;
|
||||
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
Screen::FontId of = _screen->setFont(Screen::FID_SJIS_TEXTMODE_FNT);
|
||||
int cp = _screen->setCurPage(0);
|
||||
|
||||
for (int i = 0; str[i] &&!_vm->shouldQuit() && !_vm->skipFlag(); ) {
|
||||
uint8 c = str[i++];
|
||||
if (c == 13) {
|
||||
curX = 0;
|
||||
textmodeY++;
|
||||
} else if (c == 10) {
|
||||
_textColor = str[i++];
|
||||
} else if (c == 7) {
|
||||
_vm->delay(960);
|
||||
_screen->fillRect(0, 160, 319, 199, _fillColor1, 0);
|
||||
curX = 0;
|
||||
}
|
||||
|
||||
charStr[0] = c;
|
||||
charStr[1] = (c >= 0x81 && (c <= 0x9F || (c >= 0xE0 && c <= 0xFC))) ? str[i++] : 0;
|
||||
|
||||
_screen->printText(charStr, (textmodeX << 2) + (curX << 3), textmodeY << 3, _textColor, 0);
|
||||
|
||||
if ((++curX + textmodeX) == 80) {
|
||||
curX = 0;
|
||||
textmodeY++;
|
||||
}
|
||||
|
||||
if (mode == 0) {
|
||||
_vm->_system->delayMillis(40);
|
||||
_screen->updateScreen();
|
||||
} else if (mode == 1) {
|
||||
_vm->delay(40);
|
||||
_screen->updateScreen();
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == 2)
|
||||
_screen->updateScreen();
|
||||
|
||||
_screen->setFont(of);
|
||||
_screen->setCurPage(cp);
|
||||
}
|
||||
|
||||
EoBIntroPlayer::EoBIntroPlayer(EoBEngine *vm, Screen_EoB *screen) : EoBSeqPlayerCommon(vm, screen) {
|
||||
int temp = 0;
|
||||
_filesOpening = _vm->staticres()->loadStrings(kEoB1IntroFilesOpening, temp);
|
||||
_lastFileOpening = temp - 2;
|
||||
@@ -166,7 +292,6 @@ EoBIntroPlayer::EoBIntroPlayer(EoBEngine *vm, Screen_EoB *screen) : _vm(vm), _sc
|
||||
_tvlH = _vm->staticres()->loadRawData(kEoB1IntroTvlH, temp);
|
||||
const uint8 *orbFadePal = _vm->staticres()->loadRawData(kEoB1IntroOrbFadePal, temp);
|
||||
_screen->loadPalette(orbFadePal, _screen->getPalette(2), temp);
|
||||
_textColor = 0xE1;
|
||||
}
|
||||
|
||||
void EoBIntroPlayer::start(int part) {
|
||||
@@ -225,7 +350,7 @@ void EoBIntroPlayer::openingCredits() {
|
||||
_screen->convertPage(3, 0, _vm->_cgaMappingAlt);
|
||||
|
||||
if (_vm->gameFlags().platform == Common::kPlatformPC98)
|
||||
_screen->loadPC98Palette(1, _screen->getPalette(0));
|
||||
_screen->selectPC98Palette(1, _screen->getPalette(0));
|
||||
|
||||
if (_vm->gameFlags().platform == Common::kPlatformDOS) {
|
||||
loadAndSetPalette(_filesOpening[5], 1);
|
||||
@@ -275,8 +400,8 @@ void EoBIntroPlayer::tower() {
|
||||
|
||||
whirlTransition();
|
||||
|
||||
loadAndSetPalette(_filesTower[0], 0);
|
||||
_screen->setPC98PaletteBrightness(-15);
|
||||
loadAndSetPalette(_filesTower[0], -1);
|
||||
_screen->selectPC98Palette(0, _screen->getPalette(0), -15, true);
|
||||
_screen->setCurPage(cp);
|
||||
_screen->clearCurPage();
|
||||
|
||||
@@ -292,12 +417,12 @@ void EoBIntroPlayer::tower() {
|
||||
uint32 end = _vm->_system->getMillis() + 2 * _vm->_tickLength;
|
||||
_screen->copyRegion(0, 142 - i, 96, 0, 128, i + 1, 4, 0, Screen::CR_NO_P_CHECK);
|
||||
_screen->copyRegion(0, 0, 96, i + 1, 128, 167 - i, 2, 0, Screen::CR_NO_P_CHECK);
|
||||
_screen->setPC98PaletteBrightness(MIN(i / 4 - 14, 0));
|
||||
_screen->selectPC98Palette(0, _screen->getPalette(0), MIN(i / 4 - 14, 0), true);
|
||||
_screen->updateScreen();
|
||||
_vm->delayUntil(end);
|
||||
}
|
||||
|
||||
_screen->setPC98PaletteBrightness(0);
|
||||
_screen->selectPC98Palette(0, _screen->getPalette(0), 0, true);
|
||||
|
||||
for (int i = 0; i < 24 && !_vm->shouldQuit() && !_vm->skipFlag(); i += 2) {
|
||||
uint32 end = _vm->_system->getMillis() + 2 * _vm->_tickLength;
|
||||
@@ -633,7 +758,7 @@ void EoBIntroPlayer::hands() {
|
||||
_screen->fillRect(0, 0, 191, 63, _fillColor2, 2);
|
||||
_screen->drawShape(2, shp1, 0, 4, 0);
|
||||
_screen->drawShape(2, shp2, 151, 4, 0);
|
||||
_vm->boxMorphTransition(25, 8, 18, 4, 3, 0, 21, 8, 6, 0, 28, 23);
|
||||
boxMorphTransition(25, 8, 18, 4, 3, 0, 21, 8, 6, 0, 28, 23);
|
||||
|
||||
displaySubtitle(128, 176, 16, _stringsHands, 0, 24, 23, 0xE1, 0);
|
||||
|
||||
@@ -666,7 +791,7 @@ void EoBIntroPlayer::hands() {
|
||||
_screen->fillRect(0, 0, 135, 63, _fillColor2);
|
||||
_screen->drawShape(2, shp1, 32, -80, 0);
|
||||
_screen->drawShape(2, shp2, 40, -16, 0);
|
||||
_vm->boxMorphTransition(18, 16, 10, 12, 0, 0, 17, 8, 17, 3, 25, 10);
|
||||
boxMorphTransition(18, 16, 10, 12, 0, 0, 17, 8, 17, 3, 25, 10);
|
||||
_vm->delay(15 * _vm->_tickLength);
|
||||
|
||||
for (int i = -80; i <= 0 && !_vm->shouldQuit() && !_vm->skipFlag(); i += 4) {
|
||||
@@ -705,7 +830,7 @@ void EoBIntroPlayer::hands() {
|
||||
_screen->fillRect(0, 0, 143, 95, _fillColor2);
|
||||
_screen->drawShape(2, shp1, -56, -56, 0);
|
||||
_screen->drawShape(2, shp2, 52, 49, 0);
|
||||
_vm->boxMorphTransition(9, 6, 0, 0, 0, 0, 18, 12, 8, 11, 21, 10);
|
||||
boxMorphTransition(9, 6, 0, 0, 0, 0, 18, 12, 8, 11, 21, 10);
|
||||
_vm->delay(15 * _vm->_tickLength);
|
||||
_vm->snd_playSoundEffect(11);
|
||||
|
||||
@@ -731,7 +856,7 @@ void EoBIntroPlayer::hands() {
|
||||
_screen->setCurPage(2);
|
||||
_screen->fillRect(0, 0, 87, 112, _fillColor2);
|
||||
_screen->drawShape(2, shp2, 0, 90, 0);
|
||||
_vm->boxMorphTransition(20, 13, 15, 6, 0, 0, 11, 14, 0, 0, 24, 16);
|
||||
boxMorphTransition(20, 13, 15, 6, 0, 0, 11, 14, 0, 0, 24, 16);
|
||||
_vm->delay(15 * _vm->_tickLength);
|
||||
|
||||
int dy = 90;
|
||||
@@ -990,7 +1115,7 @@ void EoBIntroPlayer::loadAndSetPalette(const char *dosPaletteFile, int pc98Palet
|
||||
if (_vm->gameFlags().platform == Common::kPlatformDOS)
|
||||
_screen->loadPalette(dosPaletteFile, _screen->getPalette(0));
|
||||
else if (_vm->gameFlags().platform == Common::kPlatformPC98 && pc98PaletteID >= 0)
|
||||
_screen->loadPC98Palette(pc98PaletteID, _screen->getPalette(0));
|
||||
_screen->selectPC98Palette(pc98PaletteID, _screen->getPalette(0));
|
||||
|
||||
_screen->getPalette(0).fill(0, 1, 0);
|
||||
_screen->setScreenPalette(_screen->getPalette(0));
|
||||
@@ -1081,60 +1206,7 @@ void EoBIntroPlayer::whirlTransition() {
|
||||
}
|
||||
}
|
||||
|
||||
void EoBIntroPlayer::printSubtitle(const char *str, int textmodeX, int textmodeY, int col, int mode) {
|
||||
if (col)
|
||||
_textColor = col & 0xFF;
|
||||
|
||||
char charStr[3];
|
||||
charStr[2] = 0;
|
||||
int curX = 0;
|
||||
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
Screen::FontId of = _screen->setFont(Screen::FID_SJIS_TEXTMODE_FNT);
|
||||
int cp = _screen->setCurPage(0);
|
||||
|
||||
for (int i = 0; str[i]; ) {
|
||||
uint8 c = str[i++];
|
||||
if (c == 13) {
|
||||
curX = 0;
|
||||
textmodeY++;
|
||||
} else if (c == 10) {
|
||||
_textColor = str[i++];
|
||||
} else if (c == 7) {
|
||||
_vm->delay(960);
|
||||
_screen->fillRect(0, 160, 319, 199, _fillColor1, 0);
|
||||
curX = 0;
|
||||
}
|
||||
|
||||
charStr[0] = c;
|
||||
charStr[1] = (c >= 0x81 && (c <= 0x9F || (c >= 0xE0 && c <= 0xFC))) ? str[i++] : 0;
|
||||
|
||||
_screen->printText(charStr, (textmodeX << 2) + (curX << 3), textmodeY << 3, _textColor, 0);
|
||||
|
||||
if ((++curX + textmodeX) == 80) {
|
||||
curX = 0;
|
||||
textmodeY++;
|
||||
}
|
||||
|
||||
if (mode == 0) {
|
||||
_vm->_system->delayMillis(40);
|
||||
_screen->updateScreen();
|
||||
} else if (mode == 1) {
|
||||
_vm->delay(40);
|
||||
_screen->updateScreen();
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == 2)
|
||||
_screen->updateScreen();
|
||||
|
||||
_screen->setFont(of);
|
||||
_screen->setCurPage(cp);
|
||||
}
|
||||
|
||||
EoBAmigaFinalePlayer::EoBAmigaFinalePlayer(EoBEngine *vm, Screen_EoB *screen) : _vm(vm), _screen(screen) {
|
||||
EoBAmigaFinalePlayer::EoBAmigaFinalePlayer(EoBEngine *vm, Screen_EoB *screen) : EoBSeqPlayerCommon(vm, screen) {
|
||||
_animCurFrame = 0;
|
||||
int size = 0;
|
||||
_textShapes = new uint8*[10];
|
||||
@@ -1281,7 +1353,7 @@ void EoBAmigaFinalePlayer::inspection() {
|
||||
_screen->fillRect(0, 48, 9, 120, 31, 0);
|
||||
_screen->fillRect(312, 48, 319, 120, 31, 0);
|
||||
|
||||
_vm->boxMorphTransition(18, 6, 12, 3, 12, 3, 16, 5, 1, 5, 39, 10, 31);
|
||||
boxMorphTransition(18, 6, 12, 3, 12, 3, 16, 5, 1, 5, 39, 10, 31);
|
||||
|
||||
for (int i = 0; i < 5; ++i)
|
||||
shp[i] = _screen->encodeShape((i << 2) + 8, 0, 4, 24, true);
|
||||
@@ -1327,7 +1399,7 @@ void EoBAmigaFinalePlayer::surprise() {
|
||||
_screen->copyRegion(crds[0] << 3, crds[1], crds[4] << 3, crds[5], crds[2] << 3, crds[3], 4, 2, Screen::CR_NO_P_CHECK);
|
||||
}
|
||||
|
||||
_vm->boxMorphTransition(0, 9, 0, 6, 0, 10, 40, 9, 12, 3, 16, 21, 31);
|
||||
boxMorphTransition(0, 9, 0, 6, 0, 10, 40, 9, 12, 3, 16, 21, 31);
|
||||
|
||||
for (int i = 0; i < 15 && !_vm->skipFlag() && !_vm->shouldQuit(); ++i) {
|
||||
animateCouncil1(4, 2);
|
||||
@@ -1546,7 +1618,7 @@ int EoBEngine::mainMenu() {
|
||||
if (_ttlCfg->fade)
|
||||
_screen->fadeToBlack(10);
|
||||
|
||||
_screen->loadPC98Palette(_ttlCfg->pc98PaletteID, _screen->getPalette(0));
|
||||
_screen->selectPC98Palette(_ttlCfg->pc98PaletteID, _screen->getPalette(0));
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
if (_ttlCfg->palFiles[i].renderMode == -1)
|
||||
break;
|
||||
@@ -1751,68 +1823,6 @@ void EoBEngine::seq_xdeath() {
|
||||
gui_drawAllCharPortraitsWithStats();
|
||||
}
|
||||
|
||||
void EoBEngine::boxMorphTransition(int targetDestX, int targetDestY, int targetFinalX, int targetFinalY, int targetSrcX, int targetSrcY, int targetFinalW, int targetFinalH, int originX1, int originY1, int originW, int originH, int fillColor) {
|
||||
int originX2 = originX1 + originW;
|
||||
int originY2 = originY1 + originH;
|
||||
if (originY2 > 21)
|
||||
originY2 = 21;
|
||||
|
||||
if (fillColor != -1) {
|
||||
_screen->fillRect(0, 170, 319, 186, fillColor, 0);
|
||||
_screen->fillRect(0, 170, 319, 186, fillColor, 2);
|
||||
}
|
||||
|
||||
int w = 1;
|
||||
int h = 1;
|
||||
for (bool runloop = true; runloop && !shouldQuit() && !skipFlag();) {
|
||||
uint32 end = _system->getMillis() + _tickLength;
|
||||
_screen->copyRegion(targetSrcX << 3, targetSrcY << 3, targetDestX << 3, targetDestY << 3, w << 3, h << 3, 2, 0, Screen::CR_NO_P_CHECK);
|
||||
if (originX1 < targetDestX)
|
||||
_screen->copyRegion(312, 0, originX1 << 3, 0, 8, 176, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
if (originY1 < targetDestY)
|
||||
_screen->copyRegion(0, 192, 0, originY1 << 3, 320, 8, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
if ((targetFinalX + targetFinalW) <= originX2)
|
||||
_screen->copyRegion(312, 0, originX2 << 3, 0, 8, 176, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
if ((targetFinalY + targetFinalH) <= originY2)
|
||||
_screen->copyRegion(0, 192, 0, originY2 << 3, 320, 8, 0, 0, Screen::CR_NO_P_CHECK);
|
||||
|
||||
if (!(targetDestX != targetFinalX || targetDestY != targetFinalY || w != targetFinalW || h != targetFinalH || originX1 < targetFinalX || originY1 < targetFinalY || (targetFinalX + targetFinalW) < originX2 || (targetFinalY + targetFinalH) < originY2))
|
||||
runloop = false;
|
||||
|
||||
int v = targetFinalX - targetDestX;
|
||||
v = (v < 0) ? -1 : ((v > 0) ? 1 : 0);
|
||||
targetDestX += v;
|
||||
v = targetFinalY - targetDestY;
|
||||
v = (v < 0) ? -1 : ((v > 0) ? 1 : 0);
|
||||
targetDestY += v;
|
||||
|
||||
if (w != targetFinalW)
|
||||
w += 2;
|
||||
if (w > targetFinalW)
|
||||
w = targetFinalW;
|
||||
|
||||
if (h != targetFinalH)
|
||||
h += 2;
|
||||
if (h > targetFinalH)
|
||||
h = targetFinalH;
|
||||
|
||||
if (++originX1 > targetFinalX)
|
||||
originX1 = targetFinalX;
|
||||
|
||||
if (++originY1 > targetFinalY)
|
||||
originY1 = targetFinalY;
|
||||
|
||||
if ((targetFinalX + targetFinalW) < originX2)
|
||||
originX2--;
|
||||
|
||||
if ((targetFinalY + targetFinalH) < originY2)
|
||||
originY2--;
|
||||
|
||||
_screen->updateScreen();
|
||||
delayUntil(end);
|
||||
}
|
||||
}
|
||||
|
||||
#undef displaySubtitle
|
||||
#undef printSub
|
||||
|
||||
|
||||
Reference in New Issue
Block a user