/* ScummVM - Scumm Interpreter * Copyright (C) 2001 Ludvig Strigeus * 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. * * $URL$ * $Id$ * */ #include "common/stdafx.h" #include "agos/agos.h" #include "agos/vga.h" namespace AGOS { #define OPCODE(x) _OPCODE(AGOSEngine_Elvira1, x) void AGOSEngine_Elvira1::setupOpcodes() { static const OpcodeEntryElvira1 opcodes[] = { /* 00 */ OPCODE(o_at), OPCODE(o_notAt), OPCODE(oe1_present), OPCODE(oe1_notPresent), /* 04 */ OPCODE(oe1_worn), OPCODE(oe1_notWorn), OPCODE(o_carried), OPCODE(o_notCarried), /* 08 */ OPCODE(o_isAt), OPCODE(oe1_isNotAt), OPCODE(oe1_sibling), OPCODE(oe1_notSibling), /* 12 */ OPCODE(o_zero), OPCODE(o_notZero), OPCODE(o_eq), OPCODE(o_notEq), /* 16 */ OPCODE(o_gt), OPCODE(o_lt), OPCODE(o_eqf), OPCODE(o_notEqf), /* 20 */ OPCODE(o_ltf), OPCODE(o_gtf), OPCODE(oe1_isIn), OPCODE(oe1_isNotIn), /* 24 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 28 */ OPCODE(o_invalid), OPCODE(o_chance), OPCODE(oe1_isPlayer), OPCODE(o_invalid), /* 32 */ OPCODE(o_isRoom), OPCODE(o_isObject), OPCODE(o_state), OPCODE(o_invalid), /* 36 */ OPCODE(o_oflag), OPCODE(oe1_canPut), OPCODE(o_invalid), OPCODE(o_invalid), /* 40 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 44 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(oe1_create), /* 48 */ OPCODE(o_destroy), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_place), /* 52 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(oe1_copyof), OPCODE(oe1_copyfo), /* 56 */ OPCODE(o_copyff), OPCODE(oe1_whatO), OPCODE(o_invalid), OPCODE(oe1_weigh), /* 60 */ OPCODE(oe1_setFF), OPCODE(o_clear), OPCODE(o_invalid), OPCODE(o_invalid), /* 64 */ OPCODE(o_let), OPCODE(o_add), OPCODE(o_sub), OPCODE(o_addf), /* 68 */ OPCODE(o_subf), OPCODE(o_mul), OPCODE(o_div), OPCODE(o_mulf), /* 72 */ OPCODE(o_divf), OPCODE(o_mod), OPCODE(o_modf), OPCODE(o_random), /* 76 */ OPCODE(oe1_moveDirn), OPCODE(o_goto), OPCODE(o_invalid), OPCODE(o_invalid), /* 80 */ OPCODE(o_oset), OPCODE(o_oclear), OPCODE(o_invalid), OPCODE(o_invalid), /* 84 */ OPCODE(o_putBy), OPCODE(o_inc), OPCODE(o_dec), OPCODE(o_setState), /* 88 */ OPCODE(o_invalid), OPCODE(o_print), OPCODE(oe1_score), OPCODE(o_message), /* 92 */ OPCODE(o_msg), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 96 */ OPCODE(oe1_look), OPCODE(o_end), OPCODE(o_done), OPCODE(o_invalid), /* 100 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 104 */ OPCODE(o_invalid), OPCODE(o_process), OPCODE(oe1_doClass), OPCODE(o_invalid), /* 108 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 112*/ OPCODE(oe1_pObj), OPCODE(o_invalid), OPCODE(oe1_pName), OPCODE(oe1_pcName), /* 116 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_when), /* 120 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 124 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 128 */ OPCODE(o_if1), OPCODE(o_if2), OPCODE(o_invalid), OPCODE(o_invalid), /* 132 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(oe1_isCalled), /* 136 */ OPCODE(o_is), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 140 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 144 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 148 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 152 */ OPCODE(o_debug), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 156 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 160 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(oe1_cFlag), OPCODE(o_invalid), /* 164 */ OPCODE(oe1_rescan), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 168 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 172 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 176 */ OPCODE(oe1_setUserItem), OPCODE(oe1_getUserItem), OPCODE(oe1_clearUserItem), OPCODE(o_invalid), /* 180 */ OPCODE(oe1_whereTo), OPCODE(oe1_doorExit), OPCODE(o_invalid), OPCODE(o_invalid), /* 184 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 188 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 192 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 196 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_comment), OPCODE(o_invalid), /* 200 */ OPCODE(o_invalid), OPCODE(oe1_saveGame), OPCODE(oe1_loadGame), OPCODE(o_invalid), /* 204 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_getParent), OPCODE(o_getNext), /* 208 */ OPCODE(o_getChildren), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 212 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 216 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(oe1_findMaster), /* 220 */ OPCODE(oe1_nextMaster), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 224 */ OPCODE(o_picture), OPCODE(o_loadZone), OPCODE(oe1_animate), OPCODE(oe1_stopAnimate), /* 228 */ OPCODE(o_killAnimate), OPCODE(o_defWindow), OPCODE(o_window), OPCODE(o_cls), /* 232 */ OPCODE(o_closeWindow), OPCODE(oe1_menu), OPCODE(o_invalid), OPCODE(o_addBox), /* 236 */ OPCODE(o_delBox), OPCODE(o_enableBox), OPCODE(o_disableBox), OPCODE(o_moveBox), /* 240 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_doIcons), OPCODE(o_isClass), /* 244 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_invalid), /* 248 */ OPCODE(o_invalid), OPCODE(o_setClass), OPCODE(o_unsetClass), OPCODE(oe1_bitClear), /* 252 */ OPCODE(oe1_bitSet), OPCODE(oe1_bitTest), OPCODE(o_invalid), OPCODE(o_waitSync), /* 256 */ OPCODE(o_sync), OPCODE(o_defObj), OPCODE(oe1_enableInput), OPCODE(oe1_setTime), /* 260 */ OPCODE(oe1_ifTime), OPCODE(o_here), OPCODE(o_doClassIcons), OPCODE(oe1_playTune), /* 264 */ OPCODE(o_invalid), OPCODE(o_invalid), OPCODE(o_setAdjNoun), OPCODE(oe1_zoneDisk), /* 268 */ OPCODE(o_saveUserGame), OPCODE(o_loadUserGame), OPCODE(oe1_printStats), OPCODE(oe1_stopTune), /* 272 */ OPCODE(oe1_printPlayerDamage), OPCODE(oe1_printMonsterDamage), OPCODE(oe1_pauseGame), OPCODE(o_copysf), /* 276 */ OPCODE(o_restoreIcons), OPCODE(oe1_printPlayerHit), OPCODE(oe1_printMonsterHit), OPCODE(o_freezeZones), /* 280 */ OPCODE(o_placeNoIcons), OPCODE(o_clearTimers), OPCODE(o_setDollar), OPCODE(o_isBox) }; _opcodesElvira1 = opcodes; _numOpcodes = 284; } void AGOSEngine_Elvira1::executeOpcode(int opcode) { OpcodeProcElvira1 op = _opcodesElvira1[opcode].proc; (this->*op) (); } // ----------------------------------------------------------------------- // Elvira 1 Opcodes // ----------------------------------------------------------------------- void AGOSEngine_Elvira1::oe1_present() { // 2: present (here or carried) Item *item = getNextItemPtr(); setScriptCondition(item->parent == getItem1ID() || item->parent == me()->parent); } void AGOSEngine_Elvira1::oe1_notPresent() { // 3: not present (neither here nor carried) Item *item = getNextItemPtr(); setScriptCondition(item->parent != getItem1ID() && item->parent != me()->parent); } void AGOSEngine_Elvira1::oe1_worn() { // 4: worn Item *item = getNextItemPtr(); SubObject *subObject = (SubObject *)findChildOfType(item, 2); if (item->parent != getItem1ID() || subObject == NULL) setScriptCondition(false); else setScriptCondition((subObject->objectFlags & kOFWorn) != 0); } void AGOSEngine_Elvira1::oe1_notWorn() { // 5: not worn Item *item = getNextItemPtr(); SubObject *subObject = (SubObject *)findChildOfType(item, 2); if (item->parent != getItem1ID() || subObject == NULL) setScriptCondition(false); else setScriptCondition((subObject->objectFlags & kOFWorn) == 0); } void AGOSEngine_Elvira1::oe1_isNotAt() { // 9: parent is not Item *item = getNextItemPtr(); setScriptCondition(item->parent != getNextItemID()); } void AGOSEngine_Elvira1::oe1_sibling() { // 10: sibling Item *item1 = getNextItemPtr(); Item *item2 = getNextItemPtr(); setScriptCondition(item1->parent == item2->parent); } void AGOSEngine_Elvira1::oe1_notSibling() { // 11: not sibling Item *item1 = getNextItemPtr(); Item *item2 = getNextItemPtr(); setScriptCondition(item1->parent != item2->parent); } void AGOSEngine_Elvira1::oe1_isIn() { // 22: is in Item *item1 = getNextItemPtr(); Item *item2 = getNextItemPtr(); setScriptCondition(contains(item1, item2) != 0); } void AGOSEngine_Elvira1::oe1_isNotIn() { // 23: is not in Item *item1 = getNextItemPtr(); Item *item2 = getNextItemPtr(); setScriptCondition(contains(item1, item2) == 0); } void AGOSEngine_Elvira1::oe1_isPlayer() { // 30: is player setScriptCondition(isPlayer(getNextItemPtr())); } void AGOSEngine_Elvira1::oe1_canPut() { // 37: can put Item *item1 = getNextItemPtr(); Item *item2 = getNextItemPtr(); setScriptCondition(canPlace(item1, item2) == 0); } void AGOSEngine_Elvira1::oe1_create() { // 47: create setItemParent(getNextItemPtr(), derefItem(me()->parent)); } void AGOSEngine_Elvira1::oe1_copyof() { // 54: copy of Item *item = getNextItemPtr(); uint tmp = getVarOrByte(); writeNextVarContents(getUserFlag(item, tmp)); } void AGOSEngine_Elvira1::oe1_copyfo() { // 55: copy fo uint tmp = getNextVarContents(); Item *item = getNextItemPtr(); setUserFlag(item, getVarOrByte(), tmp); } void AGOSEngine_Elvira1::oe1_whatO() { // 57: what o int a = getVarOrWord(); if (a == 1) _subjectItem = findMaster(_scriptAdj1,_scriptNoun1); else _objectItem = findMaster(_scriptAdj2, _scriptNoun2); } void AGOSEngine_Elvira1::oe1_weigh() { // 59: weight Item *item = getNextItemPtr(); writeNextVarContents(weighUp(item)); } void AGOSEngine_Elvira1::oe1_setFF() { // 60: set FF writeNextVarContents(255); } void AGOSEngine_Elvira1::oe1_moveDirn() { // 54: move direction int16 d = readVariable(getVarOrWord()); moveDirn(me(), d); } void AGOSEngine_Elvira1::oe1_score() { // 90: score SubPlayer *p = (SubPlayer *) findChildOfType(me(), 3); showMessageFormat("Your score is %ld.\n", p->score); } void AGOSEngine_Elvira1::oe1_look() { // 96: look Item *i = derefItem(me()->parent); if (i == NULL) return; SubRoom *r = (SubRoom *)findChildOfType(i, 1); SubObject *o = (SubObject *)findChildOfType(i, 2); SubPlayer *p = (SubPlayer *)findChildOfType(i, 3); if (p == NULL) return; if ((o) && (!r)) { showMessageFormat("In the %s\n", (const char *)getStringPtrByID(i->itemName)); } else if (p) { showMessageFormat("Carried by %s\n", (const char *)getStringPtrByID(i->itemName)); } if (r) { showMessageFormat("%s", (const char *)getStringPtrByID(r->roomLong)); } showMessageFormat("\n"); Item *l = derefItem(i->child); if (l) { lobjFunc(l, "You can see "); /* Show objects */ } if (r && (r->flags & 4) && levelOf(i) < 10000) { shutdown(); } } void AGOSEngine_Elvira1::oe1_doClass() { // 106: do class Item *i = getNextItemPtr(); int16 cm = getVarOrWord(); int16 num = getVarOrWord(); _classMask = (cm != -1) ? 1 << cm : 0; _classLine = (SubroutineLine *)((byte *)_currentTable + _currentLine->next); if (num == 1) { _subjectItem = findInByClass(i, (1 << cm)); if (_subjectItem) _classMode1 = 1; else _classMode1 = 0; } else { _objectItem = findInByClass(i, (1 << cm)); if (_objectItem) _classMode2 = 1; else _classMode2 = 0; } } void AGOSEngine_Elvira1::oe1_pObj() { // 112: print object SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2); getVarOrWord(); if (subObject != NULL) showMessageFormat("%s", (const char *)getStringPtrByID(subObject->objectName)); } void AGOSEngine_Elvira1::oe1_pName() { // 114: Item *i = getNextItemPtr(); showMessageFormat("%s", (const char *)getStringPtrByID(i->itemName)); } void AGOSEngine_Elvira1::oe1_pcName() { // 115: Item *i = getNextItemPtr(); // TODO: Change first letter to upper case. showMessageFormat("%s\n", (const byte *)getStringPtrByID(i->itemName)); // Difference } void AGOSEngine_Elvira1::oe1_isCalled() { // 135: childstruct fr2 is Item *item = getNextItemPtr(); uint stringId = getNextStringID(); setScriptCondition(!scumm_stricmp((const char *)getStringPtrByID(item->itemName), (const char *)getStringPtrByID(stringId))); } void AGOSEngine_Elvira1::oe1_cFlag() { // 162: check container flag SubContainer *c = (SubContainer *)findChildOfType(getNextItemPtr(), 7); uint bit = getVarOrWord(); if (c == NULL) setScriptCondition(false); else setScriptCondition((c->flags & (1 << bit)) != 0); } void AGOSEngine_Elvira1::oe1_rescan() { // 164: restart subroutine setScriptReturn(-10); } void AGOSEngine_Elvira1::oe1_setUserItem() { // 176: set user item Item *i = getNextItemPtr(); uint tmp = getVarOrWord(); setUserItem(i, tmp, getNextItemID()); } void AGOSEngine_Elvira1::oe1_getUserItem() { // 177: get user item Item *i = getNextItemPtr(); int n = getVarOrWord(); if (getVarOrWord() == 1) _subjectItem = derefItem(getUserItem(i, n)); else _objectItem = derefItem(getUserItem(i, n)); } void AGOSEngine_Elvira1::oe1_whereTo() { // 180: where to Item *i = getNextItemPtr(); int16 d = getVarOrWord(); int16 f = getVarOrWord(); if (f == 1) _subjectItem = getExitOf_e1(i, d); else _objectItem = getExitOf_e1(i, d); } void AGOSEngine_Elvira1::oe1_doorExit() { // 181: door exit Item *x; Item *a = (Item *)-1; SubChain *c; Item *i = getNextItemPtr(); Item *d = getNextItemPtr(); int16 f = getVarOrWord(); int16 ct = 0; c = (SubChain *)findChildOfType(d, 8); if (c) a = derefItem(c->chChained); while (ct < 6) { x = getDoorOf(i, ct); if ((x == d) | (x == a)) { writeVariable(f, ct); return; } ct++; } writeVariable(f, 255); } void AGOSEngine_Elvira1::oe1_saveGame() { // 201: save game uint16 stringId = getNextStringID(); debug(0, "oe1_saveGame: stub (%s)", getStringPtrByID(stringId)); saveGame_e1((const char *)getStringPtrByID(stringId)); } void AGOSEngine_Elvira1::oe1_loadGame() { // 202: load game uint16 stringId = getNextStringID(); debug(0, "oe1_loadGame: stub (%s)", (const char *)getStringPtrByID(stringId)); if (!scumm_stricmp(getFileName(GAME_RESTFILE), (const char *)getStringPtrByID(stringId))) { loadGame_e1(getFileName(GAME_RESTFILE), true); } else { loadGame_e1((const char *)getStringPtrByID(stringId)); } } void AGOSEngine_Elvira1::oe1_clearUserItem() { // 178: clear user item Item *i = getNextItemPtr(); uint tmp = getVarOrWord(); setUserItem(i, tmp, 0); } void AGOSEngine_Elvira1::oe1_findMaster() { // 219: find master int16 ad, no; int16 d = getVarOrByte(); ad = (d == 1) ? _scriptAdj1 : _scriptAdj2; no = (d == 1) ? _scriptNoun1 : _scriptNoun2; d = getVarOrByte(); if (d == 1) _subjectItem = findMaster(ad, no); else _objectItem = findMaster(ad, no); } void AGOSEngine_Elvira1::oe1_nextMaster() { // 220: next master int16 ad, no; Item *item = getNextItemPtr(); int16 d = getVarOrByte(); ad = (d == 1) ? _scriptAdj1 : _scriptAdj2; no = (d == 1) ? _scriptNoun1 : _scriptNoun2; d = getVarOrByte(); if (d == 1) _subjectItem = nextMaster(item, ad, no); else _objectItem = nextMaster(item, ad, no); } void AGOSEngine_Elvira1::oe1_animate() { // 226: animate uint vgaSpriteId = getVarOrWord(); uint windowNum = getVarOrByte(); uint x = getVarOrWord(); uint y = getVarOrWord(); uint palette = getVarOrWord(); _lockWord |= 0x40; animate(windowNum, vgaSpriteId / 100, vgaSpriteId, x, y, palette); _lockWord &= ~0x40; } void AGOSEngine_Elvira1::oe1_stopAnimate() { // 227: stop animate stopAnimate(getVarOrWord()); } void AGOSEngine_Elvira1::oe1_menu() { // 233: agos menu uint b = getVarOrWord(); uint a = getVarOrWord(); drawMenuStrip(a, b); } void AGOSEngine_Elvira1::oe1_bitClear() { // 251: set bit off int var = getVarOrWord(); int bit = getVarOrWord(); writeVariable(var, _variableArray[var] & ~(1 << bit)); } void AGOSEngine_Elvira1::oe1_bitSet() { // 252: set bit on int var = getVarOrWord(); int bit = getVarOrWord(); writeVariable(var, _variableArray[var] | (1 << bit)); } void AGOSEngine_Elvira1::oe1_bitTest() { // 253: bit test int var = getVarOrWord(); int bit = getVarOrWord(); setScriptCondition((_variableArray[var] & (1 << bit)) != 0); } void AGOSEngine_Elvira1::oe1_enableInput() { // 258: enable input _variableArray[500] = 0; for (int i = 120; i != 130; i++) disableBox(i); _verbHitArea = 0; _hitAreaSubjectItem = 0; _hitAreaObjectItem = 0; _dragFlag = 0; _dragAccept = 0; _dragCount = 0; _dragMode = 0; _lastHitArea3 = 0; _lastHitArea = 0; _clickOnly = 1; } void AGOSEngine_Elvira1::oe1_setTime() { // 259: set time time(&_timeStore); } void AGOSEngine_Elvira1::oe1_ifTime() { // 260: if time time_t t; uint a = getVarOrWord(); time(&t); t -= a; if (t >= _timeStore) setScriptCondition(true); else setScriptCondition(false); } void AGOSEngine_Elvira1::oe1_playTune() { // 264: play tune int music = getVarOrWord(); int track = getVarOrWord(); if (music != _lastMusicPlayed) { _lastMusicPlayed = music; // No tune under water if (music == 4) { if (getPlatform() == Common::kPlatformAmiga) _mixer->stopHandle(_modHandle); else _midi.stop(); } else { loadMusic(music); _midi.startTrack(track); } } } void AGOSEngine_Elvira1::oe1_zoneDisk() { // 267: set disk number of each zone getVarOrWord(); getVarOrWord(); } void AGOSEngine_Elvira1::oe1_printStats() { // 270: print stats WindowBlock *window = _dummyWindow; int val; window->flags = 1; mouseOff(); // Strength val = _variableArray[0]; if (val < -99) val = -99; if (val > 99) val = 99; writeChar(window, 5, 133, 6, val); // Resolution val = _variableArray[1]; if (val < -99) val = -99; if (val > 99) val = 99; writeChar(window, 11, 133, 6, val); // Dexterity val = _variableArray[2]; if (val < -99) val = -99; if (val > 99) val = 99; writeChar(window, 18, 133, 0, val); // Skill val = _variableArray[3]; if (val < -99) val = -99; if (val > 99) val = 99; writeChar(window, 24, 133, 0, val); // Life val = _variableArray[5]; if (val < -99) val = -99; if (val > 99) val = 99; writeChar(window, 30, 133, 2, val); // Experience val = _variableArray[6]; if (val < -99) val = -99; if (val > 99) val = 99; writeChar(window, 36, 133, 4, val); mouseOn(); } void AGOSEngine_Elvira1::oe1_stopTune() { // 271: stop tune } void AGOSEngine_Elvira1::oe1_printPlayerDamage() { // 272: print player damage WindowBlock *window = _dummyWindow; window->flags = 1; mouseOff(); writeChar(window, 36, 38, 2, _variableArray[241]); mouseOn(); } void AGOSEngine_Elvira1::oe1_printMonsterDamage() { // 273: print monster damage WindowBlock *window = _dummyWindow; window->flags = 1; mouseOff(); writeChar(window, 36, 88, 2, _variableArray[242]); mouseOn(); } void AGOSEngine_Elvira1::oe1_pauseGame() { // 274: pause game WindowBlock *window = _windowArray[4]; const char *message1, *message2; time_t pauseTime = time(NULL); haltAnimation(); restart: printScroll(); window->textColumn = 0; window->textRow = 0; window->textColumnOffset = 0; window->textLength = 0; // Difference switch (_language) { case Common::FR_FRA: message1 = " Jeu interrompu.\r\r\r"; message2 = " Reprendre Quitter"; break; case Common::DE_DEU: message1 = " Pause.\r\r\r"; message2 = " Weiter Ende"; break; default: message1 = " Game Paused\r\r\r"; message2 = " Continue Quit"; break; } for (; *message1; message1++) windowPutChar(window, *message1); for (; *message2; message2++) windowPutChar(window, *message2); if (continueOrQuit() == 0x7FFE) { printScroll(); window->textColumn = 0; window->textRow = 0; window->textColumnOffset = 0; window->textLength = 0; // Difference switch (_language) { case Common::FR_FRA: message1 = " Etes-vous sflags = 1; mouseOff(); writeChar(window, 3, 166, 0, _variableArray[414]); mouseOn(); } void AGOSEngine_Elvira1::oe1_printMonsterHit() { // 278: print monster hit WindowBlock *window = _dummyWindow; window->flags = 1; mouseOff(); writeChar(window, 35, 166, 4, _variableArray[415]); mouseOn(); } int16 AGOSEngine::levelOf(Item *item) { SubPlayer *p = (SubPlayer *) findChildOfType(item, 3); if (p == NULL) return 0; return p->level; } int16 AGOSEngine::moreText(Item *i) { SubObject *o; i = derefItem(i->next); while (i) { o = (SubObject *)findChildOfType(i, 2); if ((o) && (o->objectFlags & 1)) goto l1; if (i != me()) return 1; l1: i = derefItem(i->next); } return 0; } void AGOSEngine::lobjFunc(Item *i, const char *f) { int n = 0; SubObject *o; while (i) { o = (SubObject *)findChildOfType(i, 2); if ((o) && (o->objectFlags & 1)) goto l1; if (i == me()) goto l1; if (n == 0) { if (f) showMessageFormat("%s", f); n = 1; } else { if (moreText(i)) showMessageFormat(", "); else showMessageFormat(" and "); } showMessageFormat("%s", (const char *)getStringPtrByID(i->itemName)); l1: i = derefItem(i->next); } if (f) { if (n == 1) showMessageFormat(".\n"); } else { if (n == 0) showMessageFormat("nothing"); } } uint AGOSEngine::confirmQuit() { HitArea *ha; ha = findEmptyHitArea(); ha->x = 120; ha->y = 62; ha->width = 30; ha->height = 12; ha->flags = kBFBoxInUse; ha->id = 0x7FFF; ha->priority = 999; ha->window = 0; ha = findEmptyHitArea(); ha->x = 180; ha->y = 62; ha->width = 24; ha->height = 12; ha->flags = kBFBoxInUse; ha->id = 0x7FFE; ha->priority = 999; ha->window = 0; for (;;) { _lastHitArea = NULL; _lastHitArea3 = NULL; for (;;) { if (_lastHitArea3 != 0) break; delay(1); } ha = _lastHitArea; if (ha == NULL) { } else if (ha->id == 0x7FFE) { break; } else if (ha->id == 0x7FFF) { break; } } undefineBox(0x7FFF); undefineBox(0x7FFE); return ha->id; } uint AGOSEngine::continueOrQuit() { HitArea *ha; ha = findEmptyHitArea(); ha->x = 96; ha->y = 62; ha->width = 60; ha->height = 12; ha->flags = kBFBoxInUse; ha->id = 0x7FFF; ha->priority = 999; ha->window = 0; ha = findEmptyHitArea(); ha->x = 180; ha->y = 62; ha->width = 36; ha->height = 12; ha->flags = kBFBoxInUse; ha->id = 0x7FFE; ha->priority = 999; ha->window = 0; for (;;) { _lastHitArea = NULL; _lastHitArea3 = NULL; for (;;) { if (_lastHitArea3 != 0) break; delay(1); } ha = _lastHitArea; if (ha == NULL) { } else if (ha->id == 0x7FFE) { break; } else if (ha->id == 0x7FFF) { break; } } undefineBox(0x7FFF); undefineBox(0x7FFE); return ha->id; } void AGOSEngine::printScroll() { VC10_state state; VgaPointersEntry *vpe = &_vgaBufferPointers[1]; state.srcPtr = vpe->vgaFile2 + READ_BE_UINT32(vpe->vgaFile2 + 9 * 8); state.palette = 0; state.paletteMod = 0; state.x = 10; state.y = 32; state.width = state.draw_width = 10; state.height = state.draw_height = 72; state.flags = kDFCompressed; _windowNum = 3; state.depack_cont = -0x80; state.x_skip = 0; state.y_skip = 0; drawImage(&state); } } // End of namespace AGOS