using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace OpenVIII
{
///
/// Character BattleMenu
///
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(damageable);
public void DrawData(SectionName v)
{
if (!skipdata && Enabled)
foreach (KeyValuePair 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 tasks = new List
{
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
}
}