// Called when the game starts void UInventoryComponent::BeginPlay() { Super::BeginPlay(); equipment = NewObject<UCharacterEquipment>(this, equipment->GetClass()); for (int i = 0; i < beginPlayEquipment.Num(); i++) { if (beginPlayEquipment[i].item) { UItemBase* x = NewObject<UItemBase>(this, beginPlayEquipment[i].item); if (x) { x->ammount = beginPlayEquipment[i].ammount; x->initialize(GetOwner()->GetWorld()); addItem(x); } } } equipment->attachedInventory = this; if (requiresUI) loadUI(); showInventory(); hideInventory(); // ... }
void KyraEngine_MR::eelScript() { if (_chatText) return; _screen->hideMouse(); if (_inventoryState) hideInventory(); removeHandItem(); objectChat((const char *)getTableEntry(_cCodeFile, 35), 0, 204, 35); objectChat((const char *)getTableEntry(_cCodeFile, 40), 0, 204, 40); setGameFlag(0xD1); snd_playSoundEffect(0x2A, 0xC8); setGameFlag(0x171); switch (_characterShapeFile-1) { case 0: runAnimationScript("EELS01.EMC", 0, 0, 1, 1); break; case 1: runAnimationScript("EELS02.EMC", 0, 0, 1, 1); break; case 2: runAnimationScript("EELS03.EMC", 0, 0, 1, 1); break; case 3: runAnimationScript("EELS04.EMC", 0, 0, 1, 1); break; default: resetGameFlag(0x171); runAnimationScript("EELS00.EMC", 0, 0, 1, 1); } changeChapter(2, 29, 0, 4); _screen->showMouse(); }
Common::Error KyraEngine_MR::loadGameState(int slot) { const char *fileName = getSavegameFilename(slot); SaveHeader header; Common::InSaveFile *saveFile = openSaveForReading(fileName, header); if (!saveFile) { showMessageFromCCode(17, 0xB3, 0); snd_playSoundEffect(0x0D, 0xC8); return Common::kUnknownError; } if (header.originalSave) warning("Trying to load savegame from original interpreter, while this is possible, it is not officially supported"); if (_inventoryState) { updateCharacterAnim(0); restorePage3(); drawAnimObjects(); _inventoryState = true; refreshAnimObjects(0); hideInventory(); } _deathHandler = -1; if (!_unkSceneScreenFlag1) _lastMusicCommand = -1; int curShapes = _characterShapeFile; Common::SeekableSubReadStreamEndian in(saveFile, saveFile->pos(), saveFile->size(), !header.originalSave, DisposeAfterUse::YES); _screen->hideMouse(); if (!header.originalSave) { _timer->loadDataFromFile(in, header.version); uint32 flagsSize = in.readUint32BE(); assert(flagsSize <= sizeof(_flagsTable)); in.read(_flagsTable, flagsSize); } _lastMusicCommand = in.readSint16(); _currentChapter = in.readByte(); _characterShapeFile = in.readByte(); if (header.version >= 12 || header.originalSave) _album.curPage = in.readByte(); if (header.originalSave) in.readByte(); _score = in.readSint16(); _scoreMax = in.readSint16(); _malcolmsMood = in.readByte(); if (header.originalSave) in.seek(8, SEEK_CUR); for (int i = 0; i < 30; ++i) in.read(_conversationState[i], 30); if (!header.originalSave) { in.read(_newSceneDlgState, 40); } else { for (int i = 0; i < 40; ++i) _newSceneDlgState[i] = in.readUint16(); } for (int i = 0; i < 100; ++i) _hiddenItems[i] = in.readSint16(); if (header.originalSave) in.read(_flagsTable, 69); in.read(_scoreFlagTable, 26); _mainCharacter.sceneId = in.readUint16(); _mainCharacter.dlgIndex = in.readSint16(); _mainCharacter.height = in.readByte(); _mainCharacter.facing = in.readByte(); _mainCharacter.animFrame = in.readUint16(); if (!header.originalSave) { _mainCharacter.walkspeed = in.readByte(); } else { in.seek(2, SEEK_CUR); _mainCharacter.walkspeed = in.readUint32(); } for (int i = 0; i < 10; ++i) _mainCharacter.inventory[i] = in.readUint16(); _mainCharacter.x1 = in.readSint16(); _mainCharacter.y1 = in.readSint16(); _mainCharacter.x2 = in.readSint16(); _mainCharacter.y2 = in.readSint16(); _mainCharacter.x3 = in.readSint16(); _mainCharacter.y3 = in.readSint16(); for (int i = 0; i < 50; ++i) { _itemList[i].id = in.readSint16(); _itemList[i].sceneId = in.readUint16(); _itemList[i].x = in.readSint16(); _itemList[i].y = in.readSint16(); if (header.version <= 9 || header.originalSave) in.readUint16(); } for (int i = 0; i < 88; ++i) { in.read(_talkObjectList[i].filename, 13); _talkObjectList[i].sceneAnim = in.readByte(); _talkObjectList[i].sceneScript = in.readByte(); _talkObjectList[i].x = in.readSint16(); _talkObjectList[i].y = in.readSint16(); _talkObjectList[i].color = in.readByte(); if (header.version >= 13 || header.originalSave) _talkObjectList[i].sceneId = in.readByte(); } for (int i = 0; i < 98; ++i) { if (!header.originalSave) { in.read(_sceneList[i].filename1, 10); } else { in.read(_sceneList[i].filename1, 9); _sceneList[i].filename1[9] = 0; } if (!header.originalSave) { in.read(_sceneList[i].filename2, 10); } else { in.read(_sceneList[i].filename2, 9); _sceneList[i].filename2[9] = 0; } _sceneList[i].exit1 = in.readUint16(); _sceneList[i].exit2 = in.readUint16(); _sceneList[i].exit3 = in.readUint16(); _sceneList[i].exit4 = in.readUint16(); _sceneList[i].flags = in.readByte(); _sceneList[i].sound = in.readByte(); } _itemInHand = in.readSint16(); if (header.originalSave) { uint32 currentTime = _system->getMillis(); for (int i = 0; i < 6; ++i) _timer->setDelay(i, in.readSint32LE()); for (int i = 0; i < 6; ++i) { if (in.readUint16LE()) _timer->enable(i); else _timer->disable(i); } for (int i = 0; i < 6; ++i) _timer->setNextRun(i, currentTime + (in.readUint32LE() * _tickLength)); _timer->resetNextRun(); } _sceneExit1 = in.readUint16(); _sceneExit2 = in.readUint16(); _sceneExit3 = in.readUint16(); _sceneExit4 = in.readUint16(); if (saveFile->err() || saveFile->eos()) { warning("Load failed ('%s', '%s').", fileName, header.description.c_str()); return Common::kUnknownError; } else { debugC(1, kDebugLevelMain, "Loaded savegame '%s.'", header.description.c_str()); } _loadingState = true; updateCharacterAnim(0); _loadingState = false; if (curShapes != _characterShapeFile) loadCharacterShapes(_characterShapeFile); _mainCharX = _mainCharacter.x2 = _mainCharacter.x1; _mainCharY = _mainCharacter.y2 = _mainCharacter.y1; _mainCharacter.facing = 4; _badConscienceShown = false; _badConsciencePosition = false; _goodConscienceShown = false; _goodConsciencePosition = false; enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); setHandItem(_itemInHand); if (_lastMusicCommand >= 0 && !_unkSceneScreenFlag1) snd_playWanderScoreViaMap(_lastMusicCommand, 1); else if (_lastMusicCommand == -1) snd_playWanderScoreViaMap(28, 1); while (!_screen->isMouseVisible()) _screen->showMouse(); setCommandLineRestoreTimer(7); _shownMessage = " "; _restoreCommandLine = false; // We didn't explicitly set the walk speed, but it's saved as part of // the _timers array, so we need to re-sync it with _configWalkspeed. setWalkspeed(_configWalkspeed); return Common::kNoError; }
void KyraEngine_MR::updateMouse() { int shape = 0, offsetX = 0, offsetY = 0; Common::Point mouse = getMousePos(); bool hasItemCollision = checkItemCollision(mouse.x, mouse.y) != -1; if (mouse.y > 187) { bool setItemCursor = false; if (_mouseState == -6) { if (mouse.x < 311) setItemCursor = true; } else if (_mouseState == -5) { if (mouse.x < _sceneMinX || mouse.x > _sceneMaxX) setItemCursor = true; } else if (_mouseState == -4) { if (mouse.x > 8) setItemCursor = true; } if (setItemCursor) { setItemMouseCursor(); return; } } if (_inventoryState) { if (mouse.y >= 144) return; hideInventory(); } if (hasItemCollision && _mouseState < -1 && _itemInHand < 0) { _mouseState = kItemNone; _itemInHand = kItemNone; _screen->setMouseCursor(0, 0, _gameShapes[0]); } int type = 0; if (mouse.y <= 199) { if (mouse.x <= 8) { if (_sceneExit4 != 0xFFFF) { type = -4; shape = 4; offsetX = 0; offsetY = 0; } } else if (mouse.x >= 311) { if (_sceneExit2 != 0xFFFF) { type = -6; shape = 2; offsetX = 13; offsetY = 8; } } else if (mouse.y >= 171) { if (_sceneExit3 != 0xFFFF) { if (mouse.x >= _sceneMinX && mouse.x <= _sceneMaxX) { type = -5; shape = 3; offsetX = 8; offsetY = 13; } } } else if (mouse.y <= 8) { if (_sceneExit1 != 0xFFFF) { type = -7; shape = 1; offsetX = 8; offsetY = 0; } } } for (int i = 0; i < _specialExitCount; ++i) { if (checkSpecialSceneExit(i, mouse.x, mouse.y)) { switch (_specialExitTable[20+i]) { case 0: type = -7; shape = 1; offsetX = 8; offsetY = 0; break; case 2: type = -6; shape = 2; offsetX = 13; offsetY = 8; break; case 4: type = -5; shape = 3; offsetX = 8; offsetY = 13; break; case 6: type = -4; shape = 4; offsetX = 0; offsetY = 8; break; default: break; } } } if (type != 0 && type != _mouseState && !hasItemCollision) { _mouseState = type; _screen->setMouseCursor(offsetX, offsetY, _gameShapes[shape]); } else if (type == 0 && _mouseState != _itemInHand && mouse.x > 8 && mouse.x < 311 && mouse.y < 171 && mouse.y > 8) { setItemMouseCursor(); } else if (mouse.y > 187 && _mouseState > -4 && type == 0 && !_inventoryState) { showInventory(); } }
void UInventoryComponent::checkRangeOnOtherInventory() { if (!isInRangeOfOtherInventory(otherInventoryForTransfering)) hideInventory(); }