示例#1
0
        public void RunCommands(List <VMArchitectureCommand> commands)
        {
            for (var i = 0; i < commands.Count; i++)
            {
                var com = commands[i];
                switch (com.Type)
                {
                case VMArchitectureCommandType.WALL_LINE:
                    VMArchitectureTools.DrawWall(this, new Point(com.x, com.y), com.x2, com.y2, com.pattern, com.style, com.level, false);
                    break;

                case VMArchitectureCommandType.WALL_DELETE:
                    VMArchitectureTools.EraseWall(this, new Point(com.x, com.y), com.x2, com.y2, com.pattern, com.style, com.level);
                    break;

                case VMArchitectureCommandType.WALL_RECT:
                    VMArchitectureTools.DrawWallRect(this, new Rectangle(com.x, com.y, com.x2, com.y2), com.pattern, com.style, com.level);
                    break;

                case VMArchitectureCommandType.PATTERN_FILL:
                    VMArchitectureTools.WallPatternFill(this, new Point(com.x, com.y), com.pattern, com.level);
                    break;

                case VMArchitectureCommandType.PATTERN_DOT:
                    VMArchitectureTools.WallPatternDot(this, new Point(com.x, com.y), com.pattern, com.x2, com.y2, com.level);
                    break;

                case VMArchitectureCommandType.FLOOR_FILL:
                    VMArchitectureTools.FloorPatternFill(this, new Point(com.x, com.y), com.pattern, com.level);
                    break;

                case VMArchitectureCommandType.FLOOR_RECT:
                    VMArchitectureTools.FloorPatternRect(this, new Rectangle(com.x, com.y, com.x2, com.y2), com.style, com.pattern, com.level);
                    break;
                }
            }
        }
