private IEnumerator Hover() { while (true) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); int interactable_layer_mask = LayerMask.GetMask("Interactable"); int ui_layer_mask = LayerMask.GetMask("UI"); if (Physics.Raycast(ray, out RaycastHit hit, 150f, interactable_layer_mask, QueryTriggerInteraction.Ignore)) { GameObject hover = hit.transform.gameObject; if (HoveredObject != null && !SelectedObjects.Contains(HoveredObject)) { HoveredObject.GetComponentInChildren <Renderer>().material = HoveredObject.GetComponentInParent <Interactable>().OriginalMaterial; } HoveredObject = hover; if (HoveredObject != null && !SelectedObjects.Contains(HoveredObject)) { Item hover_item = HoveredObject.GetComponent <Item>(); HoveredObject.GetComponentInChildren <Renderer>().material = hover_item != null && !hover_item.IsSpotted ? HoveredObject.GetComponentInParent <Interactable>().OriginalMaterial : HoveredObject.GetComponentInParent <Interactable>().highlight_material; } }
public Spell.Spells GetCastSpell() { Spell.Spells splId = Spell.Spells.NoneSpell; Templates.TplSpell spl = null; Spell itemSp = GetOneTimeCast(); if (itemSp != null) { splId = itemSp.SpellID; spl = itemSp.Template; } else if (SpellbookVisible && Spellbook.Unit == SelectedObject && Spellbook.ActiveSpell != Spell.Spells.NoneSpell) { splId = Spellbook.ActiveSpell; spl = TemplateLoader.GetSpellById((int)splId - 1); } if (spl != null && (spl.IsAreaSpell || (!spl.IsAreaSpell && HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Human || HoveredObject.GetObjectType() == MapObjectType.Monster)))) { return(splId); } return(Spell.Spells.NoneSpell); }
Spell.Spells GetCastSpell() { if (SpellbookVisible && Spellbook.Unit == SelectedObject && Spellbook.ActiveSpell != Spell.Spells.NoneSpell) { Spell.Spells sp = Spellbook.ActiveSpell; Templates.TplSpell spl = TemplateLoader.GetSpellById((int)sp - 1); if (spl.SpellTarget == 2 || (spl.SpellTarget == 1 && HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Human || HoveredObject.GetObjectType() == MapObjectType.Monster))) { return(Spellbook.ActiveSpell); } } return(Spell.Spells.NoneSpell); }
private void Update() { if (Input.GetKeyDown("escape")) { if (HoveredObject != null) { HoveredObject.GetComponentInChildren <Renderer>().material = HoveredObject.GetComponentInParent <Interactable>().OriginalMaterial; } for (int i = 0; i < SelectedObjects.Count; i++) { SelectedObjects[i].GetComponentInChildren <Renderer>().material = SelectedObjects[i].GetComponentInParent <Interactable>().OriginalMaterial; } SelectedObjects.Clear(); } }
void UpdateInput() { if (!MapLogic.Instance.IsLoaded) { return; } // update mouse x/y int oldMouseCellX = MouseCellX; int oldMouseCellY = MouseCellY; Vector3 mPos = Utils.GetMousePosition(); mPos.x += ScrollX * 32; mPos.y += ScrollY * 32; float cXFrac = (mPos.x / 32) - Mathf.Floor(mPos.x / 32); _MouseCellX = (int)(mPos.x / 32); _MouseCellY = 0; for (int y = (int)_VisibleRect.yMin; y <= _VisibleRect.yMax; y++) { float h1 = y * 32 - GetHeightAt(_MouseCellX, y); float h2 = y * 32 - GetHeightAt(_MouseCellX + 1, y); float h = h1 * (1f - cXFrac) + h2 * cXFrac; if (mPos.y < h) { _MouseCellY = y - 1; break; } } _MouseCellX = Mathf.Clamp(_MouseCellX, 0, MapLogic.Instance.Width - 1); _MouseCellY = Mathf.Clamp(_MouseCellY, 0, MapLogic.Instance.Height - 1); //Debug.Log(string.Format("mouse = {0} {1} (from {2} {3})", _MouseCellX, _MouseCellY, mPos.x, mPos.y)); // temporary! if (MapLogic.Instance.ConsolePlayer == null) // mostly if we're server { if (oldMouseCellX != MouseCellX || oldMouseCellY != MouseCellY) { MapLogic.Instance.SetTestingVisibility(MouseCellX, MouseCellY, 5); } } // PERMANENT (x2) // check currently hovered object MapNode[,] nodes = MapLogic.Instance.Nodes; MapObject o = null; float oZ = 0; for (int y = (int)_VisibleRect.yMin; y <= _VisibleRect.yMax; y++) { for (int x = (int)_VisibleRect.xMin; x <= _VisibleRect.xMax; x++) { foreach (MapObject mobj in nodes[x, y].Objects) { if (mobj.GameObject == null || mobj.GameScript == null) { continue; } // if (!(mobj.GameScript is IMapViewSelectable) || !((IMapViewSelectable)mobj.GameScript).IsSelected((int)mPos.x, (int)mPos.y)) { continue; } if (mobj.GameObject.transform.position.z < oZ) { o = mobj; oZ = mobj.GameObject.transform.position.z; } } } } MouseCursor.SetCursor(MouseCursor.CurDefault); bool hoveringDarkness = (nodes[MouseCellX, MouseCellY].Flags & MapNodeFlags.Visible) == 0; if (o != null && (o.GameScript is IMapViewSelfie)) { Infowindow.Viewer = (IMapViewSelfie)o.GameScript; } else if (SelectedObject != null && (SelectedObject.GameScript is IMapViewSelfie)) { Infowindow.Viewer = (IMapViewSelfie)SelectedObject.GameScript; } else { Infowindow.Viewer = null; } HoveredObject = o; if (GetCastSpell() != Spell.Spells.NoneSpell) { MouseCursor.SetCursor(MouseCursor.CurCast); return; } if (!hoveringDarkness && HoveredObject != null && (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move || Commandbar.CurrentCommand == 0)) { // hovered usable buildings have different cursor picture. if (HoveredObject.GetObjectType() == MapObjectType.Structure && ((MapStructure)HoveredObject).Class.Usable) { MouseCursor.SetCursor(MouseCursor.CurSelectStructure); } else { MouseCursor.SetCursor(MouseCursor.CurSelect); } } else if (SelectedObject != null && SelectedObject is IPlayerPawn) { Player sp = ((IPlayerPawn)SelectedObject).GetPlayer(); if (sp == MapLogic.Instance.ConsolePlayer) { if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move) { MouseCursor.SetCursor(MouseCursor.CurMove); } else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Attack) { MouseCursor.SetCursor(MouseCursor.CurAttack); } else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.MoveAttack) { MouseCursor.SetCursor(MouseCursor.CurMoveAttack); } else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Pickup) { MouseCursor.SetCursor(MouseCursor.CurPickup); } } } }
public bool ProcessEvent(Event e) { if (!MapLogic.Instance.IsLoaded) { return(false); } if (e.type == EventType.KeyDown) { switch (e.keyCode) { case KeyCode.LeftArrow: if (ScrollDeltaX == 0) { ScrollDeltaX = -1; } return(true); case KeyCode.RightArrow: if (ScrollDeltaX == 0) { ScrollDeltaX = 1; } return(true); case KeyCode.UpArrow: if (ScrollDeltaY == 0) { ScrollDeltaY = -1; } return(true); case KeyCode.DownArrow: if (ScrollDeltaY == 0) { ScrollDeltaY = 1; } return(true); case KeyCode.Plus: case KeyCode.Equals: // + = = case KeyCode.KeypadPlus: { int oldSpeed = MapLogic.Instance.Speed; if (!NetworkManager.IsClient) { MapLogic.Instance.Speed++; } if (oldSpeed != MapLogic.Instance.Speed) { MapViewChat.Instance.AddChatMessage(Player.AllColorsSystem, Locale.Main[108 + MapLogic.Instance.Speed]); } } return(true); case KeyCode.Minus: case KeyCode.KeypadMinus: { int oldSpeed = MapLogic.Instance.Speed; if (!NetworkManager.IsClient) { MapLogic.Instance.Speed--; } if (oldSpeed != MapLogic.Instance.Speed) { MapViewChat.Instance.AddChatMessage(Player.AllColorsSystem, Locale.Main[108 + MapLogic.Instance.Speed]); } } return(true); case KeyCode.F3: //if (NetworkManager.IsClient) { DiplomacyWindow wnd = Utils.CreateObjectWithScript <DiplomacyWindow>(); //Debug.LogFormat("created a window!"); } return(true); case KeyCode.Escape: { // todo: create main menu ExampleWindow wnd = Utils.CreateObjectWithScript <ExampleWindow>(); } return(true); case KeyCode.Space: // check if local unit is dead. // for dead local unit, space sends respawn. // for alive local unit, space toggles both spellbook and inventory. if (MapLogic.Instance.ConsolePlayer != null && !MapLogic.Instance.ConsolePlayer.Avatar.IsAlive) { Client.SendRespawn(); } else { bool cstate = InventoryVisible && SpellbookVisible; InventoryVisible = !cstate; SpellbookVisible = !cstate; Spellbook.Update(); } return(true); case KeyCode.BackQuote: InventoryVisible = !InventoryVisible; Spellbook.Update(); return(true); case KeyCode.Q: SpellbookVisible = !SpellbookVisible; Spellbook.Update(); return(true); } } else if (e.type == EventType.KeyUp) { switch (e.keyCode) { case KeyCode.LeftArrow: if (ScrollDeltaX == -1) { ScrollDeltaX = 0; } return(true); case KeyCode.RightArrow: if (ScrollDeltaX == 1) { ScrollDeltaX = 0; } return(true); case KeyCode.UpArrow: if (ScrollDeltaY == -1) { ScrollDeltaY = 0; } return(true); case KeyCode.DownArrow: if (ScrollDeltaY == 1) { ScrollDeltaY = 0; } return(true); } } else if (e.rawType == EventType.MouseMove) { UpdateInput(); return(true); } else if (e.rawType == EventType.MouseDown && e.button == 0) { // select unit if not selected yet if (HoveredObject != null && (SelectedObject == null || (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move && !Input.GetKey(KeyCode.LeftAlt) && !Input.GetKey(KeyCode.RightAlt)) || (Commandbar.CurrentCommand == 0))) { SelectedObject = HoveredObject; OnObjectSelected(SelectedObject); } else if (SelectedObject != null && SelectedObject is IPlayerPawn && ((IPlayerPawn)SelectedObject).GetPlayer() == MapLogic.Instance.ConsolePlayer) { // todo: handle commands here // try to walk. if (SelectedObject.GetObjectType() == MapObjectType.Monster || SelectedObject.GetObjectType() == MapObjectType.Human) { MapUnit unit = (MapUnit)SelectedObject; if (GetCastSpell() != Spell.Spells.NoneSpell) { if (HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Monster || HoveredObject.GetObjectType() == MapObjectType.Human)) { Client.SendCastToUnit(unit, GetCastSpell(), (MapUnit)HoveredObject); } else { Client.SendCastToArea(unit, GetCastSpell(), MouseCellX, MouseCellY); } } else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move) { Client.SendMoveUnit(unit, MouseCellX, MouseCellY); } else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Attack && HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Monster || HoveredObject.GetObjectType() == MapObjectType.Human)) { Client.SendAttackUnit(unit, (MapUnit)HoveredObject); } else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Pickup && MapLogic.Instance.GetSackAt(MouseCellX, MouseCellY) != null) { Client.SendPickupUnit(unit, MouseCellX, MouseCellY); // issue sack pickup command by current unit at target coordinates } } } return(true); } else if (e.rawType == EventType.MouseDown && e.button == 1) { SelectedObject = null; // deselect Commandbar.EnabledCommands = 0; return(true); } return(false); }
void Update() { MiniMap.gameObject.SetActive(MapLogic.Instance.IsLoaded); Commandbar.gameObject.SetActive(MapLogic.Instance.IsLoaded); Infowindow.gameObject.SetActive(MapLogic.Instance.IsLoaded); Inventory.gameObject.SetActive(InventoryVisible); Spellbook.gameObject.SetActive(SpellbookVisible); if (!MapLogic.Instance.IsLoaded) { return; } if (GridEnabled) { GridMeshMaterial.color = new Color(1, 0, 0, 0.5f); } else { GridMeshMaterial.color = new Color(0, 0, 0, 0); } // update lighting. Texture2D lightTex = MapLogic.Instance.CheckLightingTexture(); if (lightTex != null) { UpdateLighting(lightTex); } Texture2D fowTex = MapLogic.Instance.CheckFOWTexture(); if (fowTex != null) { UpdateFOW(fowTex); } if (HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Monster || HoveredObject.GetObjectType() == MapObjectType.Human) && (!((MapUnit)HoveredObject).IsAlive || !MapLogic.Instance.Objects.Contains(HoveredObject))) { HoveredObject = null; } if (SelectedObject != null && (SelectedObject.GetObjectType() == MapObjectType.Monster || SelectedObject.GetObjectType() == MapObjectType.Human) && (!((MapUnit)SelectedObject).IsAlive || !MapLogic.Instance.Objects.Contains(SelectedObject))) { SelectedObject = null; } UpdateLogic(); int waterAnimFrameNew = (MapLogic.Instance.LevelTime % 20) / 5; if (WaterAnimFrame != waterAnimFrameNew) { WaterAnimFrame = waterAnimFrameNew; UpdateTiles(WaterAnimFrame); } // update scrolling scrollTimer += Time.unscaledDeltaTime; if (scrollTimer > 0.01) { SetScroll(ScrollX + ScrollDeltaX, ScrollY + ScrollDeltaY); scrollTimer = 0; } }
private void Display_RenderedWorld(object sender, RenderedWorldEventArgs e) { if (Game1.activeClickableMenu == null) { GameLocation CurrentLocation = Game1.player.currentLocation; bool IsHoveringPlacedObject = CurrentLocation.Objects.TryGetValue(HoveredTile, out SObject HoveredObject); if (IsHoveringPlacedObject) { if (UserConfig.DrawToolTip) { // Draw a tooltip that shows how many of the machine were combined, and its total combined processing power // Such as: "Quantity: 5\nPower: 465%" if (HoveredObject.TryGetCombinedQuantity(out int CombinedQuantity)) { Cask Cask = HoveredObject as Cask; bool IsCask = Cask != null; CrabPot CrabPot = HoveredObject as CrabPot; bool IsCrabPot = CrabPot != null; bool IsScarecrow = HoveredObject.IsScarecrow(); bool HasHeldObject = HoveredObject.heldObject?.Value != null; float UIScaleFactor = Game1.options.zoomLevel / Game1.options.uiScale; SpriteFont DefaultFont = Game1.dialogueFont; int Padding = 25; int MarginBetweenColumns = 10; int MarginBetweenRows = 5; float LabelTextScale = 0.75f; float ValueTextScale = 1.0f; bool ShowDurationInfo = UserConfig.ToolTipShowDuration && UserConfig.ShouldModifyProcessingSpeed(HoveredObject); bool ShowQuantityInfo = UserConfig.ToolTipShowQuantity && UserConfig.ShouldModifyInputsAndOutputs(HoveredObject); // Compute row headers List <string> RowHeaders = new List <string>() { Helper.Translation.Get("ToolTipQuantityLabel"), Helper.Translation.Get("ToolTipPowerLabel") }; if (ShowDurationInfo) { if (IsCask) { //RowHeaders.Add(Helper.Translation.Get("ToolTipCaskAgingRateLabel")); if (HasHeldObject) { RowHeaders.Add(Helper.Translation.Get("ToolTipCaskDaysUntilIridiumLabel")); } } else if (IsCrabPot) { RowHeaders.Add(Helper.Translation.Get("ToolTipCrabPotProcessingIntervalLabel")); } else { if (HasHeldObject) { RowHeaders.Add(Helper.Translation.Get("ToolTipMinutesRemainingLabel")); } } } if (ShowQuantityInfo) { if (HasHeldObject && HoveredObject.HasModifiedOutput()) { RowHeaders.Add(Helper.Translation.Get("ToolTipProducedQuantityLabel")); } } if (IsScarecrow) { RowHeaders.Add(Helper.Translation.Get("ToolTipScarecrowRadiusLabel")); } List <Vector2> RowHeaderSizes = RowHeaders.Select(x => DefaultFont.MeasureString(x) * LabelTextScale).ToList(); double ProcessingPower = UserConfig.ComputeProcessingPower(CombinedQuantity) * 100.0; string FormattedProcessingPower = string.Format("{0}%", ProcessingPower.ToString("0.#")); // Compute row values List <string> RowValues = new List <string>() { CombinedQuantity.ToString(), FormattedProcessingPower }; if (ShowDurationInfo) { if (IsCask) { //RowValues.Add(Cask.agingRate.Value.ToString("0.##")); if (HasHeldObject) { RowValues.Add(Math.Ceiling(Cask.daysToMature.Value / Cask.agingRate.Value).ToString("0.##")); } } else if (IsCrabPot) { CrabPot.TryGetProcessingInterval(out double Power, out double IntervalHours, out int IntervalMinutes); RowValues.Add(IntervalMinutes.ToString()); } else { if (HasHeldObject) { RowValues.Add(HoveredObject.MinutesUntilReady.ToString("0.##")); } } } if (ShowQuantityInfo) { if (HasHeldObject && HoveredObject.HasModifiedOutput()) { RowValues.Add(HoveredObject.heldObject.Value.Stack.ToString()); } } if (IsScarecrow) { // Subtract 1 because the game internally counts the scarecrow's occupied tile as part of its radius, but users usually would be confused by that // So a typical user expects radius=8 for a regular scarecrow, even though the game does its calculations with radius=9 int OriginalRadius = HoveredObject.GetScarecrowBaseRadius() - 1; int AlteredRadius = HoveredObject.GetScarecrowRadius() - 1; //RowValues.Add(string.Format("{0}-->{1}", OriginalRadius, AlteredRadius)); RowValues.Add(AlteredRadius.ToString()); } List <Vector2> RowValueSizes = RowValues.Select(x => DrawHelpers.MeasureStringWithSpecialNumbers(x, ValueTextScale, 0.0f)).ToList(); // Measure the tooltip List <int> RowHeights = new List <int>(); for (int i = 0; i < RowHeaders.Count; i++) { RowHeights.Add((int)Math.Max(RowHeaderSizes[i].Y, RowValueSizes[i].Y)); } List <int> ColumnWidths = new List <int> { (int)RowHeaderSizes.Max(x => x.X), (int)RowValueSizes.Max(x => x.X) }; int ToolTipTopWidth = Padding + ColumnWidths.Sum() + (ColumnWidths.Count - 1) * MarginBetweenColumns + Padding; int ToolTipHeight = Padding + RowHeights.Sum() + (RowHeights.Count - 1) * MarginBetweenRows + Padding; Point ToolTipTopleft = DrawHelpers.GetTopleftPosition(new Point(ToolTipTopWidth, ToolTipHeight), new Point((int)((MouseScreenPosition.X + UserConfig.ToolTipOffset.X) / UIScaleFactor), (int)((MouseScreenPosition.Y + UserConfig.ToolTipOffset.Y) / UIScaleFactor)), 100); // Draw tooltip background DrawHelpers.DrawBox(e.SpriteBatch, new Rectangle(ToolTipTopleft.X, ToolTipTopleft.Y, ToolTipTopWidth, ToolTipHeight)); // Draw each row's header and value int CurrentY = ToolTipTopleft.Y + Padding; for (int i = 0; i < RowHeights.Count; i++) { int CurrentRowHeight = RowHeights[i]; // Draw the row header Vector2 RowHeaderPosition = new Vector2( ToolTipTopleft.X + Padding + ColumnWidths[0] - RowHeaderSizes[i].X, CurrentY + (RowHeights[i] - RowHeaderSizes[i].Y) / 2.0f ); e.SpriteBatch.DrawString(DefaultFont, RowHeaders[i], RowHeaderPosition, Color.Black, 0.0f, Vector2.Zero, LabelTextScale, SpriteEffects.None, 1.0f); // Draw the row value Vector2 RowValuePosition = new Vector2( ToolTipTopleft.X + Padding + ColumnWidths[0] + MarginBetweenColumns, CurrentY + (RowHeights[i] - RowValueSizes[i].Y) / 2.0f ); DrawHelpers.DrawStringWithSpecialNumbers(e.SpriteBatch, RowValuePosition, RowValues[i], ValueTextScale, Color.White); CurrentY += CurrentRowHeight + MarginBetweenRows; } } } } } }