| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- using Microsoft.Xna.Framework;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- namespace OpenVIII
- {
- /// <summary>
- /// Character BattleMenu
- /// </summary>
- public partial class BattleMenu : Menu
- {
- #region Destructors
- ~BattleMenu()
- {
- if (Damageable != null)
- Damageable.BattleModeChangeEventHandler -= ModeChangeEvent;
- }
- #endregion Destructors
- #region Enums
- public enum SectionName : byte
- {
- Commands,
- HP,
- Renzokeken,
- Shot
- }
- #endregion Enums
- #region Properties
- public sbyte CrisisLevel => ((IGMData.Commands)Data[SectionName.Commands]).CrisisLevel;
- public IGMData.Limit.Renzokeken Renzokeken
- {
- get
- {
- if (Data.TryGetValue(SectionName.Renzokeken, out Menu_Base val))
- return (IGMData.Limit.Renzokeken)val;
- return null;
- }
- }
- public IGMData.Limit.Shot Shot
- {
- get
- {
- if (Data.TryGetValue(SectionName.Shot, out Menu_Base val))
- return (IGMData.Limit.Shot)val;
- return null;
- }
- }
- #endregion Properties
- //private Mode _mode = Mode.Waiting;
- #region Methods
- //public BattleMenu(Damageable damageable) : base(damageable)
- //{
- //}
- public static BattleMenu Create(Damageable damageable) => Create<BattleMenu>(damageable);
- public void DrawData(SectionName v)
- {
- if (!skipdata && Enabled)
- foreach (KeyValuePair<Enum, Menu_Base> i in Data.Where(a => a.Key.Equals(v)))
- i.Value.Draw();
- }
- public override Enum GetMode() => Damageable.GetBattleMode();
- public override bool Inputs()
- {
- if (Data[SectionName.Renzokeken].Enabled)
- return Data[SectionName.Renzokeken].Inputs();
- else if (Data[SectionName.Shot].Enabled)
- return Data[SectionName.Shot].Inputs();
- return Data[SectionName.Commands].Inputs();
- }
- public override void ModeChangeEvent(object sender, Enum e)
- {
- switch (e)
- {
- case Damageable.BattleMode.EndTurn:
- Reset();
- Refresh();
- break;
- }
- }
- public override void Refresh(Damageable damageable)
- {
- if (Damageable != damageable)
- {
- if (Damageable != null)
- Damageable.BattleModeChangeEventHandler -= ModeChangeEvent;
- base.Refresh(damageable);
- if (Damageable != null)
- {
- Damageable.BattleModeChangeEventHandler += ModeChangeEvent;
- SetMode(Damageable.BattleMode.ATB_Charging);
- }
- }
- else base.Refresh(Damageable);
- }
- public override void Reset() => base.Reset();
- //public override bool SetMode(Enum mode) => Damageable.SetBattleMode(mode);
- protected override void Init()
- {
- NoInputOnUpdate = true;
- Size = new Vector2 { X = 880, Y = 636 };
- base.Init();
- InitAsync();
- }
- private void InitAsync()
- {
- //IGMData.NamesHPATB.ThreadUnsafeOperations(); //seems to work fine in init thread.
- //Memory.MainThreadOnlyActions.Enqueue(IGMData.Renzokeken.ThreadUnsafeOperations); //only works in main thread.
- Memory.MainThreadOnlyActions.Enqueue(() => Data.TryAdd(SectionName.Renzokeken, IGMData.Limit.Renzokeken.Create(new Rectangle(0, 500, (int)Size.X, 124))));
- int width = 100, height = 100;
- Memory.MainThreadOnlyActions.Enqueue(() => Data.TryAdd(SectionName.Shot, IGMData.Limit.Shot.Create(new Rectangle((int)Size.X - width, (int)Size.Y - 20 - height - 20, width, height))));
- List<Task> tasks = new List<Task>
- {
- Task.Run(() => Data.TryAdd(SectionName.Commands, IGMData.Commands.Create(new Rectangle(50, (int)(Size.Y - 204), 210, 192), Damageable, true))),
- Task.Run(() => Data.TryAdd(SectionName.HP, IGMData.NamesHPATB.Create(new Rectangle((int)(Size.X - 389), 507, 389, 126), Damageable))),
- };
- //Some code that cannot be threaded on init.
- //Data.TryAdd(SectionName.HP, IGMData.NamesHPATB.Create(new Rectangle((int)(Size.X - 389), 507, 389, 126), Damageable));
- //Data.TryAdd(SectionName.Renzokeken, IGMData.Renzokeken.Create(new Rectangle(0, 500, (int)Size.X, 124)));
- if (!Task.WaitAll(tasks.ToArray(), 10000))
- throw new TimeoutException("Task took too long!");
- //Data[SectionName.Commands].Hide();
- //var t = Task.WhenAll(tasks);
- //try
- //{
- // await t;
- //}
- //catch { }
- //if (t.Status == TaskStatus.RanToCompletion)
- // Console.WriteLine("All attempts succeeded.");
- //else if (t.Status == TaskStatus.Faulted)
- // Console.WriteLine(t.Exception);
- }
- #endregion Methods
- }
- }
|