fixed battle handler, implemented basis for battle
~2h work
This commit is contained in:
parent
1517253bc7
commit
1b450f06a1
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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()) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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<>();
|
||||||
|
|||||||
18
src/at/nanopenguin/mtcg/db/SqlArithmeticOperators.java
Normal file
18
src/at/nanopenguin/mtcg/db/SqlArithmeticOperators.java
Normal 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;
|
||||||
|
}
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
22
src/at/nanopenguin/mtcg/db/SqlCompoundOperator.java
Normal file
22
src/at/nanopenguin/mtcg/db/SqlCompoundOperator.java
Normal 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;
|
||||||
|
}
|
||||||
8
src/at/nanopenguin/mtcg/db/SqlOperator.java
Normal file
8
src/at/nanopenguin/mtcg/db/SqlOperator.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package at.nanopenguin.mtcg.db;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
public interface SqlOperator {
|
||||||
|
default String operator() { return "="; };
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user