Skip to content
Snippets Groups Projects
Commit 286a54e3 authored by Sixten Müller's avatar Sixten Müller
Browse files

bug: testcommit, might get revoked

parent e66cc25a
No related branches found
No related tags found
2 merge requests!22Resolve "Create game model",!18Draft: Resolve "Create game model"
Showing
with 569 additions and 69 deletions
package com.wordbattle.game; package com.wordbattle.game;
import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener; import com.google.firebase.database.ValueEventListener;
import com.wordbattle.game.model.Category; import com.wordbattle.game.model.Category;
import com.wordbattle.game.model.LobbyModel; import com.wordbattle.game.model.LobbyModel;
...@@ -155,11 +150,12 @@ public class AndroidInterfaceClass implements FirebaseInterface { ...@@ -155,11 +150,12 @@ public class AndroidInterfaceClass implements FirebaseInterface {
@Override @Override
public void addScoreToDatabase(String pin, String nickname) { public void addScoreToDatabase(String pin, String nickname) {
DatabaseReference lobbyRef = FirebaseDatabase.getInstance().getReference("lobbies").child(pin).child("scores"); DatabaseReference scoreRef = FirebaseDatabase.getInstance().getReference("lobbies")
.child(pin).child("players").child(nickname).child("score");
System.out.println("Inside addInitialScore"); System.out.println("Inside addInitialScore");
// Initialize score to 0 for the nickname // Initialize score to 0 for the nickname
lobbyRef.child(nickname).setValue(0) scoreRef.setValue(0)
.addOnSuccessListener(aVoid -> { .addOnSuccessListener(aVoid -> {
System.out.println("Score for " + nickname + " initialized to 0."); System.out.println("Score for " + nickname + " initialized to 0.");
}) })
...@@ -169,38 +165,43 @@ public class AndroidInterfaceClass implements FirebaseInterface { ...@@ -169,38 +165,43 @@ public class AndroidInterfaceClass implements FirebaseInterface {
} }
@Override @Override
public void updateScoreInDatabase(String pin, String nickname, int scoreToAdd, ScoreUpdateCallback callback) { public void updateScoreInDatabase(String pin, String nickname, int scoreToAdd, ScoreUpdateCallback callback) {
// Adjusted reference to match the new database structure
DatabaseReference scoreRef = FirebaseDatabase.getInstance().getReference("lobbies") DatabaseReference scoreRef = FirebaseDatabase.getInstance().getReference("lobbies")
.child(pin).child("players").child(nickname).child("score"); .child(pin).child("players").child(nickname).child("score");
// Read the current score and update it with the new score // First, read the current score
scoreRef.runTransaction(new Transaction.Handler() { scoreRef.addListenerForSingleValueEvent(new ValueEventListener() {
@NonNull
@Override @Override
public Transaction.Result doTransaction(@NonNull MutableData mutableData) { public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Integer currentScore = mutableData.getValue(Integer.class); Integer currentScore = dataSnapshot.getValue(Integer.class);
if (currentScore == null) { if (currentScore == null) {
mutableData.setValue(scoreToAdd); // If there's no score yet, set the new score currentScore = 0; // Default to 0 if not set
} else {
mutableData.setValue(currentScore + scoreToAdd); // Otherwise, add to the current score
}
return Transaction.success(mutableData);
} }
int newScore = currentScore + scoreToAdd;
@Override // Now, update the score with the new value
public void onComplete(@Nullable DatabaseError databaseError, boolean committed, @Nullable DataSnapshot dataSnapshot) { scoreRef.setValue(newScore)
if (committed) { .addOnSuccessListener(aVoid -> {
System.out.println("Score for " + nickname + " updated successfully. Score is " + scoreToAdd); System.out.println("Score for " + nickname + " updated successfully. New score: " + newScore);
if (callback != null) { if (callback != null) {
callback.onSuccess(); callback.onSuccess();
} }
} else { })
System.err.println("Failed to update score for " + nickname + (databaseError != null ? ": " + databaseError.getMessage() : ".")); .addOnFailureListener(e -> {
System.err.println("Failed to update score for " + nickname + ": " + e.getMessage());
if (callback != null) { if (callback != null) {
callback.onFailure(); callback.onFailure();
} }
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
System.err.println("Failed to read current score for " + nickname + ": " + databaseError.getMessage());
if (callback != null) {
callback.onFailure();
} }
} }
}); });
...@@ -208,6 +209,7 @@ public class AndroidInterfaceClass implements FirebaseInterface { ...@@ -208,6 +209,7 @@ public class AndroidInterfaceClass implements FirebaseInterface {
@Override @Override
public void fetchScores(String lobbyPin, ScoreFetchCallback callback) { public void fetchScores(String lobbyPin, ScoreFetchCallback callback) {
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("lobbies").child(lobbyPin).child("scores"); DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("lobbies").child(lobbyPin).child("scores");
...@@ -263,6 +265,33 @@ public class AndroidInterfaceClass implements FirebaseInterface { ...@@ -263,6 +265,33 @@ public class AndroidInterfaceClass implements FirebaseInterface {
}); });
} }
@Override
public void isHost(String pin, String nickname, HostCheckCallback callback) {
DatabaseReference lobbyRef = FirebaseDatabase.getInstance().getReference("lobbies").child(pin);
lobbyRef.child("hostNickname").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String hostNickname = dataSnapshot.getValue(String.class);
if (nickname.equals(hostNickname)) {
// If the nicknames match, the given nickname is the host
callback.onHostCheckResult(true);
} else {
// The given nickname is not the host
callback.onHostCheckResult(false);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Handle possible errors
System.err.println("Database error: " + databaseError.getMessage());
callback.onError(databaseError.getMessage());
}
});
}
public void listenForGameStart(String pin, GameStartCallback callback) { public void listenForGameStart(String pin, GameStartCallback callback) {
DatabaseReference lobbyRef = database.getReference("lobbies").child(pin); DatabaseReference lobbyRef = database.getReference("lobbies").child(pin);
lobbyRef.child("gameStarted").addValueEventListener(new ValueEventListener() { lobbyRef.child("gameStarted").addValueEventListener(new ValueEventListener() {
...@@ -420,6 +449,125 @@ public class AndroidInterfaceClass implements FirebaseInterface { ...@@ -420,6 +449,125 @@ public class AndroidInterfaceClass implements FirebaseInterface {
}); });
} }
public void updateRound(String pin, RoundUpdateCallback callback) {
DatabaseReference roundsRef = FirebaseDatabase.getInstance().getReference("lobbies")
.child(pin).child("rounds");
// Listen for the current round value once
roundsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Integer currentRound = snapshot.getValue(Integer.class);
if (currentRound == null) {
// If it's the first round, set to 1
roundsRef.setValue(1).addOnSuccessListener(aVoid -> {
System.out.println("Round initialized successfully to 1");
callback.onRoundUpdateSuccess();
}).addOnFailureListener(e -> {
System.err.println("Failed to initialize round: " + e.getMessage());
callback.onRoundUpdateFailure();
});
} else {
// Increment the round and set the new value
int newRound = currentRound + 1;
roundsRef.setValue(newRound).addOnSuccessListener(aVoid -> {
System.out.println("Round updated successfully to " + newRound);
callback.onRoundUpdateSuccess();
}).addOnFailureListener(e -> {
System.err.println("Failed to update round: " + e.getMessage());
callback.onRoundUpdateFailure();
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
System.err.println("Failed to fetch current round: " + error.getMessage());
callback.onRoundUpdateFailure();
}
});
}
@Override
public void fetchRound(String pin, RoundCallback callback) {
DatabaseReference roundRef = FirebaseDatabase.getInstance().getReference("lobbies")
.child(pin).child("rounds");
roundRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Integer currentRound = dataSnapshot.getValue(Integer.class);
if (currentRound != null) {
callback.onRoundFetched(currentRound);
} else {
// Handle case where "rounds" node does not exist or is null
callback.onRoundFetched(0); // Assuming 0 as the default round number
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
callback.onError();
}
});
}
@Override
public void resetFlags(String pin) {
DatabaseReference playersRef = FirebaseDatabase.getInstance().getReference("lobbies")
.child(pin).child("players");
// Fetch all players under this pin
playersRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// Iterate over all players
for (DataSnapshot playerSnapshot : dataSnapshot.getChildren()) {
// Reset the "finished" flag for each player
playerSnapshot.getRef().child("finished").setValue(false)
.addOnSuccessListener(aVoid -> System.out.println("Reset finished flag for player " + playerSnapshot.getKey()))
.addOnFailureListener(e -> System.err.println("Failed to reset finished flag for player " + playerSnapshot.getKey() + ": " + e.getMessage()));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
System.err.println("Failed to fetch players for resetting flags: " + databaseError.getMessage());
}
});
}
@Override
public void listenForRoundStarted(String pin, Runnable onRoundStarted) {
DatabaseReference roundStartedRef = database.getReference("lobbies").child(pin).child("roundStarted");
ValueEventListener roundStartedListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Boolean roundStarted = dataSnapshot.getValue(Boolean.class);
if (Boolean.TRUE.equals(roundStarted)) {
// Round started, trigger the provided Runnable
onRoundStarted.run();
// Optionally reset the flag to false if it should only trigger once per round
roundStartedRef.setValue(false);
// Remove this listener to avoid it triggering again
roundStartedRef.removeEventListener(this);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.err.println("Listening for round start cancelled: " + databaseError.getMessage());
}
};
// Add the event listener to the roundStartedRef
roundStartedRef.addValueEventListener(roundStartedListener);
}
private long generateSeedFromPin(String pin) { private long generateSeedFromPin(String pin) {
......
...@@ -4,8 +4,10 @@ import com.badlogic.gdx.Gdx; ...@@ -4,8 +4,10 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.math.Vector3;
import com.wordbattle.game.WordBattle; import com.wordbattle.game.WordBattle;
import com.wordbattle.game.network.FirebaseInterface;
import com.wordbattle.game.states.CreateGameState; import com.wordbattle.game.states.CreateGameState;
import com.wordbattle.game.states.FinalLeaderboardState; import com.wordbattle.game.states.FinalLeaderboardState;
import com.wordbattle.game.states.MainMenuState;
import com.wordbattle.game.view.FinalLeaderBoardView; import com.wordbattle.game.view.FinalLeaderBoardView;
public class FinalLeaderBoardController { public class FinalLeaderBoardController {
...@@ -15,14 +17,22 @@ public class FinalLeaderBoardController { ...@@ -15,14 +17,22 @@ public class FinalLeaderBoardController {
private FinalLeaderBoardView finalLeaderBoardView; private FinalLeaderBoardView finalLeaderBoardView;
private int lenLeaderBordPage; private int lenLeaderBordPage;
private String pin;
private FirebaseInterface _FBIC;
private String nickname;
public FinalLeaderBoardController(FinalLeaderboardState state) {
public FinalLeaderBoardController(FinalLeaderboardState state, FirebaseInterface _FBIC, String pin, String nickname) {
this.state=state; this.state=state;
this._FBIC = _FBIC;
this.pin = pin;
this.nickname = nickname;
finalLeaderBoardView = new FinalLeaderBoardView(state.getCam()); finalLeaderBoardView = new FinalLeaderBoardView(state.getCam());
lenLeaderBordPage=2400; //testing variable until firebase is implemented lenLeaderBordPage=2400; //testing variable until firebase is implemented
finalLeaderBoardView.setNumBackgroundRenders(calculateBackgroundRenders()); //Tells view how many backgroundTextures to load finalLeaderBoardView.setNumBackgroundRenders(calculateBackgroundRenders()); //Tells view how many backgroundTextures to load
getPlayerAndScore();
...@@ -42,9 +52,7 @@ public class FinalLeaderBoardController { ...@@ -42,9 +52,7 @@ public class FinalLeaderBoardController {
Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0); Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
state.getCam().unproject(touchPos); // convert from screen coordinates to world coordinates state.getCam().unproject(touchPos); // convert from screen coordinates to world coordinates
if (finalLeaderBoardView.getBackToStartBounds().contains(touchPos.x, touchPos.y)){ if (finalLeaderBoardView.getBackToStartBounds().contains(touchPos.x, touchPos.y)){
/* state.getStateManager().setState(new MainMenuState(state.getStateManager(), _FBIC)); //midlertidlig
state.getStateManager().setState(new CreateGameState(state.getStateManager())); //midlertidlig
*/
} }
...@@ -57,13 +65,18 @@ public class FinalLeaderBoardController { ...@@ -57,13 +65,18 @@ public class FinalLeaderBoardController {
finalLeaderBoardView.getCam().translate(0,-scrollDistance); finalLeaderBoardView.getCam().translate(0,-scrollDistance);
} }
}
} }
public void getPlayerAndScore() {
_FBIC.getPlayerAndScore(pin, playerScores -> {
Gdx.app.postRunnable(() -> {
if (finalLeaderBoardView != null) {
finalLeaderBoardView.setMap(playerScores);
System.out.println(playerScores);
}
});
});
} }
public void render(SpriteBatch sb){ public void render(SpriteBatch sb){
......
...@@ -23,6 +23,7 @@ public class GamePlayController { ...@@ -23,6 +23,7 @@ public class GamePlayController {
private Character selectedLetter = null; private Character selectedLetter = null;
private int selectedIndex = -1; private int selectedIndex = -1;
private String nickname; private String nickname;
private int round;
...@@ -116,8 +117,31 @@ public class GamePlayController { ...@@ -116,8 +117,31 @@ public class GamePlayController {
} }
public void fetchRound() {
}
public void fetchWord() { public void fetchWord() {
_FBIC.fetchWord(pin, "Animals", new FirebaseInterface.WordFetchCallback() { _FBIC.fetchRound(pin, new FirebaseInterface.RoundCallback() {
@Override
public void onRoundFetched(int fetchedRound) {
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
round = fetchedRound;
// Now that we have the round, you can perform checks or update the state
}
});
}
@Override
public void onError() {
System.err.println("Error fetching round");
// Handle error, perhaps retry or provide user feedback
}
});
_FBIC.fetchWord(pin + round, "Animals", new FirebaseInterface.WordFetchCallback() {
@Override @Override
public void onWordFetched(String word) { public void onWordFetched(String word) {
gamePlayView.setCurrentWord(word.toUpperCase()); gamePlayView.setCurrentWord(word.toUpperCase());
......
...@@ -7,6 +7,7 @@ import com.badlogic.gdx.math.Vector3; ...@@ -7,6 +7,7 @@ import com.badlogic.gdx.math.Vector3;
import com.wordbattle.game.WordBattle; import com.wordbattle.game.WordBattle;
import com.wordbattle.game.network.FirebaseInterface; import com.wordbattle.game.network.FirebaseInterface;
import com.wordbattle.game.states.CreateGameState; import com.wordbattle.game.states.CreateGameState;
import com.wordbattle.game.states.GamePlayState;
import com.wordbattle.game.states.LeaderBoardState; import com.wordbattle.game.states.LeaderBoardState;
import com.wordbattle.game.view.LeaderBoardView; import com.wordbattle.game.view.LeaderBoardView;
...@@ -30,10 +31,65 @@ public class LeaderBoardController { ...@@ -30,10 +31,65 @@ public class LeaderBoardController {
this._FBIC = _FBIC; this._FBIC = _FBIC;
this.pin = pin; this.pin = pin;
this.nickname = nickname; this.nickname = nickname;
resetFinishedFlagForAllPlayers();
leaderBoardView = new LeaderBoardView(state.getCam()); leaderBoardView = new LeaderBoardView(state.getCam());
lenLeaderBordPage=2400; //testing variable until firebase is implemented lenLeaderBordPage=2400; //testing variable until firebase is implemented
leaderBoardView.setNumBackgroundRenders(calculateBackgroundRenders()); //Tells view how many backgroundTextures to load leaderBoardView.setNumBackgroundRenders(calculateBackgroundRenders()); //Tells view how many backgroundTextures to load
getPlayerAndScore(); getPlayerAndScore();
listenForRoundStarted();
checkHost();
}
private void listenForRoundStarted() {
// Assuming _FBIC is your FirebaseInterface instance and pin is your game's pin
_FBIC.listenForRoundStarted(pin, new Runnable() {
@Override
public void run() {
// This code will be executed when the round starts flag is set to true
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
startNewRound();
}
});
}
});
}
private void checkHost() {
_FBIC.isHost(pin, nickname, new FirebaseInterface.HostCheckCallback() {
@Override
public void onHostCheckResult(boolean isHost) {
if (isHost) {
leaderBoardView.setHost(true);
} else {
leaderBoardView.setHost(false);
}
}
@Override
public void onError(String error) {
// Handle error
}
});
}
private void startNewRound() {
System.out.println("A new round has started. Preparing game for the next round...");
state.getStateManager().setState(new GamePlayState(state.getStateManager(), _FBIC, pin, nickname));
}
private void resetFinishedFlagForAllPlayers() {
_FBIC.resetFlags(pin);
} }
...@@ -46,9 +102,7 @@ public class LeaderBoardController { ...@@ -46,9 +102,7 @@ public class LeaderBoardController {
Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0); Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
state.getCam().unproject(touchPos); // convert from screen coordinates to world coordinates state.getCam().unproject(touchPos); // convert from screen coordinates to world coordinates
if (leaderBoardView.getNextRoundBounds().contains(touchPos.x, touchPos.y)){ if (leaderBoardView.getNextRoundBounds().contains(touchPos.x, touchPos.y)){
/* state.getStateManager().setState(new GamePlayState(state.getStateManager(), _FBIC, pin, nickname));
state.getStateManager().setState(new CreateGameState(state.getStateManager())); //midlertidlig
*/
} }
...@@ -65,6 +119,8 @@ public class LeaderBoardController { ...@@ -65,6 +119,8 @@ public class LeaderBoardController {
} }
// Inside your controller class // Inside your controller class
public void getPlayerAndScore() { public void getPlayerAndScore() {
......
...@@ -3,6 +3,7 @@ package com.wordbattle.game.controller; ...@@ -3,6 +3,7 @@ package com.wordbattle.game.controller;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.wordbattle.game.network.FirebaseInterface; import com.wordbattle.game.network.FirebaseInterface;
import com.wordbattle.game.states.FinalLeaderboardState;
import com.wordbattle.game.states.JoinGameState; import com.wordbattle.game.states.JoinGameState;
import com.wordbattle.game.states.LeaderBoardState; import com.wordbattle.game.states.LeaderBoardState;
import com.wordbattle.game.states.MainMenuState; import com.wordbattle.game.states.MainMenuState;
...@@ -20,6 +21,8 @@ public class WaitingLobbyController { ...@@ -20,6 +21,8 @@ public class WaitingLobbyController {
private float timer; private float timer;
private boolean allPlayersFinished; private boolean allPlayersFinished;
private boolean scoreUpdated = false; // Add this field private boolean scoreUpdated = false; // Add this field
private boolean roundUpdated = false;
private int round;
public WaitingLobbyController(WaitingLobbyState state, FirebaseInterface _FBIC, String nickname, int score, String pin) { public WaitingLobbyController(WaitingLobbyState state, FirebaseInterface _FBIC, String nickname, int score, String pin) {
...@@ -27,24 +30,68 @@ public class WaitingLobbyController { ...@@ -27,24 +30,68 @@ public class WaitingLobbyController {
this._FBIC = _FBIC; this._FBIC = _FBIC;
this.nickname = nickname; this.nickname = nickname;
this.score = score; this.score = score;
System.out.println("Score in Controller: " + score);
this.pin = pin; this.pin = pin;
updateScore(() -> { updateScore();
scoreUpdated = true;
updateRound(() -> {
roundUpdated = true;
}); });
fetchRound();
waitingLobbyView= new WaitingLobbyView(state.getCam()); waitingLobbyView= new WaitingLobbyView(state.getCam());
}
public void updateRound(Runnable onRoundUpdated) {
_FBIC.updateRound(pin, new FirebaseInterface.RoundUpdateCallback() {
@Override
public void onRoundUpdateSuccess() {
Gdx.app.postRunnable(onRoundUpdated);
}
@Override
public void onRoundUpdateFailure() {
System.out.println("Failed to update round");
}
});
} }
public void handleInput(){ public void handleInput(){
} }
public void updateScore(Runnable onScoreUpdated) { public void fetchRound() {
_FBIC.fetchRound(pin, new FirebaseInterface.RoundCallback() {
@Override
public void onRoundFetched(int fetchedRound) {
Gdx.app.postRunnable(() -> {
round = fetchedRound;
// Now that we have the round, you can perform checks or update the state
});
}
@Override
public void onError() {
System.err.println("Error fetching round");
// Handle error, perhaps retry or provide user feedback
}
});
}
public void updateScore() {
_FBIC.updateScoreInDatabase(pin, nickname, score, new FirebaseInterface.ScoreUpdateCallback() { _FBIC.updateScoreInDatabase(pin, nickname, score, new FirebaseInterface.ScoreUpdateCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
System.out.println("Score updated successfully."); System.out.println("Score updated successfully.");
Gdx.app.postRunnable(onScoreUpdated); // Continue on the main thread after score update Gdx.app.postRunnable(() -> {
scoreUpdated = true; // This variable should be a class-level field
});
} }
@Override @Override
...@@ -55,18 +102,24 @@ public class WaitingLobbyController { ...@@ -55,18 +102,24 @@ public class WaitingLobbyController {
} }
public void update(float dt) { public void update(float dt) {
timer += dt; timer += dt;
if (scoreUpdated) { if (scoreUpdated) {
boolean allPlayersFinished = _FBIC.checkIfAllPlayersAreFinished(pin); boolean allPlayersFinished = _FBIC.checkIfAllPlayersAreFinished(pin);
if (timer >= 10) { if (timer >= 10 && round < 3 ) { // This means 4 rounds, starting from 0
Gdx.app.postRunnable(() -> { Gdx.app.postRunnable(() -> {
state.getStateManager().setState(new LeaderBoardState(state.getStateManager(), _FBIC, pin, nickname)); state.getStateManager().setState(new LeaderBoardState(state.getStateManager(), _FBIC, pin, nickname));
}); });
} else if (timer >= 10 && round == 3) {
Gdx.app.postRunnable(() -> {
state.getStateManager().setState(new FinalLeaderboardState(state.getStateManager(), _FBIC, pin, nickname));
});
}
} }
handleInput(); handleInput();
}
} }
public void render(SpriteBatch spriteBatch){ public void render(SpriteBatch spriteBatch){
......
...@@ -18,6 +18,9 @@ public class LobbyModel { ...@@ -18,6 +18,9 @@ public class LobbyModel {
private Map<String, PlayerModel> players; // Updated to use PlayerModel private Map<String, PlayerModel> players; // Updated to use PlayerModel
private List<String> playerNicknames; // Optional, depending on usage private List<String> playerNicknames; // Optional, depending on usage
private Map<String, Integer> scores; // Optional, depending on usage private Map<String, Integer> scores; // Optional, depending on usage
private int rounds; // Add this line for the rounds counter
private boolean roundStarted;
public LobbyModel() { public LobbyModel() {
// Initialize empty constructor to allow to create lobby from snapshot of DB // Initialize empty constructor to allow to create lobby from snapshot of DB
...@@ -33,6 +36,9 @@ public class LobbyModel { ...@@ -33,6 +36,9 @@ public class LobbyModel {
this.players = new HashMap<>(); this.players = new HashMap<>();
// Add the host player to the players map // Add the host player to the players map
this.players.put(hostNickname, new PlayerModel(0, false)); // Initialize with default values this.players.put(hostNickname, new PlayerModel(0, false)); // Initialize with default values
this.rounds = 0; // Initialize the rounds counter
this.roundStarted = false;
} }
public String getHostNickname() { public String getHostNickname() {
...@@ -47,6 +53,14 @@ public class LobbyModel { ...@@ -47,6 +53,14 @@ public class LobbyModel {
return pin; return pin;
} }
public int getRounds() {
return rounds;
}
public void setRounds(int rounds) {
this.rounds = rounds;
}
public void setPin(String pin) { public void setPin(String pin) {
this.pin = pin; this.pin = pin;
} }
......
...@@ -19,6 +19,14 @@ public interface FirebaseInterface { ...@@ -19,6 +19,14 @@ public interface FirebaseInterface {
void startGame(String pin); void startGame(String pin);
void isHost(String pin, String nickname, HostCheckCallback callback);
interface HostCheckCallback {
void onHostCheckResult(boolean isHost);
void onError(String error);
}
void listenForGameStart(String pin, GameStartCallback callback); void listenForGameStart(String pin, GameStartCallback callback);
long getSeed(); long getSeed();
...@@ -31,10 +39,24 @@ public interface FirebaseInterface { ...@@ -31,10 +39,24 @@ public interface FirebaseInterface {
void getPlayerAndScore(String pin, PlayerScoreCallback callback); void getPlayerAndScore(String pin, PlayerScoreCallback callback);
void updateRound(String pin, RoundUpdateCallback callback);
void fetchRound(String pin, RoundCallback callback);
void resetFlags(String pin);
void listenForRoundStarted(String pin, Runnable onRoundStarted);
interface PlayerScoreCallback { interface PlayerScoreCallback {
void onPlayerScoresReceived(Map<String, Integer> playerScores); void onPlayerScoresReceived(Map<String, Integer> playerScores);
} }
interface RoundUpdateCallback {
void onRoundUpdateSuccess();
void onRoundUpdateFailure();
}
interface GameStartCallback { interface GameStartCallback {
void onGameStarted(); void onGameStarted();
...@@ -59,6 +81,16 @@ public interface FirebaseInterface { ...@@ -59,6 +81,16 @@ public interface FirebaseInterface {
void addScoreToDatabase(String pin, String nickname); void addScoreToDatabase(String pin, String nickname);
void updateScoreInDatabase(String pin, String nickname, int newScore, ScoreUpdateCallback callback); void updateScoreInDatabase(String pin, String nickname, int newScore, ScoreUpdateCallback callback);
interface ScoreUpdateCallback {
void onSuccess();
void onFailure();
}
interface RoundCallback {
void onRoundFetched(int round);
void onError();
}
void fetchScores(String pin, ScoreFetchCallback callback); void fetchScores(String pin, ScoreFetchCallback callback);
...@@ -68,10 +100,7 @@ public interface FirebaseInterface { ...@@ -68,10 +100,7 @@ public interface FirebaseInterface {
void onError(String error); void onError(String error);
} }
interface ScoreUpdateCallback {
void onSuccess();
void onFailure();
}
} }
...@@ -57,6 +57,13 @@ public class FirebaseManager implements FirebaseInterface { ...@@ -57,6 +57,13 @@ public class FirebaseManager implements FirebaseInterface {
} }
@Override
public void isHost(String pin, String nickname, HostCheckCallback callback) {
}
@Override @Override
public void listenForGameStart(String pin, GameStartCallback callback) { public void listenForGameStart(String pin, GameStartCallback callback) {
} }
...@@ -86,5 +93,25 @@ public class FirebaseManager implements FirebaseInterface { ...@@ -86,5 +93,25 @@ public class FirebaseManager implements FirebaseInterface {
} }
@Override
public void updateRound(String pin, RoundUpdateCallback callback) {
}
@Override
public void fetchRound(String pin, RoundCallback callback) {
}
@Override
public void resetFlags(String pin) {
}
@Override
public void listenForRoundStarted(String pin, Runnable onRoundStarted) {
}
} }
...@@ -3,13 +3,22 @@ package com.wordbattle.game.states; ...@@ -3,13 +3,22 @@ package com.wordbattle.game.states;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.wordbattle.game.WordBattle; import com.wordbattle.game.WordBattle;
import com.wordbattle.game.controller.FinalLeaderBoardController; import com.wordbattle.game.controller.FinalLeaderBoardController;
import com.wordbattle.game.network.FirebaseInterface;
import com.wordbattle.game.network.FirebaseManager;
public class FinalLeaderboardState extends BaseState { public class FinalLeaderboardState extends BaseState {
private String pin;
private FirebaseInterface _FBIC;
private String nickname;
FinalLeaderBoardController controller; FinalLeaderBoardController controller;
public FinalLeaderboardState(StateManager gsm) { public FinalLeaderboardState(StateManager gsm, FirebaseInterface _FBIC, String pin, String nickname) {
super(gsm); super(gsm);
this.controller = new FinalLeaderBoardController(this); // 'this' provides context this._FBIC = _FBIC;
this.pin = pin;
this.nickname = nickname;
this.controller = new FinalLeaderBoardController(this, _FBIC, pin, nickname); // 'this' provides context
cam.setToOrtho(false, WordBattle.WIDTH, WordBattle.HEIGHT); cam.setToOrtho(false, WordBattle.WIDTH, WordBattle.HEIGHT);
} }
......
...@@ -11,6 +11,10 @@ import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; ...@@ -11,6 +11,10 @@ import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Rectangle;
import com.wordbattle.game.WordBattle; import com.wordbattle.game.WordBattle;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class FinalLeaderBoardView { public class FinalLeaderBoardView {
private OrthographicCamera cam; private OrthographicCamera cam;
...@@ -25,7 +29,7 @@ public class FinalLeaderBoardView { ...@@ -25,7 +29,7 @@ public class FinalLeaderBoardView {
private Texture thirdPlaceTex; private Texture thirdPlaceTex;
private Texture BackToStartTex; private Texture backToStartTex;
private Rectangle backToStartBounds; private Rectangle backToStartBounds;
...@@ -34,6 +38,9 @@ public class FinalLeaderBoardView { ...@@ -34,6 +38,9 @@ public class FinalLeaderBoardView {
private BitmapFont titleFont; private BitmapFont titleFont;
private Map<String, Integer> playerScoresMap;
private int numBackgroundRenders; private int numBackgroundRenders;
...@@ -52,7 +59,7 @@ public class FinalLeaderBoardView { ...@@ -52,7 +59,7 @@ public class FinalLeaderBoardView {
secondPlaceTex = new Texture("Nr2Emoji.png"); secondPlaceTex = new Texture("Nr2Emoji.png");
thirdPlaceTex = new Texture("Nr3Emoji.png"); thirdPlaceTex = new Texture("Nr3Emoji.png");
BackToStartTex = new Texture("BackToStartButton.png"); backToStartTex = new Texture("BackToStartButton.png");
...@@ -87,31 +94,72 @@ public class FinalLeaderBoardView { ...@@ -87,31 +94,72 @@ public class FinalLeaderBoardView {
} }
//spriteBatch.draw(purpleRectangle,10,- spriteBatch.draw(backToStartTex, getBackToStartBounds().x,getBackToStartBounds().y-10, getBackToStartBounds().getWidth(), getBackToStartBounds().getHeight()+20);
spriteBatch.draw(BackToStartTex,backToStartBounds.x,backToStartBounds.y-10, backToStartBounds.getWidth(),backToStartBounds.getHeight()+20);
titleFont.draw(spriteBatch,"LeaderBoard", 40, 660);
titleFont.draw(spriteBatch,"Final Result", 40, 660); if (playerScoresMap != null) {
int yPos = 490; // Initial Y position for the first player entry
int place = 1; // Initialize the place counter
spriteBatch.draw(pinkBubble,45,490,400,100); // Sort the player scores by score (from high to low)
spriteBatch.draw(firstPlaceTex,80,520,35,35); List<Map.Entry<String, Integer>> sortedScores = new ArrayList<>(playerScoresMap.entrySet());
playerFont.draw(spriteBatch,"Marcus",120,560); sortedScores.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
// Render each player entry
for (Map.Entry<String, Integer> entry : sortedScores) {
String playerName = entry.getKey();
int score = entry.getValue();
spriteBatch.draw(goldenBubble,45,410,400,100); spriteBatch.draw(pinkBubble, 45, yPos, 400, 100); // Adjust X and Y positions as needed
spriteBatch.draw(secondPlaceTex,80,440,35,35); spriteBatch.draw(getPlaceTexture(place), 80, yPos + 30, 35, 35); // Adjust X and Y positions as needed
playerFont.draw(spriteBatch, playerName, 120, yPos + 70); // Adjust X and Y positions as needed
playerFont.draw(spriteBatch, String.valueOf(score), 350, yPos + 70); // Render the score next to the player name
playerFont.draw(spriteBatch,"Askh",120,480); // Update Y position for the next player entry
yPos -= 120; // Adjust this value as needed
// Increment the place counter
place++;
}
}
/*spriteBatch.draw(pinkBubble,45,490,400,100);
spriteBatch.draw(firstPlaceTex,80,520,35,35);
playerFont.draw(spriteBatch,"Marcus",120,560);
spriteBatch.draw(goldenBubble,45,410,400,100);
spriteBatch.draw(secondPlaceTex,80,440,35,35);
playerFont.draw(spriteBatch,"Askh",120,480);
*/
spriteBatch.end(); spriteBatch.end();
}
private Texture getPlaceTexture(int place) {
switch (place) {
case 1:
return firstPlaceTex;
case 2:
return secondPlaceTex;
case 3:
return thirdPlaceTex;
default:
return null;
}
}
public void setMap(Map<String, Integer> playerScores) {
this.playerScoresMap = playerScores;
if (!playerScores.isEmpty()) {
List<Integer> scores = new ArrayList<>(playerScores.values());
int firstPlayerScore = scores.get(0);
System.out.println("Score of the first player: " + firstPlayerScore);
}
} }
public OrthographicCamera getCam() { public OrthographicCamera getCam() {
...@@ -133,7 +181,7 @@ public class FinalLeaderBoardView { ...@@ -133,7 +181,7 @@ public class FinalLeaderBoardView {
firstPlaceTex.dispose(); firstPlaceTex.dispose();
secondPlaceTex.dispose(); secondPlaceTex.dispose();
thirdPlaceTex.dispose(); thirdPlaceTex.dispose();
BackToStartTex.dispose(); backToStartTex.dispose();
} }
......
...@@ -44,6 +44,7 @@ public class LeaderBoardView { ...@@ -44,6 +44,7 @@ public class LeaderBoardView {
private BitmapFont titleFont; private BitmapFont titleFont;
private int numBackgroundRenders; private int numBackgroundRenders;
private Map<String, Integer> playerScoresMap; private Map<String, Integer> playerScoresMap;
private boolean isHost;
...@@ -92,9 +93,11 @@ public class LeaderBoardView { ...@@ -92,9 +93,11 @@ public class LeaderBoardView {
spriteBatch.draw(background,0,0-(i*WordBattle.HEIGHT), WordBattle.WIDTH,WordBattle.HEIGHT); spriteBatch.draw(background,0,0-(i*WordBattle.HEIGHT), WordBattle.WIDTH,WordBattle.HEIGHT);
} }
if (isHost) {
spriteBatch.draw(nextRoundTex,getNextRoundBounds().x,getNextRoundBounds().y-10, getNextRoundBounds().getWidth(),getNextRoundBounds().getHeight()+20); spriteBatch.draw(nextRoundTex,getNextRoundBounds().x,getNextRoundBounds().y-10, getNextRoundBounds().getWidth(),getNextRoundBounds().getHeight()+20);
spriteBatch.draw(ArrowTex,350,715,50,25); spriteBatch.draw(ArrowTex,350,715,50,25);
}
...@@ -153,6 +156,10 @@ public class LeaderBoardView { ...@@ -153,6 +156,10 @@ public class LeaderBoardView {
} }
} }
public void setHost(boolean host) {
isHost = host;
}
public OrthographicCamera getCam() { public OrthographicCamera getCam() {
return cam; return cam;
} }
......
package com.wordbattle.game; package com.wordbattle.game;
import com.wordbattle.game.model.Category;
import com.wordbattle.game.model.Word;
import com.wordbattle.game.network.FirebaseInterface; import com.wordbattle.game.network.FirebaseInterface;
...@@ -27,4 +29,74 @@ public class DesktopInterfaceClass implements FirebaseInterface{ ...@@ -27,4 +29,74 @@ public class DesktopInterfaceClass implements FirebaseInterface{
} }
@Override
public void startGame(String pin) {
}
@Override
public void listenForGameStart(String pin, GameStartCallback callback) {
}
@Override
public long getSeed() {
return 0;
}
@Override
public void fetchWord(String pin, String category, WordFetchCallback callback) {
}
@Override
public boolean checkIfAllPlayersAreFinished(String pin) {
return false;
}
@Override
public void updateFinishedFlag(String nickname, String pin) {
}
@Override
public void getPlayerAndScore(String pin, PlayerScoreCallback callback) {
}
@Override
public void updateRound(String pin, RoundUpdateCallback callback) {
}
@Override
public void fetchRound(String pin, RoundCallback callback) {
}
@Override
public void createNewCategory(Category category) {
}
@Override
public void addWordToCategory(String categoryName, Word word) {
}
@Override
public void addScoreToDatabase(String pin, String nickname) {
}
@Override
public void updateScoreInDatabase(String pin, String nickname, int newScore, ScoreUpdateCallback callback) {
}
@Override
public void fetchScores(String pin, ScoreFetchCallback callback) {
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment