Show plaza on generated map

This commit is contained in:
Kurt 2020-04-05 16:00:17 -07:00
parent 6f228a72f7
commit 3482eebe5a
3 changed files with 49 additions and 16 deletions

View File

@ -88,26 +88,40 @@ private static Bitmap DrawReticle(Bitmap map, int x, int y, int scale)
return map;
}
public static Bitmap GetMapWithBuildings(TerrainManager mgr, IReadOnlyList<Building> buildings, Font f, int scale = 4, int index = -1)
public static Bitmap GetMapWithBuildings(TerrainManager mgr, IReadOnlyList<Building> buildings, ushort plazaX, ushort plazaY, Font f, int scale = 4, int index = -1)
{
// Although there is terrain in the Top Row and Left Column, no buildings can be placed there.
// Adjust the building coordinates down-right by an acre.
const int buildingShift = TerrainManager.GridWidth;
var map = CreateMap(mgr, scale);
using var gfx = Graphics.FromImage(map);
gfx.DrawPlaza(plazaX, plazaY, scale);
gfx.DrawBuildings(buildings, f, scale, index);
return map;
}
private static void DrawPlaza(this Graphics gfx, ushort px, ushort py, int scale)
{
var plaza = Brushes.RosyBrown;
GetBuildingCoordinate(px, py, scale, out var x, out var y);
var width = scale * 2 * 6;
var height = scale * 2 * 5;
gfx.FillRectangle(plaza, x, y, width, height);
}
private static void DrawBuildings(this Graphics gfx, IReadOnlyList<Building> buildings, Font f, int scale, int index = -1)
{
var selected = Brushes.Red;
var others = Brushes.Yellow;
var text = Brushes.White;
var stringFormat = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
var stringFormat = new StringFormat {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center};
for (int i = 0; i < buildings.Count; i++)
{
var b = buildings[i];
if (b.BuildingType == 0)
continue;
var x = (int)(((b.X / 2f) - buildingShift) * scale);
var y = (int)(((b.Y / 2f) - buildingShift) * scale);
GetBuildingCoordinate(b.X, b.Y, scale, out var x, out var y);
var pen = index == i ? selected : others;
gfx.FillRectangle(pen, x - scale, y - scale, scale * 2, scale * 2);
@ -115,8 +129,15 @@ public static Bitmap GetMapWithBuildings(TerrainManager mgr, IReadOnlyList<Build
var name = b.BuildingType.ToString();
gfx.DrawString(name, f, text, new PointF(x, y - (scale * 2)), stringFormat);
}
}
return map;
private static void GetBuildingCoordinate(ushort bx, ushort by, int scale, out int x, out int y)
{
// Although there is terrain in the Top Row and Left Column, no buildings can be placed there.
// Adjust the building coordinates down-right by an acre.
const int buildingShift = TerrainManager.GridWidth;
x = (int) (((bx / 2f) - buildingShift) * scale);
y = (int) (((by / 2f) - buildingShift) * scale);
}
}
}
}

View File

@ -365,6 +365,7 @@ private void InitializeComponent()
this.NUD_PlazaX.Name = "NUD_PlazaX";
this.NUD_PlazaX.Size = new System.Drawing.Size(45, 20);
this.NUD_PlazaX.TabIndex = 103;
this.NUD_PlazaX.ValueChanged += new System.EventHandler(this.NUD_PlazaCoordinate_ValueChanged);
//
// L_PlazaY
//
@ -386,6 +387,7 @@ private void InitializeComponent()
this.NUD_PlazaY.Name = "NUD_PlazaY";
this.NUD_PlazaY.Size = new System.Drawing.Size(45, 20);
this.NUD_PlazaY.TabIndex = 101;
this.NUD_PlazaY.ValueChanged += new System.EventHandler(this.NUD_PlazaCoordinate_ValueChanged);
//
// BuildingEditor
//

View File

@ -16,22 +16,22 @@ public partial class BuildingEditor : Form
public BuildingEditor(IReadOnlyList<Building> buildings, MainSave sav)
{
InitializeComponent();
Buildings = buildings;
SAV = sav;
DialogResult = DialogResult.Cancel;
Buildings = buildings;
Terrain = new TerrainManager(sav.GetTerrain());
NUD_PlazaX.Value = sav.PlazaX;
NUD_PlazaY.Value = sav.PlazaY;
foreach (var obj in buildings)
LB_Items.Items.Add(obj.ToString());
Terrain = new TerrainManager(sav.GetTerrain());
LB_Items.SelectedIndex = 0;
foreach (var entry in HelpDictionary)
CB_StructureType.Items.Add(entry.Key);
CB_StructureType.SelectedIndex = 0;
NUD_PlazaX.Value = sav.PlazaX;
NUD_PlazaY.Value = sav.PlazaY;
DialogResult = DialogResult.Cancel;
}
private void B_Cancel_Click(object sender, EventArgs e) => Close();
@ -47,7 +47,15 @@ private void B_Save_Click(object sender, EventArgs e)
private int Index;
private bool Loading;
private void DrawMap(in int index) => PB_Map.Image = TerrainSprite.GetMapWithBuildings(Terrain, Buildings, B_Save.Font, 4, index);
private void DrawMap(in int index)
{
var font = B_Save.Font;
const int scale = 4;
var px = (ushort) NUD_PlazaX.Value;
var py = (ushort) NUD_PlazaY.Value;
PB_Map.Image = TerrainSprite.GetMapWithBuildings(Terrain, Buildings, px, py, font, scale, index);
}
private void LB_Items_SelectedIndexChanged(object sender, EventArgs e)
{
@ -106,5 +114,7 @@ private void CB_StructureType_SelectedIndexChanged(object sender, EventArgs e)
CB_StructureValues.Items.Add(item);
CB_StructureValues.SelectedIndex = 0;
}
private void NUD_PlazaCoordinate_ValueChanged(object sender, EventArgs e) => DrawMap(Index);
}
}