diff --git a/NHSE.Sprites/Field/FieldItemSprite.cs b/NHSE.Sprites/Field/FieldItemSprite.cs index 9123208..10c665c 100644 --- a/NHSE.Sprites/Field/FieldItemSprite.cs +++ b/NHSE.Sprites/Field/FieldItemSprite.cs @@ -57,7 +57,7 @@ public static Color GetItemColor(FieldItem item) { var kind = ItemInfo.GetItemKind(item); if (kind == ItemKind.Unknown) - return item.DisplayItemId == FieldItem.NONE ? Color.LimeGreen : Color.DarkGreen; + return item.DisplayItemId == FieldItem.NONE ? Color.Transparent : Color.DarkGreen; return Colors[(int)kind]; } diff --git a/NHSE.Sprites/Field/FieldItemSpriteDrawer.cs b/NHSE.Sprites/Field/FieldItemSpriteDrawer.cs index 5598653..d23c0d5 100644 --- a/NHSE.Sprites/Field/FieldItemSpriteDrawer.cs +++ b/NHSE.Sprites/Field/FieldItemSpriteDrawer.cs @@ -60,7 +60,7 @@ private static void LoadPixelsFromLayer(FieldItemLayer layer, int x0, int y0, in } // non-allocation image generator - public static Bitmap GetBitmapLayerAcre(FieldItemLayer layer, int x0, int y0, int scale, int[] acre1, int[] acreScale, Bitmap dest) + public static Bitmap GetBitmapLayerAcre(FieldItemLayer layer, int x0, int y0, int scale, int[] acre1, int[] acreScale, Bitmap dest, int transparency = -1) { var w = layer.GridWidth; var h = layer.GridHeight; @@ -69,6 +69,9 @@ public static Bitmap GetBitmapLayerAcre(FieldItemLayer layer, int x0, int y0, in h *= scale; ImageUtil.ScalePixelImage(acre1, acreScale, w, h, scale); + if (transparency >> 24 != 0xFF) + ImageUtil.SetAllTransparencyTo(acreScale, transparency); + // draw symbols over special items now? DrawDirectionals(acreScale, layer, w, x0, y0, scale); @@ -185,9 +188,11 @@ public static Bitmap GetBitmapLayer(FieldItemLayer layer, int x, int y, int scal return DrawViewReticle(map, layer, x, y, scale); } - public static Bitmap GetBitmapLayer(FieldItemLayer layer, int x, int y, int[] data, Bitmap dest) + public static Bitmap GetBitmapLayer(FieldItemLayer layer, int x, int y, int[] data, Bitmap dest, int transparency = -1) { LoadBitmapLayer(layer.Tiles, data, layer.MapWidth, layer.MapHeight); + if (transparency >> 24 != 0xFF) + ImageUtil.SetAllTransparencyTo(data, transparency); ImageUtil.SetBitmapData(dest, data); return DrawViewReticle(dest, layer, x, y); } diff --git a/NHSE.Sprites/Field/TerrainSprite.cs b/NHSE.Sprites/Field/TerrainSprite.cs index c41b91e..451acc7 100644 --- a/NHSE.Sprites/Field/TerrainSprite.cs +++ b/NHSE.Sprites/Field/TerrainSprite.cs @@ -142,5 +142,23 @@ private static void GetBuildingCoordinate(MapGrid g, ushort bx, ushort by, int s x = (int) (((bx / 2f) - buildingShift) * scale); y = (int) (((by / 2f) - buildingShift) * scale); } + + public static Image GetAcre(in int topX, in int topY, TerrainManager terrain, int acreScale) + { + int[] data = new int[16 * 16]; + int index = 0; + for (int y = 0; y < 16; y++) + { + var yi = y + topY; + for (int x = 0; x < 16; x++, index++) + { + var tile = terrain.GetTile(x + topX, yi); + data[index] = GetTileColor(tile).ToArgb(); + } + } + + var final = ImageUtil.ScalePixelImage(data, acreScale, 16, 16, out int fw, out int fh); + return ImageUtil.GetBitmap(final, fw, fh); + } } } diff --git a/NHSE.Sprites/Util/ImageUtil.cs b/NHSE.Sprites/Util/ImageUtil.cs index a34b32c..26772fd 100644 --- a/NHSE.Sprites/Util/ImageUtil.cs +++ b/NHSE.Sprites/Util/ImageUtil.cs @@ -108,5 +108,14 @@ public static void ScalePixelImage(int[] data, int[] scaled, int fW, int fH, int Array.Copy(scaled, baseIndex, scaled, baseIndex + (y1 * fW), fW); } } + + /// + /// Sets a bitwise and of the requested transparency; this is assuming the pixel value is 0xFF_xx_xx_xx. Single operation laziness! + /// + public static void SetAllTransparencyTo(int[] data, int trans) + { + for (int i = 0; i < data.Length; i++) + data[i] &= trans; + } } } diff --git a/NHSE.WinForms/Subforms/Map/FieldItemEditor.Designer.cs b/NHSE.WinForms/Subforms/Map/FieldItemEditor.Designer.cs index f8930ae..652cb95 100644 --- a/NHSE.WinForms/Subforms/Map/FieldItemEditor.Designer.cs +++ b/NHSE.WinForms/Subforms/Map/FieldItemEditor.Designer.cs @@ -65,12 +65,14 @@ private void InitializeComponent() this.B_RemoveObjects = new System.Windows.Forms.Button(); this.GB_Remove = new System.Windows.Forms.GroupBox(); this.B_RemovePlacedItems = new System.Windows.Forms.Button(); + this.TR_Transparency = new System.Windows.Forms.TrackBar(); this.CM_Click.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.PB_Map)).BeginInit(); this.CM_Picture.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.NUD_Layer)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.PB_Acre)).BeginInit(); this.GB_Remove.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TR_Transparency)).BeginInit(); this.SuspendLayout(); // // B_Cancel @@ -420,11 +422,23 @@ private void InitializeComponent() this.B_RemovePlacedItems.UseVisualStyleBackColor = true; this.B_RemovePlacedItems.Click += new System.EventHandler(this.B_RemovePlacedItems_Click); // + // TR_Transparency + // + this.TR_Transparency.Location = new System.Drawing.Point(535, 250); + this.TR_Transparency.Maximum = 100; + this.TR_Transparency.Name = "TR_Transparency"; + this.TR_Transparency.Size = new System.Drawing.Size(226, 45); + this.TR_Transparency.TabIndex = 36; + this.TR_Transparency.TickFrequency = 10; + this.TR_Transparency.Value = 90; + this.TR_Transparency.Scroll += new System.EventHandler(this.TR_Transparency_Scroll); + // // FieldItemEditor // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(981, 537); + this.Controls.Add(this.TR_Transparency); this.Controls.Add(this.GB_Remove); this.Controls.Add(this.PB_Acre); this.Controls.Add(this.L_Layer); @@ -458,6 +472,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.NUD_Layer)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PB_Acre)).EndInit(); this.GB_Remove.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.TR_Transparency)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -499,5 +514,6 @@ private void InitializeComponent() private System.Windows.Forms.Button B_RemoveObjects; private System.Windows.Forms.GroupBox GB_Remove; private System.Windows.Forms.Button B_RemovePlacedItems; + private System.Windows.Forms.TrackBar TR_Transparency; } } \ No newline at end of file diff --git a/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs b/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs index e1c77a1..3f366a7 100644 --- a/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs +++ b/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs @@ -24,6 +24,8 @@ public partial class FieldItemEditor : Form private readonly int[] Map; private readonly Bitmap MapReticle; + private readonly TerrainManager Terrain; + private int X; private int Y; @@ -43,6 +45,9 @@ public FieldItemEditor(MainSave sav) Map = new int[l1.MapWidth * l1.MapHeight * MapScale * MapScale]; MapReticle = new Bitmap(l1.MapWidth * MapScale, l1.MapHeight * MapScale); + Terrain = new TerrainManager(sav.GetTerrain()); + PB_Map.BackgroundImage = TerrainSprite.CreateMap(Terrain, 2); + foreach (var acre in MapGrid.Acres) CB_Acre.Items.Add(acre.Name); @@ -65,19 +70,29 @@ private void ChangeViewToAcre(int acre) private void ReloadMap() { - PB_Map.Image = FieldItemSpriteDrawer.GetBitmapLayer(Layer, X, Y, Map, MapReticle); + var transparency = TR_Transparency.Value / 100d; + var t = ((int)(0xFF * transparency) << 24) | 0x00FF_FFFF; + PB_Map.Image = FieldItemSpriteDrawer.GetBitmapLayer(Layer, X, Y, Map, MapReticle, t); } private void LoadGrid(int topX, int topY) { ReloadGrid(Layer, topX, topY); + ReloadBackground(topX, topY); UpdateArrowVisibility(); ReloadMap(); } + private void ReloadBackground(int topX, int topY) + { + PB_Acre.BackgroundImage = TerrainSprite.GetAcre(topX/2, topY/2, Terrain, AcreScale * 2); + } + private void ReloadGrid(FieldItemLayer layer, int topX, int topY) { - PB_Acre.Image = FieldItemSpriteDrawer.GetBitmapLayerAcre(layer, topX, topY, AcreScale, Scale1, ScaleX, ScaleAcre); + var transparency = TR_Transparency.Value / 100d; + var t = ((int) (0xFF * transparency) << 24) | 0x00FF_FFFF; + PB_Acre.Image = FieldItemSpriteDrawer.GetBitmapLayerAcre(layer, topX, topY, AcreScale, Scale1, ScaleX, ScaleAcre, t); } private void UpdateArrowVisibility() @@ -179,7 +194,7 @@ private void B_Up_Click(object sender, EventArgs e) if (ModifierKeys != Keys.Shift) { if (Y != 0) - LoadGrid(X, --Y); + LoadGrid(X, Y -= 2); return; } @@ -191,7 +206,7 @@ private void B_Left_Click(object sender, EventArgs e) if (ModifierKeys != Keys.Shift) { if (X != 0) - LoadGrid(--X, Y); + LoadGrid(X -= 2, Y); return; } @@ -202,8 +217,8 @@ private void B_Right_Click(object sender, EventArgs e) { if (ModifierKeys != Keys.Shift) { - if (X != Layer.MapWidth - 1) - LoadGrid(++X, Y); + if (X != Layer.MapWidth - 2) + LoadGrid(X += 2, Y); return; } @@ -340,6 +355,8 @@ private void ClickMapAt(MouseEventArgs e, bool skipLagCheck) int mY = e.Y; bool centerReticle = CHK_SnapToAcre.Checked; GetViewAnchorCoordinates(mX, mY, out var x, out var y, centerReticle); + x &= 0xFFFE; + y &= 0xFFFE; var acre = layer.GetAcre(x, y); bool sameAcre = AcreIndex == acre; @@ -431,5 +448,11 @@ private void Remove(Control sender, Func removal) private void B_RemovePlacedItems_Click(object sender, EventArgs e) => Remove(B_RemovePlacedItems, Layer.RemoveAllPlacedItems); private void PG_Tile_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) => PG_Tile.SelectedObject = PG_Tile.SelectedObject; + + private void TR_Transparency_Scroll(object sender, EventArgs e) + { + ReloadGrid(Layer, X, Y); + ReloadMap(); + } } }