From 4e763626844ff1d4fa73081f3a5ae07b0e498b4f Mon Sep 17 00:00:00 2001 From: zxw Date: Mon, 17 Aug 2020 23:46:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4landlords-client-javafx?= =?UTF-8?q?=E5=AD=90=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- landlords-client-javafx/README.md | 59 --- .../images/choose-room.png | Bin 9109 -> 0 bytes landlords-client-javafx/images/connect.png | Bin 17060 -> 0 bytes .../images/input-nickname.png | Bin 7100 -> 0 bytes landlords-client-javafx/images/play.png | Bin 94349 -> 0 bytes .../images/select-modal.png | Bin 6907 -> 0 bytes .../images/ui-class-struct.png | Bin 27808 -> 0 bytes .../javafx-netty-communication.md | 178 ------- landlords-client-javafx/pom.xml | 78 --- .../landlords/client/javafx/NettyClient.java | 116 ----- .../landlords/client/javafx/SimpleClient.java | 60 --- .../client/javafx/entity/CurrentRoomInfo.java | 125 ----- .../client/javafx/entity/RoomInfo.java | 41 -- .../landlords/client/javafx/entity/User.java | 73 --- .../client/javafx/event/IndexEvent.java | 15 - .../client/javafx/event/LobbyEvent.java | 57 --- .../client/javafx/event/LoginEvent.java | 26 - .../client/javafx/event/RoomEvent.java | 61 --- .../handler/DefaultChannelInitializer.java | 35 -- .../javafx/handler/SecondProtobufCodec.java | 29 -- .../javafx/handler/TransferHandler.java | 64 --- .../listener/AbstractClientListener.java | 28 -- .../listener/ClientCantPassListener.java | 32 -- .../ClientConfirmLandlordListener.java | 52 -- .../listener/ClientConnectListener.java | 25 - .../javafx/listener/ClientExitListener.java | 27 -- .../listener/ClientGameOverListener.java | 27 -- .../ClientJoinRoomSuccessfulListener.java | 28 -- .../javafx/listener/ClientKickListener.java | 33 -- .../javafx/listener/ClientListener.java | 14 - .../javafx/listener/ClientListenerUtils.java | 100 ---- .../javafx/listener/ClientPassListener.java | 51 -- .../listener/ClientPokerInvalidListener.java | 33 -- .../listener/ClientPokerLessListener.java | 32 -- .../listener/ClientPokerMismatchListener.java | 34 -- .../listener/ClientPokerPlayListener.java | 26 - .../ClientPokerPlayRedirectListener.java | 34 -- .../listener/ClientRestartGameListener.java | 16 - .../ClientRoomCreateSuccessfulListener.java | 28 -- .../ClientRoomFullJoinFailListener.java | 23 - .../ClientRoomNotExistsJoinFailListener.java | 23 - .../ClientSelectLandlordListener.java | 38 -- .../listener/ClientSetNicknameListener.java | 26 - .../listener/ClientShowOptionsListener.java | 27 -- .../ClientShowOptionsPVEListener.java | 22 - .../ClientShowOptionsPVPListener.java | 25 - .../listener/ClientShowPokersListener.java | 55 --- .../listener/ClientShowRoomsListner.java | 27 -- .../listener/ClientStartGameListener.java | 65 --- .../landlords/client/javafx/ui/UIService.java | 21 - .../client/javafx/ui/event/IIndexEvent.java | 7 - .../client/javafx/ui/event/ILobbyEvent.java | 17 - .../client/javafx/ui/event/ILoginEvent.java | 7 - .../client/javafx/ui/event/IRoomEvent.java | 17 - .../client/javafx/ui/view/AlertUtils.java | 29 -- .../client/javafx/ui/view/CountDownTask.java | 93 ---- .../client/javafx/ui/view/EventRegister.java | 7 - .../client/javafx/ui/view/Method.java | 10 - .../client/javafx/ui/view/UIObject.java | 101 ---- .../javafx/ui/view/index/IndexController.java | 83 ---- .../ui/view/index/IndexEventRegister.java | 44 -- .../javafx/ui/view/index/IndexMethod.java | 13 - .../ui/view/index/ServerAddressLabel.java | 19 - .../javafx/ui/view/lobby/LobbyController.java | 91 ---- .../ui/view/lobby/LobbyEventRegister.java | 50 -- .../javafx/ui/view/lobby/LobbyMethod.java | 18 - .../client/javafx/ui/view/lobby/RoomPane.java | 61 --- .../javafx/ui/view/login/LoginController.java | 49 -- .../ui/view/login/LoginEventRegister.java | 39 -- .../client/javafx/ui/view/room/PokerPane.java | 162 ------- .../javafx/ui/view/room/RoomController.java | 452 ------------------ .../ui/view/room/RoomEventRegister.java | 79 --- .../javafx/ui/view/room/RoomMethod.java | 42 -- .../javafx/ui/view/room/ShowPokerPane.java | 102 ---- .../javafx/ui/view/room/SurplusPokerPane.java | 23 - .../javafx/ui/view/util/AlertUtils.java | 29 -- .../javafx/ui/view/util/CountDownTask.java | 93 ---- .../client/javafx/util/BeanUtil.java | 17 - .../main/resources/view/assets/css/index.css | 93 ---- .../main/resources/view/assets/css/lobby.css | 79 --- .../main/resources/view/assets/css/login.css | 39 -- .../main/resources/view/assets/css/poker.css | 13 - .../main/resources/view/assets/css/room.css | 250 ---------- .../resources/view/assets/image/add_0.png | Bin 1533 -> 0 bytes .../resources/view/assets/image/add_1.png | Bin 1535 -> 0 bytes .../resources/view/assets/image/face_0.png | Bin 2235 -> 0 bytes .../view/assets/image/profile/profile_1.jpg | Bin 2630 -> 0 bytes .../view/assets/image/profile/profile_10.jpg | Bin 4257 -> 0 bytes .../view/assets/image/profile/profile_2.jpg | Bin 3843 -> 0 bytes .../view/assets/image/profile/profile_3.jpg | Bin 4015 -> 0 bytes .../view/assets/image/profile/profile_4.jpg | Bin 2005 -> 0 bytes .../view/assets/image/profile/profile_5.jpg | Bin 3755 -> 0 bytes .../view/assets/image/profile/profile_6.jpg | Bin 5374 -> 0 bytes .../view/assets/image/profile/profile_7.jpg | Bin 4241 -> 0 bytes .../view/assets/image/profile/profile_8.jpg | Bin 2492 -> 0 bytes .../view/assets/image/profile/profile_9.jpg | Bin 3918 -> 0 bytes .../main/resources/view/assets/image/quit.png | Bin 3121 -> 0 bytes .../main/resources/view/assets/image/rear.png | Bin 1451 -> 0 bytes .../resources/view/assets/image/timer.png | Bin 8995 -> 0 bytes .../src/main/resources/view/index.fxml | 41 -- .../src/main/resources/view/lobby.fxml | 32 -- .../src/main/resources/view/login.fxml | 17 - .../src/main/resources/view/room.fxml | 153 ------ .../event/ClientListenerUtilsTests.java | 23 - .../listener/ClientListenerUtilsTests.java | 23 - 105 files changed, 4506 deletions(-) delete mode 100644 landlords-client-javafx/README.md delete mode 100644 landlords-client-javafx/images/choose-room.png delete mode 100644 landlords-client-javafx/images/connect.png delete mode 100644 landlords-client-javafx/images/input-nickname.png delete mode 100644 landlords-client-javafx/images/play.png delete mode 100644 landlords-client-javafx/images/select-modal.png delete mode 100644 landlords-client-javafx/images/ui-class-struct.png delete mode 100644 landlords-client-javafx/javafx-netty-communication.md delete mode 100644 landlords-client-javafx/pom.xml delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/NettyClient.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/SimpleClient.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/CurrentRoomInfo.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/RoomInfo.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/User.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/IndexEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LobbyEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LoginEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/RoomEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/DefaultChannelInitializer.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/SecondProtobufCodec.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/TransferHandler.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/AbstractClientListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientCantPassListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConfirmLandlordListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConnectListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientExitListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientGameOverListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientJoinRoomSuccessfulListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientKickListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtils.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPassListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerInvalidListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerLessListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerMismatchListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayRedirectListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRestartGameListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomCreateSuccessfulListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomFullJoinFailListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomNotExistsJoinFailListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSelectLandlordListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSetNicknameListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVEListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVPListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowPokersListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowRoomsListner.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientStartGameListener.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/UIService.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IIndexEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILobbyEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILoginEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IRoomEvent.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/AlertUtils.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/CountDownTask.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/EventRegister.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/Method.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/UIObject.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexController.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexEventRegister.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexMethod.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/ServerAddressLabel.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyController.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyEventRegister.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyMethod.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/RoomPane.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginController.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginEventRegister.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/PokerPane.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomController.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomEventRegister.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomMethod.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/ShowPokerPane.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/SurplusPokerPane.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/AlertUtils.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/CountDownTask.java delete mode 100644 landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/util/BeanUtil.java delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/css/index.css delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/css/lobby.css delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/css/login.css delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/css/poker.css delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/css/room.css delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/add_0.png delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/add_1.png delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/face_0.png delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_1.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_10.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_2.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_3.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_4.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_5.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_6.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_7.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_8.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_9.jpg delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/quit.png delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/rear.png delete mode 100644 landlords-client-javafx/src/main/resources/view/assets/image/timer.png delete mode 100644 landlords-client-javafx/src/main/resources/view/index.fxml delete mode 100644 landlords-client-javafx/src/main/resources/view/lobby.fxml delete mode 100644 landlords-client-javafx/src/main/resources/view/login.fxml delete mode 100644 landlords-client-javafx/src/main/resources/view/room.fxml delete mode 100644 landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/event/ClientListenerUtilsTests.java delete mode 100644 landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtilsTests.java diff --git a/landlords-client-javafx/README.md b/landlords-client-javafx/README.md deleted file mode 100644 index f635f45..0000000 --- a/landlords-client-javafx/README.md +++ /dev/null @@ -1,59 +0,0 @@ -## 介绍 -本项目是一个使用 `javafx` + `netty` 技术构建的一个桌面应用, -是对`ratel`应用命令行客户端的扩展,为`ratel`应用提供可视化界面操作方式。 - -### 系统架构 -* 使用`netty`构建和**ratel**服务端的通讯 -* 使用`javafx`构建`GUI`界面 - -## 快速启动 -### 依赖 -* `jdk` -本项目是一个`java`应用,所以运行需要`java`环境,前往[oracle](https://www.oracle.com/java/technologies/java-downloads.html)下载最新版本jdk进行安装 - -* `maven` -本项目由maven构建,构建本应用需要先安装maven,前往[apache maven](https://maven.apache.org)下载最新版本maven进行安装 - -### 安装 -```powershell -git clone https://github.com/ainilili/ratel.git -cd ratel -mvn install package -``` -#### 启动服务器 -```shell -java -jar landlords-server/target/landlords-server-#{version}.jar -p 1024 -``` - -#### 启动`javafx`客户端 -```shell -java -jar landlords-client-javafx/target/landlords-client-javafx-#{version}.jar -``` - -## 使用 -1. 选择服务器地址连接 -![连接服务器](images/connect.png) -2. 输入昵称 -![输入昵称](images/input-nickname.png) -3. 选择模式 -![选择模式](images/select-modal.png) -4. 选择房间 -![选择房间](images/choose-room.png) -5. 开始游戏 -![开始游戏](images/play.png) - -## TODO List -- [X] PVE模式 -- [ ] PVP模式 -- [ ] 优化界面 -- [ ] 页面切换 -- [ ] 挂机检测 - -## 反馈 -如果你发现此客户端的bug或有任何疑问,欢迎提[issue](https://github.com/ainilili/ratel/issues), -或者你也可以直接联系我([zhangxunweia@gmail.com](zhangxunweia@gmail.com)) - -## 参考 -* [NaiveChat](https://github.com/fuzhengwei/NaiveChat) -* [ratel部分协议](https://github.com/ainilili/ratel/blob/master/PROTOCO_CN.md) -* [javafx和netty之间的通信](./javafx-netty-communication.md) \ No newline at end of file diff --git a/landlords-client-javafx/images/choose-room.png b/landlords-client-javafx/images/choose-room.png deleted file mode 100644 index 3c408936cb714fae2a038acecd2af2a2c68a0757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9109 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 BoT&f+ diff --git a/landlords-client-javafx/images/input-nickname.png b/landlords-client-javafx/images/input-nickname.png deleted file mode 100644 index 2818cfd8453c008277f4772c71bb360d3db812cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7100 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�PS#zM3!$S1GEQ$0ZuJ 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 qx`F?@_7zyH`Tv(+^d^aipao1Tl$vyWw``dee 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 diff --git a/landlords-client-javafx/images/ui-class-struct.png b/landlords-client-javafx/images/ui-class-struct.png deleted file mode 100644 index 13f80a31be29149c343c091a77273a1ed89a7d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27808 zcmbSzWmwc(7cbz@H3QN$3?Ly$N_T@uNGe^@-66=(B_Yx!BAwEmN=SEylyrC9Kb~{m z_q_LhyB~OXnAv;nwf0_ntG z7HV3~|9p;s2#|44b$QjV*e(igwi|Ivv`2c04)zanhcYn*NQ*O`+q|}~nzyMQCG}tM zeiZejIV9BXOLNepZY4y!U7kgK*PJ9MPonha?H?{tgeNZ8e%x8ahCrM)Qb$KiPb^FDZ%?&eF1c(o?;x^OTDp%PdO@ zV|mRHXR%UGfmJeF(;WVEWWt%Sh8zBa50c5zQ^LAo6^b`xsPv)XQ@hTuxDvVUopnkck&Ca z3@MFAOunDicUX#RwP6u6&sQKVhHbU;OPGnlts-rU9285arp@r$2!iC>hCb^?c#y*6 z9tp)-jv(0CTV#|y)BG5x#30M?h8sCiCb@2h$PpEZ8|E4#h=5?3Bqu4R=B~GshN?5x zP1GgiwXap?wlgo_B~hNW!B~BK<8`(mJ+&}`n1A8@j z??0@QYLZ|&-M{x_|Js8}xPtYg97odS;S@u@nB?TETT*=(4UHj- zmhefB)vV%2LjDE+m!hvVbqbS!dz zGdeRf)6wA%>D8{WZG+j_*}2}a%14ok5to_DBGEavGG{5X=O!hQbgMc$pL~&tA~qY& zlA<;-Udu8JH%NGQe)YZPOmkj5zO&`gYEQIQgR4zAAq%l@o#PrD4v%MkeKe{h z!lGRraY)4Yik2!E2^pgm?do8;BY{=_ts}Sj5Q4mc4-(W>y+DmR6!8&?sBEqC<|{3? z!E~V|My)afX=xOJd!ny0kx;BD4q87vJ_ACP)x=|9YlJ*c+|TzYK<}{0xKB<_bbte? zby%6HvBQn!^1e6#K5YdPaIh85HMrp#iGmxbd@c~>og5v%RaORM;u1c$7%>4(MnMtn z1n%#jlmVK;xT*T~?P|AX(cp_RZyt3-bKC2BXN$dJV!HpXuB;7`i6AyKG2ybAsr*18 z;OXHZ#_PJ)`{{UNu*KsT1xa+mlPj7}pBoVQKM?dd0{Jw*yN>Tst$5qdX*O_Eqj+{3k3+#9ed3Rb z>v^`rXZ!<;__4o6yC|`AZ>fIE+YK2offyw2VVQ)T*>7w+*l1|Hj;mV+ChC&$N+2>ji_zXTjrYu{8^8X6kz z5Qr%?xNM&-cc2c<>HFTEc81~ur|8e_-r&0XBZ5Q~IG|jmjBm#@Az_(l@)RYN5XZ-2 zL(CzQGnE!A>+90C^6ydGI{+nnw+#!k0Fjbb>+9OmVGLnm;>$;s)z%xMk3*_o^3bfPFzOyhUkn=|}JQmJr4x9t037>ix~}V4o7h>T1u&zCqw-t7e5lncy%67g6DE z<+xqi!7p4EBLTasVM`zBl|+w{pIfa1H&*0)XL>YWl|BTqXGA)ZG^XqW;y1tb_BU~8 z6D7LW8NPSZwGPH#2W zxVgFH{78i)Or>iGi?8CEo!?&&%4;-J2)U03hhn}562`B zhoiv@a7ek(PD(6BbD-gUSuWcX&+Qfj>FCyep2LWViFw@*4BoOeyt_UtD`V4=pa1=P zu|*`WAT(4ilJq%Lu`feJ1oVmR*E8LEuFj~kj#X(+_$uLJG1?cXfZf8ldc{R1+p2UX zF#y`LPsGG}W6DADH61G=gA_+qQbxxA2c*tqs?I6*)2H!BG9FPaLx{FFm7qHU?Dxh- zSMLXCK~@}KBwGw336>nmM1!HhER;bIPz)CXumQ59 zkHtV@wAf*pALP8QmrX+yVDV=k%s!|`(&RI(JvZEX&6SC^MQr}f^^#w<6Hnaq<5k%JV+=5jdi$?wBgUUEd)G9jtPk5<;Vz1y zYQVhLf6bH4?us4QtXZ*_l$10vF>!Wwwze+H>UnzblIKcnJkz2aT4?`LPht|( z5{-g;VaS-K&l>4Gfd7+wdS<4+zFz!3fEOA5xSpTO@89dholn&wkljyoG$rHUrdOX< zs%H-RZR_P4Ewg5~J@V1Q@Th&dl@c>x(d4{RZrqjWE1rt9Qk9rU3=k6gpuRP0S?hJY ztQTHW+i*Rb_HkMy#6iUOva)7BX$|;w^IiF0GCe+>>T{kRuX{1Sjm6(IgBYL`)Ap+S z5g)Zk&5Perz#1(-@c1_lSGp+3$)U1-F{HW_$)a+f^pYyZz79aU-nl}(8`n<`hU-=) z(oa#hd_Nr}N1rm2DuZ0G?4knq++2qw7fU`ieOTDQpt6zKmr(339Zb{c9>~v=_eWK5 z+~fOxH$zc!rn2s}p;0z1DOCF3eO%rx2M4*krT;QLj+hXTdV7p@)bVCc?=$@qla1Bl zk?@KHzLP{t-+gM$BlrH@Hvc6b{L?ylkC)w^gxCyl{-9ao6(s99OY9@TEOD%Ej&5A5 z&E4je`dY0s*$f94mtDM+T$^tRh^tT_8}sh)pWi0AAQQByyh5NXj-;^Gq3plL&b&vW;s?<{V<>5 zd{MBVR@1N3ZRPIQ6>kZC9G~Rdl^aR*etO!!D;@!O7P%+a1)j>{cQ=z(n!TYcaD7~jIJL}I&N_ZRHm-@`&(wl$urWNGcr{Ftror@sTjDbaUN=%m=_ zR=-b~$v?9e3P*V?Mj>%J)s6g9sOyb`lzl(m_F1u)KLO(_EKgFo!Q{%oUX*Qd^c_XK z$Ijp@x%^jj3oW=b=?*I>+~&#^GEuH-Zbr=1)U^g}NEssfP!S1c4L6XU`(LrcADv;F^T6{5(ee8>1}HjiK#~3gViB_HfWJ(?@V#|u zZS~VlvNnj1$0U7TfE_C26@RujZ#YxAZ2B`EK7)xRD9e#5SO?ik%Fh2No{EZFVm()j zlS-t82}d73YQ=cUYm*}0D zyslX&__+jJt%Yvp$_(GmR!16w5@H=4esz9c>B2?X*qeXB!hFR>*IGZ+C9AJn@s=s# zF2r|p1bx1tCNdIRRGc~OS@ZL$;p9^|g2$iLW zar+yZ@AIpolKX_koI~%*~obwWovIHuZZPf(or9yT03?4<@8-WAOGxJTs1w%+16ES>|d2tAFd|Nj|HC zI5qSGEsM!UcEMPQz1elcdEHj^u`}D4$?&i5k=ql9q=l4c1ukQ!2n?m)2- zuUqa*)`S?9%b}U)dvz+Nul{w7W#FHV$k8>fSn+^(N4yP=ytjDH>$Hy6`Toh1Dnn(g zVaXU+pcsaYH8%l6bc;e#Y^Qv}GqDoaD!aw8pWAk?kRm+9CKLB+JWn4J6G3S1Zb zT4?%dAc?i2|9d&Y>G0QKCghKh_oWOWp#EG1x*Ex;h(yjP!nR|MCwLJNm5(5_kCcpV zuif+-T$69K)$!j2T;Ld)Ji%or-Wo`Lj)$i_$QDZngi*SQKSQdl$n@)-W6!hSf7C6H zC?9;x{*R9@=<=*0PU^CPDa#kADfk+UtR1V8XA2dwIs-@ zKHex^n^u2$S0xH0b>n?52u5rdEGk)39l_~r5&h@8z(EOU-JMP%MqeB(lbh?mdIj2- zGt^`@9!r8fG5L?N4d>LX*VpJIU&oH4RHB7 zjZM@(2pS;H<9hOj%y&gCD+_ZDxHwGXtmx#3t|QhsZG4Dl(Z(=RAf^^q3L?grKRB5~ zPR5j|Q_2_^OyVT%tphGZ5yKx*y=F+a_6`;*miq|;N&fdGGQt*#_g1YOad=2cH74RSH+y%z2-W}sH zb8TBsV9(C*4w368c>Hs7W&EsaCUqv!Qx058vE&;oYS-Olp)pQ1nlW57IuAwJbPAvr zb{!3&xq6@X+)ht~c9rc=;(*uLTq$;4h>@)m#Q{Wr(_%=eW0t{aB>uNyR*U*%)+?B- zRokDtNK7JPNwS$`t7|>Z27t`}CwUU?+8sslU5%OW5I) z?zv7M>=B=?r(#V1@D(#h<~uf%bWSs_Yjwe@f5mBQ(;pWvPZN>q*Dvh`4xy`lsnPlw z^ey<`oQ^as9DCJs7e>E1D+gYJsH0S)7(YLv-*oy{ux1Br$o5jweX)I>(Lj@MH#ZO< zLvz#JG^qu0vzU-6PTsqNe|+yP#oeoNDiXRlvQB;dhUp=XkP?cYqTvykM4_RujC3Y3 zTq~y@Gv3Dr3twPb9K5HB7pL3{yLt=kCY?IQicwObzr<*aYb49g`s*2ij3M zy&SCd9G#ptn<34O|3Xo4=HGWPSv8(lQK9i8ke68gzXB?J5YiwAV%|8}|9%!B=~)z= zrV3NM2u(b-+{odKJvu?0Z9o%2@|bV*vh zGl$Z_1DO>nwE4diq*Wx1#`lv2w6DH4{&V~^F_cgLKez&NEsSYCy8j^*JQLvU^YY)) z#CqnvOdMeRciI;!IQC@q*y`V@R!lc?kvn3kx?J{u<9=zF5RhN|Pv#eTq6O%}zf&wA zl?&WS{U1`YQ3T(dw*!|zFlk+-fr&g2hv+FVpu9{V1 zo;7K5rl~Yeo8Gck-x8@Ep*hd`*Q1P3LpCuY|+4AFhM~< zYa5%W&16+m&nbd!q;@gZA&~uh`$YRPc6N4W0&~)S4MsIIHB2>}CQ(+%w{&bESr&qE zaNyn9H2|sPu~3Ps;y9_hV;@q($UJpWR>B%KFBh*UuLAGX)Ra~|23I6X;o|}%CQtz~ zQ?Oo+FPhFE3Xo}2B6h^T0K9oepzjh6|M%u`*=y4jL#Ty*4(iQUq7B4tPJbcAKZ}f+*cZkoHx-aprIx{v*qQ_ADL43W==s&aW6L-|U3GDVu zhl++gT0=z}NBSh;1(86J0x!$R*=at*M~OU=P(5lvWY+--9X@eU*Ky&2ez7ZJjP>&G zi66=yB76&o-6|YdnCdve=ROdl-+(ALc}L74Ozno?Ja_0EeJ~jE9$@}UuWB0=l_2Kk z^Nz3L8H0zVo2EgJb_B_h$kE7gns&VM%(@{C4+EXNR))8Ko&hzN#yUqH?@kU)nhLU~ zxY@LgpNYsw?a}O^_PqAW_U0$Q>_h`as{mPA0a-3QoI6*31)Nr%|4blihJd*|COBGZ zMxP0V-k+8GAq77|MGi(my_maYZo2qMln2fuoCzo9eGq`vyM6E^<>yUYu9=|l=Jupx zk=Hol`8i*kl7^lNA~5Na{3N0bHb}Ws1=Y2sg7?%Ep5YgWJ;dZRj zUvJR^*W%~-G{hhEVbjxNHr28OK$3G_IS?96$=$NAsaebEgNxT()MtWzR+V78Ndo)e0;P>-EX~7biM9_!th7pK<6xUT; z^6owd8PphVSg^wA07kJ7_I^BaTR}`>%s)Z8MR6r|C38*JdoPO)Y#V1P1@HZ`A+`c!DHp1nd{yTGET|%?zL1rjQd+ zh$Jlr1N1j^S1KDd3<{G13VCdVgl!GaWEX%9&+bk_JjUAN#>sl%qsK54_XPR|2_P?+ zv7$fv>|MJ()vk0UVi+{bkV81Po-}E5H{2ZMHkK+28yMgJWl$B*O;aj>0i2O@Q|HOv-DqKeqsEPt#V+14)gz@dY^n%cm0e`MG#z=XL zaSbZG$R&cxKCC<;cb|CE$C!AAA=TMUa9*T1tOvS80fcc81?fii2@88GvJMHCsZ4S0 zAT%L}HT%IBP(~Jf+(}@gW&$F%HdE2xby}*ixiM1KuTJ~zHOMG{ayv>U(e&E(`?t06 zV5TohOt8lcaHIDj263O(eu4$Ks=r^(+NXJ%st7QvfLt)cGKrxuG$HwCEn#o92&t@t zVR_ohpzjD_naiXQu@;Kp2cJbl^X1DIV`JmRmdS>EVksT0zw#eSq9D#uQ_YQMr+GX}Cq7TX!cyy1vm?cO z2;JzHb%B`t1r|F%I&*4H-+5|5_pGB8O zhDOWp<=bBZZaNr`y9X725B)fD?=PG$)C%S=C*$AcaDji$R58(PwVbFJENC7UINjI z%4hK;kK-R;L|8IVgK(tz;y7NY83e{l1=7cWG(QHszUgT^4szkfdX3@&ur3p8a2moj zP}w|MHHOB{4x4B4^u0s{;T&Om4`SrPw&&4uo$^Co-+kuGBj)ae= z`%Zy=OVCXUZIcfLhDB0ewOT%2r(EdL&jc~Pc!^MGfFCj@q5D~1)G8LPh(<#-dyS~g ze^eD;EP+WdCevZp5{j+JB*=}n&9A=K&k|4EO%nHrMx&RCVt0VBi;Ra{KA!p6#&2Dq z5LBml_Pm+=ry(A+tBl^XH;xviW5aPx-U)Lo=rh_DIVEK5zHSElCn%Bc_UnY?P))ym z?#GkoZ9i<1;U+td^FP&v-hh-S?d|v?w3&@2ccw z{b+o=gM`-!f3v#`5gYk3#AS-qmyj<6iR;&2=dwblvr*MhK!sROWeqR48tZ@GOTMlg z=iE*l6LS3#ls4+H{;MqM1)xHN#O`I{fgG-`+THWZK>Z`Op~D}=g@QB37bvx0NeMWc zOY8o8Sp4wNuZ&YEg<$7L$^&Td7iEw`$ysBH z0cWn25=cL2Mu3MqS8|Abq}VuP04juxL5RR;J)Zw^Jo(2#h4@++Jxp)$zA=Rahzsv)C$xnUB4K1yb*AFmcwD*18B|%ambi-RBUq0navQ4VKC04>So%Z zOG6$t4K{C9oMAOm;1H7~WzhY)ydWk?>Yhfdt7Wv8LR&Wld%S~3`s8o3L>O6Vhxk@; za*Ht>v&^Are2`CYavx`QlFMtyxSs_aY4ewH3YVU#K>!55j!Vm^n=1dAsM8Ny88THk zh(n&s8e))ujPY59LKVwO0Cref`!@M9zBRsnThH8Tjr2RYg2|~zl2=?&X>`$ESWF!Y zxP7Z{K!*0KvyQbgD-a)i=35qj!Lx+}egd)syVdD;xgG1aXBLOyzT3;Zet7I7&B%#- zx|fWjA%0nDDb2*vwR7A4*8X2zpZ6otvx*|C4FlVu_)HRLF3zAxjeAA#ogB z;dPVZl6s;=Blh@n0UA6j@FZn*#gwn*Cy^8LHenxJ%m%&pzX5ylHPb zN;*b*^VHYxY{5)9Wx5yJbH6rP^TR1GGCISl>z=ofqGzG0OC5|vm=4(FcuWhf$WxXg z^NJt>jw;$~;;S*d%5Fh5=q>oKMPt!^T+Q&4rg%~I@S&J!=Z)$T6TP^+$~4$b@#-DI z`VO+94S}hF+Z2*yj4^92F-jjXm4^!`UeyeDp--q+_9?vXPgc+RGG7<2#tyLf4w%#R zXO1Ib+tet|hbop@B%T47)!Ub0dhya5V+a@IhLV=n%4`k$s# z1)arP382MM^6D%6le%6_`!gLW{GxXsRb7EPLv_eoE$M~g$C)wEuX6G68X{&hXKDrpD}I*}z14ZZqGA#D6fKqC097n{poBxuB$G z|MlJCU}v!<%lCeO^Q{&!$*00MRat;{@Hp#p03WUmW>ATXfTsZuR`wa_U{4jA>pEp`SiENwP~kXr9^`PG?-mdp~g!9izVUh4K>*t`uzHI>yzC2bcIZ@o=~7R zuN`%Cok`EH=4LNyY@fO%Sa&K1*CUPxoefEq8Y)pXE5%o;-TIN}2ssfro%$?mwjRf0 zr$?1V{}yBM^0*661mp((CHCvaV>|hIA%GmC&38Y{Qn(aTWc0u5Nt2|Fr{Q zV$&_5G>Be_vf5#V`7Frb6tI1*&DfN4kr5^yKfNzG(7wf>Z>~2(=yV#tcFuAycJ>RmAXkoUo%hm|Arj*rk z0J{t=>Pu(V;r-xkf?5Ow4cTDV<;KA1KDKDH-Wb4wsDQ91|Gr9M8z^6n9bX=td=Onv zURwLfohj2;L-c_{+s^XJShV%-$;++S1`G|2@F^N)BU~y^@yGEoF`vZJZ&}KH?_Sdk zHs_%tt{-pQb>fo2V=UHdWSrhqnj@^dmNJDqEwz@=Vz0I0r1F*{jrLbG6m+Fz6D5l?5u}uZn))tXHHj&t|e$aBn zNA(O$qqAN-AP1n$+0#R0;EuDV(-42E5S5amo~y`G_lGOrt9-r+DI>s!Jr?WuW9tCD zIjBxckzh&RcrXQfLqE8>WK0CfaLv;3Q~5@bP-6S=;b5~E?N$S*=;iT7uCvK#&h$eZ z$AER>Fp{0oR$)7TlCRq0)0g6DZ3?t80nAUHMls&>&}z^9ybt0uT)f-OxXu(F@K8(7 zlEUP%*22tcgh^q1oFy$|Vfgr<)jNF==o8IVED!#D&g-go7YLv7=t}h6jrV&-bDM|y z-c(zo9SYxc(cSMlnkuN9Zy_K*SXRJFR>sM8)qknAi-@4AVx~eJ-CO**h9}c9(SiLt z5<;xgk(auyIS8^^l$SgZU(wK6d8=x>iX>HnwVDGo%5+)|ek|a-UM;l&6)D&1wKD{Q z@y~xB7Mkm+KK(UQosS#wQNsjz_WeGNexo~ljvF2OHrH_t!_V(E?xJ}oKzdH~2eIZ+ zE#*kYMjy$1meiw=sBYD@&N}m9yCuKqVCM^BNAnfk|5 zy*1G}z4ItmE!->^1gie?{0g7?+26l5aoyJgwwIAOoySUJvCZ%)kN*sCh1b(Le$>Wx zor>xQGAs-`kY#I@q;kDg@crSjHTE|4iO~I_aR$&liSGLDw)=*|5YETwC#a3HzG^bv z;D&m})OmGs8Cur_phZy}L*qFX1jDMkQ<8Qn8m<*(JJS76!1Q*swI0Vh>#rFWMp_jV zECmG2bhGtpZ29Tn1?12M9D<~Wa|n=!p`BeCXIouwX8ITO(W80j%qU{-ilA@cKhAk~ zoX%mS)3f54SxU&P^?q)q+2v>c+kU3b*Llifzf9cRhj@8-o_d_QjV5i(_Fz8^0a4?? z&6D2*de4x{p_pt+|B!_nx=wNC0!p;b~FW+ zZ)QjGrN*Z0;-?Wx(dxY1zIG8cR46+uUX630i`w=`7P6#SX&x`kji3;C&s#S`J?O)f zXY~CW00z)&@j*FkeCI_-`(9AI(x9zWl37$N>@lN4P`Lq+ii-D0w!eDyOj`PAryxsk zj)keW?>2Idjnk7qM;MkV7A*jwjZb$y{owzi^>@`X z>@Hr7-?&K>PtV+}1o^Fx3Th2dAJr2T*#JSxQ$EuE?RNljS-QdX<@x}H1ZA{QLi7q^78)sND+HPx1}OW$3Zv@RQu$FR z8eOQ(>^d&s=u)Wn|6CkDSl&YrwQ(5t8I6g9Dnp1xo7;M-j1bh_7e|u(SG@RGj3wD% zmrNUw427n`3fSvu6 z%2BfFAf!alD8Sr|{`h3*kDF8mRha{hfi5@VsfSJ!3}RC0pSG@OW*~~s@cZ+hRT&tMU`&%<4SczoizY zPjusq+W?(n|t& zH}~EJJ@zllHuAty0JFS2bNE5=Pl3~0QGFR?i^K)&4Tco>rRo#W>mRwvz)Y_X7%HGB zw4A2vL@*Q0dd*5%$ILE$yv;YgddR>>#My8CuHWmYa8nhpk;}eJ%-AlvBX`)d=;c{G z34yswM!%Gl3@93(&JWvf3n6CWB+w3LMq;M@tA^uYQ-H*=Bp{i6fWgr-N zNPKW$#3Ur>xt-(V1Xl+Rk2X4MrMT06q>*#&s!dbU6BgwXS>fjiu`jEs(XZ(k=pI|J4(pK9=KtvWe#W0a zAUWVlK|vwgif=FzjkE;F`%}p!!R>^+RN$6Y-e=th4h2?wHP;NZNJ5ReUP=x{d_(t3 z==>iE|C#K4e2|N}G!S#aV~tu3rf`z1-Z+*+hn{Q&LpP{ttiUfT8}Zd zJ=<0sphU8=Qeg%Ze&%ifAhi$_74n#*bYStsialue@`Ovcwu_5Rw(K@2&=KNXXFPAT zfANZ}f0iosw+pM)mTJ|@I7QXDvX)_sETOag7{eyWK%+wU+eK(GU0onQfbOs zdE@$7j1GmGsj%1?bAOoQH%-5TTp$fGX%;y%$y4AyLeB-j>c>7D=*)sQTK*`{sRu{C z;@3J!-k(mAYs~;)BrU6-@pT2>lc7zz>!T{xqZcx1K{&gc%jMyW-u=n>V}xrAaL@OZ zlHgii!*?f?GBej}KY@mea3sq>ly2HXD?nji1qMHL`*1byF&wmn-5GybdVe@X%QUEp zO!ej$ffya%bfNRklo5~v()N1?g*NdWq0`sFm7e$|C5}D$s9UPdlZMv@fCC=`-jR_I zZ|CJxrjJeYxr?~L^orz6lP5B19Gs>A>^DAWj@NhOz3#*I!z%kfokeKwDOH-g!G*e)cu%avT1q+AeoEIPIYN( zr|eklXuCgEKY+JBF^O?V$~0JMfJnY7pY+hK0dbBeb)1PBH*^J*U?#O${Q3?K6gc1faj+Bsi$Z6aoC7x#=I+ z$!35Ldy%s$YAJc~0j-?H@$Ma`8!J!0J3vd@c5Eqa>dka|BK>D6FVYI%AKBd|)z2eV z``%*^x80toI;|heHS&2#fk$qyTsYYCu_d~($=*8hblt4pn&4?^O|_hEPnu7b^vu;6 zcZUb?SmzkZ=hZ+Sj732IBc9wWWU`&j4UrZiZ}BQ4r1CYQuP z@?f!FJ#NeHa0y4z+lNp< zBKs+PljgKK^e*uBbz*eWgl&pz#+#~f&rNBTnOJOk z-*k@xZ`Otz5pgPE^~&(mu{Gy(otd76mRT;U0RRBa?Vp>*G%xhxWtbZu-zBas%5BZc zH7>>I5fAYn##&5TNW>eO9gM%q|~KEoFb#X?QiSNU(XM&unaxe9lUk zT44FM$@A&1I^ygEp)0h@L*uq(TUc351@<@Dy2H;FcNLZu&rbU&T&c30ws>alP#$HW zJr*nfyvqvXB|WcU9gf5kLtXLNlh_z}?c{GYD7S#gGpa{$@cQkhniI52nzifEtI znLm1U72CmvD zaDTV;yP=b zHOAfde7FI(Hf+JmUcUK$FAu&EN-(=tV*k8pv=jE)Mv1Wx&Ef^G&^u!+85tXW?a}|1b;m+iE5hcetB;t`bjgQM&H#$ON_S zhRuXSy#Xl+b^|#*zpv%{>grb~oE1n-%zrw{*-;`jPaV_TPyKl|F~&I+QY!}O!w)r_ zgx9|$Xu^3S^ueD^Sru1yL91D*iO<;a`z95ABNlsOX)dhYAC}0|z3p5mdB;EhwI_w^ zR8L0QF-)7TA__Ns7?Z2Ne;oC>3o<^0hXL*p*r-VVE0bnZrO4`gbH1JM5a!sgHpGOo z&*2uOgzhePIr=}#D~ZH-ffVCC?>#2vbCld>PZ?G)GLi57@p`gErKZrTW5y3c^v~iq z9RSjy9W2a8C^F%<3iO`e)>fOiC0>dHU<_~Xi@EV`=H24A?X6maZ1>zN=A{!M#8tnB zA-KRUEc(OpNH|7El-yGDA`@Dje}0uCd(P{pWw6mR<0+aPmAJC7OcVdmR;PR{78%o3 zCv_UFr1Z@W!|J!C0f1Xrzz#0tL2mK%{@}a&YC+9=19_MkI7IOhg+)i>OW~QqXJ%J} zUKddUyW<>pHoh;g8l=4-0muNTMd|1mgxw4~;yy~3ITcIFw>Uv!aWeky!v=803>>jf z$-uOa&EaCDrY=mnWT=OSjT$S!AR2%QU;;>&VBq$0J-34%9Nuwi(r~6Jv@<9T+A~gS ztD?d~@E(g5N8c@vj(Z4TozIU0s%&s?QChE)+$d+PM7o~t)N%tc-UZ-Ct7HuDnO{3g zfhboq8uIOA*urlWa$XFLd39MH9F)yovKN}O!o7ixwstmc^JyMC@3SRXljwe3vvaBS zx&|N|SWSAMCaVeQXwyOv>qnqB7b-izdsX*OaFSP*AL)(gR|L`SoHo|hug#ay1Zu)c znM7#eb``^=tn)cdXt4mU%(brks5QyQsik`j@G{7*7e{d~0g-Ks?>9y|u`4z0p`?LA zpZ^{klWPWYO((yt5dyGn0GMvL%4jh=k>~`eN*2IZY4q%LG|`_RwS|hjgA5?;N<~`( zyx?G=V6Q#LjL)1CTo4^r{A2u;Dfv}{htMVZ@*Y*#&ebqW-<Auv!_unh(bKJ6Q@2Y@egjSDSkmO4jlGSFvYx2+YS__AIw4xj`Ldu> z_reR34~ONkzNhTr9E+u`;uUc{6)IG%)HD?p&2M96$jsR*H%|dJVR7CF!20|dI|rQP zkFeWHO#zdpNtF_}8ST@Ih-Dm~WwVK35SHJDt=W+~`(p?`1N^FeBf$=E%CrH!zmeZS zEgN1^(qFIO_)xP297OL9Ym45dy*M8md%+R%8L)LSotJ6nc@`!4G6|oSjE!Q5ebUa> zQ7jLx`R=N$tG@!9c6ERg!33(j*KePe1>k0YExCm`HjmdC`VQ$u#sZ3AH>y&}lfdS$ zzh`6QzjQ_AWm_zy;02L`SwI2|hk=`~_u9J^c^{=kN4qw>K~|M;#H`vno^CSZX*l09 zrr7p4-)!2?6D+Fooun5GJWg63u3E+A2M{wU3=QO( zL{8<_Rv=%@EsJ>N0ASbg9yZ}%M_-6+E z{QTV9XTWpulb&@jkv%&QuLCRrK^D-c;D*6*tZKa6-9gC6xuog2oj9rBQt(%2AFj5@kfl)56ac-etE(%9N=*q^ zbKz<4)IDBy_8n5-rULjSaYzJa*`b}#T;caYzi^EUesV|5N|)w6#D{w7LC34^4qeDg zSsIx6Ur#zkAE-DuC@5gP`*v9iSmhjHmiNTZ7~q1i#H42p{BHSP^N7t}Zto8mIUdmN z^s5`Lid=>O>goSME}0xdHry!nVbaPV3kXO`K)^gpX@4=5CbhO*Mmqq1HQ*-Czy4ce zh{08`5^!;Tj&lA+4v7B(sd&?e8eQDq`4N;#eDs~Pav`0xS%DFI2dMuA!=@KiI3Wb}T5h2EBG zB7}X`s1N9S@o3v(hp{L_MLs@BVbCa&1#(3q*7T+I!7t@Jx%F!*pwR_-xtotPp1hH= zddxMd7T#hIlW+q7t5)K4mq~Dt>=o74lzH!e^W1iHEL+_;TKwX5qlp6(eGw)dTiVC@ zulh|G)AcTtATglf;@IG@@KWfqdzb-2y9u<4pK2;vju$|9d?{IKWMbl7U#FWvKu9x@ zzGNOzXYwc`n3BepjiRBjiwv}@YLY$YBLq4d%$i%oSj|GQVhO~1yg{)Rnzg6uOJUH5 z<#gj_zY;NDxQsDy#@_vfY$9NaW7Mu5+i$^@Q*3T6`ewIyB>$;*vgq~NT-_I-R1MWF zenThwkpLfGA_$j0j8CM%rA*Yo?7VC}9ud030C%IB=Lxl2BDHV!zE!pn>)7V$XMfJVwDhw$| zr_x}6gmlA5H`1MgG%C#yGK7SbbeE(cC@l<#fFRN#-6h>a37j?R_jiBip5N!(``^Ic zd+inPde^(w`#jH{2MO`G!@B3_fLqw;PY09~>Y;(3IP|$QOVK6`ntUw0&l33T3*bm- zx6ELMNG&7VP1-5PrOqY=1)^;3tqHyWnZ`-9h_Jno95x5EL3Q~ARx(D$D7M+da5DY0 zkY*Z@n(T0^LHY)zB-Nh-c{F>VwfxV_Mos-`cGreZgM#MX8yjjeVvAh05=anQ0ZhT> z(Z1?u~(%(=RdsjyP)n4=bEzKoDmb)4Roaysi7slygUa=B?Suw z47hCCtoAPP*l$!wS+xjrc|H<^D>9v<_=kHi*iM1;E|pxsgG-^A^&T~e}z!1%cb77OJR^O z37@hba*{WArtZ5Nr|yvrk*F7tOHswCZQuaOdn1w{NgVRnd(n=KifyWz zvGhN&NpSYV>7|uXT-{JS*CnLmQw{ifS`#cu4zfH>t(zdf5N^$rFL{bg;1Nt5p zYY>nh_`EiRRiy1HLkOr1?<<@DOby%U)y~1Bu>gnSA!lHUf}0fXO?)zWB4Q z%x)yS!VP5IOd18J!GZ5Wdj#Ot&mds;H;G|vgx&6&V`x!m+*S6Y%nu%HSo6YMbjvdr z*!7hdli!^D$UCD4Z6ysuwRQd9BoFckhC+*`iPa&^Fv~W?X+DsM-)Me9oirs{TshRqDmCrw1ii4D0X8esteR zB&o+eT?%tfF{?qbAzv)ogUg901^AhfJv7 zv?^1syAoKk)%?e*WNsRNU9uym0&)k>`@-Y5Hpl(#NBKhroa$fXgF|^-OG78x-xXc> z5IGyXw_#HbnM1-$ZKeO4P{Qt6_5}NNnHX{?_L}ecFHR*aCaq8`rrQj6mqxcFCA(0y zIyv0Tf0~g4YSoXRx2KK;iW3=i+)0(}KwZPl?Xmn;;!8&Ph-^_qEU7|{s&d<}|8Vo} zvS!~@*(&J6klr1N6P#dkudBtHzIC&3WJ_yPFrxHW?!LEMp39d{o0Eb2n{rJ1zW$?8 zjV#4PK*{EfvbEBnT`hzZN=w9y?BA$U8p=UNcGFmMxPKhqA$>+1MDRB-i+R<+m>L7> zx%y(hwmMqvq~GL&)DiqY=@m#vzJ01P@yIIBZG0&7B?bn~1JfqFDET2rJB zseGVGPGUyF>lmvPVSZCv`7f`p{9OfIq@$gHF9*TZ^JZQzk}Wb3EzVs>tNF{P_jDmt z@0^SXq+>Sj{+2`_sq#Jl!eQLhblN-C;9;(gT|{~6wUMX^CI?`^->?lO*%&U?Db~wYKftXZw;Tu(hg!gCF8+RN-QD-HkzF}CS22hE zIb!VW6p|MI8@w!(`2T{J`6i={IN{ub--CysT5mE{a(H$7I2;*HT|zNNvAyZGfTKH2 zsmTGa;E4Y$4h4vaR~1oS_&_J-LmNR03i2rEKl2GdD!57_qX{0EG}>szvwb7{0~g!h z^pfOvzC5dH{&%#PwbbwNM}_UxY2uvV6i2LDLIoy+PlKb=<-)AD)+|r>whYKhBysGC zK5FpXI}vh`l|qx=>Wr<9srWFig+hXrQUOreH{cH8qAs{KfVa-g4pQPs6-48uHLg|z z3)q9yJ+;Cad1aj~TQI1Vw{}2$QHwyGjj-9>BRaHu$Q?Zj$$`iw1CIH9fctaVfjf3Y zl?m`&Jft`CkGtbGG*tewqsxv6=BczfFQtY}z{CBKyR&k2=+|l%-~J|5FT-b_%c-ny zR3LYcxpbHp_IcRmtg#V6zBTE?yG6zqk8P4(KZpWQ{;T`2hk)(^sc+bP7nz}@B~$21 z^3MEUBp0pMUnG}#_PdQJI)8_+rP>H@D?%MFt?#H=zIMRa*X?@WIrVIv1|iw_EQ`do#Ii-ZmQSfvr0QYM9ubvZ(nb1QcM3Vz z7pqJ{Ao?U&kAat%?!(}J`AgzrIQ<)5jqT88i8kA#P^>dSK(d|#aEi0xV$-KZd6{7; z{EmVt89~3KiL|g9@7zNJmdUmNPG0(qrEJSRb70Vd?!2(zNuRUG*uA{OSgg0>$?jLG z96%6GS2sGU80C)v%x-en=`6gip&e}h$+pNir%VVp>^Ia$j3PZ=fjg66Q9%z;#!nxf zZJsuvVoC&ZJtwsnk;rh08IxyD3%G?kLoR#~cuTLU>+Z^PX`+UAu#m2&LV2s8JQSQv z7ix$NO8Debgp$sf#H4T>Y&^tp?KzlDUxcERaGIS=b9MjQGeL8-Lkqt+`%PkVizr^^ zW}MFAzG7YZgF}wNda!JO4<+m z@sH-f(bLj4gvR;2R5%SUNtSijb42ygJUH(b(4~2cV3hIV^jxxDoiKYVRTj&^R4U3J z>M9^{%+EK*5!>z!{?D{>~c(M0V`de)%Q7TTviuAxEd!%Vqwv^F8dc9@HZyABivRGXH;97%bxR5ZRvfG_$yoF=Ej+9 z|9j3|4)p=Rhume^6_5$|Bol!NxFaldDa^ex5q{_dLGse{KgzQnf<47Y9SaNjU|cJ4 zKfG5}`O9dXnC1om9OE?O3W=`wItJ2#Qo}!Tq<-+^;^4I8$)-S0RZ@p(xUz2?&?wo_ zCG*BB3%%1VzfE;I`_RD9nNqawR@^I(RRvXlWkmYo3v7nKj=^lDJ?Ns)UC#_Pcpc40b-ENz111l1-%?N}{mI1vV^>;DOF;X!y zrCtYTW>dcE9B`QkR#NCp#$7hniNiF3r??ax(!=Qu=wDEVFZ5A=G8Y`f{iheJ3O~v> zzby=C1{m%0A5Tu+4m?q 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 diff --git a/landlords-client-javafx/javafx-netty-communication.md b/landlords-client-javafx/javafx-netty-communication.md deleted file mode 100644 index a206029..0000000 --- a/landlords-client-javafx/javafx-netty-communication.md +++ /dev/null @@ -1,178 +0,0 @@ -## 页面如何将用户信息传递给服务端 -### UI组件的介绍 -* `UIObject`:继承于`Stage`的一个抽象类,用于用户视图扩展 -* `Controller`:基础于`UIObject`,代表一个自定义视图 -* `Method`:定义视图上可以进行的操作 -* `EventRegister`:用于视图上元素的事件注册 -* `IEvent`:定义事件可以进行的操作 - -### ui类结构 -![ui类结构UML图](images/ui-class-struct.png) -1. `Controller`通过`EventRegister`进行页面元素的事件注册 -2. `EventRegister`将`IEvent`注册为页面元素上的事件回调函数 -3. `IEvent`的实现类`DemoEvent`可以操纵`channel`和`netty`服务端进行通信 - -以上组件的简单流程图如下: -``` -// 注册元素事件 -controller -> init -> EventRegister.registerEvent -> element.setOnAction - -// 元素事件响应 -elemnt -> onAction -> event -> channel -> netty server -``` - -### 示例 -场景:编写一个页面,点击页面上的退出按钮向`netty`服务端发送退出房间信号 - -1. 编写一个`demo.fxml`视图文件 -```fxml - - - - - -``` -2. 编写一个`Controller`用于视图展示 -```java -public class Controller extends UIObject implements Method { - private IEvent event; - private EventRegister demoEventRegister; - - public Controller(IEvent event) throws IOException { - super(); - - // 加载fxml视图文件 - root = FXMLLoader.load(getClass().getClassLoader().getResource("demo.fxml")); - setScene(new Scene(root)); - - this.roomEvent = roomEvent; - - // 注册元素事件 - registerEvent(); - } - - @Override - public void registerEvent() { - demoEventRegister = new DemoEventRegister(this, event); - } -} -``` -3. 编写一个`Event`用于事件处理 -```java -public interface Event { - void quit(); -} - -public class DemoEvent implements Event { - @Override - public void quit() { - // 获取channel,通过工具类向netty服务端发送退出房间信号 - Channel channel = BeanUtil.getBean("channel"); - ChannelUtil.pushToServer(channel, ServerEventCode.CODE_CLIENT_EXIT, null); - } -} -``` -4. 编写一个`EventDefiner`用于页面元素事件注册 -```java -public class DemoEventRegister implements EventRegister { - - private UIObject uiObject; - private IEvent event; - - public DemoEventRegister(UIObject uiObject, IEvent event) { - this.uiObject = uiObject; - this.event = event; - - registerEvent(); - } - - @Override - public void registerEvent() { - quitRoom(); - } - - private void quitRoom() { - // 为退出按钮设置点击事件回调函数 - uiObject.$("#quitButton", Button.clas).setOnAction(e -> event.quit()); - } -} -``` - -## 服务端如何将信息传递给页面 -如果您还不清楚`netty`服务端和`netty`客户端之间的事件通信,请先阅读[ratel部分协议](https://github.com/ainilili/ratel/blob/master/PROTOCO_CN.md)。 - -### 编写客户端事件监听器 -编写自己的事件监听器,设置感兴趣的服务端事件编码,当对应事件出现时,会执行事件监听器中的代码。实现`ClientListener`或者继承`AbstractClientListener`编写自己的客户端事件监听器: -```java -public class ClientExitListener extends AbstractClientListener { - - public ClientExitListener() { - // 设置感兴趣的服务端事件编码(CODE_CLIENT_EXIT 客户端退出事件编码) - super(ClientEventCode.CODE_CLIENT_EXIT); - } - - /** - * 事件处理业务 - * @param channel 客户端通信channel - * @param json 事件数据 - */ - @Override - public void handle(Channel channel, String json) { - // do something ... - } -} -``` - -### 在客户端事件监听器中改变页面 -每一个客户端事件监听器中都有`uiService`属性,通过`uiService`可以获取各个`Method`对页面进行操作: -```java -@Override -public void handler(Channel channel, String json) { - Method method = uiService.getMethod(Controller.METHOD_NAME); - - // 一定要在javafx线程中进行视图的更改 - Platform.runLater(() -> method.updateView(json)); -} -``` - -### 示例 -场景:客户端退出后服务端向客户端发送退出成功事件响应,客户端接收事件后弹出弹框提示退出成功。 -1. 编写一个`Method`定义视图的弹出弹框行为 -```java -public interface Method { - void alert(String message); -} - -public class Controller extends UIObject implements Method { - private static final String METHOD_NAME = "method"; - - @Override - public void alert(String message) { - Alert alert = new Alert(Alert.AlertType.INFORMATION); - alert.setContentText(message); - alert.showAndWait(); - } -} -``` -2. 编写一个客户端事件监听器 -```java -public class ClientExitListener extends AbstractClientListener { - - public ClientExitListener() { - // 设置感兴趣的服务端事件编码(CODE_CLIENT_EXIT 客户端退出事件编码) - super(ClientEventCode.CODE_CLIENT_EXIT); - } - - /** - * 事件处理业务 - * @param channel 客户端通信channel - * @param json 事件数据 - */ - @Override - public void handle(Channel channel, String json) { - Method method = uiService.getMethod(Controller.METHOD_NAME); - - Platform.runLater(() -> method.alert(json)); - } -} -``` \ No newline at end of file diff --git a/landlords-client-javafx/pom.xml b/landlords-client-javafx/pom.xml deleted file mode 100644 index 4428981..0000000 --- a/landlords-client-javafx/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - landlords - com.smallnico.ratel - 1.2.2 - - 4.0.0 - - landlords-client-javafx - - - priv.zxw.ratel.landlords.client.javafx.SimpleClient - - - - - com.smallnico.ratel - landlords-common - 1.2.2 - - - - - ch.qos.logback - logback-core - 1.2.3 - - - - ch.qos.logback - logback-classic - 1.2.3 - - - - - com.alibaba - fastjson - 1.2.56 - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - ${start-class} - - - - - repackage - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - -parameters - - true - - - - - - \ No newline at end of file diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/NettyClient.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/NettyClient.java deleted file mode 100644 index d3bd9b6..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/NettyClient.java +++ /dev/null @@ -1,116 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import org.nico.noson.util.string.StringUtils; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListenerUtils; -import priv.zxw.ratel.landlords.client.javafx.handler.DefaultChannelInitializer; -import priv.zxw.ratel.landlords.client.javafx.ui.UIService; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; - -import java.io.IOException; -import java.util.concurrent.*; - - -public class NettyClient { - private String host; - private int port; - - private ExecutorService executorService; - - private Channel channel; - private EventLoopGroup workerGroup; - - private int id = -1; - private String username; - - public NettyClient(UIService uiService) { - executorService = Executors.newSingleThreadExecutor(); - - ClientListenerUtils.setUIService(uiService); - } - - public void start(String host, int port) throws Exception { - if (StringUtils.isBlank(host)) { - throw new IllegalArgumentException("不合法的host:" + host); - } - - if (port < 0) { - throw new IllegalArgumentException("不合法的端口:" + port); - } - - this.host = host; - this.port = port; - - try { - // 直接启动netty会别javafx阻塞消息接受 - // 使用线程池启动则可以正常运行,why !!!! - Future channelFuture = executorService.submit(new ClientThread()); - Channel channel = channelFuture.get(); - - if (!channel.isActive()) { - Exception gotoCatch = new Exception(); - throw gotoCatch; - } - } catch (Exception e) { - // 清理资源 - if (channel != null) { - channel.close().syncUninterruptibly(); - } - workerGroup.shutdownGracefully().syncUninterruptibly(); - - throw new IOException(String.format("连接netty服务端(%s:%d)失败", host, port), e); - } - - BeanUtil.addBean("channel", channel); - } - - private class ClientThread implements Callable { - - @Override - public Channel call() throws Exception { - workerGroup = new NioEventLoopGroup(); - Bootstrap bootstrap = new Bootstrap() - .group(workerGroup) - .channel(NioSocketChannel.class) - .handler(new DefaultChannelInitializer()); - channel = bootstrap.connect(host, port).syncUninterruptibly().channel(); - - return channel; - } - } - - public void destroy() { - if (channel == null) { - return; - } - - channel.close().syncUninterruptibly(); - workerGroup.shutdownGracefully().syncUninterruptibly(); - - executorService.shutdown(); - try { - executorService.awaitTermination(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { - } - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/SimpleClient.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/SimpleClient.java deleted file mode 100644 index cd1dfae..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/SimpleClient.java +++ /dev/null @@ -1,60 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx; - -import com.alibaba.fastjson.JSONArray; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.stage.Stage; -import org.nico.ratel.landlords.utils.StreamUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.event.IndexEvent; -import priv.zxw.ratel.landlords.client.javafx.event.LobbyEvent; -import priv.zxw.ratel.landlords.client.javafx.event.LoginEvent; -import priv.zxw.ratel.landlords.client.javafx.event.RoomEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.UIService; -import priv.zxw.ratel.landlords.client.javafx.ui.view.index.IndexController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.index.IndexMethod; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.login.LoginController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; - -import java.io.IOException; -import java.net.URL; -import java.util.List; - - -public class SimpleClient extends Application { - - private static final Logger LOGGER = LoggerFactory.getLogger(SimpleClient.class); - - @Override - public void start(Stage primaryStage) throws Exception { - UIService uiService = new UIService(); - IndexMethod indexMethod = new IndexController(new IndexEvent()); - uiService.addMethods(indexMethod, new LoginController(new LoginEvent()), - new LobbyController(new LobbyEvent()), new RoomController(new RoomEvent())); - uiService.getMethod(IndexController.METHOD_NAME).doShow(); - - NettyClient nettyClient = new NettyClient(uiService); - BeanUtil.addBean("nettyClient", nettyClient); - - try { - List remoteServerAddressList = fetchRemoteServerAddresses(); - Platform.runLater(() -> indexMethod.generateRemoteServerAddressOptions(remoteServerAddressList)); - } catch (IOException e) { - LOGGER.error("获取远程服务器列表失败", e); - Platform.runLater(() -> indexMethod.setFetchRemoteServerAddressErrorTips()); - } - } - - private List fetchRemoteServerAddresses() throws IOException { - String serverInfo = StreamUtils.convertToString( - new URL("https://raw.githubusercontent.com/ainilili/ratel/master/serverlist.json")); - return JSONArray.parseArray(serverInfo, String.class); - } - - public static void main(String[] args) { - launch(args); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/CurrentRoomInfo.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/CurrentRoomInfo.java deleted file mode 100644 index 1d9b7d8..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/CurrentRoomInfo.java +++ /dev/null @@ -1,125 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.entity; - -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientType; - -import java.util.ArrayList; -import java.util.List; - -public class CurrentRoomInfo { - private int roomId; - private String roomOwner; - - private User player; - private String prevPlayerName; - private ClientType prevPlayerRole; - private int prevPlayerSurplusPokerCount; - private String nextPlayerName; - private ClientType nextPlayerRole; - private int nextPlayerSurplusPokerCount; - - private String recentPlayerName; - private List recentPokers; - - private List checkedPokers; - - public CurrentRoomInfo(int roomId, String roomOwner) { - this.roomId = roomId; - this.roomOwner = roomOwner; - this.checkedPokers = new ArrayList<>(); - } - - public void setLandlord(String landlordName) { - if (landlordName.equals(player.getNickname())) { - player.setRole(ClientType.LANDLORD); - prevPlayerRole = nextPlayerRole = ClientType.PEASANT; - } else if (landlordName.equals(prevPlayerName)) { - prevPlayerRole = ClientType.LANDLORD; - nextPlayerRole = ClientType.PEASANT; - player.setRole(ClientType.PEASANT); - } else { - nextPlayerRole = ClientType.LANDLORD; - prevPlayerRole = ClientType.PEASANT; - player.setRole(ClientType.PEASANT); - } - } - - public String getRecentPlayerName() { - return recentPlayerName; - } - - public void setRecentPlayerName(String recentPlayerName) { - this.recentPlayerName = recentPlayerName; - } - - public List getRecentPokers() { - return recentPokers; - } - - public void setRecentPokers(List recentPokers) { - this.recentPokers = recentPokers; - } - - public void setPlayer(User player) { - this.player = player; - } - - public User getPlayer() { - return player; - } - - public void setPrevPlayerName(String prevPlayerName) { - this.prevPlayerName = prevPlayerName; - } - - public void setNextPlayerName(String nextPlayerName) { - this.nextPlayerName = nextPlayerName; - } - - public String getPrevPlayerName() { - return prevPlayerName; - } - - public String getNextPlayerName() { - return nextPlayerName; - } - - public ClientType getPrevPlayerRole() { - return prevPlayerRole; - } - - public ClientType getNextPlayerRole() { - return nextPlayerRole; - } - - public void addCheckedPoker(Poker poker) { - checkedPokers.add(poker); - } - - public void removeUncheckedPoker(Poker poker) { - checkedPokers.remove(poker); - } - - public List pollCheckedPokers() { - List pokers = new ArrayList<>(checkedPokers); - checkedPokers.clear(); - - return pokers; - } - - public int getPrevPlayerSurplusPokerCount() { - return prevPlayerSurplusPokerCount; - } - - public void setPrevPlayerSurplusPokerCount(int prevPlayerSurplusPokerCount) { - this.prevPlayerSurplusPokerCount = prevPlayerSurplusPokerCount; - } - - public int getNextPlayerSurplusPokerCount() { - return nextPlayerSurplusPokerCount; - } - - public void setNextPlayerSurplusPokerCount(int nextPlayerSurplusPokerCount) { - this.nextPlayerSurplusPokerCount = nextPlayerSurplusPokerCount; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/RoomInfo.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/RoomInfo.java deleted file mode 100644 index 104d019..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/RoomInfo.java +++ /dev/null @@ -1,41 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.entity; - - -public class RoomInfo { - private Integer roomId; - private String roomOwner; - private Integer roomClientCount; - private String roomType; - - public Integer getRoomId() { - return roomId; - } - - public void setRoomId(Integer roomId) { - this.roomId = roomId; - } - - public String getRoomOwner() { - return roomOwner; - } - - public void setRoomOwner(String roomOwner) { - this.roomOwner = roomOwner; - } - - public Integer getRoomClientCount() { - return roomClientCount; - } - - public void setRoomClientCount(Integer roomClientCount) { - this.roomClientCount = roomClientCount; - } - - public String getRoomType() { - return roomType; - } - - public void setRoomType(String roomType) { - this.roomType = roomType; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/User.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/User.java deleted file mode 100644 index 8633c64..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/entity/User.java +++ /dev/null @@ -1,73 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.entity; - -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientType; - -import java.util.List; -import java.util.stream.Collectors; - -public class User { - private String nickname; - - private boolean playing = false; - private int currentRoomId = -1; - private List pokers; - - // null, ClientType.LANDLORD, ClientType.PEASANT - private ClientType role; - - public User(String nickname) { - this.nickname = nickname; - } - - public void joinRoom(int roomId) { - currentRoomId = roomId; - playing = true; - } - - public void exitRoom() { - currentRoomId = -1; - playing = false; - role = null; - pokers.clear(); - pokers = null; - } - - public void addPokers(List pokers) { - if (this.pokers != null) { - this.pokers.addAll(pokers); - } else { - this.pokers = pokers; - } - - this.pokers = this.pokers.stream() - .sorted((a, b) -> Integer.compare(b.getLevel().getLevel(), a.getLevel().getLevel())) - .collect(Collectors.toList()); - } - - public void removePokers(List sellPokerList) { - for (Poker sellPoker : sellPokerList) { - pokers.remove(sellPoker); - } - } - - public List getPokers() { - return pokers; - } - - public ClientType getRole() { - return role; - } - - public boolean isPlaying() { - return playing; - } - - public void setRole(ClientType role) { - this.role = role; - } - - public String getNickname() { - return nickname; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/IndexEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/IndexEvent.java deleted file mode 100644 index 477884b..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/IndexEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.event; - -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; -import priv.zxw.ratel.landlords.client.javafx.ui.event.IIndexEvent; - -public class IndexEvent implements IIndexEvent { - - @Override - public void connect(String host, int port) throws Exception { - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - - nettyClient.start(host, port); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LobbyEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LobbyEvent.java deleted file mode 100644 index 2d4026b..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LobbyEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.event; - - -import io.netty.channel.Channel; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListener; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListenerUtils; -import priv.zxw.ratel.landlords.client.javafx.ui.event.ILobbyEvent; - - -public class LobbyEvent implements ILobbyEvent { - - @Override - public void selectPVPModal() { - ClientListener listener = ClientListenerUtils.getListener(ClientEventCode.CODE_SHOW_OPTIONS_PVP); - - listener.handle(BeanUtil.getBean("channel"), "."); - } - - @Override - public void selectPVEModal() { - ClientListener listener = ClientListenerUtils.getListener(ClientEventCode.CODE_SHOW_OPTIONS_PVE); - - listener.handle(BeanUtil.getBean("channel"), "."); - } - - @Override - public void createPVPRoom() { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_ROOM_CREATE, null); - } - - @Override - public void createPVERoom(int modal) { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_ROOM_CREATE_PVE, String.valueOf(modal)); - } - - @Override - public void showRooms() { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GET_ROOMS, null); - } - - @Override - public void joinRoom(int roomId) { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_ROOM_JOIN, String.valueOf(roomId)); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LoginEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LoginEvent.java deleted file mode 100644 index 9bcc7d1..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/LoginEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.event; - - -import io.netty.channel.Channel; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.event.ILoginEvent; - -public class LoginEvent implements ILoginEvent { - - @Override - public void setNickname(String nickname) { - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - nettyClient.setUsername(nickname); - - User user = new User(nickname); - BeanUtil.addBean("user", user); - - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_CLIENT_NICKNAME_SET, nickname); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/RoomEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/RoomEvent.java deleted file mode 100644 index e7c3281..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/event/RoomEvent.java +++ /dev/null @@ -1,61 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.event; - - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.ui.event.IRoomEvent; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -public class RoomEvent implements IRoomEvent { - - @Override - public void robLandlord() { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_LANDLORD_ELECT, "TRUE"); - } - - @Override - public void notRobLandlord() { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_LANDLORD_ELECT, "FALSE"); - } - - @Override - public void submitPokers(List pokerList) { - Channel channel = BeanUtil.getBean("channel"); - - String[] chars = pokerList.stream() - .sorted(Comparator.comparingInt(poker -> poker.getLevel().getLevel())) - .map(p -> { - String name = p.getLevel().getName(); - // 10 实际出牌值为 0 - return name.length() > 1 ? name.substring(1, 2) : name; - }) - .collect(Collectors.toList()) - .toArray(new String[] {}); - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY, JSONObject.toJSONString(chars)); - } - - @Override - public void passRound() { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_PASS, null); - } - - @Override - public void exit() { - Channel channel = BeanUtil.getBean("channel"); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_CLIENT_EXIT, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/DefaultChannelInitializer.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/DefaultChannelInitializer.java deleted file mode 100644 index 9dd77e2..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/DefaultChannelInitializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.handler; - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.protobuf.ProtobufDecoder; -import io.netty.handler.codec.protobuf.ProtobufEncoder; -import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder; -import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender; -import io.netty.handler.timeout.IdleStateHandler; -import org.nico.ratel.landlords.entity.ClientTransferData; - -import java.util.concurrent.TimeUnit; - -/** - * @ClassName DefaultChannelInitializer - * @Desc TODO - * @Author zxw - * @Date 2020/8/5 13:25 - * @Version 1.0 - */ -public class DefaultChannelInitializer extends ChannelInitializer { - - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline() - .addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)) - .addLast(new ProtobufVarint32FrameDecoder()) - .addLast(new ProtobufDecoder(ClientTransferData.ClientTransferDataProtoc.getDefaultInstance())) - .addLast(new ProtobufVarint32LengthFieldPrepender()) - .addLast(new ProtobufEncoder()) - .addLast(new SecondProtobufCodec()) - .addLast(new TransferHandler()); - } - -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/SecondProtobufCodec.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/SecondProtobufCodec.java deleted file mode 100644 index 845efad..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/SecondProtobufCodec.java +++ /dev/null @@ -1,29 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.handler; - -import com.google.protobuf.MessageLite; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToMessageCodec; -import org.nico.ratel.landlords.entity.ClientTransferData; - -import java.util.List; - -/** - * @ClassName SecondProtobufCodec - * @Desc TODO - * @Author zxw - * @Date 2020/8/5 13:26 - * @Version 1.0 - */ -public class SecondProtobufCodec extends MessageToMessageCodec { - - @Override - protected void encode(ChannelHandlerContext ctx, MessageLite msg, List out) throws Exception { - out.add(msg); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ClientTransferData.ClientTransferDataProtoc msg, List out) throws Exception { - out.add(msg); - } - -} \ No newline at end of file diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/TransferHandler.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/TransferHandler.java deleted file mode 100644 index 96c89bd..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/handler/TransferHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import io.netty.util.ReferenceCountUtil; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.entity.ClientTransferData.ClientTransferDataProtoc; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import org.nico.ratel.landlords.print.SimplePrinter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListener; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListenerUtils; - - -public class TransferHandler extends ChannelInboundHandlerAdapter { - private static final Logger LOGGER = LoggerFactory.getLogger(TransferHandler.class); - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - try { - ClientTransferDataProtoc clientTransferData = (ClientTransferDataProtoc) msg; - - if (clientTransferData.getInfo() != null && !clientTransferData.getInfo().isEmpty()) { - SimplePrinter.printNotice(clientTransferData.getInfo()); - } - - ClientEventCode code = ClientEventCode.valueOf(clientTransferData.getCode()); - - LOGGER.info("接受服务端信息, 编码:{},数据:{}.", code, clientTransferData.getData()); - - if (code != null) { - ClientListener listener = ClientListenerUtils.getListener(code); - - if (listener != null) { - listener.handle(ctx.channel(), clientTransferData.getData()); - } else { - LOGGER.warn("未知的消息编码 {},忽略该条消息: {}", code, clientTransferData.getData()); - } - } - } finally { - ReferenceCountUtil.release(msg); - } - } - - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (evt instanceof IdleStateEvent) { - IdleStateEvent event = (IdleStateEvent) evt; - if (event.state() == IdleState.WRITER_IDLE) { - ChannelUtils.pushToServer(ctx.channel(), ServerEventCode.CODE_CLIENT_HEAD_BEAT, "heartbeat"); - } - } - } - - @Override - public void exceptionCaught(ChannelHandlerContext context, Throwable cause) { - cause.printStackTrace(); - context.close(); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/AbstractClientListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/AbstractClientListener.java deleted file mode 100644 index 0450c3c..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/AbstractClientListener.java +++ /dev/null @@ -1,28 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.UIService; - -import java.util.Objects; - - -public abstract class AbstractClientListener implements ClientListener { - protected ClientEventCode code; - - protected UIService uiService; - - public AbstractClientListener(ClientEventCode code) { - Objects.requireNonNull(code, "子事件监听器需要自定义专属的事件编码"); - this.code = code; - } - - @Override - public ClientEventCode getCode() { - return code; - } - - @Override - public void setUIService(UIService uiService) { - this.uiService = uiService; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientCantPassListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientCantPassListener.java deleted file mode 100644 index a9f42eb..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientCantPassListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; - -public class ClientCantPassListener extends AbstractClientListener { - - public ClientCantPassListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY_CANT_PASS); - } - - @Override - public void handle(Channel channel, String json) { - // 不允许跳过,即简单的不响应用户操作即可 - RoomController roomController = (RoomController) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> { - Label tips = ((Label) roomController.$("playerPane", Pane.class).lookup(".error-tips")); - tips.setVisible(true); - tips.setText("此回合不能不出牌"); - roomController.delayHidden(tips, 2); - }); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_REDIRECT, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConfirmLandlordListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConfirmLandlordListener.java deleted file mode 100644 index b90cad9..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConfirmLandlordListener.java +++ /dev/null @@ -1,52 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -import java.util.List; - -public class ClientConfirmLandlordListener extends AbstractClientListener { - - public ClientConfirmLandlordListener() { - super(ClientEventCode.CODE_GAME_LANDLORD_CONFIRM); - } - - @Override - public void handle(Channel channel, String json) { - JSONObject jsonObject = JSONObject.parseObject(json); - String landlordName = jsonObject.getString("landlordNickname"); - List surplusPokerList = jsonObject.getJSONArray("additionalPokers").toJavaList(Poker.class); - - // 给地主发底牌 - User user = BeanUtil.getBean("user"); - if (landlordName.equals(user.getNickname())) { - user.addPokers(surplusPokerList); - } - - // 设置玩家的角色 - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - currentRoomInfo.setLandlord(landlordName); - - // 视图更新 - RoomMethod method = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> { - method.showSurplusPokers(surplusPokerList); - method.hideRobButtons(); - method.setLandLord(landlordName); - }); - - // 重定向玩家 - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_REDIRECT, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConnectListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConnectListener.java deleted file mode 100644 index f1db49b..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientConnectListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; - - -public class ClientConnectListener extends AbstractClientListener { - private static final Logger LOGGER = LoggerFactory.getLogger(ClientConnectListener.class); - - public ClientConnectListener() { - super(ClientEventCode.CODE_CLIENT_CONNECT); - } - - @Override - public void handle(Channel channel, String json) { - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - nettyClient.setId(Integer.parseInt(json)); - - LOGGER.info("当前客户端被分配的id为 {}", nettyClient.getId()); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientExitListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientExitListener.java deleted file mode 100644 index 336f500..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientExitListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyMethod; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientExitListener extends AbstractClientListener { - - public ClientExitListener() { - super(ClientEventCode.CODE_CLIENT_EXIT); - } - - @Override - public void handle(Channel channel, String json) { - RoomMethod roomMethod = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - LobbyMethod lobbyMethod = (LobbyMethod) uiService.getMethod(LobbyController.METHOD_NAME); - - Platform.runLater(() -> { - roomMethod.doClose(); - lobbyMethod.doShow(); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientGameOverListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientGameOverListener.java deleted file mode 100644 index ff43386..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientGameOverListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ClientType; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientGameOverListener extends AbstractClientListener { - - public ClientGameOverListener() { - super(ClientEventCode.CODE_GAME_OVER); - } - - @Override - public void handle(Channel channel, String json) { - JSONObject jsonObject = JSONObject.parseObject(json); - String winnerName = jsonObject.getString("winnerNickname"); - ClientType clientType = jsonObject.getObject("winnerType", ClientType.class); - - RoomMethod roomMethod = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - Platform.runLater(() -> roomMethod.gameOver(winnerName, clientType)); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientJoinRoomSuccessfulListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientJoinRoomSuccessfulListener.java deleted file mode 100644 index 39859f1..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientJoinRoomSuccessfulListener.java +++ /dev/null @@ -1,28 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientJoinRoomSuccessfulListener extends AbstractClientListener { - - public ClientJoinRoomSuccessfulListener() { - super(ClientEventCode.CODE_ROOM_JOIN_SUCCESS); - } - - @Override - public void handle(Channel channel, String json) { - Method lobbyMethod = uiService.getMethod(LobbyController.METHOD_NAME); - RoomMethod roomMethod = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> { - lobbyMethod.doClose(); - roomMethod.joinRoom(); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientKickListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientKickListener.java deleted file mode 100644 index 670df67..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientKickListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.AlertUtils; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientKickListener extends AbstractClientListener { - - public ClientKickListener() { - super(ClientEventCode.CODE_CLIENT_KICK); - } - - @Override - public void handle(Channel channel, String json) { - Method lobbyMethod = uiService.getMethod(LobbyController.METHOD_NAME); - RoomMethod roomMethod = (RoomController) uiService.getMethod(RoomController.METHOD_NAME); - - // 防止出现多次触发 CODE_CLIENT_KICK 事件后导致页面显示错误的情况 - if (roomMethod.isShow()) { - Platform.runLater(() -> { - AlertUtils.warn("您已经退出房间", "您因长时间未操作,请出已被房间"); - - roomMethod.doClose(); - lobbyMethod.doShow(); - }); - } - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListener.java deleted file mode 100644 index 4265cd3..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.UIService; - - -public interface ClientListener { - void handle(Channel channel, String json); - - ClientEventCode getCode(); - - void setUIService(UIService uiService); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtils.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtils.java deleted file mode 100644 index 96cea8c..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtils.java +++ /dev/null @@ -1,100 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.ui.UIService; - -import java.io.File; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -public class ClientListenerUtils { - private static final Logger LOGGER = LoggerFactory.getLogger(ClientListenerUtils.class); - - /** code - listener 映射 */ - private static final Map LISTENER_MAP = new HashMap<>(16); - - /** - * 获取code对应的事件监听器 - * - * @param code 事件编码 - * @return code对应的事件监听器,如果不存在对应的事件监听器则返回null - */ - public static ClientListener getListener(ClientEventCode code) { - ClientListener clientListener = LISTENER_MAP.get(code); - - return clientListener; - } - - public static ClientEventCode[] supportCodes() { - return LISTENER_MAP.keySet().toArray(new ClientEventCode[] {}); - } - - public static void setUIService(UIService uiService) { - for (ClientListener listener : LISTENER_MAP.values()) { - listener.setUIService(uiService); - } - } - - static { - List> listenerClassList = findListener(); - - for (Class clazz : listenerClassList) { - try { - ClientListener listener = clazz.newInstance(); - LISTENER_MAP.put(listener.getCode(), listener); - - LOGGER.info("添加 {} -> {} 事件监听器映射", listener.getCode(), listener.getClass().getName()); - } catch (InstantiationException e) { - LOGGER.warn(clazz.getName() + " 不能被实例化"); - } catch (IllegalAccessException e) { - LOGGER.warn(clazz.getName() + " 没有默认构造函数或默认构造函数不可访问", e); - } - } - } - - private static List> findListener() { - ClassLoader defaultClassLoader = ClientListenerUtils.class.getClassLoader(); - URL classWorkPath = ClientListenerUtils.class.getResource(""); - File classWorkDir = new File(classWorkPath.getPath()); - - return loadClasses(defaultClassLoader, classWorkDir.listFiles(ClientListenerUtils::isNormalClass)) - .stream() - .filter(clazz -> clazz.getSuperclass() == AbstractClientListener.class) - .map(clazz -> (Class) clazz) - .collect(Collectors.toList()); - } - - private static boolean isNormalClass(File file) { - String fileName = file.getName(); - boolean isClassFile = fileName.endsWith(".class"); - boolean isNotInnerClassFile = !fileName.matches("[A-Z]\\w+\\$\\w+.class"); - - return isClassFile && isNotInnerClassFile; - } - - private static List> loadClasses(ClassLoader classLoader, File[] classFiles) { - String classpath = classLoader.getResource("").getPath(); - - List> classList = new ArrayList<>(classFiles.length); - for (File classFile : classFiles) { - String absolutePath = classFile.getAbsolutePath(); - String classFullName = absolutePath.substring(classpath.length() - 1, absolutePath.lastIndexOf(".")) - .replace(File.separator, "."); - - try { - classList.add(classLoader.loadClass(classFullName)); - } catch (ClassNotFoundException e) { - LOGGER.warn("默认类加载器在 {} 路径下没有找到 {} 类", classpath, classFullName); - } - } - - return classList; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPassListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPassListener.java deleted file mode 100644 index 9524701..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPassListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.CountDownTask; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -import java.util.Collections; - -public class ClientPassListener extends AbstractClientListener { - - public ClientPassListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY_PASS); - } - - @Override - public void handle(Channel channel, String json) { - JSONObject jsonObject = JSONObject.parseObject(json); - RoomMethod method = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - - // 更新当前玩家和出牌信息 - String clientNickname = jsonObject.getString("clientNickname"); - currentRoomInfo.setRecentPlayerName(clientNickname); - currentRoomInfo.setRecentPokers(Collections.emptyList()); - - // 视图更新 - String nextClientNickname = jsonObject.getString("nextClientNickname"); - Platform.runLater(() -> { - method.play(nextClientNickname); - method.showMessage(clientNickname, "不出"); - }); - - // 如果下一个出牌的是本玩家进行出牌重定向 - int turnClientId = jsonObject.getIntValue("nextClientId"); - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - if (turnClientId == nettyClient.getId()) { - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_REDIRECT, null); - } - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerInvalidListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerInvalidListener.java deleted file mode 100644 index 7e4cf40..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerInvalidListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; - -public class ClientPokerInvalidListener extends AbstractClientListener { - - public ClientPokerInvalidListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY_INVALID); - } - - @Override - public void handle(Channel channel, String json) { - // 牌无效,不允许出牌,即简单的不响应用户操作即可 - RoomController roomController = (RoomController) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> { - Label tips = ((Label) roomController.$("playerPane", Pane.class).lookup(".error-tips")); - tips.setVisible(true); - tips.setText("您的出牌不符合规则"); - roomController.delayHidden(tips, 2); - }); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_REDIRECT, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerLessListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerLessListener.java deleted file mode 100644 index 06c712a..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerLessListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; - -public class ClientPokerLessListener extends AbstractClientListener { - - public ClientPokerLessListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY_LESS); - } - - @Override - public void handle(Channel channel, String json) { - // 出牌太少,不允许出牌,即简单的不响应用户操作即可 - RoomController roomController = (RoomController) uiService.getMethod(RoomController.METHOD_NAME); - Platform.runLater(() -> { - Label tips = ((Label) roomController.$("playerPane", Pane.class).lookup(".error-tips")); - tips.setVisible(true); - tips.setText("您的出牌应该大于上家的牌"); - roomController.delayHidden(tips, 2); - }); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_REDIRECT, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerMismatchListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerMismatchListener.java deleted file mode 100644 index 9e3a19d..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerMismatchListener.java +++ /dev/null @@ -1,34 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; - -public class ClientPokerMismatchListener extends AbstractClientListener { - - public ClientPokerMismatchListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY_MISMATCH); - } - - @Override - public void handle(Channel channel, String json) { - // 出牌不匹配,不允许出牌,即简单的不响应用户操作即可 - JSONObject jsonObject = JSONObject.parseObject(json); - RoomController roomController = (RoomController) uiService.getMethod(RoomController.METHOD_NAME); - Platform.runLater(() -> { - Label tips = ((Label) roomController.$("playerPane", Pane.class).lookup(".error-tips")); - tips.setVisible(true); - tips.setText("您需要出" + jsonObject.getIntValue("preCount") + "张牌"); - roomController.delayHidden(tips, 2); - }); - - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GAME_POKER_PLAY_REDIRECT, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayListener.java deleted file mode 100644 index 1f4f519..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.CountDownTask; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientPokerPlayListener extends AbstractClientListener { - - public ClientPokerPlayListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY); - } - - @Override - public void handle(Channel channel, String json) { - User user = BeanUtil.getBean("user"); - RoomMethod roomMethod = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> roomMethod.play(user.getNickname())); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayRedirectListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayRedirectListener.java deleted file mode 100644 index 02e71dc..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientPokerPlayRedirectListener.java +++ /dev/null @@ -1,34 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.CountDownTask; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; - -public class ClientPokerPlayRedirectListener extends AbstractClientListener { - private static final Logger LOGGER = LoggerFactory.getLogger(ClientPokerPlayRedirectListener.class); - - public ClientPokerPlayRedirectListener() { - super(ClientEventCode.CODE_GAME_POKER_PLAY_REDIRECT); - } - - @Override - public void handle(Channel channel, String json) { - JSONObject jsonObject = JSONObject.parseObject(json); - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - int sellClientId = jsonObject.getIntValue("sellClientId"); - - // 通知下一个玩家出牌 - if (sellClientId == nettyClient.getId()) { - ClientListenerUtils.getListener(ClientEventCode.CODE_GAME_POKER_PLAY).handle(channel, json); - } - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRestartGameListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRestartGameListener.java deleted file mode 100644 index e5367dd..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRestartGameListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import org.nico.ratel.landlords.enums.ClientEventCode; - -public class ClientRestartGameListener extends AbstractClientListener { - - public ClientRestartGameListener() { - super(ClientEventCode.CODE_GAME_LANDLORD_CYCLE); - } - - @Override - public void handle(Channel channel, String json) { - System.out.println("无人抢地主,重新发牌"); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomCreateSuccessfulListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomCreateSuccessfulListener.java deleted file mode 100644 index ca5481b..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomCreateSuccessfulListener.java +++ /dev/null @@ -1,28 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientRoomCreateSuccessfulListener extends AbstractClientListener { - - public ClientRoomCreateSuccessfulListener() { - super(ClientEventCode.CODE_ROOM_CREATE_SUCCESS); - } - - @Override - public void handle(Channel channel, String json) { - Method lobbyMethod = uiService.getMethod(LobbyController.METHOD_NAME); - RoomMethod roomMethod = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> { - lobbyMethod.doClose(); - roomMethod.joinRoom(); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomFullJoinFailListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomFullJoinFailListener.java deleted file mode 100644 index b6832de..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomFullJoinFailListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyMethod; - -public class ClientRoomFullJoinFailListener extends AbstractClientListener { - - public ClientRoomFullJoinFailListener() { - super(ClientEventCode.CODE_ROOM_JOIN_FAIL_BY_FULL); - } - - @Override - public void handle(Channel channel, String json) { - LobbyMethod lobbyMethod = (LobbyMethod) uiService.getMethod(LobbyController.METHOD_NAME); - - Platform.runLater(() -> { - lobbyMethod.joinRoomFail("房间已经满人", "该房间人数已满,开始游戏,请挑选其它未满房间进行游戏。"); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomNotExistsJoinFailListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomNotExistsJoinFailListener.java deleted file mode 100644 index 78739df..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientRoomNotExistsJoinFailListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyMethod; - -public class ClientRoomNotExistsJoinFailListener extends AbstractClientListener { - - public ClientRoomNotExistsJoinFailListener() { - super(ClientEventCode.CODE_ROOM_JOIN_FAIL_BY_INEXIST); - } - - @Override - public void handle(Channel channel, String json) { - LobbyMethod lobbyMethod = (LobbyMethod) uiService.getMethod(LobbyController.METHOD_NAME); - - Platform.runLater(() -> { - lobbyMethod.joinRoomFail("房间已经不存在", "该房间已经不存在,可能房主已经解散该房间了,请挑选其它房间进行游戏。"); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSelectLandlordListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSelectLandlordListener.java deleted file mode 100644 index e6811c7..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSelectLandlordListener.java +++ /dev/null @@ -1,38 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -public class ClientSelectLandlordListener extends AbstractClientListener { - private static final Logger LOGGER = LoggerFactory.getLogger(ClientSelectLandlordListener.class); - - public ClientSelectLandlordListener() { - super(ClientEventCode.CODE_GAME_LANDLORD_ELECT); - } - - @Override - public void handle(Channel channel, String json) { - // 计算出玩家的顺序 - JSONObject jsonObject = JSONObject.parseObject(json); - String nextClientNickname = jsonObject.getString("nextClientNickname"); - - // 决定接下来谁抢地主 - int turnClientId = jsonObject.getIntValue("nextClientId"); - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - - if (turnClientId == nettyClient.getId()) { - RoomMethod method = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - Platform.runLater(() -> method.showRobButtons()); - } - - LOGGER.info("接下来由 {} 抢地主", nextClientNickname); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSetNicknameListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSetNicknameListener.java deleted file mode 100644 index 21a24d9..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientSetNicknameListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.index.IndexController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.login.LoginController; - -public class ClientSetNicknameListener extends AbstractClientListener { - - public ClientSetNicknameListener() { - super(ClientEventCode.CODE_CLIENT_NICKNAME_SET); - } - - @Override - public void handle(Channel channel, String json) { - Method indexMethod = uiService.getMethod(IndexController.METHOD_NAME); - Method loginMethod = uiService.getMethod(LoginController.METHOD_NAME); - - Platform.runLater(() -> { - indexMethod.doClose(); - loginMethod.doShow(); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsListener.java deleted file mode 100644 index 6baa43e..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.login.LoginController; - -public class ClientShowOptionsListener extends AbstractClientListener { - - public ClientShowOptionsListener() { - super(ClientEventCode.CODE_SHOW_OPTIONS); - } - - @Override - public void handle(Channel channel, String json) { - Method loginMethod = uiService.getMethod(LoginController.METHOD_NAME); - Method lobbyMethod = uiService.getMethod(LobbyController.METHOD_NAME); - - Platform.runLater(() -> { - loginMethod.doClose(); - lobbyMethod.doShow(); - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVEListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVEListener.java deleted file mode 100644 index 73fa2f8..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVEListener.java +++ /dev/null @@ -1,22 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyMethod; - - -public class ClientShowOptionsPVEListener extends AbstractClientListener { - - public ClientShowOptionsPVEListener() { - super(ClientEventCode.CODE_SHOW_OPTIONS_PVE); - } - - @Override - public void handle(Channel channel, String json) { - LobbyMethod lobbyMethod = (LobbyMethod) uiService.getMethod(LobbyController.METHOD_NAME); - - Platform.runLater(lobbyMethod::toggleToPVEMenu); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVPListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVPListener.java deleted file mode 100644 index 6f03af4..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowOptionsPVPListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.channel.ChannelUtils; -import org.nico.ratel.landlords.enums.ClientEventCode; -import org.nico.ratel.landlords.enums.ServerEventCode; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyMethod; - - -public class ClientShowOptionsPVPListener extends AbstractClientListener { - - public ClientShowOptionsPVPListener() { - super(ClientEventCode.CODE_SHOW_OPTIONS_PVP); - } - - @Override - public void handle(Channel channel, String json) { - LobbyMethod lobbyMethod = (LobbyMethod) uiService.getMethod(LobbyController.METHOD_NAME); - - Platform.runLater(lobbyMethod::toggleToPVPMenu); - ChannelUtils.pushToServer(channel, ServerEventCode.CODE_GET_ROOMS, null); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowPokersListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowPokersListener.java deleted file mode 100644 index e90b446..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowPokersListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import javafx.scene.control.Label; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.CountDownTask; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -import java.util.List; - -public class ClientShowPokersListener extends AbstractClientListener { - - public ClientShowPokersListener() { - super(ClientEventCode.CODE_SHOW_POKERS); - } - - @Override - public void handle(Channel channel, String json) { - JSONObject jsonObject = JSONObject.parseObject(json); - String clientNickname = jsonObject.getString("clientNickname"); - List sellPokerList = jsonObject.getJSONArray("pokers").toJavaList(Poker.class); - - // 更新当前玩家和出牌信息 - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - User user = currentRoomInfo.getPlayer(); - - if (user.getNickname().equals(clientNickname)) { - user.removePokers(sellPokerList); - } else if (currentRoomInfo.getPrevPlayerName().equals(clientNickname)) { - currentRoomInfo.setPrevPlayerSurplusPokerCount(currentRoomInfo.getPrevPlayerSurplusPokerCount() - sellPokerList.size()); - } else if (currentRoomInfo.getNextPlayerName().equals(clientNickname)) { - currentRoomInfo.setNextPlayerSurplusPokerCount(currentRoomInfo.getNextPlayerSurplusPokerCount() - sellPokerList.size()); - } - - currentRoomInfo.setRecentPlayerName(clientNickname); - currentRoomInfo.setRecentPokers(sellPokerList); - - // 视图更新 - String nextPlayerName = jsonObject.getString("sellClinetNickname"); - RoomMethod method = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - Platform.runLater(() -> { - method.showPokers(clientNickname, sellPokerList); - if (nextPlayerName != null) { - method.play(nextPlayerName); - } - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowRoomsListner.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowRoomsListner.java deleted file mode 100644 index f25c4bf..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientShowRoomsListner.java +++ /dev/null @@ -1,27 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - - -import com.alibaba.fastjson.JSONArray; -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.entity.RoomInfo; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyMethod; - -import java.util.List; - -public class ClientShowRoomsListner extends AbstractClientListener { - - public ClientShowRoomsListner() { - super(ClientEventCode.CODE_SHOW_ROOMS); - } - - @Override - public void handle(Channel channel, String json) { - List rooms = JSONArray.parseArray(json, RoomInfo.class); - - LobbyMethod method = (LobbyMethod) uiService.getMethod(LobbyController.METHOD_NAME); - Platform.runLater(() -> method.showRoomList(rooms)); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientStartGameListener.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientStartGameListener.java deleted file mode 100644 index e2357b9..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientStartGameListener.java +++ /dev/null @@ -1,65 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import com.alibaba.fastjson.JSONObject; -import io.netty.channel.Channel; -import javafx.application.Platform; -import org.nico.ratel.landlords.entity.ClientSide; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.lobby.LobbyController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomController; -import priv.zxw.ratel.landlords.client.javafx.ui.view.room.RoomMethod; - -import java.util.List; - -public class ClientStartGameListener extends AbstractClientListener { - - public ClientStartGameListener() { - super(ClientEventCode.CODE_GAME_STARTING); - } - - @Override - public void handle(Channel channel, String json) { - JSONObject jsonObject = JSONObject.parseObject(json); - - // 设置用户信息和当前对局房间信息 - User user = BeanUtil.getBean("user"); - user.addPokers(jsonObject.getJSONArray("pokers").toJavaList(Poker.class)); - user.joinRoom(jsonObject.getIntValue("roomId")); - - CurrentRoomInfo currentRoomInfo = new CurrentRoomInfo(jsonObject.getIntValue("roomId"), - jsonObject.getString("roomOwner")); - currentRoomInfo.setPlayer(user); - currentRoomInfo.setPrevPlayerSurplusPokerCount(17); - currentRoomInfo.setNextPlayerSurplusPokerCount(17); - BeanUtil.addBean("currentRoomInfo", currentRoomInfo); - - // 计算出玩家的顺序 - List clientOrderList = jsonObject.getJSONArray("clientOrderList").toJavaList(ClientSide.class); - ClientSide clientSide = clientOrderList.stream().filter(c -> user.getNickname().equals(c.getNickname())).findFirst().get(); - currentRoomInfo.setPrevPlayerName(clientSide.getPre().getNickname()); - currentRoomInfo.setNextPlayerName(clientSide.getNext().getNickname()); - - // 更新试图 - Method lobbyMethod = uiService.getMethod(LobbyController.METHOD_NAME); - RoomMethod roomMethod = (RoomMethod) uiService.getMethod(RoomController.METHOD_NAME); - - Platform.runLater(() -> { - // 客户端加入房间时,可能没有触发 joinRoomSuccessful 的事件 - // 导致视图未正常切换,判断视图是否切换,否则进行试图切换 - if (!roomMethod.isShow()) { - lobbyMethod.doClose(); - roomMethod.joinRoom(); - } - - roomMethod.startGame(user.getPokers()); - }); - - // 触发抢地主(CODE_GAME_LANDLORD_ELECT)事件 - ClientListenerUtils.getListener(ClientEventCode.CODE_GAME_LANDLORD_ELECT).handle(channel, json); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/UIService.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/UIService.java deleted file mode 100644 index dee6ceb..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/UIService.java +++ /dev/null @@ -1,21 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui; - - -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; - -import java.util.HashMap; -import java.util.Map; - -public class UIService { - private Map methodMap = new HashMap<>(16); - - public void addMethods(Method... methods) { - for (Method method : methods) { - methodMap.put(method.getName(), method); - } - } - - public Method getMethod(String name) { - return methodMap.get(name); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IIndexEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IIndexEvent.java deleted file mode 100644 index 96e9c57..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IIndexEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.event; - - -public interface IIndexEvent { - - void connect(String host, int port) throws Exception; -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILobbyEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILobbyEvent.java deleted file mode 100644 index f798541..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILobbyEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.event; - - -public interface ILobbyEvent { - - void selectPVPModal(); - - void selectPVEModal(); - - void createPVPRoom(); - - void createPVERoom(int modal); - - void showRooms(); - - void joinRoom(int roomId); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILoginEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILoginEvent.java deleted file mode 100644 index df84c07..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/ILoginEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.event; - - -public interface ILoginEvent { - - void setNickname(String nickname); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IRoomEvent.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IRoomEvent.java deleted file mode 100644 index dc11870..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/event/IRoomEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.event; - -import org.nico.ratel.landlords.entity.Poker; - -import java.util.List; - -public interface IRoomEvent { - void robLandlord(); - - void notRobLandlord(); - - void submitPokers(List pokerList); - - void passRound(); - - void exit(); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/AlertUtils.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/AlertUtils.java deleted file mode 100644 index 1120f4f..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/AlertUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view; - -import javafx.scene.control.Alert; - -public class AlertUtils { - - public static void info(String headerText, String contentText) { - createAndShowAlert(Alert.AlertType.INFORMATION, headerText, contentText); - } - - private static void createAndShowAlert(Alert.AlertType alertType, - String headerText, String contentText) { - Alert alert = new Alert(Alert.AlertType.INFORMATION); - alert.setTitle(Alert.AlertType.INFORMATION.equals(alertType) ? "信息" : - Alert.AlertType.WARNING.equals(alertType) ? "警告" : "错误"); - alert.setHeaderText(headerText); - alert.setContentText(contentText); - - alert.showAndWait(); - } - - public static void warn(String headerText, String contentText) { - createAndShowAlert(Alert.AlertType.WARNING, headerText, contentText); - } - - public static void error(String headerText, String contentText) { - createAndShowAlert(Alert.AlertType.ERROR, headerText, contentText); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/CountDownTask.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/CountDownTask.java deleted file mode 100644 index 0fcaa43..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/CountDownTask.java +++ /dev/null @@ -1,93 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view; - - -import javafx.scene.Node; - -import java.util.Objects; -import java.util.function.Consumer; - -public class CountDownTask { - public static final int DEFAULT_TIME_OUT = 30; - - private Consumer finallyExecuteConsumer; - private Consumer preSecondExecuteConsumer; - private Node targetElement; - private int duration; - - public CountDownTask(Node targetElement, - Consumer finallyExecuteConsumer, Consumer preSecondExecuteConsumer) { - this.finallyExecuteConsumer = finallyExecuteConsumer; - this.preSecondExecuteConsumer = preSecondExecuteConsumer; - this.targetElement = targetElement; - } - - public CountDownTask(Node targetElement, int duration, - Consumer finallyExecuteConsumer, Consumer preSecondExecuteConsumer) { - Objects.requireNonNull(finallyExecuteConsumer); - - this.finallyExecuteConsumer = finallyExecuteConsumer; - this.preSecondExecuteConsumer = preSecondExecuteConsumer; - this.duration = duration < 0 ? DEFAULT_TIME_OUT : duration; - this.targetElement = targetElement; - } - - public CountDownFuture start() { - targetElement.setVisible(true); - - CountDownFuture future = new CountDownFuture(); - future.start(); - - return future; - } - - public class CountDownFuture extends Thread { - - private volatile boolean done = false; - - private CountDownFuture() { - setDaemon(true); - } - - @Override - public void run() { - long startTimeMillis = System.currentTimeMillis(); - - long interval; - try { - while (true) { - long currentTimeMillis = System.currentTimeMillis(); - interval = (currentTimeMillis - startTimeMillis) / 1000; - - if (interval > duration) { - break; - } - - preSecondExecuteConsumer.accept((int) (duration - interval)); - - sleep(1000L); - } - - finallyExecuteConsumer.accept(targetElement); - } catch (InterruptedException cancelFlag) { - // exit - return; - } finally { - done = true; - targetElement.setVisible(false); - } - } - - public void cancel() { - if (done) { - return; - } - - done = true; - interrupt(); - } - - public boolean isDone() { - return done; - } - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/EventRegister.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/EventRegister.java deleted file mode 100644 index db82869..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/EventRegister.java +++ /dev/null @@ -1,7 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view; - - -public interface EventRegister { - - void registerEvent(); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/Method.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/Method.java deleted file mode 100644 index 69976d5..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/Method.java +++ /dev/null @@ -1,10 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view; - - -public interface Method { - String getName(); - - void doShow(); - - void doClose(); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/UIObject.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/UIObject.java deleted file mode 100644 index fb5853c..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/UIObject.java +++ /dev/null @@ -1,101 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view; - - -import javafx.animation.FadeTransition; -import javafx.application.Platform; -import javafx.scene.Node; -import javafx.scene.Parent; -import javafx.stage.Stage; -import javafx.util.Duration; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.NettyClient; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.function.Consumer; - -public abstract class UIObject extends Stage { - - protected Parent root; - - private ExecutorService animationExecutorService = Executors.newFixedThreadPool(2); - - public UIObject() { - setTitle("ratel javafx客户端"); - - // 退出程序 - setOnCloseRequest(e -> closeApplication()); - } - - private void closeApplication() { - // 关闭视图 - close(); - Platform.exit(); - - // 关闭用于动画执行的线程池 - animationExecutorService.shutdownNow(); - - // 关闭netty - NettyClient nettyClient = BeanUtil.getBean("nettyClient"); - if (nettyClient != null) { - nettyClient.destroy(); - } - } - - public T $(String id, Class clazz) { - return (T) root.lookup("#" + id); - } - - public void delayShow(Node node, int secondDelay) { - animationExecutorService.execute(new DelayRunnable(node, n -> n.setVisible(true), secondDelay)); - } - - public void delayHidden(Node node, int secondDelay) { - animationExecutorService.execute(new DelayRunnable(node, n -> { - // 动画过程中的元素是无效的,不能被操作的 - n.setDisable(true); - useTransition(n); - n.setDisable(false); - n.setVisible(false); - }, secondDelay)); - } - - private class DelayRunnable implements Runnable { - private Object monitor = new Object(); - private Node node; - private Consumer operate; - private int delayTimes; - - DelayRunnable(Node node, Consumer operate, int delayTimes) { - this.node = node; - this.operate = operate; - this.delayTimes = delayTimes; - } - - @Override - public void run() { - try { - synchronized (monitor) { - monitor.wait(delayTimes * 1000L); - } - } catch (InterruptedException e) { - Thread.currentThread().isInterrupted(); - } - - operate.accept(node); - } - } - - private void useTransition(Node node) { - FadeTransition fade = new FadeTransition(); - fade.setDuration(Duration.millis(1000)); - fade.setFromValue(1); - fade.setToValue(0.1); - fade.setCycleCount(1000); - fade.setAutoReverse(true); - fade.setNode(node); - fade.play(); - } - - public abstract void registerEvent(); -} \ No newline at end of file diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexController.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexController.java deleted file mode 100644 index 1cafea4..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexController.java +++ /dev/null @@ -1,83 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.index; - - -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.layout.Pane; -import priv.zxw.ratel.landlords.client.javafx.ui.event.IIndexEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -import java.io.IOException; -import java.util.List; - -public class IndexController extends UIObject implements IndexMethod { - public static final String METHOD_NAME = "index"; - - private static final String RESOURCE_NAME = "view/index.fxml"; - - private IIndexEvent indexEvent; - private IndexEventRegister eventRegister; - - public IndexController(IIndexEvent indexEvent) throws IOException { - super(); - - this.indexEvent = indexEvent; - - root = FXMLLoader.load(getClass().getClassLoader().getResource(RESOURCE_NAME)); - setScene(new Scene(root)); - - registerEvent(); - } - - @Override - public void generateRemoteServerAddressOptions(List remoteServerAddressList) { - Pane remoteServerListPane = $("remoteServerListPane", Pane.class); - - for (int i = 0, size = remoteServerAddressList.size(); i < size; i++) { - Label serverAddressLabel = new ServerAddressLabel(remoteServerAddressList.get(i), i).getLabel(); - serverAddressLabel.setOnMouseClicked(e -> { - Label label = (Label) e.getSource(); - String remoteServerAddress = label.getText().trim(); - String[] strs = remoteServerAddress.split(":"); - - $("host", TextField.class).setText(strs[0]); - $("port", TextField.class).setText(strs[1]); - }); - - remoteServerListPane.getChildren().add(serverAddressLabel); - } - } - - @Override - public void setFetchRemoteServerAddressErrorTips() { - $("fetchServerAddressErrorTips", TextArea.class).setVisible(true); - } - - @Override - public void setConnectServerErrorTips() { - $("connectServerErrorTips", Label.class).setVisible(true); - } - - @Override - public String getName() { - return METHOD_NAME; - } - - @Override - public void doShow() { - super.show(); - } - - @Override - public void doClose() { - super.close(); - } - - @Override - public void registerEvent() { - eventRegister = new IndexEventRegister(this, indexEvent); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexEventRegister.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexEventRegister.java deleted file mode 100644 index 5dbd111..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexEventRegister.java +++ /dev/null @@ -1,44 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.index; - - -import javafx.application.Platform; -import javafx.scene.control.Button; -import javafx.scene.control.TextField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import priv.zxw.ratel.landlords.client.javafx.ui.event.IIndexEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.EventRegister; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -public class IndexEventRegister implements EventRegister { - private static final Logger LOGGER = LoggerFactory.getLogger(IndexEventRegister.class); - - private UIObject uiObject; - private IIndexEvent indexEvent; - - public IndexEventRegister(UIObject uiObject, IIndexEvent indexEvent) { - this.uiObject = uiObject; - this.indexEvent = indexEvent; - - registerEvent(); - } - - @Override - public void registerEvent() { - connectServer(); - } - - private void connectServer() { - uiObject.$("connectButton", Button.class).setOnAction(e -> { - String host = uiObject.$("host", TextField.class).getText().trim(); - int port = Integer.parseInt(uiObject.$("port", TextField.class).getText().trim()); - - try { - indexEvent.connect(host, port); - } catch (Exception ex) { - LOGGER.error(String.format("连接netty服务端(%s:%d)失败", host, port), ex); - Platform.runLater(() -> ((IndexMethod) uiObject).setConnectServerErrorTips()); - } - }); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexMethod.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexMethod.java deleted file mode 100644 index 4ae87bb..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/IndexMethod.java +++ /dev/null @@ -1,13 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.index; - -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; - -import java.util.List; - -public interface IndexMethod extends Method { - void generateRemoteServerAddressOptions(List remoteServerAddressList); - - void setFetchRemoteServerAddressErrorTips(); - - void setConnectServerErrorTips(); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/ServerAddressLabel.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/ServerAddressLabel.java deleted file mode 100644 index ebcce4d..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/index/ServerAddressLabel.java +++ /dev/null @@ -1,19 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.index; - -import javafx.scene.control.Label; - -public class ServerAddressLabel { - - private Label label; - - public ServerAddressLabel(String serverAddress, int index) { - label = new Label(); - label.setText(serverAddress); - label.setLayoutY(index * 30); - label.getStyleClass().add("remoteServerOption"); - } - - public Label getLabel() { - return label; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyController.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyController.java deleted file mode 100644 index a7dc825..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyController.java +++ /dev/null @@ -1,91 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.lobby; - - -import javafx.collections.ObservableList; -import javafx.fxml.FXMLLoader; -import javafx.scene.Node; -import javafx.scene.Scene; -import javafx.scene.layout.Pane; -import priv.zxw.ratel.landlords.client.javafx.entity.RoomInfo; -import priv.zxw.ratel.landlords.client.javafx.ui.event.ILobbyEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.AlertUtils; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -import java.io.IOException; -import java.util.List; - -public class LobbyController extends UIObject implements LobbyMethod { - public static final String METHOD_NAME = "lobby"; - - private static final String RESOURCE_NAME = "view/lobby.fxml"; - - private ILobbyEvent lobbyEvent; - private LobbyEventRegister lobbyEventRegister; - - public LobbyController(ILobbyEvent lobbyEvent) throws IOException { - super(); - - root = FXMLLoader.load(getClass().getClassLoader().getResource(RESOURCE_NAME)); - setScene(new Scene(root)); - - this.lobbyEvent = lobbyEvent; - - registerEvent(); - } - - @Override - public void registerEvent() { - lobbyEventRegister = new LobbyEventRegister(this, lobbyEvent); - } - - @Override - public void toggleToPVPMenu() { - Pane modalPane = $("modalPane", Pane.class); - modalPane.setVisible(false); - - Pane pvpMenuPane = $("pvpMenuPane", Pane.class); - pvpMenuPane.setVisible(true); - } - - @Override - public void toggleToPVEMenu() { - Pane modalPane = $("modalPane", Pane.class); - modalPane.setVisible(false); - - Pane pveMenuPane = $("pveMenuPane", Pane.class); - pveMenuPane.setVisible(true); - } - - @Override - public void showRoomList(List roomInfoList) { - Pane roomsPane = $("roomsPane", Pane.class); - - for (int i = 0, size = roomInfoList.size(); i < size; i++) { - RoomInfo roomInfo = roomInfoList.get(i); - Pane roomPane = new RoomPane(roomInfo, i).getPane(); - roomPane.setOnMouseClicked(e -> lobbyEvent.joinRoom(roomInfo.getRoomId())); - - roomsPane.getChildren().add(roomPane); - } - } - - @Override - public void joinRoomFail(String message, String commentMessage) { - AlertUtils.warn(message, commentMessage); - } - - @Override - public String getName() { - return METHOD_NAME; - } - - @Override - public void doShow() { - super.show(); - } - - @Override - public void doClose() { - super.close(); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyEventRegister.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyEventRegister.java deleted file mode 100644 index 7a860c3..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyEventRegister.java +++ /dev/null @@ -1,50 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.lobby; - - -import javafx.scene.control.Button; -import priv.zxw.ratel.landlords.client.javafx.ui.event.ILobbyEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.EventRegister; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -public class LobbyEventRegister implements EventRegister { - - private UIObject uiObject; - private ILobbyEvent lobbyEvent; - - public LobbyEventRegister(UIObject uiObject, ILobbyEvent lobbyEvent) { - this.uiObject = uiObject; - this.lobbyEvent = lobbyEvent; - - registerEvent(); - } - - @Override - public void registerEvent() { - selectPVPModal(); - selectPVEModal(); - createPVPRoom(); - createPVERoom(); - } - - private void selectPVPModal() { - uiObject.$("pvpModalButton", Button.class).setOnAction(e -> lobbyEvent.selectPVPModal()); - } - - private void selectPVEModal() { - uiObject.$("pveModalButton", Button.class).setOnAction(e -> lobbyEvent.selectPVEModal()); - } - - private void createPVPRoom() { - uiObject.$("createRoomButton", Button.class).setOnAction(e -> lobbyEvent.createPVPRoom()); - } - - private static final int SIMPLE_MODAL = 1; - private static final int NORMAL_MODAL = 2; - private static final int DIFFICULT_MODAL = 3; - - private void createPVERoom() { - uiObject.$("simpleModalButton", Button.class).setOnAction(e -> lobbyEvent.createPVERoom(SIMPLE_MODAL)); - uiObject.$("normalModalButton", Button.class).setOnAction(e -> lobbyEvent.createPVERoom(NORMAL_MODAL)); - uiObject.$("difficultModalButton", Button.class).setOnAction(e -> lobbyEvent.createPVERoom(DIFFICULT_MODAL)); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyMethod.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyMethod.java deleted file mode 100644 index 185e9fd..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/LobbyMethod.java +++ /dev/null @@ -1,18 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.lobby; - - -import priv.zxw.ratel.landlords.client.javafx.entity.RoomInfo; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; - -import java.util.List; - -public interface LobbyMethod extends Method { - - void toggleToPVPMenu(); - - void toggleToPVEMenu(); - - void showRoomList(List roomInfoList); - - void joinRoomFail(String message, String commentMessage); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/RoomPane.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/RoomPane.java deleted file mode 100644 index bb7fd25..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/lobby/RoomPane.java +++ /dev/null @@ -1,61 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.lobby; - - -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import priv.zxw.ratel.landlords.client.javafx.entity.RoomInfo; - -public class RoomPane { - private static final int MARGIN_TOP = 25; - private static final int MARGIN_LEFT = 40; - - private Pane pane; - - public RoomPane(RoomInfo roomInfo, int index) { - pane = new Pane(); - pane.getStyleClass().add("roomPane"); - pane.setLayoutX(35 + (index % 3) * (150 + MARGIN_LEFT)); - pane.setLayoutY(65 + ((index / 3) * (120 + MARGIN_TOP))); - - Label idLabel = new Label(); - idLabel.setLayoutX(6); - idLabel.setLayoutY(3); - idLabel.getStyleClass().add("idLabel"); - idLabel.setText(roomInfo.getRoomId().toString()); - - Label roomOwnerLabel = new Label(); - roomOwnerLabel.setLayoutX(0); - roomOwnerLabel.setLayoutY(22); - roomOwnerLabel.getStyleClass().add("roomOwnerLabel"); - - Label roomOwnerNameLabel = new Label(); - roomOwnerNameLabel.setLayoutX(34); - roomOwnerNameLabel.setLayoutY(32); - roomOwnerNameLabel.setText(roomInfo.getRoomOwner()); - - Label modalLabel = new Label(); - modalLabel.setLayoutX(54); - modalLabel.setLayoutY(60); - modalLabel.getStyleClass().add("modalLabel"); - modalLabel.setText(roomInfo.getRoomType()); - - Label playerCountLabel = new Label(); - playerCountLabel.setLayoutX(60); - playerCountLabel.setLayoutY(100); - playerCountLabel.getStyleClass().add("playerCountLabel"); - playerCountLabel.setText("当前人数:" + roomInfo.getRoomClientCount() + "/3"); - - ObservableList children = pane.getChildren(); - children.add(idLabel); - children.add(roomOwnerLabel); - children.add(roomOwnerNameLabel); - children.add(modalLabel); - children.add(playerCountLabel); - } - - public Pane getPane() { - return pane; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginController.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginController.java deleted file mode 100644 index 2be430f..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginController.java +++ /dev/null @@ -1,49 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.login; - -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import priv.zxw.ratel.landlords.client.javafx.ui.event.ILoginEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -import java.io.IOException; - -public class LoginController extends UIObject implements Method { - public static final String METHOD_NAME = "login"; - - private static final String RESOURCE_NAME = "view/login.fxml"; - - private ILoginEvent loginEvent; - private LoginEventRegister loginEventRegister; - - public LoginController(ILoginEvent loginEvent) throws IOException { - super(); - - root = FXMLLoader.load(getClass().getClassLoader().getResource(RESOURCE_NAME)); - setScene(new Scene(root)); - - this.loginEvent = loginEvent; - - registerEvent(); - } - - @Override - public void registerEvent() { - this.loginEventRegister = new LoginEventRegister(this, loginEvent); - } - - @Override - public String getName() { - return METHOD_NAME; - } - - @Override - public void doShow() { - super.show(); - } - - @Override - public void doClose() { - super.close(); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginEventRegister.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginEventRegister.java deleted file mode 100644 index c1ab0ff..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/login/LoginEventRegister.java +++ /dev/null @@ -1,39 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.login; - - -import javafx.scene.control.Button; -import javafx.scene.control.TextField; -import priv.zxw.ratel.landlords.client.javafx.ui.event.ILoginEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.EventRegister; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -public class LoginEventRegister implements EventRegister { - - private UIObject uiObject; - private ILoginEvent loginEvent; - - public LoginEventRegister(UIObject uiObject, ILoginEvent loginEvent) { - this.uiObject = uiObject; - this.loginEvent = loginEvent; - - registerEvent(); - } - - @Override - public void registerEvent() { - submitNickname(); - } - - private void submitNickname() { - TextField field = uiObject.$("nicknameInput", TextField.class); - - uiObject.$("submitButton", Button.class).setOnAction(e -> { - String nickname = field.getText().trim(); - loginEvent.setNickname(nickname); - }); - } - - private void verifyNickname() { - uiObject.$("input", TextField.class).setOnAction(e -> {}); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/PokerPane.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/PokerPane.java deleted file mode 100644 index 447315b..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/PokerPane.java +++ /dev/null @@ -1,162 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.room; - -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.layout.Pane; -import javafx.scene.paint.Paint; -import javafx.scene.text.Text; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.PokerLevel; -import org.nico.ratel.landlords.enums.PokerType; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; - -public class PokerPane { - public static final int MARGIN_LEFT = 40; - - private Poker poker; - // start at 0 - private int index; - private int offsetX; - - private Pane pane; - - public PokerPane(int index, int offsetX, Poker poker) { - this.poker = poker; - this.index = index; - this.offsetX = offsetX; - - if (PokerLevel.LEVEL_SMALL_KING.equals(poker.getLevel()) || - PokerLevel.LEVEL_BIG_KING.equals(poker.getLevel())) { - createJokerPokerPane(); - } else { - createNormalPokerPane(); - } - - pane.setOnMouseClicked(e -> { - double y = pane.getLayoutY(); - boolean alreadyChecked = y == 0; - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - - // 取消选中 - if (alreadyChecked) { - pane.setLayoutY(y + 20); - currentRoomInfo.removeUncheckedPoker(poker); - } - // 选中 - else { - pane.setLayoutY(y - 20); - currentRoomInfo.addCheckedPoker(poker); - } - }); - } - - private void createNormalPokerPane() { - pane = new Pane(); - pane.getStyleClass().add("horizontal-poker"); - pane.setLayoutX(index * MARGIN_LEFT + offsetX); - pane.setLayoutY(20); - - Text level = new Text(); - level.getStyleClass().add("level"); - level.setLayoutX(8); - level.setLayoutY(34); - level.setText(poker.getLevel().getName()); - - Text typeSmall = new Text(); - typeSmall.getStyleClass().add("type-small"); - typeSmall.setLayoutX(8); - typeSmall.setLayoutY(60); - typeSmall.setText(poker.getType().getName()); - - Text typeBig = new Text(); - typeBig.getStyleClass().add("type-big"); - typeBig.setLayoutX(50); - typeBig.setLayoutY(120); - typeBig.setText(poker.getType().getName()); - - if (PokerType.CLUB.equals(poker.getType()) || PokerType.SPADE.equals(poker.getType())) { - level.setFill(Paint.valueOf("black")); - typeSmall.setFill(Paint.valueOf("black")); - typeBig.setFill(Paint.valueOf("black")); - } else if (PokerType.DIAMOND.equals(poker.getType()) || PokerType.HEART.equals(poker.getType())) { - level.setFill(Paint.valueOf("#9c2023")); - typeSmall.setFill(Paint.valueOf("#9c2023")); - typeBig.setFill(Paint.valueOf("#9c2023")); - } - - ObservableList children = pane.getChildren(); - children.add(level); - children.add(typeSmall); - children.add(typeBig); - } - - private void createJokerPokerPane() { - pane = new Pane(); - pane.getStyleClass().add("horizontal-poker"); - pane.setLayoutX(index * MARGIN_LEFT + offsetX); - pane.setLayoutY(20); - - Text text1 = new Text(); - text1.getStyleClass().add("joker-level"); - text1.setLayoutX(13); - text1.setLayoutY(26); - text1.setText("J"); - - Text text2 = new Text(); - text2.getStyleClass().add("joker-level"); - text2.setLayoutX(8); - text2.setLayoutY(44); - text2.setText("O"); - - Text text3 = new Text(); - text3.getStyleClass().add("joker-level"); - text3.setLayoutX(10); - text3.setLayoutY(62); - text3.setText("K"); - - Text text4 = new Text(); - text4.getStyleClass().add("joker-level"); - text4.setLayoutX(10); - text4.setLayoutY(80); - text4.setText("E"); - - Text text5 = new Text(); - text5.getStyleClass().add("joker-level"); - text5.setLayoutX(10); - text5.setLayoutY(98); - text5.setText("R"); - - Text logo = new Text(); - logo.setLayoutX(40); - logo.setLayoutY(126); - logo.setStyle("-fx-font-size: 28"); - logo.setStyle("-fx-text-fill: silver"); - logo.setText("ratel"); - - if (PokerLevel.LEVEL_SMALL_KING.equals(poker.getLevel())) { - text1.setFill(Paint.valueOf("black")); - text2.setFill(Paint.valueOf("black")); - text3.setFill(Paint.valueOf("black")); - text4.setFill(Paint.valueOf("black")); - text5.setFill(Paint.valueOf("black")); - } else if (PokerLevel.LEVEL_BIG_KING.equals(poker.getLevel())) { - text1.setFill(Paint.valueOf("#9c2023")); - text2.setFill(Paint.valueOf("#9c2023")); - text3.setFill(Paint.valueOf("#9c2023")); - text4.setFill(Paint.valueOf("#9c2023")); - text5.setFill(Paint.valueOf("#9c2023")); - } - - ObservableList children = pane.getChildren(); - children.add(text1); - children.add(text2); - children.add(text3); - children.add(text4); - children.add(text5); - } - - public Pane getPane() { - return pane; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomController.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomController.java deleted file mode 100644 index d48740e..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomController.java +++ /dev/null @@ -1,452 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.room; - - -import javafx.application.Platform; -import javafx.fxml.FXMLLoader; -import javafx.scene.Node; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import javafx.scene.text.Text; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientType; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.CountDownTask; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.event.IRoomEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class RoomController extends UIObject implements RoomMethod { - public static final String METHOD_NAME = "room"; - - private static final String RESOURCE_NAME = "view/room.fxml"; - - private IRoomEvent roomEvent; - private RoomEventRegister roomEventDefine; - - private PlayerPaneOperator prevPlayerPaneOperator; - private PlayerPaneOperator nextPlayerPaneOperator; - private PlayerPaneOperator playerPaneOperator; - - public RoomController(IRoomEvent roomEvent) throws IOException { - super(); - - root = FXMLLoader.load(getClass().getClassLoader().getResource(RESOURCE_NAME)); - setScene(new Scene(root)); - - this.roomEvent = roomEvent; - - registerEvent(); - - prevPlayerPaneOperator = new PrevPlayerPaneOperator(); - nextPlayerPaneOperator = new NextPlayerPaneOperator(); - playerPaneOperator = new CurrentPlayerPaneOperator(); - } - - @Override - public void startGame(List pokers) { - // 1,组件状态改变(遮蔽罩隐藏,游戏面板可用状态改变) - // 2,组件内容填充 - // 3,元素隐藏 - // 4,牌初始化(己方和对方) - $("waitingPane", Pane.class).setVisible(false); - $("playingPane", Pane.class).setDisable(false); - - Button robButton = $("robButton", Button.class); - robButton.setText("抢地主"); - robButton.setVisible(false); - - Button notRobButton = $("notRobButton", Button.class); - notRobButton.setText("不抢"); - notRobButton.setVisible(false); - - $("prevPlayerPane", Pane.class).lookup(".tips").setVisible(false); - $("nextPlayerPane", Pane.class).lookup(".tips").setVisible(false); - $("quitButton", Button.class).setText("退出"); - - initPokers(pokers); - } - - private static final int PER_PLAYER_DEFAULT_POKER_COUNT = 17; - private static final int SURPLUS_POKER_COUNT = 3; - - private void initPokers(List pokers) { - // 己方牌pane - refreshPlayPokers(pokers); - - // 上下游牌pane - $("prevPlayerPokersPane", Pane.class).setVisible(true); - $("nextPlayerPokersPane", Pane.class).setVisible(true); - refreshPrevPlayerPokers(PER_PLAYER_DEFAULT_POKER_COUNT); - refreshNextPlayerPokers(PER_PLAYER_DEFAULT_POKER_COUNT); - - // 底牌 - Pane surplusPokersPane = $("surplusPokersPane", Pane.class); - - surplusPokersPane.getChildren().clear(); - for (int n = 0; n < SURPLUS_POKER_COUNT; n++) { - surplusPokersPane.getChildren().add(new SurplusPokerPane(n).getPane()); - } - } - - @Override - public void gameOver(String winnerName, ClientType winnerType) { - $("playingPane", Pane.class).setDisable(true); - Pane gameOverPane = $("gameOverPane", Pane.class); - gameOverPane.setVisible(true); - Text text = (Text) gameOverPane.lookup("#winnerInfo"); - text.setText(String.format("游戏结束,%s胜利", ClientType.LANDLORD.equals(winnerType) ? "地主" : "农民")); - } - - @Override - public void showPokers(String playerName, List pokers) { - getPlayerPaneOperatorByPlayerName(playerName).showPokers(pokers); - } - - private PlayerPaneOperator getPlayerPaneOperatorByPlayerName(String playerName) { - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - - if (playerName.equals(currentRoomInfo.getPrevPlayerName())) { - return prevPlayerPaneOperator; - } else if (playerName.equals(currentRoomInfo.getNextPlayerName())) { - return nextPlayerPaneOperator; - } else if (playerName.equals(currentRoomInfo.getPlayer().getNickname())) { - return playerPaneOperator; - } - - throw new IllegalStateException("当前房间没有 " + playerName + " 用户"); - } - - @Override - public void showMessage(String playerName, String message) { - getPlayerPaneOperatorByPlayerName(playerName).showMessage(message); - } - - @Override - public void play(String playerName) { - getPlayerPaneOperatorByPlayerName(playerName).play(); - } - - @Override - public void refreshPlayPokers(List pokers) { - final int pokersPaneWidth = 870; - final int pokerPaneWidth = 110; - int size = pokers.size(); - // 第一张牌的x轴偏移量 - int firstPokerPaneOffsetX = ((pokersPaneWidth - pokerPaneWidth) - PokerPane.MARGIN_LEFT * (size -1)) / 2; - - Pane pokersPane = $("pokersPane", Pane.class); - - // 可能之前有牌,先清理再填充 - pokersPane.getChildren().clear(); - for (int i = 0; i < size; i++) { - pokersPane.getChildren().add(new PokerPane(i, firstPokerPaneOffsetX, pokers.get(i)).getPane()); - } - } - - @Override - public void refreshPrevPlayerPokers(int pokerCount) { - Pane prevPlayerPokersPane = $("prevPlayerPokersPane", Pane.class); - ((Label) prevPlayerPokersPane.lookup(".pokerCount")).setText(String.valueOf(pokerCount)); - } - - @Override - public void refreshNextPlayerPokers(int pokerCount) { - Pane nextPlayerPokersPane = $("nextPlayerPokersPane", Pane.class); - ((Label) nextPlayerPokersPane.lookup(".pokerCount")).setText(String.valueOf(pokerCount)); - } - - - @Override - public void showRobButtons() { - $("robButton", Button.class).setVisible(true); - $("notRobButton", Button.class).setVisible(true); - } - - @Override - public void hideRobButtons() { - $("robButton", Button.class).setVisible(false); - $("notRobButton", Button.class).setVisible(false); - } - - @Override - public void showSurplusPokers(List surplusPokers) { - Pane surplusPokersPane = $("surplusPokersPane", Pane.class); - - surplusPokersPane.getChildren().clear(); - for (int n = 0, size = surplusPokers.size(); n < size; n++) { - Pane surplusPokerPane = new PokerPane(n, 0, surplusPokers.get(n)).getPane(); - surplusPokerPane.setLayoutX(45 + n * (SurplusPokerPane.MARGIN_LEFT + 110)); - surplusPokerPane.setLayoutY(0); - - surplusPokersPane.getChildren().add(surplusPokerPane); - } - } - - @Override - public void setLandLord(String landlordName) { - // 1,为地主加底牌(重新洗牌) - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - if (ClientType.LANDLORD.equals(currentRoomInfo.getPrevPlayerRole())) { - currentRoomInfo.setPrevPlayerSurplusPokerCount(PER_PLAYER_DEFAULT_POKER_COUNT + SURPLUS_POKER_COUNT); - currentRoomInfo.setNextPlayerSurplusPokerCount(PER_PLAYER_DEFAULT_POKER_COUNT); - refreshPrevPlayerPokers(PER_PLAYER_DEFAULT_POKER_COUNT + SURPLUS_POKER_COUNT); - } else if (ClientType.LANDLORD.equals(currentRoomInfo.getNextPlayerRole())) { - currentRoomInfo.setNextPlayerSurplusPokerCount(PER_PLAYER_DEFAULT_POKER_COUNT + SURPLUS_POKER_COUNT); - currentRoomInfo.setPrevPlayerSurplusPokerCount(PER_PLAYER_DEFAULT_POKER_COUNT); - refreshNextPlayerPokers(PER_PLAYER_DEFAULT_POKER_COUNT + SURPLUS_POKER_COUNT); - } else { - User user = BeanUtil.getBean("user"); - refreshPlayPokers(user.getPokers()); - } - - // 2,显示每个人的角色(地主|农民)和姓名 - $("prevPlayerRole", Label.class).setText(ClientType.LANDLORD.equals(currentRoomInfo.getPrevPlayerRole()) ? "地主" : "农民"); - $("nextPlayerRole", Label.class).setText(ClientType.LANDLORD.equals(currentRoomInfo.getNextPlayerRole()) ? "地主" : "农民"); - $("playerRole", Label.class).setText(ClientType.LANDLORD.equals(currentRoomInfo.getPlayer().getRole()) ? "地主" : "农民"); - - $("prevPlayerNickname", Label.class).setText(currentRoomInfo.getPrevPlayerName()); - $("nextPlayerNickname", Label.class).setText(currentRoomInfo.getNextPlayerName()); - $("playerNickname", Label.class).setText(currentRoomInfo.getPlayer().getNickname()); - } - - @Override - public void showPokerPlayButtons() { - $("submitButton", Button.class).setVisible(true); - $("passButton", Button.class).setVisible(true); - } - - @Override - public void hidePokerPlayButtons() { - $("submitButton", Button.class).setVisible(false); - $("passButton", Button.class).setVisible(false); - } - - @Override - public boolean isShow() { - return super.isShowing(); - } - - @Override - public void joinRoom() { - super.show(); - } - - @Override - public void doShow() { - super.show(); - } - - @Override - public void doClose() { - super.close(); - } - - @Override - public void registerEvent() { - roomEventDefine = new RoomEventRegister(this, roomEvent); - } - - @Override - public String getName() { - return METHOD_NAME; - } - - interface PlayerPaneOperator { - void showPokers(List pokers); - - void showMessage(String message); - - void play(); - } - - private abstract class AbstractPlayerPaneOperator implements PlayerPaneOperator { - protected Pane playerShowPane; - protected Label timer; - protected Label tips; - protected Pane playerShowPokersPane; - - protected Pane playerPokersPane; - - protected CountDownTask.CountDownFuture future; - - AbstractPlayerPaneOperator(String parentPaneId) { - this.playerShowPane = $(parentPaneId, Pane.class); - this.timer = (Label) playerShowPane.lookup(".timer"); - } - - @Override - public synchronized void showMessage(String message) { - if (future != null && !future.isDone()) { - future.cancel(); - } - - playerShowPokersPane.getChildren().clear(); - - tips.setText(message); - tips.setVisible(true); - } - - @Override - public synchronized void play() { - playerShowPokersPane.getChildren().clear(); - - tips.setVisible(false); - - if (future == null || future.isDone()) { - CountDownTask task = new CountDownTask(timer, 30, - node -> Platform.runLater(() -> hidePokerPlayButtons()), - surplusTime -> Platform.runLater(() -> timer.setText(surplusTime.toString()))); - - future = task.start(); - } - } - - @Override - public synchronized void showPokers(List pokers) { - if (future != null && !future.isDone()) { - future.cancel(); - } - - tips.setVisible(false); - - renderPokers(pokers); - refreshPlayerPokers(pokers); - } - - protected abstract void renderPokers(List pokers); - protected abstract void refreshPlayerPokers(List pokers); - } - - private class PrevPlayerPaneOperator extends AbstractPlayerPaneOperator { - - PrevPlayerPaneOperator() { - super("prevPlayerShowPane"); - - this.tips = (Label) playerShowPane.lookup(".tips"); - this.playerShowPokersPane = (Pane) playerShowPane.lookup("#prevPlayerShowPokersPane"); - - this.playerPokersPane = $("prevPlayerPokersPane", Pane.class); - } - - @Override - public void renderPokers(List pokers) { - final int maxPerRowPokerCount = 8; - - for (int i = 0, size = pokers.size(); i < size; i++) { - ShowPokerPane pokerPane = new ShowPokerPane(pokers.get(i)); - if (i < maxPerRowPokerCount) { - pokerPane.setLayout(i * ShowPokerPane.MARGIN_LEFT, 0); - } else { - pokerPane.setLayout((i % maxPerRowPokerCount) * ShowPokerPane.MARGIN_LEFT, ShowPokerPane.MARGIN_TOP); - } - playerShowPokersPane.getChildren().add(pokerPane.getPane()); - } - } - - @Override - protected void refreshPlayerPokers(List pokers) { - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - - refreshPrevPlayerPokers(currentRoomInfo.getPrevPlayerSurplusPokerCount()); - } - } - - private class NextPlayerPaneOperator extends AbstractPlayerPaneOperator { - - NextPlayerPaneOperator() { - super("nextPlayerShowPane"); - - this.tips = (Label) playerShowPane.lookup(".tips"); - this.playerShowPokersPane = (Pane) playerShowPane.lookup("#nextPlayerShowPokersPane"); - - this.playerPokersPane = $("nextPlayerPokersPane", Pane.class); - } - - @Override - public void renderPokers(List pokers) { - final int maxPerRowPokerCount = 8; - final int parentPaneWidth = 380; - final int showPokerPaneWidth = 40; - - // 从右至左渲染牌 - for (int i = pokers.size() - 1; i >= 0; i--) { - ShowPokerPane pokerPane = new ShowPokerPane(pokers.get(i)); - int layoutX = parentPaneWidth - (showPokerPaneWidth + ShowPokerPane.MARGIN_LEFT * (i % maxPerRowPokerCount)); - if (i < maxPerRowPokerCount) { - pokerPane.setLayout(layoutX, 0); - } else { - pokerPane.setLayout(layoutX, ShowPokerPane.MARGIN_TOP); - } - playerShowPokersPane.getChildren().add(pokerPane.getPane()); - } - } - - @Override - protected void refreshPlayerPokers(List pokers) { - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - - refreshNextPlayerPokers(currentRoomInfo.getNextPlayerSurplusPokerCount()); - } - } - - private class CurrentPlayerPaneOperator extends AbstractPlayerPaneOperator { - - CurrentPlayerPaneOperator() { - super("playerShowPane"); - - this.tips = (Label) playerShowPane.lookup(".primary-tips"); - this.playerShowPokersPane = (Pane) playerShowPane.lookup("#playerShowPokersPane"); - - this.playerPokersPane = $("pokersPane", Pane.class); - } - - @Override - public void showMessage(String message) { - hidePokerPlayButtons(); - - super.showMessage(message); - } - - @Override - public void showPokers(List pokers) { - hidePokerPlayButtons(); - - super.showPokers(pokers); - } - - @Override - public void play() { - super.play(); - - showPokerPlayButtons(); - } - - @Override - public void renderPokers(List pokers) { - final int parentPaneWidth = 870; - final int showPokerPaneWidth = 40; - int size = pokers.size(); - int offset = (parentPaneWidth - (showPokerPaneWidth + ShowPokerPane.MARGIN_LEFT * (size - 1))) / 2; - - for (int i = 0; i < size; i++) { - ShowPokerPane pokerPane = new ShowPokerPane(pokers.get(i)); - pokerPane.setLayout(offset + i * ShowPokerPane.MARGIN_LEFT, 0); - playerShowPokersPane.getChildren().add(pokerPane.getPane()); - } - } - - @Override - protected void refreshPlayerPokers(List pokers) { - User user = BeanUtil.getBean("user"); - - refreshPlayPokers(user.getPokers()); - } - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomEventRegister.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomEventRegister.java deleted file mode 100644 index 63811cd..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomEventRegister.java +++ /dev/null @@ -1,79 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.room; - - -import javafx.scene.control.Button; -import org.nico.ratel.landlords.entity.Poker; -import priv.zxw.ratel.landlords.client.javafx.util.BeanUtil; -import priv.zxw.ratel.landlords.client.javafx.entity.CurrentRoomInfo; -import priv.zxw.ratel.landlords.client.javafx.entity.User; -import priv.zxw.ratel.landlords.client.javafx.ui.event.IRoomEvent; -import priv.zxw.ratel.landlords.client.javafx.ui.view.util.CountDownTask; -import priv.zxw.ratel.landlords.client.javafx.ui.view.EventRegister; -import priv.zxw.ratel.landlords.client.javafx.ui.view.UIObject; - -import java.util.List; - -public class RoomEventRegister implements EventRegister { - - private UIObject uiObject; - private IRoomEvent roomEvent; - - public RoomEventRegister(UIObject uiObject, IRoomEvent roomEvent) { - this.uiObject = uiObject; - this.roomEvent = roomEvent; - - registerEvent(); - } - - @Override - public void registerEvent() { - robLandlord(); - notRobLandlord(); - submitPokers(); - passRound(); - back2Lobby(); - } - - private void robLandlord() { - uiObject.$("robButton", Button.class).setOnAction(e -> { - RoomController roomController = (RoomController) uiObject; - roomController.hideRobButtons(); - - roomEvent.robLandlord(); - }); - } - - private void notRobLandlord() { - uiObject.$("notRobButton", Button.class).setOnAction(e -> { - RoomController roomController = (RoomController) uiObject; - roomController.hideRobButtons(); - - roomEvent.notRobLandlord(); - }); - } - - private void submitPokers() { - uiObject.$("submitButton", Button.class).setOnAction(e -> { - CurrentRoomInfo currentRoomInfo = BeanUtil.getBean("currentRoomInfo"); - List checkedPokers = currentRoomInfo.pollCheckedPokers(); - - if (checkedPokers.isEmpty()) { - return; - } - - // 执行对应的事件 - roomEvent.submitPokers(checkedPokers); - }); - } - - private void passRound() { - uiObject.$("passButton", Button.class).setOnAction(e -> { - roomEvent.passRound(); - }); - } - - private void back2Lobby() { - uiObject.$("quitButton", Button.class).setOnAction(e -> roomEvent.exit()); - uiObject.$("backLobbyButton", Button.class).setOnAction(e -> roomEvent.exit()); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomMethod.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomMethod.java deleted file mode 100644 index 123d8f2..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/RoomMethod.java +++ /dev/null @@ -1,42 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.room; - - -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.ClientType; -import priv.zxw.ratel.landlords.client.javafx.ui.view.Method; - -import java.util.List; - -public interface RoomMethod extends Method { - boolean isShow(); - - void joinRoom(); - - void startGame(List pokers); - - void gameOver(String winnerName, ClientType winnerType); - - void showPokers(String playerName, List pokers); - - void showMessage(String playerName, String message); - - void play(String playerName); - - void refreshPlayPokers(List pokers); - - void refreshPrevPlayerPokers(int pokerCount); - - void refreshNextPlayerPokers(int pokerCount); - - void showRobButtons(); - - void hideRobButtons(); - - void showSurplusPokers(List surplusPokers); - - void setLandLord(String landlordName); - - void showPokerPlayButtons(); - - void hidePokerPlayButtons(); -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/ShowPokerPane.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/ShowPokerPane.java deleted file mode 100644 index e3fbfe5..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/ShowPokerPane.java +++ /dev/null @@ -1,102 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.room; - -import javafx.scene.control.Label; -import javafx.scene.layout.Pane; -import javafx.scene.paint.Paint; -import org.nico.ratel.landlords.entity.Poker; -import org.nico.ratel.landlords.enums.PokerLevel; -import org.nico.ratel.landlords.enums.PokerType; - -public class ShowPokerPane { - public static final int MARGIN_LEFT = 30; - public static final int MARGIN_TOP = 40; - - private Poker poker; - - private Pane pane; - - public ShowPokerPane(Poker poker) { - this.poker = poker; - - if (PokerLevel.LEVEL_SMALL_KING.equals(poker.getLevel()) || - PokerLevel.LEVEL_BIG_KING.equals(poker.getLevel())) { - createJokerPokerPane(); - } else { - createNormalPokerPane(); - } - } - - private void createNormalPokerPane() { - pane = new Pane(); - pane.getStyleClass().add("showPoker"); - - Label level = new Label(); - level.setLayoutX(2); - level.setLayoutY(-2); - level.setText(poker.getLevel().getName()); - level.getStyleClass().add("level"); - - Label type = new Label(); - type.setLayoutX(2); - type.setLayoutY(12); - type.setText(poker.getType().getName()); - type.getStyleClass().add("type-small"); - - if (PokerType.CLUB.equals(poker.getType()) || PokerType.SPADE.equals(poker.getType())) { - level.setStyle("-fx-text-fill: black"); - type.setStyle("-fx-text-fill: black"); - } else if (PokerType.DIAMOND.equals(poker.getType()) || PokerType.HEART.equals(poker.getType())) { - level.setStyle("-fx-text-fill: #9c2023"); - type.setStyle("-fx-text-fill: #9c2023"); - } - - pane.getChildren().add(level); - pane.getChildren().add(type); - } - - private void createJokerPokerPane() { - pane = new Pane(); - pane.getStyleClass().add("showPoker"); - - Label label1 = new Label(); - label1.setLayoutX(6); - label1.setLayoutY(0); - label1.setText("J"); - label1.getStyleClass().add("joker-level"); - - Label label2 = new Label(); - label2.setLayoutX(4); - label2.setLayoutY(13); - label2.setText("O"); - label2.getStyleClass().add("joker-level"); - - Label label3 = new Label(); - label3.setLayoutX(5); - label3.setLayoutY(26); - label3.setText("K"); - label3.getStyleClass().add("joker-level"); - - if (PokerLevel.LEVEL_SMALL_KING.equals(poker.getLevel())) { - label1.setStyle("-fx-text-fill: black"); - label2.setStyle("-fx-text-fill: black"); - label3.setStyle("-fx-text-fill: black"); - } else if (PokerLevel.LEVEL_BIG_KING.equals(poker.getLevel())) { - label1.setStyle("-fx-text-fill: #9c2023"); - label2.setStyle("-fx-text-fill: #9c2023"); - label3.setStyle("-fx-text-fill: #9c2023"); - } - - pane.getChildren().add(label1); - pane.getChildren().add(label2); - pane.getChildren().add(label3); - } - - public void setLayout(double x, double y) { - pane.setLayoutX(x); - pane.setLayoutY(y); - } - - public Pane getPane() { - return pane; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/SurplusPokerPane.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/SurplusPokerPane.java deleted file mode 100644 index 7a9e207..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/room/SurplusPokerPane.java +++ /dev/null @@ -1,23 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.room; - -import javafx.scene.layout.Pane; - -public class SurplusPokerPane { - public static final double MARGIN_LEFT = 40; - - private int index; - - private Pane pane; - - public SurplusPokerPane(int index) { - this.index = index; - - pane = new Pane(); - pane.getStyleClass().add("surplus-poker"); - pane.setLayoutX(45 + index * (MARGIN_LEFT + 110)); - } - - public Pane getPane() { - return pane; - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/AlertUtils.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/AlertUtils.java deleted file mode 100644 index e640046..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/AlertUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.util; - -import javafx.scene.control.Alert; - -public class AlertUtils { - - public static void info(String headerText, String contentText) { - createAndShowAlert(Alert.AlertType.INFORMATION, headerText, contentText); - } - - private static void createAndShowAlert(Alert.AlertType alertType, - String headerText, String contentText) { - Alert alert = new Alert(Alert.AlertType.INFORMATION); - alert.setTitle(Alert.AlertType.INFORMATION.equals(alertType) ? "信息" : - Alert.AlertType.WARNING.equals(alertType) ? "警告" : "错误"); - alert.setHeaderText(headerText); - alert.setContentText(contentText); - - alert.showAndWait(); - } - - public static void warn(String headerText, String contentText) { - createAndShowAlert(Alert.AlertType.WARNING, headerText, contentText); - } - - public static void error(String headerText, String contentText) { - createAndShowAlert(Alert.AlertType.ERROR, headerText, contentText); - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/CountDownTask.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/CountDownTask.java deleted file mode 100644 index dfeb9b8..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/ui/view/util/CountDownTask.java +++ /dev/null @@ -1,93 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.ui.view.util; - - -import javafx.scene.Node; - -import java.util.Objects; -import java.util.function.Consumer; - -public class CountDownTask { - public static final int DEFAULT_TIME_OUT = 30; - - private Consumer finallyExecuteConsumer; - private Consumer preSecondExecuteConsumer; - private Node targetElement; - private int duration; - - public CountDownTask(Node targetElement, - Consumer finallyExecuteConsumer, Consumer preSecondExecuteConsumer) { - this.finallyExecuteConsumer = finallyExecuteConsumer; - this.preSecondExecuteConsumer = preSecondExecuteConsumer; - this.targetElement = targetElement; - } - - public CountDownTask(Node targetElement, int duration, - Consumer finallyExecuteConsumer, Consumer preSecondExecuteConsumer) { - Objects.requireNonNull(finallyExecuteConsumer); - - this.finallyExecuteConsumer = finallyExecuteConsumer; - this.preSecondExecuteConsumer = preSecondExecuteConsumer; - this.duration = duration < 0 ? DEFAULT_TIME_OUT : duration; - this.targetElement = targetElement; - } - - public CountDownFuture start() { - targetElement.setVisible(true); - - CountDownFuture future = new CountDownFuture(); - future.start(); - - return future; - } - - public class CountDownFuture extends Thread { - - private volatile boolean done = false; - - private CountDownFuture() { - setDaemon(true); - } - - @Override - public void run() { - long startTimeMillis = System.currentTimeMillis(); - - long interval; - try { - while (true) { - long currentTimeMillis = System.currentTimeMillis(); - interval = (currentTimeMillis - startTimeMillis) / 1000; - - if (interval > duration) { - break; - } - - preSecondExecuteConsumer.accept((int) (duration - interval)); - - sleep(1000L); - } - - finallyExecuteConsumer.accept(targetElement); - } catch (InterruptedException cancelFlag) { - // exit - return; - } finally { - done = true; - targetElement.setVisible(false); - } - } - - public void cancel() { - if (done) { - return; - } - - done = true; - interrupt(); - } - - public boolean isDone() { - return done; - } - } -} diff --git a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/util/BeanUtil.java b/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/util/BeanUtil.java deleted file mode 100644 index e814ed3..0000000 --- a/landlords-client-javafx/src/main/java/priv/zxw/ratel/landlords/client/javafx/util/BeanUtil.java +++ /dev/null @@ -1,17 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.util; - - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class BeanUtil { - private static final Map CACHE_MAP = new ConcurrentHashMap<>(); - - public static void addBean(String name, Object object) { - CACHE_MAP.put(name, object); - } - - public static T getBean(String name) { - return (T) CACHE_MAP.get(name); - } -} diff --git a/landlords-client-javafx/src/main/resources/view/assets/css/index.css b/landlords-client-javafx/src/main/resources/view/assets/css/index.css deleted file mode 100644 index 53d04c4..0000000 --- a/landlords-client-javafx/src/main/resources/view/assets/css/index.css +++ /dev/null @@ -1,93 +0,0 @@ -#appInfoPane { - -fx-pref-width: 280; - -fx-pref-height: 80; -} - -#welcomeTips, -#version { - -fx-font-size: 16; - -fx-font-family: "微软雅黑"; -} - -#connectPane { - -fx-pref-width: 280; - -fx-pref-height: 240; - -fx-background-color: silver; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -#connectButton { - -fx-background-color: #40b1f5; - -fx-border-width: 1; - -fx-border-radius: 5; - -fx-background-radius: 5; - -fx-border-color: #40b1f5; - -fx-text-fill: #000000; - -fx-font-size: 16; - -fx-cursor: hand; -} - -#remoteServerInfoPane { - -fx-pref-width: 280; - -fx-pref-height: 340; - -fx-background-color: silver; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -#remoteServerListPane { - -fx-pref-width: 280; - -fx-pref-height: 300; - -fx-background-color: white; -} - -#fetchServerAddressErrorTips { - -fx-pref-width: 260; - -fx-pref-height: 100; - -fx-wrap-text: true; - -fx-text-fill: red; -} - -.title { - -fx-font-size: 24; - -fx-alignment: center; - -fx-font-family: "微软雅黑"; -} - -.hostPortInput { - -fx-border-width: 0; - -fx-background-color: #dbd9d8; - -fx-background-radius: 8; - -fx-font-family: "微软雅黑"; - -fx-text-fill: #000000; - -fx-font-size: 14; -} - -.hostPortInput:focused { - -fx-border-width: 2; - -fx-border-color: #dbd9d8; - -fx-border-radius: 8; - -fx-background-color: #f6f6f5; -} - -.forLabel { - -fx-text-alignment: center; - -fx-font-size: 20; -} - -.remoteServerOption { - -fx-alignment: center; - -fx-pref-width: 260; - -fx-pref-height: 30; - -fx-background-color: silver; - -fx-border-color: #dbd9d8; - -fx-border-width: 1; - -fx-border-radius: 8; - -fx-background-radius: 8; - -fx-cursor: hand; -} - -.remoteServerOption:hover { - -fx-background-color: #716f6d; -} diff --git a/landlords-client-javafx/src/main/resources/view/assets/css/lobby.css b/landlords-client-javafx/src/main/resources/view/assets/css/lobby.css deleted file mode 100644 index 102be01..0000000 --- a/landlords-client-javafx/src/main/resources/view/assets/css/lobby.css +++ /dev/null @@ -1,79 +0,0 @@ -#pveMenuPane { - -fx-pref-width: 400; - -fx-pref-height: 600; -} - -#pvpModalButton, -#pveModalButton { - -fx-pref-width: 200; - -fx-pref-height: 100; -} - -#roomsPane { - -fx-pref-height: 400; - -fx-pref-width: 600; -} - -#createRoomButton { - -fx-pref-width: 30; - -fx-pref-height: 30; - -fx-background-color: #dbd9d8; - -fx-border-width: 1; - -fx-border-radius: 5; - -fx-background-radius: 5; - -fx-border-color: #dbd9d8; - -fx-cursor: hand; - -fx-background-image: url("../image/add_0.png"); -} - -.title { - -fx-pref-width: 600; - -fx-pref-height: 40; - -fx-border-color: black; - -fx-border-width: 0 0 1 0; -} - -.roomListTitle { - -fx-font-size: 20; -} - -.roomPane { - -fx-pref-width: 150; - -fx-pref-height: 120; - -fx-border-color: #afadab; - -fx-background-color: #dddbd8; - -fx-background-radius: 10; - -fx-border-radius: 10; - -fx-cursor: hand; -} - -.roomPane:hover { - -fx-border-color: #3f91af; -} - -.roomPane > .idLabel { - -fx-font-size: 16; - -fx-border-color: black; - -fx-border-width: 0 0 1 0; -} - -.roomPane > .roomOwnerLabel { - -fx-pref-width: 30; - -fx-pref-height: 30; - -fx-background-image: url("../image/face_0.png"); -} - -.roomPane > .modalLabel { - -fx-font-size: 30; - -fx-text-fill: silver; - -fx-opacity: 0.8; -} - -.roomPane > .playerCountLabel { -} - -.pveModalButton { - -fx-pref-width: 200; - -fx-pref-height: 40; - -fx-font-size: 20; -} \ No newline at end of file diff --git a/landlords-client-javafx/src/main/resources/view/assets/css/login.css b/landlords-client-javafx/src/main/resources/view/assets/css/login.css deleted file mode 100644 index 2627f54..0000000 --- a/landlords-client-javafx/src/main/resources/view/assets/css/login.css +++ /dev/null @@ -1,39 +0,0 @@ -#nicknameInput { - -fx-pref-width: 260; - -fx-border-width: 0; - -fx-background-color: #dbd9d8; - -fx-background-radius: 8; - -fx-font-family: "微软雅黑"; - -fx-text-fill: #000000; - -fx-font-size: 14; -} - -#nicknameInput:focused { - -fx-border-width: 2; - -fx-border-color: #dbd9d8; - -fx-border-radius: 8; - -fx-background-color: #f6f6f5; -} - -#submitButton { - -fx-background-color: #40b1f5; - -fx-border-width: 1; - -fx-border-radius: 5; - -fx-background-radius: 5; - -fx-border-color: #40b1f5; - -fx-text-fill: #000000; - -fx-font-size: 16; - -fx-cursor: hand; -} - -.forLabel { - -fx-text-alignment: center; - -fx-font-size: 20; -} - -.tips { - -fx-font-size: 17; - -fx-text-fill: brown; - -fx-border-width: 0 0 1 0; - -fx-border-color: black; -} \ No newline at end of file diff --git a/landlords-client-javafx/src/main/resources/view/assets/css/poker.css b/landlords-client-javafx/src/main/resources/view/assets/css/poker.css deleted file mode 100644 index f5066a3..0000000 --- a/landlords-client-javafx/src/main/resources/view/assets/css/poker.css +++ /dev/null @@ -1,13 +0,0 @@ -.horizontal-poker { - -fx-pref-width: 120; - -fx-pref-height: 140; - -fx-border-color: black; - /*-fx-background-color: #dddbd8;*/ - -fx-background-color: red; - -fx-background-radius: 10; - -fx-border-radius: 10; -} - -.vertical-poker { - -} \ No newline at end of file diff --git a/landlords-client-javafx/src/main/resources/view/assets/css/room.css b/landlords-client-javafx/src/main/resources/view/assets/css/room.css deleted file mode 100644 index 714b8aa..0000000 --- a/landlords-client-javafx/src/main/resources/view/assets/css/room.css +++ /dev/null @@ -1,250 +0,0 @@ -#waitingPane, -#gameOverPane { - -fx-background-color: silver; - -fx-opacity: 0.8; -} - -#waitingTips, -#winnerInfo { - -fx-font-size: 20; -} - -#prevPlayerPane, -#nextPlayerPane { - -fx-pref-height: 140; - -fx-pref-width: 600; -} - -#prevPlayerShowPane, -#nextPlayerShowPane { - -fx-pref-width: 380; - -fx-pref-height: 140; -} - -#playerShowPane { - -fx-pref-width: 870; - -fx-pref-height: 130; -} - -#surplusPokersPane { - -fx-pref-height: 140; - -fx-pref-width: 500; - -fx-background-color: silver; - -fx-background-radius: 0 0 10 10; - -fx-border-radius: 0 0 10 10; -} - -#quitButton { - -fx-alignment: center; - -fx-pref-width: 80; - -fx-background-size: 43px 43px; - -fx-background-color: #40b1f5; - -fx-cursor: hand; - -fx-border-width: 1px; - -fx-text-fill: black; - -fx-font-size: 18px; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -#backLobbyButton { - -fx-alignment: center; - -fx-pref-width: 100; - -fx-background-size: 43px 43px; - -fx-background-color: #40b1f5; - -fx-cursor: hand; - -fx-border-width: 1px; - -fx-text-fill: black; - -fx-font-size: 18px; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -#robButton, -#notRobButton, -#submitButton, -#passButton { - -fx-alignment: center; - -fx-pref-width: 60; - -fx-pref-height: 30; - -fx-background-color: #40b1f5; - -fx-text-fill: black; - -fx-cursor: hand; - -fx-border-width: 1px; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -#prevPlayerRole, -#nextPlayerRole, -#playerRole { - -fx-alignment: center; - -fx-pref-width: 50; - -fx-pref-height: 25; - -fx-background-color: #a58a65; - -fx-text-fill: black; - -fx-border-color: #afadab; - -fx-background-radius: 6; - -fx-border-radius: 6; -} - -#prevPlayerNickname, -#nextPlayerNickname, -#playerNickname { - -fx-alignment: center; - -fx-pref-width: 100; - -fx-pref-height: 25; - -fx-text-fill: black; - -fx-border-color: black; - -fx-border-width: 0 0 1 0; -} - -.top { - -fx-pref-height: 150; - -fx-pref-width: 1200; -} - -.middle { - -fx-pref-height: 140; - -fx-pref-width: 1200; -} - -.bottom { - -fx-pref-height: 355; - -fx-pref-width: 1200; -} - -.pokers { - -fx-alignment: center; - -fx-pref-width: 870; - -fx-pref-height: 180; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -.tips { - -fx-alignment: center; - -fx-pref-height: 30; - -fx-pref-width: 70; - -fx-font-size: 20; - -fx-text-fill: black; - -fx-background-color: silver; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -.primary-tips { - -fx-alignment: center; - -fx-pref-height: 30; - -fx-pref-width: 140; - -fx-background-color: silver; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -.error-tips { - -fx-alignment: center; - -fx-pref-height: 30; - -fx-pref-width: 200; - -fx-background-color: silver; - -fx-border-radius: 8; - -fx-background-radius: 8; -} - -.horizontal-poker { - -fx-pref-width: 110; - -fx-pref-height: 140; - -fx-border-color: #afadab; - -fx-background-color: #dddbd8; - -fx-background-radius: 10; - -fx-border-radius: 10; - -fx-cursor: hand; -} - -.horizontal-poker > .level { - -fx-font-size: 35; - -fx-text-fill: black; -} - -.horizontal-poker > .joker-level { - -fx-font-size: 22; -} - -.horizontal-poker > .type-small { - -fx-font-size: 35; - -fx-text-fill: black; -} - -.horizontal-poker > .type-big { - -fx-font-size: 70; - -fx-text-fill: black; -} - -.rearPoker { - -fx-pref-width: 55; - -fx-pref-height: 70; - -fx-border-color: #716f6d; - -fx-background-image: url("../image/rear.png"); - -fx-background-color: transparent; - -fx-background-radius: 5; - -fx-border-radius: 5; -} - -.rearPoker > .pokerCount { - -fx-font-size: 25; - -fx-text-fill: #000000; -} - -.vertical-poker { - -fx-pref-width: 140; - -fx-pref-height: 90; - -fx-border-color: #716f6d; - -fx-background-image: url("../image/rear.png"); - -fx-background-color: transparent; -} - -.surplus-poker { - -fx-pref-width: 110; - -fx-pref-height: 140; - -fx-border-color: #716f6d; - -fx-background-image: url("../image/rear.png"); -} - -.timer { - -fx-alignment: center; - -fx-font-size: 20; - -fx-pref-width: 60; - -fx-pref-height: 50; - -fx-border-color: #afadab; - -fx-background-color: #dddbd8; - -fx-background-radius: 10; - -fx-border-radius: 10; -} - -.showPoker { - -fx-pref-width: 40; - -fx-pref-height: 50; - -fx-border-color: #afadab; - -fx-background-color: #dddbd8; - -fx-background-radius: 6; - -fx-border-radius: 6; -} - -.showPoker > .level { - -fx-font-size: 20; - -fx-text-fill: black; -} - -.showPoker > .joker-level { - -fx-font-size: 15; -} - -.showPoker > .type-small { - -fx-font-size: 20; - -fx-text-fill: black; -} - -.showPoker > .type-big { - -fx-font-size: 40; - -fx-text-fill: black; -} \ No newline at end of file diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/add_0.png b/landlords-client-javafx/src/main/resources/view/assets/image/add_0.png deleted file mode 100644 index e9e0f6f95b37e24b954bbdb04cb65b6c1f8be4f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1533 zcmbVMU1;4@9M9Cs>{`hLV z9X@2#59nQOKU{x1QA1X+>yCXgz!2^`5LMFp(*_O>1P7(yQXkv+L4{eA`QR18I#kS zi&eb2jty6sJIWvFKt>Rd6!D#)878n}3O!!P*4Z%-_#Px(H--63AiwNXc#Fn_pO$nH zE1JsB7?PsPhN?~Rs;tZac?Kv2QC6U=!-ByNK7mP#T@Nl5PYh(SohdZZG=c!M+ij^` zkZ4>7ieVT)R)MOD3?U{PVTw9pm`n^AiX_3YAEiDG`HT_OXe%`ZrfJ`VAj)aOWZ)*| zFwj8}P$W4ssRwj%j*D7xvnSlefHX-!!Zcx6CC5e$n$n~}|AjigzDodet>fe}cGV>a zauG>dI>*cyIAm9JQr(CMSRx5+#h8@NF*PSLYa(dH1f?{tQra8_sxnlWw=910j32tR zojkn*PKqccrl88I%%UZ#vsFcgY5^AXXXIHZ%YCRrUEkZ-6{Iauo9rT4S~$+zB}-QfT^ChJ>8a~D z&<>Lng_zhyQ(&%dAktRCHe@~P`z)mC5GzIN!F#rL_7ews9=ZrfW|-+1riuTNcA e5D))$@Ih|k*5hxjZX0V^gSJbH#f!(+&i@Uk{OvaY diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/add_1.png b/landlords-client-javafx/src/main/resources/view/assets/image/add_1.png deleted file mode 100644 index 41636920e1405a88117a83ada7a2e7b997b9ffea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1535 zcmbVMO^n+_6m~1Rf{5(E`U7q#~;Ag#)V80|zAj#0`l995^7Aaek~VTBxWcd&V>0 zeBXO--h1a47f$ZYJeuJ+Zf~_>)!29-dGDWM-zUK357_WPRC%6o+=J7}yNkQ{?jszx zXP;kRqD%HO(8Yn|c({qAK@c%C#~qy;M2@?RDBnbFKQx5jKEEdLzGn!h^ER*}6LtK` zT8vJuE!5q$Ww+!Bb5HU|2apj2h&ucr=!OIi3}MI%**sa61%3#j%Z5-+1ok5FH1{LiHC_(^6P#b%GYjsCx4(7ofP?j*BL!G;V zJr}lc95~EfKXBSej>5LUr$K}!?&6pUGwZbN>s8ZSjB(5FvJFx@d7Q7#n+2s*D2S@0 z49&G|SPcnvLKjsnLtvqieBXmjUH24SSH&hM7DNr?T(MZlJEH4pNcX(F3XncIZ(+BW zB*5gn_dm}+8~dyPo$fvJBxRXo4y^cu-RbJMa899>@vQ6f!(@Sun-qZ|xXJA!PZ%%z z_Z)!{ZNGyU>3`(K2u5&=_MI4&+bmjl$vT;tE+@r0@5g;MOWt+tjot6Fa8aE6YC=Y diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/face_0.png b/landlords-client-javafx/src/main/resources/view/assets/image/face_0.png deleted file mode 100644 index 2bfc2235fbcd5576da4d112a3053490cb7770847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2235 zcmbVO4Nw$iA73~`5=r_PBm8JxsVKSI-2?8}#Z&MOv06;7!8scZNLmxEt|(B z72DX1;#4DDyn-eeWbPbzb|DD}EUZMqg%&d}l7$*%gqH+s_cn^aBM@nY28nkIgtH83 zuvW0KaI``tr|~EytR@t=3L}(J5wH@&)hMP$@klv_lbDK(Bw){j0BJVHM5gN!J+i=; z2Fa5oD~Y0ZyIooIFtm`eqPPNcn=}GsXfMuMU^9;hXK0i)vlf<@M1aM;SZkgj z31Xh`C)D2K-w6P&H5j}y?x~B#;uRrE2`hma9*5i$EgFlgESk=WLV=BD6IKE>XS%Ji zl3E)}NrKHN28XN>Uj~MiH~H z7!t!qp$38BOhxyEMv?gMp&(%xN}~Q2%+RDsuvsWzE@z=~S=7qsBCywqq*gEsHXs;i z7kT%-UaL*B2`0`A4#f2N^I&~~R)rHPm0YR7N7OYKNIfq~6i>5yodyA}QE(hXvbZva zB?yp}F)BumV^JzOfvFieql#8BCOitmBXh>?>jb*Mod9F^nSXeHfsF$NNSXgNkGm}0 znL{RVB8X{`r*JaZ7d$I72ahBRNzv{i&>*xs`YeNZwz+@pfl*p}9t%kSA}>Z^qF|Ej zl#Pwg1>X9btV4n7sJmE4tw8^1;Ka~QsfKgQhC?qThx*>%G~>eCo~db3P@Ti!50?%(NcGkRTz^yckgEkf zx7t6o+i{?zdCAPu_D?>U@TsYK&z?QW$2J(Pu>%UMUhEZKd^E;)>icbVV(+Am8ocLr z^qwUrqCcG9HQu$Q+u=9)T;KAlPs@Hl=V0l%Wa);w>t{BCrSru`nRmpxYjh~XB}DZdNqo@ z?RREfkFPmsMljv*S>8TFYhrp^Y03Gaiy@b4ZxpvRSqkFxv5#ve9JSO2f3&-S(C2R6 zu|0hA`W@jPX7J-ueGa%|DQkh8i?UJ3%Kd8^vcXbE*&M1|)E3)S=d|16t z7UO^Ay^_ZMy{8P0aj)l8RBtQU>+gF=*66c%|76$j*6YRqYSzI2$*c9UEwa9~%Ue6Y z`{7!v>Jep18{Y&U3u!`HHLG?vnWiwrk&-jO2}Bl`?hmj%6)}F5kG7(ta(GaIIOsbZN;u-R9=k*V0ud0Yo+J%urF!f%aKv z=4?E;xc|kTNwV`-PuCMZ=f7Uv&}~+{6int0MeCo`2K4Q{HS|T8Yk7?mI=Vf*xbe$; zpQ+=AAbYnX{Nf{PtK&kaO=B6R^tGpL+|(aP^a1tMWx>-Se%AOeI{!Df wR-Cg{Ty{CX%CYle&wih1zo|xTd%S15p`O^0K~S=eSoiORJ|R`tJTH6wZ;>lVzyJUM diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_1.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_1.jpg deleted file mode 100644 index 593d9ff28dbd08bd95a8bab4fcc3c1cf6caaddab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 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 HI-B?(`3lA? diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_2.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_2.jpg deleted file mode 100644 index 416ce0f3df54630849191845a3f8051679097f67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3843 zcmb7=cQhOR*T)l)+9VoO?M>`aMMEi3qb-6^LTkhhMQPP4wSA4os@)c?t!83X>ua=j zjflN>?W)?3KIeJP`ThHQf9@amo_pV~d(Y>Bd@&1v=xOU}1AssP0C@QT7ZU(Y0EmL( zZ(NGb9W@$cD1G;P0Lx;ZYt0Q{e502lzGyu?#nHf5og=t~$4CFuW_0|A#M6wEBkr(xuI z6~-@T6Y{$9#}$EhUr}?rI~U^s`pZcQC*cXSo4=$A0wNJ(A3V-bE?#oXgTbRG;ocvyJ>2%Bv}k=@VV;2 zG2_QapaQ?`A)JzB0lVp!FZi6|S`D!mHh&(@h&#^Wo$FL|6UZLvLq8y}N-b&e^5O^S1$3Qb!RhS051t7%g(dra2r{mb6pS z`)%szN=?je$}p`-b@S>umlpS5S)(t}_u|)=qTDWT40Ya|yL(MGN6s#)aUm&*?{mm9 z?CA#W*$C75Xr$IMT?+I^eMV6&%;>)G5B*LUv6fBfo8x?CRhV6!;skVY>Uuny$4@I< zA#E5xuI!Un-JESQ(MH9I!$8|6(iO!=*{g>Oclkbj3a$0Rn-p;E<@;xIFT5)dVBA%H z_9`aU^36!j3MfTK50hBe7cCeGyc61Q{ZV&jFg<-ME!buHRr&k`oij!CQATz5jH5bA!w<2d0U!0OqBSMILiKU|L3GI_2&0V! z?PRFOqWZsce=A9ugK_Ss@O$h{?SSuTK0I>z z5v?sfcNCQc@^doBjHt>U%03qfY3rCbzZz|kRf9CLG_w9DO&$Gm8IB${ zeXFYVbJeE^HUDWSCqYcm4UUsyP^gTidr53qEC;vJS4X=|a&<~nxjTo>Wb9&9BL@Nv zzO1`U&)$9|(Wur%MjJS0+H{(mDWqZR9(sN~Db#DgzwjY7p8P6*L$2&bOM@Y9zsadY zr*(mUv68$2YrN=AyQgv(+!isqZq_L3iOz(bKt-E7rgoQa_W0@hI}pnK;jR-*&IKLefL0HX(cUU{xP>xuA#t@*<*KKG9mM6lzbjR ziZhHg$7VR3&sjhV;{OWsb=Ph#)PQlHHV#zG<$^b+-Ldt z6*SAl+x!pmH+`4*7VFT#4v~of$+*PCvO>4Gji)_KhU6llUcpq3@Ov3FyuJ^?^~ITO z9zctQI&s#k-mh^DU!OKJ>qo=2zYXHws;nk_B(i8*AgD2=&rd4!zKz%SV}o39m5CM( z>Rba>YWa8-50m8|6U&Va?LJ9rvJS}~^KP}vWD1}$&sa2{^#zZQW!o!$V2y9uE>lm+ zD-*X*DnsX3yJk--51*^Im(imCMU!79pL$pLpZX!)h*`(^o|#hOh%ToN=a#U*Y}(Ov z-O~;Ihs$Cn$1l>5teY#&rynYL3SD!yVnpmg5$(qd5Bm&4u$>}lw@)5?jpuJ+U)Jf@RZ&6XyBrq)U8?;G-}`Om*Kl*P6;59CROxiKvnZ3n$uU~DRc=#Y zm-fleGdSDa?uJWnP1!`}*tOgnjme@O5@}g6i@vC6)fdSP`9+Ttd>}7E;db6V?`DMb zIz7o%avSR*&b}v7S(bvKiW`}Wt`;YY+}Xep{|x410>z+)+65rI#<+`I#6H0RP7b;W z+f$BC@(K^@BHAszh!(5AU$YU-MfxzwTOcwqYgQe8$dTi$X#EJT&oJR27d3$UA$au7 znHtrVS_|sJ2wAB7WWKWQ*P2VMd`hn}AEX8t!0ZKwbn+ne-*B748FFE zH48nB1=a9RMLN34L&YuM-)J2eaLv|(8=a+76$zgE+!(e>yJF5W+ApX~%-2{@77RLP zCFabi7H2Gkca5c5?>0fz)lR?nb|>b4#72xC9G(;#aj70OG)o3CRmYYdNiUx2NyyBH zX!%o0ivn(Zg3TE{IG7A{wd>$vfb2ftu*`p~7>Tv|Nq~9>(s}o!JkizFZ|XKPl}^rP zoVsBxwrX{?It_Q-GUh-{oIc&|F;N8f2hI^QI&q@~Qa>)DlIDQnBev-X4F8OT;USQm z#eLTb!V9A8wS8M#QiK%kz7#{dGc!x`=9fg4QXPFNU+PYPGTW7;bo|>_kOB$rnvYzuY>4xuwU06%>R`KhkQ9rPX{u7j z|1n3gjIJ8DbcGo*j}v1bOoU(08h6NL8JXy$+;MB|bqIfL>l?d){KGcMnomhgw=#4yrrS2Z4&LB-DQhZn!fAqV}PvJaQ-D` zr#GfUHvG-|6Z+G|%A#n*>G7%SxCIFc*nI$nQHgCTAei2287b#FVJGb++B zr+LyUp2|ZEl`T5DRJ@uHQ!bMiHYrL}Wth#1SY`N3BCAy>KTeR}!QHYx2OO4rS@Pa= zBWOoWAF;dfx}B-6S0wb1TFHc@V7~L>=^MPO6Rc;(1SHJ#t5V*ndRs={r^bM-uC!~j# zIW(>%M8QCXszZnj67g|%)U%rZee4e=&Wj|E&y?!jZ%8SaC~o25$@VMwHeqQE@N--ltwAADOM`y5r`>V`+LDsuhYP9q54fF&U96EPn}F3C>ua(RP$CLYrD_K zC8_IC^c#q8#OkzLNm%IuuNuopa0+u9YxE4iTK-8%eVGO&3CW^cScosy6pZvByfoFt z2J}n&jc3z}zONH?*x{*vPc5pAU7o2LWqRJ`vpCiMx~fxT#nK8K z5q#YiWQ@XEy8k20wG0Z6_Kf(I!qk*~AZqwS_mI-;(*aA6XF}-a3LLpNP&a44Yq>Wt z-;s%*2^Q=1_o)1>P#aB9^y(}nP%}aPK~_<2&pD0rHl_Qx$NDLED!U Q{;yf|JznQ;(sD8OKg|pRvj6}9 diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_3.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_3.jpg deleted file mode 100644 index c0dc5a09e67e141d010f917d7825dba8ef77f348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4015 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 diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_4.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_4.jpg deleted file mode 100644 index a5caae5e78e3c9e26685e41801069e9cf27908bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2005 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 UYE2f?4ksMbC&fa!`SwTt2LpA{9{>OV diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_6.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_6.jpg deleted file mode 100644 index 0c39ada14fe1215e92b156445c484e5181f56d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5374 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 diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_8.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_8.jpg deleted file mode 100644 index 530e15b0660c3ea91621263bc4b5da88bb299cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2492 zcmb7@c{tQ-AI5*P*+v)!A+pS1s?l2*YAk~+k!>tlD-?!?$Pyu0%5roLhLF)XXT}mD zWXV>RgX5JoWGal1ElOqx%{#r-_WH&;8%$`QG3Adamo?PH|@eF-x=aW&j8T z03hB0xJX zloS?~J}iYiERK{!{tN*@cr#F#APgpmJOn?4{J+J02_OUjGC+oalmRdT1VMnf-GDr= zB(K`fzJH5f03-;7@j<{mtSbh9AP_JV3gLtD|Mvn241oeLK7NFNxY8*JBYQ8Ta)`=l zFnpluM_8ld9I=4JVp`uu1MvX+z+Xr6-}#I77F$s`+0$JMFP z0V&XXGO-1&+%e?S6A);_n0l7o3^MnQ${D*+^r1b+M5EARMZ`WbGc-T%^5r{^mPpN3 zWD50r5(9|oVTDzMdk`w99_iT=0~C8Mi0YPDHrti(r_#Jeuq1$KdrJK6eCK6W8FxDn5eS&EpW zt;YV0jt%q8nV!ufzuMLQN!G1uds|1Z1dlp2&BQU>BNT2=^fgV_6UJK_)DoC-4!bdp zjt!18zOwp%9ki}^4Qm`-J1di}Eh2HKEixQ3uYm@z3sHAJJvK6O`PQ-H_veLMbz6`2 zDhg|*zQF?s7VBSk?hiHL!N+>1Zkdl(z}lLsyer!!#+#Lvkc^`awebf}ysP^|RGMk& zv>Ppqh#ri6O-nSAAt`yBdMJzf>v+#9T))_U|n8zY0xsK*5H4Le{| zN_s4|_ESF{C+T&jS=cGEwPcUn2a_{{Z)$lI*mPGcybJ!GI6T4BRgGhD0a4w#X0(5p zG=$`;wzk{u+4e-2#Yx6Hu~CKd3dx(3x?Md~h0_tD4frxtgx$eP%rO3W!58`tvq8)O z)Ku>G8^?GQXJ@dtVWc!lp*f2Z0=2(Vg#OTz;G~Jnc$OVkh&Na){=#4G8b)VKV29E@ zBx64l@bPz!)oZ)z${YFiP#ZRH$aPtcmByx4!OrT^4x6Dj?`gj=RP~d4fc?wm(IhbR#Qf+U3l^D4iZHZn zDkLvEZ8(K7O1>-_oSnZ;L8n{^D$VSpm!YD{ZbBL#yV0X1U)>8XSd!}1VCUlkQIT2m zt9c{F#3|>GD1{aM2HJF0+N{Qei$uJjcpiC^|KVvPCa0_}t)qRm4d zic3w866s}OiX2Jz9a8MAxXKk92&-}P20e8|RtV2Hu20|}Sa!C}a|#>_Z;Y9T8#JBs zGEKQ5m$sHrl#4Oq4;3uV1tdBXD&k~h81%o&O`%cZQ2uzedVP+-HSz3tvL@yixhj!LZ9M(=t@TmN$9VdT;j zHuZTqdtbXwKEMhe+&UCz1kyp5T0w`1p8vu)okL97CF=K2|6za#Ar058KCllD&YH^_@Hl9|Giq(s z@#A+MzCXgsHn^MYz3iSRpJ3_P^6vFq<3#p|fMGfpxXrHc1H*BjE|_}NFi+5MNoq9~ za-fSop24f7$`pnekwWW@zNg)lynoweK{F!YdaIB6FOO?lr{DC=sx;~@4>p!5?v0OF z3bh3EhfkW?t-s)0wJCKiu-~~|Xl{xAO5S;S9<{MTlcH?OtHBo`7ca%lI8L$Vo~=_DJ%*CUtql={R$%UnQc zQ7zs2UmhwL=_SWL`}4}s435IP97U>r4`m}IWWY9ce+D|i1*)-enep>jTCwhWIYuos zQ?M$P3sgbXBIZrx@+LK8yxVhFPVhD_Xwh{O3e*hl6U-|$5 diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_9.jpg b/landlords-client-javafx/src/main/resources/view/assets/image/profile/profile_9.jpg deleted file mode 100644 index 2baa3b51110a501364a310fe9eefda1157562a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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 diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/quit.png b/landlords-client-javafx/src/main/resources/view/assets/image/quit.png deleted file mode 100644 index 8e05ce605250c4b6c69ac454176623252d5b88b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3121 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 LNkvXXu0mjf%W`iV diff --git a/landlords-client-javafx/src/main/resources/view/assets/image/rear.png b/landlords-client-javafx/src/main/resources/view/assets/image/rear.png deleted file mode 100644 index 9af2eb32182271251bfe7bf730616638b0b9e711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1451 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%0D`K>7!ypj#`x)JhJ4lv2*TcS~@Ea5%) z7v!nf4a6phMYwyQ&eAE1!r@N{F?7ngl9IY2`m#biD2Mw}N(C?lgTehR!+Ln6Rh-EY zePSY!KwJ~tKXE%m2Dr&gu%zMRza$t8ZnO*&o|DKaopbdH(Z?f^!V|CT+-b=GMyJiT z{RLtL<#~1k1R65kmvWr*lF20Udmsf9QVFAK*<_?enPlg8E?T(o7v!(JOSZcbXC)XG zJkb}$<8kQlM@1zC7-6LbD|qH(E6PPKi@yFJ|NQ6oH*MO4$U~&ug|2$C`E9}93LvFr z|K@P`8$=B6jS=c9$-`_IXO^N0OGyC+qISSO&M+0?ma;}3W{~e8(O+nd#o+XfTQ%wi zLXA19^tq$@+)Mi~WPZ#G{@@oh+s&sF3sN~^p1D@<8?N?FO(YVypNyJH4sbg9zq0a1 zW`)8UIr|r)S6O=(w8rB|1`cL`P*iH7)=0{i;V8@jZ&J{?&35y@5expEHDOJrt#-9{ z{oHu`n!5{#;?Fgxk^`Jx#kT!Elhxfq)I1_bL|)WP=SQPa)b0fnpb^8zQLY)_p{atb zi^``LHHShAiH+OyscXnY%V|KJQOX*_V*)Th4K;?2HcWNb2BU25|64l{RG4y&@bAhZQlv&V6Iv&V!ddH+4p=t*xZ)#bX9AE)q>m zO_!6F|Hx%d+zFp`B>M8!SPYJ5aJNNWKvh zZ?5NF8;{3PKpFN@C`G^oT*MF&za{U!O4|_PAB+YV4?xCv?g@v(hbrM~hzSvud65V$ z)1)tm#bRsodZ36#;{q_oRbO9UU+MSXK|)OhjB}HSzLS)?EfR@ftdNtD(B+j(Eh6Z& z@!#V?F!A9Mg_3>nXU18(w4tHFtgx&vGAsQ5T$Z6BW8^1$`g$%b)Jw9^iH;k<7+A0_ z*l1N*x99Xf8g>TUDI&K~f8QS?U0o;*hpiD?J~F<+PYI5E5UWbP&0&Q??16(E5{1GX z3Qx%2G&D49^;`bai1h_Tj9Y*HB>ZRUql;TtwL&x;QyN!*Gb?#PWku!9M1s{&2)Rrg z6Vj;U`AB9(!`!wwBUT~6JetvI<3fgt+R!598!m%06DtrR4K7Y_g2TlLAVY-;uh9Pu z1OjYX)?!AfGeuY}9M><4L?Yv&%o%rpF-s^yl<*C#7#Vo-C?5T`@4zFH zl`L{!O6v#LtXb3D)6)Z6EBv$JRf3`y2$w;+KLnivX#9;20O$4&zyT=EQ|t&3WdJPx z#1 zW+l(?nZB!4f`z=W0008sNkl=0At|kGVm2uryGjCDa-(4G_*xTzd)qgnYi5}Z?%ZLq_y5U zxNhCxO9KOLZ*Mw>=UX3jb#=AOo;@2z_lg?7e>y4ay~?2ZBGSl0^`sQ)Fc$mqrRRbg zgr0V;sh&3N{^iS;kGntkE?dDnBN?a-1gt9a8%&IgQ(p389$x~s;vOyfO~zTwjFs9? zI^*c4(%uwRBs`5+rn2x1;la#}s|J87r>6v)_#(^pG>?{4BX5i4sD2XJjAiAx=nu zcT9TDoH_oPQ>PwkSk_t03hKdpEHh)xvz_~2=V|>Xah^*A9H-t?<_V@Ujwh8?L}U-v8cX(x^b+w367Qh_*L|S9y&dxMgjumer(PBS?>y*+ zhK7Ai=4Mvrk&5YqtQ0IwBl&-g3UVPqF|WUCt)KF=e#|%Eix(5=H>yDt`Ec0*yz@L! zyV&!*1wQ7mn5M0S4rZlb2ms)@%BSaISASahp=q5K-6cd(&+%eDcVKnvs#O!kRGBy2 zWexCO)A*Ejuk(Zfy zop$L(@dnqXh+gaL?8M3~>oC{J1aP*m+N`au^#fePFwE*|sG5oT`}-x8N_haetE&sE zcEX;cc`w&t8tx7NkA^>G|Lh)s%O1kq6W9ar9)Kq~2PXOS{ty3Z!a+(lY-#`i002ov JPDHLkV1lKtZ2$lO diff --git a/landlords-client-javafx/src/main/resources/view/index.fxml b/landlords-client-javafx/src/main/resources/view/index.fxml deleted file mode 100644 index abfbd7a..0000000 --- a/landlords-client-javafx/src/main/resources/view/index.fxml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - 127.0.0.1 - - - 1024 - - - - - - - - 欢迎使用retel javafx客户端 : ) - @version:v1.0.0 - - - - - - - - - - - - - diff --git a/landlords-client-javafx/src/main/resources/view/lobby.fxml b/landlords-client-javafx/src/main/resources/view/lobby.fxml deleted file mode 100644 index 008980c..0000000 --- a/landlords-client-javafx/src/main/resources/view/lobby.fxml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/landlords-client-javafx/src/main/resources/view/login.fxml b/landlords-client-javafx/src/main/resources/view/login.fxml deleted file mode 100644 index 2dd95bd..0000000 --- a/landlords-client-javafx/src/main/resources/view/login.fxml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/landlords-client-javafx/src/main/resources/view/room.fxml b/landlords-client-javafx/src/main/resources/view/room.fxml deleted file mode 100644 index ea2f73a..0000000 --- a/landlords-client-javafx/src/main/resources/view/room.fxml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - 正在等待其它玩家进入房间,请稍候... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/event/ClientListenerUtilsTests.java b/landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/event/ClientListenerUtilsTests.java deleted file mode 100644 index c4e8d8b..0000000 --- a/landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/event/ClientListenerUtilsTests.java +++ /dev/null @@ -1,23 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.event; - -import org.junit.Ignore; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListenerUtils; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.IsNull.notNullValue; - -public class ClientListenerUtilsTests { - - /** - * always fail - * - * 因为junit启动时的classpath为target/test-classes,而不是target/classes - */ - @Ignore - public void testLoadListener() { - ClientEventCode connectListenerCode = ClientEventCode.CODE_CLIENT_CONNECT; - - assertThat(ClientListenerUtils.getListener(connectListenerCode), notNullValue()); - } -} diff --git a/landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtilsTests.java b/landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtilsTests.java deleted file mode 100644 index d1b7c5c..0000000 --- a/landlords-client-javafx/src/test/java/priv/zxw/ratel/landlords/client/javafx/listener/ClientListenerUtilsTests.java +++ /dev/null @@ -1,23 +0,0 @@ -package priv.zxw.ratel.landlords.client.javafx.listener; - -import org.junit.Ignore; -import org.nico.ratel.landlords.enums.ClientEventCode; -import priv.zxw.ratel.landlords.client.javafx.listener.ClientListenerUtils; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.IsNull.notNullValue; - -public class ClientListenerUtilsTests { - - /** - * always fail - * - * 因为junit启动时的classpath为target/test-classes,而不是target/classes - */ - @Ignore - public void testLoadListener() { - ClientEventCode connectListenerCode = ClientEventCode.CODE_CLIENT_CONNECT; - - assertThat(ClientListenerUtils.getListener(connectListenerCode), notNullValue()); - } -}