Skip to content

Commit 5af8a36

Browse files
committed
Merge branch 'mcc'
2 parents 612730c + cfdb53d commit 5af8a36

31 files changed

+4851
-5147
lines changed

TagTool/Ai/AiGlobalsDatum.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77

88
namespace TagTool.Ai
99
{
10-
[TagStructure(Size = 0x1B0, MaxVersion = CacheVersion.Halo3Retail)]
10+
[TagStructure(Size = 0x1B0, MaxVersion = CacheVersion.Halo3Retail, Platform = CachePlatform.Original)]
11+
[TagStructure(Size = 0xE4, MaxVersion = CacheVersion.Halo3Retail, Platform = CachePlatform.MCC)]
1112
[TagStructure(Size = 0x144, MinVersion = CacheVersion.Halo3ODST, MaxVersion = CacheVersion.HaloOnline700123)]
1213
[TagStructure(Size = 0x1B0, MinVersion = CacheVersion.HaloReach)]
1314
public class AiGlobalsDatum : TagStructure
@@ -17,36 +18,36 @@ public class AiGlobalsDatum : TagStructure
1718
public float AiInPlayerVehicleOnAiWeaponDamageScale; // [0,1] Global scale on weapon damage made by AI in a vehicle with the player on other AI
1819
public float DangerBroadlyFacing;
1920

20-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding)]
21+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
2122
public byte[] Padding;
2223

2324
public float DangerShootingNear;
2425

25-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding)]
26+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
2627
public byte[] Padding1;
2728

2829
public float DangerShootingAt;
2930

30-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding)]
31+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
3132
public byte[] Padding2;
3233

3334
public float DangerExtremelyClose;
3435

35-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding)]
36+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 4, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
3637
public byte[] Padding3;
3738

3839
public float DangerShieldDamage;
3940
public float DangerExtendedShieldDamage;
4041
public float DangerBodyDamage;
4142
public float DangerExtendedBodyDamage;
4243

43-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 48, Flags = TagFieldFlags.Padding)]
44+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 48, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
4445
public byte[] Padding4;
4546

4647
public CachedTag GlobalDialogue;
4748
public StringId DefaultMissionDialogueSoundEffect;
4849

49-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 20, Flags = TagFieldFlags.Padding)]
50+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 20, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
5051
public byte[] Padding5;
5152

5253
public float JumpDown; // wu/tick
@@ -56,7 +57,7 @@ public class AiGlobalsDatum : TagStructure
5657
public float JumpStorey; // wu/tick
5758
public float JumpTower; // wu/tick
5859

