Exploring ladder
This commit is contained in:
parent
073994fadf
commit
18d7f8de24
9
src/main/java/com/alterdekim/hearthhack/GameDeck.java
Normal file
9
src/main/java/com/alterdekim/hearthhack/GameDeck.java
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package com.alterdekim.hearthhack;
|
||||||
|
|
||||||
|
import com.alterdekim.PegasusGame;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GameDeck {
|
||||||
|
private List<PegasusGame.PowerHistoryEntity.Builder> deck;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,6 @@
|
|||||||
package com.alterdekim.hearthhack.component;
|
package com.alterdekim.hearthhack.component;
|
||||||
|
|
||||||
|
import com.alterdekim.hearthhack.config.ObjectConfig;
|
||||||
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
||||||
import com.alterdekim.hearthhack.service.RoomService;
|
import com.alterdekim.hearthhack.service.RoomService;
|
||||||
import com.alterdekim.hearthhack.service.UserService;
|
import com.alterdekim.hearthhack.service.UserService;
|
||||||
@ -23,6 +24,9 @@ public class GamePool {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RoomService roomService;
|
private RoomService roomService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ObjectConfig config;
|
||||||
|
|
||||||
private final ConcurrentHashMap<Long, GameRoom> games = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<Long, GameRoom> games = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private static final int PLAYERS_COUNT = 1; // TODO: MAKE 2 PLAYERS FOR PRODUCTION
|
private static final int PLAYERS_COUNT = 1; // TODO: MAKE 2 PLAYERS FOR PRODUCTION
|
||||||
@ -35,7 +39,7 @@ public class GamePool {
|
|||||||
log.info("Got room!");
|
log.info("Got room!");
|
||||||
List<RoomPlayerDTO> players = r.getPlayers();
|
List<RoomPlayerDTO> players = r.getPlayers();
|
||||||
log.info("Put room by id: {}", r.getId());
|
log.info("Put room by id: {}", r.getId());
|
||||||
games.put(r.getId(), new GameRoom(players, userService, r.getRoomPassword()));
|
games.put(r.getId(), new GameRoom(players, userService, r.getRoomPassword(), config));
|
||||||
roomService.removeRoom(r.getId());
|
roomService.removeRoom(r.getId());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,47 @@
|
|||||||
package com.alterdekim.hearthhack.component;
|
package com.alterdekim.hearthhack.component;
|
||||||
|
|
||||||
|
import com.alterdekim.PegasusGame;
|
||||||
|
import com.alterdekim.PegasusShared;
|
||||||
|
import com.alterdekim.hearthhack.GameDeck;
|
||||||
import com.alterdekim.hearthhack.component.interfaces.GamePacketCallback;
|
import com.alterdekim.hearthhack.component.interfaces.GamePacketCallback;
|
||||||
import com.alterdekim.hearthhack.component.interfaces.IGameRoom;
|
import com.alterdekim.hearthhack.component.interfaces.IGameRoom;
|
||||||
|
import com.alterdekim.hearthhack.config.ObjectConfig;
|
||||||
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
||||||
import com.alterdekim.hearthhack.game.GameState;
|
import com.alterdekim.hearthhack.entity.Deck;
|
||||||
import com.alterdekim.hearthhack.game.IncomeGamePacket;
|
import com.alterdekim.hearthhack.entity.DeckContent;
|
||||||
import com.alterdekim.hearthhack.game.OutcomeGamePacket;
|
import com.alterdekim.hearthhack.game.*;
|
||||||
import com.alterdekim.hearthhack.service.UserService;
|
import com.alterdekim.hearthhack.service.UserService;
|
||||||
|
import com.alterdekim.hearthhack.util.PegasusPacket;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static com.alterdekim.PegasusGame.Option.Type.END_TURN;
|
||||||
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class GameRoom extends Thread implements IGameRoom {
|
public class GameRoom extends Thread implements IGameRoom {
|
||||||
|
|
||||||
|
private static final List<PegasusShared.BnetId> bnets = List.of(PegasusShared.BnetId.newBuilder()
|
||||||
|
.setHi(144115198130930503L)
|
||||||
|
.setLo(78330215).build(), PegasusShared.BnetId.newBuilder()
|
||||||
|
.setHi(144115198130930503L)
|
||||||
|
.setLo(77500085).build());
|
||||||
|
|
||||||
|
private final ObjectConfig objectConfig;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final List<RoomPlayerDTO> players;
|
private final List<RoomPlayerDTO> players;
|
||||||
|
|
||||||
|
private final ConcurrentHashMap<Long, GameDeck> decks;
|
||||||
|
|
||||||
private final ConcurrentHashMap<Long, GamePacketCallback> callbacks;
|
private final ConcurrentHashMap<Long, GamePacketCallback> callbacks;
|
||||||
|
|
||||||
private final UserService userService;
|
private final UserService userService;
|
||||||
@ -34,17 +55,26 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
private ConcurrentLinkedQueue<IncomeGamePacket> incomeQueue;
|
private ConcurrentLinkedQueue<IncomeGamePacket> incomeQueue;
|
||||||
private ConcurrentLinkedQueue<OutcomeGamePacket> outcomeQueue;
|
private ConcurrentLinkedQueue<OutcomeGamePacket> outcomeQueue;
|
||||||
|
|
||||||
public GameRoom(List<RoomPlayerDTO> players, UserService userService, String password) {
|
// TODO: abolish that later. It's a temporary solution
|
||||||
|
private int entity_id = 4;
|
||||||
|
|
||||||
|
public GameRoom(List<RoomPlayerDTO> players, UserService userService, String password, ObjectConfig objectConfig) {
|
||||||
this.players = players;
|
this.players = players;
|
||||||
this.userService = userService;
|
this.userService = userService;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.incomeQueue = new ConcurrentLinkedQueue<>();
|
this.incomeQueue = new ConcurrentLinkedQueue<>();
|
||||||
this.outcomeQueue = new ConcurrentLinkedQueue<>();
|
this.outcomeQueue = new ConcurrentLinkedQueue<>();
|
||||||
|
this.decks = new ConcurrentHashMap<>();
|
||||||
this.callbacks = new ConcurrentHashMap<>();
|
this.callbacks = new ConcurrentHashMap<>();
|
||||||
this.globalState = GameState.CreateGame;
|
this.globalState = GameState.CreateGame;
|
||||||
this.start();
|
this.objectConfig = objectConfig;
|
||||||
|
log.info("GameRoom players: {}", this.players);
|
||||||
|
this.start(); // TODO: debug mode should stop that
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int hero_p1 = 0;
|
||||||
|
private int hero_p2 = 0;
|
||||||
|
|
||||||
private void processIncomePackets() {
|
private void processIncomePackets() {
|
||||||
if( this.incomeQueue.isEmpty() ) return;
|
if( this.incomeQueue.isEmpty() ) return;
|
||||||
IncomeGamePacket packet = this.incomeQueue.peek();
|
IncomeGamePacket packet = this.incomeQueue.peek();
|
||||||
@ -54,26 +84,29 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void processOutcomePackets() {
|
private void processOutcomePackets() {
|
||||||
/* if( this.outcomeQueue.isEmpty() ) return;
|
if( this.outcomeQueue.isEmpty() ) return;
|
||||||
OutcomeGamePacket packet = this.outcomeQueue.peek();
|
OutcomeGamePacket packet = this.outcomeQueue.peek();
|
||||||
this.outcomeQueue.poll();*/
|
GamePacketCallback callback = this.callbacks.get(packet.getPlayerId());
|
||||||
|
if (callback == null) return;
|
||||||
|
callback.onMessage(packet.getPacket());
|
||||||
|
this.outcomeQueue.poll();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processIncomePacket(IncomeGamePacket packet) {
|
private void processIncomePacket(IncomeGamePacket packet) {
|
||||||
if( packet.getPacket().getType() != 1) return;
|
log.info("processIncomePacket: {}", packet.getPacket());
|
||||||
|
/* if( packet.getPacket().getType() != 1) return;
|
||||||
List<OutcomeGamePacket> l = this.outcomeQueue.stream()
|
List<OutcomeGamePacket> l = this.outcomeQueue.stream()
|
||||||
.filter(p -> p.getPlayerId().longValue() == packet.getPlayerId().longValue())
|
.filter(p -> p.getPlayerId().longValue() == packet.getPlayerId().longValue())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
GamePacketCallback callback = this.callbacks.get(packet.getPlayerId());
|
GamePacketCallback callback = this.callbacks.get(packet.getPlayerId());
|
||||||
if (callback == null) return;
|
if (callback == null) return;
|
||||||
l.forEach(p -> callback.onMessage(p.getPacket()));
|
l.forEach(p -> callback.onMessage(p.getPacket()));*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateGameState() {
|
private void updateGameState() {
|
||||||
// giant switch
|
// giant switch
|
||||||
switch (this.globalState) {
|
switch (this.globalState) {
|
||||||
case CreateGame -> createGameEntity();
|
case CreateGame -> createGameEntity();
|
||||||
case CreatePlayers -> createPlayerEntity();
|
|
||||||
case CreateDecks -> createDeckEntities();
|
case CreateDecks -> createDeckEntities();
|
||||||
case CreateHeroes -> createPlayerHeroEntity();
|
case CreateHeroes -> createPlayerHeroEntity();
|
||||||
case CreateHeroPowers -> createPlayerHeroPowerEntity();
|
case CreateHeroPowers -> createPlayerHeroPowerEntity();
|
||||||
@ -95,17 +128,323 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createGameEntity() {
|
public void createGameEntity() {
|
||||||
|
log.info("create Game Entity");
|
||||||
|
PegasusGame.PowerHistory powerHistory = PegasusGame.PowerHistory.newBuilder()
|
||||||
|
.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setCreateGame(PegasusGame.PowerHistoryCreateGame.newBuilder()
|
||||||
|
.setGameEntity(PegasusGame.Entity.newBuilder()
|
||||||
|
.setId(1)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(10)
|
||||||
|
.setValue(85)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CARDTYPE.getValue())
|
||||||
|
.setValue(TagCardType.GAME.ordinal())
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.TURN.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.STATE.getValue())
|
||||||
|
.setValue(TagState.RUNNING.ordinal())
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.PLAY.ordinal())
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.STEP.getValue())
|
||||||
|
.setValue(TagStep.BEGIN_MULLIGAN.ordinal()) // 10
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.NEXT_STEP.getValue())
|
||||||
|
.setValue(TagStep.BEGIN_MULLIGAN.ordinal()) // 12
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.addAllPlayers(createPlayersEntity())
|
||||||
|
)
|
||||||
|
).build();
|
||||||
|
|
||||||
|
this.broadcast(new PegasusPacket(19, 0, powerHistory.toByteArray()));
|
||||||
|
this.nextGlobalState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public List<PegasusGame.Player> createPlayersEntity() {
|
||||||
public void createPlayerEntity() {
|
log.info("create Players entities");
|
||||||
|
List<PegasusGame.Player> pls = new ArrayList<>();
|
||||||
|
for( int i = 2, pi = 0; i < 4; i++, pi++ ) {
|
||||||
|
final PegasusGame.Entity.Builder entity = PegasusGame.Entity.newBuilder().setId(i == 2 ? 3 : 2);
|
||||||
|
|
||||||
|
if( pi < this.players.size() ) players.get(pi).setController(i == 2 ? 2 : 1);
|
||||||
|
|
||||||
|
if( i == 2 ) {
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.FIRST_PLAYER.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
);
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CURRENT_PLAYER.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
);
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.RESOURCES.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.HERO_ENTITY.getValue())
|
||||||
|
.setValue(i == 2 ? 66 : 64)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.PLAYSTATE.getValue())
|
||||||
|
.setValue(TagPlayState.PLAYING.ordinal())
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.TEAM_ID.getValue())
|
||||||
|
.setValue(i == 2 ? 2 : 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.PLAYER_ID.getValue())
|
||||||
|
.setValue(i == 2 ? 2 : 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.MAXHANDSIZE.getValue())
|
||||||
|
.setValue(10)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.STARTHANDSIZE.getValue())
|
||||||
|
.setValue(4)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.NUM_TURNS_LEFT.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CARDTYPE.getValue())
|
||||||
|
.setValue(TagCardType.PLAYER.ordinal())
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.PLAY.ordinal())
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.TIMEOUT.getValue())
|
||||||
|
.setValue(75)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.MAXRESOURCES.getValue())
|
||||||
|
.setValue(10)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(i == 2 ? 3 : 2)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(i == 2 ? 2 : 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.MULLIGAN_STATE.getValue())
|
||||||
|
.setValue(TagMulligan.DONE.ordinal())
|
||||||
|
);
|
||||||
|
|
||||||
|
entity.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.NUM_CARDS_DRAWN_THIS_TURN.getValue())
|
||||||
|
.setValue(i == 2 ? 1 : 4)
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO: make custom cardback selection
|
||||||
|
pls.add(
|
||||||
|
PegasusGame.Player.newBuilder()
|
||||||
|
.setId(i)
|
||||||
|
.setGameAccountId(bnets.get(i-2))
|
||||||
|
.setCardBack(pi < this.players.size() ? userService.getCardBackById(players.get(pi).getUserId()).getBackId() : 0)
|
||||||
|
.setEntity(entity)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return pls;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createDeckEntities() {
|
public void createDeckEntities() {
|
||||||
|
log.info("create Deck Entities");
|
||||||
|
// sugar for debug with 1 player. Must be erased after debug.
|
||||||
|
PegasusGame.PowerHistory.Builder pw = PegasusGame.PowerHistory.newBuilder();
|
||||||
|
|
||||||
|
for(int i = 0; i < 26; i++, this.entity_id++) {
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(PegasusGame.PowerHistoryEntity.newBuilder()
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.setName("")
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.DECK.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 1; i <= 5; i++, this.entity_id++) {
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(PegasusGame.PowerHistoryEntity.newBuilder()
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.setName("")
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE_POSITION.getValue())
|
||||||
|
.setValue(i)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.HAND.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PegasusGame.PowerHistoryEntity.Builder> ens = List.of(
|
||||||
|
card2Entity("TB_SPT_Boss").get(),
|
||||||
|
card2Entity("CS1h_001").get()
|
||||||
|
);
|
||||||
|
this.hero_p1 = this.entity_id;
|
||||||
|
for(int i = 0; i < 2; i++, this.entity_id++) {
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(ens.get(i)
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(1)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.PLAY.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// other player
|
||||||
|
|
||||||
|
List<DeckContent> dc = userService.getDeckContentForDeckId(this.players.get(0).getUserId(), this.players.get(0).getDeckId());
|
||||||
|
|
||||||
|
for(int i = 0; i < 26; i++, this.entity_id++) {
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(PegasusGame.PowerHistoryEntity.newBuilder()
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.setName("")
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(2)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.DECK.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ens = dc.subList(0, 3).stream()
|
||||||
|
.map(d -> card2Entity(d.getAssetId()).get())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
for(int i = 1; i <= 3; i++, this.entity_id++) {
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(ens.get(i-1)
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(2)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE_POSITION.getValue())
|
||||||
|
.setValue(i)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.HAND.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// there was a place for hero & hero_power
|
||||||
|
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(card2Entity("CS2_103e2").get()
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(2)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.SETASIDE.ordinal())
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE_POSITION.getValue())
|
||||||
|
.setValue(0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.entity_id++;
|
||||||
|
|
||||||
|
this.broadcast(new PegasusPacket(19, 0, pw.build().toByteArray()));
|
||||||
|
|
||||||
|
this.nextGlobalState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -115,15 +454,146 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createPlayerHeroEntity() {
|
public void createPlayerHeroEntity() {
|
||||||
|
log.info("Player hero entity");
|
||||||
|
|
||||||
|
PegasusGame.PowerHistory.Builder pw = PegasusGame.PowerHistory.newBuilder();
|
||||||
|
|
||||||
|
Optional<Deck> deck = userService.getDecksForUser(this.players.get(0).getUserId())
|
||||||
|
.stream()
|
||||||
|
.filter(d -> d.getId().longValue() == this.players.get(0).getDeckId().longValue())
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(card2Entity(deck.get().getHero().longValue()).get()
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(2)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.PLAY.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
this.hero_p2 = this.entity_id;
|
||||||
|
this.entity_id++;
|
||||||
|
|
||||||
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
|
.setFullEntity(getHeroPowerFromHeroId(deck.get().getHero().longValue()).get()
|
||||||
|
.setEntity(this.entity_id)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ENTITY_ID.getValue())
|
||||||
|
.setValue(this.entity_id)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.CONTROLLER.getValue())
|
||||||
|
.setValue(2)
|
||||||
|
)
|
||||||
|
.addTags(PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(GameTag.ZONE.getValue())
|
||||||
|
.setValue(TagZone.PLAY.ordinal())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.broadcast(new PegasusPacket(19, 0, pw.build().toByteArray()));
|
||||||
|
|
||||||
|
this.entity_id++;
|
||||||
|
|
||||||
|
PegasusGame.AllOptions allOptions = PegasusGame.AllOptions.newBuilder()
|
||||||
|
.setId(1)
|
||||||
|
.addOptions(PegasusGame.Option.newBuilder()
|
||||||
|
.setType(END_TURN)
|
||||||
|
)
|
||||||
|
.addOptions(PegasusGame.Option.newBuilder()
|
||||||
|
.setType(PegasusGame.Option.Type.POWER)
|
||||||
|
.setMainOption(PegasusGame.SubOption.newBuilder()
|
||||||
|
.setId(this.hero_p2)
|
||||||
|
.addTargets(this.hero_p1)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
this.broadcast(new PegasusPacket( 14, 0, allOptions.toByteArray()));
|
||||||
|
|
||||||
|
this.nextGlobalState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createPlayerHeroPowerEntity() {
|
public void createPlayerHeroPowerEntity() {
|
||||||
|
log.info("hero power entity");
|
||||||
|
this.nextGlobalState();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Optional<RoomPlayerDTO> findPlayerById(Long id) {
|
private Optional<RoomPlayerDTO> findPlayerById(Long id) {
|
||||||
return players.stream().filter(p -> p.getUserId().longValue() == id.longValue()).findFirst();
|
return players.stream().filter(p -> p.getUserId().longValue() == id.longValue()).findFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void broadcast(PegasusPacket packet) {
|
||||||
|
this.players.forEach(p -> this.outcomeQueue.add(new OutcomeGamePacket(p.getUserId(), packet)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void nextGlobalState() {
|
||||||
|
this.globalState = GameState.next(this.globalState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<PegasusGame.PowerHistoryEntity.Builder> card2Entity(String cardId) {
|
||||||
|
return this.objectConfig.getFormattedCards()
|
||||||
|
.getObjects()
|
||||||
|
.stream()
|
||||||
|
.filter(c -> c.getEntity().getCardId().equals(cardId))
|
||||||
|
.map(c ->
|
||||||
|
PegasusGame.PowerHistoryEntity.newBuilder()
|
||||||
|
.setName(c.getEntity().getCardId())
|
||||||
|
.addAllTags(c.getEntity().getTags().stream()
|
||||||
|
.filter(t -> !t.getType().equals("String"))
|
||||||
|
.map(t ->
|
||||||
|
PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(t.getEnumID())
|
||||||
|
.setValue(t.getValue())
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.collect(Collectors.toList()))
|
||||||
|
)
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<PegasusGame.PowerHistoryEntity.Builder> card2Entity(Long cardId) {
|
||||||
|
return this.objectConfig.getFormattedCards()
|
||||||
|
.getObjects()
|
||||||
|
.stream()
|
||||||
|
.filter(o -> o.getDbfCard().findField("ID").isPresent() && Long.parseLong(o.getDbfCard().findField("ID").get().getVal()) == cardId)
|
||||||
|
.map(c ->
|
||||||
|
PegasusGame.PowerHistoryEntity.newBuilder()
|
||||||
|
.setName(c.getEntity().getCardId())
|
||||||
|
.addAllTags(c.getEntity().getTags().stream()
|
||||||
|
.filter(t -> !t.getType().equals("String"))
|
||||||
|
.map(t ->
|
||||||
|
PegasusGame.Tag.newBuilder()
|
||||||
|
.setName(t.getEnumID())
|
||||||
|
.setValue(t.getValue())
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.collect(Collectors.toList()))
|
||||||
|
)
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<PegasusGame.PowerHistoryEntity.Builder> getHeroPowerFromHeroId(Long cardId) {
|
||||||
|
return card2Entity(Long.parseLong(this.objectConfig.getFormattedCards()
|
||||||
|
.getObjects()
|
||||||
|
.stream()
|
||||||
|
.filter(o -> o.getDbfCard().findField("ID").isPresent() && Long.parseLong(o.getDbfCard().findField("ID").get().getVal()) == cardId)
|
||||||
|
.findFirst()
|
||||||
|
.get()
|
||||||
|
.getDbfCard()
|
||||||
|
.findField("HERO_POWER_ID")
|
||||||
|
.get()
|
||||||
|
.getVal()));
|
||||||
|
}
|
||||||
}
|
}
|
@ -2,7 +2,6 @@ package com.alterdekim.hearthhack.component.interfaces;
|
|||||||
|
|
||||||
public interface IGameRoom {
|
public interface IGameRoom {
|
||||||
void createGameEntity();
|
void createGameEntity();
|
||||||
void createPlayerEntity();
|
|
||||||
void createDeckEntities();
|
void createDeckEntities();
|
||||||
void createCardEntity();
|
void createCardEntity();
|
||||||
void createPlayerHeroEntity();
|
void createPlayerHeroEntity();
|
||||||
|
@ -21,7 +21,7 @@ public class GameMasterProcessor extends Processor {
|
|||||||
// FindGameRequest FindGameResponse game_master
|
// FindGameRequest FindGameResponse game_master
|
||||||
// GameType
|
// GameType
|
||||||
Protocol.FindGameRequest gameRequest = Protocol.FindGameRequest.parseFrom(packet.getBody());
|
Protocol.FindGameRequest gameRequest = Protocol.FindGameRequest.parseFrom(packet.getBody());
|
||||||
|
log.info("FindGameRequest: {}", gameRequest);
|
||||||
Protocol.Attribute a = gameRequest.getProperties().getCreationAttributesList().stream()
|
Protocol.Attribute a = gameRequest.getProperties().getCreationAttributesList().stream()
|
||||||
.filter(p -> p.hasName() && p.getName().equals("type"))
|
.filter(p -> p.hasName() && p.getName().equals("type"))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
@ -62,29 +62,18 @@ public class GameMasterProcessor extends Processor {
|
|||||||
conn.send(new BattleNetPacket(header, notification.toByteArray()));
|
conn.send(new BattleNetPacket(header, notification.toByteArray()));
|
||||||
|
|
||||||
|
|
||||||
/* byte[] ip = "localhost".getBytes(StandardCharsets.US_ASCII);
|
|
||||||
log.info("ip: {} lenhex: {}, len: {}", Util.bytesToHex(ip), Util.intToHex(ip.length), ip.length);
|
|
||||||
byte[] bb = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A08475F524553554C54221E0A0F67616D655F726571756573745F6964120B48B6D2A3C7A4FCA2E1B901220B0A056572726F7212024800222E0A0B67616D655F68616E646C65121F3A1D09F64263F5D33456C7121209EEA60D5703000006118C270B000A62A3AB22B3010A0F636F6E6E656374696F6E5F696E666F129F013A9C010A12094743545702000002116739AB040000000012"+Util.intToHex(ip.length)+Util.bytesToHex(ip)+"188C1D2206456A634465492A130A0776657273696F6E12082A0665694B3271762A0D0A0467616D65120518AA80C4062A0C0A06706C61796572120218012A0B0A026964120518B2B0AA1C2A0F0A09726573756D61626C65120210012A1E0A12737065637461746F725F70617373776F726412082A066F44697049664A0A0895A56710E9E6ACB90552150A050D93710E1A120C0D6739AB0415474354571802");
|
|
||||||
|
|
||||||
header = Protocol.Header.newBuilder()
|
|
||||||
.setServiceId(4)
|
|
||||||
.setMethodId(1)
|
|
||||||
.setSize(bb.length)
|
|
||||||
.setToken(conn.nextToken())
|
|
||||||
.setObjectId(0)
|
|
||||||
.setStatus(0)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
conn.send(new BattleNetPacket(header, bb));
|
|
||||||
|
|
||||||
Protocol.Notification n = Protocol.Notification.parseFrom(bb);
|
|
||||||
Protocol.ConnectInfo ci = Protocol.ConnectInfo.parseFrom(
|
|
||||||
n.getAttributeList().stream().filter(p -> p.hasName() && p.getName().equals("connection_info")).findFirst().get().getValue().getMessageValue()
|
|
||||||
);
|
|
||||||
log.info("GGGG: {}", ci);*/
|
|
||||||
String pwd = UUID.randomUUID().toString();
|
String pwd = UUID.randomUUID().toString();
|
||||||
Long roomId = conn.getRoomService().createRoom(new RoomDTO(pwd)); // TODO: make 1 player rooms check.
|
Long roomId = conn.getRoomService().createRoom(new RoomDTO(pwd)); // TODO: make 1 player rooms check.
|
||||||
conn.getRoomService().joinRoom(roomId, conn.getUserId()); // TODO: make 1 player rooms check.
|
conn.getRoomService().joinRoom(roomId, conn.getUserId(),
|
||||||
|
gameRequest.getPlayerList().get(0)
|
||||||
|
.getAttributeList()
|
||||||
|
.stream()
|
||||||
|
.filter(p -> p.hasName() && p.getName().equals("deck"))
|
||||||
|
.findFirst()
|
||||||
|
.get()
|
||||||
|
.getValue()
|
||||||
|
.getIntValue()
|
||||||
|
); // TODO: make 1 player rooms check.
|
||||||
|
|
||||||
Thread.sleep(1000L);
|
Thread.sleep(1000L);
|
||||||
|
|
||||||
@ -128,7 +117,7 @@ public class GameMasterProcessor extends Processor {
|
|||||||
.setHigh(144115198130930503L)
|
.setHigh(144115198130930503L)
|
||||||
.setLow(78330215L)
|
.setLow(78330215L)
|
||||||
)
|
)
|
||||||
.setHost("192.168.0.9")
|
.setHost("192.168.0.10")
|
||||||
.setPort(3724)
|
.setPort(3724)
|
||||||
.setToken(ByteString.copyFromUtf8(pwd)) // password
|
.setToken(ByteString.copyFromUtf8(pwd)) // password
|
||||||
.addAttribute(Protocol.Attribute
|
.addAttribute(Protocol.Attribute
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
package com.alterdekim.hearthhack.dto;
|
package com.alterdekim.hearthhack.dto;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.*;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
@AllArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ToString
|
@ToString
|
||||||
public class RoomPlayerDTO {
|
public class RoomPlayerDTO {
|
||||||
private Long userId;
|
private final Long userId;
|
||||||
|
private final Long deckId;
|
||||||
|
private Integer controller;
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,14 @@ package com.alterdekim.hearthhack.game;
|
|||||||
|
|
||||||
public enum GameState {
|
public enum GameState {
|
||||||
CreateGame,
|
CreateGame,
|
||||||
CreatePlayers,
|
|
||||||
CreateDecks,
|
CreateDecks,
|
||||||
CreateHeroes,
|
CreateHeroes,
|
||||||
CreateHeroPowers,
|
CreateHeroPowers,
|
||||||
Running;
|
Running;
|
||||||
|
|
||||||
public GameState next() {
|
public static GameState next(GameState state) {
|
||||||
GameState[] states = GameState.values();
|
GameState[] states = GameState.values();
|
||||||
int i = this.ordinal()+1 >= states.length ? 0 : this.ordinal()+1;
|
int i = state.ordinal()+1 >= states.length ? 0 : state.ordinal()+1;
|
||||||
return states[i];
|
return states[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,9 +51,9 @@ public class RoomService implements IService {
|
|||||||
map = new ConcurrentHashMap<>();
|
map = new ConcurrentHashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void joinRoom(Long roomId, Long userId) {
|
public void joinRoom(Long roomId, Long userId, Long deckId) {
|
||||||
RoomDTO r = map.get(roomId);
|
RoomDTO r = map.get(roomId);
|
||||||
r.getPlayers().add(new RoomPlayerDTO(userId));
|
r.getPlayers().add(new RoomPlayerDTO(userId, deckId));
|
||||||
map.put(roomId, r);
|
map.put(roomId, r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import com.alterdekim.hearthhack.game.GameTag;
|
|||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ToString
|
@ToString
|
||||||
@ -28,7 +29,7 @@ public class FormattedCards {
|
|||||||
return this.objects.stream()
|
return this.objects.stream()
|
||||||
.filter(o -> o.getEntity().getTags()
|
.filter(o -> o.getEntity().getTags()
|
||||||
.stream()
|
.stream()
|
||||||
.anyMatch(f -> f.getEnumID().intValue() == tag.getValue().intValue() && val.equals(f.getVal()))
|
.anyMatch(f -> f.getEnumID().intValue() == tag.getValue().intValue() && val.equals(f.getRawValue()))
|
||||||
)
|
)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,12 @@ package com.alterdekim.hearthhack.util;
|
|||||||
import com.google.protobuf.GeneratedMessageV3;
|
import com.google.protobuf.GeneratedMessageV3;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
@ToString
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class PegasusPacket {
|
public class PegasusPacket {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user