|
@@ -10,6 +10,7 @@ import com.incubator.game.util.JDGDUtils;
|
|
|
import com.incubator.game.util.ProtoUtil;
|
|
|
import com.incubator.game.util.Struct;
|
|
|
import com.incubator.message.proto.CommonProto;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
@@ -120,9 +121,6 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
//开始
|
|
|
if (this.time >= 3) {
|
|
|
this.doStart();
|
|
|
- this.state = 2;
|
|
|
- this.flag = false;
|
|
|
- this.time = 0;
|
|
|
Log.debug("检测: 房间号:{}, 房间人数:{}, 当前局数:{}, 状态:开局...VS动画...", this.roomId, this.data.playerMap.size(), this.data.curRound);
|
|
|
}
|
|
|
}
|
|
@@ -229,7 +227,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
* 给玩家发牌,每人27张
|
|
|
*/
|
|
|
@Override
|
|
|
- public void doSendCard() {
|
|
|
+ public synchronized void doSendCard() {
|
|
|
for (Player player : this.actors.values()) {
|
|
|
if (player != null) {
|
|
|
// 设置用户状态
|
|
@@ -262,20 +260,25 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
* 游戏开局
|
|
|
*/
|
|
|
@Override
|
|
|
- public void doStart() {
|
|
|
+ public synchronized void doStart() {
|
|
|
this.data.curRound += 1;
|
|
|
// 定庄
|
|
|
- this.data.zhuangPos = 0;
|
|
|
+ if (this.data.curRound == 1) {
|
|
|
+ this.data.zhuangPos = 0;
|
|
|
+ }
|
|
|
// 设置当前操作玩家
|
|
|
this.data.currentPlayer = this.data.playerMap.get(this.data.zhuangPos);
|
|
|
// 设置当前操作玩家总数量
|
|
|
this.data.curOpPlayerNum = this.data.maxNum;
|
|
|
// 发牌
|
|
|
this.doSendCard();
|
|
|
+ // 进还贡数据
|
|
|
+ Map<String, Object> tributeInfo = this.checkTributeInfo();
|
|
|
// 广播
|
|
|
for (Player tmPlayer : this.data.playerMap.values()) {
|
|
|
if (tmPlayer != null) {
|
|
|
Map<String, Object> data = ProtoUtil.roomToMessage(this, tmPlayer, this.data.currentPlayer);
|
|
|
+ data.put("tributeInfo", tributeInfo);
|
|
|
data.put("state", 2);
|
|
|
data.put("time", 20);
|
|
|
Log.debug("玩家 : {}, 手牌 : {}", tmPlayer.data.name,
|
|
@@ -283,6 +286,17 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
tmPlayer.receive(CommonProto.Cmd.GameStateChange_VALUE, data);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // 是否有进还贡数据
|
|
|
+ if (tributeInfo.isEmpty()) {
|
|
|
+ this.state = 2;
|
|
|
+ this.flag = true;
|
|
|
+ this.time = 0;
|
|
|
+ } else {
|
|
|
+ this.state = 2;
|
|
|
+ this.flag = false;
|
|
|
+ this.time = 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -290,19 +304,48 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
*
|
|
|
* @return
|
|
|
*/
|
|
|
- public void checkTribute() {
|
|
|
- // 0.先判断人数
|
|
|
- switch (this.data.maxNum) {
|
|
|
- case 2:// 2人房
|
|
|
- // 判断单贡
|
|
|
+ public Map<String, Object> checkTributeInfo() {
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
|
|
|
- break;
|
|
|
- case 4:// 4人房
|
|
|
- // 1.判断单贡, 13游一队,24游一队
|
|
|
+ // 双贡情况
|
|
|
+ if (!StringUtils.isEmpty(this.data.tributeData.player1)
|
|
|
+ && !StringUtils.isEmpty(this.data.tributeData.player2)) {
|
|
|
+ data.put("还贡者1", this.data.tributeData.player1);
|
|
|
+ data.put("还贡者2", this.data.tributeData.player2);
|
|
|
+ // todo 根据手牌情况确定是否抗贡
|
|
|
|
|
|
- // 2.判断双贡, 12游一队,34游一队
|
|
|
- break;
|
|
|
+
|
|
|
+
|
|
|
+ data.put("进贡者1", this.data.tributeData.player2);
|
|
|
+ data.put("进贡者2", this.data.tributeData.player2);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 单贡情况
|
|
|
+ if (!StringUtils.isEmpty(this.data.tributeData.player1)
|
|
|
+ && StringUtils.isEmpty(this.data.tributeData.player2)) {
|
|
|
+ data.put("还贡者1", this.data.tributeData.player1);
|
|
|
+ // todo 根据手牌情况确定是否抗贡
|
|
|
+
|
|
|
+ data.put("进贡者1", this.data.tributeData.tributeList.get(0));
|
|
|
}
|
|
|
+
|
|
|
+ // 是否抗贡
|
|
|
+ data.put("isTwoKing", false);
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+// private Player getMaxCardPlayer(List<String> tributeList) {
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断双王
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isHasTwoKing() {
|
|
|
+
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -311,7 +354,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
* @return
|
|
|
*/
|
|
|
public boolean checkTributeStart() {
|
|
|
-
|
|
|
+ Log.debug("检测进还贡是否完成...");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -319,7 +362,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
* 强制进贡、还贡
|
|
|
*/
|
|
|
public void doTribute() {
|
|
|
-
|
|
|
+ Log.debug("强制进贡、还贡...");
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -330,6 +373,8 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
*/
|
|
|
public Integer[] getNextPos(int pos) {
|
|
|
Integer[] nextpos = null;
|
|
|
+
|
|
|
+ // 2人房
|
|
|
if (this.data.maxNum == 2) {
|
|
|
switch (pos) {
|
|
|
case 1:
|
|
@@ -339,7 +384,10 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
nextpos = new Integer[] { 1 };
|
|
|
break;
|
|
|
}
|
|
|
- } else if (this.data.maxNum == 4) {
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4人房
|
|
|
+ if (this.data.maxNum == 4) {
|
|
|
switch (pos) {
|
|
|
case 3:
|
|
|
nextpos = new Integer[] { 0, 1, 2 };
|
|
@@ -567,6 +615,11 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
* 升级
|
|
|
*/
|
|
|
private synchronized void upgrade() {
|
|
|
+ // 清理数据
|
|
|
+ this.data.tributeData = null;
|
|
|
+
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
+
|
|
|
// 头游
|
|
|
Player player = this.data.result.get(1);
|
|
|
if (player == null) {
|
|
@@ -574,75 +627,98 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
}
|
|
|
// 原级牌点数
|
|
|
int oldLevelPoint = this.data.curLevelPoint;
|
|
|
- StringBuilder builder = null;
|
|
|
- switch (this.data.maxNum) {
|
|
|
- case 2:
|
|
|
- // 2人房
|
|
|
- builder = new StringBuilder();
|
|
|
- Player temPlayer = this.data.result.getOrDefault(2, null);
|
|
|
- if (temPlayer == null) {
|
|
|
- return;
|
|
|
- }
|
|
|
- builder.append("头游玩家: ").append(player.data.name)
|
|
|
- .append(" 升3级, ");
|
|
|
- // 设置我方玩家级牌点数展示
|
|
|
- int myIndex = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
|
|
|
- player.data.levelIndex = myIndex;
|
|
|
- player.data.levelPointView[0] = JDGDUtils.levelPoint[myIndex];
|
|
|
- // 设置对方级牌点数展示
|
|
|
- temPlayer.data.levelPointView[1] = player.data.levelPointView[0];
|
|
|
- // 设置全局当前级牌点数
|
|
|
- this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- // 4人房
|
|
|
- int index = 0;
|
|
|
- // 头游搭档
|
|
|
- Struct.TeammateData teammateData = this.getTeammate(player.data.teammateId);
|
|
|
- builder = new StringBuilder();
|
|
|
- switch (teammateData.getRank()) {
|
|
|
- case 2:
|
|
|
- // 搭档2游升3级
|
|
|
- index = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
|
|
|
- builder.append("头游玩家: ").append(player.data.name)
|
|
|
- .append(", 搭档玩家: ").append(teammateData.player.data.name)
|
|
|
- .append(" 2游升3级, ");
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- // 搭档3游升2级
|
|
|
- // 搭档2游升3级
|
|
|
- index = Math.min(player.data.levelIndex + 2, JDGDUtils.levelPoint.length - 1);
|
|
|
- builder.append("头游玩家: ").append(player.data.name)
|
|
|
- .append(", 搭档玩家: ").append(teammateData.player.data.name)
|
|
|
- .append(" 3游升2级, ");
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- // 搭档末游升1级
|
|
|
- // 搭档2游升3级
|
|
|
- index = Math.min(player.data.levelIndex + 1, JDGDUtils.levelPoint.length - 1);
|
|
|
- builder.append("头游玩家: ").append(player.data.name)
|
|
|
- .append(", 搭档玩家: ").append(teammateData.player.data.name)
|
|
|
- .append(" 末游升1级, ");
|
|
|
- break;
|
|
|
- }
|
|
|
+ // 进贡ids集合
|
|
|
+ List<String> tributeList = new ArrayList<>();
|
|
|
|
|
|
- // 设置头游玩家级牌点数展示
|
|
|
- player.data.levelIndex = index;
|
|
|
- player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
|
|
|
- // 设置我方玩家级牌点数展示
|
|
|
- teammateData.player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
|
|
|
- // 设置对方级牌点数展示
|
|
|
- for (Map.Entry<Integer, Player> entry1 : this.data.result.entrySet()) {
|
|
|
- if (!entry1.getValue().getId().equals(player.getId())
|
|
|
- && !entry1.getValue().getId().equals(teammateData.player.getId())) {
|
|
|
- entry1.getValue().data.levelPointView[1] = JDGDUtils.levelPoint[index];
|
|
|
+ // 2人房
|
|
|
+ if (this.data.maxNum == 2) {
|
|
|
+ Player tPlayer = this.data.result.getOrDefault(2, null);
|
|
|
+ if (tPlayer == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ builder.append("1游玩家: ").append(player.data.name)
|
|
|
+ .append(" 升3级, ");
|
|
|
+ // 单贡
|
|
|
+ tributeList.add(tPlayer.getId());
|
|
|
+ this.data.tributeData = new Struct.TributeData(player.getId(), null, tributeList);
|
|
|
+ // 设置我方玩家级牌点数展示
|
|
|
+ int myIndex = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
|
|
|
+ player.data.levelIndex = myIndex;
|
|
|
+ player.data.levelPointView[0] = JDGDUtils.levelPoint[myIndex];
|
|
|
+ // 设置对方级牌点数展示
|
|
|
+ tPlayer.data.levelPointView[1] = player.data.levelPointView[0];
|
|
|
+ // 设置全局当前级牌点数
|
|
|
+ this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4人房
|
|
|
+ if (this.data.maxNum == 4) {
|
|
|
+ // 级牌下标
|
|
|
+ int index = 0;
|
|
|
+ // 头游搭档数据
|
|
|
+ Struct.TeammateData teammateData = this.getTeammate(player.data.teammateId);
|
|
|
+
|
|
|
+ switch (teammateData.getRank()) {
|
|
|
+ case 2:
|
|
|
+ // 搭档2游, 升3级
|
|
|
+ index = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
|
|
|
+ builder.append("1游玩家: ").append(player.data.name)
|
|
|
+ .append(", 搭档玩家: ").append(teammateData.player.data.name)
|
|
|
+ .append(" 2游, 升3级");
|
|
|
+ // 进贡, 双下
|
|
|
+ for (Player p : this.data.result.values()) {
|
|
|
+ if (p != null && !p.getId().equals(player.getId())
|
|
|
+ && !p.getId().equals(teammateData.player.getId())
|
|
|
+ && !tributeList.contains(p.getId())) {
|
|
|
+ tributeList.add(p.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.data.tributeData = new Struct.TributeData(player.getId(), teammateData.player.getId(), tributeList);
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ // 搭档3游, 升2级
|
|
|
+ index = Math.min(player.data.levelIndex + 2, JDGDUtils.levelPoint.length - 1);
|
|
|
+ builder.append("1游玩家: ").append(player.data.name)
|
|
|
+ .append(", 搭档玩家: ").append(teammateData.player.data.name)
|
|
|
+ .append(" 3游, 升2级");
|
|
|
+ // 单贡
|
|
|
+ Player p4 = this.data.result.getOrDefault(4, null);
|
|
|
+ if (p4 != null) {
|
|
|
+ tributeList.add(p4.getId());
|
|
|
+ }
|
|
|
+ this.data.tributeData = new Struct.TributeData(player.getId(), null, tributeList);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ // 搭档4游, 升1级
|
|
|
+ index = Math.min(player.data.levelIndex + 1, JDGDUtils.levelPoint.length - 1);
|
|
|
+ builder.append("1游玩家: ").append(player.data.name)
|
|
|
+ .append(", 搭档玩家: ").append(teammateData.player.data.name)
|
|
|
+ .append(" 4游, 升1级");
|
|
|
+ // 单贡
|
|
|
+ Player p3 = this.data.result.getOrDefault(3, null);
|
|
|
+ if (p3 != null) {
|
|
|
+ tributeList.add(p3.getId());
|
|
|
}
|
|
|
+ this.data.tributeData = new Struct.TributeData(player.getId(), null, tributeList);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置头游玩家级牌点数展示
|
|
|
+ player.data.levelIndex = index;
|
|
|
+ player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
|
|
|
+ // 设置我方玩家级牌点数展示
|
|
|
+ teammateData.player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
|
|
|
+ // 设置对方级牌点数展示
|
|
|
+ for (Map.Entry<Integer, Player> entry1 : this.data.result.entrySet()) {
|
|
|
+ if (!entry1.getValue().getId().equals(player.getId())
|
|
|
+ && !entry1.getValue().getId().equals(teammateData.player.getId())) {
|
|
|
+ entry1.getValue().data.levelPointView[1] = JDGDUtils.levelPoint[index];
|
|
|
}
|
|
|
- // 设置全局当前级牌点数
|
|
|
- this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
|
|
|
- break;
|
|
|
+ }
|
|
|
+ // 设置全局当前级牌点数
|
|
|
+ this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
|
|
|
}
|
|
|
- Log.info("{}原级牌点数: {}, 当前级牌点数: {}", builder != null ? builder : "", oldLevelPoint, this.data.curLevelPoint);
|
|
|
+ Log.info("升级...{}, 原级牌点数: {}, 当前级牌点数: {}", builder.toString(), oldLevelPoint, this.data.curLevelPoint);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -653,6 +729,10 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
// 结算信息
|
|
|
Map<String, Object> settlementData = new HashMap<>();
|
|
|
for (Map.Entry<Integer, Player> entry : this.data.result.entrySet()) {
|
|
|
+ if (entry.getKey() == 1) {
|
|
|
+ // 设置下一家庄家
|
|
|
+ this.data.zhuangPos = entry.getValue().data.pos;
|
|
|
+ }
|
|
|
settlementData.put(entry.getKey().toString(), ProtoUtil.playerRoomToMessage(this, entry.getValue(), true));
|
|
|
}
|
|
|
// 广播结算
|
|
@@ -692,7 +772,6 @@ public class JDGDRoom extends Room implements GRoomInterface {
|
|
|
|
|
|
Log.debug("清理桌子数据...");
|
|
|
this.cardList.clear();
|
|
|
- this.data.zhuangPos = 0;
|
|
|
this.data.curDisCardList = new int[]{};
|
|
|
this.data.curDisCardType = null;
|
|
|
this.data.disCardPlayer = null;
|