示例#2
0
        public int RunCommands(List <VMArchitectureCommand> commands, bool transient)
        {
            int      cost       = 0; //negative for sellback;
            int      pdCount    = 0;
            ushort   pdVal      = 0;
            VMAvatar lastAvatar = null;

            for (var i = 0; i < commands.Count; i++)
            {
                var com    = commands[i];
                var avaEnt = Context.VM.Entities.FirstOrDefault(x => x.PersistID == com.CallerUID);
                if ((avaEnt == null || avaEnt is VMGameObject) && !transient)
                {
                    return(0);                                                          //we need an avatar to run a command from net
                }
                var avatar = (transient)? null : (VMAvatar)avaEnt;
                lastAvatar = avatar;
                var styleInd = -1;
                var walls    = Content.Content.Get().WorldWalls;
                walls.WallStyleToIndex.TryGetValue(com.style, out styleInd);
                //if patterns are invalid, don't do anything.
                switch (com.Type)
                {
                case VMArchitectureCommandType.WALL_LINE:
                    if (styleInd == -1)
                    {
                        break;                     //MUST be purchasable style
                    }
                    var lstyle  = walls.GetWallStyle(com.style);
                    var nwCount = VMArchitectureTools.DrawWall(this, new Point(com.x, com.y), com.x2, com.y2, com.pattern, com.style, com.level, false);
                    if (nwCount > 0)
                    {
                        cost += nwCount * lstyle.Price;
                        if (avatar != null)
                        {
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                                                       avatar.Name,
                                                                       Context.VM.GetUserIP(avatar.PersistID),
                                                                       "placed " + nwCount + " walls."
                                                                       ));
                        }
                    }
                    break;

                case VMArchitectureCommandType.WALL_DELETE:
                    var dwCount = VMArchitectureTools.EraseWall(this, new Point(com.x, com.y), com.x2, com.y2, com.pattern, com.style, com.level);
                    if (dwCount > 0)
                    {
                        cost -= 7 * dwCount;
                        if (avatar != null)
                        {
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                                                       avatar.Name,
                                                                       Context.VM.GetUserIP(avatar.PersistID),
                                                                       "erased " + dwCount + " walls."
                                                                       ));
                        }
                    }
                    break;

                case VMArchitectureCommandType.WALL_RECT:
                    if (styleInd == -1)
                    {
                        break;                     //MUST be purchasable style
                    }
                    var rstyle  = walls.GetWallStyle(com.style);
                    var rwCount = VMArchitectureTools.DrawWallRect(this, new Rectangle(com.x, com.y, com.x2, com.y2), com.pattern, com.style, com.level);
                    if (rwCount > 0)
                    {
                        cost += rwCount * rstyle.Price;
                        if (avatar != null)
                        {
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                                                       avatar.Name,
                                                                       Context.VM.GetUserIP(avatar.PersistID),
                                                                       "placed " + rwCount + " walls (rect)."
                                                                       ));
                        }
                    }
                    break;

                case VMArchitectureCommandType.PATTERN_FILL:
                    var pattern = GetPatternRef(com.pattern);
                    if (pattern == null && com.pattern != 0)
                    {
                        break;
                    }
                    var pfCount = VMArchitectureTools.WallPatternFill(this, new Point(com.x, com.y), com.pattern, com.level);
                    if (pfCount.Total > 0)
                    {
                        cost -= pfCount.Cost - pfCount.Cost / 5;
                        cost += (pattern == null) ? 0 : pattern.Price * pfCount.Total;
                        if (avatar != null)
                        {
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                                                       avatar.Name,
                                                                       Context.VM.GetUserIP(avatar.PersistID),
                                                                       "pattern filled " + pfCount + " walls with pattern #" + com.pattern
                                                                       ));
                        }
                    }
                    break;

                case VMArchitectureCommandType.PATTERN_DOT:
                    var pdpattern = GetPatternRef(com.pattern);
                    if (pdpattern == null && com.pattern != 0)
                    {
                        break;
                    }
                    var dot = VMArchitectureTools.WallPatternDot(this, new Point(com.x, com.y), com.pattern, com.x2, com.y2, com.level);
                    pdVal = com.pattern;
                    if (dot.Total > -1)
                    {
                        cost -= dot.Cost - dot.Cost / 5;
                        cost += (pdpattern == null) ? 0 : pdpattern.Price;
                        pdCount++;
                    }

                    break;

                case VMArchitectureCommandType.FLOOR_FILL:
                    var ffpattern = GetFloorRef(com.pattern);
                    if (ffpattern == null && com.pattern != 0)
                    {
                        break;
                    }
                    var ffCount = VMArchitectureTools.FloorPatternFill(this, new Point(com.x, com.y), com.pattern, com.level);
                    if (ffCount.Total > 0)
                    {
                        cost -= (ffCount.Cost - ffCount.Cost / 5) / 2;
                        cost += (ffpattern == null) ? 0 : ffpattern.Price * ffCount.Total / 2;

                        if (avatar != null)
                        {
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                                                       avatar.Name,
                                                                       Context.VM.GetUserIP(avatar.PersistID),
                                                                       "floor filled " + ffCount.Total / 2f + " with pattern #" + com.pattern
                                                                       ));
                        }
                    }
                    break;

                case VMArchitectureCommandType.FLOOR_RECT:
                    var frpattern = GetFloorRef(com.pattern);
                    if (frpattern == null && com.pattern != 0)
                    {
                        break;
                    }
                    var frCount = VMArchitectureTools.FloorPatternRect(this, new Rectangle(com.x, com.y, com.x2, com.y2), com.style, com.pattern, com.level);
                    if (frCount.Total > 0)
                    {
                        cost -= (frCount.Cost - frCount.Cost / 5) / 2;
                        cost += (frpattern == null) ? 0 : frpattern.Price * frCount.Total / 2;

                        if (avatar != null)
                        {
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                                                       avatar.Name,
                                                                       Context.VM.GetUserIP(avatar.PersistID),
                                                                       "placed " + frCount.Total / 2f + " tiles with pattern #" + com.pattern
                                                                       ));
                        }
                    }
                    break;
                }
            }
            if (lastAvatar != null && pdCount > 0)
            {
                Context.VM.SignalChatEvent(new VMChatEvent(lastAvatar.PersistID, VMChatEventType.Arch,
                                                           lastAvatar.Name,
                                                           Context.VM.GetUserIP(lastAvatar.PersistID),
                                                           "pattern dotted " + pdCount + " walls with pattern #" + pdVal
                                                           ));
            }

            return(cost);
        }
