IEnumerable<Order> InnerOrder(World world, CPos xy, MouseInput mi) { if (world.Paused) yield break; if (mi.Button == MouseButton.Left) { var topLeft = xy - FootprintUtils.AdjustForBuildingSize(BuildingInfo); if (!world.CanPlaceBuilding(Building, BuildingInfo, topLeft, null) || !BuildingInfo.IsCloseEnoughToBase(world, Producer.Owner, Building, topLeft)) { Sound.PlayNotification(world.Map.Rules, Producer.Owner, "Speech", "BuildingCannotPlaceAudio", Producer.Owner.Country.Race); yield break; } var isLineBuild = world.Map.Rules.Actors[Building].Traits.Contains<LineBuildInfo>(); yield return new Order(isLineBuild ? "LineBuild" : "PlaceBuilding", Producer.Owner.PlayerActor, false) { TargetLocation = topLeft, TargetActor = Producer, TargetString = Building, SuppressVisualFeedback = true }; } }
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi) { if (mi.Button == MouseButton.Right) world.CancelInputMode(); return OrderInner(world, xy, mi); }
private void WriteInputStats(ref FormattedText target, MouseInput input) { // Initialize the formatted text block we'll write to this.PrepareFormattedText(ref target); // Determine all pressed mouse buttons string activeButtons = ""; foreach (MouseButton button in Enum.GetValues(typeof(MouseButton))) { if (input.ButtonPressed(button)) { if (activeButtons.Length != 0) activeButtons += ", "; activeButtons += button.ToString(); } } // Compose the formatted text to display target.SourceText = "/f[1]Mouse Stats/f[0]/n/n" + string.Format("Description: /cFF8800FF{0}/cFFFFFFFF/n", input.Description) + string.Format("IsAvailable: /cFF8800FF{0}/cFFFFFFFF/n", input.IsAvailable) + string.Format("X: /c44AAFFFF{0,4}/cFFFFFFFF | XSpeed: /c44AAFFFF{1,4}/cFFFFFFFF/n", input.X, input.XSpeed) + string.Format("Y: /c44AAFFFF{0,4}/cFFFFFFFF | YSpeed: /c44AAFFFF{1,4}/cFFFFFFFF/n", input.Y, input.YSpeed) + string.Format("Wheel: /c44AAFFFF{0,4}/cFFFFFFFF | WheelSpeed: /c44AAFFFF{1,4}/cFFFFFFFF/n", input.WheelPrecise, input.WheelSpeedPrecise) + string.Format("Buttons: /c44AAFFFF{0}/cFFFFFFFF/n", activeButtons); }
public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi) { var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && a.HasTrait<ITargetable>()) .WithHighestSelectionPriority(); Target target; if (underCursor != null) target = Target.FromActor(underCursor); else { var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi) .Where(a => a.Info.Traits.Contains<ITargetableInfo>() && !a.Footprint.All(world.ShroudObscures)) .WithHighestSelectionPriority(); target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(world, xy); } var orders = world.Selection.Actors .Select(a => OrderForUnit(a, target, mi)) .Where(o => o != null) .ToList(); var actorsInvolved = orders.Select(o => o.Actor).Distinct(); if (actorsInvolved.Any()) yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, false) { TargetString = actorsInvolved.Select(a => a.ActorID).JoinWith(",") }; foreach (var o in orders) yield return CheckSameOrder(o.Order, o.Trait.IssueOrder(o.Actor, o.Order, o.Target, mi.Modifiers.HasModifier(Modifiers.Shift))); }
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) { if (underCursor != null && underCursor.HasTrait<RenderInfantry>()) return new Order("Disguise", self, underCursor); return null; }
public IEnumerable<Order> Order( World world, int2 xy, MouseInput mi ) { var underCursor = world.FindUnitsAtMouse(mi.Location) .Where(a => a.HasTrait<ITargetable>()) .OrderByDescending( a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue) .FirstOrDefault(); var orders = world.Selection.Actors .Select(a => OrderForUnit(a, xy, mi, underCursor)) .Where(o => o != null) .ToArray(); var actorsInvolved = orders.Select(o => o.self).Distinct(); if (actorsInvolved.Any()) yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, false) { TargetString = string.Join(",", actorsInvolved.Select(a => a.ActorID.ToString()).ToArray()) }; foreach (var o in orders) yield return CheckSameOrder(o.iot, o.trait.IssueOrder(o.self, o.iot, o.target, mi.Modifiers.HasModifier(Modifiers.Shift))); }
public override bool OnMouseUp(Widget w, MouseInput mi) { if (w.Id == "MAINMENU_BUTTON_CREATE") { Game.chrome.rootWidget.ShowMenu("CREATESERVER_BG"); return true; } if (w.Id == "CREATESERVER_BUTTON_CANCEL") { Game.chrome.rootWidget.ShowMenu("MAINMENU_BG"); return true; } if (w.Id == "CREATESERVER_BUTTON_START") { Game.chrome.rootWidget.ShowMenu(null); Log.Write("Creating server"); Server.Server.ServerMain(AdvertiseServerOnline, Game.Settings.MasterServer, Game.Settings.GameName, Game.Settings.ListenPort, Game.Settings.ExternalPort, Game.Settings.InitialMods); Log.Write("Joining server"); Game.JoinServer(IPAddress.Loopback.ToString(), Game.Settings.ListenPort); return true; } return false; }
static IEnumerable<Actor> FriendlyGuardableUnits(World world, MouseInput mi) { return world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && !a.IsDead && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && a.Info.HasTraitInfo<GuardableInfo>()); }
public GameClass(bool startFullScreen, Size size, bool enableNetwork) { this.startFullscreen = startFullScreen; this.Size = size; this.networkEnabled = enableNetwork; this.Text = "SpaceWar3D-Step12"; statusMessageTimer = Constants.StatusMessageDisplayTime; drawingFont = new GraphicsFont( "Verdana", System.Drawing.FontStyle.Regular); input = new InputClass(this); mouseInput = new MouseInput(this); this.MouseMove +=new MouseEventHandler(GameClass_MouseMove); this.Cursor = Cursors.NoMove2D; camera = new Camera(); soundHandler = new SoundHandler(this); if (networkEnabled) { peer = new PlayClass(this); if (peer.IsHost) { hullColor = HullColors.Red; } } }
public override bool HandleInput(MouseInput mi) { if (Game.chrome.selectedWidget == this) Depressed = (GetEventBounds().Contains(mi.Location.X,mi.Location.Y)) ? true : false; // Relinquish focus if (Game.chrome.selectedWidget == this && mi.Event == MouseInputEvent.Up) { Game.chrome.selectedWidget = null; Depressed = false; } // Are we able to handle this event? if (!Visible || !GetEventBounds().Contains(mi.Location.X,mi.Location.Y)) return base.HandleInput(mi); if (base.HandleInput(mi)) return true; // Give button focus only while the mouse is down // This is a bit of a hack: it will become cleaner soonish // It will also steal events from any potential children // We also want to play a click sound if (mi.Event == MouseInputEvent.Down) { Game.chrome.selectedWidget = this; Depressed = true; return true; } return false; }
public override bool OnMouseDown(Widget w, MouseInput mi) { if (w.Id == "SETTINGS_CHECKBOX_UNITDEBUG") { Game.Settings.UnitDebug = !Game.Settings.UnitDebug; return true; } if (w.Id == "SETTINGS_CHECKBOX_PATHDEBUG") { Game.Settings.PathDebug = !Game.Settings.PathDebug; return true; } if (w.Id == "SETTINGS_CHECKBOX_INDEXDEBUG") { Game.Settings.IndexDebug = !Game.Settings.IndexDebug; return true; } if (w.Id == "SETTINGS_CHECKBOX_PERFGRAPH") { Game.Settings.PerfGraph = !Game.Settings.PerfGraph; return true; } if (w.Id == "SETTINGS_CHECKBOX_PERFTEXT") { Game.Settings.PerfText = !Game.Settings.PerfText; return true; } return false; }
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) { if (mi.Button == MouseButton.Right && self == underCursor) return new Order("DeployTransform", self); return null; }
public string GetCursor( World world, int2 xy, MouseInput mi ) { bool useSelect = false; var custom = world.WorldActor.TraitOrDefault<ICustomUnitOrderGenerator>(); if (custom != null) { return custom.GetCursor(world, xy, mi); } var underCursor = world.FindUnitsAtMouse(mi.Location) .Where(a => a.HasTrait<ITargetable>()) .OrderByDescending(a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue) .FirstOrDefault(); if (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()) if (underCursor != null) useSelect = true; var orders = world.Selection.Actors .Select(a => OrderForUnit(a, xy, mi, underCursor)) .Where(o => o != null) .ToArray(); if( orders.Length == 0 ) return (useSelect) ? "select" : "default"; return orders[0].cursor ?? ((useSelect) ? "select" : "default"); }
public string GetCursor(World world, CPos xy, MouseInput mi) { var useSelect = false; var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && a.HasTrait<ITargetable>()) .WithHighestSelectionPriority(); if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) { var selectable = underCursor.TraitOrDefault<Selectable>(); if (selectable != null && selectable.Info.Selectable) useSelect = true; } Target target; if (underCursor != null) target = Target.FromActor(underCursor); else { var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi) .Where(a => a.Info.Traits.Contains<ITargetableInfo>() && !a.Footprint.All(world.ShroudObscures)) .WithHighestSelectionPriority(); target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(world, xy); } var ordersWithCursor = world.Selection.Actors .Select(a => OrderForUnit(a, target, mi)) .Where(o => o != null && o.Cursor != null); var cursorOrder = ordersWithCursor.MaxByOrDefault(o => o.Order.OrderPriority); return cursorOrder != null ? cursorOrder.Cursor : (useSelect ? "select" : "default"); }
public override bool HandleMouseInput(MouseInput mi) { if (mi.Button != MouseButton.Left) return false; if (IsDisabled()) return false; if (mi.Event == MouseInputEvent.Down && !TakeFocus(mi)) return false; if (!Focused) return false; switch( mi.Event ) { case MouseInputEvent.Up: isMoving = false; LoseFocus(mi); break; case MouseInputEvent.Down: isMoving = true; /* todo: handle snapping to ticks properly again */ /* todo: handle nudge via clicking outside the thumb */ UpdateValue(ValueFromPx(mi.Location.X - RenderBounds.Left)); break; case MouseInputEvent.Move: if (isMoving) UpdateValue(ValueFromPx(mi.Location.X - RenderBounds.Left)); break; } return ThumbRect.Contains(mi.Location); }
public override bool HandleMouseInput(MouseInput mi) { if (ClickThrough) return false; if (!Draggable || moving && (!TakeFocus(mi) || mi.Button != MouseButton.Left)) return true; if (prevMouseLocation == null) prevMouseLocation = mi.Location; var vec = mi.Location - (int2)prevMouseLocation; prevMouseLocation = mi.Location; switch (mi.Event) { case MouseInputEvent.Up: moving = false; LoseFocus(mi); break; case MouseInputEvent.Down: moving = true; Bounds = new Rectangle(Bounds.X + vec.X, Bounds.Y + vec.Y, Bounds.Width, Bounds.Height); break; case MouseInputEvent.Move: if (moving) Bounds = new Rectangle(Bounds.X + vec.X, Bounds.Y + vec.Y, Bounds.Width, Bounds.Height); break; } return true; }
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi) { if (mi.Button == MouseButton.Right) Game.controller.CancelInputMode(); return InnerOrder(world, xy, mi); }
// Used for classic mouse orders, determines whether or not action at xy is move or select public virtual bool InputOverridesSelection(World world, int2 xy, MouseInput mi) { var actor = world.ScreenMap.ActorsAt(xy).WithHighestSelectionPriority(xy); if (actor == null) return true; var target = Target.FromActor(actor); var cell = world.Map.CellContaining(target.CenterPosition); var actorsAt = world.ActorMap.GetActorsAt(cell).ToList(); var underCursor = world.Selection.Actors.WithHighestSelectionPriority(xy); var o = OrderForUnit(underCursor, target, actorsAt, cell, mi); if (o != null) { var modifiers = TargetModifiers.None; if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) modifiers |= TargetModifiers.ForceAttack; if (mi.Modifiers.HasModifier(Modifiers.Shift)) modifiers |= TargetModifiers.ForceQueue; if (mi.Modifiers.HasModifier(Modifiers.Alt)) modifiers |= TargetModifiers.ForceMove; if (o.Order.TargetOverridesSelection(modifiers)) return true; } return false; }
public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi) { var underCursor = world.FindUnitsAtMouse(mi.Location) .Where(a => a.HasTrait<ITargetable>()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); Target target; if (underCursor != null) target = Target.FromActor(underCursor); else { var frozen = world.FindFrozenActorsAtMouse(mi.Location) .Where(a => a.Info.Traits.Contains<ITargetableInfo>()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(xy); } var orders = world.Selection.Actors .Select(a => OrderForUnit(a, target, mi)) .Where(o => o != null) .ToArray(); var actorsInvolved = orders.Select(o => o.self).Distinct(); if (actorsInvolved.Any()) yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, false) { TargetString = actorsInvolved.Select(a => a.ActorID).JoinWith(",") }; foreach (var o in orders) yield return CheckSameOrder(o.iot, o.trait.IssueOrder(o.self, o.iot, o.target, mi.Modifiers.HasModifier(Modifiers.Shift))); }
public string GetCursor(World world, CPos xy, MouseInput mi) { var useSelect = false; var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && a.HasTrait<ITargetable>()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) { var selectable = underCursor.TraitOrDefault<Selectable>(); if (selectable != null && selectable.Info.Selectable) useSelect = true; } Target target; if (underCursor != null) target = Target.FromActor(underCursor); else { var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi) .Where(a => a.Info.Traits.Contains<ITargetableInfo>()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(xy); } var orders = world.Selection.Actors .Select(a => OrderForUnit(a, target, mi)) .Where(o => o != null) .ToArray(); var cursorName = orders.Select(o => o.Cursor).FirstOrDefault(); return cursorName ?? (useSelect ? "select" : "default"); }
public override bool HandleMouseInput(MouseInput mi) { if (CurrentBrush.HandleMouseInput(mi)) return true; return base.HandleMouseInput(mi); }
static IEnumerable<Order> OrderInner(World world, MouseInput mi) { if (mi.Button != MouseButton.Left) yield break; var underCursor = world.ScreenMap.ActorsAt(mi) .FirstOrDefault(a => a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && !world.FogObscures(a)); if (underCursor == null) yield break; if (underCursor.GetDamageState() == DamageState.Undamaged) yield break; // Repair a building. if (underCursor.Info.HasTraitInfo<RepairableBuildingInfo>()) yield return new Order("RepairBuilding", world.LocalPlayer.PlayerActor, false) { TargetActor = underCursor }; // Don't command allied units if (underCursor.Owner != world.LocalPlayer) yield break; // Test for generic Repairable (used on units). var repairable = underCursor.TraitOrDefault<Repairable>(); if (repairable == null) yield break; // Find a building to repair at. var repairBuilding = repairable.FindRepairBuilding(underCursor); if (repairBuilding == null) yield break; yield return new Order("Repair", underCursor, false) { TargetActor = repairBuilding }; }
public IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi) { world.CancelInputMode(); if (mi.Button == MouseButton.Left) yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, false) { TargetLocation = cell, SuppressVisualFeedback = true }; }
public bool HandleMouseInput(MouseInput mi) { // Exclusively uses left and right mouse buttons, but nothing else if (mi.Button != MouseButton.Left && mi.Button != MouseButton.Right) return false; if (mi.Button == MouseButton.Right) { if (mi.Event == MouseInputEvent.Up) { editorWidget.ClearBrush(); return true; } return false; } var cell = worldRenderer.Viewport.ViewToWorld(mi.Location); if (mi.Button == MouseButton.Left && AllowResourceAt(cell)) { var type = (byte)ResourceType.ResourceType; var index = (byte)ResourceType.MaxDensity; world.Map.MapResources.Value[cell] = new ResourceTile(type, index); } return true; }
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) { if (mi.Button == MouseButton.Right && xy == self.Location && chargeTick <= 0) return new Order("Deploy", self); return null; }
public string GetCursor(World world, int2 xy, MouseInput mi) { if (!world.LocalPlayer.Shroud.IsExplored(xy)) return "move-blocked"; var movement = self.TraitOrDefault<IMove>(); return (movement.CanEnterCell(xy)) ? "chrono-target" : "move-blocked"; }
public bool HandleMouseInput(MouseInput mi) { // Exclusively uses left and right mouse buttons, but nothing else if (mi.Button != MouseButton.Left && mi.Button != MouseButton.Right) return false; if (mi.Button == MouseButton.Right) { editorWidget.ClearBrush(); return true; } if (mi.Button == MouseButton.Left) { if (mi.Event == MouseInputEvent.Down) painting = true; else if (mi.Event == MouseInputEvent.Up) painting = false; } if (!painting) return true; var map = world.Map; var mapTiles = map.MapTiles.Value; var mapHeight = map.MapHeight.Value; var cell = worldRenderer.Viewport.ViewToWorld(mi.Location); if (mi.Event != MouseInputEvent.Down && mi.Event != MouseInputEvent.Move) return true; var rules = map.Rules; var tileset = rules.TileSets[map.Tileset]; var template = tileset.Templates[Template]; var baseHeight = mapHeight.Contains(cell) ? mapHeight[cell] : (byte)0; if (mi.Event == MouseInputEvent.Move && PlacementOverlapsSameTemplate(template, cell)) return true; var i = 0; for (var y = 0; y < template.Size.Y; y++) { for (var x = 0; x < template.Size.X; x++, i++) { if (template.Contains(i) && template[i] != null) { var index = template.PickAny ? (byte)Game.CosmeticRandom.Next(0, template.TilesCount) : (byte)i; var c = cell + new CVec(x, y); if (!mapTiles.Contains(c)) continue; mapTiles[c] = new TerrainTile(Template, index); mapHeight[c] = (byte)(baseHeight + template[index].Height).Clamp(0, map.MaximumTerrainHeight); } } } return true; }
public bool HandleMouseInput(MouseInput mi) { // Exclusively uses left and right mouse buttons, but nothing else // Mouse move events are important for tooltips, so we always allow these through if (mi.Button != MouseButton.Left && mi.Button != MouseButton.Right && mi.Event != MouseInputEvent.Move) return false; var cell = worldRenderer.Viewport.ViewToWorld(mi.Location); if (mi.Event == MouseInputEvent.Up) return true; var underCursor = editorLayer.PreviewsAt(worldRenderer.Viewport.ViewToWorldPx(mi.Location)) .FirstOrDefault(); var mapResources = world.Map.MapResources.Value; ResourceType type; if (underCursor != null) editorWidget.SetTooltip(underCursor.Tooltip); else if (mapResources.Contains(cell) && resources.TryGetValue(mapResources[cell].Type, out type)) editorWidget.SetTooltip(type.Info.Name); else editorWidget.SetTooltip(null); // Finished with mouse move events, so let them bubble up the widget tree if (mi.Event == MouseInputEvent.Move) return false; if (mi.Button == MouseButton.Right) { editorWidget.SetTooltip(null); if (underCursor != null) editorLayer.Remove(underCursor); if (mapResources.Contains(cell) && mapResources[cell].Type != 0) mapResources[cell] = new ResourceTile(); } else if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down) { if (underCursor != null) { // Test case / demonstration of how to edit an existing actor var facing = underCursor.Init<FacingInit>(); if (facing != null) underCursor.ReplaceInit(new FacingInit((facing.Value(world) + 32) % 256)); else if (underCursor.Info.Traits.WithInterface<UsesInit<FacingInit>>().Any()) underCursor.ReplaceInit(new FacingInit(32)); var turret = underCursor.Init<TurretFacingInit>(); if (turret != null) underCursor.ReplaceInit(new TurretFacingInit((turret.Value(world) + 32) % 256)); else if (underCursor.Info.Traits.WithInterface<UsesInit<TurretFacingInit>>().Any()) underCursor.ReplaceInit(new TurretFacingInit(32)); } } return true; }
public void ApplyOrders(World world, PPos xy, MouseInput mi) { if (world.OrderGenerator == null) return; var orders = world.OrderGenerator.Order(world, xy.ToCPos(), mi).ToArray(); orders.Do(o => world.IssueOrder(o)); world.PlayVoiceForOrders(orders); }
public Button(Sprite sprite, MouseInput mouseInput) { _buttonSprite = sprite; _buttonSprite.BindParent(this); _mouseInput = mouseInput; _state = BUTTON_STATE.RELEASED; _selection = BUTTON_SELECT.NONE; _lock = LOCK.LOCKED; }
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return(IsValidTarget(world, cell) ? cursor : cursorBlocked); }
public string GetCursor(World world, CPos xy, MouseInput mi) { return(IsValidTarget(xy) ? "chrono-target" : "move-blocked"); }
public override bool YieldMouseFocus(MouseInput mi) { leftPressed = rightPressed = false; return(base.YieldMouseFocus(mi)); }
private void PlaySync() { try { manualResetEvent.Reset(); MouseInput.GetMaxSize(); uint period = Math.Max(periodMin, Math.Min(periodMax, (uint)GetWaitTime((int)minWaitTime)));; if (NativeMethods.timeBeginPeriod(period) != 0) { throw new Exception("timeBeginPeriod failed."); } for (int i = 0; i < times && State == SessionState.Playing; i++) { for (int j = 0; j < packets.Count && State == SessionState.Playing; j++) { Packet packet = packets[j]; WaitPacket wait = packet as WaitPacket; if (wait != null) { sendInput.Flush(); int waitTime = GetWaitTime(wait.Milliseconds); if (waitTime > 0) { manualResetEvent.WaitOne(waitTime); } continue; } InputPacket input = packet as InputPacket; if (input != null) { sendInput.Queue(input.Input); continue; } } } if (State == SessionState.Playing) { sendInput.Flush(); } if (NativeMethods.timeEndPeriod(period) != 0) { throw new Exception("timeEndPeriod failed."); } } catch (Exception ex) { MainForm.ShowError(ex); } State = SessionState.Idle; }
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return(power.UnitsInRange(cell).Any() ? power.info.Cursor : power.info.BlockedCursor); }
public UIManager(Game game, SpriteBatch spriteBatch, ImGuiRenderer gui, RenderTargetDescriber renderTargetDescriber, SceneSelector sceneSelector, EntityController entityController, CameraController cameraController, Editors editors, IList <IMenu> menus, EntityWindow entityWindow, NetWindow netWindow, KeyboardInput keyboardInput, MouseInput mouseInput) { this.Gui = gui; this.KeyboardInput = keyboardInput; this.MouseInput = mouseInput; this.GameLoop = game; this.SpriteBatch = spriteBatch; this.CameraController = cameraController; this.RenderTargetDescriber = renderTargetDescriber; this.SceneSelector = sceneSelector; this.EntityController = entityController; this.Menus = menus; this.EntityWindow = entityWindow; this.NetWindow = netWindow; this.Editors = editors; }
public override bool HandleMouseInput(MouseInput mi) { if (mi.Event == MouseInputEvent.Scroll && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier)) { worldRenderer.Viewport.AdjustZoom(mi.Delta.Y * Game.Settings.Game.ZoomSpeed); return(true); } var gs = Game.Settings.Game; var scrollButton = gs.UseClassicMouseStyle ^ gs.UseAlternateScrollButton ? MouseButton.Right : MouseButton.Middle; var scrollType = mi.Button.HasFlag(scrollButton) ? gs.MouseScroll : MouseScrollType.Disabled; if (scrollType == MouseScrollType.Disabled) { return(IsJoystickScrolling || isStandardScrolling); } if (scrollType == MouseScrollType.Standard || scrollType == MouseScrollType.Inverted) { if (mi.Event == MouseInputEvent.Down && !isStandardScrolling) { if (!TakeMouseFocus(mi)) { return(false); } standardScrollStart = mi.Location; } else if (mi.Event == MouseInputEvent.Move && (isStandardScrolling || (standardScrollStart.HasValue && ((standardScrollStart.Value - mi.Location).Length > Game.Settings.Game.MouseScrollDeadzone)))) { isStandardScrolling = true; var d = scrollType == MouseScrollType.Inverted ? -1 : 1; worldRenderer.Viewport.Scroll((Viewport.LastMousePos - mi.Location) * d, false); return(true); } else if (mi.Event == MouseInputEvent.Up) { var wasStandardScrolling = isStandardScrolling; isStandardScrolling = false; standardScrollStart = null; YieldMouseFocus(mi); if (wasStandardScrolling) { return(true); } } } // Tiberian Sun style click-and-drag scrolling if (scrollType == MouseScrollType.Joystick) { if (mi.Event == MouseInputEvent.Down) { if (!TakeMouseFocus(mi)) { return(false); } joystickScrollStart = mi.Location; } if (mi.Event == MouseInputEvent.Up) { var wasJoystickScrolling = IsJoystickScrolling; joystickScrollStart = joystickScrollEnd = null; YieldMouseFocus(mi); if (wasJoystickScrolling) { return(true); } } if (mi.Event == MouseInputEvent.Move) { if (!joystickScrollStart.HasValue) { joystickScrollStart = mi.Location; } joystickScrollEnd = mi.Location; } } return(IsJoystickScrolling || isStandardScrolling); }
public IEnumerable <FrozenActor> FrozenActorsAtMouse(Player viewer, MouseInput mi) { return(FrozenActorsAtMouse(viewer, worldRenderer.Viewport.ViewToWorldPx(mi.Location))); }
public override bool InputOverridesSelection(World world, int2 xy, MouseInput mi) { return(true); }
public override IEnumerable <Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi) { if (mi.Button != Game.Settings.Game.MouseButtonPreference.Action) { world.CancelInputMode(); } else { var technician = this.technicians.OrderBy(e => (e.CenterPosition - world.Map.CenterOfCell(cell)).Length).FirstOrDefault(); if (technician == null) { yield break; } var actor = world.ActorMap.GetActorsAt(cell).FirstOrDefault(a => TechnicianUtils.CanEnter(technician, a)); if (actor == null) { yield break; } yield return(new(TechnicianEnterOrderTargeter.Id, technician, Target.FromActor(actor), true)); } }
public string GetCursor(World world, CPos xy, MouseInput mi) { return("default"); }
public override bool YieldMouseFocus(MouseInput mi) { joystickScrollStart = joystickScrollEnd = null; return(base.YieldMouseFocus(mi)); }
protected override IEnumerable <Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { world.CancelInputMode(); if (mi.Button == expectedButton && IsValidTarget(world, cell)) { yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true } } ; }
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { var powerInfo = (ChronoshiftPowerInfo)power.Info; return(IsValidTarget(cell) ? powerInfo.TargetCursor : powerInfo.TargetBlockedCursor); }
public static void SelectSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi) { if (mi.Button != MouseButton.Left) { return; } if (!orderManager.LocalClient.IsObserver && orderManager.LocalClient.State == Session.ClientState.Ready) { return; } var spawnSize = ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").Size.XY; var selectedSpawn = preview.SpawnPoints .Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp, preview.GridType), i)) .Where(a => ((a.First - mi.Location).ToFloat2() / spawnSize * 2).LengthSquared <= 1) .Select(a => a.Second + 1) .FirstOrDefault(); var locals = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null)); var playerToMove = locals.FirstOrDefault(c => ((selectedSpawn == 0) ^ (c.SpawnPoint == 0) && !c.IsObserver)); SetSpawnPoint(orderManager, playerToMove, selectedSpawn); }
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return(((ChronoshiftPowerInfo)power.Info).SelectionCursor); }
} // end of c'tor public void Update(Camera camera) { if (gettingFeeds) { msNewsFeed.Update(); if (msNewsFeed.CurrentState == NewsFeeds.OpState.Failed) { newsScroller.Clear(); FeedMs item = new FeedMs(FeedSize, "Failed to get news feed...", TitleFont, DateFont, BodyFont); newsScroller.AddItem(item); gettingFeeds = false; newsScroller.Dirty = true; } else if (msNewsFeed.CurrentState == NewsFeeds.OpState.Retrieving) { newsScroller.Clear(); FeedMs item = new FeedMs(FeedSize, "Updating news...", TitleFont, DateFont, BodyFont); newsScroller.AddItem(item); //gettingFeeds = false; newsScroller.Dirty = true; } else if (msNewsFeed.CurrentState == NewsFeeds.OpState.Retrieved) { try { // Done getting Tweets newsScroller.Clear(); List <FeedMs> feedList = msNewsFeed.GetFeedList( (int)(FeedSize.X - newsScroller.ScrollBoxSize.X), TitleFont, DateFont, BodyFont); if (feedList != null) { foreach (FeedMs newsItem in feedList) { newsScroller.AddItem(newsItem); } } newsScroller.ResizeItemWidths(); gettingFeeds = false; newsScroller.Dirty = true; } catch { newsScroller.Clear(); FeedMs item = new FeedMs(FeedSize, "Error getting news feed...", TitleFont, DateFont, BodyFont); newsScroller.AddItem(item); gettingFeeds = false; newsScroller.Dirty = true; } } } Vector2 pureMouseHit = new Vector2(MouseInput.Position.X, MouseInput.Position.Y); if (moreLessHitBox.Contains(pureMouseHit) && MouseInput.Left.WasReleased) { expanded = !expanded; } //check touch hit TouchContact touch = TouchInput.GetOldestTouch(); if (TouchInput.WasLastReleased && moreLessHitBox.Contains(touch.position)) { expanded = !expanded; } // Even if not active we need to refresh the rendertarget. newsScroller.RefreshRT(); if (Active) { newsScroller.Update(camera); if (camera == null) { camera = new PerspectiveUICamera(); } if (GamePadInput.ActiveMode == GamePadInput.InputMode.KeyboardMouse) { Vector2 hit = MouseInput.GetAspectRatioAdjustedPosition(camera, useOverscanForHitTesting); pureMouseHit = new Vector2(MouseInput.Position.X, MouseInput.Position.Y); if (!IsInScrollwindow(pureMouseHit)) { // Don't Deactivate here just because the mouse cursor has left the bounds of the scroll window. // We should only deactivate if ComboRight is pressed. //Deactivate(); // But if we're out of bounds and the used clicks, then Deactivate() if (MouseInput.Left.WasPressed) { Deactivate(); } } else if (MouseInput.PrevPosition != MouseInput.Position) { newsScroller.Activate(); } if (true) //newsScroller.IsFocused) { if (Actions.ComboUp.WasPressedOrRepeat) { newsScroller.FocusPrev(); } else if (Actions.ComboDown.WasPressedOrRepeat) { newsScroller.FocusNext(); } else if (Actions.ComboRight.WasPressed) { Deactivate(); } if (Actions.ZoomIn.WasPressedOrRepeat) { newsScroller.FocusPrevItem(); } else if (Actions.ZoomOut.WasPressedOrRepeat) { newsScroller.FocusNextItem(); } } if (Actions.ComboLeft.WasPressed) { newsScroller.Activate(); } } else if (GamePadInput.ActiveMode == GamePadInput.InputMode.GamePad) { // Ignore game pad input for news feed. This allows it to stay open // even while the main menu is active. // HandleGamepadInput(); } } // end if active. } // end of Update()
protected override IEnumerable <Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { world.CancelInputMode(); if (mi.Button == MouseButton.Left && power.UnitsInRange(cell).Any()) { yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true } } ; }
protected override IEnumerable <Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { if (mi.Button == MouseButton.Right) { world.CancelInputMode(); yield break; } var ret = OrderInner(cell).FirstOrDefault(); if (ret == null) { yield break; } world.CancelInputMode(); yield return(ret); }
public override bool HandleMouseInput(MouseInput mi) { return(!ClickThrough); }
protected override IEnumerable <Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { world.CancelInputMode(); if (mi.Button == MouseButton.Left) { world.OrderGenerator = new SelectDestination(world, order, manager, power, cell); } yield break; }
public void PumpInput(Sdl2PlatformWindow device, IInputHandler inputHandler, int2?lockedMousePosition) { var mods = MakeModifiers((int)SDL.SDL_GetModState()); inputHandler.ModifierKeys(mods); MouseInput?pendingMotion = null; while (SDL.SDL_PollEvent(out var e) != 0) { switch (e.type) { case SDL.SDL_EventType.SDL_QUIT: // On macOS, we'd like to restrict Cmd + Q from suddenly exiting the game. if (Platform.CurrentPlatform != PlatformType.OSX || !mods.HasModifier(Modifiers.Meta)) { Game.Exit(); } break; case SDL.SDL_EventType.SDL_WINDOWEVENT: { switch (e.window.windowEvent) { case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: device.HasInputFocus = false; break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED: device.HasInputFocus = true; break; // Triggered when moving between displays with different DPI settings case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED: device.WindowSizeChanged(); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_HIDDEN: case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_MINIMIZED: device.IsSuspended = true; break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_EXPOSED: case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SHOWN: case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_MAXIMIZED: case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_RESTORED: device.IsSuspended = false; break; } break; } case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN: { if (pendingMotion != null) { inputHandler.OnMouseInput(pendingMotion.Value); pendingMotion = null; } var button = MakeButton(e.button.button); lastButtonBits |= button; var input = lockedMousePosition ?? new int2(e.button.x, e.button.y); var pos = EventPosition(device, input.X, input.Y); inputHandler.OnMouseInput(new MouseInput( MouseInputEvent.Down, button, pos, int2.Zero, mods, MultiTapDetection.DetectFromMouse(e.button.button, pos))); break; } case SDL.SDL_EventType.SDL_MOUSEBUTTONUP: { if (pendingMotion != null) { inputHandler.OnMouseInput(pendingMotion.Value); pendingMotion = null; } var button = MakeButton(e.button.button); lastButtonBits &= ~button; var input = lockedMousePosition ?? new int2(e.button.x, e.button.y); var pos = EventPosition(device, input.X, input.Y); inputHandler.OnMouseInput(new MouseInput( MouseInputEvent.Up, button, pos, int2.Zero, mods, MultiTapDetection.InfoFromMouse(e.button.button))); break; } case SDL.SDL_EventType.SDL_MOUSEMOTION: { var mousePos = new int2(e.motion.x, e.motion.y); var input = lockedMousePosition ?? mousePos; var pos = EventPosition(device, input.X, input.Y); var delta = lockedMousePosition == null ? EventPosition(device, e.motion.xrel, e.motion.yrel) : mousePos - lockedMousePosition.Value; pendingMotion = new MouseInput( MouseInputEvent.Move, lastButtonBits, pos, delta, mods, 0); break; } case SDL.SDL_EventType.SDL_MOUSEWHEEL: { SDL.SDL_GetMouseState(out var x, out var y); var pos = EventPosition(device, x, y); inputHandler.OnMouseInput(new MouseInput(MouseInputEvent.Scroll, MouseButton.None, pos, new int2(0, e.wheel.y), mods, 0)); break; } case SDL.SDL_EventType.SDL_TEXTINPUT: { var rawBytes = new byte[SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE]; unsafe { Marshal.Copy((IntPtr)e.text.text, rawBytes, 0, SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE); } inputHandler.OnTextInput(Encoding.UTF8.GetString(rawBytes, 0, Array.IndexOf(rawBytes, (byte)0))); break; } case SDL.SDL_EventType.SDL_KEYDOWN: case SDL.SDL_EventType.SDL_KEYUP: { var keyCode = (Keycode)e.key.keysym.sym; var type = e.type == SDL.SDL_EventType.SDL_KEYDOWN ? KeyInputEvent.Down : KeyInputEvent.Up; var tapCount = e.type == SDL.SDL_EventType.SDL_KEYDOWN ? MultiTapDetection.DetectFromKeyboard(keyCode, mods) : MultiTapDetection.InfoFromKeyboard(keyCode, mods); var keyEvent = new KeyInput { Event = type, Key = keyCode, Modifiers = mods, UnicodeChar = (char)e.key.keysym.sym, MultiTapCount = tapCount, IsRepeat = e.key.repeat != 0 }; // Special case workaround for windows users if (e.key.keysym.sym == SDL.SDL_Keycode.SDLK_F4 && mods.HasModifier(Modifiers.Alt) && Platform.CurrentPlatform == PlatformType.Windows) { Game.Exit(); } else { inputHandler.OnKeyInput(keyEvent); } break; } } } if (pendingMotion != null) { inputHandler.OnMouseInput(pendingMotion.Value); pendingMotion = null; } }
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return("default"); }
public IEnumerable <ActorBoundsPair> ActorsAtMouse(MouseInput mi) { return(ActorsAtMouse(worldRenderer.Viewport.ViewToWorldPx(mi.Location))); }
public bool HandleMouseInput(MouseInput mi) { // Exclusively uses mouse wheel and right mouse buttons, but nothing else // Mouse move events are important for tooltips, so we always allow these through if ((mi.Button != MouseButton.Right && mi.Event != MouseInputEvent.Move && mi.Event != MouseInputEvent.Scroll) || mi.Event == MouseInputEvent.Down) { return(false); } worldPixel = worldRenderer.Viewport.ViewToWorldPx(mi.Location); var cell = worldRenderer.Viewport.ViewToWorld(mi.Location); var underCursor = editorLayer.PreviewsAt(worldPixel).MinByOrDefault(CalculateActorSelectionPriority); var mapResources = world.Map.Resources; ResourceType type; if (underCursor != null) { editorWidget.SetTooltip(underCursor.Tooltip); } else if (mapResources.Contains(cell) && resources.TryGetValue(mapResources[cell].Type, out type)) { editorWidget.SetTooltip(type.Info.Type); } else { editorWidget.SetTooltip(null); } // Finished with mouse move events, so let them bubble up the widget tree if (mi.Event == MouseInputEvent.Move) { return(false); } if (mi.Button == MouseButton.Right) { editorWidget.SetTooltip(null); if (underCursor != null) { editorLayer.Remove(underCursor); } if (mapResources.Contains(cell) && mapResources[cell].Type != 0) { mapResources[cell] = new ResourceTile(); } } else if (mi.Event == MouseInputEvent.Scroll) { if (underCursor != null) { // Test case / demonstration of how to edit an existing actor var facing = underCursor.Init <FacingInit>(); if (facing != null) { underCursor.ReplaceInit(new FacingInit((facing.Value(world) + mi.ScrollDelta) % 256)); } else if (underCursor.Info.HasTraitInfo <UsesInit <FacingInit> >()) { underCursor.ReplaceInit(new FacingInit(mi.ScrollDelta)); } var turret = underCursor.Init <TurretFacingInit>(); if (turret != null) { underCursor.ReplaceInit(new TurretFacingInit((turret.Value(world) + mi.ScrollDelta) % 256)); } else if (underCursor.Info.HasTraitInfo <UsesInit <TurretFacingInit> >()) { underCursor.ReplaceInit(new TurretFacingInit(mi.ScrollDelta)); } } } return(true); }
protected override IEnumerable <Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { if (mi.Button == Game.Settings.Game.MouseButtonPreference.Cancel) { world.CancelInputMode(); yield break; } if (self.IsInWorld && self.Location != cell && self.Trait <PortableChrono>().CanTeleport&& self.Owner.Shroud.IsExplored(cell)) { world.CancelInputMode(); yield return(new Order("PortableChronoTeleport", self, Target.FromCell(world, cell), mi.Modifiers.HasModifier(Modifiers.Shift))); } }
protected virtual bool HandleRightClick(MouseInput mi) { return(false); }
public string GetCursor(World world, CPos xy, MouseInput mi) { return("chrono-select"); }
IEnumerable <Order> InnerOrder(World world, CPos cell, MouseInput mi) { if (world.Paused) { yield break; } var owner = queue.Actor.Owner; var ai = variants[variant].ActorInfo; var bi = variants[variant].BuildingInfo; if (mi.Button == MouseButton.Left) { var orderType = "PlaceBuilding"; var topLeft = TopLeft; var plugInfo = ai.TraitInfoOrDefault <PlugInfo>(); if (plugInfo != null) { orderType = "PlacePlug"; if (!AcceptsPlug(topLeft, plugInfo)) { Game.Sound.PlayNotification(world.Map.Rules, owner, "Speech", placeBuildingInfo.CannotPlaceNotification, owner.Faction.InternalName); yield break; } } else { if (!world.CanPlaceBuilding(topLeft, ai, bi, null) || !bi.IsCloseEnoughToBase(world, owner, ai, topLeft)) { foreach (var order in ClearBlockersOrders(world, topLeft)) { yield return(order); } Game.Sound.PlayNotification(world.Map.Rules, owner, "Speech", placeBuildingInfo.CannotPlaceNotification, owner.Faction.InternalName); yield break; } if (ai.HasTraitInfo <LineBuildInfo>() && !mi.Modifiers.HasModifier(Modifiers.Shift)) { orderType = "LineBuild"; } } yield return(new Order(orderType, owner.PlayerActor, Target.FromCell(world, topLeft), false) { // Building to place TargetString = variants[0].ActorInfo.Name, // Actor ID to associate with placement may be quite large, so it gets its own uint ExtraData = queue.Actor.ActorID, // Actor variant will always be small enough to safely pack in a CPos ExtraLocation = new CPos(variant, 0), SuppressVisualFeedback = true }); } }
string IOrderGenerator.GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return("default"); }