using Microsoft.Xna.Framework;
using OpenVIII.Movie;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenVIII.IGMData
{
public class DebugChoose : Base
{
#region Fields
///
/// Strings
///
private static readonly Dictionary StrDebugLobby = new Dictionary()
{
{ DebugItems.Reset, new FF8String("Reset Main Menu state") },
{ DebugItems.Overture, new FF8String("Play Overture") },
{ DebugItems.Battle, new FF8String("Battle encounter") },
{ DebugItems.Field, new FF8String("Field debug render") },
{ DebugItems.Movie, new FF8String("Movie debug render: ") },
{ DebugItems.Music, new FF8String("Play/Stop music: ") },
{ DebugItems.Sounds, new FF8String("Play audio.dat: ") },
{ DebugItems.World, new FF8String("Jump to World Map") },
{ DebugItems.Faces, new FF8String("Test Faces") },
{ DebugItems.Icons, new FF8String("Test Icons") },
{ DebugItems.Cards, new FF8String("Test Cards") },
{ DebugItems.FieldModelTest, new FF8String("Test field models") },
};
private int _debugChosenAudio;
///
/// Dynamic String Values
///
private Dictionary> _dynamicDebugStrings;
private Dictionary> _inputsLeft;
private Dictionary> _inputsOkay;
private Dictionary> _inputsRight;
#endregion Fields
#region Enums
///
/// Identifiers and Ordering of debug menu items
///
private enum DebugItems
{
Reset,
Overture,
Battle,
Field,
Movie,
Music,
Sounds,
World,
Faces,
Icons,
Cards,
FieldModelTest,
///
/// Number of values. Make sure this is last.
///
Count,
BattlePool = Count,
FieldPool = Count + 1,
}
#endregion Enums
#region Methods
public static DebugChoose Create(Rectangle pos) => Create((int)DebugItems.Count + 2, 1, new IGMDataItem.Box { Pos = pos, Title = Icons.ID.DEBUG }, 1, (int)DebugItems.Count);
public override bool Inputs()
{
Cursor_Status |= Cursor_Status.Enabled; //Cursor_Status |= Cursor_Status.Horizontal;
if (ITEM[(int)DebugItems.BattlePool, 0].Enabled)
{
Cursor_Status |= Cursor_Status.Blinking;
return ITEM[(int)DebugItems.BattlePool, 0].Inputs();
}
else if (ITEM[(int)DebugItems.FieldPool, 0].Enabled)
{
Cursor_Status |= Cursor_Status.Blinking;
return ITEM[(int)DebugItems.FieldPool, 0].Inputs();
}
else
{
Cursor_Status &= ~Cursor_Status.Blinking;
return base.Inputs();
}
}
public override bool Inputs_CANCEL()
{
base.Inputs_CANCEL();
CURSOR_SELECT = 0;
Menu.Module.State = MenuModule.Mode.MainLobby;
Menu.FadeIn();
return true;
}
public override void Inputs_Left()
{
if (_inputsLeft.TryGetValue((DebugItems)CURSOR_SELECT, out var f) && f.Invoke())
{
base.Inputs_Left();
Refresh();
}
}
public override bool Inputs_OKAY()
{
if (_inputsOkay.TryGetValue((DebugItems)CURSOR_SELECT, out var f))
{
return f.Invoke() && base.Inputs_OKAY();
}
return false;
}
public override void Inputs_Right()
{
if (_inputsRight.TryGetValue((DebugItems)CURSOR_SELECT, out var f) && f.Invoke())
{
base.Inputs_Right();
Refresh();
}
}
public override void Refresh()
{
base.Refresh();
for (var i = 0; i < Count; i++)
{
if (_dynamicDebugStrings.TryGetValue((DebugItems)i, out var f))
{
((IGMDataItem.Text)ITEM[i, 0]).Data = f();
}
}
}
protected override void Init()
{
base.Init();
foreach (var i in Enumerable.Range(0, (int)DebugItems.Count))
{
if (StrDebugLobby.TryGetValue((DebugItems)i, out var str))
{
ITEM[i, 0] = new IGMDataItem.Text { Data = str, Pos = SIZE[i] };
}
}
var rect = CONTAINER.Pos;
rect.Inflate(-12, -60);
rect.Offset(12, 60);
ITEM[(int)DebugItems.BattlePool, 0] = DebugSelectPool.Create(rect, Memory.Encounters, SetEncounterOkayBattle, FilterEncounters);
ITEM[(int)DebugItems.BattlePool, 0].Refresh();
ITEM[(int)DebugItems.FieldPool, 0] = DebugSelectPool.Create(rect, Memory.FieldHolder.Fields, SetFieldsOkayBattle, FilterFields,4);
ITEM[(int)DebugItems.FieldPool, 0].Refresh();
PointerZIndex = Count - 1;
_inputsOkay = new Dictionary>()
{
{ DebugItems.Reset, Inputs_CANCEL },
{ DebugItems.Overture, ()=> {
Menu.FadeIn();
Menu.Module.State = MenuModule.Mode.MainLobby;
Module_overture_debug.ResetModule();
Memory.Module = Module.OvertureDebug;
Memory.IsMouseVisible = false;
AV.Music.Stop();
return true;
} },
{ DebugItems.Battle, ()=> {
ITEM[(int)DebugItems.BattlePool,0].Show();
return true;
} },
{ DebugItems.Field, ()=> {
ITEM[(int)DebugItems.FieldPool,0].Show();
return true;
} },
{ DebugItems.Movie, ()=> {
Menu.FadeIn();
Memory.Module = Module.MovieTest;
ModuleMovieTest.Play();
Memory.IsMouseVisible = false;
return true;
} },
{ DebugItems.Music, ()=> {
Fields.Module.ResetField();
AV.Music.PlayStop();
return true;
} },
{ DebugItems.Sounds, ()=> {
AV.Sound.Play(_debugChosenAudio);
skipsnd = true;
return true;
} },
{ DebugItems.World, ()=> {
Menu.FadeIn();
Module_world_debug.playerPosition = new Vector3(-9105f, 30f, -4466); //reset for sake of debugging
Memory.Module = Module.WorldDebug;
Memory.IsMouseVisible = false;
return true;
} },
{ DebugItems.Faces, ()=> {
Menu.FadeIn();
Memory.Module = Module.FaceTest;
Module_face_test.Show();
return true;
} },
{ DebugItems.Icons, ()=> {
Menu.FadeIn();
Memory.Module = Module.IconTest;
Module_icon_test.Show();
return true;
} },
{ DebugItems.Cards, ()=> {
Menu.FadeIn();
Memory.Module = Module.CardTest;
Module_card_test.Show();
return true;
} },
{ DebugItems.FieldModelTest, ()=> {
Menu.FadeIn();
Memory.Module = Module.FieldModelTest;
Module_card_test.Show();
return true;
} },
};
var files = Files.Instance;
_inputsLeft = new Dictionary>()
{
{ DebugItems.Movie, ()=> {
if(ModuleMovieTest.Index>0)
ModuleMovieTest.Index--;
else
ModuleMovieTest.Index = files.Count - 1;
return true;
} },
{ DebugItems.Music, ()=> {
if(Memory.MusicIndex >0)
Memory.MusicIndex --;
else
Memory.MusicIndex = (ushort)Memory.DicMusic.Keys.Max();
return true;
} },
{ DebugItems.Sounds, ()=> {
if (_debugChosenAudio > 0)
_debugChosenAudio--;
else
_debugChosenAudio = AV.Sound.EntriesCount-1;
return true;
} }
};
_inputsRight = new Dictionary>()
{
{ DebugItems.Movie, ()=> {
if(ModuleMovieTest.Index {
if(Memory.MusicIndex <(ushort)Memory.DicMusic.Keys.Max())
Memory.MusicIndex ++;
else
Memory.MusicIndex = 0;
return true;
} },
{ DebugItems.Sounds, ()=> {
if (_debugChosenAudio < AV.Sound.EntriesCount-1)
_debugChosenAudio++;
else
_debugChosenAudio = 0;
return true;
} }
};
_dynamicDebugStrings = new Dictionary>
{
{ DebugItems.Movie, ()=> {
if (files.Count<=ModuleMovieTest.Index)
ModuleMovieTest.Index=0;
if(files.Count ==0)
return "";
if (files.Count <= ModuleMovieTest.Index) return "";
var end=Path.GetFileNameWithoutExtension(files[ModuleMovieTest.Index]);
if(StrDebugLobby[DebugItems.Movie]!=null)
return StrDebugLobby[DebugItems.Movie].Clone().Append(end);
return end;
}},
{ DebugItems.Music, ()=> {
if (Memory.DicMusic.Count <= Memory.MusicIndex ||
Memory.DicMusic[(MusicId) Memory.MusicIndex].Count <= 0) return "";
var end=Path.GetFileNameWithoutExtension(Memory.DicMusic[(MusicId)Memory.MusicIndex][0]);
if(StrDebugLobby[DebugItems.Music]!=null)
return StrDebugLobby[DebugItems.Music].Clone().Append(end);
return end;
} },
{ DebugItems.Sounds, ()=> StrDebugLobby[DebugItems.Sounds].Clone().Append(_debugChosenAudio.ToString("D4"))}
};
}
protected override void InitShift(int i, int col, int row)
{
base.InitShift(i, col, row);
SIZE[i].Inflate(-22, -8);
SIZE[i].Offset(0, 12 + (-8 * row));
}
private void FilterEncounters(string filter) => ((DebugSelectPool)ITEM[(int)DebugItems.BattlePool, 0]).Refresh(Memory.Encounters.Where(x => x.ToString().IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0));
private void FilterFields(string filter) => ((DebugSelectPool)ITEM[(int)DebugItems.FieldPool, 0]).Refresh(Memory.FieldHolder.Fields?.Where(x => x.ToString().IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0));
private static bool SetEncounterOkayBattle(Battle.Encounter encounter)
{
Memory.Encounters.ID = encounter.ID;
Menu.FadeIn();
ModuleBattleDebug.ResetState();
Menu.BattleMenus.CameFrom();
Memory.Module = Module.BattleDebug;
Memory.IsMouseVisible = false;
return true;
}
private static bool SetFieldsOkayBattle(string arg)
{
if (Memory.FieldHolder.Fields == null) return true;
Memory.FieldHolder.FieldID = (ushort)Memory.FieldHolder.Fields.ToList().FindIndex(x => x == arg);
Menu.FadeIn();
Fields.Module.ResetField();
Memory.Module = Module.FieldDebug;
Memory.IsMouseVisible = false;
return true;
}
#endregion Methods
}
}