示例#3
0
        public override void Update(UpdateState state)
        {
            base.Update(state);
            ModePositions[3].Y = 11;
            ModeTargets[3].Y   = 7.896059f;
            if (Dead)
            {
                return;
            }
            if (vm == null)
            {
                InitializeLot();
            }
            vm.Update();
            if (World != null && !Initialized)
            {
                var rcs = (World.State as WorldStateRC);
                if (rcs != null)
                {
                    Cam            = (WorldCamera3D)rcs.Camera;
                    rcs.FixedCam   = true;
                    rcs.CameraMode = true;
                }
                SetMode(UICASMode.FamilySelect);
                SetFamilies();
                Initialized = true;
                //FamilySimInterp = FamilySimInterp;
            }

            if (World.State.PreciseZoom != 1)
            {
                World.State.PreciseZoom = World.State.PreciseZoom;
            }
            switch (Mode)
            {
            case UICASMode.FamilySelect:
                if (World.State.Level != 2)
                {
                    World.State.Level            = 2;
                    World.State.DrawRoofs        = true;
                    vm.Context.Blueprint.Cutaway = new bool[vm.Context.Blueprint.Cutaway.Length];
                    vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                }
                break;

            default:
                if (World.State.Level != 1 && Cam == null)
                {
                    World.State.Level            = 1;
                    World.State.DrawRoofs        = false;
                    vm.Context.Blueprint.Cutaway = VMArchitectureTools.GenerateRoomCut(vm.Context.Architecture, World.State.Level, World.State.CutRotation,
                                                                                       new HashSet <uint>(vm.Context.RoomInfo.Where(x => x.Room.IsOutside == false).Select(x => (uint)x.Room.RoomID)));
                    vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                }
                break;
            }

            vm.Context.Clock.Minutes = 0;
            vm.Context.Clock.Hours   = 12;

            var disableAccept = false;

            switch (Mode)
            {
            case UICASMode.SimEdit:
                if (CASPanel.FirstNameTextBox.CurrentText.Length == 0)
                {
                    disableAccept = true;
                }
                break;

            case UICASMode.FamilySelect:
                if (FamiliesPanel.Selection == -1)
                {
                    disableAccept = true;
                }
                break;

            case UICASMode.FamilyEdit:
                if (WIPFamily.Count == 0)
                {
                    disableAccept = true;
                }
                break;
            }

            AcceptButton.Disabled = disableAccept;
            //AcceptButton.ForceState = disableAccept ? 0 : -1;
            //AcceptButton.Opacity = disableAccept ? 0.5f : 1;

            if (Mode == UICASMode.SimEdit)
            {
                UpdateCarousel(state);
            }

            for (int i = 0; i < 18; i++)
            {
                var relPos = HeadPosition + i - 9;
                relPos = (float)DirectionUtils.PosMod(relPos, 18);
                if (relPos > 9)
                {
                    relPos += 6;
                }
                var angle = (relPos / 24) * (Math.PI * 2);
                var pos   = new Vector3(28.5f + 4.5f * (float)Math.Cos(angle), 21.5f + 4.5f * (float)Math.Sin(angle), 0);
                HeadAvatars[i].RadianDirection = (float)angle + (float)Math.PI / 2;
                HeadAvatars[i].VisualPosition  = pos;
            }

            for (int i = 0; i < 18; i++)
            {
                var relPos = BodyPosition + i - 9;
                relPos = (float)DirectionUtils.PosMod(relPos, 18);
                if (relPos > 9)
                {
                    relPos += 6;
                }
                var angle = (relPos / 24) * (Math.PI * 2);
                var pos   = new Vector3(28.5f + 4.5f * (float)Math.Cos(angle), 21.5f + 4.5f * (float)Math.Sin(angle), 0);
                BodyAvatars[i].RadianDirection = (float)angle + (float)Math.PI / 2;
                BodyAvatars[i].VisualPosition  = pos;
            }

            foreach (var fam in RepresentFamily)
            {
                for (int i = 0; i < 16; i++)
                {
                    fam.SetMotiveData((VMMotive)i, 100);
                }
                var q = new List <FSO.SimAntics.Engine.VMQueuedAction>(fam.Thread.Queue);
                foreach (var action in q)
                {
                    fam.Thread.CancelAction(action.UID);
                }
            }
        }
