using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HaloObjects;

namespace HaloPlugins.Xbox
{
    public class effe
    {
       public List<MetaNode> Fields = new List<MetaNode>();

       public effe()
       {
           Fields.AddRange(new MetaNode[] {
           new Bitmask("Flags", new string[] { "Deleted_When_Attachment_Deactivated" }, 32),
           new Value("Loop Start Event #", typeof(short)),
           new Unused(6),
           new Reflexive("Locations", 4, new MetaNode[] { 
               new StringID("Marker Name"),
           }),
           new Reflexive("Events", 56, new MetaNode[] { 
               new Bitmask("Flags", new string[] { "Disabled_For_Debugging" }, 32),
               new Value("Skip Fraction", typeof(float)),
               new Value("Delay Bounds", typeof(float)),
               new Value("...To", typeof(float)),
               new Value("Duration Bounds", typeof(float)),
               new Value("...To", typeof(float)),
               new Reflexive("Parts", 56, new MetaNode[] { 
                   new HaloObjects.Enum("Create In", new string[] { "Any_Environment", "Air_Only", "Water_Only", "Space_Only" }, 16),
                   new HaloObjects.Enum("Create In", new string[] { "Either_Mode", "Violent_Mode_Only", "NonViolent_Mode_Only" }, 16),
                   new Value("Location", typeof(short)),
                   new Bitmask("Flags", new string[] { "Face_Down_Regardless_Of_Location", "Offset_Origin_Away_From_Geometry", "Never_Attached_To_Object", "Disabled_For_Debugging", "Draw_Regardless_Of_Distance" }, 16),
                   new Unused(4),
                   new TagReference("Type"),
                   new Value("Velocity Bound", typeof(float)),
                   new Value("...To", typeof(float)),
                   new Value("Velocity Cone Angle (radians)", typeof(float)),
                   new Value("Angular Velocity Bound", typeof(float)),
                   new Value("...To", typeof(float)),
                   new Value("Radius Modifier", typeof(float)),
                   new Value("...To", typeof(float)),
                   new Bitmask("A Scales Values", new string[] { "Velocity", "Velocity_Delta", "Velocity_Cone_Angle", "Angular_Velocity", "Angular_Velocity_Delta", "Type-Specific_Scale" }, 32),
                   new Bitmask("B Scales Values", new string[] { "Velocity", "Velocity_Delta", "Velocity_Cone_Angle", "Angular_Velocity", "Angular_Velocity_Delta", "Type-Specific_Scale" }, 32),
               }),
               new Reflexive("Beams", 60, new MetaNode[] { 
                   new TagReference("Shader"),
                   new Value("Location", typeof(short)),
                   new Unused(2),
                   new Reflexive("Color", 1, new MetaNode[] { 
                       new Value("Data", typeof(byte)),
                   }),
                   new Reflexive("Alpha", 1, new MetaNode[] { 
                       new Value("Data", typeof(byte)),
                   }),
                   new Reflexive("Width", 1, new MetaNode[] { 
                       new Value("Data", typeof(byte)),
                   }),
                   new Reflexive("Length", 1, new MetaNode[] { 
                       new Value("Data", typeof(byte)),
                   }),
                   new Reflexive("Yaw", 1, new MetaNode[] { 
                       new Value("Data", typeof(byte)),
                   }),
                   new Reflexive("Pitch", 1, new MetaNode[] { 
                       new Value("Data", typeof(byte)),
                   }),
               }),
               new Reflexive("Accelerations", 20, new MetaNode[] { 
                   new HaloObjects.Enum("Create In", new string[] { "Any_Environment", "Air_Only", "Water_Only", "Space_Only" }, 16),
                   new HaloObjects.Enum("Create In", new string[] { "Either_Mode", "Violent_Mode_Only", "NonViolent_Mode_Only" }, 16),
                   new Value("Location", typeof(short)),
                   new Unused(2),
                   new Value("Acceleration", typeof(float)),
                   new Value("Inner Cone Angle", typeof(float)),
                   new Value("Outer Cone Angle", typeof(float)),
               }),
               new Reflexive("Particle Systems", 56, new MetaNode[] { 
                   new TagReference("Particle"),
                   new Value("Location", typeof(short)),
                   new Unused(2),
                   new HaloObjects.Enum("Coordinate System", new string[] { "World", "Local", "Parent" }, 16),
                   new HaloObjects.Enum("Environment", new string[] { "Any_Environment", "Air_Only", "Water_Only", "Space_Only" }, 16),
                   new HaloObjects.Enum("Disposition", new string[] { "Either_Mode", "Violent_Mode_Only", "NonViolent_Mode_Only" }, 16),
                   new HaloObjects.Enum("Camera Mode", new string[] { "Independant_Of_Camera_Mode", "Only_In_1st_Person", "Only_In_3rd_Person", "Both_1st_And_3rd" }, 16),
                   new Value("Sort Bias", typeof(short)),
                   new Bitmask("Flags", new string[] { "Glow", "Cinematics", "Looping_Particle", "Disabled_For_Debugging", "Inherit_Effect_Velocity", "Don't_Render_System", "Render_When_Zoomed", "Spread_Between_Ticks", "Persistent_Particle", "Expensive_Visibility" }, 32),
                   new Unused(2),
                   new Value("LOD In Distance", typeof(float)),
                   new Value("LOD Feather In Delta", typeof(float)),
                   new Value("LOD Out Distance", typeof(float)),
                   new Value("LOD Feather Out Delta", typeof(float)),
                   new Unused(4),
                   new Reflexive("Emitters", 184, new MetaNode[] { 
                       new TagReference("Particle_Physics"),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Emission Rate", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Lifespan (sec)", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Velocity (World Units Per Sec)", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Angular Velocity (Degrees Per Sec)", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Size (World Units)", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Tint", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Particle Alpha", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Emission Shape", new string[] { "Sprayer", "Disc", "Globe", "Implode", "Tube", "Halo", "Impact_Contour", "Impact_Area", "Debris", "Line" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Emission Radius (World Units)", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new HaloObjects.Enum("Output Modifier", new string[] { "", "Plus", "Times" }, 32),
                       new HaloObjects.Enum("Output Modifier", new string[] { "Particle_Age", "Particle_Emit_Time", "Particle_Random_1", "Particle_Random_2", "Emitter_Age", "Emitter_Random_1", "Emitter_Random_2", "System_LOD", "Game_Time", "Effect_A_Scale", "Effect_B_Scale", "Particle_Rotation", "Explosion_Animation", "Explosion_Rotation", "Particle_Random_3", "Particle_Random_4", "Location_Random" }, 32),
                       new Reflexive("Emission Angle (Degrees)", 1, new MetaNode[] { 
                           new Value("Data", typeof(byte)),
                       }),
                       new Value("Translation Offset X", typeof(float)),
                       new Value("Translation Offset Y", typeof(float)),
                       new Value("Translation Offset Z", typeof(float)),
                       new Value("Relative Direction Yaw", typeof(float)),
                       new Value("Relative Direction Pitch", typeof(float)),
                       new Unused(8),
                   }),
               }),
           }),
           new TagReference("Looping_Sound"),
           new Value("Location", typeof(short)),
           new Unused(2),
           new Value("Always Play Distance", typeof(float)),
           new Value("Never Play Distance", typeof(float)),
           });
       }
    }
}
