NScumm.Scumm.ScummEngine.StartScene C# (CSharp) Метод

StartScene() приватный Метод

private StartScene ( byte room, Actor a = null, int objectNr ) : void
room byte
a Actor
objectNr int
Результат void
        internal void StartScene(byte room, Actor a = null, int objectNr = 0)
        {
            StopTalk();

            FadeOut(_switchRoomEffect2);
            _newEffect = _switchRoomEffect;

            if (CurrentScript != 0xFF)
            {
                if (_slots[CurrentScript].Where == WhereIsObject.Room || _slots[CurrentScript].Where == WhereIsObject.FLObject)
                {
                    //nukeArrays(CurrentScript);
                    CurrentScript = 0xFF;
                }
                else if (_slots[CurrentScript].Where == WhereIsObject.Local)
                {
                    //if (slots[CurrentScript].cutsceneOverride && _game.version >= 5)
                    //    error("Script %d stopped with active cutscene/override in exit", slots[CurrentScript].number);

                    //nukeArrays(CurrentScript);
                    CurrentScript = 0xFF;
                }
            }

            if (VariableNewRoom.HasValue)
                _variables[VariableNewRoom.Value] = room;

            RunExitScript();

            KillScriptsAndResources();

            if (_game.Version >= 4)
            {
                StopCycle(0);
            }

            for (var i = 1; i < Actors.Length; i++)
            {
                Actors[i].Hide();
            }

            if (Game.Version >= 7)
            {
                // Set the shadow palette(s) to all black. This fixes
                // bug #795940, and actually makes some sense (after all,
                // shadows tend to be rather black, don't they? ;-)
                Array.Clear(_shadowPalette, 0, _shadowPalette.Length);
            }
            else
            {
                for (var i = 0; i < 256; i++)
                {
                    Gdi.RoomPalette[i] = (byte)i;
                    if (_shadowPalette != null)
                        _shadowPalette[i] = (byte)i;
                }

                if (Game.Version < 5)
                {
                    SetDirtyColors(0, 255);
                }
            }

            Variables[VariableRoom.Value] = room;
            _fullRedraw = true;

            _currentRoom = room;

            if (room >= 0x80 && Game.Version < 7)
                _roomResource = _resourceMapper[room & 0x7F];
            else
                _roomResource = room;

            if (VariableRoomResource.HasValue)
                Variables[VariableRoomResource.Value] = _roomResource;

            if (room != 0)
                ResourceManager.LoadRoom(room);

            if (room != 0 && _game.Version == 5 && room == _roomResource)
                Variables[VariableRoomFlag.Value] = 1;

            ClearRoomObjects();

            if (_currentRoom == 0)
            {
                if (roomData != null)
                {
                    _ignoreEntryExitScript = true;
                    roomData.ExitScript.Data = new byte[0];
                    //roomData.Objects.Clear();
                }
                return;
            }

            roomData = _resManager.GetRoom(_roomResource);
            _ignoreEntryExitScript = false;
            if (roomData.HasPalette)
            {
                SetCurrentPalette(0);
            }

            Gdi.NumZBuffer = GetNumZBuffers();

            Gdi.TransparentColor = roomData.TransparentColor;
            ResetRoomSubBlocks();
            ResetRoomObjects();
            _drawingObjects.Clear();

            if (Game.Version >= 7)
            {
                // Resize main virtual screen in V7 games. This is necessary
                // because in V7, rooms may be higher than one screen, so we have
                // to accomodate for that.
                _mainVirtScreen = new VirtScreen(MainVirtScreen.TopLine, ScreenWidth, roomData.Header.Height - MainVirtScreen.TopLine, MainVirtScreen.PixelFormat, 2, true);
            }
            Gdi.SetMaskHeight(roomData.Header.Height);

            if (VariableRoomWidth.HasValue && VariableRoomHeight.HasValue)
            {
                Variables[VariableRoomWidth.Value] = roomData.Header.Width;
                Variables[VariableRoomHeight.Value] = roomData.Header.Height;
            }

            if (VariableCameraMinX.HasValue)
            {
                _variables[VariableCameraMinX.Value] = ScreenWidth / 2;
            }
            if (VariableCameraMaxX.HasValue)
            {
                _variables[VariableCameraMaxX.Value] = roomData.Header.Width - (ScreenWidth / 2);
            }

            if (Game.Version >= 7)
            {
                Variables[VariableCameraMinY.Value] = ScreenHeight / 2;
                Variables[VariableCameraMaxY.Value] = roomData.Header.Height - (ScreenHeight / 2);
                SetCameraAt(new Point((ScreenWidth / 2), (ScreenHeight / 2)));
            }
            else
            {
                _camera.Mode = CameraMode.Normal;
                _camera.CurrentPosition.X = _camera.DestinationPosition.X = (ScreenWidth / 2);
                _camera.CurrentPosition.Y = _camera.DestinationPosition.Y = (ScreenHeight / 2);
            }

            if (_roomResource == 0)
                return;

            Gdi.ClearGfxUsageBits();

            if (_game.Version >= 5 && a != null)
            {
                var where = GetWhereIsObject(objectNr);
                if (where != WhereIsObject.Room && where != WhereIsObject.FLObject)
                    throw new NotSupportedException(string.Format("StartScene: Object {0} is not in room {1}", objectNr, _currentRoom));

                Point pos;
                int dir;
                GetObjectXYPos(objectNr, out pos, out dir);
                a.PutActor(pos, _currentRoom);
                a.SetDirection(dir + 180);
                a.StopActorMoving();

                if (Game.GameId == Scumm.IO.GameId.SamNMax)
                {
                    Camera.CurrentPosition.X = Camera.DestinationPosition.X = a.Position.X;
                    SetCameraAt(a.Position);
                }
            }

            ShowActors();

            EgoPositioned = false;

            TownsResetPalCycleFields();

            RunEntryScript();

            if (Game.Version >= 1 && Game.Version <= 2)
            {
                RunScript(5, false, false, new int[0]);
            }
            else if ((Game.Version >= 5) && (Game.Version <= 6))
            {
                if (a != null && !EgoPositioned)
                {
                    var pos = GetObjectXYPos(objectNr);
                    a.PutActor(pos, _currentRoom);
                    a.Moving = 0;
                }
            }
            else if (_game.Version >= 7)
            {
                if (Camera.ActorToFollow != 0)
                {
                    a = Actors[Camera.ActorToFollow];
                    SetCameraAt(a.Position);
                }
            }

            _doEffect = true;

            // Hint the backend about the virtual keyboard during copy protection screens
            if (_game.GameId == GameId.Monkey2)
            {
                if (room == 108)
                    _inputManager.ShowVirtualKeyboard();
                else
                    _inputManager.HideVirtualKeyboard();
            }
            else if (_game.GameId == GameId.Monkey1 && _game.Variant == "ega")
            {   // this is my estimation that the room code is 90 (untested)
                if (room == 90)
                    _inputManager.ShowVirtualKeyboard();
                else
                    _inputManager.HideVirtualKeyboard();
            }
        }
ScummEngine