private void ParseObject(object o) { string s; Dictionary <string, FieldInfo> fields = new Dictionary <string, FieldInfo>(); //get all class variables foreach (var prop in o.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { fields.Add(prop.Name, prop); } do { ParseLine(); s = getString(); if (o.GetType() == typeof(LoadSubsystem)) { LoadSubsystem ls = (LoadSubsystem)o; switch (s) { case "InitFile": ls.AddInitFile(getString()); break; case "InitFileDebug": ls.AddInitFileDebug(getString()); break; case "InitPath": ls.AddInitPath(getString()); break; case "IncludePathCinematics": ls.AddIncludePathCinematics(getString()); break; case "ExcludePath": ls.AddExcludePath(getString()); break; } } else if (o.GetType() == typeof(AnimationState)) { AnimationState state = (AnimationState)o; string name; switch (s) { case "Animation": Animation anim = new Animation(); ParseObject(anim); state.AddAnimation(anim); break; case "BeginScript": string line = getLine(); while (!line.Equals("EndScript")) { state.AddScriptLine(line); line = getLine(); } break; case "ParticleSysBone": name = getString(); state.AddParticleSysBone(name, ParseParticleSysBone()); break; } } else if (o.GetType() == typeof(Armor)) { Armor ar = (Armor)o; switch (s) { case "Armor": ar.AddType(getString(), getFloat()); break; } } else if (o.GetType() == typeof(AudioEvent)) { AudioEvent ae = (AudioEvent)o; switch (s) { case "Sounds": string val = getStrings(); string[] sounds = val.Split(' '); foreach (string sound in sounds) { MusicTrack mt; if (INIManager.TryGetMusicTrack(sound, out mt)) { ae.AddMusicTrack(mt); } //else // PrintError(" no such MusicTrack found: " + sound); } break; } } else if (o.GetType() == typeof(Draw)) { Draw dr = (Draw)o; string name; switch (s) { case "AnimationState": AnimationState astate = new AnimationState(); name = getString(); ParseObject(astate); dr.AddAnimationState(name, astate); break; case "DefaultModelConditionState": ModelConditionState defMod = new ModelConditionState(); ParseObject(defMod); dr.DefaultModelConditionState = defMod; break; case "IdleAnimationState": AnimationState iastate = new AnimationState(); ParseObject(iastate); dr.IdleAnimationState = iastate; break; case "ModelConditionState": ModelConditionState mcs = new ModelConditionState(); name = getString(); ParseObject(mcs); dr.AddModelConditionState(name, mcs); break; } } else if (o.GetType() == typeof(FXList)) { FXList fx = (FXList)o; switch (s) { case "BuffNugget": BuffNugget bn = new BuffNugget(); ParseObject(bn); fx.buffNugget = bn; break; case "CameraShakerVolume": CameraShakerVolume cs = new CameraShakerVolume(); ParseObject(cs); fx.cameraShakerVolume = cs; break; case "DynamicDecal": DynamicDecal dc = new DynamicDecal(); ParseObject(dc); fx.AddDynamicDecal(dc); break; case "ParticleSystem": ParticleSystem ps = new ParticleSystem(); ParseObject(ps); fx.AddParticleSystem(ps); break; case "Sound": Sound so = new Sound(); ParseObject(so); fx.AddSound(so); break; case "TerrainScorch": TerrainScorch ts = new TerrainScorch(); ParseObject(ts); fx.AddTerrainScorch(ts); break; case "TintDrawable": TintDrawable td = new TintDrawable(); ParseObject(td); fx.tintDrawable = td; break; case "ViewShake": ViewShake vs = new ViewShake(); ParseObject(vs); fx.viewShake = vs; break; } } else if (o.GetType() == typeof(GameData)) { GameData gd = (GameData)o; switch (s) { case "StandardPublicBone": gd.AddStandardPublicBone(getString()); break; case "WeaponBonus": gd.AddWeaponBonus(getString(), getString(), getInt()); break; } } else if (o.GetType() == typeof(ModelConditionState)) { ModelConditionState mstate = (ModelConditionState)o; string name; switch (s) { case "ParticleSysBone": name = getString(); mstate.AddParticleSysBone(name, ParseParticleSysBone()); break; } } else if (o.GetType() == typeof(ModifierList)) { ModifierList ml = (ModifierList)o; switch (s) { case "Modifier": ml.AddModifier(getString(), getStrings()); break; } } else if (o.GetType() == typeof(Multisound)) { Multisound ms = (Multisound)o; switch (s) { case "Subsounds": string val = getStrings(); string[] sounds = val.Split(' '); foreach (string sound in sounds) { MusicTrack mt; if (INIManager.TryGetMusicTrack(sound, out mt)) { ms.AddMusicTrack(mt); } //else // PrintError(" no such MusicTrack found: " + sound); } break; } } else if (o.GetType() == typeof(INI.Object)) { INI.Object obj = (INI.Object)o; string name; switch (s) { case "ArmorSet": ArmorSet set = new ArmorSet(); ParseObject(set); obj.AddArmorSet(set); break; case "Behaviour": Behaviour b = new Behaviour(); name = getString(); ParseObject(b); obj.AddBehaviour(name, b); break; case "Body": Body bo = new Body(); name = getString(); ParseObject(bo); obj.AddBody(name, bo); break; case "Draw": Draw d = new Draw(); name = getString(); ParseObject(d); obj.AddDraw(name, d); break; } } else if (o.GetType() == typeof(Weapon)) { Weapon w = (Weapon)o; switch (s) { case "AttributeModifierNugget": AttributeModifierNugget amn = new AttributeModifierNugget(); ParseObject(amn); w.attributeModifierNugget = amn; break; case "DamageContainedNugget": DamageContainedNugget dcn = new DamageContainedNugget(); ParseObject(dcn); w.damageContainedNugget = dcn; break; case "DamageFieldNugget": DamageFieldNugget dfn = new DamageFieldNugget(); ParseObject(dfn); w.damageFieldNugget = dfn; break; case "DamageNugget": DamageNugget dn = new DamageNugget(); ParseObject(dn); w.damageNugget = dn; break; case "DOTNugget": DOTNugget don = new DOTNugget(); ParseObject(don); w.dotNugget = don; break; case "FireLogicNugget": FireLogicNugget fln = new FireLogicNugget(); ParseObject(fln); w.fireLogicNugget = fln; break; case "HordeAttackNugget": HordeAttackNugget han = new HordeAttackNugget(); ParseObject(han); w.hordeAttackNugget = han; break; case "LuaEventNugget": LuaEventNugget len = new LuaEventNugget(); ParseObject(len); w.luaEventNugget = len; break; case "MetaImpactNugget": MetaImpactNugget min = new MetaImpactNugget(); ParseObject(min); w.metaImpactNugget = min; break; case "OpenGateNugget": OpenGateNugget ogn = new OpenGateNugget(); ParseObject(ogn); w.openGateNugget = ogn; break; case "ParalyzeNugget": ParalyzeNugget pan = new ParalyzeNugget(); ParseObject(pan); w.paralyzeNugget = pan; break; case "ProjectileNugget": ProjectileNugget pn = new ProjectileNugget(); ParseObject(pn); w.AddProjectileNugget(pn); break; case "SlaveAttackNugget": SlaveAttackNugget san = new SlaveAttackNugget(); ParseObject(san); w.slaveAttackNugget = san; break; case "StealMoneyNugget": StealMoneyNugget smn = new StealMoneyNugget(); ParseObject(smn); w.stealMoneyNugget = smn; break; case "WeaponOCLNugget": WeaponOCLNugget won = new WeaponOCLNugget(); ParseObject(won); w.weaponOCLNugget = won; break; } } else if (fields.ContainsKey(s)) { Type type = fields[s].FieldType; if (type == typeof(string)) { fields[s].SetValue(o, getString()); } else if (type == typeof(int)) { fields[s].SetValue(o, getInt()); } else if (type == typeof(int[])) { fields[s].SetValue(o, getInts()); } else if (type == typeof(float)) { fields[s].SetValue(o, getFloat()); } else if (type == typeof(float[])) { fields[s].SetValue(o, getFloats()); } else if (type == typeof(bool)) { fields[s].SetValue(o, getBool()); } else if (type == typeof(OpenTK.Vector2)) { fields[s].SetValue(o, getVec2()); } else if (type == typeof(OpenTK.Vector3)) { fields[s].SetValue(o, getVec3()); } else { PrintError("invalid type: " + type); } } else { if (!s.Equals("End") && !s.Equals("END")) { PrintError("invalid parameter in " + o.GetType() + " class: " + s); } } }while (!s.Equals("End") && !s.Equals("END")); }