| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- using OpenVIII.Fields.Scripts.Instructions;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- namespace OpenVIII.Fields
- {
- public class Archive
- {
- #region Properties
- public string ArchiveName { get; set; }
- public Background Background { get; set; }
- public Cameras Cameras { get; set; }
- public EventEngine EventEngine { get; set; }
- public string FileName { get; set; }
- public Sections Flags { get; set; }
- public ushort ID { get; set; }
- public INF INF { get; set; }
- public List<Scripts.Jsm.GameObject> JSMObjects { get; set; }
- public FieldModes Mod { get; set; } = 0;
- public MrtRat MrtRat { get; set; }
- public MSK MSK { get; set; }
- public PMP PMP { get; set; }
- public IServices Services { get; set; }
- public SFX SFX { get; set; }
- public TDW TDW { get; set; }
- public WalkMesh WalkMesh { get; set; }
- #endregion Properties
- #region Methods
- public static Archive Load(ushort inputFieldID, Sections flags = Sections.ALL)
- {
- var r = new Archive();
- return !r.Init(inputFieldID, flags) ? null : r;
- }
- public void Draw()
- {
- switch (Mod)
- {
- case FieldModes.Init:
- break;
- case FieldModes.Disabled:
- break;
- case FieldModes.DebugRender:
- case FieldModes.NoJSM:
- Background.Draw();
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
- }
- public HashSet<FF8String> GetAreaNames() => JSMObjects != null && JSMObjects.Count > 0 ?
- (
- from jsmObject in JSMObjects
- from script in jsmObject.Scripts
- from instruction in script.Segment.Flatten()
- where instruction is SETPLACE
- let setPlace = ((SETPLACE)instruction)
- select setPlace.AreaName()).ToHashSet() : null;
- public bool Init(ushort? inputFieldID = null, Sections flags = Sections.ALL)
- {
- Flags = flags;
- Memory.SuppressDraw = true;
- var aw = ArchiveWorker.Load(Memory.Archives.A_FIELD);
- var test = aw.GetListOfFiles();
- //TODO fix endless look on FieldID 50.
- ID = inputFieldID ?? Memory.FieldHolder.FieldID;
- var count = (Memory.FieldHolder.Fields?.Length ?? 0);
- if (ID >= count)
- return false;
- FileName = Memory.FieldHolder.GetString(ID);
- ArchiveName = test.FirstOrDefault(x => x.IndexOf(FileName, StringComparison.OrdinalIgnoreCase) >= 0);
- if (string.IsNullOrWhiteSpace(ArchiveName))
- {
- Memory.Log.WriteLine($"FileNotFound :: {ID} - {FileName.ToUpper()}");
- Mod = FieldModes.Disabled;
- return false;
- }
- var fieldArchive = aw.GetArchive(ArchiveName);
- var listOfFiles = fieldArchive.GetListOfFiles();
- string findString(string s) =>
- listOfFiles.FirstOrDefault(x => x.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0);
- byte[] getFile(string s)
- {
- s = findString(Path.GetFileNameWithoutExtension(ArchiveName)+s);
- return !string.IsNullOrWhiteSpace(s) ? fieldArchive.GetBinaryFile(s) : null;
- }
- if (!flags.HasFlag(Sections.MIM | Sections.MAP) ||
- (Background = Background.Load(getFile(".mim"), getFile(".map"))) == null)
- {
- Mod = FieldModes.Disabled;
- }
- if (flags.HasFlag(Sections.CA | Sections.ID))
- {
- Cameras = Cameras.CreateInstance(getFile(".ca"));
- WalkMesh = WalkMesh.Load(getFile(".ID"), Cameras);
- }
- //let's start with scripts
- var sJsm = findString(".jsm");
- var sSy = findString(".sy");
- if (flags.HasFlag(Sections.JSM | Sections.SYM) && !string.IsNullOrWhiteSpace(sJsm) && (FileName != "test3"))
- {
- JSMObjects = Scripts.Jsm.File.Read(fieldArchive.GetBinaryFile(sJsm));
- if (Mod != FieldModes.NoJSM)
- {
- if (!string.IsNullOrWhiteSpace(sSy))
- {
- var symObjects = Sym.Reader.FromBytes(fieldArchive.GetBinaryFile(sSy));
- Services = Initializer.GetServices();
- EventEngine = ServiceId.Field[Services].Engine;
- EventEngine.Reset();
- for (var objIndex = 0; objIndex < JSMObjects.Count; objIndex++)
- {
- var obj = JSMObjects[objIndex];
- var fieldObject = new FieldObject(obj.Id, symObjects.GetObjectOrDefault(objIndex).Name);
- foreach (var script in obj.Scripts)
- fieldObject.Scripts.Add(script.ScriptId, script.Segment.GetExecuter());
- EventEngine.RegisterObject(fieldObject);
- }
- Mod++;
- }
- else
- {
- Debug.WriteLine($"FileNotFound :: {FileName.ToUpper()}.sy");
- //sy file might be optional.
- //Mod = Field_modes.NoJSM;
- }
- }
- }
- else
- {
- Mod = FieldModes.NoJSM;
- //goto end;
- }
- //if (flags.HasFlag(Sections.MCH))
- //{
- // byte[] mchB = getFile(".mch");//Field character models
- //}
- //if (flags.HasFlag(Sections.ONE))
- //{
- // byte[] oneB = getFile(".one");//Field character models container
- //}
- //if (flags.HasFlag(Sections.MSD))
- //{
- // byte[] msdB = getFile(".msd");//dialogs
- //}
- if (flags.HasFlag(Sections.INF))
- {
- var infData = getFile(".inf");//gateways
- if (infData != null && infData.Length > 0)
- INF = INF.Load(infData);
- }
- if (flags.HasFlag(Sections.TDW))
- {
- var tdwData = getFile(".tdw");//extra font
- if (tdwData != null && tdwData.Length > 0)
- TDW = new TDW(tdwData);
- }
- if (flags.HasFlag(Sections.MSK))
- {
- var mskData = getFile(".msk");//movie cam
- if (mskData != null && mskData.Length > 0)
- MSK = new MSK(mskData);
- }
- if (flags.HasFlag(Sections.RAT | Sections.MRT))
- {
- var ratData = getFile(".rat");//battle on field
- var mrtData = getFile(".mrt");//battle on field
- if (ratData != null && mrtData != null && ratData.Length > 0 && mrtData.Length > 0)
- MrtRat = new MrtRat(mrtData, ratData);
- }
- //if (flags.HasFlag(Sections.PMD))
- //{
- // byte[] pmdB = getFile(".pmd");//particle info
- // if (pmdB != null && pmdB.Length > 4)
- // using (FileStream fs = new FileStream(Path.Combine(Path.GetTempPath(),
- // $"{Memory.FieldHolder.GetString()}.pmd"), FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
- // fs.Write(pmdB, 0, pmdB.Length);
- //}
- if (flags.HasFlag(Sections.PMP))
- {
- var pmpData = getFile(".pmp");//particle graphic?
- if (pmpData != null && pmpData.Length > 4)
- PMP = new PMP(pmpData);
- }
- if (flags.HasFlag(Sections.SFX))
- {
- var sfxData = getFile(".sfx");//sound effects
- if (sfxData != null && sfxData.Length > 0)
- SFX = new SFX(sfxData);
- }
- if (Mod == FieldModes.NoJSM && Background == null)
- {
- Mod = FieldModes.Disabled;
- }
- return SFX != null || PMP != null || MrtRat != null || MSK != null || TDW != null || INF != null ||
- JSMObjects != null || EventEngine != null || Cameras != null || WalkMesh != null ||
- Background != null || Services != null;
- }
- public override string ToString() => $"{{{ID}, {FileName}, {Mod}}}";
- /*
- public HashSet<ushort> GetForcedBattleEncounters() => JSMObjects != null && JSMObjects.Count > 0 ?
- (
- from jsmObject in JSMObjects
- from script in jsmObject.Scripts
- from instruction in script.Segment.Flatten()
- where instruction is BATTLE
- let battle = ((BATTLE)instruction)
- select battle.Encounter).ToHashSet() : null;
- */
- public void Update()
- {
- switch (Mod)
- {
- case FieldModes.Init:
- break;
- case FieldModes.DebugRender:
- UpdateScript();
- Background?.Update();
- break; //await events here
- case FieldModes.NoJSM://no scripts but has background.
- Background?.Update();
- break; //await events here
- case FieldModes.Disabled:
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
- }
- private static void UpdateScript()
- {
- //We do not know every instruction and it's not possible for now to play field with unknown instruction
- //eventEngine.Update(services);
- }
- #endregion Methods
- }
- }
|