int AGOSEngine_PN::varval() { int a; int b; a = readfromline(); if (a < 247) { return a; } switch (a) { case 249: b = readfromline(); return (int)(b + 256 * readfromline()); break; case 250: return readfromline(); case 251: return (int)_variableArray[varval()]; case 252: b = varval(); return (int)_dataBase[_quickptr[0] + b * _quickshort[0] + varval()]; case 254: b = varval(); return (int)_dataBase[_quickptr[3] + b * _quickshort[2] + varval()]; case 247: b = varval(); return (int)getptr(_quickptr[11] + (b * _quickshort[4]) + (2 * varval())); case 248: b = varval(); return (int)getptr(_quickptr[12] + (b * _quickshort[5]) + (2 * varval())); case 253: b = varval(); return bitextract((int32)_quickptr[1] + b * _quickshort[1], varval()); case 255: b = varval(); return bitextract((int32)_quickptr[4] + b * _quickshort[3], varval()); default: error("VARVAL : Illegal code %d encountered", a); } }
void AGOSEngine_PN::writeval(uint8 *ptr, int val) { uint8 *savpt = _workptr; int lsav = _linct, a, b, x; _workptr = ptr; _linct = 255; if ((a = readfromline()) < 247) error("writeval: Write to constant (%d)", a); switch (a) { case 249: error("writeval: Write to constant (%d)", a); break; case 250: error("writeval: Write to constant (%d)", a); break; case 251: _variableArray[varval()] = val; break; case 252: b = varval(); _dataBase[_quickptr[0] + b * _quickshort[0] + varval()] = val; break; case 254: b = varval(); _dataBase[_quickptr[3] + b * _quickshort[2] + varval()] = val; break; case 247: b = varval(); x = _quickptr[11] + b * _quickshort[4] + varval() * 2; WRITE_LE_UINT16(_dataBase + x, val); break; case 248: b = varval(); x = _quickptr[12] + b * _quickshort[5] + varval() * 2; WRITE_LE_UINT16(_dataBase + x, val); break; case 253: b = varval(); setbitf((uint32)_quickptr[1] + b * _quickshort[1], varval(), val); break; case 255: b = varval(); setbitf((uint32)_quickptr[4] + b * _quickshort[3], varval(), val); break; default: error("WRITEVAL : undefined evaluation %d", a); } _linct = lsav; _workptr = savpt; }
int AGOSEngine_PN::doaction() { if (_linct == 0) return 0; _opcode = readfromline(); if (_opcode > 63) { return (actCallD(_opcode - 64)); } setScriptReturn(0); executeOpcode(_opcode); delay(0); return getScriptReturn(); }
void AGOSEngine_PN::opn_opcode63() { int a = readfromline(); switch (a) { case 65: setScriptReturn(inventoryOn(varval())); break; case 64: setScriptReturn((_videoLockOut & 0x10) != 0); break; case 63: setScriptReturn(inventoryOff()); break; default: error("opn_opcode63: unknown code %d", a); } }