From 4852e6c08a0dd759a60b34b0d03c1f1eedc23805 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Tue, 3 Aug 2021 19:06:15 +0200 Subject: feat(battle): to-trip fightrequest --- api/src/main/java/akkamon/api/MessagingEngine.java | 27 +- .../java/akkamon/api/models/BattleInitEvent.java | 20 -- .../java/akkamon/api/models/BattleRequestBody.java | 5 - api/src/main/java/akkamon/api/models/Event.java | 21 +- .../main/java/akkamon/api/models/EventType.java | 7 +- .../java/akkamon/api/models/HeartBeatEvent.java | 14 - .../akkamon/api/models/InteractionStartEvent.java | 14 - .../api/models/OutgoingInteractionRequest.java | 15 - .../akkamon/api/models/battle/BattleInitEvent.java | 22 ++ .../api/models/outgoing/HeartBeatEvent.java | 16 ++ .../api/models/outgoing/InteractionStartEvent.java | 16 ++ .../outgoing/OutgoingInteractionRequest.java | 17 ++ client/src/akkamon/client/Client.ts | 4 +- client/src/akkamon/client/EventType.ts | 2 +- client/src/akkamon/client/OutgoingEvents.ts | 4 +- client/src/akkamon/scenes/BattleScene.ts | 4 +- .../java/akkamon/domain/AkkamonMessageEngine.java | 3 + domain/src/main/java/akkamon/domain/Direction.java | 9 - .../main/java/akkamon/domain/HeartBeatQuery.java | 134 --------- .../java/akkamon/domain/InteractionHandshaker.java | 149 ---------- .../main/java/akkamon/domain/InteractionTypes.java | 5 - domain/src/main/java/akkamon/domain/TilePos.java | 10 - .../java/akkamon/domain/actors/AkkamonBattle.java | 35 +++ .../java/akkamon/domain/actors/AkkamonNexus.java | 17 ++ .../akkamon/domain/actors/SceneTrainerGroup.java | 18 +- .../main/java/akkamon/domain/actors/Trainer.java | 24 +- .../domain/actors/tasks/heartbeat/Direction.java | 9 + .../actors/tasks/heartbeat/HeartBeatQuery.java | 134 +++++++++ .../domain/actors/tasks/heartbeat/TilePos.java | 10 + .../tasks/interactions/InteractionHandshaker.java | 149 ++++++++++ .../tasks/interactions/InteractionTypes.java | 5 + .../main/java/akkamon/domain/model/Factory.java | 5 - .../java/akkamon/domain/model/akkamon/Factory.java | 5 + .../java/akkamon/domain/model/akkamon/Mon.java | 18 +- .../java/akkamon/domain/model/akkamon/Stat.java | 8 + .../model/akkamon/abilities/AbilityFactory.java | 2 +- .../domain/model/akkamon/abilities/Immunity.java | 24 -- .../domain/model/akkamon/moves/MovesFactory.java | 302 +++++++++++---------- .../akkamon/moves/implementations/Agility.java | 25 -- .../akkamon/moves/implementations/Amnesia.java | 30 -- .../akkamon/moves/implementations/Blizzard.java | 30 -- .../akkamon/moves/implementations/BodySlam.java | 30 -- .../akkamon/moves/implementations/Earthquake.java | 30 -- .../akkamon/moves/implementations/IceBeam.java | 30 -- .../akkamon/moves/implementations/Psychic.java | 30 -- .../akkamon/moves/implementations/Reflect.java | 30 -- .../model/akkamon/moves/implementations/Rest.java | 30 -- .../akkamon/moves/implementations/SoftBoiled.java | 30 -- .../akkamon/moves/implementations/SwordsDance.java | 26 -- .../akkamon/moves/implementations/ThunderWave.java | 30 -- .../model/akkamon/moves/implementations/Wrap.java | 30 -- .../domain/model/akkamon/status/NoStatus.java | 29 -- .../domain/model/akkamon/status/StatusFactory.java | 2 - .../domain/model/akkamon/types/TypeFactory.java | 2 +- .../akkamon/domain/model/battle/BattleEngine.java | 5 + .../model/battle/requests/BattleRequestBody.java | 17 ++ .../domain/model/battle/requests/JsonToMove.java | 18 ++ .../model/battle/requests/RequestBattleAction.java | 8 + 58 files changed, 757 insertions(+), 988 deletions(-) delete mode 100644 api/src/main/java/akkamon/api/models/BattleInitEvent.java delete mode 100644 api/src/main/java/akkamon/api/models/BattleRequestBody.java delete mode 100644 api/src/main/java/akkamon/api/models/HeartBeatEvent.java delete mode 100644 api/src/main/java/akkamon/api/models/InteractionStartEvent.java delete mode 100644 api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java create mode 100644 api/src/main/java/akkamon/api/models/battle/BattleInitEvent.java create mode 100644 api/src/main/java/akkamon/api/models/outgoing/HeartBeatEvent.java create mode 100644 api/src/main/java/akkamon/api/models/outgoing/InteractionStartEvent.java create mode 100644 api/src/main/java/akkamon/api/models/outgoing/OutgoingInteractionRequest.java delete mode 100644 domain/src/main/java/akkamon/domain/Direction.java delete mode 100644 domain/src/main/java/akkamon/domain/HeartBeatQuery.java delete mode 100644 domain/src/main/java/akkamon/domain/InteractionHandshaker.java delete mode 100644 domain/src/main/java/akkamon/domain/InteractionTypes.java delete mode 100644 domain/src/main/java/akkamon/domain/TilePos.java create mode 100644 domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/Direction.java create mode 100644 domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/HeartBeatQuery.java create mode 100644 domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/TilePos.java create mode 100644 domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionHandshaker.java create mode 100644 domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionTypes.java delete mode 100644 domain/src/main/java/akkamon/domain/model/Factory.java create mode 100644 domain/src/main/java/akkamon/domain/model/akkamon/Factory.java create mode 100644 domain/src/main/java/akkamon/domain/model/battle/requests/BattleRequestBody.java create mode 100644 domain/src/main/java/akkamon/domain/model/battle/requests/JsonToMove.java create mode 100644 domain/src/main/java/akkamon/domain/model/battle/requests/RequestBattleAction.java diff --git a/api/src/main/java/akkamon/api/MessagingEngine.java b/api/src/main/java/akkamon/api/MessagingEngine.java index aa559d0..0ac07fd 100644 --- a/api/src/main/java/akkamon/api/MessagingEngine.java +++ b/api/src/main/java/akkamon/api/MessagingEngine.java @@ -3,12 +3,19 @@ package akkamon.api; import akka.actor.typed.ActorRef; import akka.actor.typed.ActorSystem; import akkamon.api.models.*; +import akkamon.api.models.battle.BattleInitEvent; +import akkamon.api.models.outgoing.HeartBeatEvent; +import akkamon.api.models.outgoing.InteractionStartEvent; +import akkamon.api.models.outgoing.OutgoingInteractionRequest; import akkamon.domain.AkkamonMessageEngine; import akkamon.domain.actors.AkkamonBattle; import akkamon.domain.actors.AkkamonNexus; import akkamon.domain.AkkamonSession; -import akkamon.domain.InteractionHandshaker; +import akkamon.domain.actors.tasks.interactions.InteractionHandshaker; +import akkamon.domain.model.akkamon.Mon; +import akkamon.domain.model.battle.requests.JsonToMove; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import java.util.*; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -23,7 +30,9 @@ public class MessagingEngine implements AkkamonMessageEngine { private Map trainerIDToAkkamonSessions = new HashMap<>(); private Map> pendingInteractioRequestToHandshaker = new HashMap<>(); - private Gson gson = new Gson(); + private final Gson gson = new GsonBuilder() + .registerTypeAdapter(Mon.Move.class, new JsonToMove()) + .create(); public MessagingEngine() { this.nexus = ActorSystem.create(AkkamonNexus.create(this), "akkamon-system"); @@ -198,7 +207,13 @@ public class MessagingEngine implements AkkamonMessageEngine { } } + @Override + public void removeTrainerSessionFromHeartBeat(AkkamonNexus.TrainerID trainerID, AkkamonSession session) { + trainerIDToAkkamonSessions.remove(trainerID); + } + void incoming(AkkamonSession session, String message) { + // System.out.println(message); Event event = gson.fromJson(message, Event.class); if (event == null) { System.out.println("Received non-supported message DTO."); @@ -263,6 +278,14 @@ public class MessagingEngine implements AkkamonMessageEngine { nexus )); break; + case BATTLE_ACTION_REQUEST: + nexus.tell( + new AkkamonBattle.RequestAction( + event.trainerID, + event.body + ) + ); + break; case HEART_BEAT: //System.out.println("My <3 beats!"); break; diff --git a/api/src/main/java/akkamon/api/models/BattleInitEvent.java b/api/src/main/java/akkamon/api/models/BattleInitEvent.java deleted file mode 100644 index c0f2fbe..0000000 --- a/api/src/main/java/akkamon/api/models/BattleInitEvent.java +++ /dev/null @@ -1,20 +0,0 @@ -package akkamon.api.models; - -import akkamon.domain.actors.AkkamonNexus; -import akkamon.domain.model.battle.BattleMessage; -import akkamon.domain.model.battle.state.BattleState; - -import java.util.ArrayList; -import java.util.Map; - -public class BattleInitEvent extends Event { - - public ArrayList participants; - public BattleMessage message; - - public BattleInitEvent(ArrayList participants, BattleMessage introductionMessage) { - this.type = EventType.BATTLE_INIT; - this.participants = participants; - this.message = introductionMessage; - } -} diff --git a/api/src/main/java/akkamon/api/models/BattleRequestBody.java b/api/src/main/java/akkamon/api/models/BattleRequestBody.java deleted file mode 100644 index 2a1a423..0000000 --- a/api/src/main/java/akkamon/api/models/BattleRequestBody.java +++ /dev/null @@ -1,5 +0,0 @@ -package akkamon.api.models; - -public class BattleRequestBody { - public -} diff --git a/api/src/main/java/akkamon/api/models/Event.java b/api/src/main/java/akkamon/api/models/Event.java index 7ee3ee1..1c9dcc4 100644 --- a/api/src/main/java/akkamon/api/models/Event.java +++ b/api/src/main/java/akkamon/api/models/Event.java @@ -1,8 +1,9 @@ package akkamon.api.models; +import akkamon.domain.model.battle.requests.BattleRequestBody; import akkamon.domain.actors.AkkamonNexus; -import akkamon.domain.Direction; -import akkamon.domain.TilePos; +import akkamon.domain.actors.tasks.heartbeat.Direction; +import akkamon.domain.actors.tasks.heartbeat.TilePos; public class Event { public EventType type; @@ -12,5 +13,19 @@ public class Event { public Interaction interaction; public String requestName; public boolean value; - public BattleRequestBody battleRequestBody; + public BattleRequestBody body; + + @Override + public String toString() { + return "Event{" + + "type=" + type + + ", trainerID=" + trainerID + + ", direction=" + direction + + ", tilePos=" + tilePos + + ", interaction=" + interaction + + ", requestName='" + requestName + '\'' + + ", value=" + value + + ", body=" + body + + '}'; + } } diff --git a/api/src/main/java/akkamon/api/models/EventType.java b/api/src/main/java/akkamon/api/models/EventType.java index 497da49..295eb4c 100644 --- a/api/src/main/java/akkamon/api/models/EventType.java +++ b/api/src/main/java/akkamon/api/models/EventType.java @@ -30,10 +30,13 @@ public enum EventType { @SerializedName("InteractionReplyEvent") INTERACTION_REPLY, + @SerializedName("InteractionStarting") + INTERACTION_START, + @SerializedName("BattleInitEvent") BATTLE_INIT, - @SerializedName("InteractionStarting") - INTERACTION_START + @SerializedName("BattleActionRequest") + BATTLE_ACTION_REQUEST, } diff --git a/api/src/main/java/akkamon/api/models/HeartBeatEvent.java b/api/src/main/java/akkamon/api/models/HeartBeatEvent.java deleted file mode 100644 index 2ec98ad..0000000 --- a/api/src/main/java/akkamon/api/models/HeartBeatEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package akkamon.api.models; - -import akkamon.domain.actors.AkkamonNexus; - -import java.util.Map; - -public class HeartBeatEvent extends Event { - public Map remoteMovementQueues; - - public HeartBeatEvent(Map remoteMovementQueues) { - this.type = EventType.HEART_BEAT; - this.remoteMovementQueues = remoteMovementQueues; - } -} diff --git a/api/src/main/java/akkamon/api/models/InteractionStartEvent.java b/api/src/main/java/akkamon/api/models/InteractionStartEvent.java deleted file mode 100644 index ce00437..0000000 --- a/api/src/main/java/akkamon/api/models/InteractionStartEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package akkamon.api.models; - -import com.google.gson.JsonElement; - -public class InteractionStartEvent extends Event { - - public String interactionType; - - public InteractionStartEvent(String requestName, String interactionType) { - this.type = EventType.INTERACTION_START; - this.requestName = requestName; - this.interactionType = interactionType; - } -} diff --git a/api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java b/api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java deleted file mode 100644 index 9360384..0000000 --- a/api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package akkamon.api.models; - -import akkamon.domain.actors.AkkamonNexus; - -public class OutgoingInteractionRequest extends Event { - - public String interactionType; - - public OutgoingInteractionRequest(String interactionType, AkkamonNexus.TrainerID trainerID, String requestName) { - this.type = EventType.INTERACTION_REQUEST; - this.interactionType = interactionType; - this.trainerID = trainerID; - this.requestName = requestName; - } -} diff --git a/api/src/main/java/akkamon/api/models/battle/BattleInitEvent.java b/api/src/main/java/akkamon/api/models/battle/BattleInitEvent.java new file mode 100644 index 0000000..2755155 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/battle/BattleInitEvent.java @@ -0,0 +1,22 @@ +package akkamon.api.models.battle; + +import akkamon.api.models.Event; +import akkamon.api.models.EventType; +import akkamon.domain.actors.AkkamonNexus; +import akkamon.domain.model.battle.BattleMessage; +import akkamon.domain.model.battle.state.BattleState; + +import java.util.ArrayList; +import java.util.Map; + +public class BattleInitEvent extends Event { + + public ArrayList participants; + public BattleMessage message; + + public BattleInitEvent(ArrayList participants, BattleMessage introductionMessage) { + this.type = EventType.BATTLE_INIT; + this.participants = participants; + this.message = introductionMessage; + } +} diff --git a/api/src/main/java/akkamon/api/models/outgoing/HeartBeatEvent.java b/api/src/main/java/akkamon/api/models/outgoing/HeartBeatEvent.java new file mode 100644 index 0000000..24cf357 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/outgoing/HeartBeatEvent.java @@ -0,0 +1,16 @@ +package akkamon.api.models.outgoing; + +import akkamon.api.models.Event; +import akkamon.api.models.EventType; +import akkamon.domain.actors.AkkamonNexus; + +import java.util.Map; + +public class HeartBeatEvent extends Event { + public Map remoteMovementQueues; + + public HeartBeatEvent(Map remoteMovementQueues) { + this.type = EventType.HEART_BEAT; + this.remoteMovementQueues = remoteMovementQueues; + } +} diff --git a/api/src/main/java/akkamon/api/models/outgoing/InteractionStartEvent.java b/api/src/main/java/akkamon/api/models/outgoing/InteractionStartEvent.java new file mode 100644 index 0000000..acb6365 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/outgoing/InteractionStartEvent.java @@ -0,0 +1,16 @@ +package akkamon.api.models.outgoing; + +import akkamon.api.models.Event; +import akkamon.api.models.EventType; +import com.google.gson.JsonElement; + +public class InteractionStartEvent extends Event { + + public String interactionType; + + public InteractionStartEvent(String requestName, String interactionType) { + this.type = EventType.INTERACTION_START; + this.requestName = requestName; + this.interactionType = interactionType; + } +} diff --git a/api/src/main/java/akkamon/api/models/outgoing/OutgoingInteractionRequest.java b/api/src/main/java/akkamon/api/models/outgoing/OutgoingInteractionRequest.java new file mode 100644 index 0000000..4a9d021 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/outgoing/OutgoingInteractionRequest.java @@ -0,0 +1,17 @@ +package akkamon.api.models.outgoing; + +import akkamon.api.models.Event; +import akkamon.api.models.EventType; +import akkamon.domain.actors.AkkamonNexus; + +public class OutgoingInteractionRequest extends Event { + + public String interactionType; + + public OutgoingInteractionRequest(String interactionType, AkkamonNexus.TrainerID trainerID, String requestName) { + this.type = EventType.INTERACTION_REQUEST; + this.interactionType = interactionType; + this.trainerID = trainerID; + this.requestName = requestName; + } +} diff --git a/client/src/akkamon/client/Client.ts b/client/src/akkamon/client/Client.ts index 1ee02b8..9c7f25b 100644 --- a/client/src/akkamon/client/Client.ts +++ b/client/src/akkamon/client/Client.ts @@ -49,7 +49,7 @@ import { StopMovingEvent, BattleRequestBody, RequestBattleAction, - OutgoingBattleRequest + BattleActionRequest } from './OutgoingEvents'; import type BattleScene from '../scenes/BattleScene'; @@ -318,7 +318,7 @@ export class Client implements AkkamonClient makeBattleRequest(body: BattleRequestBody) { this.send( - new OutgoingBattleRequest( + new BattleActionRequest( this.getTrainerID()!, body ) diff --git a/client/src/akkamon/client/EventType.ts b/client/src/akkamon/client/EventType.ts index 66752e5..fee80d2 100644 --- a/client/src/akkamon/client/EventType.ts +++ b/client/src/akkamon/client/EventType.ts @@ -14,6 +14,6 @@ export enum EventType { INTERACTION_ABORTED = "InteractionAbortedEvent", INTERACTION_START = "InteractionStarting", BATTLE_INIT = "BattleInitEvent", - BATTLE_REQUEST = "BattleRequest" + BATTLE_ACTION_REQUEST = "BattleActionRequest" } diff --git a/client/src/akkamon/client/OutgoingEvents.ts b/client/src/akkamon/client/OutgoingEvents.ts index 48ddd92..7f3c294 100644 --- a/client/src/akkamon/client/OutgoingEvents.ts +++ b/client/src/akkamon/client/OutgoingEvents.ts @@ -35,8 +35,8 @@ export type BattleRequestBody = { } -export class OutgoingBattleRequest implements OutgoingEvent { - public type: EventType = EventType.BATTLE_REQUEST; +export class BattleActionRequest implements OutgoingEvent { + public type: EventType = EventType.BATTLE_ACTION_REQUEST; constructor( public trainerID: TrainerID, diff --git a/client/src/akkamon/scenes/BattleScene.ts b/client/src/akkamon/scenes/BattleScene.ts index 5fed40a..51bb793 100644 --- a/client/src/akkamon/scenes/BattleScene.ts +++ b/client/src/akkamon/scenes/BattleScene.ts @@ -1,6 +1,6 @@ import { client } from '../../app'; import type { Mon, Move } from '../client/IncomingEvents'; -import { OutgoingBattleRequest, RequestBattleAction } from '../client/OutgoingEvents'; +import { BattleActionRequest, RequestBattleAction } from '../client/OutgoingEvents'; import { baseStack, Queue, queueFromArray } from '../DataWrappers'; import type { BasePhaserScene, GConstructor } from '../PhaserTypes'; import type { BattleUIEvent, DialogueUIEvent, InstantUIEvent } from '../render/BattleEngine'; @@ -173,7 +173,7 @@ export default class BattleScene extends Phaser.Scene { this.setWaitingUntilBattleEvent(); client.makeBattleRequest( { - requestAction: RequestBattleAction, + requestAction: RequestBattleAction.FIGHT, move: move } ); diff --git a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java index 142d063..fbdaea8 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java +++ b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java @@ -3,6 +3,7 @@ package akkamon.domain; import akka.actor.typed.ActorRef; import akkamon.domain.actors.AkkamonBattle; import akkamon.domain.actors.AkkamonNexus; +import akkamon.domain.actors.tasks.interactions.InteractionHandshaker; import java.util.List; import java.util.Map; @@ -27,4 +28,6 @@ public interface AkkamonMessageEngine { void broadCastHandshakeFail(String requestName, Set waitingToStartInteraction); void broadCastBattleStart(AkkamonBattle.BattleCreatedResponse response); + + void removeTrainerSessionFromHeartBeat(AkkamonNexus.TrainerID trainerID, AkkamonSession session); } diff --git a/domain/src/main/java/akkamon/domain/Direction.java b/domain/src/main/java/akkamon/domain/Direction.java deleted file mode 100644 index 71343c6..0000000 --- a/domain/src/main/java/akkamon/domain/Direction.java +++ /dev/null @@ -1,9 +0,0 @@ -package akkamon.domain; - -public enum Direction { - UP, - DOWN, - LEFT, - RIGHT, - NONE -} diff --git a/domain/src/main/java/akkamon/domain/HeartBeatQuery.java b/domain/src/main/java/akkamon/domain/HeartBeatQuery.java deleted file mode 100644 index 45d6e38..0000000 --- a/domain/src/main/java/akkamon/domain/HeartBeatQuery.java +++ /dev/null @@ -1,134 +0,0 @@ -package akkamon.domain; - -import akka.actor.typed.ActorRef; -import akka.actor.typed.Behavior; -import akka.actor.typed.javadsl.*; -import akkamon.domain.actors.AkkamonNexus; -import akkamon.domain.actors.Trainer; - -import java.time.Duration; -import java.util.*; - -import static akkamon.domain.actors.AkkamonNexus.*; - -public class HeartBeatQuery extends AbstractBehavior { - - public interface Command {} - - private static enum CollectionTimeout implements Command { - INSTANCE - } - - static class WrappedRespondMovementQueue implements Command { - final Trainer.RespondMovementQueue response; - - WrappedRespondMovementQueue( - Trainer.RespondMovementQueue response - ) { - this.response = response; - } - } - - private static class TrainerOffline implements Command { - final TrainerID trainerID; - - private TrainerOffline(TrainerID trainerID) { - this.trainerID = trainerID; - } - } - - public static Behavior create( - Map> trainerIDToActor, - long requestId, - String sceneId, - ActorRef requester, - Duration timeout - ) { - return Behaviors.setup( - context -> - Behaviors.withTimers( - timers -> new HeartBeatQuery( - trainerIDToActor, - requestId, - sceneId, - requester, - timeout, - context, - timers - ) - ) - ); - } - - private final long requestId; - private final String sceneId; - private final ActorRef requester; - private Map repliesSoFar = new HashMap<>(); - private final Set stillWaiting; - - public HeartBeatQuery( - Map> trainerIDToActor, - long requestId, - String sceneId, - ActorRef requester, - Duration timeout, - ActorContext context, - TimerScheduler timers) { - super(context); - this.requestId = requestId; - this.sceneId = sceneId; - this.requester = requester; - - timers.startSingleTimer(CollectionTimeout.INSTANCE, timeout); - - ActorRef respondTrainerPositionAdapter = - context.messageAdapter(Trainer.RespondMovementQueue.class, WrappedRespondMovementQueue::new); - - for (Map.Entry> entry : trainerIDToActor.entrySet()) { - context.watchWith(entry.getValue(), new TrainerOffline(entry.getKey())); - entry.getValue().tell( - new Trainer.ReadMovementQueue( - 0L, - respondTrainerPositionAdapter - )); - } - stillWaiting = new HashSet<>(trainerIDToActor.keySet()); - } - - @Override - public Receive createReceive() { - return newReceiveBuilder() - .onMessage(WrappedRespondMovementQueue.class, this::onRespondMovementQueue) - .build(); - } - - private Behavior onRespondMovementQueue(WrappedRespondMovementQueue r) { - MovementQueueReading movementQueueRead = null; - if (r.response.value.size() != 0) { - movementQueueRead = new MovementQueue(r.response.value); - } else { - Queue queue = new LinkedList<>(); - queue.add(Direction.NONE); - movementQueueRead = new MovementQueue(queue); - } - - TrainerID trainerID = r.response.trainerID; - repliesSoFar.put(trainerID, movementQueueRead); - stillWaiting.remove(trainerID); - - return respondWhenAllCollected(); - } - - private Behavior respondWhenAllCollected() { - if (stillWaiting.isEmpty()) { - requester.tell(new RespondHeartBeatQuery( - requestId, - sceneId, - repliesSoFar)); - return Behaviors.stopped(); - } else { - return this; - } - } - -} diff --git a/domain/src/main/java/akkamon/domain/InteractionHandshaker.java b/domain/src/main/java/akkamon/domain/InteractionHandshaker.java deleted file mode 100644 index 186c310..0000000 --- a/domain/src/main/java/akkamon/domain/InteractionHandshaker.java +++ /dev/null @@ -1,149 +0,0 @@ -package akkamon.domain; - -import akka.actor.typed.ActorRef; -import akka.actor.typed.Behavior; -import akka.actor.typed.javadsl.*; -import akkamon.domain.actors.AkkamonNexus; - -import java.time.Duration; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static akkamon.domain.actors.AkkamonNexus.*; - -public class InteractionHandshaker extends AbstractBehavior { - - public interface Command { - } - - public static enum HandshakeResult implements Command { - FAIL, - SUCCESS - } - - public static class InteractionReply implements Command { - public String requestName; - public TrainerID trainerID; - public boolean value; - - public InteractionReply(String requestName, TrainerID trainerID, boolean value) { - this.requestName = requestName; - this.trainerID = trainerID; - this.value = value; - } - } - - public static Behavior create( - TrainerID trainerID, - String type, - List needingConfirmation, - String requestName, - ActorRef replyTo, - Duration timeout) { - - return Behaviors.setup( - context -> Behaviors.withTimers( - timers -> new InteractionHandshaker( - context, - trainerID, - type, - new HashSet(needingConfirmation), - requestName, - replyTo, - timeout, - timers - ) - )); - } - - private Set stillWaiting; - - private ActorRef replyTo; - - private String requestName; - private String type; - - private Set waitingToStartInteraction = new HashSet<>(); - - public InteractionHandshaker(ActorContext context, - TrainerID trainerID, - String type, - Set needingToShakeHands, - String requestName, - ActorRef replyTo, - Duration timeout, - TimerScheduler timers) { - - super(context); - - timers.startSingleTimer(HandshakeResult.FAIL, timeout); - - this.replyTo = replyTo; - this.requestName = requestName; - this.type = type; - - waitingToStartInteraction.add(trainerID); - stillWaiting = needingToShakeHands; - } - - @Override - public Receive createReceive() { - return newReceiveBuilder() - .onMessage(InteractionReply.class, this::onReply) - .onMessage(HandshakeResult.class, this::onHandshakeFail) - .build(); - } - - private Behavior onHandshakeFail(HandshakeResult instance) { - getContext().getLog().info("Received fail instance due to timeout!"); - - replyTo.tell( - new RespondInteractionHandshaker( - requestName, - type, - HandshakeResult.FAIL, - waitingToStartInteraction - ) - ); - return Behaviors.stopped(); - } - - - private Behavior onReply(InteractionReply r) { - getContext().getLog().info("received reply from {} with value {}!", r.trainerID, r.value); - getContext().getLog().info(String.valueOf(stillWaiting)); - stillWaiting.remove(r.trainerID); - getContext().getLog().info(String.valueOf(stillWaiting)); - this.waitingToStartInteraction.add(r.trainerID); - if (r.value) { - return respondIfAllRepliesReceived(); - } else { - replyTo.tell(new RespondInteractionHandshaker( - requestName, - type, - HandshakeResult.FAIL, - waitingToStartInteraction - )); - return Behaviors.stopped(); - } - } - - private Behavior respondIfAllRepliesReceived() { - getContext().getLog().info(String.valueOf(stillWaiting)); - - if (this.stillWaiting.isEmpty()) { - getContext().getLog().info("Sending out interaction Start!"); - replyTo.tell(new RespondInteractionHandshaker( - requestName, - type, - HandshakeResult.SUCCESS, - waitingToStartInteraction - )); - return Behaviors.stopped(); - } else { - return this; - } - } - -} diff --git a/domain/src/main/java/akkamon/domain/InteractionTypes.java b/domain/src/main/java/akkamon/domain/InteractionTypes.java deleted file mode 100644 index b915893..0000000 --- a/domain/src/main/java/akkamon/domain/InteractionTypes.java +++ /dev/null @@ -1,5 +0,0 @@ -package akkamon.domain; - -public enum InteractionTypes { - BATTLE -} diff --git a/domain/src/main/java/akkamon/domain/TilePos.java b/domain/src/main/java/akkamon/domain/TilePos.java deleted file mode 100644 index 95e3f71..0000000 --- a/domain/src/main/java/akkamon/domain/TilePos.java +++ /dev/null @@ -1,10 +0,0 @@ -package akkamon.domain; - -public class TilePos { - public int x; - public int y; - - public String toString() { - return "tilePos={x: " + x + ", y: " + y + "}"; - } -} diff --git a/domain/src/main/java/akkamon/domain/actors/AkkamonBattle.java b/domain/src/main/java/akkamon/domain/actors/AkkamonBattle.java index c6cd508..ef7dc2e 100644 --- a/domain/src/main/java/akkamon/domain/actors/AkkamonBattle.java +++ b/domain/src/main/java/akkamon/domain/actors/AkkamonBattle.java @@ -8,6 +8,7 @@ import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Receive; import akkamon.domain.model.battle.BattleEngine; import akkamon.domain.model.battle.BattleMessage; +import akkamon.domain.model.battle.requests.BattleRequestBody; import java.util.HashSet; import java.util.Map; @@ -19,6 +20,26 @@ public class AkkamonBattle extends AbstractBehavior { public interface Command { } + public static class RequestAction + implements AkkamonNexus.Command, SceneTrainerGroup.Command, Trainer.Command, Command { + + public AkkamonNexus.TrainerID trainerID; + public BattleRequestBody body; + + public RequestAction(AkkamonNexus.TrainerID trainerID, BattleRequestBody battleRequestBody) { + this.trainerID = trainerID; + this.body = battleRequestBody; + } + + @Override + public String toString() { + return "RequestAction{" + + "trainerID=" + trainerID + + ", body=" + body + + '}'; + } + } + public static class BattleCreatedResponse implements AkkamonNexus.Command { public Set participants; public Map initState; @@ -46,6 +67,8 @@ public class AkkamonBattle extends AbstractBehavior { private ActorRef replyTo; + private Set nextTurnActions = new HashSet<>(); + public AkkamonBattle( ActorContext context, Set participants, @@ -72,6 +95,17 @@ public class AkkamonBattle extends AbstractBehavior { .build(); } + private Behavior onRequestBattleAction(RequestAction requestAction) { + nextTurnActions.add(requestAction); + if (nextTurnActions.size() == participants.size()) { + engine.play(nextTurnActions); + nextTurnActions.clear(); + } else { + getContext().getLog().info("Received battle action request of {} but not playing until all received, {}", requestAction.trainerID, requestAction.body); + } + return inProgress(); + } + private Behavior onBattleStart(AkkamonNexus.BattleStart start) { AkkamonNexus.TrainerID linkingTrainer = start.trainerID; getContext().getLog().info(String.valueOf(needLink)); @@ -95,6 +129,7 @@ public class AkkamonBattle extends AbstractBehavior { private Behavior inProgress() { return Behaviors.receive(Command.class) + .onMessage(RequestAction.class, this::onRequestBattleAction) .build(); } diff --git a/domain/src/main/java/akkamon/domain/actors/AkkamonNexus.java b/domain/src/main/java/akkamon/domain/actors/AkkamonNexus.java index 32acbf1..f592148 100644 --- a/domain/src/main/java/akkamon/domain/actors/AkkamonNexus.java +++ b/domain/src/main/java/akkamon/domain/actors/AkkamonNexus.java @@ -7,6 +7,9 @@ import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Receive; import akkamon.domain.*; +import akkamon.domain.actors.tasks.heartbeat.Direction; +import akkamon.domain.actors.tasks.interactions.InteractionHandshaker; +import akkamon.domain.actors.tasks.heartbeat.TilePos; import java.time.Duration; import java.util.*; @@ -298,9 +301,22 @@ public class AkkamonNexus extends AbstractBehavior { .onMessage(RespondInteractionHandshaker.class, this::onInteractionHandshakerResponse) .onMessage(AkkamonBattle.BattleCreatedResponse.class, this::onBattleCreatedResponse) + .onMessage(AkkamonBattle.RequestAction.class, this::onRequestBattleAction) .build(); } + private AkkamonNexus onRequestBattleAction(AkkamonBattle.RequestAction requestAction) { + // just pass on the message for now + // TODO do some checks here? + ActorRef sceneContaining = sceneIdToActor.get(requestAction.trainerID.scene); + if (sceneContaining != null) { + sceneContaining.tell(requestAction); + } else { + getContext().getLog().info("Ignoring battle request"); + } + return this; + } + private AkkamonNexus onBattleCreatedResponse(AkkamonBattle.BattleCreatedResponse r) { getContext().getLog().info("Created battle between {} and {}, they should now only be listening to battle commands!"); messageEngine.broadCastBattleStart(r); @@ -372,6 +388,7 @@ public class AkkamonNexus extends AbstractBehavior { private AkkamonNexus onTrainerOffline(RespondTrainerOffline trainerOfflineMsg) { getContext().getLog().info("Removing {} from akkamon sessions!", trainerOfflineMsg.session.gettrainerID()); messageEngine.removeTrainerSessionFromScene(trainerOfflineMsg.trainerID, trainerOfflineMsg.session); + messageEngine.removeTrainerSessionFromHeartBeat(trainerOfflineMsg.trainerID, trainerOfflineMsg.session); return this; } diff --git a/domain/src/main/java/akkamon/domain/actors/SceneTrainerGroup.java b/domain/src/main/java/akkamon/domain/actors/SceneTrainerGroup.java index 933e2b1..1265fe1 100644 --- a/domain/src/main/java/akkamon/domain/actors/SceneTrainerGroup.java +++ b/domain/src/main/java/akkamon/domain/actors/SceneTrainerGroup.java @@ -6,7 +6,7 @@ import akka.actor.typed.javadsl.AbstractBehavior; import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Receive; -import akkamon.domain.HeartBeatQuery; +import akkamon.domain.actors.tasks.heartbeat.HeartBeatQuery; import java.time.Duration; import java.util.HashMap; @@ -78,10 +78,24 @@ public class SceneTrainerGroup extends AbstractBehavior trainer = trainerIDToActor.get(requestAction.trainerID); + if (trainer != null) { + trainer.tell(requestAction); + } else { + getContext().getLog().info("Ignoring battle action request"); + } + return this; + } + private SceneTrainerGroup onBattleStarting(AkkamonNexus.BattleStart battle) { ActorRef trainer = this.trainerIDToActor.get(battle.trainerID); if (trainer != null) { diff --git a/domain/src/main/java/akkamon/domain/actors/Trainer.java b/domain/src/main/java/akkamon/domain/actors/Trainer.java index 2ebe2ed..4cb9356 100644 --- a/domain/src/main/java/akkamon/domain/actors/Trainer.java +++ b/domain/src/main/java/akkamon/domain/actors/Trainer.java @@ -6,8 +6,8 @@ import akka.actor.typed.javadsl.AbstractBehavior; import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Receive; -import akkamon.domain.Direction; -import akkamon.domain.TilePos; +import akkamon.domain.actors.tasks.heartbeat.Direction; +import akkamon.domain.actors.tasks.heartbeat.TilePos; import java.util.LinkedList; import java.util.Optional; @@ -90,16 +90,34 @@ public class Trainer extends AbstractBehavior { RequestNewTilePos.class, this::onNewTilePos ) - .onMessage(AkkamonNexus.BattleStart.class, this::onBattleStart) + .onMessage( + AkkamonNexus.BattleStart.class, this::onBattleStart + ) + .onMessage( + AkkamonBattle.RequestAction.class, this::onRequestBattleAction + ) .build(); } private Behavior battling() { return Behaviors.receive(Command.class) .onMessage(ReadMovementQueue.class, this::onReadMovementQueue) + .onMessage( + AkkamonBattle.RequestAction.class, this::onRequestBattleAction + ) .build(); } + private Trainer onRequestBattleAction(AkkamonBattle.RequestAction requestAction) { + if (battleRef != null) { + battleRef.tell(requestAction); + } else { + getContext().getLog().info("trainer is not in a battle!"); + } + return this; + } + + private Behavior onBattleStart(AkkamonNexus.BattleStart battle) { getContext().getLog().info("Trainer {} now has a battle ref and has battle behavior", trainerID); this.battleRef = battle.ref; diff --git a/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/Direction.java b/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/Direction.java new file mode 100644 index 0000000..43c557c --- /dev/null +++ b/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/Direction.java @@ -0,0 +1,9 @@ +package akkamon.domain.actors.tasks.heartbeat; + +public enum Direction { + UP, + DOWN, + LEFT, + RIGHT, + NONE +} diff --git a/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/HeartBeatQuery.java b/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/HeartBeatQuery.java new file mode 100644 index 0000000..e89cdc2 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/HeartBeatQuery.java @@ -0,0 +1,134 @@ +package akkamon.domain.actors.tasks.heartbeat; + +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.javadsl.*; +import akkamon.domain.actors.AkkamonNexus; +import akkamon.domain.actors.Trainer; + +import java.time.Duration; +import java.util.*; + +import static akkamon.domain.actors.AkkamonNexus.*; + +public class HeartBeatQuery extends AbstractBehavior { + + public interface Command {} + + private static enum CollectionTimeout implements Command { + INSTANCE + } + + static class WrappedRespondMovementQueue implements Command { + final Trainer.RespondMovementQueue response; + + WrappedRespondMovementQueue( + Trainer.RespondMovementQueue response + ) { + this.response = response; + } + } + + private static class TrainerOffline implements Command { + final TrainerID trainerID; + + private TrainerOffline(TrainerID trainerID) { + this.trainerID = trainerID; + } + } + + public static Behavior create( + Map> trainerIDToActor, + long requestId, + String sceneId, + ActorRef requester, + Duration timeout + ) { + return Behaviors.setup( + context -> + Behaviors.withTimers( + timers -> new HeartBeatQuery( + trainerIDToActor, + requestId, + sceneId, + requester, + timeout, + context, + timers + ) + ) + ); + } + + private final long requestId; + private final String sceneId; + private final ActorRef requester; + private Map repliesSoFar = new HashMap<>(); + private final Set stillWaiting; + + public HeartBeatQuery( + Map> trainerIDToActor, + long requestId, + String sceneId, + ActorRef requester, + Duration timeout, + ActorContext context, + TimerScheduler timers) { + super(context); + this.requestId = requestId; + this.sceneId = sceneId; + this.requester = requester; + + timers.startSingleTimer(CollectionTimeout.INSTANCE, timeout); + + ActorRef respondTrainerPositionAdapter = + context.messageAdapter(Trainer.RespondMovementQueue.class, WrappedRespondMovementQueue::new); + + for (Map.Entry> entry : trainerIDToActor.entrySet()) { + context.watchWith(entry.getValue(), new TrainerOffline(entry.getKey())); + entry.getValue().tell( + new Trainer.ReadMovementQueue( + 0L, + respondTrainerPositionAdapter + )); + } + stillWaiting = new HashSet<>(trainerIDToActor.keySet()); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(WrappedRespondMovementQueue.class, this::onRespondMovementQueue) + .build(); + } + + private Behavior onRespondMovementQueue(WrappedRespondMovementQueue r) { + MovementQueueReading movementQueueRead = null; + if (r.response.value.size() != 0) { + movementQueueRead = new MovementQueue(r.response.value); + } else { + Queue queue = new LinkedList<>(); + queue.add(Direction.NONE); + movementQueueRead = new MovementQueue(queue); + } + + TrainerID trainerID = r.response.trainerID; + repliesSoFar.put(trainerID, movementQueueRead); + stillWaiting.remove(trainerID); + + return respondWhenAllCollected(); + } + + private Behavior respondWhenAllCollected() { + if (stillWaiting.isEmpty()) { + requester.tell(new RespondHeartBeatQuery( + requestId, + sceneId, + repliesSoFar)); + return Behaviors.stopped(); + } else { + return this; + } + } + +} diff --git a/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/TilePos.java b/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/TilePos.java new file mode 100644 index 0000000..60d3b88 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/actors/tasks/heartbeat/TilePos.java @@ -0,0 +1,10 @@ +package akkamon.domain.actors.tasks.heartbeat; + +public class TilePos { + public int x; + public int y; + + public String toString() { + return "tilePos={x: " + x + ", y: " + y + "}"; + } +} diff --git a/domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionHandshaker.java b/domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionHandshaker.java new file mode 100644 index 0000000..85daee2 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionHandshaker.java @@ -0,0 +1,149 @@ +package akkamon.domain.actors.tasks.interactions; + +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.javadsl.*; +import akkamon.domain.actors.AkkamonNexus; + +import java.time.Duration; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static akkamon.domain.actors.AkkamonNexus.*; + +public class InteractionHandshaker extends AbstractBehavior { + + public interface Command { + } + + public static enum HandshakeResult implements Command { + FAIL, + SUCCESS + } + + public static class InteractionReply implements Command { + public String requestName; + public TrainerID trainerID; + public boolean value; + + public InteractionReply(String requestName, TrainerID trainerID, boolean value) { + this.requestName = requestName; + this.trainerID = trainerID; + this.value = value; + } + } + + public static Behavior create( + TrainerID trainerID, + String type, + List needingConfirmation, + String requestName, + ActorRef replyTo, + Duration timeout) { + + return Behaviors.setup( + context -> Behaviors.withTimers( + timers -> new InteractionHandshaker( + context, + trainerID, + type, + new HashSet(needingConfirmation), + requestName, + replyTo, + timeout, + timers + ) + )); + } + + private Set stillWaiting; + + private ActorRef replyTo; + + private String requestName; + private String type; + + private Set waitingToStartInteraction = new HashSet<>(); + + public InteractionHandshaker(ActorContext context, + TrainerID trainerID, + String type, + Set needingToShakeHands, + String requestName, + ActorRef replyTo, + Duration timeout, + TimerScheduler timers) { + + super(context); + + timers.startSingleTimer(HandshakeResult.FAIL, timeout); + + this.replyTo = replyTo; + this.requestName = requestName; + this.type = type; + + waitingToStartInteraction.add(trainerID); + stillWaiting = needingToShakeHands; + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(InteractionReply.class, this::onReply) + .onMessage(HandshakeResult.class, this::onHandshakeFail) + .build(); + } + + private Behavior onHandshakeFail(HandshakeResult instance) { + getContext().getLog().info("Received fail instance due to timeout!"); + + replyTo.tell( + new RespondInteractionHandshaker( + requestName, + type, + HandshakeResult.FAIL, + waitingToStartInteraction + ) + ); + return Behaviors.stopped(); + } + + + private Behavior onReply(InteractionReply r) { + getContext().getLog().info("received reply from {} with value {}!", r.trainerID, r.value); + getContext().getLog().info(String.valueOf(stillWaiting)); + stillWaiting.remove(r.trainerID); + getContext().getLog().info(String.valueOf(stillWaiting)); + this.waitingToStartInteraction.add(r.trainerID); + if (r.value) { + return respondIfAllRepliesReceived(); + } else { + replyTo.tell(new RespondInteractionHandshaker( + requestName, + type, + HandshakeResult.FAIL, + waitingToStartInteraction + )); + return Behaviors.stopped(); + } + } + + private Behavior respondIfAllRepliesReceived() { + getContext().getLog().info(String.valueOf(stillWaiting)); + + if (this.stillWaiting.isEmpty()) { + getContext().getLog().info("Sending out interaction Start!"); + replyTo.tell(new RespondInteractionHandshaker( + requestName, + type, + HandshakeResult.SUCCESS, + waitingToStartInteraction + )); + return Behaviors.stopped(); + } else { + return this; + } + } + +} diff --git a/domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionTypes.java b/domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionTypes.java new file mode 100644 index 0000000..bd67bbc --- /dev/null +++ b/domain/src/main/java/akkamon/domain/actors/tasks/interactions/InteractionTypes.java @@ -0,0 +1,5 @@ +package akkamon.domain.actors.tasks.interactions; + +public enum InteractionTypes { + BATTLE +} diff --git a/domain/src/main/java/akkamon/domain/model/Factory.java b/domain/src/main/java/akkamon/domain/model/Factory.java deleted file mode 100644 index a00ff11..0000000 --- a/domain/src/main/java/akkamon/domain/model/Factory.java +++ /dev/null @@ -1,5 +0,0 @@ -package akkamon.domain.model; - -public interface Factory { - T fromName(E name); -} diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/Factory.java b/domain/src/main/java/akkamon/domain/model/akkamon/Factory.java new file mode 100644 index 0000000..f43db03 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/model/akkamon/Factory.java @@ -0,0 +1,5 @@ +package akkamon.domain.model.akkamon; + +public interface Factory { + T fromName(E name); +} diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/Mon.java b/domain/src/main/java/akkamon/domain/model/akkamon/Mon.java index a1d781d..39d1419 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/Mon.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/Mon.java @@ -31,15 +31,15 @@ public class Mon { } - public static abstract class Ability extends TypeEquality implements Phases { + public static abstract class Ability extends TypeEquality { } - public static abstract class Status extends TypeEquality implements Phases { + public static abstract class Status extends TypeEquality { } - public static abstract class Move implements Phases { + public static abstract class Move { public String name; public Mon.Type type; public MoveCategory category; @@ -59,6 +59,18 @@ public class Mon { this.power = power; this.accuracy = accuracy; } + + @Override + public String toString() { + return "Move{" + + "name='" + name + '\'' + + ", type=" + type + + ", category=" + category + + ", PP=" + PP + + ", power=" + power + + ", accuracy=" + accuracy + + '}'; + } } private String name; diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/Stat.java b/domain/src/main/java/akkamon/domain/model/akkamon/Stat.java index 92bc76e..de989ab 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/Stat.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/Stat.java @@ -8,4 +8,12 @@ public class Stat { this.base = base; this.effective = base; } + + @Override + public String toString() { + return "Stat{" + + "base=" + base + + ", effective=" + effective + + '}'; + } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/abilities/AbilityFactory.java b/domain/src/main/java/akkamon/domain/model/akkamon/abilities/AbilityFactory.java index 73cfe1d..d22fccf 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/abilities/AbilityFactory.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/abilities/AbilityFactory.java @@ -1,6 +1,6 @@ package akkamon.domain.model.akkamon.abilities; -import akkamon.domain.model.Factory; +import akkamon.domain.model.akkamon.Factory; import akkamon.domain.model.akkamon.Mon; public class AbilityFactory implements Factory { diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/abilities/Immunity.java b/domain/src/main/java/akkamon/domain/model/akkamon/abilities/Immunity.java index cdc014b..056ec73 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/abilities/Immunity.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/abilities/Immunity.java @@ -4,28 +4,4 @@ import akkamon.domain.model.akkamon.Mon; public class Immunity extends Mon.Ability { - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void switchIn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/MovesFactory.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/MovesFactory.java index 41ff7a3..e84a6a5 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/MovesFactory.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/MovesFactory.java @@ -4,6 +4,7 @@ import akkamon.domain.model.akkamon.Mon; import akkamon.domain.model.akkamon.Stat; import akkamon.domain.model.akkamon.moves.implementations.*; import akkamon.domain.model.akkamon.types.implementations.*; +import com.google.gson.JsonObject; import java.util.HashMap; import java.util.Map; @@ -14,158 +15,151 @@ public class MovesFactory { for (var i = 0 ; i < names.length; i++) { String name = names[i]; MoveSlot slot = indexToMoveSlot(i); - switch (name) { - case "Body Slam": - Mon.Move bodySlam = new BodySlam( - name, - new NormalType(), - MoveCategory.PHYSICAL, - new Stat(15), - 85, - 1 - ); - moves.put(slot, bodySlam); - break; - case "Reflect": - Mon.Move reflect = new Reflect( - name, - new PsychicType(), - MoveCategory.STATUS, - new Stat(20), - -1, - -1 - ); - moves.put(slot, reflect); - break; - case "Rest": - Mon.Move rest = new Rest( - name, - new PsychicType(), - MoveCategory.STATUS, - new Stat(10), - -1, - -1 - ); - moves.put(slot, rest); - break; - case "Ice Beam": - Mon.Move iceBeam = new IceBeam( - name, - new IceType(), - MoveCategory.SPECIAL, - new Stat(10), - 90, - 1 - ); - moves.put(slot, iceBeam); - break; - case "Swords Dance": - Mon.Move swordsDance = new SwordsDance( - name, - new NormalType(), - MoveCategory.STATUS, - new Stat(20), - 90, - 1 - ); - moves.put(slot, swordsDance); - break; - case "Earthquake": - Mon.Move earthquake = new Earthquake( - name, - new GroundType(), - MoveCategory.PHYSICAL, - new Stat(10), - 100, - 1 - ); - moves.put(slot, earthquake); - break; - case "Soft-Boiled": - Mon.Move softBoiled = new SoftBoiled( - name, - new NormalType(), - MoveCategory.STATUS, - new Stat(10), - -1, - -1 - ); - moves.put(slot, softBoiled); - break; - case "Amnesia": - Mon.Move amnesia = new Amnesia( - name, - new PsychicType(), - MoveCategory.STATUS, - new Stat(20), - -1, - -1 - ); - moves.put(slot, amnesia); - break; - case "Psychic": - Mon.Move psychic = new Psychic( - name, - new PsychicType(), - MoveCategory.SPECIAL, - new Stat(10), - 90, - 1 - ); - moves.put(slot, psychic); - break; - case "Agility": - Mon.Move agility = new Agility( - name, - new PsychicType(), - MoveCategory.STATUS, - new Stat(30), - -1, - -1 - ); - moves.put(slot, agility); - break; - case "Blizzard": - Mon.Move blizzard = new Blizzard( - name, - new IceType(), - MoveCategory.SPECIAL, - new Stat(5), - 110, - 0.7 - ); - moves.put(slot, blizzard); - break; - case "Thunder Wave": - Mon.Move thunderWave = new ThunderWave( - name, - new ElectricType(), - MoveCategory.STATUS, - new Stat(20), - -1, - 0.9 - ); - moves.put(slot, thunderWave); - break; - case "Wrap": - Mon.Move wrap = new Wrap( - name, - new NormalType(), - MoveCategory.PHYSICAL, - new Stat(20), - 15, - 0.9 - ); - moves.put(slot, wrap); - break; - default: - System.out.println("move not found: " + name); - return null; - } + moves.put(slot, fromName(name)); } return moves; } + private Mon.Move fromName(String name) { + Mon.Move move; + switch (name) { + case "Body Slam": + move = new BodySlam( + name, + new NormalType(), + MoveCategory.PHYSICAL, + new Stat(15), + 85, + 1 + ); + break; + case "Reflect": + move = new Reflect( + name, + new PsychicType(), + MoveCategory.STATUS, + new Stat(20), + -1, + -1 + ); + break; + case "Rest": + move = new Rest( + name, + new PsychicType(), + MoveCategory.STATUS, + new Stat(10), + -1, + -1 + ); + break; + case "Ice Beam": + move = new IceBeam( + name, + new IceType(), + MoveCategory.SPECIAL, + new Stat(10), + 90, + 1 + ); + break; + case "Swords Dance": + move = new SwordsDance( + name, + new NormalType(), + MoveCategory.STATUS, + new Stat(20), + 90, + 1 + ); + break; + case "Earthquake": + move = new Earthquake( + name, + new GroundType(), + MoveCategory.PHYSICAL, + new Stat(10), + 100, + 1 + ); + break; + case "Soft-Boiled": + move = new SoftBoiled( + name, + new NormalType(), + MoveCategory.STATUS, + new Stat(10), + -1, + -1 + ); + break; + case "Amnesia": + move = new Amnesia( + name, + new PsychicType(), + MoveCategory.STATUS, + new Stat(20), + -1, + -1 + ); + break; + case "Psychic": + move = new Psychic( + name, + new PsychicType(), + MoveCategory.SPECIAL, + new Stat(10), + 90, + 1 + ); + break; + case "Agility": + move = new Agility( + name, + new PsychicType(), + MoveCategory.STATUS, + new Stat(30), + -1, + -1 + ); + break; + case "Blizzard": + move = new Blizzard( + name, + new IceType(), + MoveCategory.SPECIAL, + new Stat(5), + 110, + 0.7 + ); + break; + case "Thunder Wave": + move = new ThunderWave( + name, + new ElectricType(), + MoveCategory.STATUS, + new Stat(20), + -1, + 0.9 + ); + break; + case "Wrap": + move = new Wrap( + name, + new NormalType(), + MoveCategory.PHYSICAL, + new Stat(20), + 15, + 0.9 + ); + break; + default: + System.out.println("move not found: " + name); + return null; + } + return move; + } + private MoveSlot indexToMoveSlot(int i) { switch (i) { case 0: @@ -180,4 +174,16 @@ public class MovesFactory { return null; } } + + public Mon.Move fromJSON(JsonObject json) { + String name = String.valueOf(json.get("name")); + name = name.replaceAll("\"", ""); + System.out.println("Setting this move from json!"); + System.out.println(name); + Mon.Move move = this.fromName(name); + JsonObject pp = json.get("PP").getAsJsonObject(); + move.PP.effective = Integer.parseInt(String.valueOf(pp.get("effective"))); + System.out.println(move); + return move; + } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Agility.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Agility.java index 193bbdd..9b286d7 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Agility.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Agility.java @@ -9,29 +9,4 @@ public class Agility extends Mon.Move { public Agility(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void switchIn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Amnesia.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Amnesia.java index fa19cb6..273128a 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Amnesia.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Amnesia.java @@ -10,34 +10,4 @@ public class Amnesia extends Mon.Move { public Amnesia(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Blizzard.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Blizzard.java index 0ea367b..a11c553 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Blizzard.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Blizzard.java @@ -9,34 +9,4 @@ public class Blizzard extends Mon.Move { public Blizzard(String name, Mon.Type type, MoveCategory category, Stat PP, int power, double accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/BodySlam.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/BodySlam.java index f0135d9..e50378f 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/BodySlam.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/BodySlam.java @@ -10,34 +10,4 @@ public class BodySlam extends Mon.Move { public BodySlam(String name, Mon.Type type, MoveCategory category, Stat PP, int power, double accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Earthquake.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Earthquake.java index e993a65..2189a58 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Earthquake.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Earthquake.java @@ -9,34 +9,4 @@ public class Earthquake extends Mon.Move { public Earthquake(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/IceBeam.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/IceBeam.java index 88d20d0..e9074f6 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/IceBeam.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/IceBeam.java @@ -9,34 +9,4 @@ public class IceBeam extends Mon.Move { public IceBeam(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Psychic.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Psychic.java index 36b071d..b581744 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Psychic.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Psychic.java @@ -9,34 +9,4 @@ public class Psychic extends Mon.Move { public Psychic(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Reflect.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Reflect.java index 06661ab..feea560 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Reflect.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Reflect.java @@ -9,34 +9,4 @@ public class Reflect extends Mon.Move { public Reflect(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Rest.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Rest.java index ef3881a..a372311 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Rest.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Rest.java @@ -9,34 +9,4 @@ public class Rest extends Mon.Move { public Rest(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SoftBoiled.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SoftBoiled.java index b74fb6e..718818c 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SoftBoiled.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SoftBoiled.java @@ -9,34 +9,4 @@ public class SoftBoiled extends Mon.Move { public SoftBoiled(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SwordsDance.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SwordsDance.java index 0adc54d..742de17 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SwordsDance.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/SwordsDance.java @@ -9,30 +9,4 @@ public class SwordsDance extends Mon.Move { public SwordsDance(String name, Mon.Type type, MoveCategory category, Stat PP, int power, int accuracy) { super(name, type, category, PP, power, accuracy); } - - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void switchIn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/ThunderWave.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/ThunderWave.java index 4254f5b..a2aacbf 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/ThunderWave.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/ThunderWave.java @@ -9,34 +9,4 @@ public class ThunderWave extends Mon.Move { public ThunderWave(String name, Mon.Type type, MoveCategory category, Stat PP, int power, double accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Wrap.java b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Wrap.java index bf3bad5..70c33ce 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Wrap.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/moves/implementations/Wrap.java @@ -9,34 +9,4 @@ public class Wrap extends Mon.Move { public Wrap(String name, Mon.Type type, MoveCategory category, Stat PP, int power, double accuracy) { super(name, type, category, PP, power, accuracy); } - - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/status/NoStatus.java b/domain/src/main/java/akkamon/domain/model/akkamon/status/NoStatus.java index fe3c649..351f0d0 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/status/NoStatus.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/status/NoStatus.java @@ -4,33 +4,4 @@ import akkamon.domain.model.akkamon.Mon; public class NoStatus extends Mon.Status { - @Override - public void startTurn() { - - } - - @Override - public void fight() { - - } - - @Override - public void getAttacked() { - - } - - @Override - public void useItem() { - - } - - @Override - public void switchOut() { - - } - - @Override - public void endTurn() { - - } } diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/status/StatusFactory.java b/domain/src/main/java/akkamon/domain/model/akkamon/status/StatusFactory.java index 85e733a..c3ad427 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/status/StatusFactory.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/status/StatusFactory.java @@ -1,8 +1,6 @@ package akkamon.domain.model.akkamon.status; -import akkamon.domain.model.Factory; import akkamon.domain.model.akkamon.Mon; -import akkamon.domain.model.akkamon.moves.MoveSlot; import java.util.ArrayList; import java.util.HashMap; diff --git a/domain/src/main/java/akkamon/domain/model/akkamon/types/TypeFactory.java b/domain/src/main/java/akkamon/domain/model/akkamon/types/TypeFactory.java index a2badbf..4f61239 100644 --- a/domain/src/main/java/akkamon/domain/model/akkamon/types/TypeFactory.java +++ b/domain/src/main/java/akkamon/domain/model/akkamon/types/TypeFactory.java @@ -1,6 +1,6 @@ package akkamon.domain.model.akkamon.types; -import akkamon.domain.model.Factory; +import akkamon.domain.model.akkamon.Factory; import akkamon.domain.model.akkamon.Mon; import akkamon.domain.model.akkamon.types.implementations.*; diff --git a/domain/src/main/java/akkamon/domain/model/battle/BattleEngine.java b/domain/src/main/java/akkamon/domain/model/battle/BattleEngine.java index 4d02d9a..7b438c4 100644 --- a/domain/src/main/java/akkamon/domain/model/battle/BattleEngine.java +++ b/domain/src/main/java/akkamon/domain/model/battle/BattleEngine.java @@ -1,5 +1,6 @@ package akkamon.domain.model.battle; +import akkamon.domain.actors.AkkamonBattle; import akkamon.domain.actors.AkkamonNexus; import akkamon.domain.model.akkamon.Mon; import akkamon.domain.model.akkamon.MonStats; @@ -72,6 +73,10 @@ public class BattleEngine { return messageMap; } + public void play(Set nextTurnActions) { + System.out.println("Playing actions:" + nextTurnActions); + } + public static List createDemoTeams() { AkkamonStatus[] noStatusArray = new AkkamonStatus[] { diff --git a/domain/src/main/java/akkamon/domain/model/battle/requests/BattleRequestBody.java b/domain/src/main/java/akkamon/domain/model/battle/requests/BattleRequestBody.java new file mode 100644 index 0000000..ce314af --- /dev/null +++ b/domain/src/main/java/akkamon/domain/model/battle/requests/BattleRequestBody.java @@ -0,0 +1,17 @@ +package akkamon.domain.model.battle.requests; + +import akkamon.domain.model.akkamon.Mon; + +public class BattleRequestBody { + public RequestBattleAction requestAction; + + public Mon.Move move; + + @Override + public String toString() { + return "BattleRequestBody{" + + "requestAction=" + requestAction + + ", move=" + move + + '}'; + } +} diff --git a/domain/src/main/java/akkamon/domain/model/battle/requests/JsonToMove.java b/domain/src/main/java/akkamon/domain/model/battle/requests/JsonToMove.java new file mode 100644 index 0000000..9abc126 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/model/battle/requests/JsonToMove.java @@ -0,0 +1,18 @@ +package akkamon.domain.model.battle.requests; + +import akkamon.domain.model.akkamon.Mon; +import akkamon.domain.model.akkamon.Stat; +import akkamon.domain.model.akkamon.moves.MoveCategory; +import akkamon.domain.model.akkamon.moves.MovesFactory; +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class JsonToMove implements JsonDeserializer { + + @Override + public Mon.Move deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + + return new MovesFactory().fromJSON(json.getAsJsonObject()); + } +} diff --git a/domain/src/main/java/akkamon/domain/model/battle/requests/RequestBattleAction.java b/domain/src/main/java/akkamon/domain/model/battle/requests/RequestBattleAction.java new file mode 100644 index 0000000..1cab082 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/model/battle/requests/RequestBattleAction.java @@ -0,0 +1,8 @@ +package akkamon.domain.model.battle.requests; + +import com.google.gson.annotations.SerializedName; + +public enum RequestBattleAction { + @SerializedName("FIGHT") + FIGHT +} -- cgit v1.2.3