public INIParser(Stream stream) : base(stream) { str = (BigStream)stream; //Console.WriteLine(str.Name); long filesize = str.Length; while (str.Position < filesize) { ParseLine(); string s = getString(); string name; switch (s) { case "#include": includeFile(getString()); break; case "#define": macros.Add(getString().ToUpper(), getStrings()); break; case "Armor": Armor ar = new Armor(); name = getString(); ParseObject(ar); INIManager.AddArmor(name, ar); break; case "AmbientStream": AmbientStream ast = new AmbientStream(); name = getString(); ParseObject(ast); INIManager.AddAmbientStream(name, ast); break; case "AudioEvent": AudioEvent e = new AudioEvent(); name = getString(); ParseObject(e); INIManager.AddAudioEvent(name, e); break; case "CommandButton": CommandButton cb = new CommandButton(); name = getString(); ParseObject(cb); INIManager.AddCommandButton(name, cb); break; case "DialogEvent": DialogEvent de = new DialogEvent(); name = getString(); ParseObject(de); INIManager.AddDialogEvent(name, de); break; case "FXList": FXList fl = new FXList(); name = getString(); ParseObject(fl); INIManager.AddFXList(name, fl); break; case "GameData": GameData data = new GameData(); ParseObject(data); INIManager.SetGameData(data); break; case "LoadSubsystem": LoadSubsystem ls = new LoadSubsystem(); name = getString(); ParseObject(ls); ls.LoadFiles(); break; case "MappedImage": MappedImage mi = new MappedImage(); name = getString(); ParseObject(mi); INIManager.AddMappedImage(name, mi); break; case "ModifierList": ModifierList ml = new ModifierList(); name = getString(); ParseObject(ml); INIManager.AddModifierList(name, ml); break; case "Multisound": Multisound ms = new Multisound(); name = getString(); ParseObject(ms); INIManager.AddMultisound(name, ms); break; case "MusicTrack": MusicTrack mt = new MusicTrack(); name = getString(); ParseObject(mt); INIManager.AddMusicTrack(name, mt); break; case "Object": INI.Object o = new INI.Object(); name = getString(); ParseObject(o); INIManager.AddObject(name, o); break; case "Science": Science sc = new Science(); name = getString(); ParseObject(sc); INIManager.AddScience(name, sc); break; case "StreamedSound": StreamedSound ss = new StreamedSound(); name = getString(); ParseObject(ss); INIManager.AddStreamedSound(name, ss); break; case "Upgrade": Upgrade u = new Upgrade(); name = getString(); ParseObject(u); INIManager.AddUpgrade(name, u); break; case "Weapon": Weapon w = new Weapon(); name = getString(); ParseObject(w); INIManager.AddWeapon(name, w); break; default: if (!objects.Contains(s)) { //PrintError("unhandled entry: " + s); objects.Add(s); } break; } } count++; }
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")); }