svn-id: r24501
This commit is contained in:
Travis Howell 2006-10-25 13:38:35 +00:00
parent fc04b2e45a
commit 05fd51d036
10 changed files with 641 additions and 621 deletions

View file

@ -1021,9 +1021,6 @@ public:
void o_print(); void o_print();
void o_message(); void o_message();
void o_msg(); void o_msg();
void o_addTextBox();
void o_setShortText();
void o_setLongText();
void o_end(); void o_end();
void o_done(); void o_done();
void o_process(); void o_process();
@ -1081,24 +1078,8 @@ public:
void o_getOValue(); void o_getOValue();
void o_setOValue(); void o_setOValue();
void o_ink(); void o_ink();
void o_screenTextBox();
void o_screenTextMsg();
void o_playEffect();
void o_getDollar2();
void o_isAdjNoun();
void o_b2Set();
void o_b2Clear();
void o_b2Zero();
void o_b2NotZero();
void o_lockZones();
void o_unlockZones();
void o_getPathPosn();
void o_scnTxtLongText();
void o_mouseOn();
void o_unloadZone();
void o_unfreezeZones();
// Opcodes, Elvira 1 only // Opcodes, Elvira 1
void oe1_present(); void oe1_present();
void oe1_notPresent(); void oe1_notPresent();
void oe1_worn(); void oe1_worn();
@ -1125,6 +1106,7 @@ public:
void oe1_pName(); void oe1_pName();
void oe1_pcName(); void oe1_pcName();
void oe1_cFlag(); void oe1_cFlag();
void oe1_rescan();
void oe1_setUserItem(); void oe1_setUserItem();
void oe1_getUserItem(); void oe1_getUserItem();
void oe1_whereTo(); void oe1_whereTo();
@ -1134,6 +1116,8 @@ public:
void oe1_clearUserItem(); void oe1_clearUserItem();
void oe1_findMaster(); void oe1_findMaster();
void oe1_nextMaster(); void oe1_nextMaster();
void oe1_animate();
void oe1_stopAnimate();
void oe1_menu(); void oe1_menu();
void oe1_enableInput(); void oe1_enableInput();
void oe1_setTime(); void oe1_setTime();
@ -1149,7 +1133,7 @@ public:
void oe1_printPlayerHit(); void oe1_printPlayerHit();
void oe1_printMonsterHit(); void oe1_printMonsterHit();
// Opcodes, Elvira 2 only // Opcodes, Elvira 2
void oe2_moveDirn(); void oe2_moveDirn();
void oe2_doClass(); void oe2_doClass();
void oe2_pObj(); void oe2_pObj();
@ -1170,12 +1154,21 @@ public:
void oe2_ifExitOpen(); void oe2_ifExitOpen();
void oe2_ifExitClosed(); void oe2_ifExitClosed();
void oe2_ifExitLocked(); void oe2_ifExitLocked();
void oe2_getDollar2();
void oe2_unk177(); void oe2_unk177();
void oe2_unk178(); void oe2_unk178();
void oe2_isAdjNoun();
void oe2_b2Set();
void oe2_b2Clear();
void oe2_b2Zero();
void oe2_b2NotZero();
// Opcodes, Waxworks only // Opcodes, Waxworks
void oww_moveDirn(); void oww_moveDirn();
void oww_goto(); void oww_goto();
void oww_addTextBox();
void oww_setShortText();
void oww_setLongText();
void oww_whereTo(); void oww_whereTo();
void oww_menu(); void oww_menu();
void oww_textMenu(); void oww_textMenu();
@ -1185,82 +1178,90 @@ public:
void oww_boxLongText(); void oww_boxLongText();
void oww_printBox(); void oww_printBox();
void oww_boxPObj(); void oww_boxPObj();
void oww_lockZones();
void oww_unlockZones();
// Opcodes, Simon 1 only // Opcodes, Simon 1
void o1_printLongText(); void oww_printLongText();
void o1_rescan(); void os1_animate();
void o1_animate(); void os1_playTune();
void o1_stopAnimate(); void os1_screenTextBox();
void o1_playTune(); void os1_screenTextMsg();
void o1_screenTextPObj(); void os1_playEffect();
void o1_mouseOff(); void os1_screenTextPObj();
void o1_loadBeard(); void os1_getPathPosn();
void o1_unloadBeard(); void os1_scnTxtLongText();
void o1_loadStrings(); void os1_mouseOn();
void o1_specialFade(); void os1_mouseOff();
void os1_loadBeard();
void os1_unloadBeard();
void os1_unloadZone();
void os1_loadStrings();
void os1_unfreezeZones();
void os1_specialFade();
// Opcodes, Simon 2 and later // Opcodes, Simon 2
void o2_printLongText(); void os2_printLongText();
void o2_rescan(); void os2_rescan();
void o2_animate(); void os2_animate();
void o2_stopAnimate(); void os2_stopAnimate();
void o2_playTune(); void os2_playTune();
void o2_screenTextPObj(); void os2_screenTextPObj();
void o2_mouseOff(); void os2_mouseOff();
void o2_isShortText(); void os2_isShortText();
void o2_clearMarks(); void os2_clearMarks();
void o2_waitMark(); void os2_waitMark();
// Opcodes, Feeble Files only // Opcodes, Feeble Files
void o3_chance(); void off_chance();
void o3_jumpOut(); void off_jumpOut();
void o3_addTextBox(); void off_addTextBox();
void o3_printLongText(); void off_printLongText();
void o3_addBox(); void off_addBox();
void o3_oracleTextDown(); void off_oracleTextDown();
void o3_oracleTextUp(); void off_oracleTextUp();
void o3_ifTime(); void off_ifTime();
void o3_setTime(); void off_setTime();
void o3_saveUserGame(); void off_saveUserGame();
void o3_loadUserGame(); void off_loadUserGame();
void o3_listSaveGames(); void off_listSaveGames();
void o3_checkCD(); void off_checkCD();
void o3_screenTextBox(); void off_screenTextBox();
void o3_isAdjNoun(); void off_isAdjNoun();
void o3_hyperLinkOn(); void off_hyperLinkOn();
void o3_hyperLinkOff(); void off_hyperLinkOff();
void o3_checkPaths(); void off_checkPaths();
void o3_screenTextPObj(); void off_screenTextPObj();
void o3_mouseOff(); void off_mouseOff();
void o3_loadVideo(); void off_loadVideo();
void o3_playVideo(); void off_playVideo();
void o3_centreScroll(); void off_centreScroll();
void o3_resetPVCount(); void off_resetPVCount();
void o3_setPathValues(); void off_setPathValues();
void o3_stopClock(); void off_stopClock();
void o3_restartClock(); void off_restartClock();
void o3_setColour(); void off_setColour();
void o3_b3Set(); void off_b3Set();
void o3_b3Clear(); void off_b3Clear();
void o3_b3Zero(); void off_b3Zero();
void o3_b3NotZero(); void off_b3NotZero();
// Opcodes, Puzzle Pack only // Opcodes, Puzzle Pack
void o4_iconifyWindow(); void opp_iconifyWindow();
void o4_restoreOopsPosition(); void opp_restoreOopsPosition();
void o4_loadMouseImage(); void opp_loadMouseImage();
void o4_message(); void opp_message();
void o4_setShortText(); void opp_setShortText();
void o4_loadHiScores(); void opp_loadHiScores();
void o4_checkHiScores(); void opp_checkHiScores();
void o4_sync(); void opp_sync();
void o4_saveUserGame(); void opp_saveUserGame();
void o4_loadUserGame(); void opp_loadUserGame();
void o4_saveOopsPosition(); void opp_saveOopsPosition();
void o4_resetGameTime(); void opp_resetGameTime();
void o4_resetPVCount(); void opp_resetPVCount();
void o4_setPathValues(); void opp_setPathValues();
void o4_restartClock(); void opp_restartClock();
protected: protected:
void drawImages(VC10_state *state); void drawImages(VC10_state *state);

View file

@ -58,7 +58,7 @@ void AGOSEngine::loadIconData() {
error("Out of icon memory"); error("Out of icon memory");
memcpy(_iconFilePtr, src, 43 * 336); memcpy(_iconFilePtr, src, 43 * 336);
o_unfreezeZones(); os1_unfreezeZones();
} }
// Thanks to Stuart Caie for providing the original // Thanks to Stuart Caie for providing the original

View file

