From 302f5d22bd4334e00873a04064229af2d0749500 Mon Sep 17 00:00:00 2001 From: zhouwei <849588297@qq.com> Date: Wed, 4 Mar 2026 16:45:45 +0800 Subject: [PATCH] =?UTF-8?q?init=E7=A6=8F=E7=A6=84=E5=AF=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robots/zhipai/.idea/.gitignore | 10 + .../game_mj_fulushou/config/game-config.xml | 11 + .../game_mj_fulushou/config/log4j.properties | 20 + .../game_mj_fulushou/config/taurus-core.xml | 50 + .../config/taurus-permanent.xml | 75 + robots/zhipai/game_mj_fulushou/pom.xml | 44 + .../src/main/java/extend/mj/CardNiao.java | 22 + .../src/main/java/extend/mj/Config.java | 203 +++ .../main/java/extend/mj/EXActionEvent.java | 19 + .../main/java/extend/mj/EXGameController.java | 576 +++++++ .../src/main/java/extend/mj/EXMainServer.java | 99 ++ .../src/main/java/extend/mj/EXPlayBack.java | 71 + .../src/main/java/extend/mj/EXPlayer.java | 262 +++ .../src/main/java/extend/mj/EXRoom.java | 790 +++++++++ .../src/main/java/extend/mj/EXScore.java | 29 + .../src/main/java/extend/mj/OpCard.java | 23 + .../java/extend/mj/PlayerRuleManager.java | 108 ++ .../src/main/java/extend/mj/RoomCard.java | 139 ++ .../src/main/java/extend/mj/RuleWeight.java | 22 + .../src/main/java/extend/mj/SettleLog.java | 44 + .../main/java/extend/mj/TagAnalyseItem.java | 22 + .../src/main/java/extend/mj/TagKindItem.java | 17 + .../src/main/java/extend/mj/WinCardType.java | 173 ++ .../java/extend/mj/player/rule/RuleChow.java | 130 ++ .../extend/mj/player/rule/RuleOtherKong.java | 158 ++ .../mj/player/rule/RuleOtherKongSelfWin.java | 100 ++ .../extend/mj/player/rule/RuleOtherWin.java | 108 ++ .../java/extend/mj/player/rule/RulePong.java | 97 ++ .../extend/mj/player/rule/RuleSelfKong.java | 165 ++ .../extend/mj/player/rule/RuleSelfWin.java | 94 ++ .../mj/player/rulestate/PRChowState.java | 62 + .../rulestate/PROtherGongSelfWinState.java | 104 ++ .../mj/player/rulestate/PROtherKongState.java | 165 ++ .../mj/player/rulestate/PROtherWinState.java | 48 + .../mj/player/rulestate/PRPongState.java | 92 ++ .../mj/player/rulestate/PRSelfKongState.java | 120 ++ .../mj/player/rulestate/PRSelfWinState.java | 70 + .../player/state/EXPlayerDisCardTipState.java | 54 + .../mj/player/state/EXPlayerDiscardState.java | 114 ++ .../mj/player/state/EXPlayerDrawState.java | 199 +++ .../mj/player/state/EXPlayerDrawTipState.java | 43 + .../player/state/EXPlayerKongDrawState.java | 142 ++ .../mj/player/state/EXPlayerKongWinState.java | 42 + .../state/EXPlayerPiaoNiaoTipState.java | 63 + .../mj/player/state/EXPlayerTipState.java | 61 + .../state/EXPlayerWaitKongWinState.java | 24 + .../mj/player/state/EXPlayerWaitState.java | 39 + .../extend/mj/room/state/EXRoomDealState.java | 107 ++ .../extend/mj/room/state/EXRoomPiaoState.java | 30 + .../extend/mj/room/state/EXRoomSetpState.java | 42 + .../mj/room/state/EXRoomStartGameState.java | 58 + .../src/main/java/extend/mj/tip/Action.java | 27 + .../main/java/extend/mj/tip/IRuleBase.java | 27 + .../src/main/java/extend/mj/tip/Tip.java | 46 + .../main/java/extend/mj/tip/TipManager.java | 142 ++ .../main/java/extend/mj/uitl/CardUtil.java | 51 + .../src/main/java/extend/mj/uitl/WinCard.java | 1468 +++++++++++++++++ .../src/test/java/game_mj_fulushou/Main.java | 9 + .../target/classes/extend/mj/CardNiao.class | Bin 0 -> 822 bytes .../target/classes/extend/mj/Config.class | Bin 0 -> 6403 bytes .../classes/extend/mj/EXActionEvent.class | Bin 0 -> 701 bytes .../classes/extend/mj/EXGameController.class | Bin 0 -> 19459 bytes .../classes/extend/mj/EXMainServer.class | Bin 0 -> 3195 bytes .../target/classes/extend/mj/EXPlayBack.class | Bin 0 -> 3009 bytes .../target/classes/extend/mj/EXPlayer.class | Bin 0 -> 5950 bytes .../target/classes/extend/mj/EXRoom.class | Bin 0 -> 15409 bytes .../target/classes/extend/mj/EXScore.class | Bin 0 -> 1032 bytes .../target/classes/extend/mj/OpCard.class | Bin 0 -> 604 bytes .../classes/extend/mj/PlayerRuleManager.class | Bin 0 -> 3520 bytes .../target/classes/extend/mj/RoomCard.class | Bin 0 -> 4398 bytes .../target/classes/extend/mj/RuleWeight.class | Bin 0 -> 745 bytes .../target/classes/extend/mj/SettleLog.class | Bin 0 -> 2202 bytes .../classes/extend/mj/TagAnalyseItem.class | Bin 0 -> 630 bytes .../classes/extend/mj/TagKindItem.class | Bin 0 -> 443 bytes .../classes/extend/mj/WinCardType.class | Bin 0 -> 5256 bytes .../extend/mj/player/rule/RuleChow.class | Bin 0 -> 3884 bytes .../extend/mj/player/rule/RuleOtherKong.class | Bin 0 -> 5082 bytes .../mj/player/rule/RuleOtherKongSelfWin.class | Bin 0 -> 4794 bytes .../extend/mj/player/rule/RuleOtherWin.class | Bin 0 -> 4799 bytes .../extend/mj/player/rule/RulePong.class | Bin 0 -> 2974 bytes .../extend/mj/player/rule/RuleSelfKong.class | Bin 0 -> 5293 bytes .../extend/mj/player/rule/RuleSelfWin.class | Bin 0 -> 4775 bytes .../mj/player/rulestate/PRChowState.class | Bin 0 -> 3268 bytes .../rulestate/PROtherGongSelfWinState.class | Bin 0 -> 3844 bytes .../player/rulestate/PROtherKongState.class | Bin 0 -> 5313 bytes .../mj/player/rulestate/PROtherWinState.class | Bin 0 -> 1997 bytes .../mj/player/rulestate/PRPongState.class | Bin 0 -> 3524 bytes .../mj/player/rulestate/PRSelfKongState.class | Bin 0 -> 3370 bytes .../mj/player/rulestate/PRSelfWinState.class | Bin 0 -> 3166 bytes .../state/EXPlayerDisCardTipState.class | Bin 0 -> 2835 bytes .../player/state/EXPlayerDiscardState.class | Bin 0 -> 3849 bytes .../mj/player/state/EXPlayerDrawState.class | Bin 0 -> 5258 bytes .../player/state/EXPlayerDrawTipState.class | Bin 0 -> 2266 bytes .../state/EXPlayerKongDrawState$1$1.class | Bin 0 -> 1078 bytes .../state/EXPlayerKongDrawState$1.class | Bin 0 -> 1202 bytes .../player/state/EXPlayerKongDrawState.class | Bin 0 -> 5280 bytes .../player/state/EXPlayerKongWinState.class | Bin 0 -> 2054 bytes .../state/EXPlayerPiaoNiaoTipState.class | Bin 0 -> 2929 bytes .../mj/player/state/EXPlayerTipState.class | Bin 0 -> 2696 bytes .../state/EXPlayerWaitKongWinState.class | Bin 0 -> 849 bytes .../mj/player/state/EXPlayerWaitState.class | Bin 0 -> 1350 bytes .../mj/room/state/EXRoomDealState$1$1.class | Bin 0 -> 852 bytes .../mj/room/state/EXRoomDealState$1.class | Bin 0 -> 1068 bytes .../mj/room/state/EXRoomDealState.class | Bin 0 -> 3896 bytes .../mj/room/state/EXRoomPiaoState.class | Bin 0 -> 2237 bytes .../mj/room/state/EXRoomSetpState.class | Bin 0 -> 1643 bytes .../mj/room/state/EXRoomStartGameState.class | Bin 0 -> 2512 bytes .../target/classes/extend/mj/tip/Action.class | Bin 0 -> 859 bytes .../classes/extend/mj/tip/IRuleBase.class | Bin 0 -> 221 bytes .../target/classes/extend/mj/tip/Tip.class | Bin 0 -> 1285 bytes .../classes/extend/mj/tip/TipManager.class | Bin 0 -> 5275 bytes .../classes/extend/mj/uitl/CardUtil.class | Bin 0 -> 2772 bytes .../classes/extend/mj/uitl/WinCard.class | Bin 0 -> 25016 bytes .../target/game_mj_fulushou.jar | Bin 0 -> 112331 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 55 + .../compile/default-compile/inputFiles.lst | 51 + .../default-testCompile/createdFiles.lst | 1 + .../default-testCompile/inputFiles.lst | 1 + .../test-classes/game_mj_fulushou/Main.class | Bin 0 -> 503 bytes 120 files changed, 7243 insertions(+) create mode 100644 robots/zhipai/.idea/.gitignore create mode 100644 robots/zhipai/game_mj_fulushou/config/game-config.xml create mode 100644 robots/zhipai/game_mj_fulushou/config/log4j.properties create mode 100644 robots/zhipai/game_mj_fulushou/config/taurus-core.xml create mode 100644 robots/zhipai/game_mj_fulushou/config/taurus-permanent.xml create mode 100644 robots/zhipai/game_mj_fulushou/pom.xml create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/CardNiao.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/Config.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXActionEvent.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXGameController.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXMainServer.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayBack.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayer.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXRoom.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXScore.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/OpCard.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/PlayerRuleManager.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RoomCard.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RuleWeight.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/SettleLog.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagAnalyseItem.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagKindItem.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/WinCardType.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleChow.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKong.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKongSelfWin.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherWin.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RulePong.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfKong.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfWin.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRChowState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherGongSelfWinState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherKongState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherWinState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRPongState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfKongState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfWinState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDisCardTipState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDiscardState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawTipState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongDrawState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongWinState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerPiaoNiaoTipState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerTipState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitKongWinState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomDealState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomPiaoState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomSetpState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomStartGameState.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Action.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/IRuleBase.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Tip.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/TipManager.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/CardUtil.java create mode 100644 robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/WinCard.java create mode 100644 robots/zhipai/game_mj_fulushou/src/test/java/game_mj_fulushou/Main.java create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/CardNiao.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/Config.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXActionEvent.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXGameController.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXMainServer.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXPlayBack.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXPlayer.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXRoom.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXScore.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/OpCard.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/PlayerRuleManager.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/RoomCard.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/RuleWeight.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/SettleLog.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/TagAnalyseItem.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/TagKindItem.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/WinCardType.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleChow.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherKong.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherKongSelfWin.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherWin.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RulePong.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleSelfKong.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleSelfWin.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRChowState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PROtherGongSelfWinState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PROtherKongState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PROtherWinState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRPongState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRSelfKongState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRSelfWinState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDisCardTipState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDiscardState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDrawState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDrawTipState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState$1$1.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState$1.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongWinState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerPiaoNiaoTipState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerTipState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerWaitKongWinState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerWaitState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomDealState$1$1.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomDealState$1.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomDealState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomPiaoState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomSetpState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomStartGameState.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/Action.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/IRuleBase.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/Tip.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/TipManager.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/uitl/CardUtil.class create mode 100644 robots/zhipai/game_mj_fulushou/target/classes/extend/mj/uitl/WinCard.class create mode 100644 robots/zhipai/game_mj_fulushou/target/game_mj_fulushou.jar create mode 100644 robots/zhipai/game_mj_fulushou/target/maven-archiver/pom.properties create mode 100644 robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 robots/zhipai/game_mj_fulushou/target/test-classes/game_mj_fulushou/Main.class diff --git a/robots/zhipai/.idea/.gitignore b/robots/zhipai/.idea/.gitignore new file mode 100644 index 0000000..b6b1ecf --- /dev/null +++ b/robots/zhipai/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 已忽略包含查询文件的默认文件夹 +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ diff --git a/robots/zhipai/game_mj_fulushou/config/game-config.xml b/robots/zhipai/game_mj_fulushou/config/game-config.xml new file mode 100644 index 0000000..98458c1 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/config/game-config.xml @@ -0,0 +1,11 @@ + + + + + 192.168.1.6 + 192.168.1.6 + 8971 + 8971 + 107 + true + \ No newline at end of file diff --git a/robots/zhipai/game_mj_fulushou/config/log4j.properties b/robots/zhipai/game_mj_fulushou/config/log4j.properties new file mode 100644 index 0000000..6786dba --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/config/log4j.properties @@ -0,0 +1,20 @@ + +log4j.rootLogger = INFO,consoleAppender,fileAppender + +# ConsoleAppender +log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender +log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.consoleAppender.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%t] %c{2} %3x - %m%n + + +# Regular FileAppender +log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender +log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.fileAppender.File=${WORKDIR}/logs/web_main.log +log4j.appender.fileAppender.layout.ConversionPattern=%d{dd MMM yyyy | HH:mm:ss,SSS} | %-5p | %t | %c{3} | %3x | %m%n +log4j.appender.fileAppender.Encoding=UTF-8 +log4j.appender.fileAppender.DatePattern='.'yyyy-MM-dd +log4j.appender.dailyFile.Append=true + +# The file is rolled over very day +log4j.appender.fileAppender.DatePattern ='.'yyyy-MM-dd \ No newline at end of file diff --git a/robots/zhipai/game_mj_fulushou/config/taurus-core.xml b/robots/zhipai/game_mj_fulushou/config/taurus-core.xml new file mode 100644 index 0000000..2219d52 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/config/taurus-core.xml @@ -0,0 +1,50 @@ + + + log4j.properties + + + redis + com.taurus.core.plugin.redis.RedisPlugin + + + + 80 + + 20 + + 5 + + -1 + + true + + true + + true + + 100 + + 60000 + + 30000 + + 1800000 + + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/robots/zhipai/game_mj_fulushou/config/taurus-permanent.xml b/robots/zhipai/game_mj_fulushou/config/taurus-permanent.xml new file mode 100644 index 0000000..856ea37 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/config/taurus-permanent.xml @@ -0,0 +1,75 @@ + + + 1 + + 512 + + Heap + + Heap + + 524288 + + 1024 + + 32768 + + 160 + + + 1 + 2 + 1 + + + true + + 15 + + + + + + + + + + 1.2.3.4 + + + 127.0.0.1 + + 10000 + + + + false +
0.0.0.0
+ 80 +
+ + + + extension - test + extend.mj.EXMainServer + + + + + Sys + 2 + 8 + 60000 + 20000 + + + + + Ext + 2 + 8 + 60000 + 20000 + + +
\ No newline at end of file diff --git a/robots/zhipai/game_mj_fulushou/pom.xml b/robots/zhipai/game_mj_fulushou/pom.xml new file mode 100644 index 0000000..c05bcde --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + com.game + game_mj_fulushou + 1.0.0 + jar + + game_mj_fulushou + http://maven.apache.org + + + UTF-8 + + + + + + com.game + game_common + 1.0.0 + + + + + game_mj_fulushou + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + UTF-8 + + + + + + + diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/CardNiao.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/CardNiao.java new file mode 100644 index 0000000..12b4af9 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/CardNiao.java @@ -0,0 +1,22 @@ +package extend.mj; + +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TObject; + +public class CardNiao { + public int card; + + public int playerId=0; + public int seat = 0; + public int score = 0; + + + public ITObject toMP(){ + ITObject obj = TObject.newInstance(); + obj.putInt("card", card); + obj.putInt("score", score); + obj.putInt("playerId", playerId); + obj.putInt("seat", seat); + return obj; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/Config.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/Config.java new file mode 100644 index 0000000..9b1b631 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/Config.java @@ -0,0 +1,203 @@ +package extend.mj; + +public class Config { + public static final int XIPAI_SCORE = 10; + public static final int ANCHOU_SCORE = 10; + + public static final String ROOM_CONFIG_CHUIPAI = "chipai"; //吃牌 + public static final String ROOM_CONFIG_DIANPAO = "dianpao"; //接炮胡 + public static final String ROOM_CONFIG_HUNYISE = "hunyise"; //混一色 + public static final String ROOM_CONFIG_QINGYISE = "qingyise"; //清一色 + public static final String ROOM_CONFIG_PENGPENGHU = "pengpenghu"; //碰碰胡 + public static final String ROOM_CONFIG_QIDUI = "qidui"; //七小对 + public static final String ROOM_CONFIG_HAOHUA_QIDUI = "haohua_qidui"; //豪华七小对 + public static final String ROOM_CONFIG_HAOHUA2_QIDUI = "haohua2_qidui"; //双豪华七小对 + public static final String ROOM_CONFIG_HAOHUA3_QIDUI = "haohua3_qidui"; //三豪华七小对 + public static final String ROOM_CONFIG_GANGSHANGKAIHUA_2bei = "gangshangkaihua"; //杠上开花2倍 + public static final String ROOM_CONFIG_GANGSHANGPAO_2bei = "gangshangpao_2bei"; //杠上炮2倍 + public static final String ROOM_CONFIG_SHISHANGYAO = "shishanyao"; //十三幺 + public static final String ROOM_CONFIG_TIANDIHU = "tiandihu"; //天地胡 + public static final String ROOM_CONFIG_SHIBALUOHAN = "shibaluohan"; //十八罗汉 + public static final String ROOM_CONFIG_XIAOSHANYUAN = "xiaoshanyuan"; //小三元 + public static final String ROOM_CONFIG_XIAOSIXI = "xiaosixi"; //小四喜 + public static final String ROOM_CONFIG_DASHANYUAN = "dashanyuan"; //大三元 + public static final String ROOM_CONFIG_DASIXI = "dasixi"; //大四喜 + public static final String ROOM_CONFIG_LOUHU = "louhu"; //漏胡 + public static final String ROOM_CONFIG_GUO_PENG = "guopeng"; //过碰不碰 + public static final String ROOM_CONFIG_GUO_GONG = "guogang"; //过杠不杠 + public static final String ROOM_CONFIG_YAO_JIU = "yao_jiu"; //混幺九 + public static final String ROOM_CONFIG_QING_YAO_JIU = "qing_yao_jiu"; //清幺九 + public static final String ROOM_CONFIG_LAIZI4_HU = "laizi4_hu"; //四鬼胡牌 + public static final String ROOM_CONFIG_LAIZI4_HU_2BEI = "laizi4_hu_2bei"; //四鬼胡牌两倍 + public static final String ROOM_CONFIG_QUAN_FENG = "quan_feng"; //全风 + public static final String ROOM_CONFIG_12ZHANG_LUODI_QUANBAO = "twelve_zhang_luodi_quanbao";//12张落地全包 + public static final String ROOM_CONFIG_QUAN_FENG_SCORE = "quan_qiu_ren"; //全求人 + public static final String ROOM_CONFIG_han19 = "han19"; //含19即可 + public static final String ROOM_CONFIG_ZIYISE = "ziyise"; //字一色 + public static final String ROOM_CONFIG_HAI_DI_NAO_YUE = "haidinaoyue"; //海底捞月 + + public static final String ROOM_CONFIG_XIPAI = "xi_pai"; + public static final String ROOM_CONFIG_XIPAI_SCORE = "xi_pai_score"; + + public static final String ROOM_CONFIG_ANCHOU_SCORE = "an_chou_score"; + + /** + * 飘分玩法 + */ + public static final String ROOM_CONFIG_PIAO = "piao"; // 0:不嫖 1:热票 2:冷票 3:固定票分 + public static final String ROOM_CONFIG_PIAO_FEN = "piao_fen"; // 固定票分时, 票分 + public static final String ROOM_CONFIG_ZHUANGXIAN = "zhuangxian"; + public static final String ROOM_CONFIG_QIDUI_JIA_FAN = "qidui_jiafan"; //七对2倍 + public static final String ROOM_CONFIG_QIDUI_4BEI = "qidui_4bei"; //七对4倍 + public static final String ROOM_CONFIG_NIAO = "niao"; //0无马 1有马 2爆炸马 3抓马 + public static final String ROOM_CONFIG_NIAO_OPT = "niao_opt"; //爆炸马 0 加分 1 加倍 + public static final String ROOM_CONFIG_MAI_NIAO = "mai_niao"; //0无马 1有马 + public static final String ROOM_CONFIG_MAI_NIAO_OPT = "mai_niao_opt"; //1买一码 2买二马 3罚一码 4罚二马 + public static final String ROOM_CONFIG_WU_FENG = "wu_feng"; + public static final String ROOM_CONFIG_LAIZI = "laizi"; ////0 无鬼 1白板做鬼 2翻鬼(随机一个牌做鬼) 3翻双鬼 4红中做鬼 + + public static final String ROOM_CONFIG_QIANGKONG = "qiangkong"; //可抢杠胡 + public static final String ROOM_CONFIG_QIANGKONG_2BEI = "qiangkong_2bei"; //可抢杠胡2倍 + public static final String ROOM_CONFIG_QIANGKONG_MING = "qiangkong_ming"; //明杠可抢 + public static final String ROOM_CONFIG_QIANGKONG_NIAO = "qiangkong_niao"; + public static final String ROOM_CONFIG_NONEALL = "none_is_all"; + public static final String ROOM_CONFIG_NIAO_SCORE = "niao_score"; + public static final String ROOM_CONFIG_QG_TYPE = "qianggang_type"; //抢杠全包 + public static final String ROOM_CONFIG_GANGBAO_TYPE = "gangbao_type"; //杠爆全包 + public static final String ROOM_CONFIG_JIANGMA = "jiangma"; + public static final String ROOM_CONFIG_HZ_HU = "hz_hu"; + public static final String ROOM_CONFIG_GENGZHUAN = "geng_zhuan"; + public static final String ROOM_CONFIG_JIEJIEGAO = "jiejiegao"; + public static final String ROOM_CONFIG_JIEJIEGAO_FIRST_NO = "jiejiegao_first"; + public static final String ROOM_CONFIG_LIAN_ZHUANG = "lian_zhuang"; + public static final String ROOM_CONFIG_WUGUI_JIABEI = "wuguijiabei"; + public static final String ROOM_CONFIG_NO_WAN = "no_wan"; + public static final String ROOM_CONFIG_MA_GEN_DI_FEN = "ma_gen_di_fen";//马跟底分 + public static final String ROOM_CONFIG_MA_GEN_GONG = "ma_gen_gong";//马跟杠 + public static final String ROOM_CONFIG_LIU_GOU_MA = "liu_gou_ma";//留够马牌 + public static final String ROOM_CONFIG_HUANGZHUANGHUANGGANG = "huangzhuang_huanggang";//荒庄荒杠 + public static final String ROOM_CONFIG_LIUJU_2BEI = "liuju_2bei";//流局翻倍 + public static final String ROOM_CONFIG_DAHU_CHENG = "da_hu_cheng";//大胡相乘 + public static final String ROOM_CONFIG_JIHU_NOTCHIHU = "jihunotchihu"; //鸡胡不能吃胡 + public static final String ROOM_CONFIG_XIAOHU_BEI = "xiaohu_bei"; //小胡的倍数另算 + public static final String ROOM_CONFIG_SPECAIL_ZIMO = "special_zimo"; //潮州特殊自摸 + public static final String ROOM_CONFIG_MUST_HU = "must_hu"; //必胡,必须胡牌,不能过 + public static final String ROOM_CONFIG_10_BEI_BUJIFEN = "10bei_bu_jifen"; //十倍不计分 + public static final String ROOM_CONFIG_10_BEI_FENGDING = "10bei_fengding"; //封顶十倍 + public static final String ROOM_CONFIG_ZI_DONG_HU = "zi_dong_hu"; //自动胡 + public static final String ROOM_CONFIG_USE_BASE_HU_SCORE = "use_base_hu_score"; //使用默认基础胡分 + public static final String ROOM_CONFIG_MENG_QING = "men qing"; //门清 + public static final String ROOM_CONFIG_JIHU_SHI_PINGHU = "ji hu shi ping hu"; //没有鸡胡,统一叫平胡 + + public static final String ROOM_CONFIG_XUAN_ZHUANG = "xuan_zhuang"; // 0:轮庄 1:胡牌庄 + public static final String ROOM_CONFIG_QING_ZUI_HU = "qing_zui_hu"; // 0:亲嘴0胡 1:亲嘴2胡 + public static final String ROOM_CONFIG_GANG_ZHAO_LIU_XI = "gang_zhao_liu_xi"; //杠招6息 bool + public static final String ROOM_CONFIG_SPECIAL_PENG_PENG_HU = "special_peng_peng_hu"; //碰碰胡每个字不少于2个 + public static final String ROOM_CONFIG_FEN_DIEJIA = "fen_diejia"; //算分叠加 + + + + public static final String SETTLE_DIAN_PAO = "dian_pao"; + public static final String SETTLE_JIE_PAO = "jie_pao"; + public static final String SETTLE_ZIMO = "zimo"; + public static final String SETTLE_AN_KONG = "an_kong"; + public static final String SETTLE_MING_KONG = "ming_kong"; + + public static final int MING_GANG_SCORE = 3; + public static final int BU_GANG_SCORE = 1; + public static final int AN_GANG_SCORE = 2; + + + public static final int NIAO_TYPE_WU =0; + public static final int NIAO_TYPE_159 =1; + public static final int NIAO_TYPE_ALL =2; //爆炸马 + public static final int NIAO_TYPE_ZHUAMA =3; + + /** + * + */ + public static final String GAME_EVT_PLAYER_DEAL = "811"; + + /** + * + */ + public static final String GAME_DIS_CARD = "611"; + + /** + * + */ + public static final String GAME_EVT_DISCARD = "812"; + + /** + * + */ + public static final String GAME_EVT_DISCARD_TIP = "813"; + + /** + * + */ + public static final String GAME_EVT_FZTIPS = "814"; + + /** + * + */ + public static final String GAME_ACTION = "612"; + + /** + * + */ + + public static final String GAME_EVT_ACTION = "815"; + + /** + * + */ + public static final String GAME_EVT_HU = "816"; + + /** + * + */ + public static final String GAME_EVT_RESULT1 = "817"; + + /** + * + */ + public static final String GAME_EVT_RESULT2 = "818"; + + /** + * + */ + public static final String GAME_EVT_DRAW = "819"; + + /** + * + */ + public static final String GAME_EVT_CHANGE_ACTIVE_PLAYER = "820"; + + /** + * + */ + public static final String GAME_EVT_NIAO = "821"; + + /** + * + */ + public static final String GAME_EVT_MAI_NIAO = "20822"; + + /** + * + */ + public static final String GAME_EVT_PIAONIAO_TIP = "833"; + + /** + * + */ + public static final String GAME_PIAO = "1015"; + + /** + * 飘鸟提示 + */ + public static final String GAME_EVT_PIAO_TIP = "2031"; + public static final String GAME_EVT_PIAO = "2032"; + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXActionEvent.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXActionEvent.java new file mode 100644 index 0000000..18229b3 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXActionEvent.java @@ -0,0 +1,19 @@ +package extend.mj; + +public class EXActionEvent { + + public static final String EVENT_ACTION = "action"; + + public static final String EVENT_DISCARD = "discard"; + + public static final String EVENT_OTHER_DISCARD = "other_discard"; + + public static final String EVENT_START_GAME ="start_game"; + + public static final String EVENT_EXIT_ROOM = "exit_room"; + + public static final String EVENT_KONG_WIN = "kong_win"; + + public static final String EVENT_OTHER_PAO = "other_pao"; + public static final String EVENT_PIAO= "1015"; +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXGameController.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXGameController.java new file mode 100644 index 0000000..2b62901 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXGameController.java @@ -0,0 +1,576 @@ +package extend.mj; + +import com.game.GameController; +import com.game.Global; +import com.game.Util; +import com.game.data.Player; +import com.game.player.state.PlayerWaitState; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import com.taurus.core.entity.TObject; +import com.taurus.core.routes.ActionKey; +import com.taurus.permanent.data.Session; +import extend.mj.tip.Tip; +import extend.mj.tip.TipManager; +import extend.mj.uitl.CardUtil; +import extend.mj.uitl.WinCard; + +import java.util.*; +import java.util.Map.Entry; + +/** + * + * + * + * EXGameController.java + */ +public class EXGameController extends GameController { + + public EXGameController() { + super(); + } + + @ActionKey(Config.GAME_ACTION) + public void RouterAction(Session sender,ITObject params,int gid,Player owner) { + if(Global.loggerDebug) { + int id = params.getInt("id"); + if(id ==0) { + Global.logger.info(owner + " pass!"); + }else { + TipManager tipMgr =((EXPlayer)owner).tipMgr; + if(tipMgr.tipMap.containsKey(id)) { + Tip tip = tipMgr.tipMap.get(id); + Global.logger.info(owner + " select_action type:"+tip.weight+" card:"+tip.card); + } + } + } + owner.stateMachine.execute(EXActionEvent.EVENT_ACTION, 0, params); + } + + @ActionKey(Config.GAME_DIS_CARD) + public void RouterDisCard(Session sender,ITObject params,int gid,Player owner) { + owner.stateMachine.execute(EXActionEvent.EVENT_DISCARD, 0, params); + } + + @ActionKey(Config.GAME_PIAO) + public void RouterPiao(Session sender,ITObject params,int gid,Player owner) { + owner.stateMachine.execute(EXActionEvent.EVENT_PIAO, 0, params); + } + + public void changeActiveSeat(EXRoom owner,int activeSeat) { + owner.activeSeat = activeSeat; + TObject param = new TObject(); + param.putInt("seat", activeSeat); + owner.broadCastToClient(0, Config.GAME_EVT_CHANGE_ACTIVE_PLAYER, param); + } + + public void getCard(EXPlayer player,int leftCount){ + ITObject otherParam = new TObject(); + otherParam.putInt("card", 0); + otherParam.putInt("seat", player.room.activeSeat); + otherParam.putInt("left_count", leftCount); + + ITObject param = new TObject(); + param.putInt( "card", player.drawCard ); + param.putInt("seat", player.room.activeSeat); + param.putInt("left_count", leftCount); + player.cardInhand.add(player.drawCard); + param.putTArray("card_list", Util.toTArray(player.cardInhand)); + param.putTArray("outcard_list", Util.toTArray(player.outcardList)); + long start_time = System.currentTimeMillis(); + param.putTArray("ting_list", getTingList(player)); + long use_time = System.currentTimeMillis() - start_time; + Global.logger.info("---------------getTingList use time:" + use_time); + player.sendEvent(Config.GAME_EVT_DRAW, param); + if(Global.loggerDebug) { + Global.logger.info(player + " drawcard["+player.drawCard+"]"); + } + player.room.broadCastToClient(player.playerid, Config.GAME_EVT_DRAW, otherParam); + ((EXPlayBack)player.getRoom().playBackData).addGetCardCommand(player.room.activeSeat, player.drawCard,leftCount); + } + + public void outCard(EXPlayer player,int discard){ + ITObject response = new TObject(); + response.putInt("seat", player.seat); + response.putInt("card", discard); + player.room.broadCastToClient(0, Config.GAME_EVT_DISCARD, response); + EXRoom room = player.getRoom(); + ((EXPlayBack)room.playBackData).addOutCardCommand(player.seat, discard); + + room.activeCard = discard; + room.lastDiscardSeat = player.seat; + room.currenDiscardSeat = 0; + if (room.isGengZhuang) + { + if (room.bankerSeat == player.seat && player.opCardList.size() == 0 && player.outcardList.size() == 0) + { + if (room.gent_zhuan_nextSeat == 0 && room.first_zhuang_card == 0) + { + room.first_zhuang_card = discard; + room.geng_zhuan_num = 1; + room.gent_zhuan_nextSeat = player.nextSeat; + } + else + { + room.isGengZhuang = false; + } + } + else if (room.gent_zhuan_nextSeat == player.seat && player.opCardList.size() == 0 && player.outcardList.size() == 0 && room.first_zhuang_card == discard) + { + room.geng_zhuan_num += 1; + room.gent_zhuan_nextSeat = player.nextSeat; + if (room.geng_zhuan_num >= room.maxPlayers) + { + if (room.config.getBoolean(Config.ROOM_CONFIG_GENGZHUAN)) + { + EXPlayer bankerPlayer = (EXPlayer)room.playerMapBySeat.get(room.bankerSeat); + for (Entry entry : room.playerMapById.entrySet()) { + EXPlayer otherPlayer = (EXPlayer) entry.getValue(); + if (otherPlayer.playerid != bankerPlayer.playerid) + { + room.addScore(otherPlayer,bankerPlayer, 1, EXScore.GENG_ZHUAN); + } + } + } + room.isGengZhuang = false; + } + } + else + { + room.isGengZhuang = false; + } + } + + player.outcardList.add(discard); + Util.removeCard(player.cardInhand, discard, 1); + if(Global.loggerDebug) { + Global.logger.info(player + " outcard["+discard+"]"); + } + room.broadCastToServer(player.playerid, EXActionEvent.EVENT_OTHER_DISCARD, discard); + } + + + + public void actionCard(EXPlayer player,int card,int type,int from_seat,ITArray opcardArray){ + EXRoom room = player.getRoom(); + ITObject paramBroadCast = new TObject(); + paramBroadCast.putInt("playerid", player.playerid); + paramBroadCast.putInt("card", card); + paramBroadCast.putInt("type", type); + paramBroadCast.putInt("from_seat", from_seat); + int huxi = player.getShowHuXi(true); + paramBroadCast.putInt("hu_xi", huxi); + if(opcardArray!=null){ + paramBroadCast.putTArray("opcard", opcardArray); + } + ITArray result = new TArray(); + for (Entry entry : room.playerMapById.entrySet()) { + EXPlayer __player = (EXPlayer) entry.getValue(); + ITObject __info = new TObject(); + __info.putInt("playerid", __player.playerid); + __info.putTArray("outcard_list", Util.toTArray(__player.outcardList)); + result.addTObject(__info); + } + paramBroadCast.putTArray("outcard_list", result); + + if(Global.loggerDebug) { + Global.logger.info(String.format("%s from_seat:%d card:%d type:%d ", player,from_seat,card,type)); + } + room.broadCastToClient(player.playerid, Config.GAME_EVT_ACTION, paramBroadCast); + + if (type == RuleWeight.TYPE_CHOW || type == RuleWeight.TYPE_PONG) + { + paramBroadCast.putTArray("ting_list", getTingList(player)); + } + + player.sendEvent(Config.GAME_EVT_ACTION, paramBroadCast); + + ((EXPlayBack)room.playBackData).addActionCommand(player.seat, type, card, from_seat,opcardArray); + } + + public void dealCard(EXRoom owner) { + for (Entry entry : owner.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer)entry.getValue(); + player.cardInhand = owner.card.deal(); + Collections.sort(player.cardInhand); + if(Global.loggerDebug) { + Global.logger.info(player + " cardlist:" + player.cardInhand); + } + if (owner.config.getInt(Config.ROOM_CONFIG_MAI_NIAO) == 1) + { + int maiNiaoOpt = owner.config.getInt(Config.ROOM_CONFIG_MAI_NIAO_OPT); + //买一马 + if (maiNiaoOpt == 1) + { + CardNiao niao = new CardNiao(); + niao.playerId = player.playerid; + niao.seat = player.seat; + niao.card = owner.card.pop(); + niao.score = 0; + player.mai_niao.add(niao); + } + //买二马 + else if (maiNiaoOpt == 2) + { + for(int i = 0; i < 2; i++) + { + CardNiao niao = new CardNiao(); + niao.playerId = player.playerid; + niao.seat = player.seat; + niao.card = owner.card.pop(); + niao.score = 0; + player.mai_niao.add(niao); + } + } + //罚一马 + else if (maiNiaoOpt == 3) + { + if (player.seat == owner.bankerSeat) + { + CardNiao niao = new CardNiao(); + niao.playerId = player.playerid; + niao.seat = player.seat; + niao.card = owner.card.pop(); + niao.score = 0; + player.mai_niao.add(niao); + } + } + //罚二马 + else if (maiNiaoOpt == 4) + { + if (player.seat == owner.bankerSeat) + { + for(int i = 0; i < 2; i++) + { + CardNiao niao = new CardNiao(); + niao.playerId = player.playerid; + niao.seat = player.seat; + niao.card = owner.card.pop(); + niao.score = 0; + player.mai_niao.add(niao); + } + } + } + } + ITObject param = new TObject(); + ITArray handCard = Util.toTArray(player.cardInhand); + param.putTArray("card_list", handCard); + param.putInt("bank_seat", player.room.bankerSeat); + param.putInt("laiziCard", owner.card.laiziCard); + param.putInt("laiziCard2", owner.card.laiziCard2); + param.putInt("laiziCardBefore", owner.card.laiziCardBefore); + param.putInt("laiziCard2Before", owner.card.laiziCard2Before); + player.sendEvent(Config.GAME_EVT_PLAYER_DEAL, param); + player.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + } + } + + public void tipEvent(EXPlayer owner) { + ITObject param = owner.tipMgr.toMP(); + owner.sendEvent(Config.GAME_EVT_FZTIPS, param); + } + + public void discardTipEvent(EXPlayer owner) { + owner.getRoom().currenDiscardSeat = owner.seat; + owner.sendEvent(Config.GAME_EVT_DISCARD_TIP, null); + } + + public void winEvent(EXPlayer owner,int from_seat,int win_card) { + ITArray cardInHand = TArray.newInstance(); + for (int card1 : owner.cardInhand) { + cardInHand.addInt(card1); + } + ITObject param = new TObject(); + param.putTArray("card", cardInHand); + param.putInt("seat", owner.seat); + param.putInt("win_card", win_card); + param.putInt("from_seat", from_seat); + ITArray array = CardUtil.toMPData_WinMap(owner.winMap); + if (array != null) { + param.putTArray("win_list", array); + } + if(Global.loggerDebug) { + Global.logger.info(owner + " hupai!["+(owner.seat == from_seat?"self":"other")+"]"); + } + EXRoom room = owner.getRoom(); + room.broadCastToClient(0, Config.GAME_EVT_HU, param); + ((EXPlayBack)room.playBackData).addWinCardCommand(owner.seat, false); + } + + public void sendNiaoEvt(EXPlayer owner, int seat) { + EXRoom room = owner.getRoom(); + ITObject param = new TObject(); +// param.putInt("playerid", owner.playerid); + ITArray array = new TArray(); + for (int index = 0; index < room.niao.size(); index++) { + array.addTObject(room.niao.get(index).toMP()); + } + param.putTArray("niao", array); + param.putInt("start_seat", seat); + + room.broadCastToClient(0, Config.GAME_EVT_NIAO, param); + ((EXPlayBack)room.playBackData).addNiaoCommand(owner.seat, param); + } + + public void sendMaiNiaoEvt(EXPlayer owner, int seat) { + EXRoom room = owner.getRoom(); + ITObject param = new TObject(); + ITArray array = new TArray(); + for (Entry entry : room.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + for (int index = 0; index < player.mai_niao.size(); index++) { + array.addTObject(player.mai_niao.get(index).toMP()); + } + } + + param.putTArray("mai_niao", array); + param.putInt("start_seat", seat); + + room.broadCastToClient(0, Config.GAME_EVT_MAI_NIAO, param); + ((EXPlayBack)room.playBackData).addMaiNiaoCommand(owner.seat, param); + } + + /** + * Ʊ����ʾ + * @param owner + */ + public void piaoNiaoTipEvent(EXPlayer owner) { + owner.sendEvent(Config.GAME_EVT_PIAONIAO_TIP, null); + } + + private ITObject getRoomResultData(EXRoom owner) { + ITObject mp = TObject.newInstance(); + mp.putBoolean("liuju", owner.liuju); + mp.putInt("active_player", owner.playerMapBySeat.get(owner.activeSeat).playerid); + mp.putInt("xipai_score", owner.xi_pai_score); + mp.putInt("anchou_score", owner.an_chou_score); + long time = System.currentTimeMillis(); + long t = time / 1000; + mp.putLong("time", t); + ITArray niao = new TArray(); + for (int index = 0; index < owner.niao.size(); index++) { + niao.addTObject(owner.niao.get(index).toMP()); + } + mp.putTArray("niao", niao); + mp.putTArray("left_card", Util.toTArray(owner.card.cardList)); + ITArray infoList = new TArray(); + for (Entry entry : owner.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + ITObject param = new TObject(); + param.putInt("seat", player.seat); + param.putInt("win_card", player.winCard); + param.putInt("piao", player.piao); + param.putBoolean("is_win", player.winer == 1); + param.putInt("hu_score", player.score.round_log.get(EXScore.WIN)); + param.putInt("niao_score", player.score.round_log.get(EXScore.NIAO)); + param.putInt("gang_score", player.score.round_log.get(EXScore.KONG)); + param.putInt("piao_niao_score", player.score.round_log.get(EXScore.PIAO_NIAO)); + param.putInt("geng_zhuan", player.score.round_log.get(EXScore.GENG_ZHUAN)); + param.putInt("ma_geng_gong", player.score.round_log.get(EXScore.MA_GENG_GONG)); + if ((owner.config.getBoolean(Config.ROOM_CONFIG_JIEJIEGAO) || owner.config.getBoolean(Config.ROOM_CONFIG_LIAN_ZHUANG)) && player.repeat_win > 0) + { + param.putInt("repeat_win", player.repeat_win); + } + else + { + param.putInt("repeat_win", 0); + } + + param.putInt("mai_niao_score", player.score.round_log.get(EXScore.MAI_NIAO)); + player.hp_info(param); + param.putInt("round_score", player.score.round_score); + param.putInt("total_score", player.score.total_score); + ITArray handCard = Util.toTArray(player.cardInhand); + param.putTArray("hand_card", handCard); + ITArray array = CardUtil.toMPData_WinMap(player.winMap); + if (array != null) { + param.putTArray("win_list", array); + } + ITArray mai_niao = new TArray(); + for (int index = 0; index < player.mai_niao.size(); index++) { + mai_niao.addTObject(player.mai_niao.get(index).toMP()); + } + param.putTArray("mai_niao", mai_niao); + param.putInt("ming_gang_num", player.ming_gang_num); + param.putInt("an_gang_num", player.an_gang_num); + param.putInt("dian_gang_num", player.dian_gang_num); + ITArray opCardList = TArray.newInstance(); + + for (OpCard opCard : player.opCardList) { + ITObject obj = TObject.newInstance(); + obj.putInt("type", opCard.type); + obj.putInt("card", opCard.card); + if(opCard.opCard!=null) { + obj.putTArray("opcard", opCard.opCard); + } + opCardList.addTObject(obj); + } + param.putTArray("opCardList", opCardList); + + infoList.addTObject(param); + } + mp.putTArray("info_list", infoList); + return mp; + } + public void roomResult(EXRoom owner) { + ITObject mp = TObject.newInstance(); + mp.putInt("type", 0); + ITObject result = getRoomResultData(owner); + owner.playBackData.addResult(result); + mp.putTObject("result", result); + owner.broadCastToClient(0, Config.GAME_EVT_RESULT1, mp); + } + + + public void roomTotalResult(EXRoom owner,boolean dissmiss) { + ITObject data = TObject.newInstance(); + long t = System.currentTimeMillis() / 1000; + data.putLong("time", t); + ITArray infoList = new TArray(); + for (Entry entry : owner.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + ITObject param = new TObject(); + param.putInt("seat", player.seat); + param.putTObject("settle_log", player.settleLog.toTObject()); + param.putInt("total_score", player.score.total_score); + player.hp_info(param); + infoList.addTObject(param); + } + data.putTArray("info_list", infoList); + + ITObject mp = TObject.newInstance(); + mp.putInt("type", dissmiss?2:1); + if(!dissmiss) { + ITObject result = getRoomResultData(owner); + owner.playBackData.addResult(result); + mp.putTObject("result", result); + } + mp.putTObject("total_result", data); + + owner.broadCastToClient(0, Config.GAME_EVT_RESULT1, mp); + + } + + /** + * 票鸟提示 + * @param owner + */ + public void piaoTipEvent(EXPlayer owner,int reload) { + ITObject response = new TObject(); + response.putInt("piao", owner.room.config.getInt(Config.ROOM_CONFIG_PIAO)); + response.putInt("last_piao", owner.last_piao); + response.putInt("last_winer", owner.last_winer); + response.putInt("reload", reload); + owner.sendEvent(Config.GAME_EVT_PIAO_TIP, response); + } + + /** + * 票鸟事件 + * @param owner + */ + public void piaoEvent(EXPlayer owner) { + if(owner.piao==-1)return; + + ITObject param = new TObject(); + param.putInt("seat", owner.seat); + param.putInt("piao", owner.piao); + owner.room.broadCastToClient(0, Config.GAME_EVT_PIAO, param); + } + + public boolean isTingPai(EXPlayer player, int drawCard, List delPai, List opCards) + { + EXRoom room = player.getRoom(); + + List tempList = new ArrayList(); + for (int index = 1; index <= 8; index++) { + tempList.add(100*index + 1); + tempList.add(100*index + 2); + tempList.add(100*index + 3); + } + HashMap map = new HashMap(); + List tempCardList = new ArrayList(); + tempCardList.addAll(player.cardInhand); + if (drawCard > 0) + { + Util.removeCard(tempCardList, drawCard, 1); + } + if (delPai != null) + { + for(int i = 0; i < delPai.size(); i++) + { + Util.removeCard(tempCardList, delPai.get(i), 1); + } + } + + for(int j = 0; j < tempList.size(); j++) + { + int laizi = room.config.getInt(Config.ROOM_CONFIG_LAIZI); + map.clear(); + WinCard win = new WinCard(tempCardList, tempList.get(j), room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, true, true); + if (win.checkWinOpList(map, player, opCards, room, true)) { + return true; + } + } + + return false; + } + + public ITArray getTingList(EXPlayer player) + { + EXRoom room = player.getRoom(); + + Map cardMap = new HashMap<>(); + List tempList = new ArrayList(); + for (int index = 1; index <= 8; index++) { + tempList.add(100*index + 1); + tempList.add(100*index + 2); + tempList.add(100*index + 3); + } + HashMap map = new HashMap(); + + for(int i = 0; i < player.cardInhand.size(); i++) + { + int tempCard = player.cardInhand.get(i); + if (player.getRoom().isLaizi(tempCard)) + { + continue; + } + + List tempCardList = new ArrayList(); + tempCardList.addAll(player.cardInhand); + Util.removeCard(tempCardList, tempCard, 1); + + for(int j = 0; j < tempList.size(); j++) + { + int laizi = room.config.getInt(Config.ROOM_CONFIG_LAIZI); + map.clear(); + WinCard win = new WinCard(tempCardList, tempList.get(j), room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, true, true); + if (win.checkWin(map, player, room, true)) { + if (!cardMap.containsKey(tempCard)) + { + ITArray cardMapList = new TArray(); + cardMapList.addInt(tempList.get(j)); + cardMap.put(tempCard, cardMapList); + } + else + { + ITArray cardMapList = cardMap.get(tempCard); + cardMapList.addInt(tempList.get(j)); + } + } + } + } + + ITArray array = TArray.newInstance(); + for (Map.Entry entry : cardMap.entrySet()) { + ITObject obj = TObject.newInstance(); + obj.putInt("card", entry.getKey()); + obj.putTArray("value", entry.getValue()); + Global.logger.info("del card:"+entry.getKey()+" hu card:"+ entry.getValue().toJson()); + array.addTObject(obj); + } + + return array; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXMainServer.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXMainServer.java new file mode 100644 index 0000000..f3a586a --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXMainServer.java @@ -0,0 +1,99 @@ +package extend.mj; + +import java.util.Map; + +import com.game.GameController; +import com.game.Global; +import com.game.MainServer; +import com.game.data.Player; +import com.game.data.Room; +import com.game.player.state.PlayerWaitState; +import com.game.room.state.RoomStartGameState; + +import extend.mj.player.rulestate.*; +import extend.mj.player.state.EXPlayerDisCardTipState; +import extend.mj.player.state.EXPlayerDiscardState; +import extend.mj.player.state.EXPlayerDrawState; +import extend.mj.player.state.EXPlayerKongDrawState; +import extend.mj.player.state.EXPlayerDrawTipState; +import extend.mj.player.state.EXPlayerKongWinState; +import extend.mj.player.state.EXPlayerPiaoNiaoTipState; +import extend.mj.player.state.EXPlayerWaitKongWinState; +import extend.mj.player.state.EXPlayerWaitState; +import extend.mj.room.state.EXRoomDealState; +import extend.mj.room.state.EXRoomPiaoState; +import extend.mj.room.state.EXRoomSetpState; +import extend.mj.room.state.EXRoomStartGameState; + +/** + * + * + * EXMainServer.java + */ +public class EXMainServer extends MainServer{ + + + public static PlayerRuleManager playerRuleMgr; + + public static EXGameController gameCtr; + + @Override + public void onStart() { + super.onStart(); + gameCtr = (EXGameController)Global.gameCtr; + + registerState(); + + playerRuleMgr = new PlayerRuleManager(); + } + + + private final void registerState() { + Global.registerState(RoomStartGameState.class, new EXRoomStartGameState()); + Global.registerState(EXRoomSetpState.class, new EXRoomSetpState()); + Global.registerState(EXRoomDealState.class, new EXRoomDealState()); + Global.registerState(EXRoomPiaoState.class, new EXRoomPiaoState()); + + Global.registerState(PlayerWaitState.class, new EXPlayerWaitState()); + Global.registerState(EXPlayerDrawState.class, new EXPlayerDrawState()); + Global.registerState(EXPlayerKongDrawState.class, new EXPlayerKongDrawState()); + + Global.registerState(EXPlayerDiscardState.class, new EXPlayerDiscardState()); + Global.registerState(EXPlayerDisCardTipState.class, new EXPlayerDisCardTipState()); + Global.registerState(EXPlayerDrawTipState.class, new EXPlayerDrawTipState()); + Global.registerState(EXPlayerWaitKongWinState.class, new EXPlayerWaitKongWinState()); + Global.registerState(EXPlayerKongWinState.class, new EXPlayerKongWinState()); + Global.registerState(EXPlayerPiaoNiaoTipState.class, new EXPlayerPiaoNiaoTipState()); + + Global.registerState(PROtherKongState.class, new PROtherKongState()); + Global.registerState(PROtherWinState.class, new PROtherWinState()); + Global.registerState(PRPongState.class, new PRPongState()); + Global.registerState(PRChowState.class, new PRChowState()); + Global.registerState(PRSelfKongState.class, new PRSelfKongState()); + Global.registerState(PRSelfWinState.class, new PRSelfWinState()); + Global.registerState(PROtherGongSelfWinState.class, new PROtherGongSelfWinState()); + + + } + + + @Override + public Room newRoom(String roomid, Map redis_room_map) { + // TODO Auto-generated method stub + return new EXRoom(roomid, redis_room_map); + } + + + @Override + public Player newPlayer(int playerid, Room room, String session_id) { + // TODO Auto-generated method stub + return new EXPlayer(playerid, room, session_id); + } + + + @Override + protected GameController newController() { + // TODO Auto-generated method stub + return new EXGameController(); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayBack.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayBack.java new file mode 100644 index 0000000..4349aa8 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayBack.java @@ -0,0 +1,71 @@ +package extend.mj; + +import com.game.Util; +import com.game.data.BasePlayBack; +import com.game.data.Player; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TObject; + +public class EXPlayBack extends BasePlayBack{ + + + public EXPlayBack(EXRoom room){ + super(room); + info.putInt("left_card", room.card.getCount()); + } + + protected ITObject getPlayerInfo(Player player) { + ITObject obj =super.getPlayerInfo(player); + EXPlayer p = (EXPlayer)player; + ITArray cardInhand = Util.toTArray(p.cardInhand); + obj.putTArray("hand_card", cardInhand); + obj.putInt("score", player.score.total_score); + obj.putInt("piao", p.piao); + return obj; + } + + public void addGetCardCommand(int seat,int card,int left_count){ + ITObject data = TObject.newInstance(); + data.putInt("card", card); + data.putInt("left_count", left_count); + addCommand("GetCard",seat,data); + } + + + public void addOutCardCommand(int seat,int card){ + ITObject data = TObject.newInstance(); + data.putInt("card", card); + addCommand("OutCard",seat,data); + } + + public void addOutCardKongCommand(int seat,ITArray card){ + ITObject data = TObject.newInstance(); + data.putTArray("cardList", card); + addCommand("OutCardKong",seat,data); + } + + public void addActionCommand(int seat,int type,int card,int from_seat,ITArray opcardArray){ + ITObject cmdData = TObject.newInstance(); + cmdData.putInt("card", card); + cmdData.putInt("type", type); + cmdData.putInt("from_seat", from_seat); + if(opcardArray!=null) + cmdData.putTArray("opcard", opcardArray); + addCommand("Action",seat,cmdData); + } + + public void addWinCardCommand(int seat,boolean zimo){ + ITObject cmdData = TObject.newInstance(); + addCommand("Win",seat,cmdData); + } + + public void addNiaoCommand(int seat,ITObject param){ + addCommand("Niao",seat,param); + } + + public void addMaiNiaoCommand(int seat,ITObject param){ + addCommand("Mai_Niao",seat,param); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayer.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayer.java new file mode 100644 index 0000000..9fd0061 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXPlayer.java @@ -0,0 +1,262 @@ +package extend.mj; + +import com.game.Global; +import com.game.Util; +import com.game.data.Player; +import com.game.data.Room; +import com.game.data.Score; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import com.taurus.core.entity.TObject; +import extend.mj.tip.TipManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * + * + * + * 2017��8��30�� + * EXPlayer.java + */ +public class EXPlayer extends Player { + // ���� + public List cardInhand; + + // ������ + public List outcardList; + + public ITArray opCard; + + public List pongGroup; + public List kongGroup; + public List selfKongGroup; + public List opCardList; + + public int drawCard = 0; + public int winCard = 0; + + public TipManager tipMgr; + + public SettleLog settleLog; + + /** + * ©�� + */ + public boolean louhu = false; + + /** + * ǿ�Ƽ����� + */ + public boolean forceCheckWin = false; + /** + * 0 С�� 1 ���ܺ� + */ + public int winType = 0; + + /** + * 0 无 1 胡 2 输 + */ + public int last_winer = 0; + + public List notPongKongList = new ArrayList<>(); + public List notPongList = new ArrayList<>(); + + public int niaoCount; + + public int repeat_win; + + public Map winMap; + + public int niao_score; + + public int hu_score; + + public int di_score; + + public ArrayList mai_niao; + + public int ming_gang_num = 0; + public int an_gang_num = 0; + public int dian_gang_num = 0; + + public boolean tinghu10bei = false; + + public boolean gangshangpao = false; + + public int piao = -1; + public int last_piao = -1; + + public boolean is_gang = false; + + public EXPlayer(int playerid, Room table, String session_id) { + super(playerid, table, session_id); + + cardInhand = new ArrayList<>(); + outcardList = new ArrayList<>(); + + pongGroup = new ArrayList<>(); + kongGroup = new ArrayList<>(); + selfKongGroup = new ArrayList<>(); + opCardList = new ArrayList<>(); + + opCard = new TArray(); + + tipMgr = new TipManager(this); + + settleLog = new SettleLog(); + settleLog.put(Config.SETTLE_DIAN_PAO, 0); + settleLog.put(Config.SETTLE_JIE_PAO, 0); + settleLog.put(Config.SETTLE_ZIMO, 0); + settleLog.put(Config.SETTLE_AN_KONG, 0); + settleLog.put(Config.SETTLE_MING_KONG, 0); + + repeat_win = -1; + niao_score = 2; + hu_score = 0; + di_score = 0; + + ming_gang_num = 0; + an_gang_num = 0; + dian_gang_num = 0; + + last_winer = 0; + + tinghu10bei = false; + gangshangpao = false; + is_gang = false; + + this.mai_niao = new ArrayList(); + } + + protected Score newScore() { + return new EXScore(this); + } + + public void initOpCard(ITArray opcard) { + this.opCard.clear(); + for (int i = 0; i < opcard.size(); ++i) { + this.opCard.addInt(opcard.getInt(i)); + } + } + + public ITObject getReloadInfo() { + ITObject playerData = super.getReloadInfo(); + ITArray disCard = Util.toTArray(this.outcardList); + playerData.putTArray("outcard_list", disCard); + playerData.putInt("card_count", cardInhand.size()); + playerData.putInt("score", score.total_score); + playerData.putInt("piao", this.piao); + playerData.putInt("last_piao", this.last_piao); + ITArray opcards = TArray.newInstance(); + for (OpCard opcard : opCardList) { + ITObject opcardParam = new TObject(); + opcardParam.putInt("type", opcard.type); + opcardParam.putInt("card", opcard.card); + if(opcard.opCard!=null) { + opcardParam.putTArray("opcard", opcard.opCard); + } + opcards.addTObject(opcardParam); + } + playerData.putTArray("opcard", opcards); + + return playerData; + } + + public void clear() { + super.clear(); + this.cardInhand.clear(); + this.notPongKongList.clear(); + this.notPongList.clear(); + this.winer = 0; + this.louhu = false; + this.outcardList.clear(); + this.drawCard = 0; + this.kongGroup.clear(); + this.pongGroup.clear(); + this.selfKongGroup.clear(); + this.opCardList.clear(); + this.score.resetRound(); + this.niaoCount = 0; + this.winMap = null; + this.niao_score = 2; + this.hu_score = 0; + this.di_score = 0; + this.mai_niao.clear(); + this.ming_gang_num = 0; + this.an_gang_num = 0; + this.dian_gang_num = 0; + this.tinghu10bei = false; + this.piao = -1; + this.is_gang = false; + } + + public int getShowHuXi(boolean self) { + int huXi = 0; + for (OpCard opCard : this.opCardList) { + /*if (!self) { + if (opCard.type == RuleWeight.TYPE_KAN || opCard.type == RuleWeight.TYPE_WEI) { + continue; + } + } else {*/ + if (opCard.type == RuleWeight.TYPE_CHOW) { + huXi += 4; + } + if (opCard.type == RuleWeight.TYPE_PONG) { + if (IsShangFu(opCard.card)) + { + huXi += 3 * 4; + } + else { + huXi += 2; + } + } + if(opCard.type == RuleWeight.TYPE_KONG){ + if (room.config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) { + huXi += 6; + }else{ + huXi += 4; + } + } + if(opCard.type == RuleWeight.TYPE_SELF_KONG){ + if (room.config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) { + huXi += 6; + }else{ + huXi += 4; + } + } + if(opCard.type == RuleWeight.TYPE_ZHAO){ + if (room.config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) { + huXi += 6; + }else{ + huXi += 4; + } + } + if(opCard.type == RuleWeight.TYPE_SELF_ZHAO){ + if (room.config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) { + huXi += 6; + }else{ + huXi += 4; + } + } + + } + return huXi; + } + public boolean IsShangFu(int card) + { + if (card == 101 || card == 801) + { + return true; + } + return false; + } + + + public EXRoom getRoom() { + return (EXRoom) room; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXRoom.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXRoom.java new file mode 100644 index 0000000..eb49257 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXRoom.java @@ -0,0 +1,790 @@ +package extend.mj; + +import com.game.Global; +import com.game.Util; +import com.game.data.Player; +import com.game.data.Room; +import com.game.player.state.PlayerWaitState; +import com.taurus.core.entity.ITObject; +import extend.mj.player.state.EXPlayerDisCardTipState; +import extend.mj.tip.Action; +import extend.mj.tip.TipManager; +import extend.mj.uitl.WinCard; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +public class EXRoom extends Room { + + // + public Map tipMap; + public List actionList; + + public RoomCard card; + + public int activeCard; + public int currenDiscardSeat; + public int lastDiscardSeat; + public int winCount = 0; + public boolean liuju = false; + public boolean last_liuju = false; + + public ArrayList niao; + + public int piaoNiaoCount; + public int adminSeat = 0; + public int lastWinPlayerId = 0; + public boolean isGengZhuang = false; + public int first_zhuang_card = 0; + public int geng_zhuan_num = 0; + public int gent_zhuan_nextSeat = 0; + /* + * 上一次庄家座位号 + */ + public int lastBankerSeat = 0; + public int piaoCount = 0; + + public EXRoom(String roomid, Map redis_room_map) { + super(roomid, redis_room_map); + card = new RoomCard(this); + + this.tipMap = new HashMap(); + this.actionList = new ArrayList(); + this.niao = new ArrayList(); + + if (!this.config.containsKey(Config.ROOM_CONFIG_DIANPAO)) + { + this.config.putBoolean(Config.ROOM_CONFIG_DIANPAO, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_HUNYISE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_HUNYISE, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_QINGYISE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QINGYISE, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_PENGPENGHU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_PENGPENGHU, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_QIDUI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QIDUI, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_HAOHUA_QIDUI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_HAOHUA_QIDUI, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_HAOHUA2_QIDUI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_HAOHUA2_QIDUI, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_HAOHUA3_QIDUI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_HAOHUA3_QIDUI, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_GANGSHANGKAIHUA_2bei)) + { + this.config.putBoolean(Config.ROOM_CONFIG_GANGSHANGKAIHUA_2bei, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_SHISHANGYAO)) + { + this.config.putBoolean(Config.ROOM_CONFIG_SHISHANGYAO, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_TIANDIHU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_TIANDIHU, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_SHIBALUOHAN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_SHIBALUOHAN, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_XIAOSHANYUAN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_XIAOSHANYUAN, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_DASHANYUAN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_DASHANYUAN, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_DASIXI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_DASIXI, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_XIAOSIXI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_XIAOSIXI, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_LOUHU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_LOUHU, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_GUO_PENG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_GUO_PENG, false); + } + if (!this.config.containsKey(Config.ROOM_CONFIG_GUO_GONG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_GUO_GONG, false); + } + + this.config.putBoolean(Config.ROOM_CONFIG_NONEALL, false); + this.config.putBoolean(Config.ROOM_CONFIG_ZHUANGXIAN, false); + this.config.putBoolean(Config.ROOM_CONFIG_QIANGKONG_NIAO, true); + + //可抢杠胡 + if (!this.config.containsKey(Config.ROOM_CONFIG_QIANGKONG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QIANGKONG, false); + } + + //可抢杠胡2倍 + if (!this.config.containsKey(Config.ROOM_CONFIG_QIANGKONG_2BEI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QIANGKONG_2BEI, false); + } + + //明杠可抢 + if (!this.config.containsKey(Config.ROOM_CONFIG_QIANGKONG_MING)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QIANGKONG_MING, false); + } + + //抢杠全包 + if (!this.config.containsKey(Config.ROOM_CONFIG_QG_TYPE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QG_TYPE, false); + } + + //杠爆全包 + if (!this.config.containsKey(Config.ROOM_CONFIG_GANGBAO_TYPE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_GANGBAO_TYPE, false); + } + + this.config.putBoolean(Config.ROOM_CONFIG_HZ_HU, false); + + if (!this.config.containsKey(Config.ROOM_CONFIG_GENGZHUAN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_GENGZHUAN, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_JIEJIEGAO)) + { + this.config.putBoolean(Config.ROOM_CONFIG_JIEJIEGAO, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_JIEJIEGAO_FIRST_NO)) + { + this.config.putBoolean(Config.ROOM_CONFIG_JIEJIEGAO_FIRST_NO, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_LIAN_ZHUANG)) { + this.config.putBoolean(Config.ROOM_CONFIG_LIAN_ZHUANG, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_WUGUI_JIABEI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_WUGUI_JIABEI, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_NO_WAN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_NO_WAN, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_QIDUI_JIA_FAN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QIDUI_JIA_FAN, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_QIDUI_4BEI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QIDUI_4BEI, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_MA_GEN_GONG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_MA_GEN_GONG, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_WU_FENG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_WU_FENG, false); + } + + ////幺九 + if (!this.config.containsKey(Config.ROOM_CONFIG_YAO_JIU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_YAO_JIU, false); + } + + //清幺九 + if (!this.config.containsKey(Config.ROOM_CONFIG_QING_YAO_JIU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QING_YAO_JIU, false); + } + + //有没有癞子 + if (!this.config.containsKey(Config.ROOM_CONFIG_LAIZI)) + { + this.config.putInt(Config.ROOM_CONFIG_LAIZI, 0); + } + + //四鬼胡牌 + if (!this.config.containsKey(Config.ROOM_CONFIG_LAIZI4_HU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_LAIZI4_HU, false); + } + + //四鬼胡牌两倍 + if (!this.config.containsKey(Config.ROOM_CONFIG_LAIZI4_HU_2BEI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_LAIZI4_HU_2BEI, false); + } + + //全风 + if (!this.config.containsKey(Config.ROOM_CONFIG_QUAN_FENG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QUAN_FENG, false); + } + + ////12张落地全包 + if (!this.config.containsKey(Config.ROOM_CONFIG_12ZHANG_LUODI_QUANBAO)) + { + this.config.putBoolean(Config.ROOM_CONFIG_12ZHANG_LUODI_QUANBAO, false); + } + + ////留够马牌 + if (!this.config.containsKey(Config.ROOM_CONFIG_LIU_GOU_MA)) + { + this.config.putBoolean(Config.ROOM_CONFIG_LIU_GOU_MA, false); + } + + //全求人 + if (!this.config.containsKey(Config.ROOM_CONFIG_QUAN_FENG_SCORE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QUAN_FENG_SCORE, false); + } + + // ROOM_CONFIG_han19 = "han19"; //含19即可 + if (!this.config.containsKey(Config.ROOM_CONFIG_han19)) + { + this.config.putBoolean(Config.ROOM_CONFIG_han19, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_ZIYISE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_ZIYISE, false); + } + + + //大胡相乘 + if (!this.config.containsKey(Config.ROOM_CONFIG_DAHU_CHENG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_DAHU_CHENG, false); + } + + //鸡胡不能吃胡 + if (!this.config.containsKey(Config.ROOM_CONFIG_JIHU_NOTCHIHU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_JIHU_NOTCHIHU, false); + } + + //小胡的倍数另算 + if (!this.config.containsKey(Config.ROOM_CONFIG_XIAOHU_BEI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_XIAOHU_BEI, false); + } + + //流局两倍 + if (!this.config.containsKey(Config.ROOM_CONFIG_LIUJU_2BEI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_LIUJU_2BEI, false); + } + + //荒庄荒杠 + if (!this.config.containsKey(Config.ROOM_CONFIG_HUANGZHUANGHUANGGANG)) + { + this.config.putBoolean(Config.ROOM_CONFIG_HUANGZHUANGHUANGGANG, false); + } + + //潮州特殊自摸 + if (!this.config.containsKey(Config.ROOM_CONFIG_SPECAIL_ZIMO)) + { + this.config.putBoolean(Config.ROOM_CONFIG_SPECAIL_ZIMO, false); + } + + //必胡,必须胡牌,不能过 + if (!this.config.containsKey(Config.ROOM_CONFIG_MUST_HU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_MUST_HU, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_LIU_GOU_MA)) + { + this.config.putBoolean(Config.ROOM_CONFIG_LIU_GOU_MA, false); + } + + //买马,提前预定马,猜谁胡 + if (!this.config.containsKey(Config.ROOM_CONFIG_MAI_NIAO)) + { + this.config.putInt(Config.ROOM_CONFIG_MAI_NIAO, 0); + } + + //买马值 + if (!this.config.containsKey(Config.ROOM_CONFIG_MAI_NIAO_OPT)) + { + this.config.putInt(Config.ROOM_CONFIG_MAI_NIAO_OPT, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_MA_GEN_DI_FEN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_MA_GEN_DI_FEN, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_NIAO)) + { + this.config.putInt(Config.ROOM_CONFIG_NIAO, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_NIAO_OPT)) + { + this.config.putInt(Config.ROOM_CONFIG_NIAO_OPT, 0); + } + + //10倍不计分 + if (!this.config.containsKey(Config.ROOM_CONFIG_10_BEI_BUJIFEN)) + { + this.config.putBoolean(Config.ROOM_CONFIG_10_BEI_BUJIFEN, false); + } + + //封顶十倍 + if (!this.config.containsKey(Config.ROOM_CONFIG_10_BEI_FENGDING)) + { + this.config.putBoolean(Config.ROOM_CONFIG_10_BEI_FENGDING, false); + } + + //自动胡 + if (!this.config.containsKey(Config.ROOM_CONFIG_ZI_DONG_HU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_ZI_DONG_HU, false); + } + + //海底捞月 + //自动胡 + if (!this.config.containsKey(Config.ROOM_CONFIG_HAI_DI_NAO_YUE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_HAI_DI_NAO_YUE, false); + } + + ////使用默认基础胡分 + if (!this.config.containsKey(Config.ROOM_CONFIG_USE_BASE_HU_SCORE)) + { + this.config.putBoolean(Config.ROOM_CONFIG_USE_BASE_HU_SCORE, false); + } + + //门清 + if (!this.config.containsKey(Config.ROOM_CONFIG_MENG_QING)) + { + this.config.putBoolean(Config.ROOM_CONFIG_MENG_QING, false); + } + + //没有鸡胡,统一叫平胡 + if (!this.config.containsKey(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU, false); + } + + //杠上炮2倍 + if (!this.config.containsKey(Config.ROOM_CONFIG_GANGSHANGPAO_2bei)) + { + this.config.putBoolean(Config.ROOM_CONFIG_GANGSHANGPAO_2bei, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_CHUIPAI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_CHUIPAI, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_PIAO)) + { + this.config.putInt(Config.ROOM_CONFIG_PIAO, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_PIAO_FEN)) + { + this.config.putInt(Config.ROOM_CONFIG_PIAO_FEN, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_XUAN_ZHUANG)) + { + this.config.putInt(Config.ROOM_CONFIG_XUAN_ZHUANG, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_QING_ZUI_HU)) + { + this.config.putInt(Config.ROOM_CONFIG_QING_ZUI_HU, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_QING_ZUI_HU, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_SPECIAL_PENG_PENG_HU)) + { + this.config.putBoolean(Config.ROOM_CONFIG_SPECIAL_PENG_PENG_HU, false); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_FEN_DIEJIA)) + { + this.config.putInt(Config.ROOM_CONFIG_FEN_DIEJIA, 0); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_XIPAI_SCORE)) + { + this.config.putInt(Config.ROOM_CONFIG_XIPAI_SCORE, 0); + this.xi_pai_score = 1; + } + else { + this.xi_pai_score = this.config.getInt(Config.ROOM_CONFIG_XIPAI_SCORE); + } + + if (!this.config.containsKey(Config.ROOM_CONFIG_ANCHOU_SCORE)) + { + this.config.putFloat(Config.ROOM_CONFIG_ANCHOU_SCORE, 0); + this.an_chou_score = 1; + }else { + this.an_chou_score = this.config.getInt(Config.ROOM_CONFIG_ANCHOU_SCORE); + } + + + if (!this.config.containsKey(Config.ROOM_CONFIG_XIPAI)) + { + this.config.putBoolean(Config.ROOM_CONFIG_XIPAI, false); + } + + this.isEntrust=true; + this.adminSeat = 0; + this.lastWinPlayerId =0; + + this.first_zhuang_card = 0; + this.geng_zhuan_num = 0; + this.gent_zhuan_nextSeat = 0; + + if (this.config.getBoolean(Config.ROOM_CONFIG_GENGZHUAN)) + { + this.isGengZhuang = true; + } + + this.lastBankerSeat = 0; + this.last_liuju = false; + + //初始化房间的特殊参数 + WinCardType.InitRoomSpecialConfig(this); + } + + public boolean isLiuJu() + { + if (card.cardList.size() == 0) + { + return true; + } + + return false; + } + + public void endGameByLiuJu() + { + if (config.getBoolean(Config.ROOM_CONFIG_HUANGZHUANGHUANGGANG)) + { + for (Entry entry : this.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + int score = player.score.round_log.get(EXScore.KONG); + player.score.round_score -= score; + player.score.total_score -= score; + player.score.round_log.put(EXScore.KONG, 0); + } + } + liuju = true; + clear_repeatwin(); + + endGame(); + } + + public void endGame() + { + last_liuju = liuju; + for (Entry entry : this.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + if (player.winer != 1) + { + player.last_winer = 0; + player.repeat_win = -1; + } + else + { + player.last_winer = 1; + } + } + super.endGame(); + } + + public void addAction(Action action) { + if (this.actionList.size() == 0) { + this.actionList.add(action); + } else if (action.tip.weight > this.actionList.get(0).tip.weight) { + this.actionList.clear(); + this.actionList.add(action); + } else if (action.tip.weight == this.actionList.get(0).tip.weight) { + this.actionList.add(action); + } + + checkAction(); + } + + public boolean isLaizi(int card) { + return this.card.isLaizi(card); + } + + public void checkAction() { + boolean isWeightest = this.isWeightestAction(); + if (!isWeightest) { + return; + } + if (this.isAllPass()) { + Player activePlayer = this.playerMapBySeat.get(this.activeSeat); + activePlayer.stateMachine.toNextState(); + } else { + + for (Action action : this.actionList) { + action.run(); + } + this.actionList.clear(); + } + } + + public boolean isAllPass() { + return this.actionList.size() == 0 && this.tipMap.size() == 0; + } + + public boolean isWeightestAction() { + + if (this.isAllPass()) { + return true; + } + if (this.actionList.size() == 0) { + return false; + } + + Action curaction = this.actionList.get(0); + for (Entry entry : this.tipMap.entrySet()) { + TipManager tip = entry.getValue(); + if (curaction.tip.weight <= tip.getWeightest()) { + return false; + } + } + + for (Entry entry : this.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + if (player.stateMachine.curState instanceof EXPlayerDisCardTipState) { + player.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + } + } + return true; + + } + + /** + * 获取房间信息 + * + * @return + */ + public ITObject getRoomInfo() { + ITObject data = super.getRoomInfo(); + if (data != null) + { + data.putInt("laiziCard", this.card.laiziCard); + data.putInt("laiziCard2", this.card.laiziCard2); + data.putInt("laiziCardBefore", this.card.laiziCardBefore); + data.putInt("laiziCard2Before", this.card.laiziCard2Before); + } + + return data; + } + + public ITObject getReloadInfo(Player player) { + ITObject data = super.getReloadInfo(player); + EXPlayer p = (EXPlayer) player; + data.putTArray("hand_card", Util.toTArray(p.cardInhand)); + data.putInt("left_card", card.getCount()); + data.putInt("curren_outcard_seat", currenDiscardSeat); + data.putInt("last_outcard_seat", lastDiscardSeat); + return data; + } + + public void addScore(EXPlayer destPlayer, EXPlayer fromPlayer, int score, int type) { + boolean zhuangxian = this.config.getBoolean(Config.ROOM_CONFIG_ZHUANGXIAN); + if(type == EXScore.WIN) { + if (zhuangxian) { + if (destPlayer.seat == this.bankerSeat || fromPlayer.seat == this.bankerSeat) { + score += 1; + } + } + } + + if (type == EXScore.WIN || type == EXScore.NIAO) + { + if (fromPlayer.tinghu10bei) + { + return; + } + } + + destPlayer.score.round_log.put(type, destPlayer.score.round_log.get(type) + score); + fromPlayer.score.round_log.put(type, fromPlayer.score.round_log.get(type) - score); + + destPlayer.score.round_score += score; + destPlayer.score.total_score += score; + + fromPlayer.score.round_score -= score; + fromPlayer.score.total_score -= score; + + } + + public void addMaGengGongScore(EXPlayer destPlayer, EXPlayer fromPlayer, int score) { + this.addScore(destPlayer, fromPlayer, score, EXScore.MA_GENG_GONG); + } + + public void addAllMaGengGongScore(EXPlayer destPlayer, int score) { + for (Entry entry : this.playerMapById.entrySet()) { + if (entry.getKey().equals(destPlayer.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + addMaGengGongScore(destPlayer, fromPlayer, score); + } + } + + public int GetGongScore(EXPlayer destPlayer) + { + return destPlayer.score.round_log.get(EXScore.KONG); + } + + public void addAllScore(EXPlayer destPlayer, int socre, int type) { + for (Entry entry : this.playerMapById.entrySet()) { + if (entry.getKey().equals(destPlayer.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + this.addScore(destPlayer, fromPlayer, socre, type); + } + } + + public void addMaiNiaoScore(EXPlayer destPlayer, EXPlayer fromPlayer, int score) { + this.addScore(destPlayer, fromPlayer, score, EXScore.MAI_NIAO); + } + + public void addAllMaiNiaoScore(EXPlayer destPlayer, int score) { + for (Entry entry : this.playerMapById.entrySet()) { + if (entry.getKey().equals(destPlayer.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + addMaiNiaoScore(destPlayer, fromPlayer, score); + } + } + + public void addNiaoScore(EXPlayer destPlayer, EXPlayer fromPlayer, int score) { + this.addScore(destPlayer, fromPlayer, score, EXScore.NIAO); + } + + public void addAllNiaoScore(EXPlayer destPlayer, int score) { + for (Entry entry : this.playerMapById.entrySet()) { + if (entry.getKey().equals(destPlayer.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + addNiaoScore(destPlayer, fromPlayer, score); + } + } + + public void addPiaoNiaoScore(EXPlayer destPlayer, EXPlayer fromPlayer) { + int piao_niao = this.config.getInt(Config.ROOM_CONFIG_PIAO); //0:热票 1:冷票 2:不嫖 3:固定票分 + if(piao_niao == 0)return; + this.addScore(destPlayer, fromPlayer,destPlayer.piao + fromPlayer.piao, EXScore.PIAO_NIAO); + } + + public void addAllPiaoNiaoScore(EXPlayer destPlayer) { + int piao_niao = this.config.getInt(Config.ROOM_CONFIG_PIAO); //0:不嫖 1:冷票 2: 3:固定票分 + if(piao_niao == 0)return; + for (Entry entry : this.playerMapById.entrySet()) { + if (entry.getKey().equals(destPlayer.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + addPiaoNiaoScore(destPlayer,fromPlayer); + } + } + + public void handle_repeatwin(EXPlayer owner) + { + if (owner.last_winer == 1) + { + owner.repeat_win += 1; + } + else + { + owner.repeat_win += 1; + } + } + + public void clear_repeatwin() + { + for (Entry entry : this.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + player.repeat_win = -1; + player.last_winer = 0; + } + } + + @Override + public void saveMilitaryTotal(boolean dissmiss) { + super.saveMilitaryTotal(dissmiss); + EXMainServer.gameCtr.roomTotalResult(this, dissmiss); + } + @Override + protected void roomResult() { + EXMainServer.gameCtr.roomResult(this); + } + + @Override + public void clear() { + super.clear(); + + this.liuju = false; + this.activeSeat = this.lastDiscardSeat = this.currenDiscardSeat = 0; + this.winCount = this.piaoNiaoCount = 0; + this.niao.clear(); + + this.isGengZhuang = false; + this.first_zhuang_card = 0; + this.geng_zhuan_num = 0; + this.gent_zhuan_nextSeat = 0; + if (this.config.getBoolean(Config.ROOM_CONFIG_GENGZHUAN)) + { + this.isGengZhuang = true; + } + this.lastBankerSeat = 0; + } + + public void winCallback(EXPlayer owner, int card) { + this.endGame(); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXScore.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXScore.java new file mode 100644 index 0000000..91596ad --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/EXScore.java @@ -0,0 +1,29 @@ +package extend.mj; + +import com.game.data.Score; + + +public class EXScore extends Score{ + public static final int WIN = 1; + public static final int KONG = 2; + public static final int NIAO = 3; + public static final int PIAO_NIAO = 4; + public static final int GENG_ZHUAN = 5; + public static final int MA_GENG_GONG = 6; + public static final int MAI_NIAO = 7; + + public EXScore(EXPlayer owner){ + super(owner); + } + + protected void initLog() { + this.round_log.put(WIN, 0); + this.round_log.put(KONG, 0); + this.round_log.put(NIAO, 0); + this.round_log.put(PIAO_NIAO, 0); + this.round_log.put(GENG_ZHUAN, 0); + this.round_log.put(MA_GENG_GONG, 0); + this.round_log.put(MAI_NIAO, 0); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/OpCard.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/OpCard.java new file mode 100644 index 0000000..a71c560 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/OpCard.java @@ -0,0 +1,23 @@ +package extend.mj; + +import com.taurus.core.entity.ITArray; + +public class OpCard { + public int type; + public int card; + public int card_seat; + public ITArray opCard; + public int huXi; + + public OpCard(int type, int card) { + this.type = type; + this.card = card; + this.card_seat = 0; + } + + public OpCard(int type, int card, int card_seat) { + this.type = type; + this.card = card; + this.card_seat = card_seat; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/PlayerRuleManager.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/PlayerRuleManager.java new file mode 100644 index 0000000..edb6259 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/PlayerRuleManager.java @@ -0,0 +1,108 @@ +package extend.mj; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.game.Global; + +import extend.mj.player.rule.*; +import extend.mj.player.state.EXPlayerDisCardTipState; +import extend.mj.player.state.EXPlayerDrawTipState; +import extend.mj.player.state.EXPlayerKongWinState; +import extend.mj.player.state.EXPlayerTipState; +import extend.mj.tip.IRuleBase; + +/** + * ����������� + * + * + * + * 2017��9��19�� PlayerRuleManager.java + */ +public class PlayerRuleManager { + + /** + * ����ץ�� + */ + public static final int DRAW_RULE = 1; + + /** + * ���˳��� + */ + public static final int OTHER_DISCARD_RULE = 2; + /** + * ���ܺ����� + */ + public static final int KONG_HU_RULE = 3; + /** + * �������Ժ���ƹ��� + */ + public static final int CHOW_PONG_DISCARD_RULE = 7; + + public static final int KONG_DRAW_RULE = 8; + + public HashMap> ruleMap = null; + public HashMap tipMap = null; + + public PlayerRuleManager() { + ruleMap = new HashMap>(); + + tipMap = new HashMap(); + tipMap.put(PlayerRuleManager.DRAW_RULE, (EXPlayerTipState) Global.getState(EXPlayerDrawTipState.class)); + tipMap.put(PlayerRuleManager.KONG_DRAW_RULE, (EXPlayerTipState) Global.getState(EXPlayerDrawTipState.class)); + tipMap.put(PlayerRuleManager.OTHER_DISCARD_RULE, (EXPlayerTipState) Global.getState(EXPlayerDisCardTipState.class)); + tipMap.put(PlayerRuleManager.KONG_HU_RULE, (EXPlayerKongWinState) Global.getState(EXPlayerKongWinState.class)); + tipMap.put(PlayerRuleManager.CHOW_PONG_DISCARD_RULE, (EXPlayerDrawTipState) Global.getState(EXPlayerDrawTipState.class)); + + List drawRuleList = new ArrayList(); + drawRuleList.add(new RuleSelfKong()); + //drawRuleList.add(new RulePongKong()); + drawRuleList.add(new RuleSelfWin()); + ruleMap.put(PlayerRuleManager.DRAW_RULE, drawRuleList); + + List kongDrawRuleList = new ArrayList(); + kongDrawRuleList.add(new RuleSelfKong()); + //kongDrawRuleList.add(new RulePongKong()); + kongDrawRuleList.add(new RuleOtherKongSelfWin()); + ruleMap.put(PlayerRuleManager.KONG_DRAW_RULE, kongDrawRuleList); + + List otherDiscardList = new ArrayList(); + otherDiscardList.add(new RuleOtherKong()); + otherDiscardList.add(new RulePong()); + otherDiscardList.add(new RuleChow()); + otherDiscardList.add(new RuleOtherWin()); + ruleMap.put(PlayerRuleManager.OTHER_DISCARD_RULE, otherDiscardList); + + List konghuList = new ArrayList(); + ruleMap.put(PlayerRuleManager.KONG_HU_RULE, konghuList); + + List cpDiscardRuleList = new ArrayList(); + cpDiscardRuleList.add(new RuleSelfKong()); + //cpDiscardRuleList.add(new RulePongKong()); + ruleMap.put(PlayerRuleManager.CHOW_PONG_DISCARD_RULE, cpDiscardRuleList); + + } + + public boolean condition(int type, EXPlayer player) { + return condition(type, player, true); + } + + public boolean condition(int type, EXPlayer player, boolean tonextState) { + List ruleList = this.ruleMap.get(type); + boolean result = false; + + for (IRuleBase rule : ruleList) { + result = rule.condition(player) || result; + } + + if (result) { + player.stateMachine.changeState(this.tipMap.get(type)); + } else { + if (tonextState) + player.stateMachine.toNextState(); + } + return result; + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RoomCard.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RoomCard.java new file mode 100644 index 0000000..e1f909a --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RoomCard.java @@ -0,0 +1,139 @@ +package extend.mj; + +import com.game.Global; +import com.game.Util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + + +public class RoomCard { + public List cardList; + EXRoom room; + public ArrayList subCardList; + public Integer laiziCard; + public Integer laiziCard2; + public Integer laiziCardBefore; + public Integer laiziCard2Before; + + public RoomCard(EXRoom table) { + this.cardList = new ArrayList(); + subCardList = new ArrayList<>(); + this.room = table; + laiziCard = 0; + laiziCard2 = 0; + laiziCardBefore = 0; + laiziCard2Before = 0; + } + + public void init() { + this.cardList.clear(); + this.subCardList.clear(); + this.initCard(); + this.shuffle(); + } + + private void initCard() { + for (int index = 1; index <= 8; index++) { + for (int index2 = 0; index2 < 4; index2++) { + this.cardList.add(100*index + 1); + this.cardList.add(100*index + 2); + this.cardList.add(100*index + 3); + } + this.cardList.add(100*index + 4); + } + } + + private void initCard2() { + List list = Arrays.asList(101, 101, 101, 202, 204, 302, 302, 304, 402, 403, 502, 502, 504, 801, 701, 701, 701); + List list2 = Arrays.asList(101, 101, 101, 802, 202, 204, 302, 302, 304, 402, 403, 502, 502, 504, 801, 701, 701, 701); + List list3 = Arrays.asList(701,202, 202, 203, 301,302, 303, 303, 304, 501, 502, 501, 502, 601, 602, 802); + + this.cardList.addAll(list); + this.cardList.addAll(list2); + this.cardList.addAll(list3); + } + + private void shuffle() { + Collections.shuffle(this.cardList); + } + + public boolean isLaizi(int card) + { + return false; + } + + public void reInitCards(List cards) { + //从底牌移除 + for(Integer card : cards) { + for(int i = cardList.size() - 1;i >= 0;i--) { + if(cardList.get(i).intValue() == card.intValue()) { + if(cardList.remove(i) > 0) { + this.subCardList.add(card); + } + break; + } + } + } + } + +// public int pop() { +// +// if (this.cardList.size() == 0) { +// this.room.bankerSeat = this.room.activeSeat; +//// this.room.roundSettle(); +// } +// +// int card = this.cardList.remove(0); +// +// return card; +// +// } + + public int pop() { + Global.logger.info("pop cardlist size=>"+this.cardList.size()+":sub size==>"+subCardList.size()); + int card = 0; + if (this.cardList.size() == 0) { + if(this.subCardList.size() > 0) { + card = this.subCardList.remove(0); + }else { + this.room.bankerSeat = this.room.activeSeat; + } + }else { + card = this.cardList.remove(0); + } + return card; + + } + + public int popsub() { + Global.logger.info("pop sub cardlist size=>"+this.cardList.size()+":sub size==>"+subCardList.size()); + int card = 0; + if (this.subCardList.size() == 0) { + if (this.cardList.size() == 0) { + this.room.bankerSeat = this.room.activeSeat; + }else { + card = this.cardList.remove(0); + } + }else { + card = this.subCardList.remove(0); + } + return card; + } + + public int getCount() { + return this.cardList.size() + this.subCardList.size(); + } + + public List deal() { + List dealCards = new ArrayList(); + + for (int index = 0; index < 18; index++) { + dealCards.add(this.pop()); + } + + return dealCards; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RuleWeight.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RuleWeight.java new file mode 100644 index 0000000..a8e33f7 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/RuleWeight.java @@ -0,0 +1,22 @@ +package extend.mj; + +public class RuleWeight { + public final static int CHOW = 0b00001; + public final static int PONG = 0b00010; + public final static int ZHAO = 0b00100; + public final static int SELFZHAO = 0b00100; + public final static int KONG = 0b01000; + public final static int SELFKONG = 0b01000; + public final static int WIN = 0b10000; + public final static int SELF_WIN = 0b100000; + + + public final static int TYPE_CHOW = 1; + public final static int TYPE_PONG = 2; + public final static int TYPE_KONG = 3; + public final static int TYPE_SELF_KONG = 4; + public final static int TYPE_ZHAO = 5; + public final static int TYPE_SELF_ZHAO = 6; + public final static int TYPE_WIN = 7; +} + diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/SettleLog.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/SettleLog.java new file mode 100644 index 0000000..a7c6e67 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/SettleLog.java @@ -0,0 +1,44 @@ +package extend.mj; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TObject; + +public class SettleLog { + private Map log; + + public SettleLog() { + log = new HashMap(); + } + + public void put(String key,Integer value) { + log.put(key, value); + } + + public void add(String key) { + if(!log.containsKey(key)) { + return; + } + int value = log.get(key); + value++; + log.put(key, value); + } + + public Integer get(String key) { + if(!log.containsKey(key)) { + return null; + } + return log.get(key); + } + + public ITObject toTObject() { + ITObject obj = TObject.newInstance(); + for (Entry entry : this.log.entrySet()) { + obj.putInt(entry.getKey(), entry.getValue()); + } + return obj; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagAnalyseItem.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagAnalyseItem.java new file mode 100644 index 0000000..e61f46a --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagAnalyseItem.java @@ -0,0 +1,22 @@ +package extend.mj; + +import com.taurus.core.entity.ITArray; + +import java.util.ArrayList; +import java.util.List; + +public class TagAnalyseItem { + //分析子项 + public int cbCardEye; //牌眼麻将 + public int huxi; + public List cbCardEyeList; //牌眼麻将 + public List cbOpCard; //组合类型 + + public TagAnalyseItem() + { + this.huxi = 0; + this.cbCardEye = 0; + this.cbOpCard = new ArrayList(); + this.cbCardEyeList = new ArrayList(); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagKindItem.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagKindItem.java new file mode 100644 index 0000000..fe18c06 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/TagKindItem.java @@ -0,0 +1,17 @@ +package extend.mj; + +import java.util.ArrayList; +import java.util.List; + +public class TagKindItem { + public int type; //组合类型 + public int card; //中心麻将 + public Integer[] cbCardList; //麻将索引 + + public TagKindItem() + { + type = 0; + card = 0; + cbCardList = new Integer[3]; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/WinCardType.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/WinCardType.java new file mode 100644 index 0000000..29f18c8 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/WinCardType.java @@ -0,0 +1,173 @@ +package extend.mj; + +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TObject; + +public class WinCardType { + public static final int JIHU = 1; //鸡胡类型 + + public static final int PINGHU = 2; //平胡类型 + + public static final int QIXIAODUI = 3; //七小对 + + public static final int HAOHUA_QIXIAODUI = 4; //豪华七小对 + + public static final int HAOHUA2_QIXIAODUI = 5; //双豪华七小对 + + public static final int HAOHUA3_QIXIAODUI = 6; //三豪华七小对 + + public static final int QINGYISE = 7; //清一色 + + public static final int PENGPENGHU = 8; //碰碰胡 + + public static final int GANGSHANGHUA = 9; //杠上开花 + + public static final int GANGSHANGPAO = 10; //杠上炮 + + public static final int QIANG_GANG_HU = 11; //抢杠胡 + + public static final int HUN_YI_SE = 12; //混一色 + + public static final int SHI_SHAN_YAO = 13; //十三幺 + + public static final int TIAN_HU = 14; //天胡 十倍 + + public static final int DI_HU = 15; //地胡 十倍 + + public static final int REN_HU = 16; //人胡 十倍 + + public static final int SHI_BA_LUO_HAN = 17; //十八罗汉 + + public static final int XIAO_SHAN_YUAN = 18; //小三元 + + public static final int DA_SHAN_YUAN = 19; //大三元 + + public static final int XIAO_SI_XI = 20; //小四喜 + + public static final int DA_SI_XI = 21; //大四喜 + + public static final int YAO_JIU = 22; //幺九 + + public static final int LAIZI4_HU = 23; //四鬼胡牌 + + public static final int QUAN_FENG = 24;//全风 + + public static final int QUAN_QIU_REN = 25;//全求人 + + public static final int QING_YAO_JIU = 26; //清幺九 + + public static final int ZI_YI_SE = 27; //字一色 + + public static final int WU_GUI_JIABEI = 28; //无鬼两倍 + public static final int LIU_JU_2BEI = 29; //流局两倍 + public static final int HAI_DI_NAO_YUE = 30; //海底捞月 + public static final int MEN_QING = 31; //门清 捉炮门清 + public static final int XIAO_HU_ZHONG_DA_HU = 32; //选小胡有大胡的情况下,不显示具体的胡牌类型,只显示大胡几分 + public static final int MAN_TIAN_HU = 33; //满天胡 + public static final int ZIMO_MEN_QING = 34; //自摸门清 + public static final int GUN_GUN = 35; //滚滚 +//////////////////////////////////////////////////////////// + public static int BASE_HU_SCORE = 2; //基础分数 + public static int DA_HU_BEI_SCORE = 1; //大胡倍数 + public static int JIHU_SCORE = 1; //鸡胡类型 + public static int PINGHU_SCORE = 1; //平胡类型 + public static int MENGQING_SCORE = 3; //门清类型 + public static int QIXIAODUI_SOCRE = 1; //七小对 倍数 + public static int HAOHUA_QIXIAODUI_SCORE = 1; //豪华七小对 + public static int HAOHUA2_QIXIAODUI_SCORE = 1; //双豪华七小对 + public static int HAOHUA3_QIXIAODUI_SCORE = 1; //三豪华七小对 + public static int QINGYISE_SCORE = 1; //清一色 + public static int GANGSHANGHUA_SCORE = 3; //杠上开花 + public static int PENGPENGHU_SCORE = 3; //碰碰胡 + public static int GANGSHANGPAO_SOCRE = 3; //杠上炮 + public static int QIANG_GANG_HU_SOCRE = 1; //抢杠胡 + public static int HUN_YI_SE_SCORE = 1; //混一色 + public static int SHI_SHAN_YAO_SCORE = 1; //十三幺 + public static int TIAN_DI_HU_SCORE = 1; //天地胡 十倍 + public static int TIAN_HU_SCORE = 1; //天胡 20倍 + public static int DI_HU_SCORE = 1; //地胡 10倍 + public static int SHI_BA_LUO_HAN_SCORE = 1; //十八罗汉 + public static int DA_SHAN_YUAN_SCORE = 1; //大三元 + public static int XIAO_SHAN_YUAN_SCORE = 1; //小三元 + public static int XIAO_SI_XI_SCORE = 1; //小四喜 + public static int DA_SI_XI_SCORE = 1; //大四喜 + public static int YAO_JIU_SCORE = 1; //幺九 + public static int LAIZI4_HU_SCORE = 1; //四鬼胡牌 + public static int QUAN_FENG_SCORE = 1;//全风 + public static int QUAN_QIU_REN_SCORE = 1;//全求人 + public static int QING_YAO_JIU_SCORE = 1; //清幺九 + public static int ZI_YI_SE_SCORE = 1; //字一色 + public static int WU_GUI_JIABEI_SCORE = 1; //无鬼两倍 + public static int LIU_JU_2BEI_SCORE = 1; //流局两倍 + public static int HAI_DI_NAO_YUE_SCORE = 3; //海底捞月 + public static int MAN_TIAN_HU_SCORE = 1;//满天胡 + public static int ZIMO_MEN_QING_SCORE = 3; //自摸门清 + public static int GUN_GUN_SCORE = 5; //滚滚 + + public int type; + + public int value; + + public int score; + + public boolean is_dahu; + + public String desc; + + public ITArray opcard; + + //初始化房间的特殊参数 + static public void InitRoomSpecialConfig(EXRoom room) + { + //潮汕鬼牌特殊配置 + //this.config.putInt(Config.ROOM_CONFIG_LAIZI, 0); //没有癞子 + + room.config.putBoolean(Config.ROOM_CONFIG_PENGPENGHU, true); + room.config.putBoolean(Config.ROOM_CONFIG_MENG_QING, true); + room.config.putBoolean(Config.ROOM_CONFIG_MENG_QING, true); + room.config.putBoolean(Config.ROOM_CONFIG_HAI_DI_NAO_YUE, true); + room.config.putBoolean(Config.ROOM_CONFIG_CHUIPAI, true); + //荒庄荒杠 + if (!room.config.containsKey(Config.ROOM_CONFIG_HUANGZHUANGHUANGGANG)) + { + room.config.putBoolean(Config.ROOM_CONFIG_HUANGZHUANGHUANGGANG, true); + } + room.config.putBoolean(Config.ROOM_CONFIG_USE_BASE_HU_SCORE, true); + room.config.putBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU, true); + room.config.putBoolean(Config.ROOM_CONFIG_DIANPAO, true); + + } + + public WinCardType(int type, int value, int score, boolean is_dahu, String desc) { + this.type = type; + this.value = value; + this.score = score; + this.is_dahu = is_dahu; + this.desc = desc; + } + + public boolean IsDaHu() + { + return is_dahu; + } + + public ITObject toTObject() { + return toTObject(false); + } + + public ITObject toTObject(boolean is_opcard) { + ITObject obj = TObject.newInstance(); + obj.putInt("type", type); + obj.putInt("value", value); + obj.putInt("score", score); + if(is_opcard&&opcard!=null) { + obj.putTArray("opcard", opcard); + } + return obj; + } + + public String toString() { + return "type:" + type + " value:" + value + " score:" + score + " desc:" + desc; + } +} \ No newline at end of file diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleChow.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleChow.java new file mode 100644 index 0000000..1e8d348 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleChow.java @@ -0,0 +1,130 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.game.Util; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.Config; +import extend.mj.EXPlayer; +import extend.mj.EXRoom; +import extend.mj.RuleWeight; +import extend.mj.player.rulestate.PRChowState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; +import extend.mj.uitl.CardUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * ����״̬ + * + * + * 2017��11��2�� + * PRChowRule.java + */ +public class RuleChow implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + EXRoom room = player.getRoom(); + if (player.isEntrust() || !room.config.getBoolean(Config.ROOM_CONFIG_CHUIPAI)) { + return false; + } + + if (player.lastSeat != room.activeSeat) { + return false; + } + + if (player.is_gang) + { + return false; + } + + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(room.activeSeat); + if (activePlayer.gangshangpao) + { + return false; + } + + int eventCard = room.activeCard; + boolean result = check(player,eventCard); + + return result; + } + + private boolean check(EXPlayer player,int eventCard){ + if (eventCard % 100 == 4) + { + return false; + } + + boolean result = false; + List cardInhand = player.cardInhand; + if (Util.checkCard(eventCard - 1, cardInhand) && Util.checkCard(eventCard - 2, cardInhand) && (eventCard-1) % 100 != 4 && (eventCard-2) % 100 != 4) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard - 1); + opcard.addInt(eventCard - 2); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + if (Util.checkCard(eventCard - 1, cardInhand) && (eventCard-1) % 100 != 4 && Util.checkCard(eventCard / 100 * 100 + 4, cardInhand)) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard - 1); + opcard.addInt(eventCard / 100 * 100 + 4); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + if (Util.checkCard(eventCard - 2, cardInhand) && (eventCard-2) % 100 != 4 && Util.checkCard(eventCard / 100 * 100 + 4, cardInhand)) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard - 2); + opcard.addInt(eventCard / 100 * 100 + 4); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + + if (Util.checkCard(eventCard + 1, cardInhand) && Util.checkCard(eventCard - 1, cardInhand) && (eventCard + 1) % 100 != 4 && (eventCard - 1) % 100 != 4) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard + 1); + opcard.addInt(eventCard - 1); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + if (Util.checkCard(eventCard + 1, cardInhand) && (eventCard + 1) % 100 != 4 && Util.checkCard(eventCard / 100 * 100 + 4, cardInhand)) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard + 1); + opcard.addInt(eventCard / 100 * 100 + 4); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + if (Util.checkCard(eventCard + 1, cardInhand) && Util.checkCard(eventCard + 2, cardInhand) && (eventCard + 1) % 100 != 4 && (eventCard + 2) % 100 != 4) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard + 1); + opcard.addInt(eventCard + 2); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + if (Util.checkCard(eventCard + 2, cardInhand) && (eventCard + 2) % 100 != 4 && Util.checkCard(eventCard / 100 * 100 + 4, cardInhand)) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard + 2); + opcard.addInt(eventCard / 100 * 100 + 4); + Tip tip = new Tip(eventCard,opcard, RuleWeight.CHOW,this, RuleWeight.TYPE_CHOW); + player.tipMgr.addTip(tip); + result = result || true; + } + return result; + } + + @Override + public void action(EXPlayer player,Tip tip) { + player.getRoom().activeCard = tip.card; + player.stateMachine.changeState(Global.getState(PRChowState.class)); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKong.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKong.java new file mode 100644 index 0000000..3520ceb --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKong.java @@ -0,0 +1,158 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.game.Util; +import com.game.data.Player; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.rulestate.PROtherKongState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * ���ܼ�� + * + * + * 2017��8��30�� + * RuleOtherKong.java + */ +public class RuleOtherKong implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + EXRoom room = player.getRoom(); + + int eventCard = room.activeCard; + if (player.isEntrust()) { + return false; + } + + if (player.is_gang) + { + return false; + } + + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(room.activeSeat); + if (activePlayer.gangshangpao) + { + return false; + } + + if (Util.checkCard(eventCard, player.cardInhand, 3)) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + if (player.notPongKongList.contains(eventCard)) + { + return false; + } + } + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard); + player.is_gang = false; + + List delPai = new ArrayList<>(); + delPai.add(eventCard); + delPai.add(eventCard); + delPai.add(eventCard); + List opCards = new ArrayList<>(); + opCards.addAll(player.opCardList); + OpCard pongCard = new OpCard(RuleWeight.TYPE_KONG, eventCard); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(eventCard); + pongCard.opCard.addInt(eventCard); + pongCard.opCard.addInt(eventCard); + pongCard.opCard.addInt(eventCard); + opCards.add(pongCard); + if (((EXGameController) Global.gameCtr).isTingPai(player, 0, delPai, opCards)) + { + Tip tip = new Tip(eventCard,opcard, RuleWeight.SELFKONG,this, RuleWeight.TYPE_KONG); + player.tipMgr.addTip(tip); + Tip tip2 = new Tip(eventCard,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_ZHAO); + player.tipMgr.addTip(tip2); + } + else { + Tip tip = new Tip(eventCard,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_ZHAO); + player.tipMgr.addTip(tip); + } + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + player.notPongKongList.add(eventCard); + } + return true; + } + else if (Util.checkCard(eventCard, player.cardInhand, 2) && Util.checkCard(eventCard /100 * 100 + 4, player.cardInhand, 1)) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + if (player.notPongKongList.contains(eventCard)) + { + return false; + } + } + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard); + opcard.addInt(eventCard /100 * 100 + 4); + player.is_gang = false; + List delPai = new ArrayList<>(); + delPai.add(eventCard); + delPai.add(eventCard); + delPai.add(eventCard /100 * 100 + 4); + List opCards = new ArrayList<>(); + opCards.addAll(player.opCardList); + OpCard pongCard = new OpCard(RuleWeight.TYPE_KONG, eventCard); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(eventCard); + pongCard.opCard.addInt(eventCard); + pongCard.opCard.addInt(eventCard); + pongCard.opCard.addInt(eventCard /100 * 100 + 4); + opCards.add(pongCard); + if (((EXGameController) Global.gameCtr).isTingPai(player, 0, delPai, opCards)) + { + Tip tip = new Tip(eventCard,opcard, RuleWeight.SELFKONG,this, RuleWeight.TYPE_KONG); + player.tipMgr.addTip(tip); + Tip tip2 = new Tip(eventCard,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_ZHAO); + player.tipMgr.addTip(tip2); + } + else { + Tip tip = new Tip(eventCard, opcard, RuleWeight.ZHAO, this, RuleWeight.TYPE_ZHAO); + player.tipMgr.addTip(tip); + } + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + player.notPongKongList.add(eventCard); + } + return true; + } + return false; + } + + @Override + public void action(EXPlayer player, Tip tip) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + Util.removeCard(player.notPongKongList, tip.card, 4); + } + if (tip.type == RuleWeight.TYPE_KONG) + { + player.is_gang = true; + if (tip.card > 0) + { + for (Map.Entry entry : player.getRoom().playerMapById.entrySet()) { + EXPlayer pp = (EXPlayer) entry.getValue(); + pp.notPongList.add(tip.card/100*100+1); + pp.notPongList.add(tip.card/100*100+2); + pp.notPongList.add(tip.card/100*100+3); + pp.notPongList.add(tip.card/100*100+4); + } + } + } + player.stateMachine.changeState(Global.getState(PROtherKongState.class)); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKongSelfWin.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKongSelfWin.java new file mode 100644 index 0000000..c7cf4d7 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherKongSelfWin.java @@ -0,0 +1,100 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.rulestate.PROtherGongSelfWinState; +import extend.mj.player.rulestate.PRSelfWinState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; +import extend.mj.uitl.WinCard; + +import java.util.HashMap; +import java.util.Map; + +/** + * ������� + * + * + * 2017��8��30�� + * RuleSelfWin.java + */ +public class RuleOtherKongSelfWin implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + // TODO Auto-generated method stub + ITObject config = player.room.config; + EXRoom room = player.getRoom(); + int laizi = config.getInt(Config.ROOM_CONFIG_LAIZI); + HashMap map = new HashMap(); + if (player.is_gang) + { + if (room.config.getBoolean(Config.ROOM_CONFIG_GANGSHANGKAIHUA_2bei)) + { + WinCard.putWinCardType(map, WinCardType.GANGSHANGHUA, 1,WinCardType.GANGSHANGHUA_SCORE*2, true, "杠上开花"); + } + else + { + WinCard.putWinCardType(map, WinCardType.GANGSHANGHUA, 1,WinCardType.GANGSHANGHUA_SCORE, true, "杠上开花"); + } + } + + WinCard win = new WinCard(player.cardInhand, room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, false); + if (win.checkWin(map, player, room, true)) { + ITArray opcard = TArray.newInstance(); + opcard.addInt(player.drawCard); + Tip tip = new Tip(player.drawCard,opcard, RuleWeight.SELF_WIN,this, RuleWeight.TYPE_WIN); + tip.winMap = map; + player.tipMgr.addTip(tip); + + return true; + } + + return false; + } + + @Override + public void action(EXPlayer player,Tip tip) { + // TODO Auto-generated method stub + player.is_gang = false; + player.winType = 1; + player.winCard = tip.card; + player.drawCard = tip.card; + + player.winMap = tip.winMap; + EXRoom room = player.getRoom(); + player.niao_score = WinCardType.BASE_HU_SCORE; + player.hu_score = WinCardType.BASE_HU_SCORE; + player.di_score = WinCardType.BASE_HU_SCORE; + + Global.logger.info("player:" + player.playerid + " di fen:" + player.di_score + " hu fen:" + player.hu_score + " niao fen:" + player.niao_score); + + room.handle_repeatwin(player); + boolean isDaHu = false; + for (Map.Entry entry : player.winMap.entrySet()) { + WinCardType cardType = entry.getValue(); + Global.logger.info("player:" + player.playerid + " hu:" + cardType.toString()); + if (cardType.IsDaHu()) + { + isDaHu = true; + } + } + + if (isDaHu) + { + player.hu_score = 3; + } + + if (player.is_gang) + { + player.stateMachine.changeState(Global.getState(PROtherGongSelfWinState.class)); + } + else { + player.stateMachine.changeState(Global.getState(PRSelfWinState.class)); + } + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherWin.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherWin.java new file mode 100644 index 0000000..77ebeb5 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleOtherWin.java @@ -0,0 +1,108 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.rulestate.PROtherWinState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; +import extend.mj.uitl.WinCard; + +import java.util.HashMap; +import java.util.Map; + +/** + * ���Ƽ�� + * + * + * 2017��8��30�� + * RuleOtherWin.java + */ +public class RuleOtherWin implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + if(player.louhu)return false; + EXRoom room = player.getRoom(); + ITObject config = room.config; + if (!config.getBoolean(Config.ROOM_CONFIG_DIANPAO)) { + if (!config.getBoolean(Config.ROOM_CONFIG_SPECAIL_ZIMO)) + { + return false; + } + } + + if (player.lastSeat != room.activeSeat) { + return false; + } + + if(room.activeSeat == player.seat)return false; + + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(room.activeSeat); + + if (player.cardInhand.size() == 1 && room.isLaizi(player.cardInhand.get(0))) + { + return false; + } + + if (room.activeCard % 100 == 4) + { + return false; + } + + int activieCard = room.activeCard; + int laizi = room.config.getInt(Config.ROOM_CONFIG_LAIZI); + HashMap map = new HashMap(); + if (activePlayer.gangshangpao) + { + if ( room.config.getBoolean(Config.ROOM_CONFIG_GANGSHANGPAO_2bei)) + { + WinCard.putWinCardType(map, WinCardType.GANGSHANGPAO, 1,WinCardType.GANGSHANGPAO_SOCRE*2, true, "杠上炮"); + } + else { + WinCard.putWinCardType(map, WinCardType.GANGSHANGPAO, 1,WinCardType.GANGSHANGPAO_SOCRE, true, "杠上炮"); + } + } + WinCard win = new WinCard(player.cardInhand, room.activeCard, room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, false, false); + if (win.checkWin(map, player, room, false)) { + if (map.containsKey(WinCardType.MEN_QING) || map.containsKey(WinCardType.PENGPENGHU) || map.containsKey(WinCardType.GANGSHANGPAO)) + { + ITArray opcard = TArray.newInstance(); + opcard.addInt(activieCard); + Tip tip = new Tip(room.activeCard,opcard, RuleWeight.WIN,this, RuleWeight.TYPE_WIN); + tip.winType = player.forceCheckWin? 1 :0; + tip.winMap = map; + player.tipMgr.addTip(tip); + + return true; + } + } + + return false; + } + + @Override + public void action(EXPlayer player,Tip tip) { + player.winType = tip.winType; + player.getRoom().activeCard = tip.card; + player.winMap = tip.winMap; + EXRoom room = player.getRoom(); + player.niao_score = WinCardType.BASE_HU_SCORE; + + player.hu_score = 1; + player.di_score = 1; + + if (tip.winMap.containsKey(WinCardType.PENGPENGHU)) + { + player.hu_score = WinCardType.PENGPENGHU_SCORE; + } + + Global.logger.info("player:" + player.playerid + " di fen:" + player.di_score + " hu fen:" + player.hu_score + " niao fen:" + player.niao_score); + + room.handle_repeatwin(player); + + player.stateMachine.changeState(Global.getState(PROtherWinState.class)); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RulePong.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RulePong.java new file mode 100644 index 0000000..b77d885 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RulePong.java @@ -0,0 +1,97 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.game.Util; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.Config; +import extend.mj.EXPlayer; +import extend.mj.EXRoom; +import extend.mj.RuleWeight; +import extend.mj.player.rulestate.PRPongState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; + +/** + * ����� + * + * + * 2017��8��30�� + * RulePong.java + */ +public class RulePong implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + EXRoom room = player.getRoom(); + int eventCard = room.activeCard; + if (player.isEntrust()) { + return false; + } + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_PENG)) + { + if (player.notPongList.contains(eventCard)) + { + return false; + } + } + + if (eventCard % 100 == 4) + { + return false; + } + + if (player.is_gang) + { + return false; + } + + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(room.activeSeat); + if (activePlayer.gangshangpao) + { + return false; + } + + if (Util.checkCard(eventCard, player.cardInhand, 2)) { + + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard); + Tip tip = new Tip(eventCard, opcard, RuleWeight.PONG, this, RuleWeight.TYPE_PONG); + player.tipMgr.addTip(tip); + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_PENG)) + { + player.notPongList.add(eventCard); + } + return true; + } + else if (Util.checkCard(eventCard, player.cardInhand, 1) && Util.checkCard(eventCard /100 * 100 + 4, player.cardInhand, 1)) + { + ITArray opcard = TArray.newInstance(); + opcard.addInt(eventCard); + opcard.addInt(eventCard /100 * 100 + 4); + Tip tip = new Tip(eventCard, opcard, RuleWeight.PONG, this, RuleWeight.TYPE_PONG); + player.tipMgr.addTip(tip); + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_PENG)) + { + player.notPongList.add(eventCard); + } + return true; + } + return false; + } + + @Override + public void action(EXPlayer player, Tip tip) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_PENG)) + { + Util.removeCard(player.notPongList, tip.card, 4); + } + + player.stateMachine.changeState(Global.getState(PRPongState.class)); + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfKong.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfKong.java new file mode 100644 index 0000000..41cb634 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfKong.java @@ -0,0 +1,165 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.game.Util; +import com.game.data.Player; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.rulestate.PRSelfKongState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * ���ܼ�� + * + * + * 2017��8��30�� + * RuleSelfKong.java + */ +public class RuleSelfKong implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + if (player.isEntrust()) { + return false; + } + + if (player.is_gang) + { + return false; + } + + Map cardMap = Util.getCardNumMap(player.cardInhand); + boolean result = false; + + for (Entry entry : cardMap.entrySet()) { + + int card = entry.getKey(); + + int num = entry.getValue(); + if (num >= 4) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + if (player.notPongKongList.contains(card)) + { + continue; + } + } + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + player.is_gang = false; + List delPai = new ArrayList<>(); + delPai.add(card); + delPai.add(card); + delPai.add(card); + delPai.add(card); + List opCards = new ArrayList<>(); + opCards.addAll(player.opCardList); + OpCard pongCard = new OpCard(RuleWeight.TYPE_KONG, card); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + opCards.add(pongCard); + if (((EXGameController) Global.gameCtr).isTingPai(player, 0, delPai, opCards)) + { + Tip tip = new Tip(card,opcard, RuleWeight.SELFKONG,this, RuleWeight.TYPE_SELF_KONG); + player.tipMgr.addTip(tip); + Tip tip2 = new Tip(card,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_SELF_ZHAO); + player.tipMgr.addTip(tip2); + } + else { + Tip tip = new Tip(card,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_SELF_ZHAO); + player.tipMgr.addTip(tip); + } + + result = true; + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + player.notPongKongList.add(card); + } + } + else if (num == 3 && Util.checkCard(card /100 * 100 + 4, player.cardInhand, 1)) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + if (player.notPongKongList.contains(card)) + { + continue; + } + } + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card /100 * 100 + 4); + player.is_gang = false; + + List delPai = new ArrayList<>(); + delPai.add(card); + delPai.add(card); + delPai.add(card); + delPai.add(card /100 * 100 + 4); + List opCards = new ArrayList<>(); + opCards.addAll(player.opCardList); + OpCard pongCard = new OpCard(RuleWeight.TYPE_KONG, card); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card /100 * 100 + 4); + opCards.add(pongCard); + if (((EXGameController) Global.gameCtr).isTingPai(player, 0, delPai, opCards)) + { + Tip tip = new Tip(card,opcard, RuleWeight.SELFKONG,this, RuleWeight.TYPE_SELF_KONG); + player.tipMgr.addTip(tip); + Tip tip2 = new Tip(card,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_SELF_ZHAO); + player.tipMgr.addTip(tip2); + } + else { + Tip tip = new Tip(card,opcard, RuleWeight.SELFZHAO,this, RuleWeight.TYPE_SELF_ZHAO); + player.tipMgr.addTip(tip); + } + + result = true; + + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + player.notPongKongList.add(card); + } + } + } + return result; + } + + @Override + public void action(EXPlayer player,Tip tip) { + if (player.getRoom().config.getBoolean(Config.ROOM_CONFIG_GUO_GONG)) + { + Util.removeCard(player.notPongKongList, tip.card, 4); + } + if (tip.type == RuleWeight.TYPE_SELF_KONG) + { + player.is_gang = true; + if (tip.card > 0) + { + for (Entry entry : player.getRoom().playerMapById.entrySet()) { + EXPlayer pp = (EXPlayer) entry.getValue(); + pp.notPongList.add(tip.card/100*100+1); + pp.notPongList.add(tip.card/100*100+2); + pp.notPongList.add(tip.card/100*100+3); + pp.notPongList.add(tip.card/100*100+4); + } + } + } + player.stateMachine.changeState(Global.getState(PRSelfKongState.class)); + + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfWin.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfWin.java new file mode 100644 index 0000000..8bea773 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rule/RuleSelfWin.java @@ -0,0 +1,94 @@ +package extend.mj.player.rule; + +import com.game.Global; +import com.game.data.Player; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.rulestate.PRSelfWinState; +import extend.mj.tip.IRuleBase; +import extend.mj.tip.Tip; +import extend.mj.uitl.WinCard; + +import java.util.HashMap; +import java.util.Map; + +/** + * ������� + * + * + * 2017��8��30�� + * RuleSelfWin.java + */ +public class RuleSelfWin implements IRuleBase { + + @Override + public boolean condition(EXPlayer player) { + // TODO Auto-generated method stub + ITObject config = player.room.config; + EXRoom room = player.getRoom(); + int laizi = config.getInt(Config.ROOM_CONFIG_LAIZI); + HashMap map = new HashMap(); + WinCard win = new WinCard(player.cardInhand, room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, false); + if (win.checkWin(map, player, room, true)) { + if (player.cardInhand.size() == 0 && player.opCardList.size() == 6) + { + //WinCard.putWinCardType(map, WinCardType.MAN_TIAN_HU, 1,WinCardType.MAN_TIAN_HU_SCORE, false, "满天胡"); + } + + if (map.containsKey(WinCardType.PENGPENGHU)) + { + if (room.maxPlayers == 4 && (room.bankerSeat+2)%room.maxPlayers+1 == player.seat) + { + map.remove(WinCardType.PENGPENGHU); + WinCard.putWinCardType(map, WinCardType.GUN_GUN, 1,WinCardType.GUN_GUN_SCORE, true, "滚滚"); + } + } + + ITArray opcard = TArray.newInstance(); + opcard.addInt(player.drawCard); + Tip tip = new Tip(player.drawCard,opcard, RuleWeight.SELF_WIN,this, RuleWeight.TYPE_WIN); + tip.winMap = map; + tip.self = true; + player.tipMgr.addTip(tip); + + return true; + } + return false; + } + + @Override + public void action(EXPlayer player,Tip tip) { + // TODO Auto-generated method stub + player.winCard = tip.card; + player.drawCard = tip.card; + player.winMap = tip.winMap; + EXRoom room = player.getRoom(); + + player.niao_score = WinCardType.BASE_HU_SCORE; + player.hu_score = WinCardType.BASE_HU_SCORE; + player.di_score = WinCardType.BASE_HU_SCORE; + + Global.logger.info("player:" + player.playerid + " di fen:" + player.di_score + " hu fen:" + player.hu_score + " niao fen:" + player.niao_score); + + room.handle_repeatwin(player); + boolean isDaHu = false; + for (Map.Entry entry : player.winMap.entrySet()) { + WinCardType cardType = entry.getValue(); + Global.logger.info("player:" + player.playerid + " hu:" + cardType.toString()); + if (cardType.IsDaHu()) + { + isDaHu = true; + } + } + + if (isDaHu) + { + player.hu_score = 3; + } + + player.stateMachine.changeState(Global.getState(PRSelfWinState.class)); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRChowState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRChowState.java new file mode 100644 index 0000000..f6a9125 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRChowState.java @@ -0,0 +1,62 @@ +package extend.mj.player.rulestate; + +import com.game.Global; +import com.game.Util; +import com.game.player.state.PlayerWaitState; +import com.game.state.StateBase; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.state.EXPlayerDiscardState; + +/** + * + */ +public class PRChowState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + + EXRoom room = owner.getRoom(); + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(owner.room.activeSeat); + if(activePlayer.outcardList.get(activePlayer.outcardList.size() - 1)!=room.activeCard){ + activePlayer.outcardList.remove(activePlayer.outcardList.size() - 2); + }else{ + activePlayer.outcardList.remove(activePlayer.outcardList.size() - 1); + } + activePlayer.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + int fromseat = activePlayer.seat; + EXMainServer.gameCtr.changeActiveSeat(room, owner.seat); + + ITArray opcard = owner.opCard; + int chowcard1 = opcard.getInt(0); + int chowcard2 = opcard.getInt(1); + int card= room.activeCard; + Util.removeCard(owner.cardInhand, chowcard1, 1); + Util.removeCard(owner.cardInhand, chowcard2, 1); + room.activeCard = 0; + + + OpCard opc = new OpCard(RuleWeight.TYPE_CHOW, card); + opc.opCard = new TArray(); + opc.opCard.addInt(card); + opc.opCard.addInt(chowcard1); + opc.opCard.addInt(chowcard2); + owner.opCardList.add(opc); + + ITArray opcard2 = TArray.newInstance(); + opcard2.addInt(chowcard1); + opcard2.addInt(chowcard2); + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_CHOW, fromseat, opcard2); + + if(!EXMainServer.playerRuleMgr.condition(PlayerRuleManager.CHOW_PONG_DISCARD_RULE, owner,false)){ + toNextState(owner); + } + } + + @Override + public void toNextState(EXPlayer owner) { + owner.stateMachine.changeState(Global.getState(EXPlayerDiscardState.class)); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherGongSelfWinState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherGongSelfWinState.java new file mode 100644 index 0000000..ff1aee8 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherGongSelfWinState.java @@ -0,0 +1,104 @@ +package extend.mj.player.rulestate; + + +import com.game.Util; +import com.game.data.Player; +import com.game.state.StateBase; +import extend.mj.*; + +import java.util.Map; + +/** + * ��Ӧ��������״̬ + * + * + * 2017��8��30�� + * PRSelfWinState.java + */ +public class PROtherGongSelfWinState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + + EXRoom room = owner.getRoom(); + owner.winCard = owner.drawCard; + owner.winer = 1; + Util.removeCard(owner.cardInhand, owner.winCard, 1); + if (owner.opCardList.size() > 0) + { + OpCard opCard = owner.opCardList.get(owner.opCardList.size()-1); + if ((opCard.type == RuleWeight.TYPE_KONG) && opCard.card_seat > 0) + { + owner.room.activeSeat = opCard.card_seat; + + room.addAllScore(owner, owner.hu_score, EXScore.WIN); + + room.addAllPiaoNiaoScore(owner); + for (Map.Entry entry : room.playerMapById.entrySet()) { + if (entry.getKey().equals(owner.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + fromPlayer.winer = 2; + fromPlayer.last_winer = 2; + } + + EXMainServer.gameCtr.winEvent(owner,owner.seat,owner.winCard); + if (room.lastBankerSeat == 0) + { + room.lastBankerSeat = room.bankerSeat; + } + owner.room.bankerSeat = owner.seat; + owner.settleLog.add(Config.SETTLE_ZIMO); + + room.endGame(); + return; + } + else if (opCard.type == RuleWeight.TYPE_SELF_KONG + || (opCard.type == RuleWeight.TYPE_KONG && opCard.card_seat == 0)) + { + room.addAllScore(owner, owner.hu_score,EXScore.WIN); + + room.addAllPiaoNiaoScore(owner); + for (Map.Entry entry : room.playerMapById.entrySet()) { + if (entry.getKey().equals(owner.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + fromPlayer.winer = 2; + fromPlayer.last_winer = 2; + } + + EXMainServer.gameCtr.winEvent(owner,owner.seat,owner.winCard); + if (room.lastBankerSeat == 0) + { + room.lastBankerSeat = room.bankerSeat; + } + owner.room.bankerSeat = owner.seat; + owner.settleLog.add(Config.SETTLE_ZIMO); + + room.endGame(); + return; + } + } + } + + @Override + public void toNextState(EXPlayer owner) { + // TODO Auto-generated method stub + + } + + @Override + public void exit(EXPlayer owner) { + // TODO Auto-generated method stub + + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + // TODO Auto-generated method stub + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherKongState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherKongState.java new file mode 100644 index 0000000..af62fce --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherKongState.java @@ -0,0 +1,165 @@ +package extend.mj.player.rulestate; + +import com.game.Global; +import com.game.Util; +import com.game.player.state.PlayerWaitState; +import com.game.state.StateBase; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.state.EXPlayerKongDrawState; +import extend.mj.player.state.EXPlayerWaitKongWinState; + +/** + * ��Ӧ���ܴ���״̬ + * + * + * 2017��8��30�� + * PROtherKongState.java + */ +public class PROtherKongState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + // TODO Auto-generated method stub + + EXRoom room = owner.getRoom(); + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(owner.room.activeSeat); + activePlayer.outcardList.remove(activePlayer.outcardList.size()-1); + activePlayer.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + int fromseat = activePlayer.seat; + //room.addScore(owner,activePlayer, Config.MING_GANG_SCORE,EXScore.KONG); + owner.ming_gang_num++; + activePlayer.dian_gang_num++; + + EXMainServer.gameCtr.changeActiveSeat(room,owner.seat); + owner.cardInhand.add(owner.getRoom().activeCard); + + + int [] kongGroup = new int [4]; + int card = room.activeCard; + if (Util.checkCard(card, owner.cardInhand, 4)) { + kongGroup[0] = card; + kongGroup[1] = card; + kongGroup[2] = card; + kongGroup[3] = card; + + owner.kongGroup.add(kongGroup); + if (owner.is_gang) + { + OpCard pongCard = new OpCard(RuleWeight.TYPE_KONG, card, activePlayer.seat); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + owner.opCardList.add(pongCard); + owner.gangshangpao = true; + } + else { + OpCard pongCard = new OpCard(RuleWeight.TYPE_ZHAO, card, activePlayer.seat); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + owner.opCardList.add(pongCard); + } + + Util.removeCard(owner.cardInhand, card, 4); + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card); + opcard.addInt(card); + if (owner.is_gang) + { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_KONG, fromseat,opcard); + } + else { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_ZHAO, fromseat,opcard); + } + } + else if (Util.checkCard(card, owner.cardInhand, 3) && Util.checkCard(card /100 * 100 + 4, owner.cardInhand, 1)) { + kongGroup[0] = card; + kongGroup[1] = card; + kongGroup[2] = card; + kongGroup[3] = card /100 * 100 + 4; + + owner.kongGroup.add(kongGroup); + if (owner.is_gang) + { + OpCard pongCard = new OpCard(RuleWeight.TYPE_KONG, card, activePlayer.seat); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card /100 * 100 + 4); + owner.opCardList.add(pongCard); + owner.gangshangpao = true; + } + else { + OpCard pongCard = new OpCard(RuleWeight.TYPE_ZHAO, card, activePlayer.seat); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card /100 * 100 + 4); + owner.opCardList.add(pongCard); + } + + Util.removeCard(owner.cardInhand, card, 3); + Util.removeCard(owner.cardInhand, card /100 * 100 + 4, 1); + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card); + opcard.addInt(card /100 * 100 + 4); + if (owner.is_gang) + { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_KONG, fromseat,opcard); + } + else { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_ZHAO, fromseat,opcard); + } + } + + room.activeCard = card; + boolean qiangkong = room.config.getBoolean(Config.ROOM_CONFIG_QIANGKONG_MING); + if(qiangkong) { + owner.room.broadCastToServer(owner.playerid, EXActionEvent.EVENT_KONG_WIN, null); + if(room.tipMap.size() == 0){ + room.activeCard = 0; + room.lastDiscardSeat = 0; + owner.settleLog.add(Config.SETTLE_MING_KONG); + toNextState(owner); + }else{ + owner.stateMachine.changeState(Global.getState(EXPlayerWaitKongWinState.class)); + } + }else { + room.activeCard = 0; + room.lastDiscardSeat = 0; + owner.settleLog.add(Config.SETTLE_MING_KONG); + toNextState(owner); + } + } + + @Override + public void toNextState(EXPlayer owner) { + owner.stateMachine.changeState(Global.getState(EXPlayerKongDrawState.class)); + + } + + @Override + public void exit(EXPlayer owner) { + // TODO Auto-generated method stub + + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + // TODO Auto-generated method stub + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherWinState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherWinState.java new file mode 100644 index 0000000..943d815 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PROtherWinState.java @@ -0,0 +1,48 @@ +package extend.mj.player.rulestate; + +import com.game.state.StateBase; +import extend.mj.*; +import extend.mj.uitl.WinCard; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * ��Ӧ���ƴ���״̬ + * + * + * 2017��8��30�� + * PROtherWinState.java + */ +public class PROtherWinState extends StateBase{ + + @Override + public void enter(EXPlayer owner) { + EXRoom room = (EXRoom) owner.room; + owner.winer = 1; + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(owner.room.activeSeat); + + room.addScore(owner,activePlayer, owner.hu_score, EXScore.WIN); + + room.addPiaoNiaoScore(owner, activePlayer); + activePlayer.settleLog.add(Config.SETTLE_DIAN_PAO); + activePlayer.winer = 2; + activePlayer.last_winer = 2; + + owner.settleLog.add(Config.SETTLE_JIE_PAO); + EXMainServer.gameCtr.winEvent(owner,activePlayer.seat,room.activeCard); + + if (room.lastBankerSeat == 0) + { + room.lastBankerSeat = room.bankerSeat; + } + room.bankerSeat = owner.seat; + room.winCount += 1; + + owner.winCard = room.activeCard; + + room.winCallback( owner ,owner.winCard); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRPongState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRPongState.java new file mode 100644 index 0000000..1493738 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRPongState.java @@ -0,0 +1,92 @@ +package extend.mj.player.rulestate; + +import com.game.Global; +import com.game.Util; +import com.game.player.state.PlayerWaitState; +import com.game.state.StateBase; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.state.EXPlayerDiscardState; + +/** + * ��Ӧ���ƴ���״̬ + * + * + * 2017��8��30�� + * PRPongState.java + */ +public class PRPongState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + // TODO Auto-generated method stub + EXRoom room = (EXRoom) owner.room; + EXPlayer activePlayer = (EXPlayer)room.playerMapBySeat.get(owner.room.activeSeat); + activePlayer.outcardList.remove(activePlayer.outcardList.size() - 1); + activePlayer.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + int fromseat = activePlayer.seat; + + EXMainServer.gameCtr.changeActiveSeat(room, owner.seat); + owner.cardInhand.add(room.activeCard); + + int[] pongGroup = new int[3]; + int card = room.activeCard; + OpCard pongCard = new OpCard(RuleWeight.TYPE_PONG, card, activePlayer.seat); + pongCard.opCard = new TArray(); + if (Util.checkCard(card, owner.cardInhand, 3)) { + pongGroup[0] = card; + pongGroup[1] = card; + pongGroup[2] = card; + owner.pongGroup.add(pongGroup); + Util.removeCard(owner.cardInhand, card, 3); + + room.activeCard = 0; + room.lastDiscardSeat = 0; + + + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + owner.opCardList.add(pongCard); + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card); + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_PONG, fromseat,opcard); + } + else if (Util.checkCard(card, owner.cardInhand, 2) && Util.checkCard(card / 100 * 100 + 4, owner.cardInhand, 1)) { + pongGroup[0] = card; + pongGroup[1] = card; + pongGroup[2] = card / 100 * 100 + 4; + owner.pongGroup.add(pongGroup); + Util.removeCard(owner.cardInhand, card, 2); + Util.removeCard(owner.cardInhand, card / 100 * 100 + 4, 1); + + room.activeCard = 0; + room.lastDiscardSeat = 0; + + + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card / 100 * 100 + 4); + owner.opCardList.add(pongCard); + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card / 100 * 100 + 4); + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_PONG, fromseat,opcard); + } + + if(!EXMainServer.playerRuleMgr.condition(PlayerRuleManager.CHOW_PONG_DISCARD_RULE, owner,false)){ + toNextState(owner); + } + } + + @Override + public void toNextState(EXPlayer owner) { + owner.drawCard = 0; + owner.stateMachine.changeState(Global.getState(EXPlayerDiscardState.class)); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfKongState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfKongState.java new file mode 100644 index 0000000..a59db82 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfKongState.java @@ -0,0 +1,120 @@ +package extend.mj.player.rulestate; + +import com.game.Global; +import com.game.Util; +import com.game.state.StateBase; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.*; +import extend.mj.player.state.EXPlayerDrawState; +import extend.mj.player.state.EXPlayerKongDrawState; + +/** + * ��Ӧ���ܴ���״̬ + * + * + * 2017��8��30�� + * PRSelfKongState.java + */ +public class PRSelfKongState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + EXRoom room = owner.getRoom(); + + ITArray opCard = owner.opCard; + int card = opCard.getInt(0); + int [] kongGroup = new int [4]; + if (opCard.size() >= 2) + { + Util.removeCard(owner.cardInhand, card, 3); + Util.removeCard(owner.cardInhand, card/100*100+4, 1); + kongGroup[0] = card; + kongGroup[1] = card; + kongGroup[2] = card; + kongGroup[3] = card/100*100+4; + owner.selfKongGroup.add(kongGroup); + if (owner.is_gang) + { + OpCard pongCard = new OpCard(RuleWeight.TYPE_SELF_KONG, card); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card/100*100+4); + owner.opCardList.add(pongCard); + owner.gangshangpao = true; + } + else { + OpCard pongCard = new OpCard(RuleWeight.TYPE_SELF_ZHAO, card); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card/100*100+4); + owner.opCardList.add(pongCard); + } + + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card); + opcard.addInt(card); + opcard.addInt(card/100*100+4); + if (owner.is_gang) + { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_SELF_KONG, owner.seat,opcard); + } + else { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_SELF_ZHAO, owner.seat,opcard); + } + } + else { + Util.removeCard(owner.cardInhand, card, 4); + kongGroup[0] = card; + kongGroup[1] = card; + kongGroup[2] = card; + kongGroup[3] = card; + owner.selfKongGroup.add(kongGroup); + if (owner.is_gang) + { + OpCard pongCard = new OpCard(RuleWeight.TYPE_SELF_KONG, card); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + owner.opCardList.add(pongCard); + owner.gangshangpao = true; + } + else { + OpCard pongCard = new OpCard(RuleWeight.TYPE_SELF_ZHAO, card); + pongCard.opCard = new TArray(); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + pongCard.opCard.addInt(card); + owner.opCardList.add(pongCard); + } + + ITArray opcard = TArray.newInstance(); + opcard.addInt(card); + opcard.addInt(card); + opcard.addInt(card); + opcard.addInt(card); + if (owner.is_gang) + { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_SELF_KONG, owner.seat,opcard); + } + else { + EXMainServer.gameCtr.actionCard(owner, card, RuleWeight.TYPE_SELF_ZHAO, owner.seat,opcard); + } + } + + + //room.addAllScore(owner, Config.AN_GANG_SCORE, EXScore.KONG); + owner.an_gang_num++; + owner.stateMachine.changeState(Global.getState(EXPlayerKongDrawState.class)); + owner.settleLog.add(Config.SETTLE_AN_KONG); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfWinState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfWinState.java new file mode 100644 index 0000000..810c451 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/rulestate/PRSelfWinState.java @@ -0,0 +1,70 @@ +package extend.mj.player.rulestate; + + +import com.game.Util; +import com.game.data.Player; +import com.game.state.StateBase; +import extend.mj.*; + +import java.util.Map.Entry; + +/** + * ��Ӧ��������״̬ + * + * + * 2017��8��30�� + * PRSelfWinState.java + */ +public class PRSelfWinState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + + EXRoom room = owner.getRoom(); + owner.winCard = owner.drawCard; + owner.winer = 1; + + Util.removeCard(owner.cardInhand, owner.winCard, 1); + + room.addAllScore(owner, owner.hu_score,EXScore.WIN); + + room.addAllPiaoNiaoScore(owner); + for (Entry entry : room.playerMapById.entrySet()) { + if (entry.getKey().equals(owner.playerid)) { + continue; + } + EXPlayer fromPlayer = (EXPlayer) entry.getValue(); + fromPlayer.winer = 2; + fromPlayer.last_winer = 2; + } + + EXMainServer.gameCtr.winEvent(owner,owner.seat,owner.winCard); + + if (room.lastBankerSeat == 0) + { + room.lastBankerSeat = room.bankerSeat; + } + owner.room.bankerSeat = owner.seat; + owner.settleLog.add(Config.SETTLE_ZIMO); + room.endGame(); + } + + @Override + public void toNextState(EXPlayer owner) { + // TODO Auto-generated method stub + + } + + @Override + public void exit(EXPlayer owner) { + // TODO Auto-generated method stub + + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + // TODO Auto-generated method stub + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDisCardTipState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDisCardTipState.java new file mode 100644 index 0000000..2e3d968 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDisCardTipState.java @@ -0,0 +1,54 @@ +package extend.mj.player.state; + +import java.util.Map.Entry; + +import com.game.ActionEvent; +import com.taurus.core.entity.ITObject; + +import extend.mj.EXActionEvent; +import extend.mj.EXPlayer; +import extend.mj.RuleWeight; +import extend.mj.tip.Tip; + +/** + * ��ҳ�����ʾ״̬ + * + * + * 2017��8��30�� + * EXPlayerDisCardTipState.java + */ +public class EXPlayerDisCardTipState extends EXPlayerTipState { + + @Override + public void enter(EXPlayer owner) { + super.enter(owner); + owner.getRoom().tipMap.put(owner.playerid, owner.tipMgr); + } + + @Override + public void exit(EXPlayer owner) { + super.exit(owner); + owner.getRoom().tipMap.remove(owner.playerid); + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + super.execute(owner, cmd, gid, param); + if (cmd.equals(EXActionEvent.EVENT_ACTION)) { + ITObject netParam = (ITObject) param; + int id = netParam.getInt("id"); + owner.tipMgr.choicAction(id); + }else if(cmd.equals(ActionEvent.EVENT_TIMER_AUTO)) { + int id = 0; + for (Entry entry : owner.tipMgr.tipMap.entrySet()) { + Tip tip = entry.getValue(); + if(tip.type == RuleWeight.TYPE_WIN) { + id = tip.id; + break; + } + } + owner.tipMgr.choicAction(id); + } + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDiscardState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDiscardState.java new file mode 100644 index 0000000..c00db97 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDiscardState.java @@ -0,0 +1,114 @@ +package extend.mj.player.state; + +import com.game.ActionEvent; +import com.game.Global; +import com.game.Router; +import com.game.Util; +import com.game.player.state.PlayerPauseState; +import com.game.player.state.PlayerWaitState; +import com.game.state.StateBase; +import com.taurus.core.entity.*; + +import extend.mj.*; +import extend.mj.room.state.EXRoomSetpState; + +import java.util.ArrayList; +import java.util.Collections; + +/** + * �ȴ���ҳ���״̬ + * + */ +public class EXPlayerDiscardState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + if (owner.is_gang) + { + owner.louhu = false; + int discard = owner.drawCard; + if(owner.drawCard == 0) { + discard = owner.cardInhand.get(owner.cardInhand.size() - 1); + } + + EXMainServer.gameCtr.outCard(owner, discard); + owner.gangshangpao = false; + + if (owner.getRoom().tipMap.size() != 0) { + owner.stateMachine.changeState(Global.getState(PlayerPauseState.class)); + } else { + this.toNextState(owner); + } + } + else { + EXMainServer.gameCtr.discardTipEvent(owner); + owner.startActionTimer(); + } + } + + @Override + public void toNextState(EXPlayer owner) { + owner.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + owner.room.stateMachine.changeState(Global.getState(EXRoomSetpState.class)); + } + + + + @Override + public void exit(EXPlayer owner) { + owner.stopActionTimer(); + } + + public void reload(EXPlayer owner) { + owner.startActionTimer(); + } + + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + switch (cmd) { + case EXActionEvent.EVENT_DISCARD: + ITObject netParam = (ITObject) param; + int discard = netParam.getInt("card"); + + if (!Util.checkCard(discard, owner.cardInhand)) { + ITObject reconParam = new TObject(); + owner.sendEvent(Router.GAME_EVT__UPDATE_RECONECT, reconParam); + return; + } + owner.louhu = false; + EXMainServer.gameCtr.outCard(owner, discard); + owner.gangshangpao = false; + + if (owner.getRoom().tipMap.size() != 0) { + owner.stateMachine.changeState(Global.getState(PlayerPauseState.class)); + } else { + this.toNextState(owner); + } + break; + case ActionEvent.EVENT_TIMER_AUTO: + owner.louhu = false; + discard = owner.drawCard; + if(owner.drawCard == 0) { + discard = owner.cardInhand.get(owner.cardInhand.size() - 1); + } + + EXMainServer.gameCtr.outCard(owner, discard); + owner.gangshangpao = false; + + if (owner.getRoom().tipMap.size() != 0) { + owner.stateMachine.changeState(Global.getState(PlayerPauseState.class)); + } else { + this.toNextState(owner); + } + break; + case ActionEvent.EVENT_ENTRUST: + owner.startActionTimer(); + break; + default: + break; + } + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawState.java new file mode 100644 index 0000000..7f29a50 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawState.java @@ -0,0 +1,199 @@ +package extend.mj.player.state; + +import com.game.Global; +import com.game.Util; +import com.game.state.StateBase; +import com.taurus.core.entity.ITObject; +import extend.mj.*; +import extend.mj.uitl.WinCard; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * ���ץ��״̬ + * + * + * 2017��8��30�� + * EXPlayerDrawState.java + */ +public class EXPlayerDrawState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + EXRoom room = owner.getRoom(); + if (room.isLiuJu()) { + room.endGameByLiuJu(); + return; + } + + ITObject config = room.config; + boolean hz_hu = config.getBoolean(Config.ROOM_CONFIG_HZ_HU); + boolean laizi = room.config.getInt(Config.ROOM_CONFIG_LAIZI) > 0 ? true : false; + + if(owner.seat == room.adminSeat) { + ArrayList tempCardList = new ArrayList(); + int count = 0; + do { + int drawCard = room.card.pop(); + + if (!IsGoodCard(owner, drawCard, laizi)) { + if (room.card.cardList.size() != 0 && count++ <= 5) { + tempCardList.add(drawCard); + continue; + } + } + + owner.drawCard = drawCard; + break; + } while (true); + room.card.cardList.addAll(tempCardList); + } else { + double rand = Math.random() % 100 * 100; + if (room.while_list && owner.is_white && rand > room.white_value) { + ArrayList tempCardList = new ArrayList(); + int count = 0; + do { + int drawCard = room.card.pop(); + + if (!IsGoodCard(owner, drawCard, laizi)) { + if (room.card.cardList.size() != 0 && count++ <= 5) { + tempCardList.add(drawCard); + continue; + } + } + + owner.drawCard = drawCard; + break; + } while (true); + room.card.cardList.addAll(tempCardList); + } else { + if (owner.black_white_status == 2) { + double rand1 = Math.random() % 100 * 100; + if (rand1 <= owner.black_white_rate) { + ArrayList tempCardList = new ArrayList(); + int count = 0; + do { + int drawCard = room.card.pop(); + + boolean flag = false; + if (IsGoodCard(owner, drawCard, laizi)) { + flag = true; + } + + if (!flag) { + if (room.card.cardList.size() > 0 && count++ <= 5) { + tempCardList.add(drawCard); + continue; + } + } + + owner.drawCard = drawCard; + break; + } + while (true); + room.card.cardList.addAll(tempCardList); + } else { + owner.drawCard = room.card.pop(); + } + } else if (owner.black_white_status == 1) { + double rand1 = Math.random() % 100 * 100; + if (rand1 <= owner.black_white_rate) { + ArrayList tempCardList = new ArrayList(); + int count = 0; + do { + int drawCard = room.card.pop(); + + boolean flag = false; + if (IsGoodCard(owner, drawCard, laizi)) { + flag = true; + } + + if (flag) { + if (room.card.cardList.size() > 0 && count++ <= 5) { + tempCardList.add(drawCard); + continue; + } + } + + owner.drawCard = drawCard; + break; + } + while (true); + room.card.cardList.addAll(tempCardList); + } else { + owner.drawCard = room.card.pop(); + } + } else { + owner.drawCard = room.card.pop(); + } + } + } + + int leftCount = room.card.getCount(); + ((EXGameController)Global.gameCtr).getCard(owner, leftCount); + + EXMainServer.playerRuleMgr.condition(PlayerRuleManager.DRAW_RULE, owner); + } + + private boolean IsGoodCard(EXPlayer player, int drawCard, boolean laizi) { + if (player.getRoom().isLaizi(drawCard)) + { + return true; + } + + if (Util.cardNum(drawCard, player.cardInhand) >= 2) + { + return true; + } + + for (int[] cardGroup : player.pongGroup) { + if (drawCard == cardGroup[0]) { + return true; + } + } + + HashMap map = new HashMap(); + WinCard win = new WinCard(player.cardInhand, drawCard, player.getRoom().card.laiziCard, player.getRoom().card.laiziCard2, laizi, true, true); + if (win.checkWin(map, player, player.getRoom(), true)) { + return true; + } + + if (drawCard < 400) + { + if (drawCard % 100 <= 7) + { + if (Util.cardNum(drawCard+1, player.cardInhand) >= 1 && Util.cardNum(drawCard+2, player.cardInhand) >= 1) + { + return true; + } + } + + if (drawCard % 100 >= 3) + { + if (Util.cardNum(drawCard-1, player.cardInhand) >= 1 && Util.cardNum(drawCard-2, player.cardInhand) >= 1) + { + return true; + } + } + + if (drawCard % 100 >= 2 && drawCard % 100 <= 8) + { + if (Util.cardNum(drawCard-1, player.cardInhand) >= 1 && Util.cardNum(drawCard+1, player.cardInhand) >= 1) + { + return true; + } + } + } + + return false; + } + + @Override + public void toNextState(EXPlayer owner) { + owner.stateMachine.changeState(Global.getState(EXPlayerDiscardState.class)); + + } + + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawTipState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawTipState.java new file mode 100644 index 0000000..f2b5baf --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerDrawTipState.java @@ -0,0 +1,43 @@ +package extend.mj.player.state; + +import java.util.Map.Entry; + +import com.game.ActionEvent; +import com.game.Global; +import com.taurus.core.entity.ITObject; + +import extend.mj.EXActionEvent; +import extend.mj.EXPlayer; +import extend.mj.RuleWeight; +import extend.mj.tip.Tip; + +/** + * ���ץ����ʾ״̬ + * + */ +public class EXPlayerDrawTipState extends EXPlayerTipState { + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + super.execute(owner, cmd, gid, param); + if (cmd.equals(EXActionEvent.EVENT_ACTION)) { + ITObject netParam = (ITObject) param; + int id = netParam.getInt("id"); + boolean win = (owner.tipMgr.weight &RuleWeight.SELF_WIN)!=0 ; + if(Global.gameId == 1 && win && id == 0)return; + owner.tipMgr.doAction(id); + }else if(cmd.equals(ActionEvent.EVENT_TIMER_AUTO)) { + int id = 0; + for (Entry entry : owner.tipMgr.tipMap.entrySet()) { + Tip tip = entry.getValue(); + if(tip.type == RuleWeight.TYPE_WIN) { + id = tip.id; + break; + } + } + owner.tipMgr.doAction(id); + } + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongDrawState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongDrawState.java new file mode 100644 index 0000000..c152b6d --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongDrawState.java @@ -0,0 +1,142 @@ +package extend.mj.player.state; + +import com.game.Global; +import com.game.player.state.PlayerPauseState; +import com.game.player.state.PlayerWaitState; +import com.game.state.StateBase; + +import com.taurus.core.entity.ITObject; +import com.taurus.permanent.TPServer; +import extend.mj.*; +import extend.mj.room.state.EXRoomSetpState; +import extend.mj.uitl.WinCard; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.concurrent.TimeUnit; + +/** + * ���ץ��״̬ + * + * + * 2017��8��30�� + * EXPlayerDrawState.java + */ +public class EXPlayerKongDrawState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + EXRoom room = owner.getRoom(); + if (room.isLiuJu()) { + room.endGameByLiuJu(); + return; + } + + ITObject config = room.config; + + boolean hz_hu = config.getBoolean(Config.ROOM_CONFIG_HZ_HU); + int laizi = room.config.getInt(Config.ROOM_CONFIG_LAIZI); + + if(owner.seat == room.adminSeat) { + double rand = Math.random() % 100; + if (room.while_list && !owner.is_white && rand > room.white_value) + { + ArrayList tempCardList = new ArrayList(); + int count = 0; + do { + int drawCard = owner.drawCard = room.card.popsub(); + HashMap map = new HashMap(); + WinCard win = new WinCard(owner.cardInhand, drawCard, room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, true, true); + if(!(hz_hu && win.laizi_count >0)) { + if (win.checkWin(map, owner, room, true)) { + if (room.card.cardList.size() != 0 && count++ <= 5) { + tempCardList.add(drawCard); + continue; + } + } + } + + owner.drawCard = drawCard; + break; + } while(true); + + room.card.cardList.addAll(tempCardList); + } + else + { + owner.drawCard = room.card.popsub(); + } + }else { + double rand = Math.random() % 100 * 100; + if (room.while_list && !owner.is_white && rand > room.white_value) + { + ArrayList tempCardList = new ArrayList(); + int count = 0; + do { + int drawCard = room.card.pop(); + HashMap map = new HashMap(); + WinCard win = new WinCard(owner.cardInhand, drawCard, room.card.laiziCard, room.card.laiziCard2, laizi > 0 ? true : false, true, true); + if(!(hz_hu && win.laizi_count >0)) { + if (win.checkWin(map, owner, room, true)) { + if (room.card.cardList.size() != 0 && count++ <= 5) { + tempCardList.add(drawCard); + Global.logger.info("no white to hu:" + drawCard); + continue; + } + } + } + + owner.drawCard = drawCard; + break; + } while(true); + room.card.cardList.addAll(tempCardList); + } + else + { + owner.drawCard = room.card.pop(); + } + } + + int leftCount = room.card.getCount(); + ((EXGameController)Global.gameCtr).getCard(owner, leftCount); + + EXMainServer.playerRuleMgr.condition(PlayerRuleManager.KONG_DRAW_RULE, owner); + } + + @Override + public void toNextState(EXPlayer owner) { + if (owner.is_gang) + { + timer(owner); + } + else { + owner.stateMachine.changeState(Global.getState(EXPlayerDiscardState.class)); + } + } + + public static void timer(EXPlayer owner) { + + TPServer.me().getTimerPool().schedule(new Runnable() { + + @Override + public void run() { + + if (owner == null || owner.getRoom() == null) { + Global.logger.error("room is null"); + return; + } + + if (owner.getRoom().isDestroy) + return; + + owner.getRoom().enqueueRunnable(new Runnable() { + + @Override + public void run() { + owner.stateMachine.changeState(Global.getState(EXPlayerDiscardState.class)); + } + }); + } + }, 1000, TimeUnit.MILLISECONDS); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongWinState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongWinState.java new file mode 100644 index 0000000..441c172 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerKongWinState.java @@ -0,0 +1,42 @@ +package extend.mj.player.state; + +import com.taurus.core.entity.ITObject; + +import extend.mj.EXActionEvent; +import extend.mj.EXPlayer; + +/** + * ���������ʾ�ȴ� + * + * + * 2017��8��30�� + * EXPlayerKongWinState.java + */ +public class EXPlayerKongWinState extends EXPlayerTipState{ + + @Override + public void enter(EXPlayer owner) { + // TODO Auto-generated method stub + super.enter(owner); + owner.getRoom().tipMap.put(owner.playerid, owner.tipMgr); + + } + + @Override + public void exit(EXPlayer owner) { + // TODO Auto-generated method stub + super.exit(owner); + owner.getRoom().tipMap.remove(owner.playerid); + + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + if (cmd.equals(EXActionEvent.EVENT_ACTION)) { + ITObject netParam = (ITObject) param; + int id = netParam.getInt("id"); + owner.tipMgr.choicAction(id); + } + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerPiaoNiaoTipState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerPiaoNiaoTipState.java new file mode 100644 index 0000000..4d6945a --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerPiaoNiaoTipState.java @@ -0,0 +1,63 @@ +package extend.mj.player.state; + +import com.game.ActionEvent; +import com.game.Global; +import com.game.player.state.PlayerWaitState; +import com.game.state.StateBase; +import com.taurus.core.entity.ITObject; +import extend.mj.EXActionEvent; +import extend.mj.EXMainServer; +import extend.mj.EXPlayer; + + +public class EXPlayerPiaoNiaoTipState extends StateBase{ + + @Override + public void enter(EXPlayer owner) { + if(!owner.isEntrust()) { + EXMainServer.gameCtr.piaoTipEvent(owner,0); + } + owner.startActionTimer(); + } + + /** + * 重连 + * @param owner + */ + @Override + public void reload(EXPlayer owner) { + EXMainServer.gameCtr.piaoTipEvent(owner,1); + owner.startActionTimer(); + } + + + @Override + public void exit(EXPlayer owner) { + owner.stopActionTimer(); + } + + private void _action(EXPlayer owner,int id,int gid) { + owner.piao = id; + owner.last_piao = id; + + owner.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + owner.getRoom().piaoCount --; + EXMainServer.gameCtr.piaoEvent(owner); + owner.getRoom().stateMachine.execute(EXActionEvent.EVENT_PIAO, gid, null); + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + super.execute(owner, cmd, gid, param); + if (cmd.equals(EXActionEvent.EVENT_PIAO)) { + ITObject netParam = (ITObject) param; + int id = netParam.getInt("id"); + _action(owner, id, gid); + }else if(cmd.equals(ActionEvent.EVENT_TIMER_AUTO) || cmd.equals(ActionEvent.EVENT_ENTRUST)) { + _action(owner,0,gid); + } + else if(cmd.equals(ActionEvent.EVENT_OFFLINE)) { + owner.startActionTimer(); + } + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerTipState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerTipState.java new file mode 100644 index 0000000..db227ac --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerTipState.java @@ -0,0 +1,61 @@ +package extend.mj.player.state; + +import com.game.ActionEvent; +import com.game.state.StateBase; +import extend.mj.Config; +import extend.mj.EXMainServer; +import extend.mj.EXPlayer; +import extend.mj.RuleWeight; +import extend.mj.tip.Tip; + +/** + * �����ʾ������� + * + * + * 2017��8��30�� + * EXPlayerTipState.java + */ +public abstract class EXPlayerTipState extends StateBase { + + @Override + public void enter(EXPlayer owner) { + if (owner.getRoom().config.getBoolean(Config.ROOM_CONFIG_ZI_DONG_HU)) + { + Tip tip = owner.tipMgr.getTip(RuleWeight.TYPE_WIN); + if (tip != null) + { + owner.startActionTimer(1000); + return; + } + } + + if(!owner.isEntrust()) { + EXMainServer.gameCtr.tipEvent(owner); + } + owner.startActionTimer(); + } + + @SuppressWarnings("unchecked") + @Override + public void toNextState(EXPlayer owner) { + owner.stateMachine.lastState.toNextState(owner); + } + + @Override + public void exit(EXPlayer owner) { + owner.tipMgr.clean(); + owner.stopActionTimer(); + } + + public void reload(EXPlayer owner) { + super.reload(owner); + this.enter(owner); + } + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + if(cmd.equals(ActionEvent.EVENT_ENTRUST)) { + owner.startActionTimer(); + } + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitKongWinState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitKongWinState.java new file mode 100644 index 0000000..dff6a34 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitKongWinState.java @@ -0,0 +1,24 @@ +package extend.mj.player.state; + +import com.game.state.StateBase; + +import extend.mj.EXPlayer; + +/** + * ������ҵȴ��������ǹ�ܺ� + * + * + * 2017��8��30�� + * EXPlayerWaitKongWinState.java + */ +public class EXPlayerWaitKongWinState extends StateBase{ + + @SuppressWarnings("unchecked") + @Override + public void toNextState(EXPlayer owner) { + owner.stateMachine.lastState.toNextState(owner); + + } + + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitState.java new file mode 100644 index 0000000..858aee0 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/player/state/EXPlayerWaitState.java @@ -0,0 +1,39 @@ +package extend.mj.player.state; + + +import com.game.state.StateBase; + +import extend.mj.EXActionEvent; +import extend.mj.EXMainServer; +import extend.mj.EXPlayer; +import extend.mj.PlayerRuleManager; + +/** + * ��ҵȴ�״̬ + * + * + * 2017��8��30�� + * EXPlayerWaitState.java + */ +public class EXPlayerWaitState extends StateBase { + + + @Override + public void execute(EXPlayer owner, String cmd, int gid, Object param) { + // TODO Auto-generated method stub + switch (cmd) { + case EXActionEvent.EVENT_OTHER_DISCARD: + EXMainServer.playerRuleMgr.condition( PlayerRuleManager.OTHER_DISCARD_RULE , owner); + break; + case EXActionEvent.EVENT_KONG_WIN: + owner.forceCheckWin = true; + EXMainServer.playerRuleMgr.condition( PlayerRuleManager.KONG_HU_RULE , owner); + owner.forceCheckWin = false; + break; + default: + break; + } + + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomDealState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomDealState.java new file mode 100644 index 0000000..a9c6966 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomDealState.java @@ -0,0 +1,107 @@ +package extend.mj.room.state; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map.Entry; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import com.game.Global; +import com.game.data.Player; +import com.game.state.StateBase; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TObject; + +import com.taurus.permanent.TPServer; +import extend.mj.*; +import extend.mj.player.state.EXPlayerPiaoNiaoTipState; + +/** + * ���䷢��״̬ + * + * + * 2017��8��30�� + * EXRoomDealState.java + */ +public class EXRoomDealState extends StateBase { + + @Override + public void enter(EXRoom owner) { + boolean donghua = false; + for (Entry entry : owner.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + if (player.xi_pai) + { + donghua = true; + break; + } + } + + if (donghua) + { + owner.notifyXiPai(); + //启动定时器 + timer(owner); + } + else { + this.toNextState(owner); + } + } + + public static void timer(EXRoom owner) { + + TPServer.me().getTimerPool().schedule(new Runnable() { + + @Override + public void run() { + + if (owner == null) { + Global.logger.error("room is null"); + return; + } + + if (owner.isDestroy) + return; + + owner.enqueueRunnable(new Runnable() { + + @Override + public void run() { + owner.stateMachine.toNextState(); + } + }); + } + }, 4000, TimeUnit.MILLISECONDS); + } + + @Override + public void toNextState(EXRoom owner) { + owner.card.init(); + if (owner.bankerSeat == 0) { + owner.bankerSeat = 1; + ArrayList randPlayer = new ArrayList<>(); + for (Entry entry : owner.playerMapBySeat.entrySet()) { + Integer seat = entry.getKey(); + randPlayer.add(seat); + } + + Collections.shuffle(randPlayer); + if (randPlayer.size() > 0) + { + owner.bankerSeat = randPlayer.get(0); + } + } + else { + if (owner.config.getInt(Config.ROOM_CONFIG_XUAN_ZHUANG) == 0) + { + owner.bankerSeat = (owner.bankerSeat)%owner.maxPlayers+1; + } + } + + ITObject param = new TObject(); + param.putInt("bank_seat", owner.bankerSeat); + EXMainServer.gameCtr.dealCard(owner); + owner.playBackData = new EXPlayBack(owner); + owner.stateMachine.changeState(Global.getState(EXRoomSetpState.class)); + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomPiaoState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomPiaoState.java new file mode 100644 index 0000000..0a522d7 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomPiaoState.java @@ -0,0 +1,30 @@ +package extend.mj.room.state; + +import com.game.Global; +import com.game.data.Player; +import com.game.state.StateBase; +import extend.mj.EXActionEvent; +import extend.mj.EXRoom; +import extend.mj.player.state.EXPlayerPiaoNiaoTipState; + +import java.util.Map.Entry; + +public class EXRoomPiaoState extends StateBase{ + + @Override + public void enter(EXRoom owner) { + owner.piaoCount = owner.maxPlayers; + for (Entry entry : owner.playerMapById.entrySet()) { + Player player = entry.getValue(); + player.stateMachine.changeState(Global.getState(EXPlayerPiaoNiaoTipState.class)); + } + } + + public void execute(EXRoom owner, String cmd, int gid, Object param) { + if(cmd.equals(EXActionEvent.EVENT_PIAO)) { + if(owner.piaoCount==0) { + owner.stateMachine.changeState(Global.getState(EXRoomDealState.class)); + } + } + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomSetpState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomSetpState.java new file mode 100644 index 0000000..47fbd44 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomSetpState.java @@ -0,0 +1,42 @@ +package extend.mj.room.state; + + +import com.game.Global; +import com.game.data.Player; +import com.game.state.StateBase; + +import extend.mj.EXMainServer; +import extend.mj.EXRoom; +import extend.mj.player.state.EXPlayerDrawState; + +/** + * ����ת����λ + * + * + * 2017��8��30�� + * EXRoomSetpState.java + */ +public class EXRoomSetpState extends StateBase { + + @Override + public void enter(EXRoom owner) { + Player player; + // TODO Auto-generated method stub + if (owner.activeSeat == 0) { + player = owner.playerMapBySeat.get(owner.bankerSeat); + + } else { + player = owner.playerMapBySeat.get(owner.activeSeat); + int nextSeat = player.nextSeat; + player = owner.playerMapBySeat.get(nextSeat); + + } + + EXMainServer.gameCtr.changeActiveSeat(owner,player.seat); + + player.stateMachine.changeState(Global.getState(EXPlayerDrawState.class)); + + this.toNextState(owner); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomStartGameState.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomStartGameState.java new file mode 100644 index 0000000..1a2b807 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/room/state/EXRoomStartGameState.java @@ -0,0 +1,58 @@ +package extend.mj.room.state; + +import com.game.Global; +import com.game.data.Player; +import com.game.state.StateBase; + +import extend.mj.Config; +import extend.mj.EXMainServer; +import extend.mj.EXPlayer; +import extend.mj.EXRoom; + +import java.util.Map; + +/** + * ���俪ʼ״̬ + * + */ +public class EXRoomStartGameState extends StateBase { + + @Override + public void enter(EXRoom owner) { +// owner.readyCount = 0; +// for (Entry entry : owner.playerMapById.entrySet()) { +// Player player = entry.getValue(); +// player.ready = false; +// player.clear(); +// player.initSeat(); +// } + owner.startGame(); + + this.toNextState(owner); + } + + @Override + public void toNextState(EXRoom owner) { + if(owner.config.containsKey(Config.ROOM_CONFIG_PIAO) && owner.config.getInt(Config.ROOM_CONFIG_PIAO) != 0) { + if (owner.config.getInt(Config.ROOM_CONFIG_PIAO) == 3) + { + int piaofen = owner.config.getInt(Config.ROOM_CONFIG_PIAO_FEN); + + for (Map.Entry entry : owner.playerMapById.entrySet()) { + EXPlayer player = (EXPlayer) entry.getValue(); + player.piao = piaofen; + player.last_piao = piaofen; + EXMainServer.gameCtr.piaoEvent(player); + } + owner.stateMachine.changeState(Global.getState(EXRoomDealState.class)); + } + else { + owner.stateMachine.changeState(Global.getState(EXRoomPiaoState.class)); + } + } + else{ + owner.stateMachine.changeState(Global.getState(EXRoomDealState.class)); + } + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Action.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Action.java new file mode 100644 index 0000000..454d9ca --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Action.java @@ -0,0 +1,27 @@ +package extend.mj.tip; + + +import extend.mj.EXPlayer; + +/** + * + * + + */ +public class Action { + + public Tip tip; + public EXPlayer player; + + public Action(Tip tip, EXPlayer player) { + this.tip = tip; + this.player = player; + + } + + public void run() { + this.player.initOpCard(tip.opcard); + this.tip.rule.action(this.player,this.tip); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/IRuleBase.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/IRuleBase.java new file mode 100644 index 0000000..79f1ab8 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/IRuleBase.java @@ -0,0 +1,27 @@ +package extend.mj.tip; + +import extend.mj.EXPlayer; + +/** + * ����������� + * + * + * 2017��8��30�� + * RuleBase.java + */ +public interface IRuleBase { + + /** + * ������� + * @param player + * @return + */ + public abstract boolean condition(EXPlayer player ); + + /** + * ִ�иù��� + * @param player + */ + public abstract void action(EXPlayer player ,Tip tip); + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Tip.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Tip.java new file mode 100644 index 0000000..b4f6ce4 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/Tip.java @@ -0,0 +1,46 @@ +package extend.mj.tip; + +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TObject; +import extend.mj.WinCardType; + +import java.util.Map; + +/** + * tip������ + * + * + * + * 2017��8��30�� Tip.java + */ +public class Tip { + public int id; + public IRuleBase rule; + public int weight; + public int card; + public ITArray opcard; + public int winType; + public int type; + public boolean self; + public Map winMap; + + public Tip(int card, ITArray opcard, int weight, IRuleBase rule, int type) { + this.rule = rule; + this.weight = weight; + this.opcard = opcard; + this.card = card; + this.type = type; + this.self = false; + } + + public ITObject toMP() { + ITObject tipMp = new TObject(); + tipMp.putInt("id", id); + tipMp.putInt("weight", weight); + tipMp.putInt("type", type); + tipMp.putInt("card", card); + tipMp.putTArray("opcard", opcard); + return tipMp; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/TipManager.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/TipManager.java new file mode 100644 index 0000000..9f40ee2 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/tip/TipManager.java @@ -0,0 +1,142 @@ +package extend.mj.tip; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import com.game.Global; +import com.game.player.state.PlayerWaitState; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import com.taurus.core.entity.TObject; + +import extend.mj.Config; +import extend.mj.EXPlayer; +import extend.mj.RuleWeight; + +/** + * + * + * + * 2017��9��18�� TipManager.java + */ +public class TipManager { + + private int id = 0; + + public Map tipMap = null; + public Tip actionTip; + public int weight = 0; + public EXPlayer owner = null; + + public TipManager(EXPlayer owner) { + this.tipMap = new HashMap(); + this.owner = owner; + + } + + public void addTip(Tip tip) { + int id = this.getId(); + this.weight = this.weight | tip.weight; + tip.id = id; + this.tipMap.put(id, tip); + } + + public Tip getTip(int type) + { + for (Entry entry : this.tipMap.entrySet()) + { + Tip tip = entry.getValue(); + if (tip.type == type) + { + return tip; + } + } + return null; + } + + private void checkLouhu() { + if (owner.getRoom().config.getBoolean(Config.ROOM_CONFIG_LOUHU)) + { + for (Entry entry : this.tipMap.entrySet()) { + Tip tip = entry.getValue(); + if(tip.type == RuleWeight.TYPE_WIN) { + this.owner.louhu = true; + break; + } + } + } + } + + public void choicAction(int id) { + if (id == 0) { + this.checkLouhu(); + this.owner.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + this.owner.getRoom().checkAction(); + } else if (this.tipMap.containsKey(id)) { + Tip tip = this.tipMap.get(id); + owner.stateMachine.changeState(Global.getState(PlayerWaitState.class)); + owner.getRoom().addAction(new Action(tip, owner)); + } else { + throw new Error("tip map has no id" + id); + } + } + + @SuppressWarnings("unchecked") + public void doAction(int id) { + if (id == 0) { + this.checkLouhu(); + this.owner.stateMachine.lastState.toNextState(owner); + } else if (this.tipMap.containsKey(id)) { + Tip tip = this.tipMap.get(id); + owner.initOpCard(tip.opcard); + tip.rule.action(owner,tip); + + } else { + throw new Error("tip map has no id" + id); + } + + } + + public ITObject toMP() { + ITObject mp = new TObject(); + mp.putInt("weight", this.weight); + ITArray tipList = new TArray(); + for (Entry entry : this.tipMap.entrySet()) { + Tip tip = entry.getValue(); + ITObject tipMp = tip.toMP(); + tipList.addTObject(tipMp); + } + mp.putTArray("tip_list", tipList); + return mp; + + } + + private int getId() { + this.id += 1; + return this.id; + } + + public int getWeightest() { + int result = 0; + for (Entry entry : this.tipMap.entrySet()) { + Tip tip = entry.getValue(); + if (tip.weight > result) { + result = tip.weight; + } + } + return result; + } + + public void cleanTip() { + this.weight = 0; + this.id = 0; + this.tipMap = new HashMap(); + } + + public void clean() { + this.cleanTip(); + } + +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/CardUtil.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/CardUtil.java new file mode 100644 index 0000000..e8ed060 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/CardUtil.java @@ -0,0 +1,51 @@ +package extend.mj.uitl; + +import java.util.List; +import java.util.Map; + +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.TArray; +import extend.mj.OpCard; +import extend.mj.WinCardType; + +public class CardUtil { + + + static public void removeGroup(List group, int card) { + for (int i = 0; i < group.size(); i++) { + int[] cardArray = group.get(i); + if (cardArray[0] == card) { + group.remove(cardArray); + return; + } + + } + } + + static public void removeOpcard(List opcards, OpCard param) { + for (int i = 0; i < opcards.size(); i++) { + if (param.card == opcards.get(i).card) { + opcards.remove(i); + return; + } + + } + + } + + static public ITArray toMPData_WinMap(Map map) { + return toMPData_WinMap(map,false); + } + + static public ITArray toMPData_WinMap(Map map,boolean is_opcard) { + if (map != null && map.size() > 0) { + ITArray array = TArray.newInstance(); + for (Map.Entry entry : map.entrySet()) { + WinCardType wct = entry.getValue(); + array.addTObject(wct.toTObject(is_opcard)); + } + return array; + } + return null; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/WinCard.java b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/WinCard.java new file mode 100644 index 0000000..0f6b0ad --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/main/java/extend/mj/uitl/WinCard.java @@ -0,0 +1,1468 @@ +package extend.mj.uitl; + +import com.game.Global; +import com.game.Util; +import com.game.data.Player; +import com.taurus.core.entity.ITArray; +import com.taurus.core.entity.ITObject; +import com.taurus.core.entity.TArray; +import extend.mj.*; + +import java.util.*; + +public class WinCard { + + public List cardList; + public int laizi_count; + public int laizi1_count; + public int laizi2_count; + public int laizi1 = 0; + public int laizi2 = 0; + public boolean zi_mo = false; + public boolean ting_pai = false; + public Map cbCardMap; + public int addCard = 0; + public boolean selfCard = false; + + public WinCard(List cardInhand, int addCard, int laizi1, int laizi2, boolean islaizi, boolean selfCard, boolean ting_pai) { + this.cardList = new ArrayList(); + this.cardList.addAll(cardInhand); + this.cbCardMap = new HashMap(); + this.ting_pai = ting_pai; + this.selfCard = selfCard; + this.addCard = addCard; + if (selfCard) + { + this.cardList.add(addCard); + if (islaizi) { + this.laizi1 = laizi1; + this.laizi2 = laizi2; + this.laizi1_count = Util.cardNum(laizi1, this.cardList); + this.laizi2_count = Util.cardNum(laizi2, this.cardList); + this.laizi_count = this.laizi1_count + this.laizi2_count; + Util.removeCard(this.cardList, laizi1, this.laizi1_count); + Util.removeCard(this.cardList, laizi2, this.laizi2_count); + } + } + else { + if (islaizi) { + this.laizi1 = laizi1; + this.laizi2 = laizi2; + this.laizi1_count = Util.cardNum(laizi1, this.cardList); + this.laizi2_count = Util.cardNum(laizi2, this.cardList); + this.laizi_count = this.laizi1_count + this.laizi2_count; + Util.removeCard(this.cardList, laizi1, this.laizi1_count); + Util.removeCard(this.cardList, laizi2, this.laizi2_count); + } + this.cardList.add(addCard); + } + + Collections.sort(this.cardList); + for(int i = 0; i < this.cardList.size(); i++) + { + int card = this.cardList.get(i); + if (this.cbCardMap.containsKey(card)) + { + int num = this.cbCardMap.get(card); + this.cbCardMap.put(card, num+1); + } + else + { + this.cbCardMap.put(card, 1); + } + } + } + + public WinCard(List cardInhand, int laizi1, int laizi2, boolean islaizi, boolean ting_pai) { + this.cardList = new ArrayList(); + this.cardList.addAll(cardInhand); + this.cbCardMap = new HashMap(); + this.ting_pai = ting_pai; + this.selfCard = true; + this.addCard = 0; + if (islaizi) { + this.laizi1 = laizi1; + this.laizi2 = laizi2; + this.laizi1_count = Util.cardNum(laizi1, this.cardList); + this.laizi2_count = Util.cardNum(laizi2, this.cardList); + this.laizi_count = this.laizi1_count + this.laizi2_count; + Util.removeCard(this.cardList, laizi1, this.laizi1_count); + Util.removeCard(this.cardList, laizi2, this.laizi2_count); + } + Collections.sort(this.cardList); + for(int i = 0; i < this.cardList.size(); i++) + { + int card = this.cardList.get(i); + if (this.cbCardMap.containsKey(card)) + { + int num = this.cbCardMap.get(card); + this.cbCardMap.put(card, num+1); + } + else + { + this.cbCardMap.put(card, 1); + } + } + } + + public boolean checkWin(Map map, EXPlayer player, EXRoom room, boolean zimo) { + return checkWinOpList(map, player, player.opCardList, room, zimo); + } + + public boolean checkWinOpList(Map map, EXPlayer player, List opList, EXRoom room, boolean zimo) { + if (this.cardList.size() == 0) { + return false; + } + + this.zi_mo = zimo; + + boolean hu = AnalyseChiHuCard(map, opList, room.config); + if (hu) + { + if (zimo) + { + if (room.card.cardList.size() == 0 && room.config.getBoolean(Config.ROOM_CONFIG_HAI_DI_NAO_YUE)) + { + WinCard.putWinCardType(map, WinCardType.HAI_DI_NAO_YUE, 1,WinCardType.HAI_DI_NAO_YUE_SCORE, true, "海底捞月"); + } + } + else { + + } + } + + if (zimo) + { + if (room.config.getBoolean(Config.ROOM_CONFIG_MENG_QING)) + { + for (Map.Entry entry : map.entrySet()) { + WinCardType cardType = entry.getValue(); + if (cardType.type == WinCardType.JIHU || cardType.type == WinCardType.PINGHU) + { + boolean flag = true; + for(int i = 0; i < opList.size(); i++) + { + OpCard op_card = opList.get(i); + if (op_card.type != RuleWeight.TYPE_SELF_KONG && op_card.type != RuleWeight.TYPE_SELF_ZHAO) + { + flag = false; + } + } + if (flag) + { + WinCard.putWinCardType(map, WinCardType.ZIMO_MEN_QING, 1,WinCardType.ZIMO_MEN_QING_SCORE, true, "门清自摸"); + } + break; + } + } + } + } + else + { + if (room.config.getBoolean(Config.ROOM_CONFIG_MENG_QING)) + { + for (Map.Entry entry : map.entrySet()) { + WinCardType cardType = entry.getValue(); + if (cardType.type == WinCardType.JIHU || cardType.type == WinCardType.PINGHU) + { + boolean flag = true; + for(int i = 0; i < opList.size(); i++) + { + OpCard op_card = opList.get(i); + if (op_card.type != RuleWeight.TYPE_SELF_KONG && op_card.type != RuleWeight.TYPE_SELF_ZHAO) + { + flag = false; + } + } + if (flag) + { + WinCard.putWinCardType(map, WinCardType.MEN_QING, 1,WinCardType.MENGQING_SCORE, true, "门清捉炮"); + } + break; + } + } + } + + + if (room.config.getBoolean(Config.ROOM_CONFIG_JIHU_NOTCHIHU)) + { + WinCardType jihuType = map.get(WinCardType.JIHU); + if (jihuType != null) + { + //鸡胡不能吃胡 + return false; + } + } + + if (room.config.getBoolean(Config.ROOM_CONFIG_SPECAIL_ZIMO)) + { + int hu_score = 0; + if (room.config.getBoolean(Config.ROOM_CONFIG_USE_BASE_HU_SCORE)) + { + hu_score = WinCardType.BASE_HU_SCORE; + } + else + { + player.hu_score = room.maxPlayers - 1; + player.di_score = room.maxPlayers - 1; + } + + int dahu_score = 0; + if (room.config.getBoolean(Config.ROOM_CONFIG_DAHU_CHENG)) + { + dahu_score = 1; + } + int cheng_score = 1; + for (Map.Entry entry : map.entrySet()) { + WinCardType cardType = entry.getValue(); + { + if (room.config.getBoolean(Config.ROOM_CONFIG_DAHU_CHENG)) + { + if (cardType.IsDaHu()) + { + dahu_score *= cardType.score; + } + else + { + cheng_score *= cardType.score; + } + } + else + { + if (cardType.IsDaHu()) + { + dahu_score += cardType.score*WinCardType.DA_HU_BEI_SCORE; + } + else + { + cheng_score *= cardType.score; + } + } + } + } + + if (dahu_score > 0) + { + hu_score *= dahu_score; + } + + hu_score *= cheng_score; + + if (hu_score < 20) + { + return false; + } + } + } + + return hu; + } + + public final static WinCardType putWinCardType(Map map, int type, int value,int score, boolean isDaHu, String desc) { + if (map == null) + return null; + if (isDaHu) + { + map.remove(WinCardType.JIHU); + map.remove(WinCardType.PINGHU); + } + if (map.containsKey(type)) { + WinCardType wct = map.get(type); + wct.value += value; + //Global.logger.info("putWinCardType: " + wct.toString()); + return wct; + } else { + WinCardType wct = new WinCardType(type, value,score, isDaHu, desc); + map.put(type, wct); + //Global.logger.info("putWinCardType: " + wct.toString()); + return wct; + } + } + + public boolean AnalyseChiHuCard(Map map, List opCards, ITObject config) + { + Map tempCardList = new HashMap(); + tempCardList.putAll(this.cbCardMap); + + if (AnalyseChiHuCardEx(map, tempCardList, 0, opCards, config)) + { + return true; + } + + return false; + } + + boolean AnalyseChiHuCardEx(Map map, Map cardListParam, int curCard, List opCards, ITObject config) + { + Map tempCardList = new HashMap<>(); + tempCardList.putAll(cardListParam); + + if (curCard > 0) + { + tempCardList.put(curCard, tempCardList.getOrDefault(curCard, 0)+1); + } + + List clearCardList = new ArrayList<>(); + for (Map.Entry entry : tempCardList.entrySet()) { + if (entry.getValue() == 0) + { + clearCardList.add(entry.getKey()); + } + } + + for(int i = 0; i < clearCardList.size(); i++) + { + tempCardList.remove(clearCardList.get(i)); + } + + //变量定义 + List tagAnalyseItemList = new ArrayList(); + List wChiHuKind = new ArrayList(); + + //分析麻将 + AnalyseCard(tempCardList, opCards, tagAnalyseItemList, config); + + //胡牌分析 + if (tagAnalyseItemList.size() > 0) + { + //牌型分析 + for (int i = 0;i < tagAnalyseItemList.size();i++) + { + //变量定义 + boolean bLianCard=false,bPengCard=false,b258Card=false; + TagAnalyseItem pAnalyseItem= tagAnalyseItemList.get(i); + + if (pAnalyseItem.huxi < 11) + { + if (this.zi_mo || this.zi_mo == false && config.getInt(Config.ROOM_CONFIG_QING_ZUI_HU) > 0) + { + boolean erxiaosheng = false; + boolean bajiuzi = false; + boolean jiazuoren = false; + for (int j = 0;j < pAnalyseItem.cbOpCard.size(); j++) { + OpCard cbWeaveKind = pAnalyseItem.cbOpCard.get(j); + if (cbWeaveKind.type == RuleWeight.TYPE_CHOW) { + if (cbWeaveKind.card % 100 == 5) + { + erxiaosheng = true; + } + else if (cbWeaveKind.card % 100 == 6) + { + bajiuzi = true; + } + else if (cbWeaveKind.card % 100 == 7) + { + jiazuoren = true; + } + } + } + + if (erxiaosheng == false || bajiuzi == false || jiazuoren == false) + { + continue; + } + } + else { + continue; + } + } + + //牌型分析 + for (int j = 0;j < pAnalyseItem.cbOpCard.size(); j++) { + OpCard cbWeaveKind = pAnalyseItem.cbOpCard.get(j); + if (cbWeaveKind.type == RuleWeight.TYPE_PONG + || cbWeaveKind.type == RuleWeight.TYPE_KONG + || cbWeaveKind.type == RuleWeight.TYPE_SELF_KONG + || cbWeaveKind.type == RuleWeight.TYPE_ZHAO + || cbWeaveKind.type == RuleWeight.TYPE_SELF_ZHAO) { + bPengCard = true; + } + + if (cbWeaveKind.type == RuleWeight.TYPE_CHOW) { + bLianCard = true; + } + } + + //牌型判断 + if (bLianCard==false && bPengCard==false) + { + return false; + } + + if (bLianCard && bPengCard == false) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else if (bLianCard && bPengCard) + { + if (config.getBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else + { + wChiHuKind.add(WinCardType.JIHU); + putWinCardType(map, WinCardType.JIHU, 1,WinCardType.JIHU_SCORE, false, "鸡胡"); + } + } + + //特殊--碰碰胡 + if ((bLianCard==false)&&(bPengCard==true)) + { + if (config.getBoolean(Config.ROOM_CONFIG_PENGPENGHU)) + { + if (config.getBoolean(Config.ROOM_CONFIG_SPECIAL_PENG_PENG_HU)) + { + if (pAnalyseItem.cbCardEye > 0 && pAnalyseItem.cbCardEyeList.size() == 0) + { + if (config.getBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else + { + wChiHuKind.add(WinCardType.JIHU); + putWinCardType(map, WinCardType.JIHU, 1,WinCardType.JIHU_SCORE, false, "鸡胡"); + } + } + else if (pAnalyseItem.cbCardEyeList.size() > 0) + { + boolean flag = true; + for(int x = 0; x < pAnalyseItem.cbCardEyeList.size(); x++) + { + ITArray xCardList = pAnalyseItem.cbCardEyeList.get(x); + int card1 = xCardList.getInt(0); + int card2 = xCardList.getInt(1); + if (card1 != card2) + { + if (card1 % 100 != 4 && card2 % 100 != 4) + { + flag = false; + } + } + } + + if (flag) + { + wChiHuKind.add(WinCardType.PENGPENGHU); + putWinCardType(map, WinCardType.PENGPENGHU, 1,WinCardType.PENGPENGHU_SCORE, true, "碰碰胡"); + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else + { + wChiHuKind.add(WinCardType.JIHU); + putWinCardType(map, WinCardType.JIHU, 1,WinCardType.JIHU_SCORE, false, "鸡胡"); + } + } + } + } + else { + if (pAnalyseItem.cbCardEyeList.size() > 0) + { + boolean flag = true; + for(int x = 0; x < pAnalyseItem.cbCardEyeList.size(); x++) + { + ITArray xCardList = pAnalyseItem.cbCardEyeList.get(x); + int card1 = xCardList.getInt(0); + int card2 = xCardList.getInt(1); + if (card1 != card2) + { + if (card1 % 100 != 4 && card2 % 100 != 4) + { + flag = false; + } + } + } + + if (flag) + { + wChiHuKind.add(WinCardType.PENGPENGHU); + putWinCardType(map, WinCardType.PENGPENGHU, 1,WinCardType.PENGPENGHU_SCORE, true, "碰碰胡"); + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else + { + wChiHuKind.add(WinCardType.JIHU); + putWinCardType(map, WinCardType.JIHU, 1,WinCardType.JIHU_SCORE, false, "鸡胡"); + } + } + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else + { + wChiHuKind.add(WinCardType.JIHU); + putWinCardType(map, WinCardType.JIHU, 1,WinCardType.JIHU_SCORE, false, "鸡胡"); + } + } + } + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_JIHU_SHI_PINGHU)) + { + wChiHuKind.add(WinCardType.PINGHU); + putWinCardType(map, WinCardType.PINGHU, 1,WinCardType.PINGHU_SCORE, false, "平胡"); + } + else + { + wChiHuKind.add(WinCardType.JIHU); + putWinCardType(map, WinCardType.JIHU, 1,WinCardType.JIHU_SCORE, false, "鸡胡"); + } + } + } + } + } + + //结果判断 + if (wChiHuKind.size() > 0) + { + return true; + } + + return false; + } + + public boolean IsShangFu(int card) + { + if (card == 101 || card == 801) + { + return true; + } + return false; + } + + public boolean IsDaRen(int card) + { + if (card == 102 || card == 103) + { + return true; + } + return false; + } + + boolean IsLuShou(int card) + { + if (card == 802 || card == 803) + { + return true; + } + return false; + } + + public boolean IsDaRenLuShou(int card) + { + if (card == 102 || card == 103 || card == 802 || card == 803) + { + return true; + } + return false; + } + + public boolean IsShangDaRen(int card) + { + if (card / 100 == 1) + { + return true; + } + return false; + } + + public boolean IsFuLuShou(int card) + { + if (card / 100 == 8) + { + return true; + } + return false; + } + + public boolean IsShangDaRenFuLuShou(int card) + { + if (card / 100 == 1 || card / 100 == 8) + { + return true; + } + return false; + } + + public boolean AnalyseCardFuLuShou(int cbLessKindItem, TagKindItem[] pKindItem, int eyeCard, List opCards, List tagAnalyseItemList, ITObject config) { + //变量定义 + TagAnalyseItem AnalyseItem = new TagAnalyseItem(); + + //设置结果 + for (int i = 0; i < opCards.size(); i++) { + OpCard src_card = opCards.get(i); + OpCard op_card = new OpCard(src_card.type, src_card.card); + AnalyseItem.cbOpCard.add(src_card); + if (src_card.type == RuleWeight.TYPE_CHOW) + { + if (IsShangDaRenFuLuShou(src_card.card)) + { + AnalyseItem.huxi += 4; + } + } + else if (src_card.type == RuleWeight.TYPE_PONG) + { + if (IsShangFu(src_card.card)) + { + AnalyseItem.huxi += 3 * 4; + } + else { + AnalyseItem.huxi += 2; + } + } + else + { + if (IsShangFu(src_card.card)) + { + AnalyseItem.huxi += 4 * 4; + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) + { + AnalyseItem.huxi += 6; + } + else { + AnalyseItem.huxi += 4; + } + } + } + } + + //设置牌型 + boolean useOther = false; + boolean usePong = false; + if (pKindItem != null) + { + for (int i = 0; i < cbLessKindItem; i++) { + OpCard op_card = new OpCard(pKindItem[i].type, pKindItem[i].card); + AnalyseItem.cbOpCard.add(op_card); + if (op_card.type == RuleWeight.TYPE_CHOW) + { + if (IsShangDaRenFuLuShou(op_card.card)) + { + AnalyseItem.huxi += 4; + } + if (!this.selfCard && (pKindItem[i].cbCardList[0] == this.addCard) || (pKindItem[i].cbCardList[1] == this.addCard) || (pKindItem[i].cbCardList[2] == this.addCard)) + { + useOther = true; + } + } + else if (op_card.type == RuleWeight.TYPE_PONG) + { + if (IsShangFu(op_card.card)) + { + AnalyseItem.huxi += 3 * 4; + } + else { + AnalyseItem.huxi += 3; + if (!this.selfCard && op_card.card == this.addCard) + { + usePong = true; + } + } + } + else + { + if (!this.selfCard && op_card.card == this.addCard) + { + useOther = true; + } + if (IsShangFu(op_card.card)) + { + AnalyseItem.huxi += 4 * 4; + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) + { + AnalyseItem.huxi += 6; + } + else { + AnalyseItem.huxi += 4; + } + } + } + } + } + + if (eyeCard > 0) { + AnalyseItem.cbCardEye = eyeCard; + if (!this.selfCard && eyeCard == this.addCard) + { + useOther = true; + } + if (IsShangFu(eyeCard)) + { + AnalyseItem.huxi += 8; + } + else if (IsDaRenLuShou(eyeCard)) { + AnalyseItem.huxi += 4; + } + else if (eyeCard == 104 || eyeCard == 804) + { + AnalyseItem.huxi += 8; + } + } + + if (useOther == false && usePong) + { + AnalyseItem.huxi -= 1; + } + + //插入结果 + tagAnalyseItemList.add(AnalyseItem); + if (AnalyseItem.huxi >= 11) + { + return true; + } + return false; + } + + public boolean AnalyseCardFuLuShouJiang(int cbLessKindItem, TagKindItem[] pKindItem, int card1, int card2, int card3, int card4, List opCards, List tagAnalyseItemList, ITObject config) { + //变量定义 + TagAnalyseItem AnalyseItem = new TagAnalyseItem(); + + //设置结果 + //设置结果 + boolean diJin = false; + boolean shangDaRenFuLuShou = false; + boolean ban_shangDaRenFuLuShou = false; + boolean hasKan = false; + for (int i = 0; i < opCards.size(); i++) { + OpCard src_card = opCards.get(i); + OpCard op_card = new OpCard(src_card.type, src_card.card); + AnalyseItem.cbOpCard.add(src_card); + if (src_card.type == RuleWeight.TYPE_CHOW) + { + if (IsShangDaRenFuLuShou(src_card.card)) + { + shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + } + else if (src_card.type == RuleWeight.TYPE_PONG) + { + hasKan = true; + if (IsShangFu(src_card.card)) + { + AnalyseItem.huxi += 3 * 4; + } + else { + AnalyseItem.huxi += 2; + } + } + else + { + hasKan = true; + if (IsShangFu(src_card.card)) + { + AnalyseItem.huxi += 4 * 4; + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) + { + AnalyseItem.huxi += 6; + } + else { + AnalyseItem.huxi += 4; + } + } + } + } + + //设置牌型 + boolean useOther = false; + boolean usePong = false; + if (pKindItem != null) + { + for (int i = 0; i < cbLessKindItem; i++) { + OpCard op_card = new OpCard(pKindItem[i].type, pKindItem[i].card); + AnalyseItem.cbOpCard.add(op_card); + if (op_card.type == RuleWeight.TYPE_CHOW) + { + if (IsShangDaRenFuLuShou(op_card.card)) + { + shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + if (!this.selfCard && (pKindItem[i].cbCardList[0] == this.addCard) || (pKindItem[i].cbCardList[1] == this.addCard) || (pKindItem[i].cbCardList[2] == this.addCard)) + { + useOther = true; + } + } + else if (op_card.type == RuleWeight.TYPE_PONG) + { + hasKan = true; + if (IsShangFu(op_card.card)) + { + AnalyseItem.huxi += 3 * 4; + } + else { + AnalyseItem.huxi += 3; + if (!this.selfCard && op_card.card == this.addCard) + { + usePong = true; + } + } + } + else + { + if (!this.selfCard && op_card.card == this.addCard) + { + useOther = true; + } + hasKan = true; + if (IsShangFu(op_card.card)) + { + AnalyseItem.huxi += 4 * 4; + } + else { + if (config.getBoolean(Config.ROOM_CONFIG_GANG_ZHAO_LIU_XI)) + { + AnalyseItem.huxi += 6; + } + else { + AnalyseItem.huxi += 4; + } + } + } + } + } + + ITArray eyeCard1 = new TArray(); + eyeCard1.addInt(card1); + eyeCard1.addInt(card2); + AnalyseItem.cbCardEyeList.add(eyeCard1); + + ITArray eyeCard2 = new TArray(); + eyeCard2.addInt(card3); + eyeCard2.addInt(card4); + AnalyseItem.cbCardEyeList.add(eyeCard2); + + if (!this.selfCard && (card1 == this.addCard || card2 == this.addCard || card3 == this.addCard || card4 == this.addCard)) + { + useOther = true; + } + + //一对上、福,就可以胡了 + if (card1 == card2 && IsShangFu(card1)) + { + AnalyseItem.huxi += 12; + } + else if (card1 == card2 && (card1 == 104 || card1 == 804)) + { + AnalyseItem.huxi += 12; + } + else if (card1 == 101 && card2 == 104 || card2 == 101 && card1 == 104) + { + AnalyseItem.huxi += 12; + } + else if (card1 == 801 && card2 == 804 || card2 == 801 && card1 == 804) + { + AnalyseItem.huxi += 12; + } + else if ((card1 == 101 || card2 == 101 ) && card1 != card2) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + else if ((card1 == 104 || card2 == 104 ) && card1 != card2) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + else if ((card1 == 801 || card2 == 801 ) && card1 != card2) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + else if ((card1 == 804 || card2 == 804 ) && card1 != card2) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + + if (card3 == card4 && IsShangFu(card3)) + { + AnalyseItem.huxi += 12; + } + else if (card3 == card4 && (card3 == 104 || card3 == 804)) + { + AnalyseItem.huxi += 12; + } + else if (card3 == 101 && card4 == 104 || card4 == 101 && card3 == 104) + { + AnalyseItem.huxi += 12; + } + else if (card3 == 801 && card4 == 804 || card4 == 801 && card3 == 804) + { + AnalyseItem.huxi += 12; + } + else if ((card3 == 101 || card4 == 101) && card3 != card4) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + else if ((card3 == 104 || card4 == 104) && card3 != card4) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + else if ((card3 == 801 || card4 == 801) && card3 != card4) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + else if ((card3 == 804 || card4 == 804) && card3 != card4) + { + ban_shangDaRenFuLuShou = true; + AnalyseItem.huxi += 4; + } + + if (shangDaRenFuLuShou || ban_shangDaRenFuLuShou || hasKan) { + if (card1 != card2 && IsDaRen(card1) && IsDaRen(card2) || card3 != card4 && IsDaRen(card3) && IsDaRen(card4)) + { + if (!diJin) { + diJin = true; + AnalyseItem.huxi += 4; + } + } + if (card1 != card2 && IsLuShou(card1) && IsLuShou(card2) || card3 != card4 && IsLuShou(card3) && IsLuShou(card4)) + { + if (!diJin) { + diJin = true; + AnalyseItem.huxi += 4; + } + } + if ((card1 == card2 && !IsShangFu(card1) && card1 != 104 && card1 != 804) || + (card3 == card4 && !IsShangFu(card3) && card3 != 104 && card3 != 804)) + { + if (!diJin) { + diJin = true; + AnalyseItem.huxi += 3; + } + } + else if ((card1 != card2 && ((card1 / 100 != 1 && card1 / 100 != 8 && card1 % 100 == 4) || (card2 / 100 != 1 && card2 / 100 != 8 && card2 % 100 == 4)) && !IsShangFu(card1)) || + (card3 != card4 && ((card3 / 100 != 1 && card3 / 100 != 8 && card3 % 100 == 4) || (card4 / 100 != 1 && card4 / 100 != 8 && card4 % 100 == 4)) && !IsShangFu(card3))) + { + if (!diJin) { + diJin = true; + AnalyseItem.huxi += 3; + } + } + } + + if (useOther == false && usePong) + { + AnalyseItem.huxi -= 1; + } + + //插入结果 + tagAnalyseItemList.add(AnalyseItem); + if (AnalyseItem.huxi >= 11) + { + return true; + } + return false; + } + + boolean AnalyseCard(Map tempCardList, List opCards, List tagAnalyseItemList, ITObject config) { + //计算数目 + int cbCardCount = 0; + for (Map.Entry entry : tempCardList.entrySet()) { + cbCardCount += entry.getValue(); + } + + //效验数目 + if ((cbCardCount < 1) || (cbCardCount > 19)) { + return false; + } + + //变量定义 + List tagKindList = new ArrayList(); + + do { + int cbLessKindItem = (cbCardCount - 1) / 3; + if (cbLessKindItem + opCards.size() != 6) { + break; + } + + //单吊判断 + if (cbLessKindItem == 0) { + //效验参数 + if (!((cbCardCount == 1) && (opCards.size() == 6))) { + return false; + } + + //牌眼判断 + for (Map.Entry entry : tempCardList.entrySet()) { + int card = entry.getKey(); + int num = entry.getValue(); + if (num == 1) { + return AnalyseCardFuLuShou(cbLessKindItem, null, card, opCards, tagAnalyseItemList, config); + } + } + + return false; + } + + //拆分分析 + if (cbCardCount >= 3) { + for (Map.Entry entry : tempCardList.entrySet()) { + int card = entry.getKey(); + int num = entry.getValue(); + //同牌判断 + if (num >= 2 && tempCardList.getOrDefault(card / 100 * 100 + 4, 0) == 1) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_PONG; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card; + kindItem.cbCardList[2] = card / 100 * 100 + 4; + tagKindList.add(kindItem); + } + + if (num >= 3) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_PONG; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card; + kindItem.cbCardList[2] = card; + tagKindList.add(kindItem); + } + + //连牌判断 + if (card % 100 >= 1 && card % 100 <= 4 && num > 0) { + for (int i = 1; i <= num; i++) { + if (tempCardList.getOrDefault(card + 1, 0) >= i && tempCardList.getOrDefault(card + 2, 0) >= i && (card+1)%100 != 4 && (card+2)%100 != 4) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_CHOW; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card + 1; + kindItem.cbCardList[2] = card + 2; + tagKindList.add(kindItem); + } + if (tempCardList.getOrDefault(card + 1, 0) >= i && (card+1)%100 != 4 && tempCardList.getOrDefault(card / 100 * 100 + 4, 0) >= i) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_CHOW; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card + 1; + kindItem.cbCardList[2] = card / 100 * 100 + 4; + tagKindList.add(kindItem); + } + if (tempCardList.getOrDefault(card + 2, 0) >= i && (card+2)%100 != 4 && tempCardList.getOrDefault(card / 100 * 100 + 4, 0) >= i) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_CHOW; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card / 100 * 100 + 4; + kindItem.cbCardList[2] = card + 2; + tagKindList.add(kindItem); + } + } + } + } + } + + //组合分析 + if (tagKindList.size() >= cbLessKindItem) { + //变量定义 + Integer[] cbIndex = new Integer[6]; //{0,1,2,3}; + cbIndex[0] = 0; + cbIndex[1] = 1; + cbIndex[2] = 2; + cbIndex[3] = 3; + cbIndex[4] = 4; + cbIndex[5] = 5; + + TagKindItem[] pKindItem = new TagKindItem[6]; + pKindItem[0] = null; + pKindItem[1] = null; + pKindItem[2] = null; + pKindItem[3] = null; + pKindItem[4] = null; + pKindItem[5] = null; + + int count = 0; + //开始组合 + do { + count++; + //设置变量 + Map cbCardMap_temp = new HashMap(); + cbCardMap_temp.putAll(tempCardList); + + for (int i = 0; i < cbLessKindItem; i++) { + pKindItem[i] = tagKindList.get(cbIndex[i]); + } + + //数量判断 + boolean bEnoughCard = true; + for (int i = 0; i < cbLessKindItem * 3; i++) { + //存在判断 + int cbCardIndex = pKindItem[i / 3].cbCardList[i % 3]; + if (cbCardMap_temp.getOrDefault(cbCardIndex, 0) <= 0) { + bEnoughCard = false; + break; + } else { + if (cbCardMap_temp.containsKey(cbCardIndex)) { + cbCardMap_temp.put(cbCardIndex, cbCardMap_temp.get(cbCardIndex) - 1); + } + } + } + + //胡牌判断 + if (bEnoughCard == true) { + //牌眼判断 + int cbCardEye = 0; + for (Map.Entry entry : cbCardMap_temp.entrySet()) { + int card = entry.getKey(); + int num = entry.getValue(); + if (num == 1) { + cbCardEye = card; + break; + } + } + + //组合类型 + if (cbCardEye != 0) { + boolean result = AnalyseCardFuLuShou(cbLessKindItem, pKindItem, cbCardEye, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + } + + //设置索引 + if (cbIndex[cbLessKindItem - 1] == (tagKindList.size() - 1)) { + int i = cbLessKindItem - 1; + for (; i > 0; i--) { + if ((cbIndex[i - 1] + 1) != cbIndex[i]) { + int cbNewIndex = cbIndex[i - 1]; + for (int j = (i - 1); j < cbLessKindItem; j++) { + cbIndex[j] = cbNewIndex + j - i + 2; + } + break; + } + } + if (i == 0) break; + } else { + cbIndex[cbLessKindItem - 1]++; + } + + } while (true); + //Global.logger.info("count:" + count); + } + + if (tagAnalyseItemList.size() > 0) { + break; + } + } + while (false); + tagKindList.clear(); + + do { + int cbLessKindItem = (cbCardCount - 4) / 3; + if (cbLessKindItem + opCards.size() != 5) { + break; + } + + //单吊判断 + if (cbLessKindItem == 0) { + //效验参数 + if (!((cbCardCount == 4) && (opCards.size() == 5))) { + return false; + } + + //牌眼判断 + ArrayList eyeList = new ArrayList(); + ArrayList eyeCardList = new ArrayList(); + for (Map.Entry entry : tempCardList.entrySet()) { + int card = entry.getKey(); + int num = entry.getValue(); + if (num > 0) { + for(int i = 0; i < num; i++) + { + eyeCardList.add(card); + } + } + } + + if (eyeCardList.size() != 4) + { + return false; + } + + if (eyeCardList.get(0) / 100 == eyeCardList.get(1) / 100 && eyeCardList.get(2) / 100 == eyeCardList.get(3) / 100) + { + int card1 = eyeCardList.get(0); + int card2 = eyeCardList.get(1); + int card3 = eyeCardList.get(2); + int card4 = eyeCardList.get(3); + + boolean result = AnalyseCardFuLuShouJiang(cbLessKindItem, null, card1, card2, card3, card4, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + + if (eyeCardList.get(0) / 100 == eyeCardList.get(2) / 100 && eyeCardList.get(1) / 100 == eyeCardList.get(3) / 100) + { + int card1 = eyeCardList.get(0); + int card2 = eyeCardList.get(2); + int card3 = eyeCardList.get(1); + int card4 = eyeCardList.get(3); + + boolean result = AnalyseCardFuLuShouJiang(cbLessKindItem, null, card1, card2, card3, card4, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + + if (eyeCardList.get(0) / 100 == eyeCardList.get(3) / 100 && eyeCardList.get(2) / 100 == eyeCardList.get(1) / 100) + { + int card1 = eyeCardList.get(0); + int card2 = eyeCardList.get(3); + int card3 = eyeCardList.get(2); + int card4 = eyeCardList.get(1); + + boolean result = AnalyseCardFuLuShouJiang(cbLessKindItem, null, card1, card2, card3, card4, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + + if (tagAnalyseItemList.size() > 0) + { + return true; + } + else { + return false; + } + } + + //拆分分析 + if (cbCardCount >= 3) { + for (Map.Entry entry : tempCardList.entrySet()) { + int card = entry.getKey(); + int num = entry.getValue(); + //同牌判断 + if (num >= 2 && tempCardList.getOrDefault(card / 100 * 100 + 4, 0) == 1) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_PONG; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card; + kindItem.cbCardList[2] = card / 100 * 100 + 4; + tagKindList.add(kindItem); + } + + if (num >= 3) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_PONG; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card; + kindItem.cbCardList[2] = card; + tagKindList.add(kindItem); + } + + //连牌判断 + if (card % 100 >= 1 && card % 100 <= 4 && num > 0) { + for (int i = 1; i <= num; i++) { + if (tempCardList.getOrDefault(card + 1, 0) >= i && tempCardList.getOrDefault(card + 2, 0) >= i && (card+1)%100 != 4 && (card+2)%100 != 4) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_CHOW; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card + 1; + kindItem.cbCardList[2] = card + 2; + tagKindList.add(kindItem); + } + if (tempCardList.getOrDefault(card + 1, 0) >= i && (card+1)%100 != 4 && tempCardList.getOrDefault(card / 100 * 100 + 4, 0) >= i) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_CHOW; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card + 1; + kindItem.cbCardList[2] = card / 100 * 100 + 4; + tagKindList.add(kindItem); + } + if (tempCardList.getOrDefault(card + 2, 0) >= i && (card+2)%100 != 4 && tempCardList.getOrDefault(card / 100 * 100 + 4, 0) >= i) { + TagKindItem kindItem = new TagKindItem(); + kindItem.type = RuleWeight.TYPE_CHOW; + kindItem.card = card; + kindItem.cbCardList[0] = card; + kindItem.cbCardList[1] = card / 100 * 100 + 4; + kindItem.cbCardList[2] = card + 2; + tagKindList.add(kindItem); + } + } + } + } + } + + //组合分析 + if (tagKindList.size() >= cbLessKindItem) { + //变量定义 + Integer[] cbIndex = new Integer[5]; //{0,1,2,3}; + cbIndex[0] = 0; + cbIndex[1] = 1; + cbIndex[2] = 2; + cbIndex[3] = 3; + cbIndex[4] = 4; + + TagKindItem[] pKindItem = new TagKindItem[5]; + pKindItem[0] = null; + pKindItem[1] = null; + pKindItem[2] = null; + pKindItem[3] = null; + pKindItem[4] = null; + + //开始组合 + int count = 0; + do { + count++; + //设置变量 + Map cbCardMap_temp = new HashMap(); + cbCardMap_temp.putAll(tempCardList); + + for (int i = 0; i < cbLessKindItem; i++) { + pKindItem[i] = tagKindList.get(cbIndex[i]); + } + + //数量判断 + boolean bEnoughCard = true; + for (int i = 0; i < cbLessKindItem * 3; i++) { + //存在判断 + int cbCardIndex = pKindItem[i / 3].cbCardList[i % 3]; + if (cbCardMap_temp.getOrDefault(cbCardIndex, 0) <= 0) { + bEnoughCard = false; + break; + } else { + if (cbCardMap_temp.containsKey(cbCardIndex)) { + cbCardMap_temp.put(cbCardIndex, cbCardMap_temp.get(cbCardIndex) - 1); + } + } + } + + //胡牌判断 + if (bEnoughCard == true) { + //牌眼判断 + ArrayList eyeList = new ArrayList(); + ArrayList eyeCardList = new ArrayList(); + for (Map.Entry entry : cbCardMap_temp.entrySet()) { + int card = entry.getKey(); + int num = entry.getValue(); + if (num > 0) { + for(int i = 0; i < num; i++) + { + eyeCardList.add(card); + } + } + } + + if (eyeCardList.size() != 4) + { + return false; + } + + if (eyeCardList.get(0) / 100 == eyeCardList.get(1) / 100 && eyeCardList.get(2) / 100 == eyeCardList.get(3) / 100) + { + int card1 = eyeCardList.get(0); + int card2 = eyeCardList.get(1); + int card3 = eyeCardList.get(2); + int card4 = eyeCardList.get(3); + + boolean result = AnalyseCardFuLuShouJiang(cbLessKindItem, pKindItem, card1, card2, card3, card4, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + + if (eyeCardList.get(0) / 100 == eyeCardList.get(2) / 100 && eyeCardList.get(1) / 100 == eyeCardList.get(3) / 100) + { + int card1 = eyeCardList.get(0); + int card2 = eyeCardList.get(2); + int card3 = eyeCardList.get(1); + int card4 = eyeCardList.get(3); + + boolean result = AnalyseCardFuLuShouJiang(cbLessKindItem, pKindItem, card1, card2, card3, card4, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + + if (eyeCardList.get(0) / 100 == eyeCardList.get(3) / 100 && eyeCardList.get(2) / 100 == eyeCardList.get(1) / 100) + { + int card1 = eyeCardList.get(0); + int card2 = eyeCardList.get(3); + int card3 = eyeCardList.get(2); + int card4 = eyeCardList.get(1); + + boolean result = AnalyseCardFuLuShouJiang(cbLessKindItem, pKindItem, card1, card2, card3, card4, opCards, tagAnalyseItemList, config); + if (ting_pai && result) + { + return true; + } + } + } + + //设置索引 + if (cbIndex[cbLessKindItem - 1] == (tagKindList.size() - 1)) { + int i = cbLessKindItem - 1; + for (; i > 0; i--) { + if ((cbIndex[i - 1] + 1) != cbIndex[i]) { + int cbNewIndex = cbIndex[i - 1]; + for (int j = (i - 1); j < cbLessKindItem; j++) { + cbIndex[j] = cbNewIndex + j - i + 2; + } + break; + } + } + if (i == 0) break; + } else { + cbIndex[cbLessKindItem - 1]++; + } + + } while (true); + //Global.logger.info("count:" + count); + } + + if (tagAnalyseItemList.size() > 0) { + break; + } + } + while (false); + + if (tagAnalyseItemList.size() > 0) { + return true; + } + return false; + } +} diff --git a/robots/zhipai/game_mj_fulushou/src/test/java/game_mj_fulushou/Main.java b/robots/zhipai/game_mj_fulushou/src/test/java/game_mj_fulushou/Main.java new file mode 100644 index 0000000..3ff39ef --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/src/test/java/game_mj_fulushou/Main.java @@ -0,0 +1,9 @@ +package game_mj_fulushou; + +import com.taurus.permanent.TPServer; + +public class Main { + public static void main(String[] args) { + TPServer.me().start(); + } +} diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/CardNiao.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/CardNiao.class new file mode 100644 index 0000000000000000000000000000000000000000..66fc356fe3eb9c4e13d9a6fc3a0cb905bc7edea7 GIT binary patch literal 822 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 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXActionEvent.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXActionEvent.class new file mode 100644 index 0000000000000000000000000000000000000000..a65dfc8a62c54e577f8dc28204f2a89a8f14df48 GIT binary patch literal 701 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 CCuQpZ literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXPlayBack.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXPlayBack.class new file mode 100644 index 0000000000000000000000000000000000000000..bf4b8c0785063d640d99c4da190882650006a6ed GIT binary patch literal 3009 zcma)8TUQfT7~Ml|lQ01sAR19F;w1zy)nY9~QxVXn0$RaKZ7m&=0S1$qG?}Q_`^Da` zKcesLTC7(4(AB3t^r63~tE>CW3;U->b#x1-m_FjwNb`&yRk6{6C$k4>jqKrZmMd(p1VOhqCIAO%FiaRpK zWMpNOV#F-VFlAUWDl#TyOv-puMpZ^lhApEW!QBY%NeG`YOvBDe=uA!P_if!QX3DFX zshd|VtDGIUE+IH!6?F-%(}ty9RyD-8w-~fnjGBZ*1J;$2 zwsu}C+{qHHN?Z~9A1(>;W!)A>^=jT+vLuYArVCa%v#gc%Oi{D7jJuf~aF%VYUai+M z1*@uObkjEMwM>5g^5Uvqu*nmyI6y+lwipru*5ay!zFlBR6$u>;f;}M;Vg;>Q%$qBk zS(MQGbgc1eRa>L1JzBANQMV@;HDQ&@PFOgV&*vSdYr1Ajkn*%i;1a&1FWCzPt8Q{V zC_Hc>F4r3&LWB?qorL%HE?MTXPjNVv|37Uayp7@G1>3MpKk}Fmx2xcwy;fmYM3<^o zdBM%3*{X;qk=zdDMyxWte8n%KC}PH&Uz4tIz@ru?nd$6tHmUlbAt?=YW7_%)9Jn)q{Hdhi!W>2)-z zfx&eIe@5sr!U6omy(S#xvxO(cGlW*`MH`OsE8)f>g#msM1!)WtIVgtJWB7q_A?{@b zLu6*~cgVBD>xe!=Y%DmWHYbCRp#(6b#>v~Vj#h_vNNwYxJ?{ID40lCzBf|G~gwcU! zbn=-%H{}eIdK5`V)QC&xi^}3SG87ZWDLjJ{L~7>GlX#ZGIv6p+^&t13!)Z_QLw*a% z{g0rI1(QLw{eUBcZyg7nx3t>Xm840DO@9(j$U#24=}-^F^wROZEt2|uN&R@9awS2* zyKdBRu^(B!39q_whBAeuv&eapR{0&|`2;1+4sQrbt9!eK8&s&ysUv(IMV#E7m(M zD0NPhAe;=V?XK~B+wT=4tafz<-MWPSKnr&cB-ym=rL=mmD;f5D2{_$*h=0m~u7+6n zR+c`=vL9yQ2UzwI7XB>#5I()=vid&de4lcd@G6ya923)!!z9;4U2>QrT8RHgae+Kx zT;!?@>2High$~6_Y+pSgO=ryGf*gOvwU%1R@|2r$0bZVHbxy{ zQN9_>dQ_K)B7{cMYERctL#M=?t~*DK;|@iyd(fwd`V>)IcE(1+mF<9gw*{Ug@YJq> KU#7+;T>TebvUl$Q literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXPlayer.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXPlayer.class new file mode 100644 index 0000000000000000000000000000000000000000..395d87e12801899a551daa6e04e39cdf7a4369a3 GIT binary patch literal 5950 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 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXRoom.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/EXRoom.class new file mode 100644 index 0000000000000000000000000000000000000000..603939dec05126fea818150a09ac35aebb2f8f31 GIT binary patch literal 15409 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 KFHoWZFMbR3hknxl literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/RoomCard.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/RoomCard.class new file mode 100644 index 0000000000000000000000000000000000000000..9d5b324634b2bb760653c3691e44a1e027a634a3 GIT binary patch literal 4398 zcma)AZFf{x6@Jd0mphrh zn!L;vOcbM-!dGQ*I*KzmE7CLdcotui=9~=AOY?O({2L-YCkGYkZ~+%hT#8~9Mk9D$ z`fp0}tq5Kajq@`2b`;;icV+lo9lnR}OY?&WekcfjWa32=FDXQlb}lvO<_ik3!ISos zohTOEbV6o!Dbx+QV;Q?p%sC3{<}CNbOk2HL5xn@KsR30)0P*&8S{3>EC; zsRQ<;Z=$ZGPrYE;yUvhw9D4mW1v5Wh932&qrkfuW(x}=ou<g%B+buoSt0HnTAel~ zUbXOZyk_AFeqrKu(LQY9m$*tQExdtWS@<=6V__OkTKFyAv~W$N-{DOYZ&~;~{-Ch5 za_mqc=Vr$C7Tt8p$f0nwIs&pNyJSokB}mgXG=>p{}3=Vjqt{K>?13pX%h z;--aL*l%GL`)NWB65V-+J%J~AJC%elk;&|;z&bQ?(n<0%n<}gh6r7x0$P(nD%A~{^ zgLKMH7o9_+3^NAlf{7hUrX8Dm19pnZ&s?2rYnKGKM&MO7?-CifVLPvltm}AUflc#c zEKCc1X-43(>X`1&rqlGu&1O79%@r3aE3_7I%U-tB1ZT;676EhI&L1RyUJ^(~X1u|Y zlD-!%nm{SBa*0%Bf{5QW^purYLJCKOL;9O@CbCl$8k5FgLQ zx5COnSu5DZTrrMJ>L$%aKA>Pq9GO zcwZq&cH30HxTjrI=_$lef>K;!@%d+u16i)W(3iKMl8j0+=tazh7FVw zXeGK8)LV&OYPD$F=)+!)hywlei4`3WVV{q1$QuL8I@;r{C>}r#bbDgZ_1Dg=o|P4DF|?FJlNA3i@br6!0r|1RqPdeu~h4L z@C03-Ma;m_(o|^vRJbyA(NNQO|5DO5s}>X&t_a>h6;&G$K?kYYNW`7I$}a5Z_#m&{ zCTU|Nt(QC6xFRktV95S-A2kYHb` zf&DMNT0^iuM}o_+jbW`vf{$ydF|NrXtp_DIyJoT2kLgVnv0ICkq*}$=BemulwyCGE z-B8$J@Z-W*ik(I~zb|^Z+Ns0J55#Ng3?mH@CMEoXXfBD#l|+{f@J zQXHQoUla7Vmm0$J2G+BD_v*+H$%J;E~FT?7lwi&Du2R$lg(B8CGPp}~0 z&*2Q#&0u|?r>t@rTf}#+`YZ%yutC$+GmUjz3(MbiblkwkX)KYAfmxKf>uHr+)#XyN zbb?rI#^VSvCdoqz$1#diaQXA}RMm~2^BLL7SkyNz{znkFgX1a|qmN&{r>C8t+EelF zGPVnJkCw}x8#R8dpXb*!nm8A#qGO(?ll1gydYWS%9AV7 zh@L)G_OypLDj6rnHCjPI2Tsh*p7Wjs9YIayy!#4H@C1pDSJ=z5x!(V18051VYr2Z1 zU1Y9{B}YG*-edUBuD7YFV_iSe7kCqw_*^~D{}i~yC;A1?nttS#drzAoXZv;|)Us=$ dTF;cC+Jf;hq9#W8>MiqQIY~cLJcCc={{gBuvupqW literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/RuleWeight.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/RuleWeight.class new file mode 100644 index 0000000000000000000000000000000000000000..18b0c7684bfdc260768626d571995991f4e0584f GIT binary patch literal 745 zcmZvZTT23A5Qg9JtXZ0woey?YgZ8GoA_%FJM5RKh8(H;3SJoADjs8|wK^OgiepEEy zy3&_)GtBeO?Dx*hetmy@0yx7-1YTr<$Oe%k`0|BHoj^sxe12e!Y~8YJx;YkJZYHi* zE9G06dpLhCTvcT5BZMBVOE;2PzH?hbt}L10tryF(Iqs?rmv;%_$EWIbW8yr?rOQ;G zKIbJYIE~V(F?n>-J)Oh!H*wFdTH4G907lvinmpoJ^Ta!x<+JX=(8I~xI`%N)? z)SD(NiPE5@n>BrCNOnb^-8DvpR7t$r!fI>%o_0SrMO_%3u6<63JPgLembfwG3$fqQ zX-|LAqu2p&oc!-wLR_|Jrfzk#O0y?gHq!9$?*U?1gAac2?DF^sGKUlnGe;DjV~)=7 zyuu4ykIisg;YF?|6kcLZDlGk%6_)-fg;$tY6_)d?DZI|Kq3|a2mcrY-Dal)LO!LN? i!+<~c4tjG=u*WgLGWbCI9HUO|#{mwR2uB<}IQ{{{Uui-B literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/SettleLog.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/SettleLog.class new file mode 100644 index 0000000000000000000000000000000000000000..11e41541f9d9e9e4ec523a46df81fcffbc6feac7 GIT binary patch literal 2202 zcma)8ZF3V<6n<{rHZR*Yv=F3FS_+n=Ekr6J+ERr=C6cykY7l(gq)WPOx?49JwBP;e z570m0SDaBHIOF))kNzBIe0lEOO|zLvN2W7(?>+atJm)#*-1Lusp8p2mD!xo3hb0X+ z(uiOwg%eoL;4Qo@mz#3ArC}wFByP*)P8zFtM~d%eP{O+z+(TI|YZ}%w$YMjod-D5! z1|OiJVN=700@0?^5Ev=%7>|u&+q0U*HDiBKAXTv%w&As1Q{Yt@m$Mp zEQTZ{+cO)cySPjzi6zUnyk$no7pelW6=#d?M#`3LuDADUrn_m>nv{%|ox0Ji8m=YJ zfiUK6TP=YTW%Fy#w6}_TJH?9Wc}=tIH0V3J-}VIZ`B3Pi!N};*UGqSOQkjOq3&bBA z%{Fn2g)X~!(9qc0B8~x(q+3xE7^-+ieV4=q(4!5L*e(vT7#JbtIhz}`9kWiW^Z7!# z?(7vkqwTg^#k%8~Mbq{y@1R%;l$d>-BA4mJ@AzN6WZR~@(llBvQ<2tJ&kIURlIGNQ z1kSxcfLwn`4)(ic398?172oxXwuFYNhWi5Piqm%M=Bg#DKYUo$%M!JY(>Nn=te3%E zqqR+Pb)3XY8a~o7jR!g&;$t22_@t|XuU1wuVA3X}aNl2&B2OTIu(VzxRQ@9L{|IOH|KVONwUxd|9a@Nr_=l8R6% zg7>LZsNx)7^BiA!!Ka;F&F?9mA{a-Udkz5C2}*7u${moMeF`!AD&K|(tR6DF^-Hejq`!O4Qea>*`E-bo9`eV#r>W$`AY+g(!rQ=G!;1a z9my~k@Un6~gc)3KO#s<=)}7|EX@^*2fW zZKmC&W`%}9Rs*OpcF|S5Mr7A$D|^G&dYxJl{4gSaV@$(!4R8EK>j>VYG=fEv P3#6%^<$o1d5~=?HD>U~F literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/TagAnalyseItem.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/TagAnalyseItem.class new file mode 100644 index 0000000000000000000000000000000000000000..07efdfb9676e65bf0e6ac68838991217f6254382 GIT binary patch literal 630 zcmZ`$U279T6g`uyNt0~bG^twSN3BNCJaj;OYblhX5LoO(L&3+{&5%ym?8;+;Exi|Y@|WOm$Ubtd+#}S@BH|A`yIds^qXklSp#c$?%_opyG;a3=A~!$>UdSh zYk@`*pC~*2xX=P(C=gr}mquXyo{r4i3ACfB`le*zOe#Hdz{xW+$&@QBC*S{7K8%ul zCY>s5F_%ehwbYq2ZXt)GV{6so;D`ciNqqX%n+x>+nb((2XJa{=%4JVEQ9Cr5aYq8x zx9`rm>q$PQ`DSD?{kfRM+KyD5lIcWwqSA9^jn99Rfx9qsfnKzd9;wN3rqab+51pQI zrRG^)*hGIaUZwkIdEZ|kL>Jp3LbO6O(PGo;F6E#3H62<-gNjW;bvQ{;09t)y+*}D zb#RB^%MBh}qqYj`SEb}5Vh=T9oAz5=qeFu(o=~(;(Z{TWOHu5Q^{e%W6+Ha~($$Cg literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/TagKindItem.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/TagKindItem.class new file mode 100644 index 0000000000000000000000000000000000000000..9c8a8a1fb189c627020a6c98ee6298044f66bb80 GIT binary patch literal 443 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 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleChow.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleChow.class new file mode 100644 index 0000000000000000000000000000000000000000..1af1932ef4f0d4a98cf1e41d89ceb40be1741877 GIT binary patch literal 3884 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 LdoHy{y#9X!`l=Zh literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherKongSelfWin.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherKongSelfWin.class new file mode 100644 index 0000000000000000000000000000000000000000..e5bce5f47203a13acca7eefeac2b421e1bbfd6c2 GIT binary patch literal 4794 zcmb7I3wRXO75;CsyLWdpfv^%_5ikgpJb+bHDhYxi2C^E!5*~^QPBue!U^AQU&Wfn5 z+S(U=w^o~0t$or``p}Yvh_%)}Y_)3N@7CJ-s;zx!TU)iz|IW;2CP4J-_vO3y%(>^D zbM86+IrnZJIC9rL0L~Qi;^@NFFHMj-0O57&#u{dVo_85nctCdg0@kxA2QJ+@4&nRlI8n{}A&noJ3YS^cS&&RMI zUy%4>91C%E6kk&Fm(|K0in=q3uS9VmiedFtj^iK>#p&Bf4er9>8r+Sq*5Dp|O%3-- ze7y$e;Jzrn5vL_e*WsH=)wd+R9jBf9=ovRT%_mGwKz$|3 z3OP}gEoF#F4TuCiV2qf$!fwu;?yRLP%P4f@^kUH^mq?2`MJn1F&c_834{NvtKa%*dhKsR9!%y&2fjS=r z9S(>XN)125&n14L;g|T8z@+0crs3DPf&pid^)qY5EQg)CnJv-OZ}3}*M>YHok1-g& z_COFd{2p5cv?p)9{qaM4p1AwEr}x~U;SYG6xbZgx5vAb?JgMO+JT37@4bR|D8vd+? z^YN^Pzu>PDf79@HJg4D#Y?b(jhJWH;blq3y<(W0)^Hjt(8)kpjR+?VW@NfJ_!;5%H z;$;p0#Sslhu~pgKstKq;sG&*?)oKXQm#L0nik6kdW{*@&&*Jl(2q+7qO znuv;+CgN&qRMZe~4SilL`iOHf~ ziYc0yDy9(#nn>a?O-vUjvw`@@8bzNbW~ikQEzpITN_LhwMPRWXi9pLM+PZC|E?n<) zz14o#W7*k;CK|+SDNfbI95Gj*=@m72?b6vO(0oGK6E;}F(vPLvxENl4zshA=C2yr( zRDIoFsWe4_Q^xJM6@>xlyA4oaf*-wZvuIPb&q&)wLAUcv=VYhL_Ui*is!zA|l-E2H z%HmiqQ{QjcYMr|pn*u#$wB<%9z^*4SzcJ7UT>!N;1z45VSSiS0za)H2%ig5tN(={Y zLAGyc7PqP5WS5|YmHB+m(Al$J&59?;hUJ#MV`X%=*6Zr=EwPy;R=2NR-P6UPYh(Mi zo{n|vI~mErk{u{{f#u%uoSQ`5BI$H`OW=5;C-##W*iV1rsyU}E_8MNOb%6$|GR5_f zd({T7NELYRLJDA{!sRXQTz5)B-Ml{J{7}b7B^Emuy$=V+Dvz+my*RQ)W+(j>SbFR^ z$0Xf*9E{;P@Y$l?3p2;Ttouk1sIiP)X^RDFWtivL1k@{TU{Ioc1$~!$z**zSdQT8_ zXZA6^L}I8htq!%KF+HAsZ%@qE;TD`^mz^UBR7{%B0vzVqIqhbU3 zx}~c}0ACnB7?gT{&GnYwyfT6}yeHMB{Fk)uUgnB&gHXG&y{B_q*TxD=UerMcy{DpzVVx?soUyH73>v!4 zFgjJ>XQk3_oq*SlNit92yp(zjLTVDR>aUW;Lk7ehnW#D1VW*4{uXJASky*XCmgecW zzMR8FFkhV zQCI|atNVysosf^CnN^%o?{&fQ6SCVi`AU@lH=ITuM}rKN)T>7 z2yq9ADy-ocahTJvmbB&yU>z>xm%!_=o+CF`MIiZ;5_qKL0ICk4dQD3ip|uMVkrBu$ zlo4GLI*i!G2N7=#Q>11HuU&WmTB3FY6V&>|Axuq%>tdlhF)5r4B@%~l(&oKLRCpfe zFeYEj?e*L{gt0?wnmbXWVmHvsEp}DSb7L2x5}jC-Wem9 zS%t%xr4-Fb%DRT;I(ZNctPY1oU?X=pL-!x?xGXW=27?S%1ChUyls^I*N1gxwftXI@BfqQX|!psQxyZ>I)waRfUub_pbEaP0xt_k(kK7>eUNoeoUef6Os zL|Y=mXr@WxJi%#YqT>+GE2DESCOV(1+)q_yF1&g%jr4LRYX#ysmyl>@nmceR&cl4B zb`e$)K&!Egg?kN4_Ig&`4Fu*s0;zJZbAuH(CZ4!TphcpL&2;b mkt4X##nzQCVdIOaiq+Rp#cnQE;VKk4#|e;g_|KX`B=$e&To=Xw literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherWin.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleOtherWin.class new file mode 100644 index 0000000000000000000000000000000000000000..3eb7b2a1971764811768b6fef1fa10a299ae0516 GIT binary patch literal 4799 zcmai233yc175;B#k~j162r(hXVM~Gv2?0l`1xXMjF~Ue7lpssAjW3gzIp>~p z{&Ua0k4Im8@F4)_t0oFXbAf? z+!@Avyf1{ibS%K#8txJK17W-$ACTdL!v2s99~Q-Xb=-%Kl;flLn1+vQIH;o;pOEeE z50m<&44;ze13C`j(?Yqt!$NUkKE{L^m*I#EMS zeP=v19CgfGCYO!IQyD92B^}!tiN?0B&1B3GS`0XLTA|u!ij3%1JI%E+&l81NzU9fC z7-=Sz8kV?p<#L-y83omafiZ&8F%d6mKTCTxjVJ3b~gwWQz%WC z_FkLb4x6sGyUg8YH0Rif=z23dw9yoA1AA;{>{ZN+Uf(Yx0kP8s+)ECaug;g>S}3coh+ z8~j$o69#^VCkcGfc%do`JcXwNAkH$HXk{RaMle-iqlw7)0} z{0slq@E-%u;lBp{C&OkuZ{P*IXyCYlrj(&dRDj?aDyT~7OVLsuA0Ce)PmtMe*@Ht4 zEvYg?X@o?D7^4a^e@a*7nlcPELsiJ;WY3hLQijuHsFI-?mZoMIsz#m8b6!kex0A7x zgKarG(Qjqwop(N43{|VnFjPcTYt?LpP<_8$KVT(WgdED{NxeR4n<;ljrK8D3FO5*m{XwwYO?=&N0?ttiw@+s_K-D%>61BI>lWj>7zDRooURy(N_!$|)#z zPHoU~q=6CB#wOoUoNQ}41=>=ngk|ysFKYC42@jjrCLb#=$o}9v0+ZTCpJ!*AnaD9( zULJHHlrXbSw`J0C-D`^8B$#!1Gd)n)Xxc`+g_*wI<@G^rw;1diVAVIq{O%O`7~54b zNz~!qj7njlKb(AT_Uq?a^h|D-Sds^lcTA7vnSh4TF7Z-P%p-y4Q2qytb>iyQ_UmheAa<=lD8@ z!s>kZZtX}aW3gC|56ww{iv{b`m#`%*Q!h)YrTp#VYnBBr8^vDeniVs=wtLTx!O23#yGNqEeTXrhXy|jBI_2s;`9n(%`H&`PAp3kX5 zNl6K2R?te)+7nB%Z6xC?ga)3a|Es{{m6`o4DWWVTz;M4xf%FP|DRQ?sUW=i@7&0#CL zE|Kap6WlqG8l-!K;-oZr&CgwS6Pr%+VX3gxkL6@B7aQ`F%Y}*|uh-aAojdgmpCsv| zJeJosPc%teb54Zc=OZDvlLM(~ij66(ltz=VdNWp#L56W4Kbawn zqo|m`%o03|%9bEkPn$p$kvxF8OJo+9K(#E+8b{4IPIot_T5V;2S}WM8U0zC7ue(d*>0%Y0)CV!@iw&)R^PMkBE-)aoeh#t|# za4xy$Mf7nj3myy{Bw|4q(Q8ppdJYkriwev`HNRFHP{#sjzP%dYE1*jirG~w=1T+kj z^9U-!FJO^|q=uAXJdYL)Y2!tD%_sG1D~_WPAq^QaJrNS_3d%xwhW|8Vl~TuP>C|GH zUrf2?o#QwM<)<>L!O@V@up8Wbw-|jHu@Z`@=lI_v3VU!hM;=Gj!1M&EduKCCB|3&z z$Y~^b{upY7b?z8mDXdM+hp>DME1H92xIl)Lvgj7#1X@Z6wN8mvE*`?FW4MqfW_8t? zaa_d8T04%ms&y4? literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RulePong.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RulePong.class new file mode 100644 index 0000000000000000000000000000000000000000..5fe6cda000f9d832a93c1458c5c17d9da25f854d GIT binary patch literal 2974 zcmbtWS#uOs7(I8k&P+OHBVd4m1O<|?j0i$VSR^69Kms8NAs`5yNi%7fbdNJVfhZ~> z?z_05sJL&@(yCMlT1D~fPw>eXAN>JV8Ow9KXNx4fSgG{f{_eM&@0{=6nP30;`6hr3 z_#uRQ(H=r2b_UUbU2?TsuJ$O1mSArw_MtO`F6<9-=RgSEI9Q4v^vc&h>3B#!`b%*b z0}75v^HKSDD1>7;9>T*oQHqn$6bveeg|Glaa$67K6yh?|aF8}bdY_gXXA~qt7=amr zg`|Q<6r>cS1p-?P)3CP*cpDn~1$^z+kSeB`jv{ZFkF)h)rr40F= zHTvvfgE{It^>emv4n;;zN0JF`Oix8pnS>tc;iKC!s9FxHq&(DXWl}MHmmz5`%W<~$v^J`#Sb>!)Msb#fRGdSz ziZMK@;xU{Ts3@Rsx6D&UTtJCutfX$n6+Euu2|TIbf{LeP#6>)<;F5}G@T`L8R6LIt zRJ@3nRJ@E=RJ@921+S@i9dD4ALgE~0D&Ca7mt~f>RJ@IM6uhhAJzQb)D&EHj0+ofZ zY=0D>V3VC4){XcuJ6VCNDn7(V3O-hG4WFp^RO0zeHuyQdQ1K%p+QoYMJ30wrX`)(n&PO-*qF zSr#N|ijh7Mr=|jeZ{_aH@Tj(p_39eYl^3C-nN_kXxZ7oglH8>dB#lEjTd^Xx@+zpZ zbb6SNq-HU-yvd>_-+7;vNrmFth#omaYUFh|tjEr{;@31pi*PxtMP)bPIaGCTK*_v* zHfr)Tm@(>5&oR4W0J{xnLqx=$d}N(B&vsUxBPMsxMvG>5#<6I1G6ZPric`^r|MBai zT{AVR&ANBbJX(c47ZTs)Al#mzRf6;qG!aWSNoqGspDOSHdp{3J2D*1q-eDbPbvPHA)<)M_u zw1@Su^;fMcAGCazW2 z0jsc@Z|nnW`DCz1gTgV`6bgiC%cN!n@t;7MV`7@S_+Re$Rd{dbPDAKNcZ`#r&ZaMm23Ku?(B2-eyw1gMzeEfW6eM6Zb>I zdKh>BXV8qZXu)~3;u5y-yLBtBVmp3h#7#!r;t#;zu^WG25B@|H)7UFi>=QNU5{)<@ zHsPSyj9y3XV+b&ST3{LI#voWw$HUOGH0Xo*|CtT_58Ie;1?T-Xd?$HB-Rmm zGyBu<8}V;|j~Kx!!D&=0XcfzYC4Xayf-TeNQLt6Pw!a{zF`8d9-*!CcjvFp8lb7*p zW|6d9O3JYbD^pm)_0p=kDb!D5nVe~t;3}2}1~3mtN$YV=^9iTnIyY&q5jN*G!a`2# R9tSj!O&xLUUA##WZ!|r6Wu$hg!vtZO# ztF>Bft+iGg4@9e`2R*bAh_qH~Pg?C|?O|&#Ywcz2-BKR(_s#5PcOiMtzP`TK_wr`H z<9{E&|4jBBeBwy}3$fq8>2M63gj|@9KJ~cVKpuq%TofbNifs{GfqwP4QsSxz3|uYo zRs$y9rZ(3o=4-=vJFb(sK7@Bfa0A|H;6~h}guP1<-Wcuxek;=K~L8JG-5 z9luXe-L6*em$*aX0|t)Aof3B`awp8q2g4Y^-4gd0I05%c+-IN>+ZEgW26o^9W$uGv zo_$EI9#X4^l|7G03@WM*tH(zqK59_T#|-Sm$0a@?@kxnK2?Wo`I2m_|fZo`&Mj+6Z zOW6YB+B1&bS?t|p=ew*;S)Pn<&n2zw8Y`bs`_f^+?a34bX1Ci{xVDpu_im2&WvzZY zAI}%Fc6=2dtL<#}@|=@iBoI#KoK(imNDS_$j$y{&TwTk&-A)d_T?YQl@8Mi;4=sG)}xBAHvOxf9$Rz{$q zeY3UIiWl8XHr}2oxV)3OzBbCC2cbTisMgBSiZd&`d!^XdCla*JDfSA~QBl61zf1jJ zGvPRPzAbAN3O40MtCV$EeX~6(WsM&mfeBSwM%<@GN)H)S1}f(AK=J17LNV(K2u5jQ zZ94k<$|;#s#i!gn!{28uCml~XuAR2?i?7!oa9fcrt|A+8WHgy$s5z~c|3BcY zU+r4SE!64Nn#7|LkFf#0(jAoew8Rh_hGDUieo4(8wWO-zT&^Qk=UN|Qd{(V-ewIcx zQI%QR>b2u3%eCUAYE|(uR_BWOqV%R%B<6VKrr65llOEv5I{NSOEzo@Z!Hd>1d6_#VE` zP@DJxepq9X*IlZ-OuVS*exx{mjF)N@`rX4?uh^ghwARj~d&t;=p9oAHqk;YYHStp{ zllYm5pW_z-lPiLju3N@*&?PsY%VzDoiI?$9My5hh%C^$;iiuz0Rf%7l_ziw*;&=GH zi4Js{cnyCr@w!_55o_7|74~vdn)s9Q?a%m&z}(7p70eY}%eCVxSCx^Db?e$D{))dz z{N2Pq@K1r6qjJ^&Btut8>xxaA?Ic@$QiV_XlTh(%wF<1Y`kL~f>6LxLweyyn%L_~! zBf2Gc6gaBFrLswk&J+|@71f#(fk-1Wh09dAu+|kgC7d41Axzefw8Vu(RPNKZs{oWk z!^5u`jaAL%;cZjZfsbe*4@6hn)OB=Y^)-*!TU9Q4G@;ChV-su0%MO!A_E?2Z291#I zcs~=$lwP~|aV1@l<}SAh;GvA;uCcO3hLrvi-$T499Y`)$<#L33C8d&zrR&rwrBrp7 ze@4L^a$cLw7<)F2SaJNA`6(BGK@(bYxvXt*Xr5S#spraSH=p5HErrcHDiPAKDufu} zHaGclO3saQa_&k_JvE&D+{>*h4lBAjT^bYBa?5jr!J&7qm2uRFt2UA_=3%Cg@^pz1N1*N1ZB(s#^An`|!Pr z#F>qWv3xJTpCqcPs;0pg`JV8sBTZ{3A4b>3bIY;RFc&zsQkhCd7)D57KyOp4 zu)tF=TIynT!-%N0xeN8D2G#bck*$nM`GDx9ig80|7(ad($7tAv2?Ll!ZP93O4<-&{ zlEzPi;NYPL_Tbo-P%IP;4kMZLu(@z8HTdvG0b@iCp7D^aLm|+69>?; z7me$q!C0svG*|9MQ;SLUb7PE9bNNQjZJ-HFE%n|_J#Pjv_3+CITVTm3F&t0catxIn zgW{2>4DJv+qQQn#wjtFcHkXKN@%+-Bj1w^hO>Ep|bYea(!2%@N z@!R+{eG^XM2m5KbjkqvCT-Z)b7$hnTv9X_~)aTgxFOu_RHvQ{t`2%PbA+(7JI7dv! zQZWzbiqo-7wBkI`h4Y1t<-$R`xCR~KCUlBhuu|NM3&g|d5`$PH_F|pbhl|9s*dSiT z#o_=i)#|ZPYd}hi!q%ptTZ<#DEks6JjLq8l*rKgPR!gB*>xZLVhn#jR`n0=ox%LS1 z+G8kaPr}vqp{Tutt=g;DrtL?+9>JCR1YD)h!PWW#yj4F5*XXUdR$q?m^$y&iTewm0 z!_9hu-Yal>9#Psp3vDC>d@1zm1z!p}^_l9uo&bD_ehgM{C2=Ob zSc%oBQ&3xiVYTYQg#_Zs`Ub4QS_1bJeLdD;JrVvQdbWfze2X`XSbQ;zl760*^z*Ew z;Sy@_rCmyCmr=%@s1Jt@Vxq)GAz>YaC9z3}LpTIeA}Nt7-FU|mwnVr0mj+^oFdLyG zsW@W(h1Nr?qBka@u0{l~pSB6~Ama}qR+~;wftN-Br*R71<_%%K+=B)DjmsU_*&N_Z zP>0*G!{>QZWkhw(_XiYi;G#62ys704q?6RF8p6qn+lPq2#t|$!?51wao8Xu?vT`$c z=n5Kt%J_wQ@aA1ORgGq^+u5fax$N5sxE<4R2me=gCwu!Y{wr{RdA}RoxChtbUaszA zH*aTs-p_C22l;LLkXP{wndNTAZ!@c>jvTI6TLBfpa&2+t*Ood{ouPRZrCtPl`Yp6Y h)rSdv`T@*gY3#?%q{{M4LoZhG*C4e)=@$gU{|0{CLumj2 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleSelfWin.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rule/RuleSelfWin.class new file mode 100644 index 0000000000000000000000000000000000000000..22bd36501cfbbbabe3c270b7fe2b43f49caba6c1 GIT binary patch literal 4775 zcmb7I33yc175;DXX5P%pi-Zu60fAspvofxziB%v*m>NJ67NuJ9m^_jPlQ-$i8@ASN zcD4InthIF2TDnL{Akxx((e71iH(IOK+Qr)4idOoc_hxwk((mi{C3ijd+;ji)pL6e< z`<}n&2!IRKxdvW{o8ovmUJ=JD@hXF@SL?VrhD|ki4PI;Db$GpwHyDWHCLM1S$y?%h z6W$!hTkuvX-e#Z%ZCk@<%Pf2&5bU!TxXB+StX?<3T&q;B2 z9Q*Nk9S01Yi<@E?lX_fc4od4#3==Wj6T@NYeZjyNam1i`U#h{E@s%2U6<@2t*YOQ0 zzNzC|HCT#o$8fK~ohaRa`$W}ubbQy~KHoF&ef&Vj4|V)V$Bz}FmpQKEU9M2w+_GLl z>&_0^3e$QW*Ir#1*=*<5TAMQ*sqf9Et;~8W=SaUesCmOqUZJVi-s#!yU~*(@ax`P@ zvUAB?A!8@|SoGVOEgKxSOCg@lx`U4AWL<^Rn?p-_uDixx)YY<)_GCxXR&G$Cu{WI^ zNqSZxSI8&R*_@rUUC;4$B~xpc<#N_8YOMC0QH2>HRUAmJbw)WC4Gd9e2u+uF;ykU{ z;tVM)oO+)%o449&kIJ-MHaj91RLevS27)Atgt}CRu zsB|rLbX`u>wf&xz-bOoozxm$3U&jMF9%QuW_z7c$h*;^sIjyI3PDp(TWg$#Vyd@ja zsUeZD1;mK1%k5&_6VztPb?sbt#>(ey@@Hn~fHZQEFGaJXPX0=3Wr5g|7|Tv2^nc-? z;~@p3KU>J9?W-IibzO*|iv?s8y;!B=eiJw1r#gOS;zhW@#Lw{y3Rj%p?Q@3+n)oG- z>iCt3U*lng=_fggZmlc}JKV%?@CY4X;!!-N_Z!kAvsUi2?xr!po;ZLpo8VUPAHWvVJwZ7K~rO%+j5UFoKZskoeGz*L45 zHBy*T)Jkz0H&fG0Ri~ztDn3v?efzzf;|?t^IGI5^r=SOM+i9wLHN#X5vb0{!B+(iN zoyIM;+bPZALa}Kyx{j6gJEoeYPS@3JQzg_KQ_WRp=xUy+=Bov|YBbeCbtVa5swTC_ zRA;HPnK&xmDzna1=g5@C9cV(c$hN3fg_a5up$wPzEYD6}(^pJ#j55zQRhw$pRfnk- zt0dFQDHn!QBbik}BS<*}sIpAFkrMcqTX{*um6=jHQ&=!%t}H1Gu{TIv3a3@h-|OT( zs;&&AJUeH3SvsV_&yPdah@Bj?JS$mDd-by8-pUjR2d^zAUPH1_${n^`-W+wIOd$tjCeeaBC43i% zoyE)>g0wWs>&nmTA|Y2y#X}X#jIzY}{*6{a&)+qb+PE>uki&L*8zWZX(&DN8t3j@X zNf;Gx!AWC2+8gC!)bh@5p4Z5ZicNvT^z8z|nk~#S&8btvSHpYGvm7^nwao-PGYot2 zdK2Zwh_y4=p6S@wY`NR)T)%D6QCi-wqB(mcyPf-=eJTwhc#2AS=d4(_dXxP3cdzN| zA=^d^UMOuTTz(=LDIylqRAxnm@S*i|>bxmPAG{9~YFv9q%4LkYX&SzejQpPqs4+H} zvvve7pFf3c@%16s)v z2O5%TH|6CiMx=%d<>sJMYECOBg%z3XW-G%DGua_pMQ5D^jvoZQ{xpq_TBD^v56;FlY@2}qu0SBj5a~!kw;8JQkUEhoISkI0ONN-dd zpnPI4=9LBKY+$oV+mE?g{TYWaZ^I$X@6;1I-2+Y>Wn2~ ziO3ihC1Tnb&f?_RiP$*K(e_pEYa^+b-cV^%6c%JAK%1AhbttG1g%{VLpo4*nsP} z1K}>ZLR!~jBb^b$Q}QUM^J=N*M!c9_p2IbpFhC2N@Bl1qMuhge!}qWDtp=iGMmqlsZnqlO>`d3H2P>b-2%Bc^9|HVl?23 zdWdGp0gkn`A3*aMT8i}osTYl*)#p#!ezc9DJ*YZ@YVm#~593@?>Ad>$$8iDOaN#&E zs$UYc7fbu%pxq(uOM-Sg+vB)&9Gx9h-BrCr3I?S@W$ik+8phlDJV0p zW2Hn`K$$-N3IYBs5yLXnVL9E~O#<~`5w1cTR*)PiJW;|fc89Y33##lS*$yTsyG$Alv7oB849cox_c?X^P=(p0vqWJ A`2YX_ literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRChowState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRChowState.class new file mode 100644 index 0000000000000000000000000000000000000000..ddb2c5419a1aa695a411f339b507b225dc617842 GIT binary patch literal 3268 zcmZ`*S$iBu6+JbJdZyK~6h$L@BFnLpIE=Q87i@@RJCPOH3`n*kd1q~n+EOc{Zqd^t zMfcRBag zeDI%l-UaYsyl-Lv6DCraOye}pq$!C$l1D8#7;c){?CU#&V z%@1Yvgf#nt#C}pPd{KgYNy0s4;L9dHgs+(B$5#z}O}@Ww;2Q>>7HB%;dTw|`AfD?v zE07rRryYUTG1qfWROY9g;IuteqNaV!FWRNEcHqkINSO#{-LgP#%y~R?yy^V>Tz;Ws zFF8RzsFa*?XopVz)WpcFe|b{MLjp<13!Ok|*FHIvPwMbt&-Y%Z?oihyo+^7m9W;EwFQ}=+EavyAo8&`Jx{< zc{=5WOZmd-;UKV=h?FkUXKB5+PTt4UHA0+FjXs=Q7@;+H8u}F4wlL=6W8?OMN|u3V zNDGzqXIVyp=FmUE7*t{eGP$uid(qC9Y;Puia%#>ghAJEBNq5Gx!%Dys>`{Kt*z-%gD!nV3nJRncA@Bs1_p2IikorQ1V+ZGJG@}w_tK|7Sa=)P7Gsv+w*B>uSV*(wWv!Fv|Qa8RJHX4eq>2G1XH%aUlS zz7`J1E%)ED<+d#*u&tWc|0795E_BZb?ARpUs1?ZP87GwO#kA#m8fX?ZU8|0OJU_ZL zshX`-Q@Iklr99Q7VMmR*({^a*qpj^#SF2i5RyVPRG8XMp#W{INpfgwKscVslTEuQq zeA_sTbBqo%UAOC}y8Tg$u?_u7D04mLmbtC1&UL9F{+1fPwn>!TC)iD#mmDgYMz^Z4 zDc1|nO5dvi$@#z`6gcz#BDI#P&bVEi<)kI=Y8k34TeM6sTC1r#Uh=2x5~myER0I(i zs1J6eWS7fBJ-5Y^vw~n6RbPWGWA)S7;!FcGRZG8 zt)6qa;4$G|k@eoiW|EHF<`$}6LaGydPkT1l7_J^KLxn7wsVyP@lQ0@+-l&U#})4PETHh+X_4F~DC%KoUaUC4BDTmwXGU?Y#l< zHia1W^4X-6t=LD|(gxVipH!gC8OJ9##{$|lQ+2Fw6|wRD6~y~ikXS)-4NdDXVt5a! z69X$q%l~zlti|*?nx)=aMGH4ove+Zyz8qtsK`)_%tt+E;NW<&J}i zYsmET*p5|n^0jp^nN7ymu`R~Y-*T`in@m(c40+(e6s@wEroD!%tTgZ zMw`&lzDz2SNo37c?7oKk+l;>WDssz6^)i7yGW&6r{Q%o3cd%3$N}V{2tvG`$=J*40 zk(wvbjc0H-p2tosv$R)n53kjGdC%R4_puv)MGk*M5B`B({1bin7y3mE17ZvE;!f-l z+p$;d#y-J{iidGPjN&7z(hItpQKeZ|>Oaa_C&e%x#2~q`UG!pzx;TCK0Eg&Vf?llS z2p*!h%XkY9Q`ba~u3(swLBC$XQA#O#6k-IAAWa|kW0X5g9AljQi2oaB3>-J`v5x=Z z?`SqqpsY2*z{iE)^Ai*l|9CBH{t+X_KcI!#Z)@+>tf-OLREt9-@F5jmr#9XQ4=p;p ywqf4%;}PWk2r}K8E?CXNYMLXK!S8busg4LKQY z*><9s#Jw_eHRNOPP!KW|B{>$yaZJZ?0w?2m58f-}J`MNB(Tw+Lc)y(bKn!c}K_MR! z_5&Io6!wRs_y|5Kvya8_aePA5JtX8|u}88VpVaWFTAYgE)A)>-d?bdg_^go63HiK` zFK9Te;fzA0)3PmZheAzD>##zo+Zi(zmiAh<*yj&)|fWkgj>j(dC&07#Ng0?H(|Pa9XpdUv*QOWJ0<)Mg|KOR zrmL{3rQ&?g$e^#GL%fNNyG|}xD>N)76=-p%Iri9|jC#_xO}9I1bj}ZoA2r|GqC63j zvACs@49}$D8h%{LVnrPa+go0%xq|ch=2tFqSdb7+SsB~#3NCMWb2)AS#Qacn8F{m_ z;w?)+l6b~aPQgu^dn|$SnkztZi(E!$1-MPemvC0cV;I))xR5Uk`3kLEg__nCrgJ(26tK+;Zo)hWiW$B)g zRN8S(zP^s{U`EF*I(5w9f`*Ga=JC9S@9Ov-ULZ1byom4X_yK;XuwoI!>-dpuEib=U z5rjH^EVh4wpX&G-ey-yeB3EDOMSx2kzr?VHmvsCJzt-^^S^QSV@5Hg+i;6!8`6FJg zibS_#k6RhS^n{gjH2g`&pYazRf0Y>T$B>QzxznJK4sjN%4U6xDl{!xc7mI%2qXtB!|CU*c%m+NU>3Qq=_KQ}v?6X~O4!PmCPSf? z4a1#I$z7N8mCCzhRg3#FwN~kQ8>_@GKReH86GmRDsUOLM#HsBs1O&c%zXFyb8DX6F znQSt(f$vfewJ9T8FbBrj5US&UxyrNGnD-WptTdy=svE7=Qtz;+VYJz}yhBA?HI}oX zXQaonad0h}gXqub+bO%+)83fp0noNSg2hW82HySY+PwGge-TF(??OPGoEF2g=* zy1{$LMk^N4yyTv4`EVl%izz=G=+`+y)_O3b)a64(lXV&8_oa=!A?!b1glvEQ^9u@c(YthBoeq4ul;(Cl@1CHWGoWe#tiJRD*TXBI>FQARRuAN_h9YL*0NoRT4YZVeC?AbSnqDRRKNfB=)HLaF==rN%aW!sYlVL z&Y@pDi$OJm{c09>`-mJuE$!-fD|Qg6rwHvk>1UXFiacsB^3bL7=*Di;2u_O_mRS$a z@^g!r--EqG{auVeBga5nk~@J8&hR$wZASbRoYb&SL$8LuOGs$w|2LY~u5P@9byb}I zFpNstZ;&R;HAySlUzlG9{o9CD$*Um0WES|Qq zz`>%DTWLs4MSUf6NW7kcXi34~6&2ikbqYGJsNj~XP{5eHgHA7Dmb}X!-;G@yW4u%| K{~z5MiT)4wnv@j) literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PROtherKongState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PROtherKongState.class new file mode 100644 index 0000000000000000000000000000000000000000..4473c109b31ca434e877062945460fb31f9b16cb GIT binary patch literal 5313 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 IoBSR9FR=+;g#Z8m literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRSelfKongState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/rulestate/PRSelfKongState.class new file mode 100644 index 0000000000000000000000000000000000000000..5c59bc772098e81a9dca7f58bb73fd6fc0544eff GIT binary patch literal 3370 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 sQ9;i|6}0_71#2##8FE0_N)69smFU literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDisCardTipState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDisCardTipState.class new file mode 100644 index 0000000000000000000000000000000000000000..4f155e73689502e4ef279c9a8177fee5316f01cf GIT binary patch literal 2835 zcma)8TUQfT6#gb8nIsGf5zwHbwy5D!#(F^uh_#4qT2Lw!P}|xejA1aD#9@M9TkXx( z*4`^^?Ni@;?piD?edzMppX6G-d}lIbCN)*_aOTWDd+%>wzI`SS{{G`n00;3)40|vv zmXR2C;Zzi-F&gFW^%%}zOzg&M@dhS@%B0v$iQQQl=OQ>C!<%?Z#@i7buEj=N5H|0` zpkZ1@I)a%fx1+*Huf;`VYB38#EORn0)nY5MGICLDhbbd3o&_0~W7v(eVwn`nhzv`{ zyo7MSVH);;gqmdggoNN=enywDao8~RQ^nl0ZjEcxSxVx=`Lvdu&@4l|yTYJ7YtYBO zVSUlo%^5W}rxvo>l5VNtY3r7R%}Jl_x_Y08 zB$U5m3XR5U3Jg?VG;9g7zNn{*HUsRh>S=gRThP?3W@gke+cL~dU&<#sJw2zVZ3ix5 z>h`E+X*mhIhST|+YHLNSIIpJjmaZ~b!(LKTPjr7tm1r};8i{obU{+>O8|d3?p2su+vL z$HwwSE3Kb21nsu1bK*Y~>K1)fuop=M-B1-2u^{7$f<-JTxQZh(-c|4(-dAu9*JXU5 z;6r?*V877)7@sIOfPhdzNd;0f28HXuJ`gQ4Hli~my23fTqV_FTxZddt`|vzbBymr16*v>r5jZUZCt8WKhFIWHj8T2PGbi6UkGSpsJjtoM-%L&=;l5a zs-GIinD8tUwb`s|Y}E}G@g@s;i{-q{WJNp5ut~j z=)(ZHa*Y45#A!&Brd+^fw}3)+3@es;58iOGsal9vU>gD=)b$smH_|& literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDiscardState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDiscardState.class new file mode 100644 index 0000000000000000000000000000000000000000..710b92608b3ea1ee0045fecc0b23ccdf99aa4d09 GIT binary patch literal 3849 zcmb7H+jARN9sZ7GX(f4miHMyzajs2*Z8?=2w{C0a?k2&(PK@n3Zkm#=rH#CfEGes1 zE-g@Qr7d?T1rng8Txw{!rA?K%WthCeU%(49yf8d4!vhb@lp(10KU^X&%>bCWxUc(Ct zp}khta`r0(I=iM6>W6YEQ=xgp%9z!Gvps;(y zyzH3SRAPQEkvNZ~vVLu?2Fa8XHCan9!Snpl~@(9FN<+VTl^Hvd$`q0d>{>9WY`s2JFB)==`~Pe zzG~&_Mnxv9bk=Z+HvQA<+LSitO+TEjM-LkXb8oFc>}O=76S<=+Bnf9fSR)_yy zaj%a1ut&$2@MRrek>;xy)bTZZUBfqYd=oF~_!eGLSW}6`Fe#HZZ5`jniyFS8tXYSQB7e7h0KZ6dNiiL7qom=cj$2q%*u26npOj4W zvRUIfCIyqMzOT3U0Uht)T@tin#8NDE91@=##*mJK(t8LGE5s`cm$`XqS2Y6^)|Z8P zUU7XPyi#bXMBF1PeP9*NrkRec1*e%9nOt$U$Ye^{#-$-zOpl4-!`WFQ%R!4r^`c{C z5+hc@At{?&%<>FPELcxb7Aqc$OCW91y{(c(Xgl;(zK)JV?qG*H-7vmW@LxxK=r zW0~BHkztUipBr4B5!F>`C}R`~gIzW8ga-uMSc@ZNRT`4w121){Sm(+};=oeaMJBN~vmCH^_zL6BR=g10F%5aQ?@5oqLo$@Sk3r;S-3?w{j6lT36G-O^V z8X2CBHS08)9HMhr)f7Hl?Ha#4SCi2%eG;Iu7LStO3X$ZjnLO{YW^Jc`PL+v1*hMLk z0uN^2>i!ynTys}Dx4NcyyGZcnBYzE0Qo7mpag^X&@g3~G33Z*FI^L3ikUQCi2iVuW z1?b0v94V<5Y-RI55#SH7<2O)u6*KX`+X%2(yCcnOU+(6oqVg{z2hOG|9cEyPOr&;r8U{JeGnO|qqgRz7W_X~5NV08Q*~ zfQAlgx(REr8SAly`fbM`?qPx3iIdpHyId!dyiA=#59YBO7ihXzx0N_+FpdGPt`l2) zJEgZ5`)KKY&guyM8-1$#U#PE(a*ij9?}KUXl6@Vn((62>*d*_Lt>$_;QsLXJ3lwAyR@geq#kL>P`-#o?9wV!7@~^48@9H1IqQI7jX~j z0HF?k02I#+52|j8)NP&+_?ed;M)} z8_?Rd*!D%-QwNf&KinD?y4}K#YiNBJJ0H7=T?3JLtg}5*Lf3VdpTeS6Qt&RA=lIOa zl!@Ih_+<7L5hKt0ncW}$KP1F_2}10)1q3R*&XOO%5jZ%8r|}WIfa7=xALR{c1g~L~ z7oC&5+Kln8@G&0r6ZkzQ@kdPIPngD^aT0Eg)wuSh+JAb&uk3(&Kvy}pE=)j%4{AO}{|V(n@G6)g^~ c2(bI^03KQq;NH6cpyS49c^xS-?!G7f2PFA)Z~y=R literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDrawState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDrawState.class new file mode 100644 index 0000000000000000000000000000000000000000..f077ab2ceee95a800a15dc16acc93830dfe228d6 GIT binary patch literal 5258 zcmb_g33yc175?v=H}hs*ULZjdNeCk1k_8ytLP;V5AwV=NvJ))fWim+yCNpuCL{O_$ zv})b0ORONcp)Iv)AtX|*wQ60uS-aWA+TCupTDnL9`=2*6nF)r^eqYP?ap&H1&pG!j z|2g-*ymI8JX8@d~ye4L&$3z`^O$pm>7*7S$xXGwYbj2xwziP*{Abx18x-ln}p?N5xPZax0<*Ow|i!K7Cg(9KEECpA2#VQ58KH3&k7~K?#1Q#c}T7$6_c59fFF-_5c9bRR}Lb6U1^+abV zu29(&yf_hzwE4R>`n$vS=3vYpPuPi|zhTW%XE`rs_bwMot%5rkNd#jG$Cu|wWf*J4 z25%eL>+M*Zf@)N-62Y!+SvG~@35BAjjdqXiPbNZP|D0IN-YjI%8;B+&+}GQ~b_XS! zNs8H#w$nMEN3zUGiuOk2^syryE?m)QmpGessA0`A(s+O;5RJ5lsCrUUAll_m*vVKj z?hiy`K|fszB{usTS1f7W7z{YpbZ%+sO!B<29oiC7@P&iziTad<#lu6nxjPfi%8^{F zOA*6%q{H9H&~*f3wX(_47c&zMbeQ?_oKU1AEqL)Q4|PQBL^4L0PIq$CVRr@7 z5Oiec+VNmr&VfU4lR%owqsdqxI6ovXFV1WYL3WzJ&B7eaweSqS!a!Si7GJgSoKV(a ztwKQ-E%gpYm5}9_@0ID3*`s+p@kpe4GZUqq95ZY27YScXL!@X&#~0PTQd9t%Pjm-7=9(Q zU*lB+zp?OJ{7#`XYjDGw1q>F=PQ;?&a4=@!ZT#NAA1wS4e^MBqDo%ymiU@QyA1 zr@Ku~PBT=7qdUs}D=}CL$0pmV}UNnCLc9YPmMXLaR4FU z^L0lf9q9|v%W$Xbu$a}CO=PA%B_^GAT<#~rHsbt9on{j|^ce6tkAPJ4(wFM6>zsBE zah!1!ZXDwp8ylOOo1M2&pfecQ#0yhlW-h$sZXPL0!)Q+1aISt!z`{Nr=;S+3(lHb& zXT$Gw&-6AO75q3Pg{iq+q&{rN<7^@$Nz0u}(eWeg4IP{pV5&NTY26dbkFBX<6(;fB zI@@_zd!Xb(=2*|QpTCN~?#g{oPjI4P9!FsU#-f3vm14krEZ|B>zvoC{cMEikqR5R^ z{m>Ro>4&QiUjFD$OxXkX;;CbdL3lOv!&j{fWsEt9JXu@YVd%S{yQtwjF+R@!n`U~rJ)sXhG~k3jM90Z`;$7Rb zW_VrIK2afNm^8yYmKnaSzLXi>A~V+vbGRAaj2UxzH~XlkVPz?o1p^ zS9M;-0LxXKPa7=9hCX=o>inYoqe8NsA<5gCm$JnyvW9GVnu5b^VIrK6U{qE51ZV#d zu}uFzSk^Z@S^v9bxpt;3KB?OCBql$LldFn6{W#@GoT?Ls<*Nn6x`0?!@{I?KgBv9T zaVZKg9)&mo#h8f6I1#ltiJ+d0CH#n7hEuT)<>){KziTUTJ*sdctK)V|$DKF>5An0` z5uAm+IGeA}YQ7_9;0?^=Be53mpiX&kjw-|~H5PMKDeBb(G^i<T*mfu_ElFl8u#!#5tzApIRs1&z=g@$Ml{nF9kqt%3+i$Rr$Wdbr7a@1S8YAM?d%llWMk_&OeFJYc*DyZCO7m`ry`g zm$70i2TogRA@d-TxaY%V6~`aV?GxJ%q6dX?AnB zeM8zNeJ749bLXtYUb1<13Rl}OuAEhxiyl=vO4;F$X3sr>?5^F+ic|B<(ea$$fIQrU zeB8>)znxWoC;y&v7kk3pM9e+BzV0Q0w(;*)+gaoH;bz=Vjt4n=82ee}Ph&S;z+?Oh ze4O8ZdvE~#ssICO40q&0T*ykOV|IdQXK!IfGC1U{!@;4@q)rHH&IEHVp7-VreF?LUX)gOW?H4Mvg%pX_2ZnZx(`1I bd?{5_u<)1)X8jimcxH^2YKSA@{3ibc{go(; literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDrawTipState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerDrawTipState.class new file mode 100644 index 0000000000000000000000000000000000000000..469dc98d7190fc91bed67a1c965b75dfda27b046 GIT binary patch literal 2266 zcmai0+jA3D82_C#+1(^tXhT~F*PKJvpS@JHte{Le?p+8r*~Q)I#QY?ck`Iz z%JbFYjP$1LnF2Yfu~N=1OxvEL?jbYk&p8!=17q^GFWp(IIB%5;_M-Hxif{YU8oe?R zTu*!U!jw~w0yhjRV!AmA$U`taJ zWLS)qVa8~|TjX=J_B6AuE4`6|U8zWB-C2vN>N^E%+%E46q?B4|fnow3O-9#KqsLs4 zQKXs@3UlPEyb3T@u4U9LvYtZM#xg9H>!mpUyl94-ykuQp=B1ZuimIOK2}a$@;^b~H zkD#<{Kpme64D~cw2!m+iytq1v$x_wJ$uo}XpL899=3Y3c3TZkq7W&(bv9T&x!4W$EPS zd>s`NKKe~maf>p_e%>xhYeO6f-ziG(x?S~4CKhm8$D)bP@r8~rO?-trgw4d)_{PMy z_>P?wwDQItG4Z{6)!qmqEQE<4l>0svVyf}Bj+{V$gZa`q6WIR}X?A%qk#yFGGV4pv z_Dk&Fw*O8ciy&`S?Skt4=k!G{$4SdepN&S}%>rSY^fq-)y&DNb!%fKKTsy8mZ5OKS z8?Ge|tVV>!^9*YH|J!%mc5T(z0^1r1hlqynXka0zF*n76%pzwwc*bn0 zR%))no~+t0fm@pkVskC@dL7lgG$7;9P&rr@lajf&_k@`S;$&?U4`d8y9p|nM;&uF~ zqtDru^GqoKf#62n;L=f-4;JM5W-thSh*{LF5JQ22#;g#FlU_9eoUK zD3*?;^fed}tRg|JXajMcQ;*N_re!xru%Ev>DgLtqJq71b&57+phpnl860dfSkZHdc^s)9;~G zQQHS&%g~npc@p@D(T7So8l-#%?WDVy&{m}QaZK~KAKQ^ppIhw2G!dL3hLY(0gl^m= z1V2;r7lQOFp}9|B9-=pZtc)bJkE4h87_C@pj0vi;HGl)qsojBt2JsdPqfgc5Ph43ICc#QZYj_bC=ehYG)~%bDyjr+L5LI(MG@DHvq~H}Yh*hu+&RF{ zK?)z@zz^U@A;ufGsZddsgLik{&b*m@JL}(ne*OZmfd@KrxMn~{QHP1^I&NS^!%YLX zaN9r$cQoA9a8E;-AshAGu+-2{VKARbDS~Z}hoJ}=8ZGfY60&O#2lhLUe-MEkMm!Ss z?%P+&eD2HMPQVZMW3<%VB({gHbfYbX_42I2l{Q0W+wTg7e9M*M#c0?O!5iN32(ene z!@V{S+}KXQOk6s{+Kic0q3K{G8PerAtFiBo0!KV?<4jAZ9Dqm5%3!uI%lJ zsPA`8EaI|>Ib1N2k5^UHG~73_iaJB>4Ec84(BVN>si(m<(Lhtfnu&F6kospt|08~> z$xw)^v^_3+_RG#dI1vdqg5)I3f3uR&?{$l=BFshEn~q z$DKZ1C_}O3_(QwLhazbtb@XJLIP%BaPd&fGJ%(IQM9PU_wcMJXMfK=r zd`zZ_uutY&(S7XGLsILK5OMt`I>ASFuEMhJFIeI8Q5!Fq3A`fpTibUwsA;NdN!< literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState$1.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0c5f32c1784ec753254de9eb7e7bf0ccf5fec3b1 GIT binary patch literal 1202 zcmb7EYflqF6g|@xwp|wc5JW%}wQ4EI7V%wt0vcmc1BRgAre(4$Zg+4WAc>l2{9xiQ z@MmBU6HWZ6i9gDCXK8IsjFAtW+c|URoHKXs?2n(HzXCXmn<;c*Scie5I*#FZ3VEDJ z;-rpKD5NlgqJ~i&NsQ?ZES0inCS;R5WltWO4pk4_{M@l^Altx?u9Om1*O?daP7$)Uu&@H3o`U- z;+Cy+2b%u>;22-!>zr)Px;01owrkCaU_~x#m@se#IRj~A3}n%-VbY)~pVM&Ozy(~S zvUyV0hi!k@4IM|rB?FgH)-Yw@3aB)tR^|TZD0vdh;+lc$xWO>Kx6KS0bq>?vu4Ue@ zu8LYfg>FIfq3iBee{3(r3>|@8SACFcZEKd1L9;|KPc@)6DU7t;-0YG<>2A_BSvM_S z7v^n8R=Gos<4DU=ghLgz7VyvueX}M#VTOV2n3ZUmwhsPdnQRHqlf=?nsI(5bd+xGo zgiO2LU5hE(pAmlG$xR0Km|?QLbN}apBI2}gpN1k7t%A}EXjy2&l#3EQM+4N9V3~|+ zBYLGV`el(Lbbs__V-cbkM?ZoUKOwdi<@C_lNjbm?a$eh1>&WH(U^(j|8j(NQ3QQ>l2ODj-tZ}6 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongDrawState.class new file mode 100644 index 0000000000000000000000000000000000000000..602f2d2dac0433856a7f782ac7ed3153db171357 GIT binary patch literal 5280 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 ZTXxe#ANJtw_V*pQkYANLE#nsmz7FgaU!ed1 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongWinState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerKongWinState.class new file mode 100644 index 0000000000000000000000000000000000000000..d69181b198ce153065ff3174d523d308d4f6315a GIT binary patch literal 2054 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 literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerWaitState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/player/state/EXPlayerWaitState.class new file mode 100644 index 0000000000000000000000000000000000000000..23d2a77b39853c07ec4c566fbad600a66e65e9e1 GIT binary patch literal 1350 zcmaJ=T~8B16g|_A-L`B6D3}75H5kzq%f~!b`kd*6i z2&phea81Q%1S<3}A{bL~Jpv6kRNPcC&Y(=0mg!D2_!G%RhQO?y7Yxl=(-M!Wk0pId(7nM>SsbJCMx zP{ocgsxFnBN;Kphg=Vtre2eQPZWZ*L>zGy{GvDBPytXb3HzT12?QKgq46UbCAwEVq zFJYf3M@I#dj@Ufa*yIi`{~cDpf+0$fjg1Aq>9JLDi(xX+P_G`?;5i#`IA<0t?p7V* zK9)7?vR>e2QJ2b-=K-&Xsnh68lW>uoU3Coc(3I_HKho=uw4;)!hI42pq#DwgAO^Nu z6wYeitQg$MYq*U&451C%Dy(jsmWoLY8B8&B9rv%+u&33MSl|{f2uH(ROl!D@`y|tG z+|m6S+R)CBI6gW11u%5{k2yojzs(}FMP4b^9wog{YMCNlR(XkDUE3+WNUo4H$57^$ z7r1HVgtH|dO0a`jZ6l8X(b*!fbT8YX&Syy-+FCYRqA)DgKRsw0I zO_6ySnMXr@aT*fX(0eGs)B!?E`-rCk9}p&o;yF@&vi9MZu>BtF0fcDZf#>LiKo^SW zK^eW+!X>;$A9gY1Q5r{(;`Zv4fgc5Pj2x7`tw3(w47MXu*`!L6}P1sCuBZ2q|r)7FE4&oK@n;*_CXkPc zkT~!I_)&=2jipFEpd7rjGoE>GX5Rk!`|CG=cX;ihfyW*kY`F07#Kk6_dU%E{2ip#w zJ9t58l!LSg-#Q2h{%56Rewc}(kOiUDkzY%xdhuu&=UR{Aq7gJJs)dW_u<0#v1D#9vE$&C zj}~?vL_XSB=S|JGsBn)E7@jy2svnO*n-Mnt^P8|(>Qkn$HQ3@O=YVh*6a;2% z{1O-VTf#C&SNL|ozKM8I`#UK5iG^=AC*ZTeIlu?pc8nSDT~t?-4D=5@i8!n zi6;Iv@u7@&w$+lD5Pt0J%(*k?oZOFJzrXzea0iP8*tle40ObNM<4PV^ZB%frfGJ$J zP_U zF;GGLh+(Aqe|UO}A-Alz1w*kBDDgaLH%0i8HzgsZhW5GK;$dLUT`(8#1SET$D?fyk%4TOC|avVYmi|7?K*$gWwSSR68hq4VDyGNp8vg`+2wnjjIAnP z>L^gHbrJ9AZ3{CFJPbKFgQ5c$V-{u|%;6R#$9O3RQCTHYTDa{{mgg&$#pM3 zCz-Cy8QKR99)kQ&o$e8XYy5hWtCshoxhwpbQrLqw5~VtMt(=CCp)U^Frm97s(%a%~ z;XRYO$t9Ik>Q>8yCL1Oe^CV0n&)1>wk~olFBMp=Fi4(#kAi_`+3pGa1X2%{tJ^hW@$18Km`SJT~lZpm<)X` zh6pXC?fSh z$d+$E53B j>GO0yhm30z!#M3TboWAvO%mH6?Mj5%^at`OJ8k{|yQcf* literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomDealState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomDealState.class new file mode 100644 index 0000000000000000000000000000000000000000..b2740af434cd3f8a7e1606c2003a7f0c8ff15c1d GIT binary patch literal 3896 zcmai1i+>bX75*mK&15$d5|R)J5K<)2ykJX9wGzOR5O5(0F&jcstLbESl1$j0-OkR^ z1RvF^t#7UGpw_lp<6B!{Ns890#YcTxU-hkj2L7~uXLhqY3k#ATGk4BC_dLGy-E;3g z|KF#d0k9YU3gQk-1#mm=sez8^8blGRfq@x$%&M5HfeKT_d;kHQ4pK25#4C}IhZRH; zDS6zh!VaPyX+N#(<(lr;t>T}*s=_}Kdz_KMp{ADe$z6Yg9<7;I>#0G z`jat3LEWHf8N->xv|*3w({V}~29r@eKCauQeCLHeXU?RJorA`LV_30JVm@RilZjB; z(H$c+Ffq!H!-gJ@$ak*-zhOCstzbikXGKn}SG-rH;`*W}G?mPcxYGQ3dy#eqEJxlO z2IuuNdMM+V@z9W-YInt=m%NWTO3=l?@@^EUv7|LSm(dj{cPVHt&1*5WmfM}>Z12wr z9Awq6Ci=pt? ziRpPGD!N^s%nCNjWp=Qa#C5CX!t7?9w<6UFM9f)BcQQ8VvAc*uuJ~?deR|s1e{Br} zn_wiFv7^QjQ^?hH6;*bNKMniPtKm^Rrs8o8pTp->JfYzWSSFGhzKAbr_%gmi*vgPV z!&hah!CU_vh8n(x;~Ks$wnxyX;kD>f@eK{%#FHAH!nerh;;QS@xqXiW$ff5sTtHUE zMGY%h)$lYfsra^r?}&$I@ZFLC3wUdI7LRH8orG{Tg2wR1uWoVIS1&cYY zTc@XlhZ=s3->7&&!*B6B6~EW;2lTNKS&QNy3`X9ev=g=sAKr>AB6yIq$} z$Y;49O>6qzoyGuW4QE`BXSh+S7R;%XZnD%?(lKWiC(IG~YV}k%W!MSbV$7kjk%(cR zk#19w;M#4penUM5rqR`ybf}SJGOl3nT0m}xjV7&V# z2QI3k8OxFrtoPXe@#?L#C#r(eBN^#@49*wTZ4$|QWXZYLPbp_T9cWF;C35Dn2g;r^ z?1Oo!)f#IsoY^h!qO&tnu43X zkw+Zcv}Sv~e%4M?qLR=Ta;=&PRHZVx_0470hb4vPV%r&*7}8B^jr6LV$^8!Lzop~| zIx6BM_p|^dblv2&P&&)BW4ymeElFFcj&!}lJm(^Ri37&{tIPV3x!vhCfTsbH5kdH3o@> zB5j>dS^RHmSMfbwd7%3|DppacU==`ii{n~}#^*+JD`Nn*(pwvL;3n*0I)2Z{hGRI+_aNsb z=bZi!^@k~`ga1ERuc$cDa|IRaeEdnlYeyc4qcksowX9%W7Il|UKS?~-H=*GvG-a{j zR1w)AJ%G3Sjr3JSx5bS@(B(BIXH(G7qIaXS|%@I(-38w z%fQ}#73^CC_SSv=o)&)=TTd;&^kUBn+Iq6M=@B$^_f%%Fjq_Q&oTittomRIu>{!Ll z3Q%^AD&m{}Z%+B{alLoYd*@J3LzhgfqPvnet{xU`SNA3Cp6tGe&;{JWxjhZHuHd#T z_7;mdiY6v?g1??du#V|AVicPZAsAACla!2eG{L_~OyPB~@Os?K(F6RA_b`9hEnx;v zV3rrdIbPIEJcoG~$b$sy7_E-dmYiGt$35kv)Re}Ej-$eRr literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomPiaoState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomPiaoState.class new file mode 100644 index 0000000000000000000000000000000000000000..c2a18be63f95942bdafeb003ccea966d71a35d7b GIT binary patch literal 2237 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 Bjx_)P literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomStartGameState.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/room/state/EXRoomStartGameState.class new file mode 100644 index 0000000000000000000000000000000000000000..b2e693e2ed74c8875f00235ea2e946852ca39664 GIT binary patch literal 2512 zcmaJ@TXz#x6#h<0I!!Y45=x;^K(t8G+Kvb!HU*)jV5BWbuvWalG#%0@)0sLsDa88~ z@%G|cKJey)Yw>DbTCEQ*o?ZST*7EY5nWV`q3NI(;vd_2A{`R-`GOoID@locu^hZQ+NsIQkcY43ez~Rh6@^APN5SQ zH53v^AABSI@hI9(T-g+2XsmPcE7(rcsf$V@#RL{ecy)Y0I|h zU9(&Pkr(KRMqXX6M}Km&>!abOW4a|H&p=C-pPMX_lM*Q~=1plDwdb9nr>zX6c%8lj zLN$VUB76dvQ*&X-XYj%k;Q4DFYbu8k#4hKsbTpb>k1=`fv z71F2UZTK3>IwUF@R&?CJO~$CBig$Fpi}wV!ZIS^U@2jJ9!|lXu$eE5Y9MW#+?U*c-k_ZfF})K=(vq9HGHMxYkc$QYZn+za4kYaNTH5{ z$OvQ~;gwgLvsfDu-4yQN(AGM$zzNg)dyY!+tSph>HBwF`7L z1YFysDr{HIm`;WIW2a$RZ4GOe+8?Xt*@!x#)uf7}!3V7f!65x=!QxxGGTA0`Zbi)l zn>Krc#GZ(Gom}407R<8hC&8l_Y|IT7-F5rsBIE-|MJ% z|9n{H;YisT?B};>A3u>m971&?j*oL?@K>naf!`ojIcdQY99x6UH2OK$LjxSZlUz}+ z$Z%Ab&(OMszsbQhv>lza8A&UWG@k>|76jy1}O54@J zUl2>Tu0w0V9o(s}+FG!N#2ws@ZnXY@Qm~U;M`&`K%hWn_fpu&Zm>yb3yCBjbPC5kc zp>rhG8(T-0nx{wNz45+Zu`L+8f5!IS_!@fd{`WUgcBFUyj@~uwx{JNRa(8{%(R`{x zj|Jq7pq=x627UmCNY_b*S!AFd!>r&bHs~R?)?wTt``_Vde2-`FBaY%H91CbV!W?<% zrsWW4MUpp6oEUK~((-UX;_3#8t2Gjj(5FgOX#Xtjk8-CA@qch$Xn5{Ej^0Omd#dvk zpK+{~K?SBVm>3wmhrUPxACy2M^htn&4+YrMP{2b0sEp_7vjro_1;3*tL8*aX0{$B_ HS`+^Rjhkq* literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/Action.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/Action.class new file mode 100644 index 0000000000000000000000000000000000000000..8b506c8c87825f74b2fc221e83f866cba46d0fcd GIT binary patch literal 859 zcmah{%Wl&^6g?A%x=Bo4Eos9uG&~ZwbXc$pLMjzVl_H8th+sK!MlexgTN4|R&q8WJ zu;2suD8wB*Y0_-4x9=gt}b`TOfPfMa% zu}`*Tkn`_?SbOrdGH8Xgs4nx@>@v-nf@zcRbdJ#kAYA2~iq6DEQ^pK&^^@0hHM6BZ}_W~`s^dl9`_(|_b zYcZqctIPR?M05%x>S=hKfHYhGLrEmnu{m;mO{9}EO1~6SNmM&aDx=?Ji53=#mTR}T z*r&6GNoVY|`}7BG(mw`dKntTl9y7|$GewjrE>rZ8IxPB@+#g`>{sl7b!3C^uNn?d< z6SZOCB?4_j*agxAmu6%T04dPVNz6;v_fN`7O)g<$WME`q0y><5fr*8Yfti7YfdNRf PGOz(f7#Y|>;tU)BFMByX literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/Tip.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/Tip.class new file mode 100644 index 0000000000000000000000000000000000000000..428e7c16d9e8fbd47a7a739d4a66a89ca3709bfd GIT binary patch literal 1285 zcma)5+fEZv6kVsCw$m~Slxw+P1lj=^QBbr9a*?D-Q6mjT--a@lL&~%nrXs)LyZ@kx zjX@JXz>hMnGt&n!Hu})L*FN26uf6s@^YhoY9{`r|G=&~4C6UHmW$r1ntjvls_mz2& zz-kIQmUQ&0_+bYgA+KXl$Ec2sjv;lhmcZi#)&(N+NI(<>G_O&01TsbEz3;e3*6E4m z%eqx~$>S~i%*hMH&mCDg_L*C@Jzk5~>LHjYmTRY$Z#TTgnN_ZNj^((%^e?PJY18xU z3*JqfOSg1UCxhmP?#!vaCG{IsSGs$4U7)jgV!yMkhA*oY4|pxPFDtI?H#}a_*c7yD|N09p^!VEg6-N7`{^u7 z*Ll`BJ#@U1eW-?)F4oF+^}zO|id%=8e=N@gdj6iY*CHYz%6VT=*NJ8LG&3I!mxpiLZixzVO(IW%`!`2 zBL;fWm%tMPo7gh2jU9pR>yL(X0$sr_gY|?L1)^CszVSBo3oQcfs^0LqQi1;Ll_l@{ zo^&huUSN zEkH^{jG6OTXtnx*IVykmJM`CIku1)qQ|1?RT*8QAK7E5Y+QK)9<1O4t9Bbh&V(k*$ w%>Tqn5hyKVNYKtw(Hu2osUk;C6RYIjAyPW}L*|waow{ygk$nkRL7h9l0j)m|=>Px# literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/TipManager.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/tip/TipManager.class new file mode 100644 index 0000000000000000000000000000000000000000..401b2d975d47d05ce37a7a0407c0780fb626245d GIT binary patch literal 5275 zcmb7I33yc175?vRFEe=<6CjubF$h9335@$fLKI?{RC%?Vr;Q+3!#;fpZXaIXby5jVbSOl(I74a6&F5@|b7rn~ zdc%~J9!m74U3`&V{g?VLSJ=-^@tTC#mT&I(E+%AO$EtLdXwof3qg;;XfPVVi?#3FF-ahLP3KY`kYaQNb~Gl*5q>5 zScicx82BR3pg(#U<20X9ZgR9uN0}{JA~}0BpJJyfnX)Y}Hp9A0@LMwZT+&|WNZ8cS zrG6}|l=LvM5rZbWaiNJGtTVAedVT0us4b<>dTVr;gqnB-at6L+;>-Aofv=i)0ADll zAii$k8z#PqZ;@>i58+`GkKo%(kCF;*_aeZ=qq0JS~UCyzcukY{C>t^bY{Yf z8=>EZ1b=++MLcbJ3Q*o z_=_}uHSst6T@?Sr#6R&b1OGPhAN<$E|ByEEB%U(yG@dc=tcfEmfmk$4y!zp4Dy0Gn zC(b6Nqt3)I9EP2#f-1zQqIs957_X)ZtB8p_7>Fm7*cJi?ih)I+m4JFV!g^H-gd2qTvY$|Yo$$CV{o&vs8TlJqk!#?5Op8L2G_ z%gb5v0=c7{6JL-jy%M7BEbcaUdwP6Z6@i&L1N*JyFmE}ArY?y(L%r103F$9WYfUkM zFG^*0TPemT&C@~(E6R=2cM)wXZYa~Y)*7{`tf|sk(G=bid=c2b?h{*P*W}+Ryk-hF zNHxiGEhjy?!R947zuYe0X|2Q_r0ELFDy<$Hc?$7Lm-Y;A`mYPIC(5h7U`@l(8@&a6 z;YX}&mJgky$gAMl8C8qqEu5KNM=w{o8E?vqxl&Q^RUgHQKdUY0BckBZ#@R_{5vt@q zaV>9nHzV2O`>rDYl<_Z>uvac0 zKfD%{5^ctkyu zYoVZ?RY9@#!1I!U#e9sfFQgCF;EcumuAg@hExk@OXunV5@INo@NBOwwz{Et&Ybh5Nex1 z^Z>1BTX+aDP6QX;jq0{3m_ckS8BtFLz@x%cTZcFnpbg8=t`BbZR2C0jj%{Rw?-?2> zoCVn5jvc-U_i`+{y5y`W%u$%aaSHwIQ>an6111gU|!R0 zh%|)m96$1yx|140nw~~}F9N6XtkbaqXYd>AES!gP(1~-kb#cnAfT?W?QECA$!OOJ8 zT}6w#~4LMwg=?RYOEm$`bVjo%65LdF}K@`*;#EmNm@Oa}k94ER$hp=!Qk?|uBi3>cSUL151Kopnaz(Gnb(tsuScKUz|Fuk>11W|;!j4)3Xmo6W(XwM2txSq|UE3tunCMIyI*glEV#&s~1GaxJexQv1J37kHOGx&3+>|`9A6~qfg9Y>5tY^O0h zi24#1g`LdBmtr*|dp%=$D|T_kg3CxPAYP4zBI0}zalQ;OoxHG9@bZ!Dd0y2Lt-+&) zr*SqNaZX=b-MKV3G==kmn8qs3b%;aD5?QiVM|nFtUX)Av7UFzWxPdfvu8OobM5eGh zfbk=bwAFPH|M@|*mD1XSI7E2EjAe%q_b}%7(#0u48X@R3!Di^0tcKXdGOz(P8e*6; zRg~Y$x%1Ja<6qKr*oR$3dQx2FP0w%{p{77F^*#Arq*ijG7J+BcW*}oA%glHZr%{w& ziyl4XJIEeT6W=j`Kxmhgb$0IHlvlfBI>7RD*FJ5f6c>v7b|{P%RXspSDU01foiP;( zV|>=a7;U;8QK^v8&haCUHp%f`$ylVFcLh~n$*i~v30%#pcnu540TzyHwMkMR6FzYv zN;PV_B*?pcGXs=$XVgbes!$*2AovVw75QoRDhI!#e1iIXg6h4CPTzZ_i>`FN)X@m= zzj|R@N3O2Nd?u>|uE$q>k*|G4&1dig;W8Yb#04cq9^p4q-A!c*!bK$exg~(hnJeHy Ne9H45eLEx3=KzN30r3C; literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/uitl/CardUtil.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/uitl/CardUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..9fdf6341377236e7123e95c35f94de850fc12024 GIT binary patch literal 2772 zcmb7G-%}G;6#i~D$&zG|9|DSqMMX^_5K#LA0=5Wh(+02wp~b3Q!WI{kO}g2j*k3RG zC;HOqbUNd!&U9MoL#I!D=yRvjf1|HVTl?MJK$aj@9+G?Sx#yhwecw6vCcpjr)6W1d z;EO0a@Ky|OBP+kAR2-M%bOb79R9usbccN&=yD`in8^s*1%h`Mk3wSSv_pvCyZm9Sm zhGyJUaVv^e+>YTx=qi>}01w)+{^ej65}xW5Bp=>+1r68yNv%^20H-;>9)BhY_ia5$M>7YrV9Et*tI( z^hV|)@ifjldhYI&UaC@v%$h5f?o@1YJY0{?jd2lb9*vojcj~En&$Lg1nUdt6mc-Pe z8$gXhCEeBwQpcKBRY!r|daS#hB=+I@Q%9fWx7#L>G&#koYm>U8-(D~+(ia%=XQL&Z z$mWWLl%rSdN;#D)+D6K-9Mf4(W#-)45P?#Vkxf3hGEgAB(=zHU^SZT?%24(jNQXHH88oKO_TE?;rdm^uw z%LeP+zEhE2*Na?3y4U7C|1WmLEZ_F}hnHbdVEkDr_obDJWfg4nTXll$E6Iz97o9Cu z?3{7Mlut*aEVg_O2ISq>a0rK0e57FocQlw-)o>Si4X1HZpt=5b$W3~j$FPcm3QI!~ zB@G|LR#DdAph89()^Jb5eXt$}YYz;2)6-qU1G&{+OYWe>s~{XaSU5`inhRkno+)ie9Ow_0}90_m~Wo4V$jqc&m?@e z$UBhz6ZRe=>9Bh{!7gd6B`1G@?mZxScbX5hW!%eHWkm}+_wZ_jCw~ePg8hT1Cj_@?xJnW-zPe~8>rB{p05yZ#3{~g z6{9!)yw==SFsd&v`(pOKht-J0JdX26wu8UPKnUy*9Oic?S1FD{T9ZFQJmw^TBm54# z#u&Od*E|OtMK@Ow9K%cWlEIHS200EWV@H!42nc+O-sI5@C;|L};B>z-(De>PfybK5chjXLE(94aRMhf z@>KNV6h}GZ%_GV)oO@{HUYx50KT#-u6I<^lsVBLXIU?xe2_B2@m{*~F(8uER+3ykF zW}{1Qi5yl_%^g2*Gz6kqjD`KlMj%Xo$RHHD<*Ra!hnUUTyfSM&bG zJd)A14V)*?$n#rRk0I7$j1|d{eU_R`(;}6-z?zLw*Ab*S8)Dmz z;&tX|q4f=n6E9I#xyjijOjOnE;GX9{Nq^5v@|C)_K=}vVDlV(IvWbCBhIleuWzd^+ S2oT6cj#2J3^Z)2rIPxFaNS$o} literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/uitl/WinCard.class b/robots/zhipai/game_mj_fulushou/target/classes/extend/mj/uitl/WinCard.class new file mode 100644 index 0000000000000000000000000000000000000000..4aafcbe01dfd44d0fccb32089571aa39041aefca GIT binary patch literal 25016 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 bq9+ug7u4Jmy@~%B5We&~NQ|a?JpTUzK*d1& literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/game_mj_fulushou.jar b/robots/zhipai/game_mj_fulushou/target/game_mj_fulushou.jar new file mode 100644 index 0000000000000000000000000000000000000000..b846adccbcdb2492a1c9d0b35d8e7e49c209d36e GIT binary patch literal 112331 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 TLLjHXzeI2%!h9DjkdXfYej-n& literal 0 HcmV?d00001 diff --git a/robots/zhipai/game_mj_fulushou/target/maven-archiver/pom.properties b/robots/zhipai/game_mj_fulushou/target/maven-archiver/pom.properties new file mode 100644 index 0000000..47cc103 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Sat Apr 13 13:11:30 GMT+08:00 2024 +version=1.0.0 +groupId=com.game +artifactId=game_mj_fulushou diff --git a/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..8e3953c --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,55 @@ +extend\mj\player\rule\RuleOtherKong.class +extend\mj\room\state\EXRoomSetpState.class +extend\mj\player\state\EXPlayerDrawTipState.class +extend\mj\EXRoom.class +extend\mj\PlayerRuleManager.class +extend\mj\room\state\EXRoomDealState.class +extend\mj\player\state\EXPlayerDiscardState.class +extend\mj\player\rulestate\PRSelfKongState.class +extend\mj\EXMainServer.class +extend\mj\tip\TipManager.class +extend\mj\TagAnalyseItem.class +extend\mj\EXPlayBack.class +extend\mj\RuleWeight.class +extend\mj\SettleLog.class +extend\mj\OpCard.class +extend\mj\EXActionEvent.class +extend\mj\player\rule\RuleOtherWin.class +extend\mj\player\state\EXPlayerDisCardTipState.class +extend\mj\EXGameController.class +extend\mj\player\rulestate\PRSelfWinState.class +extend\mj\player\rule\RuleSelfKong.class +extend\mj\room\state\EXRoomStartGameState.class +extend\mj\player\state\EXPlayerWaitState.class +extend\mj\EXPlayer.class +extend\mj\uitl\CardUtil.class +extend\mj\player\rulestate\PROtherWinState.class +extend\mj\EXScore.class +extend\mj\player\state\EXPlayerWaitKongWinState.class +extend\mj\player\state\EXPlayerKongDrawState$1.class +extend\mj\player\state\EXPlayerTipState.class +extend\mj\player\rulestate\PRChowState.class +extend\mj\TagKindItem.class +extend\mj\tip\Action.class +extend\mj\player\rule\RuleChow.class +extend\mj\player\state\EXPlayerKongWinState.class +extend\mj\room\state\EXRoomDealState$1.class +extend\mj\uitl\WinCard.class +extend\mj\player\rulestate\PROtherKongState.class +extend\mj\player\rule\RulePong.class +extend\mj\player\rulestate\PRPongState.class +extend\mj\room\state\EXRoomPiaoState.class +extend\mj\player\state\EXPlayerKongDrawState$1$1.class +extend\mj\Config.class +extend\mj\player\state\EXPlayerKongDrawState.class +extend\mj\CardNiao.class +extend\mj\tip\Tip.class +extend\mj\tip\IRuleBase.class +extend\mj\player\rule\RuleSelfWin.class +extend\mj\player\state\EXPlayerPiaoNiaoTipState.class +extend\mj\room\state\EXRoomDealState$1$1.class +extend\mj\player\rule\RuleOtherKongSelfWin.class +extend\mj\player\rulestate\PROtherGongSelfWinState.class +extend\mj\player\state\EXPlayerDrawState.class +extend\mj\WinCardType.class +extend\mj\RoomCard.class diff --git a/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..6feafc8 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,51 @@ +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXMainServer.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\RoomCard.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerKongDrawState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXActionEvent.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\tip\Tip.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\TagKindItem.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RuleOtherKongSelfWin.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\uitl\WinCard.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerWaitState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PROtherWinState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RuleChow.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerDisCardTipState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PRSelfKongState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerPiaoNiaoTipState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\OpCard.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PROtherGongSelfWinState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\RuleWeight.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\room\state\EXRoomDealState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\Config.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerDiscardState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RulePong.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PRPongState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerKongWinState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXPlayer.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\room\state\EXRoomPiaoState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PROtherKongState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RuleSelfWin.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PRSelfWinState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerDrawState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\room\state\EXRoomSetpState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rulestate\PRChowState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\tip\IRuleBase.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\tip\TipManager.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\CardNiao.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RuleOtherWin.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\TagAnalyseItem.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerWaitKongWinState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\PlayerRuleManager.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\room\state\EXRoomStartGameState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RuleSelfKong.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\uitl\CardUtil.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerTipState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\rule\RuleOtherKong.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\WinCardType.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXGameController.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXScore.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\SettleLog.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\player\state\EXPlayerDrawTipState.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\tip\Action.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXPlayBack.java +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\main\java\extend\mj\EXRoom.java diff --git a/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..8c06621 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +game_mj_fulushou\Main.class diff --git a/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..b814577 --- /dev/null +++ b/robots/zhipai/game_mj_fulushou/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +D:\project\javapro\javapro\xtserver_anchou\majiang\fulushou\game_mj_fulushou\src\test\java\game_mj_fulushou\Main.java diff --git a/robots/zhipai/game_mj_fulushou/target/test-classes/game_mj_fulushou/Main.class b/robots/zhipai/game_mj_fulushou/target/test-classes/game_mj_fulushou/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..c82ed0381aed41bfc9793fe52d80783d2cebbfc1 GIT binary patch literal 503 zcmaJ-yG{Z@6g|UhU|j`4z!wD_Sh$T=7#kC-^^rhmEXc5q%aDDT*;)R}Mva9Z;71wn zA_*46DbBt3+_~q>+^_GCPXK4=SSX@lVGqp=S{!YTeTLG7ij=uz$oKkVhQd|+C>g4* zisWq?PNg1+X+TWfjXe>Jg;rU;A`51w5{9