2023-03-28 13:16:30 -04:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using UnityEngine.SceneManagement ;
using System.IO ;
using UnityEngine.UI ;
using TMPro ;
using RPGCreationKit ;
using RPGCreationKit.SaveSystem ;
using UnityEngine.EventSystems ;
using UnityEngine.Events ;
namespace RPGCreationKit
{
public class SavePanel : RckSaveSystemPanel
{
// Load Game
[SerializeField] private GameObject loadSavePanel ;
[SerializeField] private GameObject descriptionContent ;
[SerializeField] private Transform saveFilesT ;
[SerializeField] private GameObject savefileUIPrefab ;
[SerializeField] private List < FileInfo > allSaveFiles = new List < FileInfo > ( ) ;
[SerializeField] private Button saveButton ;
[SerializeField] private Button deleteButton ;
[SerializeField] private GameObject alertPanel ;
[SerializeField] private OverwriteAlertPanel overwriteAlertPanel ;
//Textes
[SerializeField] private Image screenshot ;
[SerializeField] private TextMeshProUGUI loadCharName ;
[SerializeField] private TextMeshProUGUI loadLevel ;
[SerializeField] private TextMeshProUGUI loadLocation ;
[SerializeField] private TextMeshProUGUI loadDate ;
[SerializeField] private TextMeshProUGUI loadSaveNumber ;
[SerializeField] private TextMeshProUGUI loadSaveVersion ;
[SerializeField] private GameObject overwriteAlertPanelDefaultPanel ;
private bool ready ;
GameObject firstElementInList ;
public GameObject createNewSavegameButton ;
public UnityEvent OnPanelCloses ;
private void OnEnable ( )
{
ready = false ;
allSaveFiles . Clear ( ) ;
SelectedSaveFile = null ;
loadSavePanel . SetActive ( true ) ;
DiscoverSaveFiles ( ) ;
SpawnSaveFilesUI ( ) ;
ready = true ;
}
public void Update ( )
{
if ( RckInput . isUsingGamepad )
{
if ( RckInput . input . currentActionMap . FindAction ( "Back" ) . triggered )
ClosePanel ( ) ;
}
}
/// <summary>
/// Scans Application.persistentDataPath to get all the savegames
/// </summary>
[ContextMenu("Discover")]
private void DiscoverSaveFiles ( )
{
2023-04-26 01:28:58 -04:00
if ( ! Directory . Exists ( System . Environment . GetFolderPath ( System . Environment . SpecialFolder . MyDocuments ) + @"\My Games\Firstborn\Saves" ) )
Directory . CreateDirectory ( System . Environment . GetFolderPath ( System . Environment . SpecialFolder . MyDocuments ) + @"\My Games\Firstborn\Saves" ) ;
2023-03-28 13:16:30 -04:00
2023-04-26 01:28:58 -04:00
// Get all files
DirectoryInfo dir = new DirectoryInfo ( System . Environment . GetFolderPath ( System . Environment . SpecialFolder . MyDocuments ) + @"\My Games\Firstborn\Saves" ) ;
2023-03-28 13:16:30 -04:00
FileInfo [ ] info = dir . GetFiles ( "*.json*" ) ;
foreach ( FileInfo f in info )
allSaveFiles . Add ( f ) ;
allSaveFiles . Sort ( SortByCreationDate ) ;
}
/// <summary>
/// Spawns the save games as buttons
/// </summary>
private void SpawnSaveFilesUI ( )
{
for ( int i = 0 ; i < allSaveFiles . Count ; i + + )
{
SaveGameButtonUI go = Instantiate ( savefileUIPrefab , saveFilesT ) . GetComponent < SaveGameButtonUI > ( ) ;
go . text . text = allSaveFiles [ i ] . Name . Substring ( 0 , allSaveFiles [ i ] . Name . IndexOf ( '.' ) ) ;
go . panel = this ;
go . isLoading = false ;
go . LoadSaveFile ( allSaveFiles [ i ] ) ;
if ( firstElementInList = = null )
firstElementInList = go . gameObject ;
}
}
public override void OnSelectedSavegameChanges ( )
{
if ( selectedSaveFile = = null )
{
saveButton . interactable = false ;
deleteButton . interactable = false ;
descriptionContent . SetActive ( false ) ;
}
else
{
saveButton . interactable = true ;
deleteButton . interactable = true ;
descriptionContent . SetActive ( true ) ;
string screenPath = selectedSaveFile . fileInfo . FullName . Substring ( 0 , selectedSaveFile . fileInfo . FullName . IndexOf ( '.' ) ) ;
screenPath + = ".png" ;
screenshot . sprite = LoadSprite ( screenPath ) ;
loadCharName . text = selectedSaveFile . saveFile . PlayerData . playerName ;
loadLevel . text = selectedSaveFile . saveFile . PlayerData . playerLevel . ToString ( ) ;
loadLocation . text = selectedSaveFile . saveFile . PlayerData . playerLocation ;
loadDate . text = selectedSaveFile . saveFile . SaveFileData . saveDate ;
loadSaveNumber . text = selectedSaveFile . saveFile . SaveFileData . saveNumber . ToString ( ) ;
loadSaveVersion . text = selectedSaveFile . saveFile . SaveFileData . fileVersion . ToString ( ) ;
}
}
private Sprite LoadSprite ( string path )
{
if ( string . IsNullOrEmpty ( path ) ) return null ;
if ( System . IO . File . Exists ( path ) )
{
byte [ ] bytes = System . IO . File . ReadAllBytes ( path ) ;
Texture2D texture = new Texture2D ( 1 , 1 ) ;
texture . LoadImage ( bytes ) ;
Sprite sprite = Sprite . Create ( texture , new Rect ( 0 , 0 , texture . width , texture . height ) , new Vector2 ( 0.5f , 0.5f ) ) ;
return sprite ;
}
return null ;
}
public void ConfirmLoadSave ( )
{
Time . timeScale = 1 ;
if ( selectedSaveFile ! = null )
SaveSystemManager . instance . LoadSaveGame ( selectedSaveFile . fileInfo , selectedSaveFile . saveFile ) ;
}
public void CreateNewSavegame ( )
{
StartCoroutine ( CreateNewSavegameTask ( ) ) ;
}
IEnumerator CreateNewSavegameTask ( )
{
alertPanel . SetActive ( true ) ;
SaveSystemManager . instance . SaveOnNewFile ( ) ;
// Clear savegame
foreach ( Transform t in saveFilesT . transform )
if ( t . gameObject . name ! = "_NewSaveButton_" )
Destroy ( t . gameObject ) ;
OnEnable ( ) ;
alertPanel . SetActive ( false ) ;
yield return new WaitForEndOfFrame ( ) ;
ClosePanel ( ) ;
}
public void ClosePanel ( )
{
loadSavePanel . SetActive ( false ) ;
SelectedSaveFile = null ;
// Clear savegame
foreach ( Transform t in saveFilesT . transform )
if ( t . gameObject . name ! = "_NewSaveButton_" )
Destroy ( t . gameObject ) ;
OnPanelCloses . Invoke ( ) ;
}
public void OverwriteButton ( )
{
if ( selectedSaveFile ! = null )
{
overwriteAlertPanel . previouslySelectedObject = EventSystem . current . currentSelectedGameObject ;
overwriteAlertPanel . description . text = "Are you sure you want to overwrite the savegame: " + selectedSaveFile . fileInfo . Name . Substring ( 0 , selectedSaveFile . fileInfo . Name . IndexOf ( '.' ) ) + "?" ;
overwriteAlertPanel . gameObject . SetActive ( true ) ;
if ( RckInput . isUsingGamepad )
{
if ( overwriteAlertPanelDefaultPanel ! = null )
EventSystem . current . SetSelectedGameObject ( overwriteAlertPanelDefaultPanel ) ;
}
}
}
public void ConfirmOverwriteCurrentSave ( )
{
StartCoroutine ( ConfirmOverwriteCurrentSaveTask ( ) ) ;
}
IEnumerator ConfirmOverwriteCurrentSaveTask ( )
{
if ( selectedSaveFile ! = null )
{
overwriteAlertPanel . gameObject . SetActive ( false ) ;
alertPanel . SetActive ( true ) ;
SaveSystemManager . instance . SaveAndOverwrite ( selectedSaveFile . fileInfo , selectedSaveFile . saveFile ) ;
alertPanel . SetActive ( false ) ;
SelectedSaveFile = selectedSaveFile ;
allSaveFiles . Sort ( SortByCreationDate ) ;
// Clear savegame
foreach ( Transform t in saveFilesT . transform )
if ( t . gameObject . name ! = "_NewSaveButton_" )
Destroy ( t . gameObject ) ;
OnEnable ( ) ;
yield return new WaitForEndOfFrame ( ) ;
ClosePanel ( ) ;
}
}
public static int SortByCreationDate ( FileInfo f1 , FileInfo f2 )
{
var d1 = File . GetLastWriteTime ( f1 . FullName ) ;
var d2 = File . GetLastWriteTime ( f2 . FullName ) ;
return System . DateTime . Compare ( d2 , d1 ) ;
}
/// <summary>
/// Selects the first button that represents a savegame
/// </summary>
public void SelectFirstElementInList ( )
{
EventSystem . current . SetSelectedGameObject ( createNewSavegameButton ) ;
//StartCoroutine(SelectFirstElementTask());
}
IEnumerator SelectFirstElementTask ( )
{
while ( ! ready )
yield return null ;
if ( firstElementInList ! = null )
EventSystem . current . SetSelectedGameObject ( firstElementInList ) ;
}
}
}