@ -95,8 +95,6 @@ void AGOSEngine::setupCommonOpcodes(OpcodeProc *op) {
op[80] = &AGOSEngine::o_is; op[80] = &AGOSEngine::o_is;
op[82] = &AGOSEngine::o_debug; op[82] = &AGOSEngine::o_debug;
op[87] = &AGOSEngine::o_comment; op[87] = &AGOSEngine::o_comment;
op[88] = &AGOSEngine::o_haltAnimation;
op[89] = &AGOSEngine::o_restartAnimation;
op[90] = &AGOSEngine::o_getParent; op[90] = &AGOSEngine::o_getParent;
op[91] = &AGOSEngine::o_getNext; op[91] = &AGOSEngine::o_getNext;
op[92] = &AGOSEngine::o_getChildren; op[92] = &AGOSEngine::o_getChildren;
@ -516,44 +514,6 @@ void AGOSEngine::o_msg() {
showMessageFormat("%s", getStringPtrByID(getNextStringID())); showMessageFormat("%s", getStringPtrByID(getNextStringID()));
} }
void AGOSEngine::o_addTextBox() {
// 65: add hit area
uint id = getVarOrWord();
uint x = getVarOrWord();
uint y = getVarOrWord();
uint w = getVarOrWord();
uint h = getVarOrWord();
uint number = getVarOrByte();
if (number < _numTextBoxes)
defineBox(id, x, y, w, h, (number << 8) + 129, 208, _dummyItem2);
}
void AGOSEngine::o_setShortText() {
// 66: set item name
uint var = getVarOrByte();
uint stringId = getNextStringID();
if (var < _numTextBoxes) {
_shortText[var] = stringId;
}
}
void AGOSEngine::o_setLongText() {
// 67: set item description
uint var = getVarOrByte();
uint stringId = getNextStringID();
if (getFeatures() & GF_TALKIE) {
uint speechId = getNextWord();
if (var < _numTextBoxes) {
_longText[var] = stringId;
_longSound[var] = speechId;
}
} else {
if (var < _numTextBoxes) {
_longText[var] = stringId;
}
}
}
void AGOSEngine::o_end() { void AGOSEngine::o_end() {
// 68: exit interpreter // 68: exit interpreter
shutdown(); shutdown();
@ -1084,218 +1044,6 @@ void AGOSEngine::o_ink() {
setTextColor(getVarOrByte()); setTextColor(getVarOrByte());
} }
void AGOSEngine::o_screenTextBox() {
// 161: setup text
TextLocation *tl = getTextLocation(getVarOrByte());
tl->x = getVarOrWord();
tl->y = getVarOrByte();
tl->width = getVarOrWord();
}
void AGOSEngine::o_screenTextMsg() {
// 162: print string
uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte();
uint stringId = getNextStringID();
const byte *string_ptr = NULL;
uint speechId = 0;
TextLocation *tl;
if (stringId != 0xFFFF)
string_ptr = getStringPtrByID(stringId);
if (getFeatures() & GF_TALKIE) {
if (getGameType() == GType_FF || getGameType() == GType_PP)
speechId = (uint16)getVarOrWord();
else
speechId = (uint16)getNextWord();
}
if (getGameType() == GType_FF || getGameType() == GType_PP)
vgaSpriteId = 1;
tl = getTextLocation(vgaSpriteId);
if (_speech && speechId != 0)
playSpeech(speechId, vgaSpriteId);
if (((getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || getGameType() == GType_FF) &&
speechId == 0) {
stopAnimateSimon2(2, vgaSpriteId + 2);
}
if (string_ptr != NULL && (speechId == 0 || _subtitles))
printScreenText(vgaSpriteId, color, (const char *)string_ptr, tl->x, tl->y, tl->width);
}
void AGOSEngine::o_playEffect() {
// 163: play sound
uint soundId = getVarOrWord();
if (getGameId() == GID_SIMON1DOS)
playSting(soundId);
else
_sound->playEffects(soundId);
}
void AGOSEngine::o_getDollar2() {
// 164
_showPreposition = true;
setup_cond_c_helper();
_objectItem = _hitAreaObjectItem;
if (_objectItem == _dummyItem2)
_objectItem = me();
if (_objectItem == _dummyItem3)
_objectItem = derefItem(me()->parent);
if (_objectItem != NULL) {
_scriptNoun2 = _objectItem->noun;
_scriptAdj2 = _objectItem->adjective;
} else {
_scriptNoun2 = -1;
_scriptAdj2 = -1;
}
_showPreposition = false;
}
void AGOSEngine::o_isAdjNoun() {
// 165: item unk1 unk2 is
Item *item = getNextItemPtr();
int16 a = getNextWord(), b = getNextWord();
setScriptCondition(item->adjective == a && item->noun == b);
}
void AGOSEngine::o_b2Set() {
// 166: set bit2
uint bit = getVarOrByte();
_bitArrayTwo[bit / 16] |= (1 << (bit & 15));
}
void AGOSEngine::o_b2Clear() {
// 167: clear bit2
uint bit = getVarOrByte();
_bitArrayTwo[bit / 16] &= ~(1 << (bit & 15));
}
void AGOSEngine::o_b2Zero() {
// 168: is bit2 clear
uint bit = getVarOrByte();
setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) == 0);
}
void AGOSEngine::o_b2NotZero() {
// 169: is bit2 set
uint bit = getVarOrByte();
setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0);
}
void AGOSEngine::o_lockZones() {
// 175: vga pointer op 1
_vgaMemBase = _vgaMemPtr;
}
void AGOSEngine::o_unlockZones() {
// 176: vga pointer op 2
_vgaMemPtr = _vgaFrozenBase;
_vgaMemBase = _vgaFrozenBase;
}
void AGOSEngine::o_getPathPosn() {
// 178: path find
uint x = getVarOrWord();
uint y = getVarOrWord();
uint var_1 = getVarOrByte();
uint var_2 = getVarOrByte();
const uint16 *p;
uint i, j;
uint prev_i;
uint x_diff, y_diff;
uint best_i = 0, best_j = 0, best_dist = 0xFFFFFFFF;
uint maxPath = (getGameType() == GType_FF || getGameType() == GType_PP) ? 100 : 20;
if (getGameType() == GType_FF || getGameType() == GType_PP) {
x += _scrollX;
y += _scrollY;
} else if (getGameType() == GType_SIMON2) {
x += _scrollX * 8;
}
int end = (getGameType() == GType_FF) ? 9999 : 999;
prev_i = maxPath + 1 - readVariable(12);
for (i = maxPath; i != 0; --i) {
p = (const uint16 *)_pathFindArray[maxPath - i];
if (!p)
continue;
for (j = 0; readUint16Wrapper(&p[0]) != end; j++, p += 2) {
x_diff = ABS((int16)(readUint16Wrapper(&p[0]) - x));
y_diff = ABS((int16)(readUint16Wrapper(&p[1]) - 12 - y));
if (x_diff < y_diff) {
x_diff /= 4;
y_diff *= 4;
}
x_diff += y_diff /= 4;
if (x_diff < best_dist || x_diff == best_dist && prev_i == i) {
best_dist = x_diff;
best_i = maxPath + 1 - i;
best_j = j;
}
}
}
writeVariable(var_1, best_i);
writeVariable(var_2, best_j);
}
void AGOSEngine::o_scnTxtLongText() {
// 179: conversation responses and room descriptions
uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte();
uint stringId = getVarOrByte();
uint speechId = 0;
TextLocation *tl;
const char *string_ptr = (const char *)getStringPtrByID(_longText[stringId]);
if (getFeatures() & GF_TALKIE)
speechId = _longSound[stringId];
if (getGameType() == GType_FF || getGameType() == GType_PP)
vgaSpriteId = 1;
tl = getTextLocation(vgaSpriteId);
if (_speech && speechId != 0)
playSpeech(speechId, vgaSpriteId);
if (string_ptr != NULL && _subtitles)
printScreenText(vgaSpriteId, color, string_ptr, tl->x, tl->y, tl->width);
}
void AGOSEngine::o_mouseOn() {
// 180: force mouseOn
scriptMouseOn();
}
void AGOSEngine::o_unloadZone() {
// 184: clear vgapointer entry
uint a = getVarOrWord();
VgaPointersEntry *vpe = &_vgaBufferPointers[a];
vpe->sfxFile = NULL;
vpe->vgaFile1 = NULL;
vpe->vgaFile2 = NULL;
}
void AGOSEngine::o_unfreezeZones() {
// 186: vga pointer op 3
unfreezeBottom();
}
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
byte AGOSEngine::getByte() { byte AGOSEngine::getByte() {

View file

@ -130,7 +130,7 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {
op[162] = &AGOSEngine::oe1_cFlag; op[162] = &AGOSEngine::oe1_cFlag;
op[164] = &AGOSEngine::o1_rescan; op[164] = &AGOSEngine::oe1_rescan;
op[176] = &AGOSEngine::oe1_setUserItem; op[176] = &AGOSEngine::oe1_setUserItem;
op[177] = &AGOSEngine::oe1_getUserItem; op[177] = &AGOSEngine::oe1_getUserItem;
@ -153,8 +153,8 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {
op[224] = &AGOSEngine::o_picture; op[224] = &AGOSEngine::o_picture;
op[225] = &AGOSEngine::o_loadZone; op[225] = &AGOSEngine::o_loadZone;
op[226] = &AGOSEngine::o1_animate; op[226] = &AGOSEngine::oe1_animate;
op[227] = &AGOSEngine::o1_stopAnimate; op[227] = &AGOSEngine::oe1_stopAnimate;
op[228] = &AGOSEngine::o_killAnimate; op[228] = &AGOSEngine::o_killAnimate;
op[229] = &AGOSEngine::o_defWindow; op[229] = &AGOSEngine::o_defWindow;
op[230] = &AGOSEngine::o_window; op[230] = &AGOSEngine::o_window;
@ -187,7 +187,7 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {
op[260] = &AGOSEngine::oe1_ifTime; op[260] = &AGOSEngine::oe1_ifTime;
op[261] = &AGOSEngine::o_here; op[261] = &AGOSEngine::o_here;
op[262] = &AGOSEngine::o_doClassIcons; op[262] = &AGOSEngine::o_doClassIcons;
op[263] = &AGOSEngine::o1_playTune; op[263] = &AGOSEngine::os1_playTune;
op[266] = &AGOSEngine::o_setAdjNoun; op[266] = &AGOSEngine::o_setAdjNoun;
op[267] = &AGOSEngine::oe1_zoneDisk; op[267] = &AGOSEngine::oe1_zoneDisk;
op[268] = &AGOSEngine::o_saveUserGame; op[268] = &AGOSEngine::o_saveUserGame;
@ -406,6 +406,11 @@ void AGOSEngine::oe1_cFlag() {
setScriptCondition((c->flags & (1 << bit)) != 0); setScriptCondition((c->flags & (1 << bit)) != 0);
} }
void AGOSEngine::oe1_rescan() {
// 164: restart subroutine
setScriptReturn(-10);
}
void AGOSEngine::oe1_setUserItem() { void AGOSEngine::oe1_setUserItem() {
// 176: set user item // 176: set user item
Item *i = getNextItemPtr(); Item *i = getNextItemPtr();
@ -508,6 +513,28 @@ void AGOSEngine::oe1_nextMaster() {
_objectItem = nextMaster(item, ad, no); _objectItem = nextMaster(item, ad, no);
} }
void AGOSEngine::oe1_animate() {
// 226: animate
uint vgaSpriteId = getVarOrWord();
uint windowNum = getVarOrByte();
uint x = getVarOrWord();
uint y = getVarOrWord();
uint palette = getVarOrWord();
if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE) && vgaSpriteId >= 400) {
_lastVgaWaitFor = 0;
}
_lockWord |= 0x40;
animate(windowNum, vgaSpriteId / 100, vgaSpriteId, x, y, palette);
_lockWord &= ~0x40;
}
void AGOSEngine::oe1_stopAnimate() {
// 227: stop animate
stopAnimateSimon1(getVarOrWord());
}
void AGOSEngine::oe1_menu() { void AGOSEngine::oe1_menu() {
// 233: agos menu // 233: agos menu
uint b = getVarOrWord(); uint b = getVarOrWord();

View file

@ -46,16 +46,16 @@ void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) {
op[73] = &AGOSEngine::oe2_pObj; op[73] = &AGOSEngine::oe2_pObj;
op[74] = &AGOSEngine::oe1_pName; op[74] = &AGOSEngine::oe1_pName;
op[75] = &AGOSEngine::oe1_pcName; op[75] = &AGOSEngine::oe1_pcName;
op[83] = &AGOSEngine::o1_rescan; op[83] = &AGOSEngine::oe1_rescan;
op[89] = &AGOSEngine::oe1_loadGame; op[89] = &AGOSEngine::oe1_loadGame;
op[94] = &AGOSEngine::oe1_findMaster; op[94] = &AGOSEngine::oe1_findMaster;
op[95] = &AGOSEngine::oe1_nextMaster; op[95] = &AGOSEngine::oe1_nextMaster;
op[98] = &AGOSEngine::o1_animate; op[98] = &AGOSEngine::oe1_animate;
op[99] = &AGOSEngine::o1_stopAnimate; op[99] = &AGOSEngine::oe1_stopAnimate;
op[113] = &AGOSEngine::oe2_drawItem; op[113] = &AGOSEngine::oe2_drawItem;
op[123] = &AGOSEngine::oe1_setTime; op[123] = &AGOSEngine::oe1_setTime;
op[124] = &AGOSEngine::oe1_ifTime; op[124] = &AGOSEngine::oe1_ifTime;
op[127] = &AGOSEngine::o1_playTune; op[127] = &AGOSEngine::os1_playTune;
op[144] = &AGOSEngine::oe2_setDoorOpen; op[144] = &AGOSEngine::oe2_setDoorOpen;
op[145] = &AGOSEngine::oe2_setDoorClosed; op[145] = &AGOSEngine::oe2_setDoorClosed;
op[146] = &AGOSEngine::oe2_setDoorLocked; op[146] = &AGOSEngine::oe2_setDoorLocked;
@ -74,14 +74,14 @@ void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) {
op[171] = &AGOSEngine::oe2_ifExitOpen; op[171] = &AGOSEngine::oe2_ifExitOpen;
op[172] = &AGOSEngine::oe2_ifExitClosed; op[172] = &AGOSEngine::oe2_ifExitClosed;
op[173] = &AGOSEngine::oe2_ifExitLocked; op[173] = &AGOSEngine::oe2_ifExitLocked;
op[175] = &AGOSEngine::o_getDollar2; op[175] = &AGOSEngine::oe2_getDollar2;
op[177] = &AGOSEngine::oe2_unk177; op[177] = &AGOSEngine::oe2_unk177;
op[178] = &AGOSEngine::oe2_unk178; op[178] = &AGOSEngine::oe2_unk178;
op[179] = &AGOSEngine::o_isAdjNoun; op[179] = &AGOSEngine::oe2_isAdjNoun;
op[180] = &AGOSEngine::o_b2Set; op[180] = &AGOSEngine::oe2_b2Set;
op[181] = &AGOSEngine::o_b2Clear; op[181] = &AGOSEngine::oe2_b2Clear;
op[182] = &AGOSEngine::o_b2Zero; op[182] = &AGOSEngine::oe2_b2Zero;
op[183] = &AGOSEngine::o_b2NotZero; op[183] = &AGOSEngine::oe2_b2NotZero;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@ -285,6 +285,31 @@ void AGOSEngine::oe2_ifExitLocked() {
setScriptCondition(getExitState(i, n, d) == 3); setScriptCondition(getExitState(i, n, d) == 3);
} }
void AGOSEngine::oe2_getDollar2() {
// 175
_showPreposition = true;
setup_cond_c_helper();
_objectItem = _hitAreaObjectItem;
if (_objectItem == _dummyItem2)
_objectItem = me();
if (_objectItem == _dummyItem3)
_objectItem = derefItem(me()->parent);
if (_objectItem != NULL) {
_scriptNoun2 = _objectItem->noun;
_scriptAdj2 = _objectItem->adjective;
} else {
_scriptNoun2 = -1;
_scriptAdj2 = -1;
}
_showPreposition = false;
}
void AGOSEngine::oe2_unk177() { void AGOSEngine::oe2_unk177() {
// 177: set unknown vga event // 177: set unknown vga event
uint a = getVarOrByte(); uint a = getVarOrByte();
@ -297,4 +322,35 @@ void AGOSEngine::oe2_unk178() {
debug(0, "oe2_unk178: stub (%d)", a); debug(0, "oe2_unk178: stub (%d)", a);
} }
void AGOSEngine::oe2_isAdjNoun() {
// 179: item unk1 unk2 is
Item *item = getNextItemPtr();
int16 a = getNextWord(), b = getNextWord();
setScriptCondition(item->adjective == a && item->noun == b);
}
void AGOSEngine::oe2_b2Set() {
// 180: set bit2
uint bit = getVarOrByte();
_bitArrayTwo[bit / 16] |= (1 << (bit & 15));
}
void AGOSEngine::oe2_b2Clear() {
// 181: clear bit2
uint bit = getVarOrByte();
_bitArrayTwo[bit / 16] &= ~(1 << (bit & 15));
}
void AGOSEngine::oe2_b2Zero() {
// 182: is bit2 clear
uint bit = getVarOrByte();
setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) == 0);
}
void AGOSEngine::oe2_b2NotZero() {
// 183: is bit2 set
uint bit = getVarOrByte();
setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0);
}
} // End of namespace AGOS } // End of namespace AGOS

View file

@ -33,66 +33,66 @@ namespace AGOS {
void AGOSEngine::setupFeebleOpcodes(OpcodeProc *op) { void AGOSEngine::setupFeebleOpcodes(OpcodeProc *op) {
setupCommonOpcodes(op); setupCommonOpcodes(op);
op[23] = &AGOSEngine::o3_chance; op[23] = &AGOSEngine::off_chance;
op[37] = &AGOSEngine::o3_jumpOut; op[37] = &AGOSEngine::off_jumpOut;
op[65] = &AGOSEngine::o3_addTextBox; op[65] = &AGOSEngine::off_addTextBox;
op[66] = &AGOSEngine::o_setShortText; op[66] = &AGOSEngine::oww_setShortText;
op[67] = &AGOSEngine::o_setLongText; op[67] = &AGOSEngine::oww_setLongText;
op[70] = &AGOSEngine::o3_printLongText; op[70] = &AGOSEngine::off_printLongText;
op[83] = &AGOSEngine::o2_rescan; op[83] = &AGOSEngine::os2_rescan;
op[98] = &AGOSEngine::o2_animate; op[98] = &AGOSEngine::os2_animate;
op[99] = &AGOSEngine::o2_stopAnimate; op[99] = &AGOSEngine::os2_stopAnimate;
op[107] = &AGOSEngine::o3_addBox; op[107] = &AGOSEngine::off_addBox;
op[122] = &AGOSEngine::o3_oracleTextDown; op[122] = &AGOSEngine::off_oracleTextDown;
op[123] = &AGOSEngine::o3_oracleTextUp; op[123] = &AGOSEngine::off_oracleTextUp;
op[124] = &AGOSEngine::o3_ifTime; op[124] = &AGOSEngine::off_ifTime;
op[131] = &AGOSEngine::o3_setTime; op[131] = &AGOSEngine::off_setTime;
op[132] = &AGOSEngine::o3_saveUserGame; op[132] = &AGOSEngine::off_saveUserGame;
op[133] = &AGOSEngine::o3_loadUserGame; op[133] = &AGOSEngine::off_loadUserGame;
op[134] = &AGOSEngine::o3_listSaveGames; op[134] = &AGOSEngine::off_listSaveGames;
op[135] = &AGOSEngine::o3_checkCD; op[135] = &AGOSEngine::off_checkCD;
op[161] = &AGOSEngine::o3_screenTextBox; op[161] = &AGOSEngine::off_screenTextBox;
op[162] = &AGOSEngine::o_screenTextMsg; op[162] = &AGOSEngine::os1_screenTextMsg;
op[164] = &AGOSEngine::o_getDollar2; op[164] = &AGOSEngine::oe2_getDollar2;
op[165] = &AGOSEngine::o3_isAdjNoun; op[165] = &AGOSEngine::off_isAdjNoun;
op[166] = &AGOSEngine::o_b2Set; op[166] = &AGOSEngine::oe2_b2Set;
op[167] = &AGOSEngine::o_b2Clear; op[167] = &AGOSEngine::oe2_b2Clear;
op[168] = &AGOSEngine::o_b2Zero; op[168] = &AGOSEngine::oe2_b2Zero;
op[169] = &AGOSEngine::o_b2NotZero; op[169] = &AGOSEngine::oe2_b2NotZero;
op[171] = &AGOSEngine::o3_hyperLinkOn; op[171] = &AGOSEngine::off_hyperLinkOn;
op[172] = &AGOSEngine::o3_hyperLinkOff; op[172] = &AGOSEngine::off_hyperLinkOff;
op[173] = &AGOSEngine::o3_checkPaths; op[173] = &AGOSEngine::off_checkPaths;
op[175] = &AGOSEngine::o_lockZones; op[175] = &AGOSEngine::oww_lockZones;
op[176] = &AGOSEngine::o_unlockZones; op[176] = &AGOSEngine::oww_unlockZones;
op[177] = &AGOSEngine::o3_screenTextPObj; op[177] = &AGOSEngine::off_screenTextPObj;
op[178] = &AGOSEngine::o_getPathPosn; op[178] = &AGOSEngine::os1_getPathPosn;
op[179] = &AGOSEngine::o_scnTxtLongText; op[179] = &AGOSEngine::os1_scnTxtLongText;
op[180] = &AGOSEngine::o_mouseOn; op[180] = &AGOSEngine::os1_mouseOn;
op[181] = &AGOSEngine::o3_mouseOff; op[181] = &AGOSEngine::off_mouseOff;
op[182] = &AGOSEngine::o3_loadVideo; op[182] = &AGOSEngine::off_loadVideo;
op[183] = &AGOSEngine::o3_playVideo; op[183] = &AGOSEngine::off_playVideo;
op[184] = &AGOSEngine::o_unloadZone; op[184] = &AGOSEngine::os1_unloadZone;
op[186] = &AGOSEngine::o_unfreezeZones; op[186] = &AGOSEngine::os1_unfreezeZones;
op[187] = &AGOSEngine::o3_centreScroll; op[187] = &AGOSEngine::off_centreScroll;
op[188] = &AGOSEngine::o2_isShortText; op[188] = &AGOSEngine::os2_isShortText;
op[189] = &AGOSEngine::o2_clearMarks; op[189] = &AGOSEngine::os2_clearMarks;
op[190] = &AGOSEngine::o2_waitMark; op[190] = &AGOSEngine::os2_waitMark;
op[191] = &AGOSEngine::o3_resetPVCount; op[191] = &AGOSEngine::off_resetPVCount;
op[192] = &AGOSEngine::o3_setPathValues; op[192] = &AGOSEngine::off_setPathValues;
op[193] = &AGOSEngine::o3_stopClock; op[193] = &AGOSEngine::off_stopClock;
op[194] = &AGOSEngine::o3_restartClock; op[194] = &AGOSEngine::off_restartClock;
op[195] = &AGOSEngine::o3_setColour; op[195] = &AGOSEngine::off_setColour;
op[196] = &AGOSEngine::o3_b3Set; op[196] = &AGOSEngine::off_b3Set;
op[197] = &AGOSEngine::o3_b3Clear; op[197] = &AGOSEngine::off_b3Clear;
op[198] = &AGOSEngine::o3_b3Zero; op[198] = &AGOSEngine::off_b3Zero;
op[199] = &AGOSEngine::o3_b3NotZero; op[199] = &AGOSEngine::off_b3NotZero;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Feeble Files Opcodes // Feeble Files Opcodes
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void AGOSEngine::o3_chance() { void AGOSEngine::off_chance() {
// 23 // 23
uint a = getVarOrWord(); uint a = getVarOrWord();
@ -112,13 +112,13 @@ void AGOSEngine::o3_chance() {
setScriptCondition(false); setScriptCondition(false);
} }
void AGOSEngine::o3_jumpOut() { void AGOSEngine::off_jumpOut() {
// 37 // 37
getVarOrByte(); getVarOrByte();
setScriptReturn(1); setScriptReturn(1);
} }
void AGOSEngine::o3_addTextBox() { void AGOSEngine::off_addTextBox() {
// 65: add hit area // 65: add hit area
uint flags = kBFTextBox | kBFBoxItem; uint flags = kBFTextBox | kBFBoxItem;
uint id = getVarOrWord(); uint id = getVarOrWord();
@ -139,14 +139,14 @@ void AGOSEngine::o3_addTextBox() {
defineBox(id, x, y, w, h, flags + (num << 8), 208, _dummyItem2); defineBox(id, x, y, w, h, flags + (num << 8), 208, _dummyItem2);
} }
void AGOSEngine::o3_printLongText() { void AGOSEngine::off_printLongText() {
// 70: show string from array // 70: show string from array
int num = getVarOrByte(); int num = getVarOrByte();
const char *str = (const char *)getStringPtrByID(_longText[num]); const char *str = (const char *)getStringPtrByID(_longText[num]);
sendInteractText(num, "%d. %s\n", num, str); sendInteractText(num, "%d. %s\n", num, str);
} }
void AGOSEngine::o3_addBox() { void AGOSEngine::off_addBox() {
// 107: add item hitarea // 107: add item hitarea
uint flags = 0; uint flags = 0;
uint id = getVarOrWord(); uint id = getVarOrWord();
@ -176,17 +176,17 @@ void AGOSEngine::o3_addBox() {
defineBox(id, x, y, w, h, flags, verb, item); defineBox(id, x, y, w, h, flags, verb, item);
} }
void AGOSEngine::o3_oracleTextDown() { void AGOSEngine::off_oracleTextDown() {
// 122: oracle text down // 122: oracle text down
oracleTextDown(); oracleTextDown();
} }
void AGOSEngine::o3_oracleTextUp() { void AGOSEngine::off_oracleTextUp() {
// 123: oracle text up // 123: oracle text up
oracleTextUp(); oracleTextUp();
} }
void AGOSEngine::o3_ifTime() { void AGOSEngine::off_ifTime() {
// 124: if time // 124: if time
time_t t; time_t t;
@ -200,13 +200,13 @@ void AGOSEngine::o3_ifTime() {
setScriptCondition(false); setScriptCondition(false);
} }
void AGOSEngine::o3_setTime() { void AGOSEngine::off_setTime() {
// 131 // 131
time(&_timeStore); time(&_timeStore);
_timeStore -= _gameStoppedClock; _timeStore -= _gameStoppedClock;
} }
void AGOSEngine::o3_saveUserGame() { void AGOSEngine::off_saveUserGame() {
// 132: save game // 132: save game
_noOracleScroll = 0; _noOracleScroll = 0;
_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true); _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
@ -214,17 +214,17 @@ void AGOSEngine::o3_saveUserGame() {
_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
} }
void AGOSEngine::o3_loadUserGame() { void AGOSEngine::off_loadUserGame() {
// 133: load game // 133: load game
loadGame(readVariable(55)); loadGame(readVariable(55));
} }
void AGOSEngine::o3_listSaveGames() { void AGOSEngine::off_listSaveGames() {
// 134: dummy opcode? // 134: dummy opcode?
listSaveGames(1); listSaveGames(1);
} }
void AGOSEngine::o3_checkCD() { void AGOSEngine::off_checkCD() {
// 135: switch CD // 135: switch CD
uint disc = readVariable(97); uint disc = readVariable(97);
@ -240,7 +240,7 @@ void AGOSEngine::o3_checkCD() {
debug(0, "Switch to CD number %d", disc); debug(0, "Switch to CD number %d", disc);
} }
void AGOSEngine::o3_screenTextBox() { void AGOSEngine::off_screenTextBox() {
// 161: setup text // 161: setup text
TextLocation *tl = getTextLocation(getVarOrByte()); TextLocation *tl = getTextLocation(getVarOrByte());
@ -249,7 +249,7 @@ void AGOSEngine::o3_screenTextBox() {
tl->width = getVarOrWord(); tl->width = getVarOrWord();
} }
void AGOSEngine::o3_isAdjNoun() { void AGOSEngine::off_isAdjNoun() {
// 165: item unk1 unk2 is // 165: item unk1 unk2 is
Item *item = getNextItemPtr(); Item *item = getNextItemPtr();
int16 a = getNextWord(), b = getNextWord(); int16 a = getNextWord(), b = getNextWord();
@ -261,17 +261,17 @@ void AGOSEngine::o3_isAdjNoun() {
setScriptCondition(false); setScriptCondition(false);
} }
void AGOSEngine::o3_hyperLinkOn() { void AGOSEngine::off_hyperLinkOn() {
// 171: oracle hyperlink on // 171: oracle hyperlink on
hyperLinkOn(getVarOrWord()); hyperLinkOn(getVarOrWord());
} }
void AGOSEngine::o3_hyperLinkOff() { void AGOSEngine::off_hyperLinkOff() {
// 172: oracle hyperlink off // 172: oracle hyperlink off
hyperLinkOff(); hyperLinkOff();
} }
void AGOSEngine::o3_checkPaths() { void AGOSEngine::off_checkPaths() {
// 173 check paths // 173 check paths
int i, count; int i, count;
const uint8 *pathVal1 = _pathValues1; const uint8 *pathVal1 = _pathValues1;
@ -307,7 +307,7 @@ void AGOSEngine::o3_checkPaths() {
_variableArray2[52] = result; _variableArray2[52] = result;
} }
void AGOSEngine::o3_screenTextPObj() { void AGOSEngine::off_screenTextPObj() {
// 177: inventory descriptions // 177: inventory descriptions
uint vgaSpriteId = getVarOrByte(); uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte(); uint color = getVarOrByte();
@ -336,29 +336,29 @@ void AGOSEngine::o3_screenTextPObj() {
} }
} }
void AGOSEngine::o3_mouseOff() { void AGOSEngine::off_mouseOff() {
// 181: force mouseOff // 181: force mouseOff
scriptMouseOff(); scriptMouseOff();
clearName(); clearName();
} }
void AGOSEngine::o3_loadVideo() { void AGOSEngine::off_loadVideo() {
// 182: load video file // 182: load video file
const byte *filename = getStringPtrByID(getNextStringID()); const byte *filename = getStringPtrByID(getNextStringID());
_moviePlay->load((const char *)filename); _moviePlay->load((const char *)filename);
} }
void AGOSEngine::o3_playVideo() { void AGOSEngine::off_playVideo() {
// 183: play video // 183: play video
_moviePlay->play(); _moviePlay->play();
} }
void AGOSEngine::o3_centreScroll() { void AGOSEngine::off_centreScroll() {
// 187 // 187
centreScroll(); centreScroll();
} }
void AGOSEngine::o3_resetPVCount() { void AGOSEngine::off_resetPVCount() {
// 191 // 191
if (getBitFlag(83)) { if (getBitFlag(83)) {
_PVCount1 = 0; _PVCount1 = 0;
@ -369,7 +369,7 @@ void AGOSEngine::o3_resetPVCount() {
} }
} }
void AGOSEngine::o3_setPathValues() { void AGOSEngine::off_setPathValues() {
// 192 // 192
uint8 a = getVarOrByte(); uint8 a = getVarOrByte();
uint8 b = getVarOrByte(); uint8 b = getVarOrByte();
@ -388,19 +388,19 @@ void AGOSEngine::o3_setPathValues() {
} }
} }
void AGOSEngine::o3_stopClock() { void AGOSEngine::off_stopClock() {
// 193: pause clock // 193: pause clock
_clockStopped = time(NULL); _clockStopped = time(NULL);
} }
void AGOSEngine::o3_restartClock() { void AGOSEngine::off_restartClock() {
// 194: resume clock // 194: resume clock
if (_clockStopped != 0) if (_clockStopped != 0)
_gameStoppedClock += time(NULL) - _clockStopped; _gameStoppedClock += time(NULL) - _clockStopped;
_clockStopped = 0; _clockStopped = 0;
} }
void AGOSEngine::o3_setColour() { void AGOSEngine::off_setColour() {
// 195: set palette colour // 195: set palette colour
uint c = getVarOrByte() * 4; uint c = getVarOrByte() * 4;
uint r = getVarOrByte(); uint r = getVarOrByte();
@ -414,25 +414,25 @@ void AGOSEngine::o3_setColour() {
_paletteFlag = 2; _paletteFlag = 2;
} }
void AGOSEngine::o3_b3Set() { void AGOSEngine::off_b3Set() {
// 196: set bit3 // 196: set bit3
uint bit = getVarOrByte(); uint bit = getVarOrByte();
_bitArrayThree[bit / 16] |= (1 << (bit & 15)); _bitArrayThree[bit / 16] |= (1 << (bit & 15));
} }
void AGOSEngine::o3_b3Clear() { void AGOSEngine::off_b3Clear() {
// 197: clear bit3 // 197: clear bit3
uint bit = getVarOrByte(); uint bit = getVarOrByte();
_bitArrayThree[bit / 16] &= ~(1 << (bit & 15)); _bitArrayThree[bit / 16] &= ~(1 << (bit & 15));
} }
void AGOSEngine::o3_b3Zero() { void AGOSEngine::off_b3Zero() {
// 198: is bit3 clear // 198: is bit3 clear
uint bit = getVarOrByte(); uint bit = getVarOrByte();
setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) == 0); setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) == 0);
} }
void AGOSEngine::o3_b3NotZero() { void AGOSEngine::off_b3NotZero() {
// 199: is bit3 set // 199: is bit3 set
uint bit = getVarOrByte(); uint bit = getVarOrByte();
setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) != 0); setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) != 0);

View file

@ -32,61 +32,61 @@ namespace AGOS {
void AGOSEngine::setupPuzzleOpcodes(OpcodeProc *op) { void AGOSEngine::setupPuzzleOpcodes(OpcodeProc *op) {
setupCommonOpcodes(op); setupCommonOpcodes(op);
op[23] = &AGOSEngine::o3_chance; op[23] = &AGOSEngine::off_chance;
op[30] = &AGOSEngine::o4_iconifyWindow; op[30] = &AGOSEngine::opp_iconifyWindow;
op[32] = &AGOSEngine::o4_restoreOopsPosition; op[32] = &AGOSEngine::opp_restoreOopsPosition;
op[38] = &AGOSEngine::o4_loadMouseImage; op[38] = &AGOSEngine::opp_loadMouseImage;
op[63] = &AGOSEngine::o4_message; op[63] = &AGOSEngine::opp_message;
op[65] = &AGOSEngine::o3_addTextBox; op[65] = &AGOSEngine::off_addTextBox;
op[66] = &AGOSEngine::o4_setShortText; op[66] = &AGOSEngine::opp_setShortText;
op[67] = &AGOSEngine::o_setLongText; op[67] = &AGOSEngine::oww_setLongText;
op[70] = &AGOSEngine::o3_printLongText; op[70] = &AGOSEngine::off_printLongText;
op[83] = &AGOSEngine::o2_rescan; op[83] = &AGOSEngine::os2_rescan;
op[98] = &AGOSEngine::o2_animate; op[98] = &AGOSEngine::os2_animate;
op[99] = &AGOSEngine::o2_stopAnimate; op[99] = &AGOSEngine::os2_stopAnimate;
op[105] = &AGOSEngine::o4_loadHiScores; op[105] = &AGOSEngine::opp_loadHiScores;
op[106] = &AGOSEngine::o4_checkHiScores; op[106] = &AGOSEngine::opp_checkHiScores;
op[107] = &AGOSEngine::o3_addBox; op[107] = &AGOSEngine::off_addBox;
op[120] = &AGOSEngine::o4_sync; op[120] = &AGOSEngine::opp_sync;
op[122] = &AGOSEngine::o3_oracleTextDown; op[122] = &AGOSEngine::off_oracleTextDown;
op[123] = &AGOSEngine::o3_oracleTextUp; op[123] = &AGOSEngine::off_oracleTextUp;
op[124] = &AGOSEngine::o3_ifTime; op[124] = &AGOSEngine::off_ifTime;
op[131] = &AGOSEngine::o3_setTime; op[131] = &AGOSEngine::off_setTime;
op[132] = &AGOSEngine::o4_saveUserGame; op[132] = &AGOSEngine::opp_saveUserGame;
op[133] = &AGOSEngine::o4_loadUserGame; op[133] = &AGOSEngine::opp_loadUserGame;
op[134] = &AGOSEngine::o3_listSaveGames; op[134] = &AGOSEngine::off_listSaveGames;
op[161] = &AGOSEngine::o3_screenTextBox; op[161] = &AGOSEngine::off_screenTextBox;
op[162] = &AGOSEngine::o_screenTextMsg; op[162] = &AGOSEngine::os1_screenTextMsg;
op[164] = &AGOSEngine::o_getDollar2; op[164] = &AGOSEngine::oe2_getDollar2;
op[165] = &AGOSEngine::o3_isAdjNoun; op[165] = &AGOSEngine::off_isAdjNoun;
op[171] = &AGOSEngine::o3_hyperLinkOn; op[171] = &AGOSEngine::off_hyperLinkOn;
op[172] = &AGOSEngine::o3_hyperLinkOff; op[172] = &AGOSEngine::off_hyperLinkOff;
op[173] = &AGOSEngine::o4_saveOopsPosition; op[173] = &AGOSEngine::opp_saveOopsPosition;
op[175] = &AGOSEngine::o_lockZones; op[175] = &AGOSEngine::oww_lockZones;
op[176] = &AGOSEngine::o_unlockZones; op[176] = &AGOSEngine::oww_unlockZones;
op[177] = &AGOSEngine::o3_screenTextPObj; op[177] = &AGOSEngine::off_screenTextPObj;
op[178] = &AGOSEngine::o_getPathPosn; op[178] = &AGOSEngine::os1_getPathPosn;
op[179] = &AGOSEngine::o_scnTxtLongText; op[179] = &AGOSEngine::os1_scnTxtLongText;
op[180] = &AGOSEngine::o_mouseOn; op[180] = &AGOSEngine::os1_mouseOn;
op[181] = &AGOSEngine::o3_mouseOff; op[181] = &AGOSEngine::off_mouseOff;
op[184] = &AGOSEngine::o_unloadZone; op[184] = &AGOSEngine::os1_unloadZone;
op[186] = &AGOSEngine::o_unfreezeZones; op[186] = &AGOSEngine::os1_unfreezeZones;
op[187] = &AGOSEngine::o4_resetGameTime; op[187] = &AGOSEngine::opp_resetGameTime;
op[188] = &AGOSEngine::o2_isShortText; op[188] = &AGOSEngine::os2_isShortText;
op[189] = &AGOSEngine::o2_clearMarks; op[189] = &AGOSEngine::os2_clearMarks;
op[190] = &AGOSEngine::o2_waitMark; op[190] = &AGOSEngine::os2_waitMark;
op[191] = &AGOSEngine::o4_resetPVCount; op[191] = &AGOSEngine::opp_resetPVCount;
op[192] = &AGOSEngine::o4_setPathValues; op[192] = &AGOSEngine::opp_setPathValues;
op[193] = &AGOSEngine::o3_stopClock; op[193] = &AGOSEngine::off_stopClock;
op[194] = &AGOSEngine::o4_restartClock; op[194] = &AGOSEngine::opp_restartClock;
op[195] = &AGOSEngine::o3_setColour; op[195] = &AGOSEngine::off_setColour;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Puzzle Pack Opcodes // Puzzle Pack Opcodes
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void AGOSEngine::o4_iconifyWindow() { void AGOSEngine::opp_iconifyWindow() {
// 30 // 30
getNextItemPtr(); getNextItemPtr();
if (_clockStopped != 0) if (_clockStopped != 0)
@ -95,7 +95,7 @@ void AGOSEngine::o4_iconifyWindow() {
_system->setFeatureState(OSystem::kFeatureIconifyWindow, true); _system->setFeatureState(OSystem::kFeatureIconifyWindow, true);
} }
void AGOSEngine::o4_restoreOopsPosition() { void AGOSEngine::opp_restoreOopsPosition() {
// 32: restore oops position // 32: restore oops position
uint i; uint i;
@ -117,14 +117,14 @@ void AGOSEngine::o4_restoreOopsPosition() {
} }
} }
void AGOSEngine::o4_loadMouseImage() { void AGOSEngine::opp_loadMouseImage() {
// 38: load mouse image // 38: load mouse image
getNextItemPtr(); getNextItemPtr();
getVarOrByte(); getVarOrByte();
loadMouseImage(); loadMouseImage();
} }
void AGOSEngine::o4_message() { void AGOSEngine::opp_message() {
// 63: show string nl // 63: show string nl
if (getBitFlag(105)) { if (getBitFlag(105)) {
@ -136,7 +136,7 @@ void AGOSEngine::o4_message() {
} }
} }
void AGOSEngine::o4_setShortText() { void AGOSEngine::opp_setShortText() {
// 66: set item name // 66: set item name
uint var = getVarOrByte(); uint var = getVarOrByte();
uint stringId = getNextStringID(); uint stringId = getNextStringID();
@ -147,18 +147,18 @@ void AGOSEngine::o4_setShortText() {
} }
} }
void AGOSEngine::o4_loadHiScores() { void AGOSEngine::opp_loadHiScores() {
// 105: load high scores // 105: load high scores
getVarOrByte(); getVarOrByte();
} }
void AGOSEngine::o4_checkHiScores() { void AGOSEngine::opp_checkHiScores() {
// 106: check high scores // 106: check high scores
getVarOrByte(); getVarOrByte();
getVarOrByte(); getVarOrByte();
} }
void AGOSEngine::o4_sync() { void AGOSEngine::opp_sync() {
// 120: sync // 120: sync
uint a = getVarOrWord(); uint a = getVarOrWord();
if (a == 8001 || a == 8101 || a == 8201 || a == 8301 || a == 8401) { if (a == 8001 || a == 8101 || a == 8201 || a == 8301 || a == 8401) {
@ -167,7 +167,7 @@ void AGOSEngine::o4_sync() {
sendSync(a); sendSync(a);
} }
void AGOSEngine::o4_saveUserGame() { void AGOSEngine::opp_saveUserGame() {
// 132: save game // 132: save game
if (_clockStopped != 0) if (_clockStopped != 0)
_gameTime += time(NULL) - _clockStopped; _gameTime += time(NULL) - _clockStopped;
@ -183,7 +183,7 @@ void AGOSEngine::o4_saveUserGame() {
//saveHiScores() //saveHiScores()
} }
void AGOSEngine::o4_loadUserGame() { void AGOSEngine::opp_loadUserGame() {
// 133: load usergame // 133: load usergame
// NoPatience or Jumble // NoPatience or Jumble
@ -196,7 +196,7 @@ void AGOSEngine::o4_loadUserGame() {
loadGame(1); loadGame(1);
} }
void AGOSEngine::o4_saveOopsPosition() { void AGOSEngine::opp_saveOopsPosition() {
// 173: save oops position // 173: save oops position
if (!isVgaQueueEmpty()) { if (!isVgaQueueEmpty()) {
_oopsValid = true; _oopsValid = true;
@ -208,18 +208,18 @@ void AGOSEngine::o4_saveOopsPosition() {
} }
} }
void AGOSEngine::o4_resetGameTime() { void AGOSEngine::opp_resetGameTime() {
// 187: reset game time // 187: reset game time
_gameTime = 0; _gameTime = 0;
} }
void AGOSEngine::o4_resetPVCount() { void AGOSEngine::opp_resetPVCount() {
// 191 // 191
_PVCount = 0; _PVCount = 0;
_GPVCount = 0; _GPVCount = 0;
} }
void AGOSEngine::o4_setPathValues() { void AGOSEngine::opp_setPathValues() {
// 192 // 192
_pathValues[_PVCount++] = getVarOrByte(); _pathValues[_PVCount++] = getVarOrByte();
_pathValues[_PVCount++] = getVarOrByte(); _pathValues[_PVCount++] = getVarOrByte();
@ -227,7 +227,7 @@ void AGOSEngine::o4_setPathValues() {
_pathValues[_PVCount++] = getVarOrByte(); _pathValues[_PVCount++] = getVarOrByte();
} }
void AGOSEngine::o4_restartClock() { void AGOSEngine::opp_restartClock() {
// 194: resume clock // 194: resume clock
if (_clockStopped != 0) if (_clockStopped != 0)
_gameTime += time(NULL) - _clockStopped; _gameTime += time(NULL) - _clockStopped;

View file

@ -32,62 +32,53 @@ namespace AGOS {
void AGOSEngine::setupSimon1Opcodes(OpcodeProc *op) { void AGOSEngine::setupSimon1Opcodes(OpcodeProc *op) {
setupCommonOpcodes(op); setupCommonOpcodes(op);
op[65] = &AGOSEngine::o_addTextBox; op[65] = &AGOSEngine::oww_addTextBox;
op[66] = &AGOSEngine::o_setShortText; op[66] = &AGOSEngine::oww_setShortText;
op[67] = &AGOSEngine::o_setLongText; op[67] = &AGOSEngine::oww_setLongText;
op[70] = &AGOSEngine::o1_printLongText; op[70] = &AGOSEngine::oww_printLongText;
op[83] = &AGOSEngine::o1_rescan; op[83] = &AGOSEngine::oe1_rescan;
op[98] = &AGOSEngine::o1_animate; op[88] = &AGOSEngine::o_haltAnimation;
op[99] = &AGOSEngine::o1_stopAnimate; op[89] = &AGOSEngine::o_restartAnimation;
op[127] = &AGOSEngine::o1_playTune; op[98] = &AGOSEngine::os1_animate;
op[161] = &AGOSEngine::o_screenTextBox; op[99] = &AGOSEngine::oe1_stopAnimate;
op[162] = &AGOSEngine::o_screenTextMsg; op[127] = &AGOSEngine::os1_playTune;
op[163] = &AGOSEngine::o_playEffect; op[161] = &AGOSEngine::os1_screenTextBox;
op[164] = &AGOSEngine::o_getDollar2; op[162] = &AGOSEngine::os1_screenTextMsg;
op[165] = &AGOSEngine::o_isAdjNoun; op[163] = &AGOSEngine::os1_playEffect;
op[166] = &AGOSEngine::o_b2Set; op[164] = &AGOSEngine::oe2_getDollar2;
op[167] = &AGOSEngine::o_b2Clear; op[165] = &AGOSEngine::oe2_isAdjNoun;
op[168] = &AGOSEngine::o_b2Zero; op[166] = &AGOSEngine::oe2_b2Set;
op[169] = &AGOSEngine::o_b2NotZero; op[167] = &AGOSEngine::oe2_b2Clear;
op[175] = &AGOSEngine::o_lockZones; op[168] = &AGOSEngine::oe2_b2Zero;
op[176] = &AGOSEngine::o_unlockZones; op[169] = &AGOSEngine::oe2_b2NotZero;
op[177] = &AGOSEngine::o1_screenTextPObj; op[175] = &AGOSEngine::oww_lockZones;
op[178] = &AGOSEngine::o_getPathPosn; op[176] = &AGOSEngine::oww_unlockZones;
op[179] = &AGOSEngine::o_scnTxtLongText; op[177] = &AGOSEngine::os1_screenTextPObj;
op[180] = &AGOSEngine::o_mouseOn; op[178] = &AGOSEngine::os1_getPathPosn;
op[181] = &AGOSEngine::o1_mouseOff; op[179] = &AGOSEngine::os1_scnTxtLongText;
op[182] = &AGOSEngine::o1_loadBeard; op[180] = &AGOSEngine::os1_mouseOn;
op[183] = &AGOSEngine::o1_unloadBeard; op[181] = &AGOSEngine::os1_mouseOff;
op[184] = &AGOSEngine::o_unloadZone; op[182] = &AGOSEngine::os1_loadBeard;
op[185] = &AGOSEngine::o1_loadStrings; op[183] = &AGOSEngine::os1_unloadBeard;
op[186] = &AGOSEngine::o_unfreezeZones; op[184] = &AGOSEngine::os1_unloadZone;
op[187] = &AGOSEngine::o1_specialFade; op[185] = &AGOSEngine::os1_loadStrings;
op[186] = &AGOSEngine::os1_unfreezeZones;
op[187] = &AGOSEngine::os1_specialFade;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Simon 1 Opcodes // Simon 1 Opcodes
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void AGOSEngine::o1_printLongText() { void AGOSEngine::os1_animate() {
// 70: show string from array // 98: animate
const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]);
showMessageFormat("%s\n", str);
}
void AGOSEngine::o1_rescan() {
// 83: restart subroutine
setScriptReturn(-10);
}
void AGOSEngine::o1_animate() {
// 98: start vga
uint vgaSpriteId = getVarOrWord(); uint vgaSpriteId = getVarOrWord();
uint windowNum = getVarOrByte(); uint windowNum = getVarOrByte();
uint x = getVarOrWord(); uint x = getVarOrWord();
uint y = getVarOrWord(); uint y = getVarOrWord();
uint palette = getVarOrWord(); uint palette = getVarOrWord();
if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE) && vgaSpriteId >= 400) { if (getFeatures() & GF_TALKIE && vgaSpriteId >= 400) {
_lastVgaWaitFor = 0; _lastVgaWaitFor = 0;
} }
@ -96,12 +87,7 @@ void AGOSEngine::o1_animate() {
_lockWord &= ~0x40; _lockWord &= ~0x40;
} }
void AGOSEngine::o1_stopAnimate() { void AGOSEngine::os1_playTune() {
// 99: kill sprite
stopAnimateSimon1(getVarOrWord());
}
void AGOSEngine::o1_playTune() {
// 127: deals with music // 127: deals with music
int music = getVarOrWord(); int music = getVarOrWord();
int track = getVarOrWord(); int track = getVarOrWord();
@ -122,7 +108,61 @@ void AGOSEngine::o1_playTune() {
} }
} }
void AGOSEngine::o1_screenTextPObj() { void AGOSEngine::os1_screenTextBox() {
// 161: setup text
TextLocation *tl = getTextLocation(getVarOrByte());
tl->x = getVarOrWord();
tl->y = getVarOrByte();
tl->width = getVarOrWord();
}
void AGOSEngine::os1_screenTextMsg() {
// 162: print string
uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte();
uint stringId = getNextStringID();
const byte *string_ptr = NULL;
uint speechId = 0;
TextLocation *tl;
if (stringId != 0xFFFF)
string_ptr = getStringPtrByID(stringId);
if (getFeatures() & GF_TALKIE) {
if (getGameType() == GType_FF || getGameType() == GType_PP)
speechId = (uint16)getVarOrWord();
else
speechId = (uint16)getNextWord();
}
if (getGameType() == GType_FF || getGameType() == GType_PP)
vgaSpriteId = 1;
tl = getTextLocation(vgaSpriteId);
if (_speech && speechId != 0)
playSpeech(speechId, vgaSpriteId);
if (((getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || getGameType() == GType_FF) &&
speechId == 0) {
stopAnimateSimon2(2, vgaSpriteId + 2);
}
if (string_ptr != NULL && (speechId == 0 || _subtitles))
printScreenText(vgaSpriteId, color, (const char *)string_ptr, tl->x, tl->y, tl->width);
}
void AGOSEngine::os1_playEffect() {
// 163: play sound
uint soundId = getVarOrWord();
if (getGameId() == GID_SIMON1DOS)
playSting(soundId);
else
_sound->playEffects(soundId);
}
void AGOSEngine::os1_screenTextPObj() {
// 177: inventory descriptions // 177: inventory descriptions
uint vgaSpriteId = getVarOrByte(); uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte(); uint color = getVarOrByte();
@ -163,12 +203,88 @@ void AGOSEngine::o1_screenTextPObj() {
} }
} }
void AGOSEngine::o1_mouseOff() { void AGOSEngine::os1_getPathPosn() {
// 178: path find
uint x = getVarOrWord();
uint y = getVarOrWord();
uint var_1 = getVarOrByte();
uint var_2 = getVarOrByte();
const uint16 *p;
uint i, j;
uint prev_i;
uint x_diff, y_diff;
uint best_i = 0, best_j = 0, best_dist = 0xFFFFFFFF;
uint maxPath = (getGameType() == GType_FF || getGameType() == GType_PP) ? 100 : 20;
if (getGameType() == GType_FF || getGameType() == GType_PP) {
x += _scrollX;
y += _scrollY;
} else if (getGameType() == GType_SIMON2) {
x += _scrollX * 8;
}
int end = (getGameType() == GType_FF) ? 9999 : 999;
prev_i = maxPath + 1 - readVariable(12);
for (i = maxPath; i != 0; --i) {
p = (const uint16 *)_pathFindArray[maxPath - i];
if (!p)
continue;
for (j = 0; readUint16Wrapper(&p[0]) != end; j++, p += 2) {
x_diff = ABS((int16)(readUint16Wrapper(&p[0]) - x));
y_diff = ABS((int16)(readUint16Wrapper(&p[1]) - 12 - y));
if (x_diff < y_diff) {
x_diff /= 4;
y_diff *= 4;
}
x_diff += y_diff /= 4;
if (x_diff < best_dist || x_diff == best_dist && prev_i == i) {
best_dist = x_diff;
best_i = maxPath + 1 - i;
best_j = j;
}
}
}
writeVariable(var_1, best_i);
writeVariable(var_2, best_j);
}
void AGOSEngine::os1_scnTxtLongText() {
// 179: conversation responses and room descriptions
uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte();
uint stringId = getVarOrByte();
uint speechId = 0;
TextLocation *tl;
const char *string_ptr = (const char *)getStringPtrByID(_longText[stringId]);
if (getFeatures() & GF_TALKIE)
speechId = _longSound[stringId];
if (getGameType() == GType_FF || getGameType() == GType_PP)
vgaSpriteId = 1;
tl = getTextLocation(vgaSpriteId);
if (_speech && speechId != 0)
playSpeech(speechId, vgaSpriteId);
if (string_ptr != NULL && _subtitles)
printScreenText(vgaSpriteId, color, string_ptr, tl->x, tl->y, tl->width);
}
void AGOSEngine::os1_mouseOn() {
// 180: force mouseOn
scriptMouseOn();
}
void AGOSEngine::os1_mouseOff() {
// 181: force mouseOff // 181: force mouseOff
scriptMouseOff(); scriptMouseOff();
} }
void AGOSEngine::o1_loadBeard() { void AGOSEngine::os1_loadBeard() {
// 182: load beard // 182: load beard
if (_beardLoaded == false) { if (_beardLoaded == false) {
_beardLoaded = true; _beardLoaded = true;
@ -178,7 +294,7 @@ void AGOSEngine::o1_loadBeard() {
} }
} }
void AGOSEngine::o1_unloadBeard() { void AGOSEngine::os1_unloadBeard() {
// 183: unload beard // 183: unload beard
if (_beardLoaded == true) { if (_beardLoaded == true) {
_beardLoaded = false; _beardLoaded = false;
@ -188,7 +304,17 @@ void AGOSEngine::o1_unloadBeard() {
} }
} }
void AGOSEngine::o1_loadStrings() { void AGOSEngine::os1_unloadZone() {
// 184: unload zone
uint a = getVarOrWord();
VgaPointersEntry *vpe = &_vgaBufferPointers[a];
vpe->sfxFile = NULL;
vpe->vgaFile1 = NULL;
vpe->vgaFile2 = NULL;
}
void AGOSEngine::os1_loadStrings() {
// 185: load sound files // 185: load sound files
_soundFileId = getVarOrWord(); _soundFileId = getVarOrWord();
if (getPlatform() == Common::kPlatformAmiga && getFeatures() & GF_TALKIE) { if (getPlatform() == Common::kPlatformAmiga && getFeatures() & GF_TALKIE) {
@ -200,7 +326,12 @@ void AGOSEngine::o1_loadStrings() {
} }
} }
void AGOSEngine::o1_specialFade() { void AGOSEngine::os1_unfreezeZones() {
// 186: freeze zone
unfreezeBottom();
}
void AGOSEngine::os1_specialFade() {
// 187: fade to black // 187: fade to black
uint i; uint i;

View file

@ -30,49 +30,51 @@ namespace AGOS {
void AGOSEngine::setupSimon2Opcodes(OpcodeProc *op) { void AGOSEngine::setupSimon2Opcodes(OpcodeProc *op) {
setupCommonOpcodes(op); setupCommonOpcodes(op);
op[65] = &AGOSEngine::o_addTextBox; op[65] = &AGOSEngine::oww_addTextBox;
op[66] = &AGOSEngine::o_setShortText; op[66] = &AGOSEngine::oww_setShortText;
op[67] = &AGOSEngine::o_setLongText; op[67] = &AGOSEngine::oww_setLongText;
op[70] = &AGOSEngine::o2_printLongText; op[70] = &AGOSEngine::os2_printLongText;
op[83] = &AGOSEngine::o2_rescan; op[83] = &AGOSEngine::os2_rescan;
op[98] = &AGOSEngine::o2_animate; op[88] = &AGOSEngine::o_haltAnimation;
op[99] = &AGOSEngine::o2_stopAnimate; op[89] = &AGOSEngine::o_restartAnimation;
op[127] = &AGOSEngine::o2_playTune; op[98] = &AGOSEngine::os2_animate;
op[161] = &AGOSEngine::o_screenTextBox; op[99] = &AGOSEngine::os2_stopAnimate;
op[162] = &AGOSEngine::o_screenTextMsg; op[127] = &AGOSEngine::os2_playTune;
op[163] = &AGOSEngine::o_playEffect; op[161] = &AGOSEngine::os1_screenTextBox;
op[164] = &AGOSEngine::o_getDollar2; op[162] = &AGOSEngine::os1_screenTextMsg;
op[165] = &AGOSEngine::o_isAdjNoun; op[163] = &AGOSEngine::os1_playEffect;
op[166] = &AGOSEngine::o_b2Set; op[164] = &AGOSEngine::oe2_getDollar2;
op[167] = &AGOSEngine::o_b2Clear; op[165] = &AGOSEngine::oe2_isAdjNoun;
op[168] = &AGOSEngine::o_b2Zero; op[166] = &AGOSEngine::oe2_b2Set;
op[169] = &AGOSEngine::o_b2NotZero; op[167] = &AGOSEngine::oe2_b2Clear;
op[175] = &AGOSEngine::o_lockZones; op[168] = &AGOSEngine::oe2_b2Zero;
op[176] = &AGOSEngine::o_unlockZones; op[169] = &AGOSEngine::oe2_b2NotZero;
op[177] = &AGOSEngine::o2_screenTextPObj; op[175] = &AGOSEngine::oww_lockZones;
op[178] = &AGOSEngine::o_getPathPosn; op[176] = &AGOSEngine::oww_unlockZones;
op[179] = &AGOSEngine::o_scnTxtLongText; op[177] = &AGOSEngine::os2_screenTextPObj;
op[180] = &AGOSEngine::o_mouseOn; op[178] = &AGOSEngine::os1_getPathPosn;
op[181] = &AGOSEngine::o2_mouseOff; op[179] = &AGOSEngine::os1_scnTxtLongText;
op[184] = &AGOSEngine::o_unloadZone; op[180] = &AGOSEngine::os1_mouseOn;
op[186] = &AGOSEngine::o_unfreezeZones; op[181] = &AGOSEngine::os2_mouseOff;
op[188] = &AGOSEngine::o2_isShortText; op[184] = &AGOSEngine::os1_unloadZone;
op[189] = &AGOSEngine::o2_clearMarks; op[186] = &AGOSEngine::os1_unfreezeZones;
op[190] = &AGOSEngine::o2_waitMark; op[188] = &AGOSEngine::os2_isShortText;
op[189] = &AGOSEngine::os2_clearMarks;
op[190] = &AGOSEngine::os2_waitMark;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Simon 2 Opcodes // Simon 2 Opcodes
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void AGOSEngine::o2_printLongText() { void AGOSEngine::os2_printLongText() {
// 70: show string from array // 70: show string from array
const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]); const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]);
writeVariable(51, strlen(str) / 53 * 8 + 8); writeVariable(51, strlen(str) / 53 * 8 + 8);
showMessageFormat("%s\n", str); showMessageFormat("%s\n", str);
} }
void AGOSEngine::o2_rescan() { void AGOSEngine::os2_rescan() {
// 83: restart subroutine // 83: restart subroutine
if (_exitCutscene) { if (_exitCutscene) {
if (getBitFlag(9)) { if (getBitFlag(9)) {
@ -85,7 +87,7 @@ void AGOSEngine::o2_rescan() {
setScriptReturn(-10); setScriptReturn(-10);
} }
void AGOSEngine::o2_animate() { void AGOSEngine::os2_animate() {
// 98: start vga // 98: start vga
uint zoneNum = getVarOrWord(); uint zoneNum = getVarOrWord();
uint vgaSpriteId = getVarOrWord(); uint vgaSpriteId = getVarOrWord();
@ -99,14 +101,14 @@ void AGOSEngine::o2_animate() {
_lockWord &= ~0x40; _lockWord &= ~0x40;
} }
void AGOSEngine::o2_stopAnimate() { void AGOSEngine::os2_stopAnimate() {
// 99: kill sprite // 99: kill sprite
uint a = getVarOrWord(); uint a = getVarOrWord();
uint b = getVarOrWord(); uint b = getVarOrWord();
stopAnimateSimon2(a, b); stopAnimateSimon2(a, b);
} }
void AGOSEngine::o2_playTune() { void AGOSEngine::os2_playTune() {
// 127: deals with music // 127: deals with music
int music = getVarOrWord(); int music = getVarOrWord();
int track = getVarOrWord(); int track = getVarOrWord();
@ -128,7 +130,7 @@ void AGOSEngine::o2_playTune() {
midi.startTrack(track); midi.startTrack(track);
} }
void AGOSEngine::o2_screenTextPObj() { void AGOSEngine::os2_screenTextPObj() {
// 177: inventory descriptions // 177: inventory descriptions
uint vgaSpriteId = getVarOrByte(); uint vgaSpriteId = getVarOrByte();
uint color = getVarOrByte(); uint color = getVarOrByte();
@ -177,7 +179,7 @@ void AGOSEngine::o2_screenTextPObj() {
speechId = 51; speechId = 51;
break; break;
default: default:
error("o2_screenTextPObj: invalid case %d", speechIdOffs); error("os2_screenTextPObj: invalid case %d", speechIdOffs);
} }
} }
} }
@ -213,26 +215,26 @@ void AGOSEngine::o2_screenTextPObj() {
} }
} }
void AGOSEngine::o2_mouseOff() { void AGOSEngine::os2_mouseOff() {
// 181: force mouseOff // 181: force mouseOff
scriptMouseOff(); scriptMouseOff();
changeWindow(1); changeWindow(1);
showMessageFormat("\xC"); showMessageFormat("\xC");
} }
void AGOSEngine::o2_isShortText() { void AGOSEngine::os2_isShortText() {
// 188: string2 is // 188: string2 is
uint i = getVarOrByte(); uint i = getVarOrByte();
uint str = getNextStringID(); uint str = getNextStringID();
setScriptCondition(str < _numTextBoxes && _shortText[i] == str); setScriptCondition(str < _numTextBoxes && _shortText[i] == str);
} }
void AGOSEngine::o2_clearMarks() { void AGOSEngine::os2_clearMarks() {
// 189: clear_op189_flag // 189: clear_op189_flag
_marks = 0; _marks = 0;
} }
void AGOSEngine::o2_waitMark() { void AGOSEngine::os2_waitMark() {
// 190 // 190
uint i = getVarOrByte(); uint i = getVarOrByte();
if (!(_marks & (1 << i))) if (!(_marks & (1 << i)))

View file

@ -45,20 +45,20 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) {
op[39] = &AGOSEngine::oe1_weigh; op[39] = &AGOSEngine::oe1_weigh;
op[54] = &AGOSEngine::oww_moveDirn; op[54] = &AGOSEngine::oww_moveDirn;
op[55] = &AGOSEngine::oww_goto; op[55] = &AGOSEngine::oww_goto;
op[65] = &AGOSEngine::o_addTextBox; op[65] = &AGOSEngine::oww_addTextBox;
op[66] = &AGOSEngine::o_setShortText; op[66] = &AGOSEngine::oww_setShortText;
op[67] = &AGOSEngine::o_setLongText; op[67] = &AGOSEngine::oww_setLongText;
op[70] = &AGOSEngine::o1_printLongText; op[70] = &AGOSEngine::oww_printLongText;
op[83] = &AGOSEngine::o1_rescan; op[83] = &AGOSEngine::oe1_rescan;
op[85] = &AGOSEngine::oww_whereTo; op[85] = &AGOSEngine::oww_whereTo;
op[89] = &AGOSEngine::oe1_loadGame; op[89] = &AGOSEngine::oe1_loadGame;
op[94] = &AGOSEngine::oe1_findMaster; op[94] = &AGOSEngine::oe1_findMaster;
op[95] = &AGOSEngine::oe1_nextMaster; op[95] = &AGOSEngine::oe1_nextMaster;
op[98] = &AGOSEngine::o1_animate; op[98] = &AGOSEngine::oe1_animate;
op[99] = &AGOSEngine::o1_stopAnimate; op[99] = &AGOSEngine::oe1_stopAnimate;
op[105] = &AGOSEngine::oww_menu; op[105] = &AGOSEngine::oww_menu;
op[106] = &AGOSEngine::oww_textMenu; op[106] = &AGOSEngine::oww_textMenu;
op[127] = &AGOSEngine::o1_playTune; op[127] = &AGOSEngine::os1_playTune;
op[144] = &AGOSEngine::oe2_setDoorOpen; op[144] = &AGOSEngine::oe2_setDoorOpen;
op[145] = &AGOSEngine::oe2_setDoorClosed; op[145] = &AGOSEngine::oe2_setDoorClosed;
op[146] = &AGOSEngine::oe2_setDoorLocked; op[146] = &AGOSEngine::oe2_setDoorLocked;
@ -67,19 +67,19 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) {
op[149] = &AGOSEngine::oe2_ifDoorClosed; op[149] = &AGOSEngine::oe2_ifDoorClosed;
op[150] = &AGOSEngine::oe2_ifDoorLocked; op[150] = &AGOSEngine::oe2_ifDoorLocked;
op[162] = &AGOSEngine::oww_screenTextMsg; op[162] = &AGOSEngine::oww_screenTextMsg;
op[175] = &AGOSEngine::o_getDollar2; op[175] = &AGOSEngine::oe2_getDollar2;
op[179] = &AGOSEngine::o_isAdjNoun; op[179] = &AGOSEngine::oe2_isAdjNoun;
op[180] = &AGOSEngine::o_b2Set; op[180] = &AGOSEngine::oe2_b2Set;
op[181] = &AGOSEngine::o_b2Clear; op[181] = &AGOSEngine::oe2_b2Clear;
op[182] = &AGOSEngine::o_b2Zero; op[182] = &AGOSEngine::oe2_b2Zero;
op[183] = &AGOSEngine::o_b2NotZero; op[183] = &AGOSEngine::oe2_b2NotZero;
op[184] = &AGOSEngine::oww_boxMessage; op[184] = &AGOSEngine::oww_boxMessage;
op[185] = &AGOSEngine::oww_boxMsg; op[185] = &AGOSEngine::oww_boxMsg;
op[186] = &AGOSEngine::oww_boxLongText; op[186] = &AGOSEngine::oww_boxLongText;
op[187] = &AGOSEngine::oww_printBox; op[187] = &AGOSEngine::oww_printBox;
op[188] = &AGOSEngine::oww_boxPObj; op[188] = &AGOSEngine::oww_boxPObj;
op[189] = &AGOSEngine::o_lockZones; op[189] = &AGOSEngine::oww_lockZones;
op[190] = &AGOSEngine::o_unlockZones; op[190] = &AGOSEngine::oww_unlockZones;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@ -102,6 +102,50 @@ void AGOSEngine::oww_goto() {
setItemParent(me(), derefItem(item)); setItemParent(me(), derefItem(item));
} }
void AGOSEngine::oww_addTextBox() {
// 65: add hit area
uint id = getVarOrWord();
uint x = getVarOrWord();
uint y = getVarOrWord();
uint w = getVarOrWord();
uint h = getVarOrWord();
uint number = getVarOrByte();
if (number < _numTextBoxes)
defineBox(id, x, y, w, h, (number << 8) + 129, 208, _dummyItem2);
}
void AGOSEngine::oww_setShortText() {
// 66: set item name
uint var = getVarOrByte();
uint stringId = getNextStringID();
if (var < _numTextBoxes) {
_shortText[var] = stringId;
}
}
void AGOSEngine::oww_setLongText() {
// 67: set item description
uint var = getVarOrByte();
uint stringId = getNextStringID();
if (getFeatures() & GF_TALKIE) {
uint speechId = getNextWord();
if (var < _numTextBoxes) {
_longText[var] = stringId;
_longSound[var] = speechId;
}
} else {
if (var < _numTextBoxes) {
_longText[var] = stringId;
}
}
}
void AGOSEngine::oww_printLongText() {
// 70: show string from array
const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]);
showMessageFormat("%s\n", str);
}
void AGOSEngine::oww_whereTo() { void AGOSEngine::oww_whereTo() {
// 85: where to // 85: where to
Item *i = getNextItemPtr(); Item *i = getNextItemPtr();
@ -159,4 +203,15 @@ void AGOSEngine::oww_boxPObj() {
boxTextMsg((const char *)getStringPtrByID(subObject->objectFlagValue[0])); boxTextMsg((const char *)getStringPtrByID(subObject->objectFlagValue[0]));
} }
void AGOSEngine::oww_lockZones() {
// 189: lock zone
_vgaMemBase = _vgaMemPtr;
}
void AGOSEngine::oww_unlockZones() {
// 190: unlock zone
_vgaMemPtr = _vgaFrozenBase;
_vgaMemBase = _vgaFrozenBase;
}
} // End of namespace AGOS } // End of namespace AGOS