scummvm/engines/agos/script_e1.cpp

1218 lines
25 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 "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, kObjectType);
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, kObjectType);
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(), kPlayerType);
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, kRoomType);
SubObject *o = (SubObject *)findChildOfType(i, kObjectType);
SubPlayer *p = (SubPlayer *)findChildOfType(i, kPlayerType);
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(), kObjectType);
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(), kContainerType);
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, kChainType);
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));
// TODO: Add support for selecting slot
saveGame(1, (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("START", (const char *)getStringPtrByID(stringId))) {
loadGame("START", true);
} else {
loadGame((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
uint16 vgaSpriteId = getVarOrWord();
uint16 windowNum = getVarOrByte();
int16 x = getVarOrWord();
int16 y = getVarOrWord();
uint16 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
_timeStore = getTime();
}
void AGOSEngine_Elvira1::oe1_ifTime() {
// 260: if time
uint a = getVarOrWord();
uint32 t = getTime() - a;
if (t >= _timeStore)
setScriptCondition(true);
else
setScriptCondition(false);
}
void AGOSEngine_Elvira1::oe1_playTune() {
// 264: play tune
uint16 music = getVarOrWord();
uint16 track = getVarOrWord();
if (music != _lastMusicPlayed) {
_lastMusicPlayed = music;
// No tune under water
if (music == 4) {
stopMusic();
} else {
playMusic(music, track);
}
}
}
void AGOSEngine_Elvira1::oe1_zoneDisk() {
// 267: set disk number of each zone
getVarOrWord();
getVarOrWord();
}
void AGOSEngine_Elvira1::oe1_printStats() {
// 270: print stats
printStats();
}
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;
uint32 pauseTime = getTime();
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;
case Common::ES_ESP:
message1 = " Juego en Pausa\r\r\r";
message2 = "Continuar Salir";
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 s<r ?\r\r\r";
message2 = " Oui Non";
break;
case Common::DE_DEU:
message1 = " Bist Du sicher ?\r\r\r";
message2 = " Ja Nein";
break;
case Common::ES_ESP:
message1 = " Estas seguro ?\r\r\r";
message2 = " Si No";
break;
default:
message1 = " Are you sure ?\r\r\r";
message2 = " Yes No";
break;
}
for (; *message1; message1++)
windowPutChar(window, *message1);
for (; *message2; message2++)
windowPutChar(window, *message2);
if (confirmYesOrNo(120, 62) == 0x7FFF) {
shutdown();
} else {
goto restart;
}
}
restartAnimation();
_gameStoppedClock = getTime() - pauseTime + _gameStoppedClock;
}
void AGOSEngine_Elvira1::oe1_printPlayerHit() {
// 277: print player hit
WindowBlock *window = _dummyWindow;
window->flags = 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, kPlayerType);
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, kObjectType);
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, kObjectType);
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::confirmYesOrNo(uint16 x, uint16 y) {
HitArea *ha;
ha = findEmptyHitArea();
ha->x = x;
ha->y = y;
ha->width = 30;
ha->height = 12;
ha->flags = kBFBoxInUse;
ha->id = 0x7FFF;
ha->priority = 999;
ha->window = 0;
ha = findEmptyHitArea();
ha->x = x + 60;
ha->y = y;
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() {
VgaPointersEntry *vpe = &_vgaBufferPointers[1];
byte *curVgaFile2Orig = _curVgaFile2;
_windowNum = 3;
_curVgaFile2 = vpe->vgaFile2;
drawImage_init(9, 0, 10, 32, 0);
_curVgaFile2 = curVgaFile2Orig;
}
void AGOSEngine::printStats() {
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();
}
} // End of namespace AGOS