Skip to content

Commit 717d787

Browse files
committed
add Repick menu
1 parent c4d6ff1 commit 717d787

File tree

6 files changed

+111
-22
lines changed

6 files changed

+111
-22
lines changed

src/dsstats.maui/dsstats.builder/dsstats.builder/BuildArea.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ public class BuildArea
2424
new RlPoint(171, 146), // Bottom
2525
];
2626
private Dictionary<string, HashSet<RlPoint>> units = [];
27+
private int team = 0;
2728

2829
public BuildArea(int team)
2930
{
31+
this.team = team;
3032
polygon = team == 1 ? polygon1 : polygon2;
3133
}
3234

@@ -38,6 +40,7 @@ public List<InputEvent> GetBuildEvents(ScreenArea screenArea, CmdrBuild build)
3840
.OrderBy(o => o.X).ThenBy(t => t.Y)
3941
.Select(pos => new BuildUnit(unit.Key, pos)))
4042
.ToList();
43+
int worker = team == 1 ? 0x31 : 0x32;
4144

4245
if (allUnits.Count == 0)
4346
{
@@ -82,7 +85,7 @@ public List<InputEvent> GetBuildEvents(ScreenArea screenArea, CmdrBuild build)
8285
if (bottomUnits.Count > 0)
8386
{
8487
Console.WriteLine($"bottom units: {bottomUnits.Count}");
85-
events.AddRange(DsBuilder.ScrollCenter());
88+
events.AddRange(DsBuilder.ScrollCenter(worker));
8689
events.Add(new(InputType.KeyPress, 0, 0, 0x51, 5)); // Build Menu
8790
events.AddRange(DsBuilder.ScrollY(Convert.ToInt32(-500 * screenArea._scaleY), screenArea.GetCenter()));
8891
foreach (var bottomUnit in bottomUnits)

src/dsstats.maui/dsstats.builder/dsstats.builder/Builds/TerranBuild.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public TerranBuild()
2323
{ "WidowMine", new('z', true) },
2424
{ "Liberator", new('x') },
2525
{ "Thor", new('c', true, true) },
26-
{ "ThorExplosive", new('c', true, true) },
26+
{ "ThorExplosive", new('c', true) },
2727
{ "Battlecruiser", new('v') },
2828
};
2929

src/dsstats.maui/dsstats.builder/dsstats.builder/DsBuilder.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ public static List<InputEvent> BuildArmy(Commander commander, int screenWidth, i
2929
events.AddRange(EnterString("Clear"));
3030
events.AddRange(EnterString($"Enemy {commander}"));
3131

32-
// rebind worker
33-
events.Add(new(InputType.MouseClick, screenWidth / 2, screenHeight / 2, 0, DelayMs)); // TODO
34-
events.Add(new(InputType.KeyPress, 0, 0, 0x32, DelayMs, false, false, true));
32+
3533
}
3634

3735
events.Add(new(InputType.KeyPress, 0, 0, 0x51, DelayMs));
@@ -46,6 +44,8 @@ public static void Build(SpawnDto spawn, Commander commander, int team)
4644
Thread.Sleep(2500);
4745
int screenWidth = User32Wrapper.GetSystemMetrics(User32Wrapper.SM_CXSCREEN);
4846
int screenHeight = User32Wrapper.GetSystemMetrics(User32Wrapper.SM_CYSCREEN);
47+
var screenArea = new ScreenArea(team, screenWidth, screenHeight);
48+
4949
var build = CmdrBuildFactory.Create(commander);
5050
if (build is null)
5151
{
@@ -67,20 +67,21 @@ public static void Build(SpawnDto spawn, Commander commander, int team)
6767

6868
// setup
6969
events.AddRange(EnterString("Infinite"));
70+
events.AddRange(EnterString("Tier"));
7071
events.AddRange(EnterString("Clear"));
71-
events.AddRange(EnterString($"Enemy {commander}"));
72+
events.AddRange(RepickMenu.PickCommander(commander, team, screenArea));
7273

7374
// build
7475
events.Add(new(InputType.KeyPress, 0, 0, 0x51, DelayMs));
7576

76-
events.AddRange(GetBuildEvents(spawn, build, team, screenWidth, screenHeight));
77+
events.AddRange(GetBuildEvents(spawn, build, team, screenArea));
7778
BuildPlayer.ReplayInput(events);
7879
}
7980

80-
private static List<InputEvent> GetBuildEvents(SpawnDto spawn, CmdrBuild build, int team, int screenWidth, int screenHeight)
81+
private static List<InputEvent> GetBuildEvents(SpawnDto spawn, CmdrBuild build, int team, ScreenArea screenArea)
8182
{
8283
var buildArea = new BuildArea(team);
83-
var screenArea = new ScreenArea(team, screenWidth, screenHeight);
84+
8485
foreach (var unit in spawn.Units)
8586
{
8687
buildArea.PlaceUnits(unit.Unit.Name, unit.Poss, team);
@@ -153,7 +154,7 @@ public static List<InputEvent> ScrollY(int offsetY, RlPoint center)
153154
return events;
154155
}
155156

156-
private static List<InputEvent> EnterString(string msg)
157+
public static List<InputEvent> EnterString(string msg)
157158
{
158159
List<InputEvent> events = [];
159160
events.Add(new(InputType.KeyPress, 0, 0, User32Wrapper.VK_RETURN, DelayMs));
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using dsstats.shared;
2+
3+
namespace dsstats.builder;
4+
5+
public static class RepickMenu
6+
{
7+
// Repick Menu
8+
// 5 rows, 5 columns
9+
// Protoss Terran Zerg Empty Empty
10+
// Stettmann Mengsk Empty Empty Empty
11+
// Artanis Vorazun Karax Alarak Fenix
12+
// Raynor Swann Nova Horner Tychus
13+
// Kerrigan Zagara Abathur Stukov Dehaka
14+
15+
private static RlPoint topLeft = new(2063, 948);
16+
private static RlPoint bottomRight = new(2512, 1400);
17+
18+
19+
// TODO: Stettmann & Mengsk (no hotkey)
20+
21+
public static List<InputEvent> PickCommander(Commander commander, int team, ScreenArea screenArea)
22+
{
23+
var events = new List<InputEvent>();
24+
int worker = team == 1 ? 0x31 : 0x32;
25+
if (commander == Commander.None) return events;
26+
27+
if (team == 1)
28+
{
29+
// Map commander to grid position
30+
int row = 0, col = 0;
31+
switch (commander)
32+
{
33+
case Commander.Protoss: row = 0; col = 0; break;
34+
case Commander.Terran: row = 0; col = 1; break;
35+
case Commander.Zerg: row = 0; col = 2; break;
36+
case Commander.Stetmann: row = 1; col = 0; break;
37+
case Commander.Mengsk: row = 1; col = 1; break;
38+
case Commander.Artanis: row = 2; col = 0; break;
39+
case Commander.Vorazun: row = 2; col = 1; break;
40+
case Commander.Karax: row = 2; col = 2; break;
41+
case Commander.Alarak: row = 2; col = 3; break;
42+
case Commander.Fenix: row = 2; col = 4; break;
43+
case Commander.Raynor: row = 3; col = 0; break;
44+
case Commander.Swann: row = 3; col = 1; break;
45+
case Commander.Nova: row = 3; col = 2; break;
46+
case Commander.Horner: row = 3; col = 3; break;
47+
case Commander.Tychus: row = 3; col = 4; break;
48+
case Commander.Kerrigan: row = 4; col = 0; break;
49+
case Commander.Zagara: row = 4; col = 1; break;
50+
case Commander.Abathur: row = 4; col = 2; break;
51+
case Commander.Stukov: row = 4; col = 3; break;
52+
case Commander.Dehaka: row = 4; col = 4; break;
53+
}
54+
// Calculate grid cell dimensions
55+
int cellWidth = (bottomRight.X - topLeft.X) / 5;
56+
int cellHeight = (bottomRight.Y - topLeft.Y) / 5;
57+
// Compute screen point (center of cell)
58+
int xCenterCellPoint =
59+
topLeft.X + cellWidth * col + cellWidth / 2;
60+
int yCenterCellPoint =
61+
topLeft.Y + cellHeight * row + cellHeight / 2;
62+
RlPoint screenPoint = new(xCenterCellPoint, yCenterCellPoint);
63+
var relativeScreenPoint = screenArea.ApplyTransforms(screenPoint);
64+
events.AddRange(DsBuilder.EnterString("Repick"));
65+
events.Add(new InputEvent(InputType.MouseClick, relativeScreenPoint.X, relativeScreenPoint.Y, 0, 10));
66+
}
67+
else
68+
{
69+
events.AddRange(DsBuilder.EnterString($"Enemy {commander}"));
70+
}
71+
// rebind worker
72+
var center = screenArea.GetCenter();
73+
events.Add(new(InputType.MouseClick, center.X, center.Y, 0, 100));
74+
events.Add(new(InputType.KeyPress, 0, 0, worker, 200, false, false, true));
75+
return events;
76+
}
77+
}

src/dsstats.maui/dsstats.builder/dsstats.builder/ScreenArea.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@ public class ScreenArea
2828
new RlPoint(1469, 1503), // Bottom
2929
];
3030

31+
private RlPoint center = RlPoint.Zero;
32+
private RlPoint center2 = new(1278, 581);
33+
private RlPoint center1 = new(1410, 470);
3134

3235
public ScreenArea(int team, int screenWidth, int screenHeight)
3336
{
3437
polygon = team == 1 ? polygon1 : polygon2;
38+
center = team == 1 ? center1 : center2;
3539
_scaleX = screenWidth / 2560f;
3640
_scaleY = screenHeight / 1440f;
3741
this.screenWidth = screenWidth;
@@ -54,15 +58,7 @@ public RlPoint ApplyTransforms(RlPoint point)
5458

5559
public RlPoint GetCenter()
5660
{
57-
var transformedPolygon = polygon
58-
.Select(s => ApplyTransforms(s))
59-
.ToList();
60-
61-
int sumX = transformedPolygon.Sum(p => p.X);
62-
int sumY = transformedPolygon.Sum(p => p.Y);
63-
int count = transformedPolygon.Count;
64-
65-
return new(sumX / count, sumY / count);
61+
return ApplyTransforms(center);
6662
}
6763

6864
/// <summary>

src/dsstats.razorlib/Modals/BuildModal.razor

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
@using Microsoft.JSInterop
1+
@using Blazored.Toast.Services
2+
@using Microsoft.JSInterop
23
@using dsstats.shared
34
@using dsstats.shared.Interfaces
45
@inject IJSRuntime JSRuntime
56
@inject IRemoteToggleService RemoteToggleService
7+
@inject IToastService ToastService
68

79
<div class="modal" id="buildmodal" tabindex="-1" aria-labelledby="buildmodalLabel" aria-hidden="true">
810
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
@@ -45,9 +47,19 @@
4547
Commander commander = Commander.None;
4648
int team = 0;
4749

48-
private void StartBuild()
50+
private async void StartBuild()
4951
{
50-
RemoteToggleService.Build(spawn, commander, team);
52+
try
53+
{
54+
await Task.Run(() =>
55+
{
56+
RemoteToggleService.Build(spawn, commander, team);
57+
});
58+
}
59+
finally
60+
{
61+
ToastService.ShowInfo("Build completed.");
62+
}
5163
}
5264

5365

0 commit comments

Comments
 (0)