internal static ScriptsPlayers Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { var hasPlayerProperties = false; if (version > 1) { hasPlayerProperties = reader.ReadBooleanUInt32Checked(); } var numPlayers = reader.ReadUInt32(); var scriptPlayers = new ScriptsPlayer[numPlayers]; for (var i = 0; i < scriptPlayers.Length; i++) { scriptPlayers[i] = ScriptsPlayer.Parse(reader, context, hasPlayerProperties); } return new ScriptsPlayers { HasPlayerProperties = hasPlayerProperties, Players = scriptPlayers }; })); }
internal static ScriptOrCondition Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { var conditions = new List <ScriptCondition>(); ParseAssets(reader, context, assetName => { switch (assetName) { case ScriptCondition.AssetName: conditions.Add(ScriptCondition.Parse(reader, context)); break; default: throw new InvalidDataException($"Unexpected asset: {assetName}"); } }); return new ScriptOrCondition { Conditions = conditions.ToArray() }; })); }
private static ScbFile ParseScbData(BinaryReader reader) { var assetNames = AssetNameCollection.Parse(reader); var result = new ScbFile(); var context = new MapParseContext(assetNames); context.PushAsset(nameof(ScbFile), reader.BaseStream.Length); Asset.ParseAssets(reader, context, assetName => { switch (assetName) { case ScriptImportSize.AssetName: result.ScriptImportSize = ScriptImportSize.Parse(reader, context); break; case PlayerScriptsList.AssetName: result.PlayerScripts = PlayerScriptsList.Parse(reader, context); break; case NamedCameras.AssetName: result.NamedCameras = NamedCameras.Parse(reader, context); break; case CameraAnimationList.AssetName: result.CameraAnimationList = CameraAnimationList.Parse(reader, context); break; case ScriptsPlayers.AssetName: result.ScriptsPlayers = ScriptsPlayers.Parse(reader, context); break; case ObjectsList.AssetName: result.ObjectsList = ObjectsList.Parse(reader, context); break; case PolygonTriggers.AssetName: result.PolygonTriggers = PolygonTriggers.Parse(reader, context); break; case ScriptTeams.AssetName: result.Teams = ScriptTeams.Parse(reader, context); break; case WaypointsList.AssetName: result.WaypointsList = WaypointsList.Parse(reader, context); break; default: throw new InvalidDataException($"Unknown asset name: {assetName}"); } }); context.PopAsset(); return(result); }
internal static ScriptsPlayer Parse(BinaryReader reader, MapParseContext context, bool parseProperties) { return(new ScriptsPlayer() { Name = reader.ReadUInt16PrefixedAsciiString(), Properties = parseProperties ? AssetPropertyCollection.Parse(reader, context) : null }); }
internal static ScriptImportSize Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { return new ScriptImportSize { Unknown1 = reader.ReadUInt32(), Unknown2 = reader.ReadUInt32() }; })); }
internal static ScriptCondition Parse(BinaryReader reader, MapParseContext context) { return(Parse( reader, context, MinimumVersionThatHasInternalName, MinimumVersionThatHasEnabledFlag, (version, x) => { if (version >= MinimumVersionThatHasEnabledFlag) { x.IsInverted = reader.ReadBooleanUInt32Checked(); } })); }
internal static ScriptTeams Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { var teams = new List <Team>(); while (reader.BaseStream.Position < context.CurrentEndPosition) { teams.Add(Team.Parse(reader, context)); } return new ScriptTeams { Teams = teams.ToArray() }; })); }
internal static ScriptGroup Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { var name = reader.ReadUInt16PrefixedAsciiString(); var isActive = reader.ReadBooleanChecked(); var isSubroutine = reader.ReadBooleanChecked(); var scripts = new List <Script>(); var groups = new List <ScriptGroup>(); ParseAssets(reader, context, assetName => { switch (assetName) { case ScriptGroup.AssetName: if (version < 3) { goto default; } groups.Add(ScriptGroup.Parse(reader, context)); break; case Script.AssetName: scripts.Add(Script.Parse(reader, context)); break; default: throw new InvalidDataException($"Unexpected asset: {assetName}"); } }); return new ScriptGroup { Name = name, IsActive = isActive, IsSubroutine = isSubroutine, Scripts = scripts.ToArray(), Groups = groups.ToArray() }; })); }
internal static TDerived Parse( BinaryReader reader, MapParseContext context, ushort minimumVersionThatHasInternalName, ushort minimumVersionThatHasEnabledFlag, Action <ushort, TDerived> derivedParse = null) { return(ParseAsset(reader, context, version => { var result = new TDerived(); // TODO: Need to make game-specific TContentType enums. result.ContentType = (TContentType)(object)reader.ReadUInt32(); //result.ContentType = reader.ReadUInt32AsEnum<TContentType>(); if (version >= minimumVersionThatHasInternalName) { result.InternalName = AssetPropertyKey.Parse(reader, context); } var numArguments = reader.ReadUInt32(); result.Arguments = new ScriptArgument[numArguments]; for (var i = 0; i < numArguments; i++) { result.Arguments[i] = ScriptArgument.Parse(reader); } result.Enabled = true; if (version >= minimumVersionThatHasEnabledFlag) { result.Enabled = reader.ReadBooleanUInt32Checked(); } derivedParse?.Invoke(version, result); return result; })); }
internal static ScriptsPlayers Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { var unknown1 = 0u; if (version > 1) { unknown1 = reader.ReadUInt32(); if (unknown1 != 0) { throw new InvalidDataException(); } } var numPlayers = reader.ReadUInt32(); var unknown2 = reader.ReadUInt16(); if (unknown2 != 0) { throw new InvalidDataException(); } var playerNames = new string[numPlayers - 1]; for (var i = 0; i < playerNames.Length; i++) { playerNames[i] = reader.ReadUInt16PrefixedAsciiString(); } return new ScriptsPlayers { Unknown1 = unknown1, Unknown2 = unknown2, PlayerNames = playerNames }; })); }
internal static ScriptList Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { if (version != 1) { throw new InvalidDataException(); } var scriptGroups = new List <ScriptGroup>(); var scripts = new List <Script>(); ParseAssets(reader, context, assetName => { switch (assetName) { case ScriptGroup.AssetName: scriptGroups.Add(ScriptGroup.Parse(reader, context)); break; case Script.AssetName: scripts.Add(Script.Parse(reader, context)); break; default: throw new InvalidDataException($"Unexpected asset: {assetName}"); } }); return new ScriptList { ScriptGroups = scriptGroups.ToArray(), Scripts = scripts.ToArray() }; })); }
internal static ScriptsPlayers Parse(BinaryReader reader, MapParseContext context) { return(ParseAsset(reader, context, version => { var hasPlayerProperties = false; if (version > 1) { hasPlayerProperties = reader.ReadBooleanUInt32Checked(); } var numPlayers = reader.ReadUInt32(); ushort unknown = 0; if (version < 2) { unknown = reader.ReadUInt16(); if (unknown != 0) { throw new InvalidDataException(); } } var scriptPlayers = new ScriptsPlayer[numPlayers]; for (var i = 0; i < scriptPlayers.Length; i++) { scriptPlayers[i] = ScriptsPlayer.Parse(reader, context, hasPlayerProperties); } return new ScriptsPlayers { HasPlayerProperties = hasPlayerProperties, Unknown = unknown, Players = scriptPlayers }; })); }
internal static Script Parse(BinaryReader reader, MapParseContext context) { return ParseAsset(reader, context, version => { var result = new Script { Name = reader.ReadUInt16PrefixedAsciiString(), Comment = reader.ReadUInt16PrefixedAsciiString(), ConditionsComment = reader.ReadUInt16PrefixedAsciiString(), ActionsComment = reader.ReadUInt16PrefixedAsciiString(), IsActive = reader.ReadBooleanChecked(), DeactivateUponSuccess = reader.ReadBooleanChecked(), ActiveInEasy = reader.ReadBooleanChecked(), ActiveInMedium = reader.ReadBooleanChecked(), ActiveInHard = reader.ReadBooleanChecked(), IsSubroutine = reader.ReadBooleanChecked() }; if (version >= 2) { result.EvaluationInterval = reader.ReadUInt32(); if (version == 5) { result.UsesEvaluationIntervalType = reader.ReadBooleanChecked(); result.EvaluationIntervalType = reader.ReadUInt32AsEnum<EvaluationIntervalType>(); } else { result.EvaluationIntervalType = EvaluationIntervalType.FrameOrSeconds; } } if (version >= 3) { result.ActionsFireSequentially = reader.ReadBooleanChecked(); result.LoopActions = reader.ReadBooleanChecked(); result.LoopCount = reader.ReadInt32(); result.SequentialTargetType = reader.ReadByteAsEnum<SequentialScriptTarget>(); result.SequentialTargetName = reader.ReadUInt16PrefixedAsciiString(); } if (version >= 4) { result.Unknown = reader.ReadUInt16PrefixedAsciiString(); if (result.Unknown != "ALL" && result.Unknown != "Planning" && result.Unknown != "X") { throw new InvalidDataException(); } } if (version >= 6) { result.Unknown2 = reader.ReadInt32(); result.Unknown3 = reader.ReadUInt16(); if (result.Unknown3 != 0) { throw new InvalidDataException(); } } var orConditions = new List<ScriptOrCondition>(); var actionsIfTrue = new List<ScriptAction>(); var actionsIfFalse = new List<ScriptAction>(); ParseAssets(reader, context, assetName => { switch (assetName) { case ScriptOrCondition.AssetName: orConditions.Add(ScriptOrCondition.Parse(reader, context)); break; case ScriptAction.AssetNameTrue: actionsIfTrue.Add(ScriptAction.Parse(reader, context)); break; case ScriptAction.AssetNameFalse: actionsIfFalse.Add(ScriptAction.Parse(reader, context)); break; default: throw new InvalidDataException($"Unexpected asset: {assetName}"); } }); result.OrConditions = orConditions.ToArray(); result.ActionsIfTrue = actionsIfTrue.ToArray(); result.ActionsIfFalse = actionsIfFalse.ToArray(); return result; }); }
internal static ScriptAction Parse(BinaryReader reader, MapParseContext context) { return(Parse(reader, context, MinimumVersionThatHasInternalName, MinimumVersionThatHasEnabledFlag)); }