LOL: - implemented bezel cup opcode

- implemented font conversion for certain language specific characters in load game dialogue (only german atm)

svn-id: r41677
This commit is contained in:
Florian Kagerer 2009-06-19 17:03:28 +00:00
parent 91b5d1befb
commit ec7d86404c
5 changed files with 81 additions and 2 deletions

View File

@ -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];

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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