public static TypeSyntax ScriptTypeSyntax(ScriptDataType dataType) { return(dataType switch { ScriptDataType.Float => PredefinedType(Token(SyntaxKind.FloatKeyword)), ScriptDataType.Int => PredefinedType(Token(SyntaxKind.IntKeyword)), ScriptDataType.Boolean => PredefinedType(Token(SyntaxKind.BoolKeyword)), ScriptDataType.Short => PredefinedType(Token(SyntaxKind.IntKeyword)), ScriptDataType.String => PredefinedType(Token(SyntaxKind.StringKeyword)), ScriptDataType.Void => PredefinedType(Token(SyntaxKind.VoidKeyword)), ScriptDataType.Trigger => ParseTypeName(nameof(ITriggerVolume)), ScriptDataType.LocationFlag => ParseTypeName(nameof(ILocationFlag)), ScriptDataType.CameraPathTarget => ParseTypeName(nameof(ICameraPathTarget)), ScriptDataType.CinematicTitle => ParseTypeName(nameof(ICinematicTitle)), ScriptDataType.DeviceGroup => ParseTypeName(nameof(IDeviceGroup)), ScriptDataType.AIScript => ParseTypeName(nameof(IAiScript)), ScriptDataType.AIOrders => ParseTypeName(nameof(IAiOrders)), ScriptDataType.StartingProfile => ParseTypeName(nameof(IStartingProfile)), ScriptDataType.Scenery => ParseTypeName(nameof(IScenery)), ScriptDataType.Bsp => ParseTypeName(nameof(IBsp)), ScriptDataType.Entity => ParseTypeName(nameof(IGameObject)), ScriptDataType.Unit => ParseTypeName(nameof(IUnit)), ScriptDataType.Vehicle => ParseTypeName(nameof(IVehicle)), ScriptDataType.AI => ParseTypeName(nameof(IAiActorDefinition)), ScriptDataType.Device => ParseTypeName(nameof(IDevice)), ScriptDataType.Sound => ParseTypeName(nameof(SoundTag)), ScriptDataType.Model => ParseTypeName(nameof(RenderModelTag)), ScriptDataType.Animation => ParseTypeName(nameof(AnimationGraphTag)), ScriptDataType.TagReference => ParseTypeName(nameof(BaseTag)), ScriptDataType.LoopingSound => ParseTypeName(nameof(LoopingSoundTag)), ScriptDataType.Effect => ParseTypeName(nameof(EffectTag)), ScriptDataType.DamageEffect => ParseTypeName(nameof(DamageEffectTag)), _ => Enum.IsDefined(typeof(ScriptDataType), dataType) ? ParseTypeName("I" + dataType.ToString()) : ParseTypeName(nameof(ScriptDataType) + dataType.ToString()), });
private void AddPublicProperty(ScriptDataType type, string name, int itemIndex) { var propName = nameRepo.RegisterName(name, type.ToString(), itemIndex); var scnrPropName = type switch { ScriptDataType.CameraPathTarget => nameof(ScenarioTag.CameraPathTargets), ScriptDataType.LocationFlag => nameof(ScenarioTag.LocationFlagDefinitions), ScriptDataType.CinematicTitle => nameof(ScenarioTag.CinematicTitleDefinitions), ScriptDataType.Trigger => nameof(ScenarioTag.TriggerVolumes), ScriptDataType.StartingProfile => nameof(ScenarioTag.StartingProfileDefinitions), ScriptDataType.DeviceGroup => nameof(ScenarioTag.DeviceGroupDefinitions), ScriptDataType.AI => nameof(ScenarioTag.AiSquadGroupDefinitions), ScriptDataType.AIOrders => nameof(ScenarioTag.AiOrderDefinitions), _ => throw new Exception("Not support!") }; ExpressionSyntax access = ElementAccessExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(nameof(ScenarioScriptBase.Scenario)), IdentifierName(scnrPropName))) .AddArgumentListArguments(Argument(SyntaxUtil.LiteralExpression(itemIndex))); var scnrProp = ScenarioTagProperties[scnrPropName]; if (scnrProp.PropertyType.HasElementType && scnrProp.PropertyType.GetElementType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGameObjectDefinition <>))) { access = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, access, IdentifierName(nameof(IGameObjectDefinition <object> .GameObject))); } var prop = PropertyDeclaration(SyntaxUtil.ScriptTypeSyntax(type), propName) .WithExpressionBody(ArrowExpressionClause(access)) .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); properties.Add(prop.WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword)))); }
public static ScriptData ReadData(Stream stream) { ScriptDataType scriptDataType = (ScriptDataType)stream.ReadByte(); if (!(stream.Position < stream.Length - 4)) { return(null); } ScriptData scriptData; switch (scriptDataType) { case ScriptDataType.Number: scriptData = new Number(stream); break; case ScriptDataType.Boolean: scriptData = new Boolean(stream); break; case ScriptDataType.String: scriptData = new String(stream); break; case ScriptDataType.Object: scriptData = new Object(stream); break; case ScriptDataType.Reference: scriptData = new Reference(stream); break; case ScriptDataType.EcmaArray: scriptData = new EcmaArray(stream); break; case ScriptDataType.ObjectEndMark: scriptData = new ObjectEndMark(stream); break; case ScriptDataType.StrictArray: scriptData = new StrictArray(stream); break; default: throw new UnsupportedFormat(string.Format("Unsupported Script data type 0x{0}", scriptDataType.ToString("X2"))); } return(scriptData); }