void VideoPlayer::writeVideoInfo(const Common::String &file, int16 varX, int16 varY, int16 varFrames, int16 varWidth, int16 varHeight) { Properties properties; int slot = openVideo(false, file, properties); if (slot >= 0) { Video &video = _videoSlots[slot]; int16 x = -1, y = -1, width = -1, height = -1; x = video.decoder->getDefaultX(); y = video.decoder->getDefaultY(); width = video.decoder->getWidth(); height = video.decoder->getHeight(); if (VAR_OFFSET(varX) == 0xFFFFFFFF) video.decoder->getFrameCoords(1, x, y, width, height); WRITE_VAR_OFFSET(varX , x); WRITE_VAR_OFFSET(varY , y); WRITE_VAR_OFFSET(varFrames, video.decoder->getFrameCount()); WRITE_VAR_OFFSET(varWidth , width); WRITE_VAR_OFFSET(varHeight, height); closeVideo(slot); } else { WRITE_VAR_OFFSET(varX , (uint32) -1); WRITE_VAR_OFFSET(varY , (uint32) -1); WRITE_VAR_OFFSET(varFrames, (uint32) -1); WRITE_VAR_OFFSET(varWidth , (uint32) -1); WRITE_VAR_OFFSET(varHeight, (uint32) -1); } }
void Inter_Geisha::oGeisha_checkData(OpFuncParams ¶ms) { Common::String file = _vm->_game->_script->evalString(); int16 varOff = _vm->_game->_script->readVarIndex(); file.toLowercase(); if (file.hasSuffix(".0ot")) file.setChar('t', file.size() - 3); bool exists = false; SaveLoad::SaveMode mode = _vm->_saveLoad->getSaveMode(file.c_str()); if (mode == SaveLoad::kSaveModeNone) { exists = _vm->_dataIO->hasFile(file); if (!exists) { // NOTE: Geisha looks if fin.tot exists to check if it needs to open disk3.stk. // This is completely normal, so don't print a warning. if (file != "fin.tot") warning("File \"%s\" not found", file.c_str()); } } else if (mode == SaveLoad::kSaveModeSave) exists = _vm->_saveLoad->getSize(file.c_str()) >= 0; else if (mode == SaveLoad::kSaveModeExists) exists = true; WRITE_VAR_OFFSET(varOff, exists ? 50 : (uint32)-1); }
void Mult::interGetObjAnimSize(void) { Mult_AnimData *pAnimData; int16 objIndex; _vm->_inter->evalExpr(&objIndex); pAnimData = _objects[objIndex].pAnimData; if (pAnimData->isStatic == 0) { _vm->_scenery->updateAnim(pAnimData->layer, pAnimData->frame, pAnimData->animation, 0, *(_objects[objIndex].pPosX), *(_objects[objIndex].pPosY), 0); } WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawLeft); WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawTop); WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawRight); WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawBottom); }
void VideoPlayer::updateLive(int slot, bool force) { Video *video = getVideoBySlot(slot); if (!video || !video->live) return; if (video->properties.startFrame >= (int32)(video->decoder->getFrameCount() - 1)) { // Video ended if (!video->properties.loop) { if (!(video->properties.flags & kFlagNoVideo)) WRITE_VAR_OFFSET(212, (uint32)-1); _vm->_vidPlayer->closeVideo(slot); return; } else { video->decoder->seek(0, SEEK_SET, true); video->properties.startFrame = -1; } } if (video->properties.startFrame == video->properties.lastFrame) // Current video sequence ended return; if (!force && (video->decoder->getTimeToNextFrame() > 0)) return; if (!(video->properties.flags & kFlagNoVideo)) WRITE_VAR_OFFSET(212, video->properties.startFrame + 1); bool backwards = video->properties.startFrame > video->properties.lastFrame; playFrame(slot, video->properties); video->properties.startFrame += backwards ? -1 : 1; if (video->properties.fade) { _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, -2, 0); video->properties.fade = false; } }
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_Geisha::oGeisha_checkData(OpFuncParams ¶ms) { Common::String file = _vm->_game->_script->evalString(); int16 varOff = _vm->_game->_script->readVarIndex(); file.toLowercase(); if (file.hasSuffix(".0ot")) file.setChar('t', file.size() - 3); bool exists = false; SaveLoad::SaveMode mode = _vm->_saveLoad->getSaveMode(file.c_str()); if (mode == SaveLoad::kSaveModeNone) { exists = _vm->_dataIO->hasFile(file); if (!exists) warning("File \"%s\" not found", file.c_str()); } else if (mode == SaveLoad::kSaveModeSave) exists = _vm->_saveLoad->getSize(file.c_str()) >= 0; else if (mode == SaveLoad::kSaveModeExists) exists = true; WRITE_VAR_OFFSET(varOff, exists ? 50 : (uint32)-1); }
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; } } }