59-
[TagField(MinVersion = CacheVersion.HaloReach, Length = 0x4, Flags = TagFieldFlags.Padding)]
60+
[TagField(MinVersion = CacheVersion.HaloReach, Length = 0x4, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
6061
public byte[] ReachPadding;
6162

6263
public float MaxJumpDownHeightDown; // wu
@@ -66,14 +67,14 @@ public class AiGlobalsDatum : TagStructure
6667
public float MaxJumpDownHeightStorey; // wu
6768
public float MaxJumpDownHeightTower; // wu
6869

69-
[TagField(MinVersion = CacheVersion.HaloReach, Length = 0x4, Flags = TagFieldFlags.Padding)]
70+
[TagField(MinVersion = CacheVersion.HaloReach, Length = 0x4, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
7071
public byte[] ReachPadding1;
7172

7273
public Bounds<float> HoistStep;
7374
public Bounds<float> HoistCrouch;
7475
public Bounds<float> HoistStand;
7576

76-
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 24, Flags = TagFieldFlags.Padding)]
77+
[TagField(MaxVersion = CacheVersion.Halo3Retail, Length = 24, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
7778
public byte[] Padding6;
7879

7980
public Bounds<float> VaultStep; // wus
@@ -86,12 +87,12 @@ public class AiGlobalsDatum : TagStructure
8687
[TagField(MinVersion = CacheVersion.Halo3ODST)]
8788
public PathfindingSearchRangeStruct PathfindingSearchRanges;
8889

89-
[TagField(Flags = TagFieldFlags.Padding, Length = 48, MaxVersion = CacheVersion.Halo3Retail)]
90+
[TagField(Flags = TagFieldFlags.Padding, Length = 48, MaxVersion = CacheVersion.Halo3Retail, Platform = CachePlatform.Original)]
9091
public byte[] Padding7;
9192

9293
public List<GravemindPropertyBlock> GravemindProperties;
9394

94-
[TagField(Flags = TagFieldFlags.Padding, Length = 48, MaxVersion = CacheVersion.Halo3Retail)]
95+
[TagField(Flags = TagFieldFlags.Padding, Length = 48, MaxVersion = CacheVersion.Halo3Retail, Platform = CachePlatform.Original)]
9596
public byte[] Padding8;
9697

9798
public float ScaryTargetThreshold; // A target of this scariness is offically considered scary (by combat dialogue, etc.)
@@ -170,7 +171,7 @@ public class AiGlobalsDatum : TagStructure
170171
[TagField(MinVersion = CacheVersion.HaloReach)]
171172
public Bounds<short> SearchPatternCellsPerShellRange;
172173

173-
[TagField(MinVersion = CacheVersion.HaloReach, Length = 0x2, Flags = TagFieldFlags.Padding)]
174+
[TagField(MinVersion = CacheVersion.HaloReach, Length = 0x2, Flags = TagFieldFlags.Padding, Platform = CachePlatform.Original)]
174175
public byte[] ReachPadding2;
175176

176177
[TagStructure(Size = 0xC)]

TagTool/Ai/CharacterPreSearchProperties.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33

44
namespace TagTool.Ai
55
{
6-
[TagStructure(Size = 0x28)]
6+
[TagStructure(Size = 0x28, Platform = Cache.CachePlatform.Original)]
7+
[TagStructure(Size = 0x24, Platform = Cache.CachePlatform.MCC)]
78
public class CharacterPreSearchProperties : TagStructure
89
{
910
public CharacterPreSearchFlags Flags;
1011
public Bounds<float> MinimumPreSearchTime; // If the min presearch time expires and the target is (actually) outside the min-certainty radius, presearch turns off (seconds)
1112
public Bounds<float> MaximumPreSearchTime; // Presearch turns off after the given time (seconds)
1213
public float MinimumCertaintyRadius;
14+
[TagField(Platform = Cache.CachePlatform.Original)]
1315
public float DEPRECATED;
1416
public Bounds<float> MinimumSuppressingTime; // if the min suppressing time expires and the target is outside the min-certainty radius, suppressing fire turns off
1517
public short MaxSuppressCount; // the maximum number of guys allowed to be suppressing at one time

TagTool/Audio/FMOD/FMODSoundCache.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,32 @@ namespace TagTool.Audio
66
{
77
public class FMODSoundCache
88
{
9-
public DirectoryInfo Directory;
9+
public List<DirectoryInfo> Directories;
1010
public List<FMODSoundBank> LoadedBanks;
1111

12-
public FMODSoundCache(DirectoryInfo directory)
12+
public FMODSoundCache(List<DirectoryInfo> directories)
1313
{
14-
Directory = directory;
14+
Directories = directories;
1515
LoadedBanks = new List<FMODSoundBank>();
1616

1717
LoadBanks();
1818
}
1919

2020
private void LoadBanks()
2121
{
22-
LoadBank("sfx.fsb");
23-
LoadBank("english.fsb");
22+
foreach(var directory in Directories)
23+
{
24+
foreach (var file in directory.EnumerateFiles())
25+
{
26+
if (file.Extension == ".fsb")
27+
LoadBank(file);
28+
}
29+
}
2430
}
2531

26-
private void LoadBank(string name)
32+
private void LoadBank(FileInfo file)
2733
{
28-
var bankFile = new FileInfo(Path.Combine(Directory.FullName, name));
29-
LoadedBanks.Add(new FMODSoundBank(FMODTagTool.System, bankFile));
34+
LoadedBanks.Add(new FMODSoundBank(FMODTagTool.System, file));
3035
}
3136

3237
public int FindSound(uint hash, out FMODSoundBank outBank)

TagTool/Audio/FMOD/FMODSoundIndex.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using TagTool.Cache;
5+
using TagTool.Commands.Common;
56
using TagTool.IO;
67
using TagTool.Serialization;
78
using TagTool.Tags;
@@ -46,6 +47,11 @@ private void Load(Stream stream)
4647
while (!reader.EOF)
4748
{
4849
var info = deserializer.Deserialize<FMODSoundInfo>(dataContext);
50+
if(HashLookup.ContainsKey(info.Hash))
51+
{
52+
index++;
53+
continue;
54+
}
4955
HashLookup.Add(info.Hash, index);
5056
Sounds.Add(info);
5157
index++;

TagTool/Audio/SoundConverter.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using TagTool.Audio.Converter;
77
using TagTool.Cache;
88
using TagTool.Commands;
9+
using TagTool.Commands.Common;
910
using TagTool.Common;
1011
using TagTool.IO;
1112
using TagTool.Tags.Definitions;
@@ -204,10 +205,9 @@ public static BlamSound ConvertGen3Sound(GameCache cache, SoundCacheFileGestalt
204205
if (cache.Platform == CachePlatform.MCC)
205206
{
206207
var gen3Cache = (GameCacheGen3)cache;
207-
if (!gen3Cache.FMODSoundCacheDirectory.Exists)
208-
throw new DirectoryNotFoundException($"FMOD sound banks directory not found \"{gen3Cache.FMODSoundCacheDirectory.FullName}\"");
209-
210208
blamSound = GetSoundBankData(cache, soundGestalt, gen3Cache.FMODSoundCache, sound, pitchRangeIndex, permutationIndex);
209+
if(blamSound == null)
210+
throw new Exception($"Failed to find sound {tagName} permutation {permutationIndex} in FMOD sound cache!");
211211
var waveFile = new WAVFile(blamSound.Data, TagTool.Audio.Encoding.GetChannelCount(blamSound.Encoding), blamSound.SampleRate.GetSampleRateHz());
212212
using (var output = new EndianWriter(File.Create(WAVFileName)))
213213
waveFile.Write(output);
@@ -295,6 +295,8 @@ public static BlamSound GetSoundBankData(GameCache cache, SoundCacheFileGestalt
295295
int permutationGestaltIndex = soundGestalt.GetFirstPermutationIndex(pitchRangeGestaltIndex, cache.Platform) + permutationIndex;
296296
var permutation = soundGestalt.GetPermutation(permutationGestaltIndex);
297297
byte[] permutationData = fmodSoundCache.ExtractSound(permutation.FsbSoundHash);
298+
if (permutationData == null)
299+
return null;
298300
// TODO: update the rest of tagtool to handle pcm32
299301
permutationData = ConvertToPCM16(permutationData);
300302
var blamSound = new BlamSound(sound, permutationGestaltIndex, permutationData, cache.Version, soundGestalt);

TagTool/BlamFile/MapVariantGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ private VariantObjectDatum CreateDefaultPlacement()
465465
private bool ObjectIsEarlyMover(CachedTag tag)
466466
{
467467
var obje = _cache.Deserialize(_cacheStream, tag) as GameObject;
468-
return obje.ObjectFlags.HasFlag(ObjectDefinitionFlags.EarlyMoverLocalizedPhysics);
468+
return obje.ObjectFlags.Flags.HasFlag(ObjectFlags.EarlyMoverLocalizedPhysics);
469469
}
470470

471471
public bool ObjectIsForgeable(CachedTag tag)

TagTool/Cache/Gen3/GameCacheGen3.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class GameCacheGen3 : GameCache
2424
public TagCacheGen3 TagCacheGen3;
2525
public ResourceCacheGen3 ResourceCacheGen3;
2626

27-
public DirectoryInfo FMODSoundCacheDirectory;
27+
public List<DirectoryInfo> FMODSoundCacheDirectories = new List<DirectoryInfo>();
2828
public FMODSoundCache FMODSoundCache;
2929

3030
public override TagCache TagCache => TagCacheGen3;
@@ -129,21 +129,34 @@ public GameCacheGen3(MapFile mapFile, FileInfo file)
129129

130130
if(Platform == CachePlatform.MCC)
131131
{
132+
var game = Version.ToString().ToLower().Replace("retail", "");
133+
134+
//check if this is a mod
132135
if (CacheFile.Directory.FullName.Contains("steamapps\\workshop\\content"))
133136
{
134137
string root = CacheFile.Directory.FullName.Split(new string[] { "workshop" }, StringSplitOptions.None)[0];
135-
string game = "halo3";
136-
137-
if (Version != CacheVersion.Halo3Retail)
138-
game = Version.ToString();
139138

140-
FMODSoundCacheDirectory = new DirectoryInfo(Path.Combine(root, "common\\Halo The Master Chief Collection", game, "fmod\\pc"));
139+
DirectoryInfo mainDirectory = new DirectoryInfo(Path.Combine(root, "common\\Halo The Master Chief Collection", game, "fmod\\pc"));
140+
if (mainDirectory.Exists)
141+
FMODSoundCacheDirectories.Add(mainDirectory);
142+
else
143+
new TagToolWarning("Failed to find main mcc sound banks!");
141144
}
145+
146+
DirectoryInfo localDirectory = new DirectoryInfo(Path.Combine(CacheFile.Directory.FullName, "..", "fmod\\pc"));
147+
if (localDirectory.Exists)
148+
FMODSoundCacheDirectories.Add(localDirectory);
142149
else
143-
FMODSoundCacheDirectory = new DirectoryInfo(Path.Combine(CacheFile.Directory.FullName, @"..\fmod\pc"));
150+
{
151+
localDirectory = new DirectoryInfo(Path.Combine(CacheFile.Directory.FullName, "..", game, "fmod\\pc"));
152+
if (localDirectory.Exists)
153+
FMODSoundCacheDirectories.Add(localDirectory);
154+
}
155+
156+
if (FMODSoundCacheDirectories.Count == 0)
157+
new TagToolWarning("Failed to load any FMOD sound banks!");
144158

145-
if(FMODSoundCacheDirectory.Exists)
146-
FMODSoundCache = new FMODSoundCache(FMODSoundCacheDirectory);
159+
FMODSoundCache = new FMODSoundCache(FMODSoundCacheDirectories);
147160
}
148161
}
149162

TagTool/Cache/Gen3/StringIdResolverHalo3MCC.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ namespace TagTool.Cache
88
public class StringIdResolverHalo3MCC : StringIdResolver
99
{
1010
// These values were figured out through trial-and-error
11-
private static readonly int[] SetOffsets = { 0xD4F, 0x4C4, 0xB3E, 0xBD0, 0xC26, 0xC36, 0xC82, 0xCBB, 0xCCF, 0xCDC };
12-
private const int SetMin = 0x4C4; // Mininum index that goes in a set
11+
private static readonly int[] SetOffsets = { 0xD24, 0x499, 0xB13, 0xBA5, 0xBFB, 0xC0B, 0xC57, 0xC90, 0xCA4, 0xCB1 };
12+
private const int SetMin = 0x499; // Mininum index that goes in a set
1313
private const int SetMax = 0xFFFF; // Maximum index that goes in a set (Not in Halo 3?)
1414

1515
public StringIdResolverHalo3MCC()
1616
{
17-
LengthBits = 8;
18-
SetBits = 8;
19-
IndexBits = 16;
17+
LengthBits = 7;
18+
SetBits = 6;
19+
IndexBits = 19;
2020
}
2121

2222
public override int GetMinSetStringIndex()

TagTool/Cache/Gen3/TagCacheGen3.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ public TagCacheGen3(EndianReader reader, MapFile baseMapFile, StringTableGen3 st
262262
}
263263

264264
newReader.SeekTo(stringOffsets[i]);
265-
Instances[i].Name = newReader.ReadNullTerminatedString();
265+
Instances[i].Name = newReader.ReadNullTerminatedString().Replace(' ', '_');
266266
}
267267
}
268268

0 commit comments

Comments
 (0)