using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace OpenVIII
{
public partial class IGMItems
{
#region Classes
///
///
///
/// Using Faces.ID because it contains characters and gfs. Can cast to Characters or subtract
/// 16 and cast to GFs
///
private class TargetPool : IGMData.Pool.Base
{
#region Fields
private bool _eventSet;
private bool _forceRefresh;
#endregion Fields
#region Properties
private bool All => (Item.ItemTarget & (ItemTarget.All | ItemTarget.All2)) != 0;
private ItemInMenu Item { get; set; }
private static bool IsMe => IGMItems.GetMode().Equals(Mode.UseItemOnTarget);
#endregion Properties
#region Methods
[SuppressMessage("ReSharper", "MemberHidesStaticFromOuterClass")]
public static TargetPool Create()
{
var r = Create(9, 3, new IGMDataItem.Box { Pos = new Rectangle(420, 150, 420, 360), Title = Icons.ID.TARGET }, 9, 1);
r.Cursor_Status &= ~Cursor_Status.Enabled;
return r;
}
public override void Draw()
{
if (All && IsMe)
Cursor_Status &= ~Cursor_Status.Enabled;
base.Draw();
if (!All || !IsMe) return;
// if all draw blinking pointers on everyone.
byte i = 0;
foreach (var c in CURSOR)
{
if (!BLANKS[i] && ITEM[i, 0] != null && ITEM[i, 0].Enabled && c != Point.Zero)
DrawPointer(c, blink: true);
i++;
}
Cursor_Status |= Cursor_Status.Enabled;
}
public override bool Inputs()
{
// if ((Item.Target & (Item_In_Menu._Target.All|Item_In_Menu._Target.All2)) == 0)
Cursor_Status |= Cursor_Status.Enabled;
return base.Inputs();
}
public override bool Inputs_CANCEL()
{
base.Inputs_CANCEL();
IGMItems.SetMode(Mode.SelectItem);
return true;
}
public override bool Inputs_OKAY()
{
var ret = false;
if (All)
ret = Item.Use(Faces.ID.Blank);
else if (!BLANKS[CURSOR_SELECT])
ret = Item.Use(Contents[CURSOR_SELECT]);
if (ret)
{
base.Inputs_OKAY();
Fill();
IGMItems.Refresh(true);
return true;
}
return false;
}
public override void ModeChangeEvent(object sender, Enum e)
{
if (!IsMe)
Cursor_Status &= ~Cursor_Status.Enabled;
else
IGMItems.TargetChangeHandler?.Invoke(this, Contents[CURSOR_SELECT]);
}
public override void Refresh()
{
if (!_eventSet && IGMItems != null)
{
IGMItems.ModeChangeHandler += ModeChangeEvent;
IGMItems.ChoiceChangeHandler += ChoiceChangeEvent;
IGMItems.ItemPool.ItemChangeHandler += ItemTypeChangeEvent;
_eventSet = true;
}
////List won't populate unless theres a valid item set.
//if (Item.Type == Item_In_Menu._Type.None && Memory.State.Items != null)
// Item = Memory.MItems[Memory.State.Items.FirstOrDefault(m => m.ID > 0 && m.QTY > 0).ID];
else
Fill();
_forceRefresh = true;
base.Refresh();
}
public override void ResetPages()
{
}
protected override void Init()
{
base.Init();
for (var i = 0; i < Rows; i++)
{
ITEM[i, 0] = new IGMDataItem.Text { Pos = SIZE[i] };
ITEM[i, 0].Hide();
ITEM[i, 1] = new IGMDataItem.Icon { Data = Icons.ID.HP2, Pos = new Rectangle(SIZE[i].X + SIZE[i].Width - (20 * 7), SIZE[i].Y, 0, 0), Palette = 13 };
ITEM[i, 1].Hide();
ITEM[i, 2] = new IGMDataItem.Integer { Pos = new Rectangle(SIZE[i].X + SIZE[i].Width - (20 * 4), SIZE[i].Y, 0, 0), Spaces = 4 };
ITEM[i, 2].Hide();
}
}
protected override void InitShift(int i, int col, int row)
{
base.InitShift(i, col, row);
SIZE[i].Inflate(-18, -20);
SIZE[i].Y -= 3 * row;
//SIZE[i].X += 2;
SIZE[i].Height = (int)(12 * TextScale.Y);
}
protected override void PAGE_NEXT()
{
if (Pages <= 1) return;
base.PAGE_NEXT();
Fill();
base.Refresh();
}
protected override void PAGE_PREV()
{
if (Pages <= 1) return;
base.PAGE_PREV();
Fill();
base.Refresh();
}
protected override void SetCursor_select(int value)
{
if (value.Equals(GetCursor_select())) return;
base.SetCursor_select(value);
IGMItems.TargetChangeHandler?.Invoke(this, Contents[CURSOR_SELECT]);
}
private static void ChoiceChangeEvent(object sender, KeyValuePair e)
{
}
private void Fill()
{
Faces.ID id = 0;
var skip = Page * Rows;
for (var i = 0; i < Rows; i++)
{
while (!Enum.IsDefined(typeof(Faces.ID), id)
|| !((Item.TestCharacter(ref id, out _)) || (Item.TestGF(ref id, out _)))
|| skip-- > 0)
if ((byte)++id > 32)
{
for (; i < Rows; i++)
{
ITEM[i, 0].Hide();
ITEM[i, 1].Hide();
ITEM[i, 2].Hide();
BLANKS[i] = true;
Contents[i] = Faces.ID.Blank;
}
//Pages = Page + 1;
return;
}
((IGMDataItem.Text)ITEM[i, 0]).Data = Memory.Strings.GetName(id);
ITEM[i, 0].Show();
var hp = Memory.State[id]?.CurrentHP() ?? -1;
BLANKS[i] = false;
Contents[i] = id;
if (hp > -1)
{
((IGMDataItem.Integer)ITEM[i, 2]).Data = hp;
ITEM[i, 1].Show();
ITEM[i, 2].Show();
}
else
{
ITEM[i, 1].Hide();
ITEM[i, 2].Hide();
}
id++;
}
//Pages = Page + 2;
}
private void ItemTypeChangeEvent(object sender, KeyValuePair e)
{
CURSOR_SELECT = 0;
if (Item.Equals(e.Key) && Page <= 0) return;
Page = 0;
var sameTargets = Item.ItemTarget != e.Key.ItemTarget || Item.ItemType != e.Key.ItemType;
if (!sameTargets)
{
sameTargets = (Item.ItemType == ItemType.GFLearn && Item.Learn != e.Key.Learn);
sameTargets = sameTargets || (Item.ItemType == ItemType.BlueMagic && Item.LearnedBlueMagic != e.Key.LearnedBlueMagic);
}
Item = e.Key;
if (!sameTargets && !_forceRefresh) return;
Fill();
base.Refresh();
_forceRefresh = false;
}
#endregion Methods
}
#endregion Classes
}
}