Improve city interaction when there's only 1 nhood

This commit is contained in:
riperiperi 2024-12-23 00:27:20 +00:00
parent d45593bc04
commit 3e9893a1f0
4 changed files with 57 additions and 4 deletions

View file

@ -111,6 +111,8 @@ There are a few things you can do in the neighbourhood editor:
- Move a neighbourhood's origin point to the mouse position. The neighbourhood visualization will update to show you what area of the city belongs to which neighbourhood. - Move a neighbourhood's origin point to the mouse position. The neighbourhood visualization will update to show you what area of the city belongs to which neighbourhood.
- Hold shift & Click - Hold shift & Click
- Create a new neighbourhood at the mouse position. - Create a new neighbourhood at the mouse position.
- Hold ctrl & Click
- Delete the neighbourhood at the mouse position. Needs to be pretty close.
- Press "R" - Press "R"
- Rename the neighbourhood closest to the mouse position. - Rename the neighbourhood closest to the mouse position.
- Press "C" - Press "C"
@ -120,7 +122,7 @@ There are a few things you can do in the neighbourhood editor:
- Press Shift + F10 - Press Shift + F10
- Save the neighbourhood data to `Content/edit_neigh.json`. - Save the neighbourhood data to `Content/edit_neigh.json`.
Similar to the City Painter, this tool is currently pretty user unfriendly, so improvements would definitely be welcome. For example, not being able to delete neighbourhoods is a bit silly, but you can always save to JSON, manually delete it with a text editor, then load it again. Similar to the City Painter, this tool is currently pretty user unfriendly, so improvements would definitely be welcome.
Descriptions for neighbourhoods also can't be edited ingame. Add a `description` field to each object in the JSON to give your neighbourhoods a description that appears in their nhood page. You can also do this in the database after importing. Descriptions for neighbourhoods also can't be edited ingame. Add a `description` field to each object in the JSON to give your neighbourhoods a description that appears in their nhood page. You can also do this in the database after importing.

View file

@ -22,6 +22,45 @@ namespace FSO.Client.Rendering.City
private UILotControlTouchHelper Touch; private UILotControlTouchHelper Touch;
public CityCameraCenter CenterCam { get; set; } public CityCameraCenter CenterCam { get; set; }
// Set a center delta, then tween to 0 to smootly move to a target location.
public Vector2 CenterDelta;
public float TweenDeltaX
{
get
{
return CenterDelta.X;
}
set
{
if (CenterDelta.X != 0)
{
CenterTile.X -= value - CenterDelta.X;
}
CenterDelta.X = value;
}
}
public float TweenDeltaY
{
get
{
return CenterDelta.Y;
}
set
{
if (CenterDelta.Y != 0)
{
CenterTile.Y -= value - CenterDelta.Y;
}
CenterDelta.Y = value;
}
}
public float FarUIFade public float FarUIFade
{ {
get { return Math.Max(0, Math.Min(1, 6.5f - Zoom3D)); } get { return Math.Max(0, Math.Min(1, 6.5f - Zoom3D)); }

View file

@ -80,6 +80,8 @@ namespace FSO.Client.Rendering.City
int halfMapSize = mapSize / 2; int halfMapSize = mapSize / 2;
int margin = 512; int margin = 512;
// These points stop the neighbourhood geometry from going too far out of bounds, which would cause visual issues.
pts.Add(new Vector2(halfMapSize, -margin)); pts.Add(new Vector2(halfMapSize, -margin));
pts.Add(new Vector2(-margin, halfMapSize)); pts.Add(new Vector2(-margin, halfMapSize));
@ -476,7 +478,8 @@ namespace FSO.Client.Rendering.City
//find the nhood we're hovering //find the nhood we're hovering
var pos = City.EstTileAtPosWithScroll(state.MouseState.Position.ToVector2() / FSOEnvironment.DPIScaleFactor, null); var pos = City.EstTileAtPosWithScroll(state.MouseState.Position.ToVector2() / FSOEnvironment.DPIScaleFactor, null);
if (City.HandleMouse) // Neighbourhoods are only interactive if there's more than one.
if (City.HandleMouse && City.NeighGeom.Cells.Count > 1)
{ {
HoverNHood = NhoodNearest(pos); HoverNHood = NhoodNearest(pos);
if (HoverNHood > -1 && !HoverPct.ContainsKey(HoverNHood)) if (HoverNHood > -1 && !HoverPct.ContainsKey(HoverNHood))

View file

@ -1102,9 +1102,18 @@ namespace FSO.Client.Rendering.City
//((CityCamera2D)Camera).m_TargVOffX = (float)(-hb + pt.X * isoScale * 2); //((CityCamera2D)Camera).m_TargVOffX = (float)(-hb + pt.X * isoScale * 2);
//((CityCamera2D)Camera).m_TargVOffY = (float)(vb - pt.Y * isoScale * 2); //zoom into approximate location of mouse cursor if not zoomed already //((CityCamera2D)Camera).m_TargVOffY = (float)(vb - pt.Y * isoScale * 2); //zoom into approximate location of mouse cursor if not zoomed already
} else }
else
{ {
if (currentTile != null) ((CityCamera3D)Camera).CenterTile = currentTile.Value; var camera = (CityCamera3D)Camera;
if (currentTile != null)
{
camera.CenterDelta = currentTile.Value - camera.CenterTile;
GameFacade.Screens.Tween.To(camera, 0.3f, new Dictionary<string, float>() {
{ "TweenDeltaX", 0f },
{ "TweenDeltaY", 0f },
}, TweenQuad.EaseOut);
}
((CityCamera3D)Camera).TargetZoom = 1.7f; ((CityCamera3D)Camera).TargetZoom = 1.7f;
} }
} }