-
Notifications
You must be signed in to change notification settings - Fork 0
/
MinimapGenerator.cs
101 lines (85 loc) · 3.87 KB
/
MinimapGenerator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections.Generic;
using System.Drawing;
using GenieLib;
using War3Net.Build.Environment;
using War3Net.Build.Info;
using War3Net.Build.Providers;
using War3Net.Build.Widget;
namespace ScenarioConverter
{
public static class MinimapGenerator
{
private static readonly Dictionary<AoeTerrainType, Color> _colors;
static MinimapGenerator()
{
_colors = new Dictionary<AoeTerrainType, Color>();
_colors.Add(AoeTerrainType.Grass, Color.FromArgb(unchecked((int)0xFF339927)));
_colors.Add(AoeTerrainType.Water, Color.FromArgb(unchecked((int)0xFF007BBD)));
_colors.Add(AoeTerrainType.Beach, Color.FromArgb(unchecked((int)0xFFE1E372)));
_colors.Add(AoeTerrainType.Shallows, Color.FromArgb(unchecked((int)0xFF5492B0)));
_colors.Add(AoeTerrainType.Desert, Color.FromArgb(unchecked((int)0xFFEE9B5E)));
_colors.Add(AoeTerrainType.Forest, Color.FromArgb(unchecked((int)0xFF157615)));
_colors.Add(AoeTerrainType.PalmDesert, Color.FromArgb(unchecked((int)0xFFFFE094)));
_colors.Add(AoeTerrainType.PineForest, Color.FromArgb(unchecked((int)0xFF208020)));
_colors.Add(AoeTerrainType.Jungle, Color.FromArgb(unchecked((int)0xFF357615)));
_colors.Add(AoeTerrainType.DeepWater, Color.FromArgb(unchecked((int)0xFF003587)));
}
public static Bitmap Generate(ScenarioMap map)
{
return Generate(map, (tt) => _colors.TryGetValue(tt, out var color) ? color : Color.Black);
}
public static Bitmap Generate(ScenarioMap map, Func<AoeTerrainType, Color> palette)
{
var width = (int)map.width;
var height = (int)map.height;
var bitmap = new Bitmap(width, height);
for (var x = 0; x < width; x++)
{
for (var y = 0; y < height; y++)
{
bitmap.SetPixel(x, height - y - 1, palette(map.terrain[x, y].cnst));
}
}
return bitmap;
}
public static MapPreviewIcons GenerateIcons(MapInfo info, MapEnvironment environment, MapUnits units)
{
var padding = info.CameraBoundsComplements;
var minX = environment.Left + (128 * padding.Left);
var width = environment.Right - (128 * padding.Right) - minX;
var minY = environment.Bottom + (128 * padding.Bottom);
var height = environment.Top - (128 * padding.Top) - minY;
var ratio = width / height;
var sizeX = 255 * (ratio > 1 ? 1 : ratio);
var sizeY = 255 * (ratio > 1 ? 1 / ratio : 1);
var lowerX = 1 + (0.5f * (255 - sizeX));
var upperY = 1 + (0.5f * (255 + sizeY));
sizeX /= width;
sizeY /= height;
var icons = new List<PreviewIcon>();
if (units != null)
{
foreach (var unit in units.Units)
{
if (MapPreviewIconProvider.TryGetIcon(unit.TypeId, unit.OwnerId, out var iconType, out var iconColor))
{
icons.Add(new PreviewIcon()
{
IconType = iconType,
// X = (byte)(lowerX + (sizeX * (unit.Position.X - minX))),
// Y = (byte)(upperY - (sizeY * (unit.Position.Y - minY))),
X = (byte)(0.0f + lowerX + (sizeX * (unit.Position.X - minX))),
Y = (byte)(0.5f + upperY - (sizeY * (unit.Position.Y - minY))),
Color = iconColor,
});
}
}
}
return new MapPreviewIcons(MapPreviewIconsFormatVersion.Normal)
{
Icons = icons,
};
}
}
}