Skip to content

Commit 14530f1

Browse files
committed
Randomize oldworld/vectron access
1 parent b14c343 commit 14530f1

5 files changed

Lines changed: 101 additions & 54 deletions

Components/LiveSplit.SteamWorldDig.Randomizer.Updates.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<updates>
3+
<update version="1.2">
4+
<files>
5+
<file path="Components/LiveSplit.SteamWorldDig.Randomizer.dll" status="changed"/>
6+
</files>
7+
<changelog>
8+
<change>
9+
Randomize oldworld and vectron entries
10+
</change>
11+
</changelog>
12+
</update>
313
<update version="1.1">
414
<files>
515
<file path="Components/LiveSplit.SteamWorldDig.Randomizer.dll" status="changed"/>
1 KB
Binary file not shown.

LocationsCasual.cs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,46 +50,53 @@ public LocationsCasual() {
5050
Type = Location.RandomizeType.Area,
5151
},
5252
new Location
53+
{
54+
Name = "oldworld",
55+
Grant = "oldworld", // randomized
56+
Type = Location.RandomizeType.Area,
57+
CanAccess = have => CanBreak(have)
58+
},
59+
new Location
5360
{
5461
Name = "oldworld_cave_2",
5562
Grant = "oldworld_cave_2", // randomized
5663
Type = Location.RandomizeType.Area,
57-
CanAccess = have => CanBreak(have)
64+
CanAccess = have => have.Contains("oldworld")
5865
},
5966
new Location
6067
{
6168
Name = "oldworld_cave_dynamite",
6269
Grant = "oldworld_cave_dynamite", // randomized
6370
Type = Location.RandomizeType.Area,
64-
CanAccess = have => CanBreak(have)
71+
CanAccess = have => have.Contains("oldworld")
6572
},
6673
new Location
6774
{
6875
Name = "oldworld_cave_3",
6976
Grant = "oldworld_cave_3", // randomized
7077
Type = Location.RandomizeType.Area,
71-
CanAccess = have => CanBreak(have)
78+
CanAccess = have => have.Contains("oldworld")
7279
},
7380
new Location
7481
{
7582
Name = "oldworld_cave_4",
7683
Grant = "oldworld_cave_4", // randomized
7784
Type = Location.RandomizeType.Area,
78-
CanAccess = have => CanDrill(have)
85+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
7986
},
8087
new Location
8188
{
8289
Name = "oldworld_cave_steampunch",
8390
Grant = "oldworld_cave_steampunch", // randomized
8491
Type = Location.RandomizeType.Area,
85-
CanAccess = have => CanDrill(have)
92+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
8693
},
8794
new Location
8895
{
8996
Name = "oldworld_cave_falldampeners",
9097
Grant = "oldworld_cave_falldampeners", // randomized
9198
Type = Location.RandomizeType.Area,
92-
CanAccess = have => CanDrill(have)
99+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
93100
},
94101
new Location
95102
{
@@ -99,52 +106,60 @@ public LocationsCasual() {
99106
CanAccess = have => have.Contains("oldworld_cave_falldampeners") && have.Contains("enable_jump_double"),
100107
},
101108
new Location
109+
{
110+
Name = "vectron",
111+
Grant = "vectron", // randomized
112+
Type = Location.RandomizeType.Area,
113+
CanAccess = have => have.Contains("oldworld") && CanDrill(have) &&
114+
(have.Contains("enable_jump_double") || have.Contains("fall_dampeners"))
115+
},
116+
new Location
102117
{
103118
Name = "vectron_cave_1",
104119
Grant = "vectron_cave_1", // randomized
105120
Type = Location.RandomizeType.Area,
106-
CanAccess = have => CanDrill(have)
121+
CanAccess = have => have.Contains("vectron")
107122
},
108123
new Location
109124
{
110125
Name = "vectron_cave_minimap",
111126
Grant = "vectron_cave_minimap", // randomized
112127
Type = Location.RandomizeType.Area,
113-
CanAccess = have => CanDrill(have)
128+
CanAccess = have => have.Contains("vectron")
114129
},
115130
new Location
116131
{
117132
Name = "vectron_cave_2",
118133
Grant = "vectron_cave_2", // randomized
119134
Type = Location.RandomizeType.Area,
120-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1")
135+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1")
121136
},
122137
new Location
123138
{
124139
Name = "vectron_cave_staticdash",
125140
Grant = "vectron_cave_staticdash", // randomized
126141
Type = Location.RandomizeType.Area,
127-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1")
142+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1")
128143
},
129144
new Location
130145
{
131146
Name = "vectron_cave_4",
132147
Grant = "vectron_cave_4", // randomized
133148
Type = Location.RandomizeType.Area,
134-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
149+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
135150
},
136151
new Location
137152
{
138153
Name = "vectron_cave_generator_1",
139154
Grant = "vectron_cave_generator_1", // randomized
140155
Type = Location.RandomizeType.Area,
141-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
156+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
142157
},
143158
new Location
144159
{
145160
Name = "vectron_boss",
146161
Grant = "vectron_boss",
147-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2") &&
162+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2") &&
148163
have.Contains("archaea_generator") && have.Contains("oldworld_generator") && have.Contains("vectron_generator") &&
149164
have.Contains("enable_charge_jump")
150165
},

LocationsSpeedrunner.cs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,46 +50,53 @@ public LocationsSpeedrunner() {
5050
Type = Location.RandomizeType.Area,
5151
},
5252
new Location
53+
{
54+
Name = "oldworld",
55+
Grant = "oldworld", // randomized
56+
Type = Location.RandomizeType.Area,
57+
CanAccess = have => CanBreak(have)
58+
},
59+
new Location
5360
{
5461
Name = "oldworld_cave_2",
5562
Grant = "oldworld_cave_2", // randomized
5663
Type = Location.RandomizeType.Area,
57-
CanAccess = have => CanBreak(have)
64+
CanAccess = have => have.Contains("oldworld")
5865
},
5966
new Location
6067
{
6168
Name = "oldworld_cave_dynamite",
6269
Grant = "oldworld_cave_dynamite", // randomized
6370
Type = Location.RandomizeType.Area,
64-
CanAccess = have => CanBreak(have)
71+
CanAccess = have => have.Contains("oldworld")
6572
},
6673
new Location
6774
{
6875
Name = "oldworld_cave_3",
6976
Grant = "oldworld_cave_3", // randomized
7077
Type = Location.RandomizeType.Area,
71-
CanAccess = have => CanBreak(have)
78+
CanAccess = have => have.Contains("oldworld")
7279
},
7380
new Location
7481
{
7582
Name = "oldworld_cave_4",
7683
Grant = "oldworld_cave_4", // randomized
7784
Type = Location.RandomizeType.Area,
78-
CanAccess = have => CanDrill(have)
85+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
7986
},
8087
new Location
8188
{
8289
Name = "oldworld_cave_steampunch",
8390
Grant = "oldworld_cave_steampunch", // randomized
8491
Type = Location.RandomizeType.Area,
85-
CanAccess = have => CanDrill(have)
92+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
8693
},
8794
new Location
8895
{
8996
Name = "oldworld_cave_falldampeners",
9097
Grant = "oldworld_cave_falldampeners", // randomized
9198
Type = Location.RandomizeType.Area,
92-
CanAccess = have => CanDrill(have)
99+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
93100
},
94101
new Location
95102
{
@@ -99,52 +106,59 @@ public LocationsSpeedrunner() {
99106
CanAccess = have => have.Contains("oldworld_cave_falldampeners"),
100107
},
101108
new Location
109+
{
110+
Name = "vectron",
111+
Grant = "vectron", // randomized
112+
Type = Location.RandomizeType.Area,
113+
CanAccess = have => have.Contains("oldworld") && CanDrill(have)
114+
},
115+
new Location
102116
{
103117
Name = "vectron_cave_1",
104118
Grant = "vectron_cave_1", // randomized
105119
Type = Location.RandomizeType.Area,
106-
CanAccess = have => CanDrill(have)
120+
CanAccess = have => have.Contains("vectron")
107121
},
108122
new Location
109123
{
110124
Name = "vectron_cave_minimap",
111125
Grant = "vectron_cave_minimap", // randomized
112126
Type = Location.RandomizeType.Area,
113-
CanAccess = have => CanDrill(have)
127+
CanAccess = have => have.Contains("vectron")
114128
},
115129
new Location
116130
{
117131
Name = "vectron_cave_2",
118132
Grant = "vectron_cave_2", // randomized
119133
Type = Location.RandomizeType.Area,
120-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1")
134+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1")
121135
},
122136
new Location
123137
{
124138
Name = "vectron_cave_staticdash",
125139
Grant = "vectron_cave_staticdash", // randomized
126140
Type = Location.RandomizeType.Area,
127-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1")
141+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1")
128142
},
129143
new Location
130144
{
131145
Name = "vectron_cave_4",
132146
Grant = "vectron_cave_4", // randomized
133147
Type = Location.RandomizeType.Area,
134-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
148+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
135149
},
136150
new Location
137151
{
138152
Name = "vectron_cave_generator_1",
139153
Grant = "vectron_cave_generator_1", // randomized
140154
Type = Location.RandomizeType.Area,
141-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
155+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2")
142156
},
143157
new Location
144158
{
145159
Name = "vectron_boss",
146160
Grant = "vectron_boss",
147-
CanAccess = have => CanDrill(have) && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2") &&
161+
CanAccess = have => have.Contains("vectron") && have.Contains("vectron_barrier_1") && have.Contains("vectron_barrier_2") &&
148162
have.Contains("archaea_generator") && have.Contains("oldworld_generator") && have.Contains("vectron_generator") &&
149163
(have.Contains("enable_charge_jump") || have.Contains("enable_dynamite"))
150164
},

SteamWorldMemory.cs

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void SaveAllAreaEntries()
109109
List<IntPtr> areas_ptrs = FindAllAreaEntries();
110110
foreach (IntPtr ptr in areas_ptrs)
111111
{
112-
byte[] segment = Program.Read(ptr - 0x1C, 0x18);
112+
byte[] segment = Program.Read(ptr - 0x1C, 0x34);
113113
string key;
114114
if (Program.Read<int>(ptr - 0x0c) < 0x10)
115115
{
@@ -120,39 +120,29 @@ public void SaveAllAreaEntries()
120120
key = Program.ReadAscii((IntPtr)Program.Read<uint>(ptr - 0x1C));
121121
}
122122

123-
// Don't randomize the boss room and the generators
124-
if (!key.Contains("boss") && key != "oldworld")
123+
// Don't randomize the boss room
124+
if (!key.Contains("boss"))
125125
{
126126
areaSegments[key] = segment;
127127
areaPointers[key] = ptr - 0x1C;
128128
}
129129
}
130130
}
131131

132-
public string PrintAllAreaEntries()
133-
{
134-
StringBuilder sb = new StringBuilder();
135-
foreach (var ptr in areaPointers)
136-
{
137-
sb.Append(ptr.Key).Append(',');
138-
}
139-
if (sb.Length > 0)
140-
{
141-
sb.Length--;
142-
}
143-
return sb.ToString();
144-
}
145-
146132
public List<string> GetAreaNames()
147133
{
148134
List<string> areas = new List<string>(areaPointers.Keys);
149135
areas.Sort();
150136
return areas;
151137
}
152138

139+
public string PrintAllAreaEntries()
140+
{
141+
return String.Join(", ", GetAreaNames());
142+
}
143+
153144
public List<IntPtr> FindAllAreaExits()
154145
{
155-
// First locate all occurences of "[start]"
156146
List<IntPtr> areas = Program.FindAllSignatures("PlayerExit1");
157147
areas.AddRange(Program.FindAllSignatures("PlayerExit2"));
158148

@@ -186,6 +176,26 @@ public void SaveAllAreaExits()
186176
key = Program.ReadAscii((IntPtr)Program.Read<uint>(ptr + 0x40));
187177
}
188178

179+
// Special case: Vectron entry is marked as an exit, so inserting it in the entries
180+
if (key == "from_oldworld")
181+
{
182+
string to = Program.ReadAscii(ptr + 0x24);
183+
if (to == "vectron")
184+
{
185+
areaSegments["vectron"] = segment;
186+
areaPointers["vectron"] = ptr + 0x24;
187+
continue;
188+
}
189+
}
190+
191+
// Insert the vectron exit manually because we may not have inserted the vectron entry yet.
192+
if (key == "from_vectron")
193+
{
194+
exitSegments["vectron"] = segment;
195+
exitPointers["vectron"] = ptr + 0x24;
196+
continue;
197+
}
198+
189199
// Filter keys that are not "from_xxx" where xxx is an area entry
190200
foreach (var entryptr in areaPointers)
191201
{
@@ -199,18 +209,16 @@ public void SaveAllAreaExits()
199209
}
200210
}
201211

212+
public List<string> GetExitNames()
213+
{
214+
List<string> areas = new List<string>(exitPointers.Keys);
215+
areas.Sort();
216+
return areas;
217+
}
218+
202219
public string PrintAllAreaExits()
203220
{
204-
StringBuilder sb = new StringBuilder();
205-
foreach (var ptr in exitPointers)
206-
{
207-
sb.Append(ptr.Key).Append(',');
208-
}
209-
if (sb.Length > 0)
210-
{
211-
sb.Length--;
212-
}
213-
return sb.ToString();
221+
return String.Join(", ", GetExitNames());
214222
}
215223

216224
public void RandomizeArea(string oldArea, string newArea)

0 commit comments

Comments
 (0)