示例#4
0
        private void UpdateCutaway(UpdateState state)
        {
            if (vm.Context.Blueprint != null)
            {
                World.State.DynamicCutaway = (WallsMode == 1);
                //first we need to cycle the rooms that are being cutaway. Keep this up even if we're in all-cut mode.
                var mouseTilePos = World.EstTileAtPosWithScroll(new Vector2(state.MouseState.X, state.MouseState.Y) / FSOEnvironment.DPIScaleFactor);
                var roomHover    = vm.Context.GetRoomAt(LotTilePos.FromBigTile((short)(mouseTilePos.X), (short)(mouseTilePos.Y), World.State.Level));
                var outside      = (vm.Context.RoomInfo[roomHover].Room.IsOutside);
                if (!outside && !CutRooms.Contains(roomHover))
                {
                    CutRooms.Add(roomHover); //outside hover should not persist like with other rooms.
                }
                while (CutRooms.Count > 3)
                {
                    CutRooms.Remove(CutRooms.ElementAt(0));
                }

                if (LastWallMode != WallsMode)
                {
                    if (WallsMode == 0) //walls down
                    {
                        LastCuts = new bool[vm.Context.Architecture.Width * vm.Context.Architecture.Height];
                        vm.Context.Blueprint.Cutaway = LastCuts;
                        vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                        for (int i = 0; i < LastCuts.Length; i++)
                        {
                            LastCuts[i] = true;
                        }
                    }
                    else if (WallsMode == 1)
                    {
                        MouseCutRect = new Rectangle();
                        LastCutRooms = new HashSet <uint>()
                        {
                            uint.MaxValue
                        };                                                    //must regenerate cuts
                    }
                    else //walls up or roof
                    {
                        LastCuts = new bool[vm.Context.Architecture.Width * vm.Context.Architecture.Height];
                        vm.Context.Blueprint.Cutaway = LastCuts;
                        vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                    }
                    LastWallMode = WallsMode;
                }

                if (WallsMode == 1)
                {
                    if (RMBScroll || !MouseIsOn)
                    {
                        return;
                    }
                    int recut      = 0;
                    var finalRooms = new HashSet <uint>(CutRooms);

                    var newCut = new Rectangle((int)(mouseTilePos.X - 2.5), (int)(mouseTilePos.Y - 2.5), 5, 5);
                    newCut.X -= VMArchitectureTools.CutCheckDir[(int)World.State.CutRotation][0] * 2;
                    newCut.Y -= VMArchitectureTools.CutCheckDir[(int)World.State.CutRotation][1] * 2;
                    if (newCut != MouseCutRect)
                    {
                        MouseCutRect = newCut;
                        recut        = 1;
                    }

                    if (LastFloor != World.State.Level || LastRotation != World.State.CutRotation || !finalRooms.SetEquals(LastCutRooms))
                    {
                        LastCuts     = VMArchitectureTools.GenerateRoomCut(vm.Context.Architecture, World.State.Level, World.State.CutRotation, finalRooms);
                        recut        = 2;
                        LastFloor    = World.State.Level;
                        LastRotation = World.State.CutRotation;
                    }
                    LastCutRooms = finalRooms;

                    if (recut > 0)
                    {
                        var finalCut = new bool[LastCuts.Length];
                        Array.Copy(LastCuts, finalCut, LastCuts.Length);
                        var notableChange = VMArchitectureTools.ApplyCutRectangle(vm.Context.Architecture, World.State.Level, finalCut, MouseCutRect);
                        if (recut > 1 || notableChange || LastRectCutNotable)
                        {
                            vm.Context.Blueprint.Cutaway = finalCut;
                            vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                        }
                        LastRectCutNotable = notableChange;
                    }
                }
            }
        }
