using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace FF8
{
internal static partial class Module_main_menu_debug
{
#region Fields
private static int debug_choosedBS, debug_choosedAudio, debug_fieldPointer, debug_moviePointer;
private static string debug_choosedField, debug_choosedMovie, debug_choosedMusic;
private static Ditems s_dchoose;
///
/// Strings for the debug menu
///
private static Dictionary strDebugLobby;
#endregion Fields
#region Enums
///
/// Identifiers and Ordering of debug menu items
///
private enum Ditems
{
Reset,
Overture,
Battle,
Field,
Movie,
Music,
Sounds,
World,
Faces,
Icons,
Cards
}
#endregion Enums
#region Properties
public static Vector2 DFontPos { get; private set; }
///
/// Currently selected Field
///
public static int FieldPointer
{
get => debug_fieldPointer;
set
{
if (value >= Memory.FieldHolder.fields.Length)
{
value = 0;
}
else if (value < 0)
{
value = Memory.FieldHolder.fields.Length - 1;
}
debug_fieldPointer = value;
Memory.FieldHolder.FieldID = (ushort)value;
debug_choosedField = Memory.FieldHolder.fields[value];
}
}
///
/// Currently selected Movie
///
public static int MoviePointer
{
get => debug_moviePointer;
set
{
if (value >= Module_movie_test.Movies.Count)
{
value = 0;
}
else if (value < 0)
{
value = Module_movie_test.Movies.Count - 1;
}
debug_moviePointer = value;
Module_movie_test.Index = value;
if(Module_movie_test.Movies.Count>0)
debug_choosedMovie = Path.GetFileNameWithoutExtension(Module_movie_test.Movies[value]);
}
}
///
/// Current choice on debug menu
///
private static Ditems Dchoose
{
get => s_dchoose; set
{
if (value > s_dchoose && value > (Ditems)Enum.GetValues(typeof(Ditems)).Cast().Max())
{
value = 0;
}
else if (value < s_dchoose && s_dchoose <= 0)
{
value = (Ditems)Enum.GetValues(typeof(Ditems)).Cast().Max();
}
s_dchoose = value;
}
}
private static Vector2 Offset { get; set; }
#endregion Properties
#region Methods
private static Rectangle FontBoxCalc(Dictionary dict)
{
Rectangle dst = new Rectangle();
int item = 0;
foreach (Enum i in Enum.GetValues(typeof(T)))
{
Item c = dict[i];
c.Loc = Memory.font.CalcBasicTextArea(FF8String.Combine(strDebugLobby[i].Text, InfoForLobby(i)),
(int)DFontPos.X, (int)(DFontPos.Y + vpSpace * item++), 2.545454545f, 3.0375f, 0);
if (dst.X == 0 || dst.Y == 0)
dst.Location = c.Loc.Location;
if (c.Loc.Width > dst.Width)
dst.Width = c.Loc.Width;
dst.Height = c.Loc.Y + c.Loc.Height - dst.Y;
dict[i] = c;
}
dst.Inflate(vpWidth * .06f * scale.X, vpHeight * .035f * scale.Y);
return dst;
}
///
/// Draw Debug Menu
///
private static void DrawDebugLobby()
{
vpSpace = vpHeight * 0.05f * scale.X;
float item = 0;
Rectangle dst = FontBoxCalc(strDebugLobby);
Memory.SpriteBatchStartAlpha(SamplerState.PointClamp);
DrawBox(null, null, dst);
//Memory.Icons.Draw(Icons.ID.Menu_BG_256, 0, dst, new Vector2(2f), Fade);
item = 0;
dst.Offset(4 * 3.5f, 0);
dst.Size = (Memory.Icons[Icons.ID.DEBUG].GetRectangle.Size.ToVector2() * scale * 3.5f).ToPoint();
Memory.Icons.Draw(Icons.ID.DEBUG, 2, dst, Vector2.Zero, fade);
dst.Location = DFontPos.ToPoint();
dst.Size = new Point((int)(24 * 2 * scale.X), (int)(16 * 2 * scale.Y));
dst.Offset(-(dst.Width + 10 * scale.X), 6 * scale.Y + vpSpace * ((float)Dchoose));
//want to use new function brain hurts on this screen lol
//DrawPointer(new Point((int)(textStart.X), (int)((((textSize.Y + vpSpace) * (float)Mchoose) + textStart.Y + (6 * textSize.Y)) * scale.Y)));
Memory.Icons.Draw(Icons.ID.Finger_Right, 2, dst, Vector2.Zero, fade);
//Memory.SpriteBatchEnd();
//pointclamp looks bad on default fonts.
//Memory.SpriteBatchStartAlpha();
foreach (Ditems i in (Ditems[])Enum.GetValues(typeof(Ditems)))
{
Memory.font.RenderBasicText(FF8String.Combine(strDebugLobby[i].Text, InfoForLobby(i)),
(int)(DFontPos.X), (int)(DFontPos.Y + vpSpace * item++), 2.545454545f, 3.0375f, 1, 0, Fade);
}
//Memory.spriteBatch.Draw(Memory.iconsTex[2], dst,
// new Rectangle(232, 0, 23, 15), Color.White * Fade);
Memory.SpriteBatchEnd();
}
///
/// Dynamic info for Ditem that is read at draw time.
///
/// Ditem being drawn
/// Dynamic info for Ditem
private static string InfoForLobby(Enum i)
{
switch (typeof(T).Name)
{
case "Ditems":
switch (i)
{
case Ditems.Battle:
return debug_choosedBS.ToString("D4");
case Ditems.Field:
return debug_choosedField;
case Ditems.Movie:
return debug_choosedMovie;
case Ditems.Sounds:
return $"{debug_choosedAudio}";
case Ditems.Music:
return $"{debug_choosedMusic}";
};
break;
};
return "";
}
private static void InitDebug()
{
strDebugLobby = new Dictionary()
{
{ Ditems.Reset, new Item{Text=new FF8String("Reset Main Menu state") } },
{ Ditems.Overture, new Item{Text=new FF8String("Play Overture")} },
{ Ditems.Battle, new Item{Text=new FF8String("Battle encounter: ")} },
{ Ditems.Field, new Item{Text=new FF8String("Field debug render: ")} },
{ Ditems.Movie, new Item{Text=new FF8String("Movie debug render: ")} },
{ Ditems.Music, new Item{Text=new FF8String("Play/Stop music: ")} },
{ Ditems.Sounds, new Item{Text=new FF8String("Play audio.dat: ")} },
{ Ditems.World, new Item{Text=new FF8String("Jump to World Map")} },
{ Ditems.Faces, new Item{Text=new FF8String("Test Faces")} },
{ Ditems.Icons, new Item{Text=new FF8String("Test Icons")} },
{ Ditems.Cards, new Item{Text=new FF8String("Test Cards")} },
};
debug_choosedField = Memory.FieldHolder.fields[debug_fieldPointer];
if(Module_movie_test.Movies.Count>0)
debug_choosedMovie = Path.GetFileNameWithoutExtension(Module_movie_test.Movies[debug_moviePointer]);
if(Memory.dicMusic.Count>0 && Memory.dicMusic[0].Count>0)
debug_choosedMusic = Path.GetFileNameWithoutExtension(Memory.dicMusic[0][0]);
debug_fieldPointer = 90;
debug_moviePointer = 0;
}
///
/// Update Debug Menu
///
/// true on change
private static bool UpdateDebugLobby()
{
bool ret = false;
Point ml = Input.MouseLocation;
foreach (KeyValuePair entry in strDebugLobby)
{
if (entry.Value.Loc.Contains(ml))
{
Dchoose = (Ditems)entry.Key;
ret = true;
if (Input.Button(Buttons.MouseWheelup))
{
return UpdateDebugLobbyLEFT();
}
if (Input.Button(Buttons.MouseWheeldown))
{
return UpdateDebugLobbyRIGHT();
}
break;
}
}
if (Input.Button(Buttons.Down))
{
Input.ResetInputLimit();
init_debugger_Audio.PlaySound(0);
Dchoose++;
ret = true;
}
if (Input.Button(Buttons.Up))
{
Input.ResetInputLimit();
init_debugger_Audio.PlaySound(0);
Dchoose--;
ret = true;
}
if (Input.Button(Buttons.Okay) && Dchoose == Ditems.Reset || Input.Button(Buttons.Cancel))
{
Input.ResetInputLimit();
init_debugger_Audio.PlaySound(8);
init_debugger_Audio.StopAudio();
Dchoose = 0;
Fade = 0.0f;
State = MainMenuStates.MainLobby;
ret = true;
}
else if (Input.Button(Buttons.Okay))
{
ret = UpdateDebugLobbyOKAY();
}
else if (Input.Button(Buttons.Left))
{
ret = UpdateDebugLobbyLEFT();
}
else if (Input.Button(Buttons.Right))
{
ret = UpdateDebugLobbyRIGHT();
}
return ret;
}
private static bool UpdateDebugLobbyLEFT()
{
bool ret = true;
Input.ResetInputLimit();
switch (Dchoose)
{
case Ditems.Sounds:
if (debug_choosedAudio > 0)
{
debug_choosedAudio--;
}
break;
case Ditems.Battle:
if (debug_choosedBS <= 0)
{
return false;
}
debug_choosedBS--;
break;
case Ditems.Field:
FieldPointer--;
break;
case Ditems.Movie:
MoviePointer--;
break;
case Ditems.Music:
if (Memory.dicMusic.Count > 0)
{
if (Memory.MusicIndex <= ushort.MinValue)
{
Memory.MusicIndex = ushort.MaxValue;
}
else
{
Memory.MusicIndex--;
}
debug_choosedMusic = Path.GetFileNameWithoutExtension(Memory.dicMusic[Memory.MusicIndex][0]);
}
break;
default:
ret = false;
break;
}
if (ret)
{
init_debugger_Audio.PlaySound(0);
}
return ret;
}
private static bool UpdateDebugLobbyOKAY()
{
bool ret = true;
Input.ResetInputLimit();
switch (Dchoose)
{
case Ditems.Overture:
Dchoose = 0;
Fade = 0.0f;
State = MainMenuStates.MainLobby;
Module_overture_debug.ResetModule();
Memory.module = Memory.MODULE_OVERTURE_DEBUG;
Memory.IsMouseVisible = false;
init_debugger_Audio.PlayStopMusic();
break;
case Ditems.Field:
Fade = 0.0f;
Module_field_debug.ResetField();
Memory.module = Memory.MODULE_FIELD_DEBUG;
Memory.IsMouseVisible = false;
break;
case Ditems.Music:
Module_field_debug.ResetField();
init_debugger_Audio.PlayStopMusic();
break;
case Ditems.Battle:
Fade = 0.0f;
Memory.battle_encounter = debug_choosedBS;
Module_battle_debug.ResetState();
Memory.module = Memory.MODULE_BATTLE_DEBUG;
Memory.IsMouseVisible = false;
break;
case Ditems.Sounds:
init_debugger_Audio.PlaySound(debug_choosedAudio);
break;
case Ditems.Movie:
Fade = 0.0f;
MoviePointer = MoviePointer; //makes movieindex in player match the moviepointer, it is set when ever this is.
Memory.module = Memory.MODULE_MOVIETEST;
Module_movie_test.MovieState = 0;
Memory.IsMouseVisible = false;
break;
case Ditems.World:
Fade = 0.0f;
Memory.module = Memory.MODULE_WORLD_DEBUG;
Memory.IsMouseVisible = false;
break;
case Ditems.Faces:
Fade = 0.0f;
Memory.module = Memory.MODULE_FACE_TEST;
break;
case Ditems.Icons:
Fade = 0.0f;
Memory.module = Memory.MODULE_ICON_TEST;
break;
case Ditems.Cards:
Fade = 0.0f;
Memory.module = Memory.MODULE_CARD_TEST;
break;
default:
ret = false;
break;
}
if (ret && Ditems.Sounds != Dchoose)
{
init_debugger_Audio.PlaySound(0);
}
return ret;
}
private static bool UpdateDebugLobbyRIGHT()
{
bool ret = true;
Input.ResetInputLimit();
switch (Dchoose)
{
case Ditems.Sounds:
if (debug_choosedAudio < init_debugger_Audio.soundEntriesCount)
{
debug_choosedAudio++;
}
break;
case Ditems.Battle:
if (debug_choosedBS < Memory.encounters.Length)
{
debug_choosedBS++;
}
break;
case Ditems.Field:
FieldPointer++;
break;
case Ditems.Movie:
MoviePointer++;
break;
case Ditems.Music:
//case Ditems.MusicNext:
if (Memory.dicMusic.Count > 0)
{
if (Memory.MusicIndex >= ushort.MaxValue || Memory.MusicIndex >= Memory.dicMusic.Keys.Max())
{
Memory.MusicIndex = 0;
}
else
{
Memory.MusicIndex++;
}
debug_choosedMusic = Path.GetFileNameWithoutExtension(Memory.dicMusic[Memory.MusicIndex][0]);
}
//init_debugger_Audio.PlayMusic();
break;
default:
ret = false;
break;
}
if (ret)
{
init_debugger_Audio.PlaySound(0);
}
return ret;
}
#endregion Methods
}
}