FieldScriptFormatter.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace OpenVIII.Fields.Scripts
  4. {
  5. public static class FieldScriptFormatter
  6. {
  7. #region Methods
  8. public static IEnumerable<FormattedObject> FormatAllObjects(Field.ILookupService lookupService)
  9. {
  10. return lookupService.EnumerateAll().SelectMany(FormatFieldObjects);
  11. }
  12. public static IEnumerable<FormattedObject> FormatFieldObjects(Field.Info field)
  13. {
  14. if (!field.TryReadData(Field.Part.Jsm, out var jsmData))
  15. yield break;
  16. var gameObjects = Jsm.File.Read(jsmData);
  17. if (gameObjects.Count == 0)
  18. yield break;
  19. IScriptFormatterContext formatterContext = GetFormatterContext(field);
  20. var executionContext = StatelessServices.Instance;
  21. var sw = new ScriptWriter();
  22. foreach (var obj in gameObjects)
  23. {
  24. formatterContext.GetObjectScriptNamesById(obj.Id, out var objectName, out _);
  25. var formattedScript = FormatObject(obj, sw, formatterContext, executionContext);
  26. yield return new FormattedObject(field, objectName, formattedScript);
  27. }
  28. }
  29. private static string FormatObject(Jsm.GameObject gameObject, ScriptWriter sw, IScriptFormatterContext formatterContext, IServices executionContext)
  30. {
  31. gameObject.FormatType(sw, formatterContext, executionContext);
  32. return sw.Release();
  33. }
  34. private static ScriptFormatterContext GetFormatterContext(Field.Info field)
  35. {
  36. var context = new ScriptFormatterContext();
  37. if (field.TryReadData(Field.Part.Sym, out var symData))
  38. context.SetSymbols(Sym.Reader.FromBytes(symData));
  39. if (field.TryReadData(Field.Part.Msd, out var msdData))
  40. context.SetMessages(Msd.Reader.FromBytes(msdData));
  41. return context;
  42. }
  43. #endregion Methods
  44. }
  45. }