Exploring ladder x2

This commit is contained in:
Michael Wain 2024-08-02 04:13:32 +03:00
parent 18d7f8de24
commit 451a568074
3 changed files with 190 additions and 117 deletions

View File

@ -1,9 +0,0 @@
package com.alterdekim.hearthhack;
import com.alterdekim.PegasusGame;
import java.util.List;
public class GameDeck {
private List<PegasusGame.PowerHistoryEntity.Builder> deck;
}

View File

@ -2,13 +2,12 @@ package com.alterdekim.hearthhack.component;
import com.alterdekim.PegasusGame;
import com.alterdekim.PegasusShared;
import com.alterdekim.hearthhack.GameDeck;
import com.alterdekim.hearthhack.util.GameDeck;
import com.alterdekim.hearthhack.component.interfaces.GamePacketCallback;
import com.alterdekim.hearthhack.component.interfaces.IGameRoom;
import com.alterdekim.hearthhack.config.ObjectConfig;
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
import com.alterdekim.hearthhack.entity.Deck;
import com.alterdekim.hearthhack.entity.DeckContent;
import com.alterdekim.hearthhack.game.*;
import com.alterdekim.hearthhack.service.UserService;
import com.alterdekim.hearthhack.util.PegasusPacket;
@ -17,14 +16,11 @@ import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.stream.Collectors;
import static com.alterdekim.PegasusGame.Option.Type.END_TURN;
@Slf4j
public class GameRoom extends Thread implements IGameRoom {
@ -72,9 +68,6 @@ public class GameRoom extends Thread implements IGameRoom {
this.start(); // TODO: debug mode should stop that
}
private int hero_p1 = 0;
private int hero_p2 = 0;
private void processIncomePackets() {
if( this.incomeQueue.isEmpty() ) return;
IncomeGamePacket packet = this.incomeQueue.peek();
@ -181,7 +174,16 @@ public class GameRoom extends Thread implements IGameRoom {
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( pi < this.players.size() ) {
players.get(pi).setController(i == 2 ? 2 : 1);
decks.put(players.get(pi).getUserId(), new GameDeck(
userService.getDeckContentForDeckId(players.get(pi).getUserId(), players.get(pi).getDeckId())
.stream()
.map(d -> card2Entity(d.getAssetId()).get())
.collect(Collectors.toList())
)
);
}
if( i == 2 ) {
entity.addTags(PegasusGame.Tag.newBuilder()
@ -265,7 +267,7 @@ public class GameRoom extends Thread implements IGameRoom {
entity.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.MULLIGAN_STATE.getValue())
.setValue(TagMulligan.DONE.ordinal())
.setValue(TagMulligan.INPUT.ordinal())
);
entity.addTags(PegasusGame.Tag.newBuilder()
@ -338,14 +340,15 @@ public class GameRoom extends Thread implements IGameRoom {
);
}
List<PegasusGame.PowerHistoryEntity.Builder> ens = List.of(
List<PegasusGame.PowerHistoryEntity> ens = List.of(
card2Entity("TB_SPT_Boss").get(),
card2Entity("CS1h_001").get()
);
this.hero_p1 = this.entity_id;
//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)
.toBuilder()
.setEntity(this.entity_id)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ENTITY_ID.getValue())
@ -364,84 +367,87 @@ public class GameRoom extends Thread implements IGameRoom {
}
// other player
for( RoomPlayerDTO player : this.players ) {
int di = 0;
for (int i = 0; i < 26; i++, this.entity_id++, di++) {
PegasusGame.PowerHistoryEntity b = di < this.decks.get(player.getUserId()).getDeck().size() ? this.decks.get(player.getUserId()).getDeck().get(di) : PegasusGame.PowerHistoryEntity.newBuilder().build();
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
.setFullEntity(b
.toBuilder()
.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(player.getController())
)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ZONE.getValue())
.setValue(TagZone.DECK.ordinal())
)
)
);
this.decks.get(player.getUserId()).updateCard(b);
}
List<DeckContent> dc = userService.getDeckContentForDeckId(this.players.get(0).getUserId(), this.players.get(0).getDeckId());
for (int i = 1; i <= 3; i++, this.entity_id++, di++) {
PegasusGame.PowerHistoryEntity b = di < this.decks.get(player.getUserId()).getDeck().size() ? this.decks.get(player.getUserId()).getDeck().get(di) : PegasusGame.PowerHistoryEntity.newBuilder().build();
log.info("HAND: {}; {}; {}; {}", b, di < this.decks.get(player.getUserId()).getDeck().size(), di, this.decks.get(player.getUserId()).getDeck().size());
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
.setFullEntity(b
.toBuilder()
.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(player.getController())
)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ZONE_POSITION.getValue())
.setValue(i)
)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ZONE.getValue())
.setValue(TagZone.HAND.ordinal())
)
)
);
this.decks.get(player.getUserId()).updateCard(b);
}
// there was a place for hero & hero_power
for(int i = 0; i < 26; i++, this.entity_id++) {
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
.setFullEntity(PegasusGame.PowerHistoryEntity.newBuilder()
.setFullEntity(card2Entity("CS2_103e2").get()
.toBuilder()
.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)
.setValue(player.getController())
)
.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)
.setValue(TagZone.SETASIDE.ordinal())
)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ZONE_POSITION.getValue())
.setValue(i)
)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ZONE.getValue())
.setValue(TagZone.HAND.ordinal())
.setValue(0)
)
)
);
this.entity_id++;
}
// 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();
@ -458,54 +464,92 @@ public class GameRoom extends Thread implements IGameRoom {
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();
for(RoomPlayerDTO player : players) {
Optional<Deck> deck = userService.getDecksForUser(player.getUserId())
.stream()
.filter(d -> d.getId().longValue() == player.getDeckId().longValue())
.findFirst();
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
.setFullEntity(card2Entity(deck.get().getHero().longValue()).get()
.toBuilder()
.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(player.getController())
)
.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()
.toBuilder()
.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(player.getController())
)
.addTags(PegasusGame.Tag.newBuilder()
.setName(GameTag.ZONE.getValue())
.setValue(TagZone.PLAY.ordinal())
)
)
);
}
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())
)
.setTagChange(PegasusGame.PowerHistoryTagChange.newBuilder()
.setEntity(2)
.setTag(GameTag.MULLIGAN_STATE.getValue())
.setValue(TagMulligan.INPUT.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())
)
.setTagChange(PegasusGame.PowerHistoryTagChange.newBuilder()
.setEntity(3)
.setTag(GameTag.MULLIGAN_STATE.getValue())
.setValue(TagMulligan.INPUT.ordinal())
)
);
PegasusGame.EntityChoices entityChoices = PegasusGame.EntityChoices.newBuilder()
.setId(1)
.setChoiceType(1)
.setCountMin(0)
.setCountMax(3)
.addAllEntities(decks.get(players.get(0).getUserId())
.getHandCards()
.stream()
.map(PegasusGame.PowerHistoryEntity::getEntity)
.collect(Collectors.toList())
)
.setSource(1)
.setPlayerId(2)
.build();
this.broadcast(new PegasusPacket( 17, 0, entityChoices.toByteArray()));
this.broadcast(new PegasusPacket(19, 0, pw.build().toByteArray()));
this.entity_id++;
PegasusGame.AllOptions allOptions = PegasusGame.AllOptions.newBuilder()
/* PegasusGame.AllOptions allOptions = PegasusGame.AllOptions.newBuilder()
.setId(1)
.addOptions(PegasusGame.Option.newBuilder()
.setType(END_TURN)
@ -519,7 +563,7 @@ public class GameRoom extends Thread implements IGameRoom {
)
.build();
this.broadcast(new PegasusPacket( 14, 0, allOptions.toByteArray()));
this.broadcast(new PegasusPacket( 14, 0, allOptions.toByteArray()));*/
this.nextGlobalState();
}
@ -542,7 +586,7 @@ public class GameRoom extends Thread implements IGameRoom {
this.globalState = GameState.next(this.globalState);
}
private Optional<PegasusGame.PowerHistoryEntity.Builder> card2Entity(String cardId) {
private Optional<PegasusGame.PowerHistoryEntity> card2Entity(String cardId) {
return this.objectConfig.getFormattedCards()
.getObjects()
.stream()
@ -559,11 +603,12 @@ public class GameRoom extends Thread implements IGameRoom {
.build()
)
.collect(Collectors.toList()))
.build()
)
.findFirst();
}
private Optional<PegasusGame.PowerHistoryEntity.Builder> card2Entity(Long cardId) {
private Optional<PegasusGame.PowerHistoryEntity> card2Entity(Long cardId) {
return this.objectConfig.getFormattedCards()
.getObjects()
.stream()
@ -580,11 +625,12 @@ public class GameRoom extends Thread implements IGameRoom {
.build()
)
.collect(Collectors.toList()))
.build()
)
.findFirst();
}
private Optional<PegasusGame.PowerHistoryEntity.Builder> getHeroPowerFromHeroId(Long cardId) {
private Optional<PegasusGame.PowerHistoryEntity> getHeroPowerFromHeroId(Long cardId) {
return card2Entity(Long.parseLong(this.objectConfig.getFormattedCards()
.getObjects()
.stream()

View File

@ -0,0 +1,36 @@
package com.alterdekim.hearthhack.util;
import com.alterdekim.PegasusGame;
import com.alterdekim.hearthhack.game.GameTag;
import com.alterdekim.hearthhack.game.TagZone;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.List;
import java.util.stream.Collectors;
@Getter
@RequiredArgsConstructor
public class GameDeck {
private final List<PegasusGame.PowerHistoryEntity> deck;
public void updateCard(PegasusGame.PowerHistoryEntity b) {
deck.removeIf(c -> c.getName().equals(b.getName()));
deck.add(b);
}
public List<PegasusGame.PowerHistoryEntity> getHandCards() {
return getCardsByTag(GameTag.ZONE, TagZone.HAND.ordinal());
}
public List<PegasusGame.PowerHistoryEntity> getCardsByTag(GameTag tag, Integer val) {
return deck
.stream()
.filter(c -> c.getTagsList()
.stream()
.anyMatch(f -> f.getName() == tag.getValue() && f.getValue() == val)
)
.collect(Collectors.toList());
}
}