Skip to content

Commit 33c685d

Browse files
committed
Fixed input issues with a large amount of rules.
1 parent a104a28 commit 33c685d

4 files changed

Lines changed: 261 additions & 10 deletions

File tree

Deltinteger/Deltinteger/Elements/Rule.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,12 @@ public void Input(int numberOfRules, int position)
106106
}
107107

108108
// Close the rule
109+
/*
109110
InputSim.Press(Keys.Up, Wait.Short, 2);
110111
if (!IsGlobal)
111112
InputSim.Press(Keys.Up, Wait.Short, 2);
113+
*/
114+
InputSim.Press(Keys.Down, Wait.Short, Actions.Length + numberOfRules + 1);
112115

113116
InputSim.Press(Keys.Space, Wait.Short);
114117

Deltinteger/Deltinteger/Input.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ public static void EnableWindow(bool enable)
3636
User32.EnableWindow(Handle, enable);
3737
}
3838

39+
public static void ResetAllWindows()
40+
{
41+
Process[] processes = Process.GetProcessesByName("Overwatch");
42+
foreach (Process process in processes)
43+
User32.EnableWindow(process.MainWindowHandle, true);
44+
}
45+
3946
public static void NumberInput(double value)
4047
{
4148
CancelToken.ThrowIfCancellationRequested();

Deltinteger/Deltinteger/Program.cs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5+
using System.Text.RegularExpressions;
56
using System.Threading;
67
using System.Threading.Tasks;
78
using System.Diagnostics;
@@ -26,6 +27,7 @@ public class Program
2627

2728
static void Main(string[] args)
2829
{
30+
InputSim.ResetAllWindows();
2931
handler = new ConsoleEventDelegate(ConsoleEventCallback);
3032
SetConsoleCtrlHandler(handler, true);
3133

@@ -100,11 +102,11 @@ static void Script(string parseFile)
100102
if (prev != null)
101103
{
102104
Log.Write($"A previously compiled version of \"{scriptName}\" was found.");
103-
Log.Write(": Rules:");
105+
Log.Write("Rules:");
104106
foreach (var lastRule in prev.Rules)
105107
Console.WriteLine($" {lastRule.Name}");
106-
Log.Write(": Press [Y] to update the current workshop ruleset based off the changes since the last compilation. The workshop code must be the same as the rules above.");
107-
Log.Write(": Press [N] to regenerate the script. This requires the workshop's ruleset to be empty.");
108+
Log.Write("Press [Y] to update the current workshop ruleset based off the changes since the last compilation. The workshop code must be the same as the rules above.");
109+
Log.Write("Press [N] to regenerate the script. This requires the workshop's ruleset to be empty.");
108110
if (!YorN())
109111
prev = null;
110112
}
@@ -136,19 +138,19 @@ static void Script(string parseFile)
136138
if (previousIndex == -1)
137139
{
138140
// Create new rule
139-
InputLog.Write($"Creating rule \"{generatedRules[i].Name}\"");
141+
InputLog.Write($"({i}) Creating rule \"{generatedRules[i].Name}\"");
140142
ruleActions.Add(new RuleAction(generatedRules[i], i, true));
141143
}
142144
else if (previousIndex != i)
143145
{
144146
// Move existing rule
145-
InputLog.Write($"Moving rule \"{generatedRules[i].Name}\" from #{previousIndex} to #{i}.");
147+
InputLog.Write($"({i}) Moving rule \"{generatedRules[i].Name}\" from #{previousIndex} to #{i}.");
146148
ruleActions.Add(new RuleAction(generatedRules[i], previousIndex, i));
147149
numberOfRules++;
148150
}
149151
else
150152
{
151-
InputLog.Write($"Doing nothing to rule \"{generatedRules[i].Name}\"");
153+
InputLog.Write($"({i}) Doing nothing to rule \"{generatedRules[i].Name}\"");
152154
ruleActions.Add(new RuleAction(generatedRules[i], i, false));
153155
numberOfRules++;
154156
}
@@ -164,7 +166,34 @@ static void Script(string parseFile)
164166
Log.Write("The stopinput option in the config is set to true. During generation any user input sent to the Overwatch window will be ignored." +
165167
" After generation if you can't interact with the Overwatch window, start the executable directly then type \"fixinput\".", ConsoleColor.Black, ConsoleColor.Gray);
166168
Log.Write("Press Enter to start input.");
167-
Console.ReadLine();
169+
170+
List<int> breakAt = null;
171+
172+
var parameters = Regex.Matches(Console.ReadLine(), @"-([a-z]+)(=(.*))?");
173+
foreach (Match match in parameters)
174+
{
175+
string paramName = match.Groups[1].Value;
176+
string value = match.Groups.Count == 4 ? match.Groups[3].Value : null;
177+
178+
List<int> targetRules = null;
179+
180+
if (value != null)
181+
{
182+
targetRules = new List<int>();
183+
string[] rulesToDo = value.Split(',');
184+
185+
foreach (string ruleToDo in rulesToDo)
186+
if (int.TryParse(ruleToDo, out int set))
187+
targetRules.Add(set);
188+
}
189+
190+
if (paramName == "break")
191+
{
192+
breakAt = targetRules;
193+
}
194+
else
195+
Log.Write($"Unknown parameter {paramName}");
196+
}
168197

169198
while ((InputSim.OverwatchProcess = Process.GetProcessesByName("Overwatch").FirstOrDefault()) == null)
170199
{
@@ -201,6 +230,9 @@ static void Script(string parseFile)
201230
int index = 0;
202231
foreach (var action in ruleActions)
203232
{
233+
if (breakAt != null && breakAt.Contains(index))
234+
Debugger.Break();
235+
204236
if (action.RuleActionType == RuleActionType.Add)
205237
{
206238
selectedRule = ResetRuleNav(selectedRule);
@@ -332,9 +364,7 @@ static bool ConsoleEventCallback(int eventType)
332364
{
333365
if (eventType == 2)
334366
{
335-
Process[] processes = Process.GetProcessesByName("Overwatch");
336-
foreach (Process process in processes)
337-
User32.EnableWindow(process.MainWindowHandle, true);
367+
InputSim.ResetAllWindows();
338368
}
339369
return false;
340370
}

Examples/murder_mystery.del

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
usevar globalvar A;
2+
usevar playervar A;
3+
4+
/*
5+
6+
Murder Mystery!
7+
8+
*/
9+
10+
11+
// Team ID's
12+
define globalvar allyTeamID;
13+
define globalvar mafiaTeamID;
14+
define globalvar vampireTeamID; // Special event
15+
16+
// Role ID's
17+
define globalvar Hunter;
18+
define globalvar Detective;
19+
define globalvar Interrogator;
20+
define globalvar Tracker;
21+
define globalvar Doctor;
22+
define globalvar Observer;
23+
24+
define globalvar isInitialized;
25+
define globalvar gameTime;
26+
define globalvar gameIsOver;
27+
define globalvar numberOfMafia;
28+
define globalvar registeredPlayers;
29+
30+
// Special event data
31+
define globalvar event;
32+
define globalvar initalVampire;
33+
34+
define playervar team; // The team of a player.
35+
define playervar role; // The role of the player.
36+
define playervar cantHaveRole;
37+
38+
// Effects
39+
define playervar objectiveHud; // The player's objective.
40+
define playervar roleHud; // The hud that describes their role to the player.
41+
define playervar orbIdentifier; // The orb identifier
42+
define playervar teamHud; // The player name icon on the top right
43+
44+
rule: "Constants"
45+
{
46+
allyTeamID = 0;
47+
mafiaTeamID = 1;
48+
vampireTeamID = 2;
49+
50+
gameTime = 300;
51+
}
52+
53+
rule: "Setup Time"
54+
if (IsInSetup())
55+
{
56+
SetMatchTime(10);
57+
}
58+
59+
rule: "Initial Setup"
60+
if (!isInitialized)
61+
if (IsGameInProgress())
62+
{
63+
DisableCompletion();
64+
DisableScoring();
65+
SetMatchTime(gameTime);
66+
67+
if (NumberOfPlayers() > 1)
68+
{
69+
numberOfMafia = RoundToInteger(NumberOfPlayers() / 3.5);
70+
}
71+
72+
DestroyAllHudText();
73+
74+
// Make random players mafia
75+
RandomValuesInArray(AllPlayers(), numberOfMafia).team = mafiaTeamID;
76+
77+
// Choose random event
78+
event = RandomInteger(0, 3);
79+
80+
// Get an array of all players that were in the game when the game started.
81+
registeredPlayers = AllPlayers();
82+
83+
isInitialized = true;
84+
}
85+
86+
// Event setup
87+
rule: "Vampire Event Setup"
88+
if (isInitialized)
89+
if (event == 0)
90+
{
91+
// Choose a random vampire
92+
initalVampire = RandomValueInArray(AllPlayers());
93+
initalVampire.team = vampireTeamID;
94+
95+
BigMessage(AllPlayers(), <"warning: corrupt incoming!">);
96+
}
97+
98+
rule: "Choose town roles"
99+
Event.Ongoing_EachPlayer
100+
if (team == allyTeamID)
101+
{
102+
role = RandomInteger(1, 6);
103+
CreateHudText(EventPlayer(), <"Current objective: Find Allies and Enemies">,
104+
null, null, Location.Top, 0, Color.Green);
105+
objectiveHud = LastTextID();
106+
}
107+
108+
rule: "Choose mafia roles"
109+
Event.Ongoing_EachPlayer
110+
if (team == mafiaTeamID)
111+
{
112+
if (!cantHaveRole)
113+
{
114+
role = RandomInteger(-4, -1);
115+
}
116+
117+
CreateHudText(EventPlayer(), <"Current objective: Kill">,
118+
null, null, Location.Top, 0, Color.Red);
119+
objectiveHud = LastTextID();
120+
121+
CreateEffect(
122+
// Only allow the mafia players to see the effect.
123+
FilteredArray(AllPlayers(), gameIsOver | (CurrentArrayElement().team == mafiaTeamID)),
124+
Effect.Sphere,
125+
Color.Red,
126+
EyePosition() + Vector(0, 0.25, 0),
127+
0.25
128+
);
129+
130+
orbIdentifier = LastCreatedEntity();
131+
132+
CreateHudText(
133+
// Only allow the mafia players to see the hud text.
134+
FilteredArray(AllPlayers(), gameIsOver | (CurrentArrayElement().team == mafiaTeamID)),
135+
HeroIconString(),
136+
null,
137+
EventPlayer(),
138+
Location.Right
139+
);
140+
141+
teamHud = LastTextID();
142+
}
143+
144+
rule: "Role Setup: Hunter"
145+
Event.Ongoing_EachPlayer
146+
if (isInitialized)
147+
if (role == Hunter)
148+
{
149+
CreateHudText(EventPlayer(), <"Crouch near dead player -> find attacking player">,
150+
null, null, Location.Top, 0, Color.Green);
151+
roleHud = LastTextID();
152+
}
153+
154+
rule: "Role Setup: Detective"
155+
Event.Ongoing_EachPlayer
156+
if (isInitialized)
157+
if (role == Detective)
158+
{
159+
CreateHudText(EventPlayer(), <"Crouch near dead player -> find team">,
160+
null, null, Location.Top, 0, Color.Green);
161+
roleHud = LastTextID();
162+
}
163+
164+
rule: "Role Setup: Interrogator"
165+
Event.Ongoing_EachPlayer
166+
if (isInitialized)
167+
if (role == Interrogator)
168+
{
169+
CreateHudText(EventPlayer(), <"Crouch near player -> find team (<0> times = <1> team)", 3, true>,
170+
null, null, Location.Top, 0, Color.Green);
171+
roleHud = LastTextID();
172+
}
173+
174+
rule: "Role Setup: Tracker"
175+
Event.Ongoing_EachPlayer
176+
if (isInitialized)
177+
if (role == Tracker)
178+
{
179+
CreateHudText(EventPlayer(), <"Ability near player -> Connect alert">,
180+
null, null, Location.Top, 0, Color.Green);
181+
roleHud = LastTextID();
182+
}
183+
184+
rule: "Role Setup: Doctor"
185+
Event.Ongoing_EachPlayer
186+
if (isInitialized)
187+
if (role == Doctor)
188+
{
189+
CreateHudText(EventPlayer(), <"Crouch near dead player -> resurrect player">,
190+
null, null, Location.Top, 0, Color.Green);
191+
roleHud = LastTextID();
192+
}
193+
194+
rule: "Role Setup: Observer"
195+
Event.Ongoing_EachPlayer
196+
if (isInitialized)
197+
if (role == Observer)
198+
{
199+
CreateHudText(EventPlayer(), <"Ability -> Build in_view">,
200+
null, null, Location.Top, 0, Color.Green);
201+
roleHud = LastTextID();
202+
}
203+
204+
rule: "Slaughter innocent new players"
205+
Event.Ongoing_EachPlayer
206+
if (isInitialized)
207+
if (!ArrayContains(registeredPlayers, EventPlayer()))
208+
{
209+
Kill();
210+
CreateHudText(EventPlayer(), <"Waiting form next_game">);
211+
}

0 commit comments

Comments
 (0)