bool Inter_Fascination::oFascin_assign(OpFuncParams ¶ms) { byte destType = _vm->_game->_script->peekByte(); int16 dest = _vm->_game->_script->readVarIndex(); byte loopCount; if (_vm->_game->_script->peekByte() == 99) { _vm->_game->_script->skip(1); loopCount = _vm->_game->_script->readByte(); } else loopCount = 1; for (int i = 0; i < loopCount; i++) { int16 result; int16 srcType = _vm->_game->_script->evalExpr(&result); switch (destType) { case TYPE_VAR_INT8: if (srcType != TYPE_IMM_INT16) { char* str = _vm->_game->_script->getResultStr(); WRITE_VARO_STR(dest, str); } else WRITE_VARO_UINT8(dest + i, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32_AS_INT16: case TYPE_ARRAY_INT16: WRITE_VARO_UINT16(dest + i * 2, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32: case TYPE_ARRAY_INT32: WRITE_VAR_OFFSET(dest + i * 4, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_STR: case TYPE_ARRAY_STR: if (srcType == TYPE_IMM_INT16) WRITE_VARO_UINT8(dest, result); else WRITE_VARO_STR(dest, _vm->_game->_script->getResultStr()); break; } } return false; }
void Inter_v6::o6_assign(OpFuncParams ¶ms) { uint16 size, destType; uint16 dest = _vm->_game->_script->readVarIndex(&size, &destType); if (size != 0) { int16 src; _vm->_game->_script->push(); src = _vm->_game->_script->readVarIndex(&size, 0); memcpy(_vm->_inter->_variables->getAddressOff8(dest), _vm->_inter->_variables->getAddressOff8((uint16) src), size * 4); _vm->_game->_script->pop(); _vm->_game->_script->evalExpr(&src); return; } byte loopCount; if (_vm->_game->_script->peekByte() == 98) { _vm->_game->_script->skip(1); loopCount = _vm->_game->_script->readByte(); for (int i = 0; i < loopCount; i++) { uint8 c = _vm->_game->_script->readByte(); uint16 n = _vm->_game->_script->readUint16(); memset(_vm->_inter->_variables->getAddressOff8(dest), c, n); dest += n; } return; } else if (_vm->_game->_script->peekByte() == 99) { _vm->_game->_script->skip(1); loopCount = _vm->_game->_script->readByte(); } else loopCount = 1; for (int i = 0; i < loopCount; i++) { int16 result; int16 srcType = _vm->_game->_script->evalExpr(&result); switch (destType) { case TYPE_VAR_INT8: case TYPE_ARRAY_INT8: WRITE_VARO_UINT8(dest + i, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT16: case TYPE_ARRAY_INT16: WRITE_VARO_UINT16(dest + i * 2, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32: case TYPE_ARRAY_INT32: WRITE_VAR_OFFSET(dest + i * 4, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32_AS_INT16: WRITE_VARO_UINT16(dest + i * 4, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_STR: case TYPE_ARRAY_STR: if (srcType == TYPE_IMM_INT16) WRITE_VARO_UINT8(dest, result); else WRITE_VARO_STR(dest, _vm->_game->_script->getResultStr()); break; } } }