Nuevos métodos en dbConnector y cambios varios.

Ahora es posible guardar salas en la Base de datos y obtener algunas cosas.
Hay muchos dilemas sobre la carga de salas desde DB.
Se han hecho pequeños cambios y añadido métodos por aquí y por allá.
This commit is contained in:
2022-06-10 10:38:55 +02:00
parent 4aa05dc211
commit f650a2649f
4 changed files with 258 additions and 22 deletions
@@ -45,7 +45,7 @@ public class GameManager
/** /**
* Realiza el guardado del save y de las salas. * Realiza el guardado del save y de las salas.
*/ */
public void SaveGame() public void SaveGameToJSON()
{ {
SaveLoader.SaveToJSON(saveData, Gdx.files.local(localSavePath + "save.json")); SaveLoader.SaveToJSON(saveData, Gdx.files.local(localSavePath + "save.json"));
rmLoader.SaveAllRoomsToJSON(); rmLoader.SaveAllRoomsToJSON();
@@ -56,7 +56,7 @@ public class GameManager
* No activa ninguna de ellas. * No activa ninguna de ellas.
* Todo: Probablemente queramos también autentificar al usuario. * Todo: Probablemente queramos también autentificar al usuario.
*/ */
public void LoadGame() public void LoadGameFromJSON()
{ {
SaveLoader.LoadFromJSON(Gdx.files.local(localSavePath + "save.json")); SaveLoader.LoadFromJSON(Gdx.files.local(localSavePath + "save.json"));
@@ -84,15 +84,28 @@ public class GameManager
prefab.copyTo(roomSave); prefab.copyTo(roomSave);
} }
/**
* Realiza la compra de una nueva sala. Para ello:
* - Carga la sala por defecto desde el prefab.
* - Se comprueba que se tiene dinero.
* - Guarda la sala en la ubicación de salas del jugador.
* - Resta el dinero que cuesta esta sala.
* - Actualiza el Save para indicar que se tiene esa sala.
* @param roomID
* @return
*/
public boolean ComprarRoom(String roomID) public boolean ComprarRoom(String roomID)
{ {
//Cargamos la sala por defecto desde el prefab de la misma. //Cargamos la sala por defecto desde el prefab de la misma.
rmLoader.LoadRoomFromJSON(Gdx.files.internal(internalRoomDataPath + roomID + ".json")); rmLoader.LoadRoomFromJSON(Gdx.files.internal(internalRoomDataPath + roomID + ".json"));
Room rm = rmLoader.GetRoomByID(roomID); Room rm = rmLoader.GetRoomByID(roomID);
//Es necesario cargar la sala primero para saber su precio.
if(saveData.dinero < rm.roomPrice) if(saveData.dinero < rm.roomPrice)
{ {
Gdx.app.log("GameManager", "No tienes dinero para comprar la sala"); Gdx.app.log("GameManager", "No tienes dinero para comprar la sala");
//Si no se ha comprado, deberíamos descargar la sala.
rmLoader.UnloadRoom(roomID);
return false; return false;
} }
@@ -101,10 +114,19 @@ public class GameManager
//Cobramos por ella. //Cobramos por ella.
saveData.dinero -= rm.roomPrice; saveData.dinero -= rm.roomPrice;
//Fixme: Debería devolver true/false en función de cómo haya ido. //Actualizamos el Save para indicar que se tiene esa sala.
saveData.ownedRooms.put(roomID, true);
return true; return true;
} }
/**
* Realiza las operaciones necesarias para comprar una máquina para la sala activa.
* @param mc Prt a la máquina que queremos añadir.
* @param posX Posición x para la nueva máquina.
* @param posY Posición y para la nueva máquina.
* @return True si la compra se ha completado, false si no.
*/
public boolean ComprarMachine(Machine mc, int posX, int posY) public boolean ComprarMachine(Machine mc, int posX, int posY)
{ {
//Comprobamos si tenemos dinero suficiente. //Comprobamos si tenemos dinero suficiente.
@@ -127,6 +149,20 @@ public class GameManager
} }
/**
* Completa un ciclo del juego y el jugador obtiene el dinero de sus máquinas.
*/
public void CompletarCiclo()
{
//Calculamos el dinero obtenido.
int dineroObtenido = 0;
//TODO: ¿Cómo iteramos por las salas?
// ¿Iteramos por las cargadas o las que se indican en el Save?
//Se itera por las salas y se suma su dinero por ciclo al dinero total.
saveData.dinero += dineroObtenido;
}
@@ -77,15 +77,7 @@ public class RoomLoader
*/ */
public void SaveRoomToJSON(String roomID, FileHandle file) public void SaveRoomToJSON(String roomID, FileHandle file)
{ {
Room rSave = loadedRooms.get(roomID); String data = GetRoomJSON(roomID);
if(rSave == null)
{
Gdx.app.error("RoomLoader", "No es posible guardar la Room: " + roomID +
"; ¿Está cargada?");
return;
}
String data = loaderJson.toJson(rSave);
//FileHandle file = Gdx.files.local(path); //FileHandle file = Gdx.files.local(path);
file.writeString(loaderJson.prettyPrint(data), false); file.writeString(loaderJson.prettyPrint(data), false);
@@ -104,6 +96,25 @@ public class RoomLoader
} }
} }
/**
* Devuelve los datos de la sala en formato JSON.
* @param roomName Nombre de la sala a obtener.
* @return Datos de la sala indicada en formato JSON.
*/
public String GetRoomJSON(String roomName)
{
Room rSave = loadedRooms.get(roomName);
if(rSave == null)
{
Gdx.app.error("RoomLoader", "No es posible guardar la Room: " + roomName +
"; ¿Está cargada?");
return "";
}
String data = loaderJson.toJson(rSave);
return data;
}
/** /**
* Descarga una Room dado su ID. * Descarga una Room dado su ID.
* @param roomID ID de la Room a descargar. * @param roomID ID de la Room a descargar.
@@ -11,6 +11,7 @@ public class Save
{ {
int dinero; int dinero;
/* /*
Indica si el jugador tiene comprada esa sala y, por tanto, ha de aparecer/cargarse. Indica si el jugador tiene comprada esa sala y, por tanto, ha de aparecer/cargarse.
*/ */
@@ -4,11 +4,8 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonWriter; import com.badlogic.gdx.utils.JsonWriter;
import com.mysql.jdbc.Driver;
import java.sql.DriverManager; import java.sql.*;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
/** /**
* Clase estática que realiza todas las interacciones con la BD. * Clase estática que realiza todas las interacciones con la BD.
@@ -21,6 +18,8 @@ public class dbConnector
private static Connection connect = null; private static Connection connect = null;
private static dbData datosConexion = null; private static dbData datosConexion = null;
private static int IDPartida = -1;
private static final String localDefaultSavePath = "gameData/"; private static final String localDefaultSavePath = "gameData/";
private static final String defaultFileName = "dbData.json"; private static final String defaultFileName = "dbData.json";
@@ -116,13 +115,202 @@ public class dbConnector
} }
/**
* Devuelve el ID de partida del jugador. Utiliza el usuario con el que está autentificado.
//TODO: ¿Qué necesito? Creo que el ID de partida... * Sólo se realiza la consulta una vez, luego el valor se guarda.
// ¿Dónde lo guardo? * @return ID de partida del jugador.
public static void SaveRoomToDB() */
public static int GetIDPartidaFromDB()
{ {
//Como siempre es la misma consulta, podemos reutilizar los datos y ahorrarnos la consulta.
if(IDPartida >= 0)
{
return IDPartida;
}
//Si no tenemos los datos, hacemos la consulta.
Statement stt = CrearStatement();
//Obtenemos el ID de partida.
String username = LoginSystem.GetUserName();
IDPartida = GetIDPartidaFromDB(username);
return IDPartida;
}
/**
* Permite obtener el ID de la partida dado un usuario.
* Este método siempre realiza la consulta para obtener este ID.
* @param username Nombre del usuario del que obtener la partida.
* @return ID de la partida del usuario indicado.
*/
public static int GetIDPartidaFromDB(String username)
{
//En este caso, siempre hemos de hacer la consulta.
//Creamos el Statement.
Statement stt = CrearStatement();
//Obtenemos el ID de partida.
int id = -1;
try
{
ResultSet set = stt.executeQuery("select id from partidas where nickname_usuario = '" + username + "';");
id = set.getInt(0);
} catch (SQLException e)
{
Gdx.app.error("dbConnector", "No se ha podido obtener el ID de partida.");
}
//Cerramos el Statement.
CerrarStatement(stt);
return id;
}
/**
* Sube a la DB el Save y los datos del usuario.
* Esto incluye las salas asociadas al mismo.
*/
public static void UploadSave()
{
//TODO: Guardar los datos.
} }
/**
* Sube la sala indicada a la BD.
* @param roomName Nombre de la sala a guardar.
*/
public static void SaveRoomToDB(String roomName)
{
//Obtenemos los datos necesarios.
int idPartida = GetIDPartidaFromDB();
String roomJSON = RoomLoader.getInstance().GetRoomJSON(roomName);
//Comprobamos que se han obtenido los datos de la sala.
if(roomJSON.equals(""))
{
Gdx.app.error("dbConnector", "No se puede guardar la sala " + roomName +
". No se han podido obtener sus datos.");
return;
}
//Creamos el Statement.
Statement stt = CrearStatement();
//Subimos la sala a la DB.
try
{
stt.executeUpdate("update salas set sala_data = '" + roomJSON + "' " +
"where nombre = '" + roomName + "' and " +
"id_partida = " + idPartida + ";");
} catch (SQLException e)
{
Gdx.app.error("dbConnector", "No se ha podido actualizar la sala " + roomName);
}
//Al terminar, cerramos el Statement.
CerrarStatement(stt);
}
/**
* Obtiene los datos de una partida del usuario indicado.
* @param username Nombre del usuario.
* @return Datos de la partida del usuario.
*/
public static Save GetSaveDataFromDB(String username)
{
int idPartidaUser = GetIDPartidaFromDB(username);
//Creamos el statement.
Statement stt = CrearStatement();
Save s = new Save();
//Obtenemos el dinero.
try
{
ResultSet rs = stt.executeQuery("select dinero from partidas where " +
"id = " + idPartidaUser + " and " +
"nickname_usuario = '" + username + "';");
s.dinero = rs.getInt(0);
} catch (SQLException e)
{
Gdx.app.error("dbConnector", "No se ha podido cargar la partida del usuario " + username);
}
//Obtenemos las salas.
//TODO: Completar la carga del Save.
// Supongo que también cargará las salas de ese save.
CerrarStatement(stt);
return s;
}
public static String GetRoomDataFromDB(String roomName)
{
//Obtenemos los datos necesarios.
int idPartida = GetIDPartidaFromDB();
//Creamos el Statement.
Statement stt = CrearStatement();
//Obtenemos el JSON de la sala desde la DB.
String datosJSON = "";
try
{
ResultSet rs = stt.executeQuery("select sala_data from salas where" +
"nombre = '" + roomName + "', " +
"id_partida = " + idPartida + ";");
datosJSON = rs.getString(0);
} catch (SQLException e)
{
Gdx.app.error("dbConnector", "No se han podido obtener los datos de la " + roomName);
}
return datosJSON;
}
/**
* Crea un nuevo Statement a partir de la conexión y lo devuelve.
* @return Statement creado.
*/
private static Statement CrearStatement()
{
Statement stt = null;
try
{
stt = connect.createStatement();
}
catch (Exception e)
{
System.err.println("No ha sido posible comunicarse con la BD.");
}
return stt;
}
/**
* CUIDADO!! Al cerrar Statement, se rompen los datos de ResultSet.
* @param sttCerrar Statement que se quiere cerrar.
*/
private static void CerrarStatement(Statement sttCerrar)
{
try
{
sttCerrar.close();
}
catch (Exception e)
{
System.err.println("No se ha podido cerrar el Statement.");
}
}
} }