示例#5
0
        public void Update(UpdateState state, bool scrolled)
        {
            ushort pattern = (state.CtrlDown) ? (ushort)0 : Pattern;

            var   tilePos = World.EstTileAtPosWithScroll(Parent.GetScaledPoint(state.MouseState.Position).ToVector2() / FSOEnvironment.DPIScaleFactor);
            Point cursor  = new Point((int)tilePos.X, (int)tilePos.Y);

            if (!Drawing && Commands.Count > 0)
            {
                vm.Context.Architecture.SignalRedraw();
                Commands.Clear();
            }
            if (state.ShiftDown)
            {
                if (Commands.Count == 0 || Commands[0].Type != VMArchitectureCommandType.PATTERN_FILL)
                {
                    Commands.Clear();
                    vm.Context.Architecture.SignalRedraw();
                    Commands.Add(new VMArchitectureCommand
                    {
                        Type    = VMArchitectureCommandType.PATTERN_FILL,
                        level   = World.State.Level,
                        pattern = pattern,
                        style   = 0,
                        x       = cursor.X,
                        y       = cursor.Y
                    });
                }
            }
            else
            {
                if (Commands.Count > 0 && Commands[0].Type == VMArchitectureCommandType.PATTERN_FILL)
                {
                    Commands.Clear();
                    vm.Context.Architecture.SignalRedraw();
                }
                int     dir    = 0;
                int     altdir = 0;
                Vector2 fract  = new Vector2(tilePos.X - cursor.X, tilePos.Y - cursor.Y);
                switch (World.State.CutRotation)
                {
                case WorldRotation.BottomRight:
                    if (fract.X - fract.Y > 0)
                    {
                        dir = 2; altdir = 3;
                    }
                    else
                    {
                        dir = 3; altdir = 2;
                    }
                    break;

                case WorldRotation.TopRight:
                    if (fract.X + fract.Y > 1)
                    {
                        dir = 3; altdir = 0;
                    }
                    else
                    {
                        dir = 0; altdir = 3;
                    }
                    break;

                case WorldRotation.TopLeft:
                    //+x is right down. +y is left down
                    if (fract.X - fract.Y > 0)
                    {
                        dir = 1; altdir = 0;
                    }
                    else
                    {
                        dir = 0; altdir = 1;
                    }
                    break;

                case WorldRotation.BottomLeft:
                    if (fract.X + fract.Y > 1)
                    {
                        dir = 2; altdir = 1;
                    }
                    else
                    {
                        dir = 1; altdir = 2;
                    }
                    break;
                }

                var finalDir = VMArchitectureTools.GetPatternDirection(vm.Context.Architecture, cursor, pattern, dir, altdir, World.State.Level);
                if (finalDir != -1)
                {
                    CursorDir = finalDir;
                    var cmd = new VMArchitectureCommand
                    {
                        Type    = VMArchitectureCommandType.PATTERN_DOT,
                        level   = World.State.Level,
                        pattern = pattern,
                        style   = 0,
                        x       = cursor.X,
                        y       = cursor.Y,
                        x2      = dir,
                        y2      = altdir
                    };
                    if (!Commands.Contains(cmd))
                    {
                        vm.Context.Architecture.SignalRedraw();
                        Commands.Add(cmd);
                    }
                }
            }

            var cmds = vm.Context.Architecture.Commands;

            cmds.Clear();
            foreach (var cmd in Commands)
            {
                cmds.Add(cmd);
            }

            if (cmds.Count > 0)
            {
                var cost = vm.Context.Architecture.LastTestCost;
                if (cost != 0)
                {
                    var disallowed = Parent.ActiveEntity != null && cost > Parent.ActiveEntity.TSOState.Budget.Value;
                    state.UIState.TooltipProperties.Show     = true;
                    state.UIState.TooltipProperties.Color    = disallowed ? Color.DarkRed : Color.Black;
                    state.UIState.TooltipProperties.Opacity  = 1;
                    state.UIState.TooltipProperties.Position = new Vector2(state.MouseState.X, state.MouseState.Y);
                    state.UIState.Tooltip = (cost < 0) ? ("-$" + (-cost)) : ("$" + cost);
                    state.UIState.TooltipProperties.UpdateDead = false;

                    if (disallowed)
                    {
                        HITVM.Get().PlaySoundEvent(UISounds.Error);
                    }
                }
                else
                {
                    state.UIState.TooltipProperties.Show    = false;
                    state.UIState.TooltipProperties.Opacity = 0;
                }
            }

            WallCursor.SetVisualPosition(new Vector3(cursor.X + 0.5f, cursor.Y + 0.5f, (World.State.Level - 1) * 2.95f), (Direction)(1 << ((3 - CursorDir) * 2)), vm.Context);
        }
