fixed battle handler, implemented basis for battle

~2h work
This commit is contained in:
Benedikt Galbavy 2024-01-19 00:01:36 +01:00
parent 1517253bc7
commit 1b450f06a1
11 changed files with 103 additions and 21 deletions

View File

@ -2,16 +2,19 @@ package at.nanopenguin.mtcg.application;
import at.nanopenguin.mtcg.Pair; import at.nanopenguin.mtcg.Pair;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random;
public class Battle { public class Battle {
private Pair<Combatant, Combatant> combatants; private Pair<Combatant, Combatant> combatants;
@Getter @Getter
private volatile List<String> log = new ArrayList<>(); private volatile List<String> log = new ArrayList<>();
@Getter @Getter @Setter
private boolean waiting = true; private boolean firstPlayer = true;
public Battle(Combatant combatant) { public Battle(Combatant combatant) {
this.combatants = new Pair<>(combatant, null); this.combatants = new Pair<>(combatant, null);
@ -21,7 +24,12 @@ public class Battle {
this.combatants.setRight(combatant); this.combatants.setRight(combatant);
} }
public void start() { public void start() throws SQLException {
// placeholder
boolean leftWins = new Random().nextBoolean();
this.combatants.left().updateStats(leftWins);
this.combatants.right().updateStats(!leftWins);
} }
} }

View File

@ -32,7 +32,8 @@ public class BattleHandler {
synchronized (battle) { synchronized (battle) {
this.lock.unlock(); this.lock.unlock();
if (battle.isWaiting()) { if (battle.isFirstPlayer()) {
battle.setFirstPlayer(false);
try { try {
battle.wait(); battle.wait();
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -45,9 +46,9 @@ public class BattleHandler {
battle.addCombatant(new Combatant(userUuid)); battle.addCombatant(new Combatant(userUuid));
battle.start(); battle.start();
}
battle.notify(); battle.notify();
}
return battle.getLog().toArray(new String[0]); return battle.getLog().toArray(new String[0]);
} }
} }

View File

@ -1,6 +1,8 @@
package at.nanopenguin.mtcg.application; package at.nanopenguin.mtcg.application;
import at.nanopenguin.mtcg.Pair;
import at.nanopenguin.mtcg.application.service.schemas.Card; import at.nanopenguin.mtcg.application.service.schemas.Card;
import at.nanopenguin.mtcg.db.*;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -9,11 +11,23 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
public class Combatant { public class Combatant {
private UUID userUuid; private final UUID userUuid;
private List<Card> deck = new ArrayList<Card>(); private List<Card> deck = new ArrayList<Card>();
public Combatant(UUID userUuid) throws SQLException { public Combatant(UUID userUuid) throws SQLException {
this.userUuid = userUuid; this.userUuid = userUuid;
this.deck = Arrays.asList(UserCards.get(userUuid, true)); this.deck = Arrays.asList(UserCards.get(userUuid, true));
} }
public void updateStats(boolean win) throws SQLException {
DbQuery.builder()
.command(SqlCommand.UPDATE)
.table(Table.USERS)
.parameter(win ? "wins = wins" : "losses = losses", new Pair<Integer, SqlOperator>(1, SqlArithmeticOperators.ADD))
.parameter("elo = elo", new Pair<Integer, SqlOperator>(
win ? 3 : 5,
win ? SqlArithmeticOperators.ADD : SqlArithmeticOperators.SUBTRACT)) // stupid hack to use my own code
.condition("uuid", userUuid)
.executeUpdate();
};
} }

View File

@ -2,10 +2,7 @@ package at.nanopenguin.mtcg.application;
import at.nanopenguin.mtcg.Pair; import at.nanopenguin.mtcg.Pair;
import at.nanopenguin.mtcg.application.service.schemas.TradingDeal; import at.nanopenguin.mtcg.application.service.schemas.TradingDeal;
import at.nanopenguin.mtcg.db.DbQuery; import at.nanopenguin.mtcg.db.*;
import at.nanopenguin.mtcg.db.SqlCommand;
import at.nanopenguin.mtcg.db.SqlComparisonOperator;
import at.nanopenguin.mtcg.db.Table;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.val; import lombok.val;

View File

@ -67,7 +67,7 @@ public class User {
.column("elo") .column("elo")
.column("wins") .column("wins")
.column("losses") .column("losses")
.postfix(" ORDER BY elo"); .postfix(" ORDER BY elo DESC");
ArrayList<UserStats> stats = new ArrayList<>(); ArrayList<UserStats> stats = new ArrayList<>();
for (val row : dbQueryBuilder.executeQuery()) { for (val row : dbQueryBuilder.executeQuery()) {

View File

@ -1,8 +1,6 @@
package at.nanopenguin.mtcg.application.service; package at.nanopenguin.mtcg.application.service;
import at.nanopenguin.mtcg.application.SessionHandler; import at.nanopenguin.mtcg.application.*;
import at.nanopenguin.mtcg.application.TokenValidity;
import at.nanopenguin.mtcg.application.User;
import at.nanopenguin.mtcg.http.HttpMethod; import at.nanopenguin.mtcg.http.HttpMethod;
import at.nanopenguin.mtcg.http.HttpRequest; import at.nanopenguin.mtcg.http.HttpRequest;
import at.nanopenguin.mtcg.http.HttpStatus; import at.nanopenguin.mtcg.http.HttpStatus;
@ -32,7 +30,9 @@ public class GameService implements Service {
} }
if (request.getPath().split("/")[1].equals("battles") && request.getMethod() == HttpMethod.POST) { if (request.getPath().split("/")[1].equals("battles") && request.getMethod() == HttpMethod.POST) {
return new Response(HttpStatus.NOT_IMPLEMENTED); return new Response(HttpStatus.OK,
"text/plain",
String.join(System.lineSeparator(), BattleHandler.getInstance().startBattle(userUuid)));
} }
return new Response(HttpStatus.NOT_FOUND); return new Response(HttpStatus.NOT_FOUND);

View File

@ -104,11 +104,11 @@ public final class DbQuery {
continue; continue;
} }
if(parameter.getValue() instanceof Pair && ((Pair<?, ?>) parameter.getValue()).right() instanceof SqlComparisonOperator sqlComparisonOperator) { if (parameter.getValue() instanceof Pair && ((Pair<?, ?>) parameter.getValue()).right() instanceof SqlOperator sqlOperator) {
stringBuilder stringBuilder
.append(parameter.getKey()) .append(parameter.getKey())
.append(" ") .append(" ")
.append(sqlComparisonOperator.Operator) .append(sqlOperator.operator())
.append(" ?"); .append(" ?");
continue; continue;
} }
@ -132,6 +132,10 @@ public final class DbQuery {
new PreparedStatementExecutor(connection.prepareStatement(sql)); new PreparedStatementExecutor(connection.prepareStatement(sql));
int i = 1; int i = 1;
for (val value : parameterValues) { for (val value : parameterValues) {
if (value instanceof Pair<?,?>) {
statementExecutor.setObject(i++, ((Pair<?, ?>) value).left());
continue;
}
if (value instanceof List<?>) { if (value instanceof List<?>) {
for (Object o : (List<?>) value) for (Object o : (List<?>) value)
statementExecutor.setObject(i++, o); statementExecutor.setObject(i++, o);
@ -140,6 +144,7 @@ public final class DbQuery {
statementExecutor.setObject(i++, value); statementExecutor.setObject(i++, value);
} }
System.out.println(sql);
return statementExecutor.executeUpdate(); return statementExecutor.executeUpdate();
} }
} }
@ -155,6 +160,10 @@ public final class DbQuery {
new PreparedStatementExecutor(connection.prepareStatement(sql)); new PreparedStatementExecutor(connection.prepareStatement(sql));
int i = 1; int i = 1;
for (val value : parameterValues) { for (val value : parameterValues) {
if (value instanceof Pair<?,?>) {
statementExecutor.setObject(i++, ((Pair<?, ?>) value).left());
continue;
}
if (value instanceof List<?>) { if (value instanceof List<?>) {
for (Object o : (List<?>) value) for (Object o : (List<?>) value)
statementExecutor.setObject(i++, o); statementExecutor.setObject(i++, o);
@ -163,6 +172,7 @@ public final class DbQuery {
statementExecutor.setObject(i++, value); statementExecutor.setObject(i++, value);
} }
System.out.println(sql);
return statementExecutor.execute(); return statementExecutor.execute();
} }
} }
@ -190,6 +200,7 @@ public final class DbQuery {
statementExecutor.setObject(i++, value); statementExecutor.setObject(i++, value);
} }
System.out.println(sql);
try (ResultSet resultSet = statementExecutor.executeQuery()) { try (ResultSet resultSet = statementExecutor.executeQuery()) {
List<Map<String, Object>> result = new ArrayList<>(); List<Map<String, Object>> result = new ArrayList<>();

View File

@ -0,0 +1,18 @@
package at.nanopenguin.mtcg.db;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
@RequiredArgsConstructor
public enum SqlArithmeticOperators implements SqlOperator {
ADD("+"),
SUBTRACT("-"),
MULTIPLY("*"),
DIVIDE("/"),
MODULO("%");
@Accessors(fluent = true)
@Getter(onMethod = @__(@Override))
public final String operator;
}

View File

@ -1,9 +1,11 @@
package at.nanopenguin.mtcg.db; package at.nanopenguin.mtcg.db;
import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
@RequiredArgsConstructor @RequiredArgsConstructor
public enum SqlComparisonOperator { public enum SqlComparisonOperator implements SqlOperator {
EQUAL("="), EQUAL("="),
GREATER_THAN(">"), GREATER_THAN(">"),
LESS_THAN("<"), LESS_THAN("<"),
@ -11,6 +13,7 @@ public enum SqlComparisonOperator {
LESS_EQUAL("<="), LESS_EQUAL("<="),
NOT_EQUAL("!="); NOT_EQUAL("!=");
public final String Operator; @Accessors(fluent = true)
@Getter(onMethod = @__(@Override))
public final String operator;
} }

View File

@ -0,0 +1,22 @@
package at.nanopenguin.mtcg.db;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
@RequiredArgsConstructor
public enum SqlCompoundOperator implements SqlOperator {
// this class does not work with PostgreSQL https://c.tenor.com/MYZgsN2TDJAAAAAC/tenor.gif
ADD("+="),
SUBTRACT("-="),
MULTIPLY("*="),
DIVIDE("/="),
MODULO("%="),
BIT_AND("&="),
BIT_OR("|*="),
BIT_XOR("^-=");
@Accessors(fluent = true)
@Getter(onMethod = @__(@Override))
public final String operator;
}

View File

@ -0,0 +1,8 @@
package at.nanopenguin.mtcg.db;
import lombok.RequiredArgsConstructor;
public interface SqlOperator {
default String operator() { return "="; };
}