Skip to content

Commit f9df8c2

Browse files
committed
Added parsing occupancy OccupancyGroup to RegionView Subfile
1 parent 10dc2ce commit f9df8c2

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed

SC4Parser/Constants.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,53 @@ public class Constants
163163
{0x0A, "One Way Road"},
164164
};
165165

166+
/// <summary>
167+
/// Different occupancy groups that appear in the RegionView Subfile. Ordered by the index that they appear at.
168+
/// </summary>
169+
public static Dictionary<int, string> OCCUPANCY_GROUPS = new Dictionary<int, string>()
170+
{
171+
{0, "Max Residential Population"},
172+
{1, "R$ Max Population"},
173+
{2, "R$ Current Population"},
174+
{3, "R$$ Max Population"},
175+
{4, "R$$ Current Population"},
176+
{5, "R$$$ Max Population"},
177+
{6, "R$$$ Current Population"},
178+
{7, "R$ Jobs"},
179+
{8, "R$$ Jobs"},
180+
{9, "R$$$ Jobs"},
181+
{10, "R$ Workforce EQ1"},
182+
{11, "R$ Workforce EQ2"},
183+
{12, "R$ Workforce EQ3"},
184+
{13, "R$ Workforce EQ4"},
185+
{14, "R$$ Workforce EQ1"},
186+
{15, "R$$ Workforce EQ2"},
187+
{16, "R$$ Workforce EQ3"},
188+
{17, "R$$ Workforce EQ4"},
189+
{18, "R$$$ Workforce EQ1"},
190+
{19, "R$$$ Workforce EQ2"},
191+
{20, "R$$$ Workforce EQ3"},
192+
{21, "R$$$ Workforce EQ4"},
193+
{22, "CS$ Max Jobs"},
194+
{23, "CS$ Cur Jobs"},
195+
{24, "CS$$ Max Jobs"},
196+
{25, "CS$$ Cur Jobs"},
197+
{26, "CS$$$ Max Jobs"},
198+
{27, "CS$$$ Cur Jobs"},
199+
{28, "CO$$ Max Jobs"},
200+
{29, "CO$$ Cur Jobs"},
201+
{30, "CO$$$ Max Jobs"},
202+
{31, "CO$$$ Cur Jobs"},
203+
{32, "IA Max Jobs"},
204+
{33, "IA Cur Jobs"},
205+
{34, "ID Max Jobs"},
206+
{35, "ID Cur Jobs"},
207+
{36, "IM Max Jobs"},
208+
{37, "IM Cur Jobs"},
209+
{38, "IH Max Jobs"},
210+
{39, "IH Cur Jobs"}
211+
};
212+
166213
/// <summary>
167214
/// Low density residential zone type
168215
/// </summary>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
3+
namespace SC4Parser
4+
{
5+
public class OccupancyGroup
6+
{
7+
public int Index { get; private set; }
8+
public uint GroupId { get; private set; }
9+
public uint Population { get; private set; }
10+
public string Name { get; private set; }
11+
12+
/// <summary>
13+
/// Constructs a Occupancy group
14+
/// </summary>
15+
/// <param name="index"></param>
16+
/// <param name="name"></param>
17+
/// <param name="groupId"></param>
18+
/// <param name="population"></param>
19+
/// <remarks>Intended to be used as part of the RegionView Subfile</remarks>
20+
public OccupancyGroup(int index, string name, uint groupId, uint population)
21+
{
22+
Index = index;
23+
GroupId = groupId;
24+
Population = population;
25+
Name = name;
26+
}
27+
28+
public void Dump()
29+
{
30+
Console.WriteLine("Index={0} Name=\"{1}\" GroupId=0x{2} Population={3}",
31+
Index,
32+
Name,
33+
GroupId.ToString("x2"),
34+
Population);
35+
}
36+
}
37+
}

SC4Parser/SubFiles/RegionViewSubfile.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Text;
34

45
using SC4Parser.Logging;
@@ -128,6 +129,20 @@ public class RegionViewSubfile
128129
/// City description
129130
/// </summary>
130131
public string InternalDescription { get; private set; }
132+
/// <summary>
133+
/// Length of default mayor name
134+
/// </summary>
135+
public uint DefaultMayorNameLength { get; private set; }
136+
/// <summary>
137+
/// Default mayor name (usually "Jonas Sparks")
138+
/// </summary>
139+
public string DefaultMayorName { get; private set; }
140+
public uint CurrentOccupancyGroupCount{ get; private set; }
141+
public List<OccupancyGroup> OccupancyGroupsCurrent = new List<OccupancyGroup>();
142+
public uint MaxOccupancyGroupCount { get; private set; }
143+
public List<OccupancyGroup> OccupancyGroupsMax = new List<OccupancyGroup>();
144+
public uint LimitsOccupancyGroupCount { get; private set; }
145+
public List<OccupancyGroup> OccupancyGroupsLimits = new List<OccupancyGroup>();
131146

132147
/// <summary>
133148
/// Parses Region View Subfile from a byte array
@@ -142,6 +157,7 @@ public void Parse(byte[] buffer)
142157

143158
Logger.Log(LogLevel.Info, "Parsing RegionView subfile...");
144159

160+
// TODO: Convert to BinaryReader (yeah I know..)
145161
MajorVersion = BitConverter.ToUInt16(Extensions.ReadBytes(buffer, 2, ref internalOffset), 0);
146162
MinorVersion = BitConverter.ToUInt16(Extensions.ReadBytes(buffer, 2, ref internalOffset), 0);
147163

@@ -175,6 +191,34 @@ public void Parse(byte[] buffer)
175191
MayorName = Encoding.ASCII.GetString(Extensions.ReadBytes(buffer, MayorNameLength, ref internalOffset));
176192
InternalDescriptionLength = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
177193
InternalDescription = Encoding.ASCII.GetString(Extensions.ReadBytes(buffer, InternalDescriptionLength, ref internalOffset));
194+
DefaultMayorNameLength = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
195+
DefaultMayorName = Encoding.ASCII.GetString(Extensions.ReadBytes(buffer, DefaultMayorNameLength, ref internalOffset));
196+
internalOffset += (4 * 6); // Skip over 6 unused uints
197+
198+
// Parse Occupant Group info
199+
CurrentOccupancyGroupCount = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
200+
for (int i = 0; i < CurrentOccupancyGroupCount; i++)
201+
{
202+
uint group = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
203+
uint pop = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
204+
OccupancyGroupsCurrent.Add(new OccupancyGroup(i, Constants.OCCUPANCY_GROUPS[i], group, pop));
205+
}
206+
207+
LimitsOccupancyGroupCount = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
208+
for (int i = 0; i < LimitsOccupancyGroupCount; i++)
209+
{
210+
uint group = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
211+
uint pop = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
212+
OccupancyGroupsMax.Add(new OccupancyGroup(i, Constants.OCCUPANCY_GROUPS[i], group, pop));
213+
}
214+
215+
MaxOccupancyGroupCount = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
216+
for (int i = 0; i < MaxOccupancyGroupCount; i++)
217+
{
218+
uint group = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
219+
uint pop = BitConverter.ToUInt32(Extensions.ReadBytes(buffer, 4, ref internalOffset), 0);
220+
OccupancyGroupsLimits.Add(new OccupancyGroup(i, Constants.OCCUPANCY_GROUPS[i], group, pop));
221+
}
178222

179223
Logger.Log(LogLevel.Info, "RegionView subfile parsed");
180224
}
@@ -206,6 +250,23 @@ public void Dump()
206250
Console.WriteLine("Mayor Name: {0}", MayorName);
207251
Console.WriteLine("Internal Description Length: {0}", InternalDescriptionLength);
208252
Console.WriteLine("Internal Description: {0}", InternalDescription);
253+
Console.WriteLine("Default Mayor Name Length: {0}", DefaultMayorNameLength);
254+
Console.WriteLine("Default Mayor Name: {0}", DefaultMayorName);
255+
Console.WriteLine("Current Occupancy Group Count: {0}", CurrentOccupancyGroupCount);
256+
foreach (OccupancyGroup group in OccupancyGroupsCurrent)
257+
{
258+
group.Dump();
259+
}
260+
Console.WriteLine("Max Occupancy Group Count: {0}", MaxOccupancyGroupCount);
261+
foreach (OccupancyGroup group in OccupancyGroupsMax)
262+
{
263+
group.Dump();
264+
}
265+
Console.WriteLine("Limits Occupancy Group Count: {0}", LimitsOccupancyGroupCount);
266+
foreach (OccupancyGroup group in OccupancyGroupsLimits)
267+
{
268+
group.Dump();
269+
}
209270
}
210271
}
211272
}

0 commit comments

Comments
 (0)