示例#6
0
        public override void Update(UpdateState state)
        {
            base.Update(state);
            Cheats.Update(state);

            if (!vm.Ready)
            {
                return;
            }

            if (ActiveEntity == null || ActiveEntity.Dead || ActiveEntity.PersistID != SelectedSimID)
            {
                ActiveEntity = vm.Entities.FirstOrDefault(x => x is VMAvatar && x.PersistID == SelectedSimID); //try and hook onto a sim if we have none selected.
                if (ActiveEntity == null)
                {
                    ActiveEntity = vm.Entities.FirstOrDefault(x => x is VMAvatar);
                }

                if (!FoundMe && ActiveEntity != null)
                {
                    vm.Context.World.State.CenterTile   = new Vector2(ActiveEntity.VisualPosition.X, ActiveEntity.VisualPosition.Y);
                    vm.Context.World.State.ScrollAnchor = null;
                    FoundMe = true;
                }
                Queue.QueueOwner = ActiveEntity;
            }

            if (GotoObject == null)
            {
                GotoObject = vm.Context.CreateObjectInstance(GOTO_GUID, LotTilePos.OUT_OF_WORLD, Direction.NORTH, true).Objects[0];
            }

            if (ActiveEntity != null && BlockingDialog != null)
            {
                //are we still waiting on a blocking dialog? if not, cancel.
                if (ActiveEntity.Thread != null && (ActiveEntity.Thread.BlockingState == null || !(ActiveEntity.Thread.BlockingState is VMDialogResult)))
                {
                    UIScreen.RemoveDialog(BlockingDialog);
                    LastDialogID   = 0;
                    BlockingDialog = null;
                }
            }

            if (Visible)
            {
                if (ShowTooltip)
                {
                    state.UIState.TooltipProperties.UpdateDead = false;
                }

                bool scrolled = false;
                if (KBScroll)
                {
                    World.State.ScrollAnchor = null;
                    int     KeyboardAxisX = 0;
                    int     KeyboardAxisY = 0;
                    Vector2 scrollBy      = new Vector2();
                    if (state.KeyboardState.IsKeyDown(Keys.Up) || state.KeyboardState.IsKeyDown(Keys.W))
                    {
                        KeyboardAxisY -= 1;
                    }
                    if (state.KeyboardState.IsKeyDown(Keys.Left) || state.KeyboardState.IsKeyDown(Keys.A))
                    {
                        KeyboardAxisX -= 1;
                    }
                    if (state.KeyboardState.IsKeyDown(Keys.Down) || state.KeyboardState.IsKeyDown(Keys.S))
                    {
                        KeyboardAxisY += 1;
                    }
                    if (state.KeyboardState.IsKeyDown(Keys.Right) || state.KeyboardState.IsKeyDown(Keys.D))
                    {
                        KeyboardAxisX += 1;
                    }
                    scrollBy  = new Vector2(KeyboardAxisX, KeyboardAxisY);
                    scrollBy *= 0.05f;
                    World.Scroll(scrollBy * (60f / 60));
                }
                if (RMBScroll)
                {
                    World.State.ScrollAnchor = null;
                    Vector2 scrollBy = new Vector2();
                    if (state.TouchMode)
                    {
                        scrollBy   = new Vector2(RMBScrollX - state.MouseState.X, RMBScrollY - state.MouseState.Y);
                        RMBScrollX = state.MouseState.X;
                        RMBScrollY = state.MouseState.Y;
                        scrollBy  /= 128f;
                        scrollBy  /= FSOEnvironment.DPIScaleFactor;
                    }
                    else
                    {
                        scrollBy  = new Vector2(state.MouseState.X - RMBScrollX, state.MouseState.Y - RMBScrollY);
                        scrollBy *= 0.0005f;


                        var angle = (Math.Atan2(state.MouseState.X - RMBScrollX, (RMBScrollY - state.MouseState.Y) * 2) / Math.PI) * 4;
                        angle += 8;
                        angle %= 8;

                        CursorType type = CursorType.ArrowUp;
                        switch ((int)Math.Round(angle))
                        {
                        case 0: type = CursorType.ArrowUp; break;

                        case 1: type = CursorType.ArrowUpRight; break;

                        case 2: type = CursorType.ArrowRight; break;

                        case 3: type = CursorType.ArrowDownRight; break;

                        case 4: type = CursorType.ArrowDown; break;

                        case 5: type = CursorType.ArrowDownLeft; break;

                        case 6: type = CursorType.ArrowLeft; break;

                        case 7: type = CursorType.ArrowUpLeft; break;
                        }
                        GameFacade.Cursor.SetCursor(type);
                    }
                    World.Scroll(scrollBy * (60f / 60));
                    scrolled = true;
                }

                var nofocus = state.InputManager.GetFocus() == null;
                var keyst   = state.KeyboardState;
                if (nofocus && (keyst.IsKeyDown(Keys.Up) || keyst.IsKeyDown(Keys.Left) || keyst.IsKeyDown(Keys.Down) || keyst.IsKeyDown(Keys.Right) ||
                                (keyst.IsKeyDown(Keys.W) || keyst.IsKeyDown(Keys.A) || keyst.IsKeyDown(Keys.S) || keyst.IsKeyDown(Keys.D))))
                {
                    KBScroll = true;
                }
                else
                {
                    KBScroll = false;
                }

                if (MouseIsOn)
                {
                    if (state.MouseState.RightButton == ButtonState.Pressed)
                    {
                        if (RMBScroll == false)
                        {
                            RMBScroll = true;
                            state.InputManager.SetFocus(null);
                            RMBScrollX = state.MouseState.X;
                            RMBScrollY = state.MouseState.Y;
                        }
                    }
                    else
                    {
                        RMBScroll = false;
                        if (!scrolled && GlobalSettings.Default.EdgeScroll && !state.TouchMode)
                        {
                            scrolled = World.TestScroll(state);
                        }
                    }
                }

                if (state.MouseState.RightButton != ButtonState.Pressed)
                {
                    if (RMBScroll)
                    {
                        GameFacade.Cursor.SetCursor(CursorType.Normal);
                    }
                    RMBScroll = false;
                }

                if (LiveMode)
                {
                    LiveModeUpdate(state, scrolled);
                }
                else if (CustomControl != null)
                {
                    CustomControl.Update(state, scrolled);
                }
                else
                {
                    ObjectHolder.Update(state, scrolled);
                }

                //set cutaway around mouse

                if (vm.Context.Blueprint != null)
                {
                    World.State.DynamicCutaway = (WallsMode == 1);
                    //first we need to cycle the rooms that are being cutaway. Keep this up even if we're in all-cut mode.
                    var mouseTilePos = World.State.WorldSpace.GetTileAtPosWithScroll(new Vector2(state.MouseState.X, state.MouseState.Y) / FSOEnvironment.DPIScaleFactor);
                    var roomHover    = vm.Context.GetRoomAt(LotTilePos.FromBigTile((short)(mouseTilePos.X), (short)(mouseTilePos.Y), World.State.Level));
                    var outside      = (vm.Context.RoomInfo[roomHover].Room.IsOutside);
                    if (!outside && !CutRooms.Contains(roomHover))
                    {
                        CutRooms.Add(roomHover); //outside hover should not persist like with other rooms.
                    }
                    while (CutRooms.Count > 3)
                    {
                        CutRooms.Remove(CutRooms.ElementAt(0));
                    }

                    if (LastWallMode != WallsMode)
                    {
                        if (WallsMode == 0) //walls down
                        {
                            LastCuts = new bool[vm.Context.Architecture.Width * vm.Context.Architecture.Height];
                            vm.Context.Blueprint.Cutaway = LastCuts;
                            vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                            for (int i = 0; i < LastCuts.Length; i++)
                            {
                                LastCuts[i] = true;
                            }
                        }
                        else if (WallsMode == 1)
                        {
                            MouseCutRect = new Rectangle();
                            LastCutRooms = new HashSet <uint>()
                            {
                                uint.MaxValue
                            };                                                    //must regenerate cuts
                        }
                        else //walls up or roof
                        {
                            LastCuts = new bool[vm.Context.Architecture.Width * vm.Context.Architecture.Height];
                            vm.Context.Blueprint.Cutaway = LastCuts;
                            vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                        }
                        LastWallMode = WallsMode;
                    }

                    if (WallsMode == 1)
                    {
                        int recut      = 0;
                        var finalRooms = new HashSet <uint>(CutRooms);

                        var newCut = new Rectangle((int)(mouseTilePos.X - 2.5), (int)(mouseTilePos.Y - 2.5), 5, 5);
                        newCut.X -= VMArchitectureTools.CutCheckDir[(int)World.State.Rotation][0] * 2;
                        newCut.Y -= VMArchitectureTools.CutCheckDir[(int)World.State.Rotation][1] * 2;
                        if (newCut != MouseCutRect)
                        {
                            MouseCutRect = newCut;
                            recut        = 1;
                        }

                        if (LastFloor != World.State.Level || LastRotation != World.State.Rotation || !finalRooms.SetEquals(LastCutRooms))
                        {
                            LastCuts     = VMArchitectureTools.GenerateRoomCut(vm.Context.Architecture, World.State.Level, World.State.Rotation, finalRooms);
                            recut        = 2;
                            LastFloor    = World.State.Level;
                            LastRotation = World.State.Rotation;
                        }
                        LastCutRooms = finalRooms;

                        if (recut > 0)
                        {
                            var finalCut = new bool[LastCuts.Length];
                            Array.Copy(LastCuts, finalCut, LastCuts.Length);
                            var notableChange = VMArchitectureTools.ApplyCutRectangle(vm.Context.Architecture, World.State.Level, finalCut, MouseCutRect);
                            if (recut > 1 || notableChange || LastRectCutNotable)
                            {
                                vm.Context.Blueprint.Cutaway = finalCut;
                                vm.Context.Blueprint.Damage.Add(new FSO.LotView.Model.BlueprintDamage(FSO.LotView.Model.BlueprintDamageType.WALL_CUT_CHANGED));
                            }
                            LastRectCutNotable = notableChange;
                        }
                    }
                }
            }
        }
