aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Kagerer2009-06-19 17:03:28 +0000
committerFlorian Kagerer2009-06-19 17:03:28 +0000
commitec7d86404c672f62368bdddaba1f4258960141de (patch)
tree8b5848dcbfa9a819e205288d8bd48e7a7670f36f
parent91b5d1befb4532f291e7d5f125b439790bafd1fd (diff)
downloadscummvm-rg350-ec7d86404c672f62368bdddaba1f4258960141de.tar.gz
scummvm-rg350-ec7d86404c672f62368bdddaba1f4258960141de.tar.bz2
scummvm-rg350-ec7d86404c672f62368bdddaba1f4258960141de.zip
LOL: - implemented bezel cup opcode
- implemented font conversion for certain language specific characters in load game dialogue (only german atm) svn-id: r41677
-rw-r--r--engines/kyra/gui_lol.cpp12
-rw-r--r--engines/kyra/lol.cpp49
-rw-r--r--engines/kyra/lol.h7
-rw-r--r--engines/kyra/script_lol.cpp8
-rw-r--r--engines/kyra/staticres.cpp7
5 files changed, 81 insertions, 2 deletions
diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp
index fbcd4f0572..0465c5c6c6 100644
--- a/engines/kyra/gui_lol.cpp
+++ b/engines/kyra/gui_lol.cpp
@@ -2239,6 +2239,8 @@ int GUI_LoL::runMenu(Menu &menu) {
if (_currentMenu == &_loadMenu || _currentMenu == &_saveMenu) {
updateSaveList(true);
Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
+
+
setupSavegameNames(*_currentMenu, 4);
}
@@ -2359,6 +2361,16 @@ void GUI_LoL::setupSavegameNames(Menu &menu, int num) {
if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header)) != 0) {
strncpy(s, header.description.c_str(), 80);
s[79] = 0;
+
+ for (uint32 ii = 0; ii < strlen(s); ii++) {
+ for (int iii = 0; iii < _vm->_fontConversionTableGermanSize; iii += 2) {
+ if (s[ii] == _vm->_fontConversionTableGerman[iii]) {
+ s[ii] = _vm->_fontConversionTableGerman[iii + 1];
+ break;
+ }
+ }
+ }
+
menu.item[i].itemString = s;
s += (strlen(s) + 1);
menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp
index 20ca169cb5..965379498c 100644
--- a/engines/kyra/lol.cpp
+++ b/engines/kyra/lol.cpp
@@ -2783,6 +2783,55 @@ void LoLEngine::callbackProcessMagicLightning(WSAMovie_v2 *mov, int x, int y) {
delete[] tpal;
}
+void LoLEngine::drinkBezelCup(int numUses, int charNum) {
+ int cp = _screen->setCurPage(2);
+ snd_playSoundEffect(73, -1);
+
+ WSAMovie_v2 *mov = new WSAMovie_v2(this);
+ mov->open("bezel.wsa", 0, 0);
+ if (!mov->opened())
+ error("Bezel: Unable to load bezel.wsa");
+
+ int x = _activeCharsXpos[charNum] - 11;
+ int y = 124;
+ int w = mov->width();
+ int h = mov->height();
+
+ _screen->copyRegion(x, y, 0, 0, w, h, 0, 2, Screen::CR_NO_P_CHECK);
+
+ static const uint8 bezelAnimData[] = { 0, 26, 20, 27, 61, 55, 62, 92, 86, 93, 131, 125 };
+ int frm = bezelAnimData[numUses * 3];
+ int hpDiff = _characters[charNum].hitPointsMax - _characters[charNum].hitPointsCur;
+ uint16 step = 0;
+
+ do {
+ step = (step & 0xff) + (hpDiff * 256) / (bezelAnimData[numUses * 3 + 2]);
+ increaseCharacterHitpoints(charNum, step / 256, true);
+ gui_drawCharPortraitWithStats(charNum);
+
+ uint32 etime = _system->getMillis() + 4 * _tickLength;
+
+ _screen->copyRegion(0, 0, x, y, w, h, 2, 2, Screen::CR_NO_P_CHECK);
+ mov->displayFrame(frm, 2, x, y, 0x5000, _trueLightTable1, _trueLightTable2);
+ _screen->copyRegion(x, y, x, y, w, h, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+
+ delayUntil(etime);
+ } while (++frm < bezelAnimData[numUses * 3 + 1]);
+
+ _characters[charNum].hitPointsCur = _characters[charNum].hitPointsMax;
+ _screen->copyRegion(0, 0, x, y, w, h, 2, 2, Screen::CR_NO_P_CHECK);
+ removeCharacterEffects(&_characters[charNum], 4, 4);
+ gui_drawCharPortraitWithStats(charNum);
+ _screen->copyRegion(x, y, x, y, w, h, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+
+ mov->close();
+ delete mov;
+
+ _screen->setCurPage(cp);
+}
+
void LoLEngine::addSpellToScroll(int spell, int charNum) {
bool assigned = false;
int slot = 0;
diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h
index f2a6727289..b393ce2680 100644
--- a/engines/kyra/lol.h
+++ b/engines/kyra/lol.h
@@ -777,6 +777,7 @@ private:
int olol_assignSpecialGuiShape(EMCState *script);
int olol_findInventoryItem(EMCState *script);
int olol_restoreFadePalette(EMCState *script);
+ int olol_drinkBezelCup(EMCState *script);
int olol_changeItemTypeOrFlag(EMCState *script);
int olol_placeInventoryItemInHand(EMCState *script);
int olol_castSpell(EMCState *script);
@@ -851,6 +852,8 @@ private:
void decodeSjis(const char *src, char *dst);
static const char * const _languageExt[];
+ static const char _fontConversionTableGerman[];
+ static const int _fontConversionTableGermanSize;
// graphics
void setupScreenDims();
@@ -905,7 +908,7 @@ private:
void setCharacterMagicOrHitPoints(int charNum, int type, int points, int mode);
void increaseExperience(int charNum, int skill, uint32 points);
- void increaseCharacterHitpoints(int charNum, int points, bool unk);
+ void increaseCharacterHitpoints(int charNum, int points, bool ignoreDeath);
LoLCharacter *_characters;
uint16 _activeCharsXpos[3];
@@ -1348,6 +1351,8 @@ private:
void callbackProcessMagicSwarm(WSAMovie_v2 *mov, int x, int y);
void callbackProcessMagicLightning(WSAMovie_v2 *mov, int x, int y);
+ void drinkBezelCup(int a, int charNum);
+
void addSpellToScroll(int spell, int charNum);
void transferSpellToScollAnimation(int charNum, int spell, int slot);
diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp
index 474a0eec86..52792fb85c 100644
--- a/engines/kyra/script_lol.cpp
+++ b/engines/kyra/script_lol.cpp
@@ -1994,6 +1994,12 @@ int LoLEngine::olol_findInventoryItem(EMCState *script) {
return -1;
}
+int LoLEngine::olol_drinkBezelCup(EMCState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_drinkBezelCup(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+ drinkBezelCup(3 - stackPos(0), stackPos(1));
+ return 1;
+}
+
int LoLEngine::olol_restoreFadePalette(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreFadePalette(%p)", (const void *)script);
memcpy(_screen->_currentPalette, _screen->getPalette(1), 384);
@@ -2852,7 +2858,7 @@ void LoLEngine::setupOpcodeTable() {
// 0xA8
OpcodeUnImpl();
OpcodeUnImpl();
- OpcodeUnImpl();
+ Opcode(olol_drinkBezelCup);
Opcode(olol_changeItemTypeOrFlag);
// 0xAC
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index 382d167d83..7b518f727f 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -3296,6 +3296,13 @@ const int LoLEngine::_outroMonsterScaleTableY[] = {
0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100
};
+const char LoLEngine::_fontConversionTableGerman[] = {
+ 'Ä', 0x8e, 'ä', 0x84, 'Ö', 0x99, 'ö',
+ 0x94, 'Ü', 0x9a, 'ü', 0x81, 'ß', 0xe1
+};
+
+const int LoLEngine::_fontConversionTableGermanSize = ARRAYSIZE(LoLEngine::_fontConversionTableGerman);
+
#endif // ENABLE_LOL
} // End of namespace Kyra