Exemplo n.º 1
0
        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
                };
            }));
        }
Exemplo n.º 2
0
        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()
                };
            }));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
 internal static ScriptsPlayer Parse(BinaryReader reader, MapParseContext context, bool parseProperties)
 {
     return(new ScriptsPlayer()
     {
         Name = reader.ReadUInt16PrefixedAsciiString(),
         Properties = parseProperties ? AssetPropertyCollection.Parse(reader, context) : null
     });
 }
Exemplo n.º 5
0
 internal static ScriptImportSize Parse(BinaryReader reader, MapParseContext context)
 {
     return(ParseAsset(reader, context, version =>
     {
         return new ScriptImportSize
         {
             Unknown1 = reader.ReadUInt32(),
             Unknown2 = reader.ReadUInt32()
         };
     }));
 }
Exemplo n.º 6
0
 internal static ScriptCondition Parse(BinaryReader reader, MapParseContext context)
 {
     return(Parse(
                reader,
                context,
                MinimumVersionThatHasInternalName,
                MinimumVersionThatHasEnabledFlag,
                (version, x) =>
     {
         if (version >= MinimumVersionThatHasEnabledFlag)
         {
             x.IsInverted = reader.ReadBooleanUInt32Checked();
         }
     }));
 }
Exemplo n.º 7
0
        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()
                };
            }));
        }
Exemplo n.º 8
0
        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()
                };
            }));
        }
Exemplo n.º 9
0
        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;
            }));
        }
Exemplo n.º 10
0
        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
                };
            }));
        }
Exemplo n.º 11
0
        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()
                };
            }));
        }
Exemplo n.º 12
0
        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
                };
            }));
        }
Exemplo n.º 13
0
        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;
            });
        }
Exemplo n.º 14
0
 internal static ScriptAction Parse(BinaryReader reader, MapParseContext context)
 {
     return(Parse(reader, context, MinimumVersionThatHasInternalName, MinimumVersionThatHasEnabledFlag));
 }