示例#7
0
        public void Update(UpdateState state, bool scrolled)
        {
            ushort pattern = (state.KeyboardState.IsKeyDown(Keys.LeftControl)) ? (ushort)0 : Pattern;

            var   tilePos = World.State.WorldSpace.GetTileAtPosWithScroll(new Vector2(state.MouseState.X, state.MouseState.Y));
            Point cursor  = new Point((int)tilePos.X, (int)tilePos.Y);

            if (!Drawing && Commands.Count > 0)
            {
                vm.Context.Architecture.SignalRedraw();
                Commands.Clear();
            }
            if (state.KeyboardState.IsKeyDown(Keys.LeftShift))
            {
                if (Commands.Count == 0 || Commands[0].Type != VMArchitectureCommandType.PATTERN_FILL)
                {
                    Commands.Clear();
                    vm.Context.Architecture.SignalRedraw();
                }
                Commands.Add(new VMArchitectureCommand
                {
                    Type    = VMArchitectureCommandType.PATTERN_FILL,
                    level   = World.State.Level,
                    pattern = pattern,
                    style   = 0,
                    x       = cursor.X,
                    y       = cursor.Y
                });
            }
            else
            {
                if (Commands.Count > 0 && Commands[0].Type == VMArchitectureCommandType.PATTERN_FILL)
                {
                    Commands.Clear();
                    vm.Context.Architecture.SignalRedraw();
                }
                int     dir    = 0;
                int     altdir = 0;
                Vector2 fract  = new Vector2(tilePos.X - cursor.X, tilePos.Y - cursor.Y);
                switch (World.State.Rotation)
                {
                case WorldRotation.BottomRight:
                    if (fract.X - fract.Y > 0)
                    {
                        dir = 2; altdir = 3;
                    }
                    else
                    {
                        dir = 3; altdir = 2;
                    }
                    break;

                case WorldRotation.TopRight:
                    if (fract.X + fract.Y > 1)
                    {
                        dir = 3; altdir = 0;
                    }
                    else
                    {
                        dir = 0; altdir = 3;
                    }
                    break;

                case WorldRotation.TopLeft:
                    //+x is right down. +y is left down
                    if (fract.X - fract.Y > 0)
                    {
                        dir = 1; altdir = 0;
                    }
                    else
                    {
                        dir = 0; altdir = 1;
                    }
                    break;

                case WorldRotation.BottomLeft:
                    if (fract.X + fract.Y > 1)
                    {
                        dir = 2; altdir = 1;
                    }
                    else
                    {
                        dir = 1; altdir = 2;
                    }
                    break;
                }

                var finalDir = VMArchitectureTools.GetPatternDirection(vm.Context.Architecture, cursor, pattern, dir, altdir, World.State.Level);
                if (finalDir != -1)
                {
                    CursorDir = finalDir;
                    var cmd = new VMArchitectureCommand
                    {
                        Type    = VMArchitectureCommandType.PATTERN_DOT,
                        level   = World.State.Level,
                        pattern = pattern,
                        style   = 0,
                        x       = cursor.X,
                        y       = cursor.Y,
                        x2      = dir,
                        y2      = altdir
                    };
                    if (!Commands.Contains(cmd))
                    {
                        vm.Context.Architecture.SignalRedraw();
                        Commands.Add(cmd);
                    }
                }
            }

            var cmds = vm.Context.Architecture.Commands;

            cmds.Clear();
            foreach (var cmd in Commands)
            {
                cmds.Add(cmd);
            }

            WallCursor.SetVisualPosition(new Vector3(cursor.X + 0.5f, cursor.Y + 0.5f, (World.State.Level - 1) * 2.95f), (Direction)(1 << ((3 - CursorDir) * 2)), vm.Context);
        }