FieldScriptFormatter.cs 2.1 KB

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