From 37e7dbf1834d26b33723dc8767103c2336de9d16 Mon Sep 17 00:00:00 2001 From: liyuhua <15626451870@163.com> Date: Fri, 31 May 2024 19:56:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=BF=E9=97=B4=E6=B8=B8=E6=88=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YuMi.xcodeproj/project.pbxproj | 12 + YuMi/Appdelegate/AppDelegate.m | 1 + .../tab_gameHome_game_normal@2x.png | Bin 902 -> 956 bytes .../tab_gameHome_game_normal@3x.png | Bin 1755 -> 2369 bytes .../tab_gameHome_game_selected@2x.png | Bin 1759 -> 2385 bytes .../tab_gameHome_game_selected@3x.png | Bin 3456 -> 4146 bytes .../tab_gameHome_normal@2x.png | Bin 639 -> 783 bytes .../tab_gameHome_normal@3x.png | Bin 1013 -> 1262 bytes .../tab_gameHome_selected@2x.png | Bin 1200 -> 2291 bytes .../tab_gameHome_selected@3x.png | Bin 2274 -> 3698 bytes .../tab_message_normal@2x.png | Bin 647 -> 700 bytes .../tab_message_normal@3x.png | Bin 1026 -> 1225 bytes .../tab_message_selected@2x.png | Bin 1086 -> 2203 bytes .../tab_message_selected@3x.png | Bin 2240 -> 3540 bytes .../tab_mine_normal@2x.png | Bin 810 -> 773 bytes .../tab_mine_normal@3x.png | Bin 1398 -> 1304 bytes .../tab_mine_selected@2x.png | Bin 1131 -> 2301 bytes .../tab_mine_selected@3x.png | Bin 2193 -> 3881 bytes .../tab_monents_normal@2x.png | Bin 557 -> 752 bytes .../tab_monents_normal@3x.png | Bin 945 -> 1220 bytes .../tab_monents_select@2x.png | Bin 1269 -> 2034 bytes .../tab_monents_select@3x.png | Bin 2701 -> 3277 bytes YuMi/Global/YUMIHtmlUrl.m | 2 +- .../Modules/YMMessage/Model/AttachmentModel.h | 2 +- .../View/CustomView/XPNewHomeHeadView.m | 5 +- .../View/RoomGame/Api/Api+MSRoomGameApi.h | 2 + .../View/RoomGame/Api/Api+MSRoomGameApi.m | 4 + .../View/RoomGame/Model/MSRoomGameModel.h | 1 + .../RoomGame/Model/MSRoomGameResultsModel.h | 20 + .../RoomGame/Model/MSRoomGameResultsModel.m | 12 + .../RoomGame/Model/MSTabbarRoomGameModel.h | 1 + .../RoomGame/Presenter/MSRoomGamePresenter.h | 2 + .../RoomGame/Presenter/MSRoomGamePresenter.m | 6 + .../View/Cell/MSRoomGameVictoryCell.h | 4 +- .../View/Cell/MSRoomGameVictoryCell.m | 12 + .../YMRoom/View/RoomGame/View/MSRoomGameVC.m | 214 ++- .../View/RoomGame/View/MSTabbarRoomGameVC.m | 11 + .../View/SubView/MSRoomGameHeadAvatarView.h | 2 +- .../View/SubView/MSRoomGameHeadAvatarView.m | 6 +- .../View/SubView/MSRoomGameHeadView.h | 8 +- .../View/SubView/MSRoomGameHeadView.m | 44 +- .../View/SubView/MSRoomGameQuitGameView.h | 13 +- .../View/SubView/MSRoomGameQuitGameView.m | 27 + .../View/SubView/MSRoomGameSendMsgView.h | 6 +- .../View/SubView/MSRoomGameSendMsgView.m | 6 + .../View/SubView/MSRoomGameSendTextView.h | 19 + .../View/SubView/MSRoomGameSendTextView.m | 285 ++++ .../View/SubView/MSRoomGameVictoryView.h | 1 + .../View/SubView/MSRoomGameVictoryView.m | 12 +- .../RoomGame/View/SubView/MSRoomGameView.h | 13 +- .../RoomGame/View/SubView/MSRoomGameView.m | 1438 +++++++---------- .../View/SubView/MSTabbarBeginGameView.h | 3 +- .../View/SubView/MSTabbarBeginGameView.m | 7 +- .../YMTabbar/View/TabbarViewController.m | 53 +- YuMi/Modules/YMTabbar/View/XPTabBar.m | 29 +- YuMi/Modules/YMWeb/XPWebViewController.h | 2 +- YuMi/zh-Hans.lproj/Localizable.strings | 10 +- YuMi/zh-Hant.lproj/Localizable.strings | 19 + 58 files changed, 1401 insertions(+), 913 deletions(-) create mode 100644 YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.h create mode 100644 YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.m create mode 100644 YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.h create mode 100644 YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.m diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index 868e16ef..856e7bab 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -289,6 +289,8 @@ 237701122BCF742C00D661F1 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 237701112BCF742C00D661F1 /* libz.tbd */; }; 237701192BD6143700D661F1 /* pi_happy_egg_smash.svga in Resources */ = {isa = PBXBuildFile; fileRef = 237701182BD6143700D661F1 /* pi_happy_egg_smash.svga */; }; 237852A12C072D8D00E360AC /* MSRoomGameModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237852A02C072D8D00E360AC /* MSRoomGameModel.m */; }; + 237852A42C082A9800E360AC /* MSRoomGameSendTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 237852A32C082A9800E360AC /* MSRoomGameSendTextView.m */; }; + 237852A72C08764B00E360AC /* MSRoomGameResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237852A62C08764B00E360AC /* MSRoomGameResultsModel.m */; }; 237B94BC2A984DA7007853E3 /* XPTrumpetPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 237B94AE2A984DA7007853E3 /* XPTrumpetPresenter.m */; }; 237B94BD2A984DA7007853E3 /* XPNobleTrumpetModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237B94B32A984DA7007853E3 /* XPNobleTrumpetModel.m */; }; 237B94BE2A984DA7007853E3 /* XPRoomTrumpetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 237B94B72A984DA7007853E3 /* XPRoomTrumpetViewController.m */; }; @@ -2110,6 +2112,10 @@ 237701182BD6143700D661F1 /* pi_happy_egg_smash.svga */ = {isa = PBXFileReference; lastKnownFileType = file; path = pi_happy_egg_smash.svga; sourceTree = ""; }; 2378529F2C072D8D00E360AC /* MSRoomGameModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSRoomGameModel.h; sourceTree = ""; }; 237852A02C072D8D00E360AC /* MSRoomGameModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRoomGameModel.m; sourceTree = ""; }; + 237852A22C082A9800E360AC /* MSRoomGameSendTextView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSRoomGameSendTextView.h; sourceTree = ""; }; + 237852A32C082A9800E360AC /* MSRoomGameSendTextView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRoomGameSendTextView.m; sourceTree = ""; }; + 237852A52C08764B00E360AC /* MSRoomGameResultsModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSRoomGameResultsModel.h; sourceTree = ""; }; + 237852A62C08764B00E360AC /* MSRoomGameResultsModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRoomGameResultsModel.m; sourceTree = ""; }; 237B94AD2A984DA7007853E3 /* XPTrumpetPresenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPTrumpetPresenter.h; sourceTree = ""; }; 237B94AE2A984DA7007853E3 /* XPTrumpetPresenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPTrumpetPresenter.m; sourceTree = ""; }; 237B94B02A984DA7007853E3 /* XPRoomTrumpetProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPRoomTrumpetProtocol.h; sourceTree = ""; }; @@ -6063,6 +6069,8 @@ 239D0FD72C047DD8002977CE /* MSTabbarRoomGameModel.m */, 2378529F2C072D8D00E360AC /* MSRoomGameModel.h */, 237852A02C072D8D00E360AC /* MSRoomGameModel.m */, + 237852A52C08764B00E360AC /* MSRoomGameResultsModel.h */, + 237852A62C08764B00E360AC /* MSRoomGameResultsModel.m */, ); path = Model; sourceTree = ""; @@ -6118,6 +6126,8 @@ 239D0FF62C05BD2A002977CE /* MSRoomGameVictoryView.m */, 239D0FFB2C05D086002977CE /* MSRoomGameQuitGameView.h */, 239D0FFC2C05D086002977CE /* MSRoomGameQuitGameView.m */, + 237852A22C082A9800E360AC /* MSRoomGameSendTextView.h */, + 237852A32C082A9800E360AC /* MSRoomGameSendTextView.m */, ); path = SubView; sourceTree = ""; @@ -11322,6 +11332,7 @@ E87A24F1272935920086A794 /* XPMessageRemoteExtModel.m in Sources */, E8D34D5028080362009C4835 /* XPMineDataGiftTableViewCell.m in Sources */, E87C54BE2823CC5B0051AA11 /* XPMineResetLoginPwdPresenter.m in Sources */, + 237852A42C082A9800E360AC /* MSRoomGameSendTextView.m in Sources */, E85E7B322A4EB0D300B6D00A /* XPGuildAnchorIncomeSectionView.m in Sources */, E87C0AA027D9DE6400CB2241 /* RoomFaceSendInfoModel.m in Sources */, 1464C5F629A4CA8C00AF7C94 /* XPIAPRechargeCollectionViewCell.m in Sources */, @@ -12058,6 +12069,7 @@ 239D0FDB2C047F24002977CE /* MSTabbarRoomGameCell.m in Sources */, 239D0FB02BFD8C4D002977CE /* MSRoomSetingBackdropVC.m in Sources */, 235714982BEDF54E004C81D6 /* MsRoomMessageMainView.m in Sources */, + 237852A72C08764B00E360AC /* MSRoomGameResultsModel.m in Sources */, 9BE9F10227FEE5C200667200 /* XPAnchorFansTaskDetailModel.m in Sources */, E8E0DAE6285C280E00566A2F /* XPSessionFindNewAlertView.m in Sources */, E85E7B1A2A4EB0D200B6D00A /* XPMineGoldIncomeRecordVC.m in Sources */, diff --git a/YuMi/Appdelegate/AppDelegate.m b/YuMi/Appdelegate/AppDelegate.m index 196abe31..c3ae6da9 100644 --- a/YuMi/Appdelegate/AppDelegate.m +++ b/YuMi/Appdelegate/AppDelegate.m @@ -88,6 +88,7 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; } - (void)applicationDidBecomeActive:(UIApplication *)application { [self getAdvertisingTrackingAuthority]; + [[NSNotificationCenter defaultCenter]postNotificationName:@"kAppDidBecomeActive" object:nil]; } - (void)getAdvertisingTrackingAuthority { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ diff --git a/YuMi/Assets.xcassets/main/tab_gameHome_game_normal.imageset/tab_gameHome_game_normal@2x.png b/YuMi/Assets.xcassets/main/tab_gameHome_game_normal.imageset/tab_gameHome_game_normal@2x.png index d35e52eebd908ef1c57ead9e1ef05de8e2ba0f56..84220f87124ba8dc957c4b58cff4cf502aca9f6b 100644 GIT binary patch literal 956 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo3?%u_CN}`7MFBn`u0ZW!<0!6Mv#4lgHb{VMP(oG=u@|EjA1Y%qTlGiVSlmRuKIC2!M1d z73fNnk|4iehHk!h4_bqMe!6jb&wRt%itD^}FIGkb|Gs%~`Qm&>;VEaj?ad_>F*GY>Ucv_Vow03uG%W@4AdA&7jxAgu0 zSIb;dEqOSM{{HLq^D$DN$uq_O|LSeqeVniJUcPmG->)xPw+_54=;|}Ru)=13-?^DD z&Z$pboc>w(jhyJ^Z95ru`?6ly!D3o<>{+k($88H^*p&57W;j^x`OLj1+=o5r^u~ob zsi*Xfmx?&AJ20U^FMJWVn^jCFpW0TXt;-Ka%u6>++A&Y|8T*#UB933~9`n@t+s<;j z@#KNNcRyb4?>W6i{8Zh1$qz4&O=GNeGn`fIyvuiHWhYyMhVJqz7_6qCH;V?y(Ndeoz$#rKLqy4T=2No_AOKKd&jN~ z3thDY!(L@P;giYZ=91XaRVw4I_(8)PG#%J>`|KD=S zv+(4hN2&&!M7)h`e;#yQren{;UNq^ZjgQfj%S$Xa&WLROGUb<7uHiNX+tek#lWqiT z(vp@aihi+VUdvsEdvx;Z z&2_BDS3KGEa$QeT;jLIzp>3@`;YZr}f_r6qqD5c+d-PzrUDGQ5!>^Ke9!h0zSy>l4 zk@JTt)2WnI1vdltc&v)gysCfw)%BXM;(V{x+g*u2w8u+2p56B35qpN!stcN$td;^3 OID@CFpUXO@geCx=`TvFh literal 902 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q3?%1AoYnzST>(BJu0Yz*(9cNU7mDmN zlMVbJih*_+1C@c*%QI~A1iD7IB*-tALF((rAMcvQ9{F;xp5Hg!R-J$8`VM8G7dH;? zOf$V(SCJQba&=!(l=HmAEp7%93|qVz7?|ojT^vI^j=v4NxowpJPpZJoQx6zLBwZXV z`Ii6xU%lN?VdJBz(|2F1wW#!({BG0aH&IjLf6vdIy`nhL^yWX_&>yPL?|fM58+~8k z;U)ch53ki2C@*+;K;rT1%9wNNmz{aqt&V+;oTu%vcFn(<^E|u$)STOW;7b+XHD&9= z*F0UFR?8k`JvM1=?9r8`50{+d{=gvp>fYIum}~9X1^oJd+dk_#haNLNC!w{ELA^4{ zE=S_{ge|kqMg1@N6um4v*Qk$`@5}r`wVDqrYBng>T&h`F@Vth}YWH+4UBQ)8`olVN z#dvF&+s~#yVAJ|FE$Z`9oelacZ4cayW7@J%e8(TgN-OUMK929{QS*+zGMo4E<*syZ z-R;XH?;N@Ic}i!&)_FS}s?Rb1>V1(ZaWvp?!Z+yzNA{#ct%cRsg}cH+7Z&B8*m-@G zmaF>e$KN)#y*3r%Z#gfwZbhtUm-ya8W=#)8B#ys-ZgEsR!In|q;$)4-u^YUOUze>i zU-C-k(G8*J#|oS7c6Z9GJGJSVM!1p@KkJV=8I9~EhgV4D_+Ng;+Mt!}va)m21))V@ z7w)HN798IAwBY2Nr4H=t-aRNz{Is)F=I!h>`J<*q2k*XbNZkEs^4ePkng##Lr!sjK zhfM0)ks|21YKdj7gTUfO|aS1QF{r+x50WN&LIQ9JR? xLMA8Fc)Q}3^|2dje^1wbv94^zpIi1@?cIB;*<72vtbs|G!PC{xWt~$(6978$g+%}W diff --git a/YuMi/Assets.xcassets/main/tab_gameHome_game_normal.imageset/tab_gameHome_game_normal@3x.png b/YuMi/Assets.xcassets/main/tab_gameHome_game_normal.imageset/tab_gameHome_game_normal@3x.png index 604dc360eb93185c41e483602367e56db3b92512..e651f25288694c083de7809dfa2bbf377acbc9ce 100644 GIT binary patch literal 2369 zcmX|Cc{tQ-8=gYO*h9&75aLTAQv5?SMrZzkXMUDx}2e$VsX&wW4l`~LH0yE@xSf|Ni206-FM2Xp8D zQGyRB#E(+@Rq)-MJ0ue5g#h)lxe8FE_Zr{+W zUxIvDE{nruFxkIYd&an24sXxcFAu+lviUl{?6FuBD(!#V{~u&jFit>W3GD4j@nb*b z1%*cIrw;bGgvQ&UegBY ziwlT#clH2mZ|y9;2d;5dr20J7e`v848JVwwJ`Q%2`o4K2e_;6x8M-!>0@nMIAMLL1 zV<17QzHfhQyKovM@wp*2`4q9SNOpE2=Xxy0JUhvG;Kr2*-}4p?iC@OQPPP;_aGqCS zJp2IwQC~RB8iAf>BQahxhVo7<&-VSbVWMN9p$hwCWqf?SV+*5WN5>x8#QxlMQ3Rng z2!{x?_meIV>8@8dOcr~d3G1hwZas=OJDe+e=vJTv@k+05g1+d5?-p{=rCh9)cPp)( zIa|pM2|a?7WC9r@s6g);nzH`Gj^KFJtRaq$*PH7)8W-G{DmLf-A;df%KHd0{?QQS- zpV!^}U_1i*iCF&nVJ8!0Y}U9{{TK`biDd&Nwa?5qRFnnS;-eJu<((YFv2}VOjJpXU zw+90ZPcaV$=7~JV!0|N??r2-U=p&UuJp8yBGLt&LtfY&q=n;`Dm9puIK9)~-ar^eS^Ty6j6?!Edpx={{u z$}MZP#@etK#nr{|E~V7CmHn)?dh7m4+hL%UPE@ zX-BH#u7^jSsz%lkG>*c05|0V#&78NI&j&>+`_$x_8mq1p+lJ``MGX@g(AFHDEe#L1mw#FUz z&*ydBsXe&#qa7%+~owFWnw;qI1<0s$UzfHt57b&qT0E{N({V_n5}RNiD3|IhVhz0wRSp z&omjx`}`{^Uxx{?iLdGTX4APF^ixme4~uDDPtVkp=})^*GjflI+MOI3<(GaPbR|ne z8T4d+{m?-Z=?)KzNv)`|FAUuCoS7SN3#=N2W3%!>%v>3CR<7Ld%H)*QyU6$ZYc>s& zlACT?wgwvgIkR)4mvM9ebuBm;KlOb{dSgR6gf!(OS$5^`%(2YRW)Olz^g%?q4p}*I zDZk;B>^pX*V?vE}41#*x(z^g~((ZOJYTRg@{I#ShpjR<~O#iuQM{tvoGn{g_mLjZx zHSW(EPqg4~&35H^*I6vzEa;fiGPEsPbLTnCu^_85C?WCp+Hqz|8{h1Y%*;npk~SYr zHEo<4Fjq<0`Zva%G)gR4&+4TWK_L+;XsgA7$E!o1%WI6TpTmifUkbMt#&uR4GF(}* z8VMEyzx!tTGnw?@G_doxoh32HsO!1!lI|~lkL_*8W>kjDKgtASlBWkt3!SV~>2lIk zq&%jG2H)r&puLx{5T4W1HcJIKY6-c$ovIUrBw zA$&^{fEF)vY~@IYO@ti?92}{Cs}C|#!ZR|rk0jt(-&SD6++%6Ew>465b6E=^7Xz?bsa12U_p+Yr zVHPHIdcUtMZjAk{G2@`=xL??s?6l`P~8=8zfs&i{L ze(HlMNEXxiL&o89y4F;rsom~yH0C>z_~zw}`$CJ>MBZmou#SR~K0JI0-_N6A3W9f_ z2;gX6AwIKTL*%N&Wfhe>I~);|+z=LZ%EoqNB6?9LCmHMfH>PI9l&r;}Vb;7%9^$3?Ol%$$D{XAUtDM{#3g?GKw z*ZfTx;glhAz>`|K_j`~sNQ?wnqb`0Re7==EOn(O z{M+K?r#@~8DRX0Fb7L&dB zBw}Kt1X>jL81dj`reEz2L@Ymx9ok~zXYGjuW~L?-tL|uD%2y(;<06bjTKof!U3@|7 zXQov~K|8 zotLf^t8YWZWiZ{T$`le5BNMU^X<60Q{iZT;SI1WNT0C)iod&bdf8~+X?0S<+AcZ~h zTCJ`hb$}>zIcIRF!FQddo?#y=K8y>@&h^O;nanKmUn7>rpJ^#;{LmJ|uDKRIzU42q zyw+K~RB_VhaYERK9Y1X1T3p3Ok{Nur!E^jDO^aZ!>10r_Bh7tVSF*L;bAGv&++UHB g;qV73z-?Ppw)M7Nf5Bh z!2$^jcAdJZ4FNrL!noK97;y&sZ|Ebia6PQ9rjr5uK!G3VnE$!(Z?!;#pTP-qI1H-? zJ17nsU83g@ae<&@_RCN^sqnF?JSx?8F6HP(JI9%EzhunC8Yx^>=kt&!|^%UW3a3 z0I(j7v~qFpSaJ8uV(38)p^Ggbdr_lep4yq4+Z=J!cRjFe zD{z1ESnh|QIc%pHaYWn`PyWzuP6hlkC z)f(>%dQI!=)Bi-<-vosR^`GYtZLZK;j}&cP^cAt*R5q}ra}n-Be(8qCybn!%tgfKU zIulybNH*hno4}6yjoch!O|P{D36)Vl`Y^1k7|)$^BAWBEa>q zJBkNq(%PioX!JJ)0@m3V3^tXQiZ^PU*VpGF-*%E`{~$kefi4u+VH>yq?g>;eJLNdHvRf`tn~(SVJ6n96IR{7iNAE*G`rwkbhUaz z)(r8-KQg1!vqi){QALAQ*QUs4mRKWGAg8cd2?zCtJ-Xo}d0YWVPuWY> ztdm{kneZz7qc#~PlL;Q>pQB||P@E9caR){56imbOtNy9M(JbAbFx}GoQ9JI4I1Do| zIqhXHli0hSsyQrYVPGDY(ommQOuWr>S>!!t_B^G`fZv9<^lncUo<{UH zYmRz(%Lx$wEXpTQg7Zq2wx?L4V5L90vPsfLwhKQpA%6wfp{QW9M5>NeY zGWd*rO3+ZLjVH#EuD~~?=mK+h<5vhD0|{L>ELpc0mqh~?YHzK}W(NnudJX4bBIaCH zK{~qS0wg%IF-=8TE$A7}J4SNKj@#A4c9;6{b2D` zXGGV<6ULH&jFf|Z z9ZKnDJKaM%@8+F;w4;jmk@`*==W_YGJ0<~2Cj6wm+Yyl3$Y)GhYK=_?-NhPd!k>TP z$PrF}fbW?Nw#-ZvvzLw3mo%D?g*w-a+tf5?3M!Iu4!PCxzkmOhSGMB3n5)f8O!k9F z=Z5|gs|OQ$;0V_Go#{8{Y5zb!Ly92gan9qb*dpSPZ54|7LXD8vakjQYXmZ$i?ub8J zRfbN3Ie79ibqB^Ar_nJDWR&({v=&LCyoneA$dy ze58FJb<%{>0;K8(&%6_lJ*HbN^a+@08PY_bs2m9d#>tv?Cj;fSmsmIwfBE~@Z4Ooi z1}SQJqoSN-Uref79AvlZ%S*b*drt+C_i^Qf9M_27nvEk7p(cu^T8aZg7r3TRErT9C z!dDGi6=X$Wg_av}GLvpF>$z~5oRpr$Ca+P~(z{?eDsK74*{0Df;R43HcB#sITn?sa zwFD0;6AfvNDfXex;m^9Ah-=s>HD_pk-ZKne;p()WU}$-qKCXfmC#e5H|K$I)+XsD-RwpNTf7?dK Zlv?no4UMe$vw|-GfVRaUE3E%P`4>5{F3JD^ diff --git a/YuMi/Assets.xcassets/main/tab_gameHome_game_selected.imageset/tab_gameHome_game_selected@2x.png b/YuMi/Assets.xcassets/main/tab_gameHome_game_selected.imageset/tab_gameHome_game_selected@2x.png index 5d3bffab8ca4aaa8981050834c50ea213774feed..54f505c4e4229a93d72d80beeda47edab2953a79 100644 GIT binary patch literal 2385 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 D(C~#{ diff --git a/YuMi/Assets.xcassets/main/tab_gameHome_game_selected.imageset/tab_gameHome_game_selected@3x.png b/YuMi/Assets.xcassets/main/tab_gameHome_game_selected.imageset/tab_gameHome_game_selected@3x.png index a243ada0e38cf59c732a2943e5b66bc258d6f0b1..d644bc7537e7ca990966089b09a485fc87158196 100644 GIT binary patch literal 4146 zcmXY!c{r5q+knN4##V~56q%72$(FRdUNMEpGFjfNp(Kf{lQqj^?913qmcbx9+1F&> z_p%n*QelQMV;IByo{sN3j%U5^>$$G;I`8|RCjzOj#ltDg$-=_Iqy6B%A#k_!}m`NEQ}WI#SnI19&YdVpOM72LpC8niyaGwxc_lZqa`a_h@Eb@%|uYXWH`*did{1 z@c6M?46`0btxuy2z1#lgwuK%$&M&1^X6@F!r+jzad^dU=|M@Vjkv{9Sm0i7$8D_?} z9|BWASX1&YFk6SCWLEDtrcgo$kFu)vft=smx6*45aw_-3297dn4!R@AUwn!4o}{km zopFB>kZL4&ySRYX8BIoyAAfh-0vNu#ZO*%Ig%2KwjWXv@TYaJ1&B?n!s=D`7;Mx6O>TqD3tuSutLMeXEP>?gJzM)V&6T4FmHKq_1VJ)-|Ow`@PA zn^B%i9e+y#s&~Zf0I1oO`#}>&pJU0uCq3cY!4t=m{@d@ynR#XVg@v?fFCx&gTNHCJ zWV=0<9NBvW^cdZBJmvRyeA16pok?j<+67btHr!&F!4v<#6NZCHK)_#sE(Q?rzW!hq zwKd^S1dJiSD`c0Q3frU zH{`{s8_P2-Eglxi^tI)QNON-&V`)h`ZFzp6|3g@qnel~vDtYtA-1JcA=g)05WqDbN zaZ#R*c9swBsVH3Hp>A)Jh-+)hv%_um73sK?6m+1!AIi*sbVH;G#tzt&b)=e`aN4D{ERmJ|}OFJIU^l%>&jOG*mg$6*i%IBB}8DFUnAhV6eP z_?3l)TVDIVy0ODT-n8=rBU}EH+s)?JW4=V1Io%$9Tf>aUqLNy}jfEdPow_mD@x_oJr@r18H$O{Nbv9=j41C6~ zXRJ5UqSJNxs|l2!PDb{%vW7+6XsN5>sIRyJr|KuF7SNSr$#9U8aMkr!K@c6|B4cM~ z=h3Vp^p8f`}R$Ntb?~8HyVi%45!fQ5yT{m(pvf~Gc@BL z3j$?F9n5Pig@E)Cv`7m@W!;TT7L5}Lw`4SsIgm$?Nvq;IVS=5J%vu55uv=3!kr#yE zK{i3#YEuM<8F0PhQhm%8S`2-J041%D;%U@1jl6Tc22ElZRilV}`LGFt!{=IsWXkW! z@XEBa-IqT+E#wfsVtX1RKXMP6j|5MQ$9oP);gb?Xes_vSdXs15l?@>UuJ`mL~ki z2Pb$V!X47b%uAKuX%ZA>N*$f+y``RI+Wv0WjIpm!xTQk<)xgTGp>{Cm0qc$GT>Y

ZME4#X{Z`~Gt#WFhK$nep8M%_6d zZCwq~QxbWw7LerTnwJ!nRT>06c=KE#g;1gG#Kwk(JSui1+*)6qDu0+eG-C=)f{D85 z{{e44K5g>J*&=Xehd6r5@!9vJRr87n3xu|=scqK}(-*d;O?DADd}8F$*=QH*PyS|a zU7J?y6|Lje%qCLHhDHVXtm64IUsF67T)#F|l|wkiu%lecLn8QSGfBfBu}EdTQHABT z3b?E?oeege5glS}V*|%Sqk2B@eMR<|OMX$l-5bqKPBl=@R11-ISpdCG)3nCjnYxox z%kFA4@+}(lA%J5bJvFKh^6bXrI=(!O8hy{yxr?v9Pc_7R`gCEX&V9(6-t$z;LqGfs zGCl8eU+cB0FhWS;vU6kHKCV6>~5b83irk;=a{y4+DYA#Gt{e%Kx5MRTEg zD|{67PZV#_DhVjjLK>(t>q~cqd*{&I8sS3;u?p3n_=OH! z)cvDeQj!X)(lSkT2xDE1_=ec5v@t(<%hJ2t);4B!GE4)nEJP(hz$MUc5XLp@*id}oSe(7gCmmj6-?qTTfP`v?OWJQzVk4j8 zEPg5*h_fIN+Dlb$|Jf}<#4nJBhqY2XOw4)QT|V2Ks|7B4`DnvK6ZJ*Y8P~>g+}dT%BSS|GvXHxs=^_ zcg)G2o|QZ!m#a4A-XHX%9;z<%kdw9&Vu`0ySM6TZd2u9?M6^Uz{cpuRtRs0hoQ;#< zunyj~HPRAQM(tO+4a+>ymv$4wo_xqmdin;c7y9U8V0~@+-r1p;Z?fmZ(?Ya~1ic>i zbeU<*3pY&Lb9)lbpHFn+#yBX{!MN^+D91qFn0{I7j7x=@m3(YJm(R?MNdI%^#3W^T((9K1!k!~keqU&LUBjIV znYqy03fYU0Lr>zZk8bsJdfsiZP{gRIaS5{vXmd-`NUo|+iM64%*-rvgd)l^O&p`K} zNs1-5r!JlQki*wtK$iPmWk+qWR#%uXyP8zhl0iDH zaMIvnZh?(vtyS{pKK^*R#cX2x-d>Y8!^g_cRc797@mi|(vj%KScdA{Js7Ob^IK`p4 zN$aBYh$s8Ta@PCvBAfBAUR6}o*VKGf4ZLM)ErB^OL9>A6Pl$W`_yXl@_hRFSZu!)z z`C&5oym-r{^a@OJOCjXe%YPEx#)_(mG4uj*?VWHYB4m_Orc8I6LR zDdlsW^y&kzytHCJ2Q@Mh4|W6FVM^Yj!``{vJa~(&=h8dqY8JJy)%qDeYz7Z8Jn!cr z)6Z!o@G$|wyWl<68D%potc3ZmqxHA?u$~V4^S&rai)AiJc__#}|8%o! z;(Ff3SAgugR<`w6mOo+Nz6bsHvV#d&>#hFhv_?HSwvU=9W$~nre zjTgP%YQonSf;e&2kVWzCci!X45z(a$P@a}mOz$K)fCp+l?xO?_=}nce-;&_Xh1vOb zz5dbVGtZ8(nY(gUH`24syH@}q_59(6u{-a`f~pAtCpq^_(mBFedy~Pd*o+Vm|rj!V0%BGTLuhGLStdiwKqQR2+Z>JPZ1prr9fYP z$Y(1&jcp?Q_Xo=egFjG*6oKJ}hF(g~+HUmqHq)33sdVf>JkQbd4EPwUcz+!tXbeS1R-4La3tZ)tmQ%enxm>x3==x17S`q z4=@S17^roV7otU9Okyru#P!yWYf&j|%4P^W!FRqW;5U_CI8AgFHkGJ;1s_@&vAZHa zh9`;$xiuEl*A-aF3h*z9R7xg{xbdADkX6@7Zcp>P%o^ZgKF>1Y*c#y15w9d{tfO&z bi_T-#K3X<$VW$cB{bAA8(7#`futEP1mA8a` literal 3456 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 N002ovPDHLkV1gC$oU#A_ literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q3?%1AoYnzS)d4;su0VSC?z20#9|xlC+mG$s zc6`?^5F3V0?AQTjgUDmZf;+dL*s<;S-n~a*f3PZ2R`(TelwF zw(Z2KRXc&Q+qWG9%5K?mWYwzOKn1RS3JO5$HA;f~f*IIeEeIn&tcO&x(4D zPg@N)zL_}9>3r&%ZTdm?{l#BdZZnBlwfEf2gVNU4ueA3q^EUpow&mGj{kNBP?+MeF zd%At!?lThWHotkdUGB)CT>a2C=Io_WxB1qvNW|Yq@Aurgz}zfQa_m@I`GZFejqDcZ`KES7AH6QI`t~-a&;`wmylfYILmHEf zrBXJ$XErf0X|89xy{tO+^{g=NmXFp^`Wp*ElHHoUJtSTqJQ=QApqjkM^2ElxlsRj* zIE1ZW(Z9SUq%+Pyilub9+{-JO+ZS(|KO@%nW%2|UuI@<*uNXS4PG>ptGN|O`O*o~v zK9Dsi_`-sQCx1_@Z(*C}BWXRq^%21X@=r>mdKI;Vst E0AO7~Hvj+t diff --git a/YuMi/Assets.xcassets/main/tab_gameHome_normal.imageset/tab_gameHome_normal@3x.png b/YuMi/Assets.xcassets/main/tab_gameHome_normal.imageset/tab_gameHome_normal@3x.png index 65efae040c1727730e6edaef4b1fc9c52cbb92fb..11452be63707d8add1092f12badc20c19e95398f 100644 GIT binary patch literal 1262 zcmV<})!5kB)6?G4)Ykw1|JB#o!^Owf+1t_6)!pCW z+uh&p@9@FH#rypH+1lLR;NtlB`SkVm<>u$;>FVq3?c(F)%FNEj$jb2X@pKS0Q2+n{ z9duGoQve0@@XEYK>D!{4dms_`;jV*qYie9hIyp2d8W)A$C|v*m1LsLZK~!ko)tcK{ z;xG_^(=!Ds2(0d^$+V_4JyDeRf4Bvu%O{(3(h^zrzfy00rI_ zb^?5~dcG(oKeSVzD3IErKUnh9wSj5^w)=CCWa<^P7lk+NEs5@(g!UwH?xTK|hZ!Bj z?4eJ7O>#Pre4?FmPada(;og&G7CZDJ9If2`QP2x1e&Ch~(2IcyW*Ji>j1fy}Mw51W zCe#>{j?o8m8c^neUr>V-zM?9%>gDwVs(~Y|Q_Itm@Mc%7>qJN7S+e2h6a{L*KB;nw z!X;_&kmI57ik)cie98ZsucH}mIfl|w;htG^rn#pm8+L}kYx(|cMRu@I@{0Y<2F$aC5mQ*kqJ4BOsU-mFqVb)ARnIlE|lbmq7LxD9@BDUQnq^qN5qz*bSnH~*Q0i)yj zg{$*eFkPx#6%hYC|IC%atXU6)YJgz=k!JxiEZWpmPH@PzM@60?)xz|rIQwz0St??Y zSa6U0yDbT^#vrYih7CcQ2Qaos5&0`0sVdr z4anU!GSuRk%lFwq&CCW}9Lf6KR<0zR~-4~b7Ui&QJq z>edry2il(x7F?4qh|e)in^y6OKbBIfZn#gTSTrr`I6JqrYb+Ygv|Xfe4HL%^X?d@i zghakbM=q{u+40xx$UD>})77|9yMaP9Euw6;Y0m4a6iiMc-$0S&_fMV6c5`b`quAV9 z!FOu{OLFiqu7SDa7-e3=e<=@zjX4dBBu8BH+rf0DKCo|xYATQ%*p=-E5Cb(Eb^C$% zwxLrL6S=gRqHYb9j2Srq~{dH?_b literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^At21b3?#L;KKKlzdINkyT!HkC?Z^QM= z=drzePlDJWE{NQ=?F5kAzUAo7ZO683Is#4T?>V@Sl| zw-GldEmjZ-Wh}feboScK-O>l2{;~qSCc;miT#ZEjf#VcYAeO4U>=c{AaZ1 z`TJd~?g<|s)0-#q?}K`}m*jD}N2|O3;XBJ@;H9F$d^F{x|7np)PS>{BEw^kJRV`m2 zI!A!{dZG)5F% zcXMsYIgW-OmJ|o2K3p7@7$zv$9A28R+r_HfZr(e?bN8pM`@5y@+#-R<4IATo_H)kA zcwGEt$=x7}bere;1!rb-9Q^c=r)XJ$od%mu{gss9@2_R*e>R_Q*1z+f{p&Nwd(C#w z8G57C7p!k~h-Kz}wLB{PRvi@2}l8g}pQ-G1BdhEs6KUHQ!J zdXwLe3)gB!ZTRQ2oo|~>Ki{>t$qO}K-PhAuTdB9_gn`m}i`j4AdOgZcx1VtRHp}`j z3&W%T8D3t`?9dEscvRr^vHf-1Jx{aO1-H63#RmPowx%Q7KW9xoe*XJ2!|~nz z)VIp!-iC=i4@`5VfUE(;NLpQEk+Wh6#{AJfvr9SCBKDgBR6r;j9p{k9* dl*`j-|0(Kx_48d(JizS2;OXk;vd$@?2>`^{0-FE; diff --git a/YuMi/Assets.xcassets/main/tab_gameHome_selected.imageset/tab_gameHome_selected@2x.png b/YuMi/Assets.xcassets/main/tab_gameHome_selected.imageset/tab_gameHome_selected@2x.png index a4e0e8d916c23e4bd40b02f51195b03c913a8f0e..04be2bbd10f03061248cfa4278b0c324504ca241 100644 GIT binary patch literal 2291 zcmXAp3p|tiAIBHb(s6R@BwdVA>7)ziRR7XJp&_@ZoKmrFgd#FRX129y3c1BxvvihA zZc}opnQk_TP?6bAxn$Yg+6w#rAFuOyy`JZJJ|LK3WNbD%7!WY5cLJb^g<0;NqGTLeIPkEl3cgoJa&F`5IaYDA9y-G(N6&wa`Upte(-=87MqZmRCk&Qe{QztRNbw^DIWT^1 z1W7Ev4%2>Lkjd*3=005<7Y2PR$cMfV>AykWc+v9MF32c_H&>>sDf3AU@HAF|IA8e$ zNOWV|kGq*rL7A7H9-27)na~GB0d!xUpfyAHrOEqgP?oqbGa~A92xUNGGmzTgIuGbv zU^D{x74%&iM@Ib+B8_ifa7NO5LuH>Yj12{RMaJ$5n?L~a3DfNnQ@1N2y#nIiE*KW& zK*yCSBxu-w^kvixLOz)TnGY6PXo-<$ltB&)@(Lk89}w&@Jqsuh4oFj3|G?clkWvH1 znec$I@Zyh1vkkWRXtAHk}te-+d*DWt;+g<|I0NPBg44)utqg#{LoR4N@G8xai( z1&Hbpu~@8vEE>G+vVR!!w3caCQ zs%A`TIa5V-czJ%-$j1MvK~Gk)%q(CBq%=cdnGGxjo$>H2WX3*Kh)p7fnQK zYMPle%?9N%Lawz0m>Su;tPvk4Q^`KNqB)uFJdezmQO`zAMic7E9V%!;!zL$F&W+nL zcQb9~iZ`Ql=SEbQtS(n*TT(F3aCQD4u zZ@YD=Wy?leXQH;gcdtgW##bF#;~<^6xE+^fNVdh>pc~e$eYZAwhc6MMrF2VUPBfI5 z6ASi*yLXuFcH3)(wq%%Xqv4o;oybhSuwj+0uqv`Wd~yWig%VFUwPX~lVCO{U(QS^n zzfP#>VzTav6V z(0|p6xNJxxKY22n{kB*eJ9y#KIb61?V3^-qF;L7_riJ~YeGFB3Zht_h6Jkhi3-7=c z=@`-8KRj(^=C*VqLWP?epLEM{%|0#B*N-WBi%7Yr7*97HQWJ+6T%Tg-c%is~tp_cZ zpOPiJG0%xDFMpx`^I^^tj}CsO`+LSQ9Sgn1dFaO|TAGzAN#o=@eFt=asn&G(wG^t= z%Hx|)RPlaIHnt(N;{-7#*gXZ5?2ypWMYO{%DQL99R6BIVQmIkT;zO<`#&~@3T9)*r zigr~0%?^J2iTg_*4W44@CwiysBGg!Tu#$0hOTIYTD!1d${$1p{HHA1eE2x>+dBo&M z`BxW(o`xQJSM&PxIq#L1;=R@E6<*SH_ zUsraV-Oq|bKR%$lEZ$bDaywhsuhJkP?!cfp=$`cFdXatWDRb#+Mo3_gi~Hs!0XpaZ zKp%CmGv+4!n$VT&$}QizdnNVQqqVzyZEHHy=hZPPzXXd@Y}PQH!aMUel>2g>g_w(* z#J+x9uAYPca&einPpf(!E^K8v!(DR{_rBE@Q|^jY?<_O9Q0Q#8DAcCgxFJJryM9~e zy*#wJ_PPNcL!W;5h4`xavnMFLjb9+%DnsxAbIe>}V9uwF@-LQK(sH(;wHoO)UYymE zwX34$?kCd3OA77E=;`!nZ~4R3?bh1qHUtlLE#*%$fBxp(>B0R4Ui2oG!5;x9-g95B bSE|Y!cdq&VE#3zCg`*tpUG2*E`I7z*HKPE_ literal 1200 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 G!2bcP9EoHA literal 2274 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 QFjg5nUHx3vIVCg!031t0?f?J) diff --git a/YuMi/Assets.xcassets/main/tab_message_normal.imageset/tab_message_normal@3x.png b/YuMi/Assets.xcassets/main/tab_message_normal.imageset/tab_message_normal@3x.png index f7293980db244c44b2ca5ed8674c0963a9de067e..66ce7c695b6255938549d0c2cbf64cb181a6aa43 100644 GIT binary patch literal 1225 zcmV;)1UCDLP)({)z#S8*wfSA($v=f|Nqg{*2Bfe z)z{hS>g(Fv-rL>Z-QVKa+1vg7{qXVfz{14%`1tzz`sC*4?e6c%%gyxk_21#*#mC9) zWGSHl001C#QchC<1xEGo>EEJzYB?Ygz0AnF`10@BuAG^JbzDv~DjFB1=&s=a00X&6 zL_t(&-qo7za;h*8Km!U0ir5c(ZPj+w1pYYz)px^oUbUwu?bWf3cXjwRQb>a+miab*@u?ReBK&}efk*w9@tbKiWm-(NXFw2iN2l2@hP;Q^^^{;DSv;IZc?r6=*1D%_kqs zb|uM{59jl&F@5e8LRrlY;R@e8Yjo~Wu#zU=URftO3qG5@1~otzxn{~|yDzWdzrZ-n z^Gt(wHJ}}H&3bNI^K2dS4BFO!Nr>`>ZENsNA)|5o(Tqpr>!p3o%NH5??Q8rYQEB@c zs*-oFeU0}{j6kRfGk3dVON#5p>`S?IvrwoB3}T~56GIe5`}91bn<&~G&VzLS^9W;+ z25mAHX+qo_*`MM`HaW@Z1-|n^5Q;Qo@+#8Ao1DnaNBhl5dU8hj;Cm<1yb=urnk+hL zXg(J|8Wx*(eiREdpphqNKN@%vYr>#>ZuV?$1R4#5nTEeJ?eHB%-!(H0wDJ^SgmIef zm^Dq=V3(zF9*Zai9Blt9fDW;{(AdNX+Sdd|N1x7)7J`nJwT>3)jYO(^2rj#5!z?Ib`z=6}UV-(;{&JrVV&_&sy5Y~ZY0<8Hr z*4Yu4_xKX=>^$BAzFBl&XYr(A%_K`%EZl*el^;0p;HKLP3Ue!elDdbIe_|+HF-25P zOL&WWyPyU=l`9R2;XKJ2ZsYKUE-`EOayonvKrKPpuH;ut1)0T_?YJUjHJE41WtON2 zNoF8`uTG^1LT2&>;efT;vn7v?)kK?d4-NS=`k!@`w#ElI=W?+niLl)#~vZ$11kL n{ZCDO7cGk8Q;XubW{cuq#z_(ullfQl00000NkvXXu0mjfkK=Y} literal 1026 zcmV+d1pWJoP)u*u#k90#+NiD^*qO+l$)CbN{`Rbo_lui>=QHXBMbpp9uyIk(}PC#S=z9P9_SVnKnA9XdSBl~#M0Cv*H8n&jp?Y?!NJ_|WW~;+)JpCuh-H z&GFs3Ht>j*quJyZbZM@m<5CLFBhugqR!Ya#)-PVg@I>xeCiXrABZG7m6Q`xzPcjMgjr8fumLY4tV3*(^$z#7{^61lK$oBSnG zAG%&-!|`qn!4hfEy*Vyhqzh}Xmq=}RbFL)9Al=X+AibF^@Kb5?mQDq>hhG6wHua^y z4U4#ux~VHo8G+POH?^dYc^x0>rlvIG(9KgfHKlu)3pdqG-HkF^N`+&qo4V36_pHcP zH~*8vzlxN@_cUDM4B>mqB@qLp^%7|fQbQ7{;O}I!M7n{$lS&eaSQm+xNaJokERsZy zZJ#6y@Zd{ultgSkT#2;lFJau4gvvYIUNU`Y1|9F^=#_|ATV3bYBIB2^y1z=^b*1M{40IgYNYPd>BwH`!sLcc3THM2h4?F}K5?z&2h zd`B4j9hyyn9hZIq2FFI_WjI0|u7eAtN4?Lp^U3USKzd8feg(`sowIyjqa}p9o)k)9 zqrk&FvAqk?PYENi@uyR>d{w6}AmCW8K>j7A*$%D4!Fno5gx2EWKGWxlR^!tlJx8=2 wA$&Kf`#@_FcnuTy6Rk^9#D@~SdGkiiAHw;<;J%X&kpKVy07*qoM6N<$f^M@4bN~PV diff --git a/YuMi/Assets.xcassets/main/tab_message_selected.imageset/tab_message_selected@2x.png b/YuMi/Assets.xcassets/main/tab_message_selected.imageset/tab_message_selected@2x.png index e1db7ff9cb496af3182f421dc89fe4732719844c..3db2ab0a6146c07a5177b045a30bc8e1d1dc4691 100644 GIT binary patch literal 2203 zcmXX`2{_d29+oJ}AtRMk!l=iI?v2}`d#ZzsY)vjImGh(_iXtI_p~0ZT3MTBBBBdb88H8T*0w}s$tA&k%ybA_gV29f{;cSdpx^zkL}+NJ|jS=hk$;F zr9-nXf7X#(LfrBjgow}JKL}ONf2L%@(!EKxBQLlUrXJ2@#XuZl>9acP$XUj*L$^cC zWh4X3b#BRiYCDL}DiSlW2ck*=@oo27nQ`JS;n>eu5ZnRpV<0yi`kpTG@3E(yrl%fE zXCy#Th|p&k65j*49J)Q1xK7hKWMN`9R0jwa>?cDTkQDPZ0RkcuN(h^*$MeXB76G0k z@H!U|IcBN5*UCM%*C-&xBxM0o142Cc9Uzw;+viiqk9B2_^oz(EPi+4b$Kq4KLWlDA}Y7JBPFpP&Tt+~w|TF0cr6oJpdx6!#b@Pt z4@8$h*cXUlz?(dHRR!rO5LXC!;V|vUrN%+8$D-c=l;Sr6`he-X>N^CqNT7#o&E4mu zrNNf~0nd>W{uvN`5P9E6K|TqJiCe@bKx9EUmIZHodo+u%c$*G|p~4rP5Y!IYG4Lm0 zbHQPXR0H9kAhrk+a^T$?Kt#((g4zHvXg)_AZ*AH_LgszMr@4~ua9T0_W3Qc)jRJX zPv6DU5^E(Q+_ejhUP(y_!CzOOMKHr+WQST=UC_}%udS`k&&_ehzp+?tf1~s-FlZ?$ zBoZEv4{~>Rx3#@#g_vJZN2>{iTU&y^u`oW)YHy{{Xq1Em!nP3-kKcNRCn6%oF)`G) zwyBN(df!^%KMK1Sa-~Uj-v7r;29AQGWZ-RV>Y8o_SC0o)1s-Wwg&- zn#=aq<;`!-ryj8TlvGjfa3V>yB-U#BmwKJD-fQ9}`4a_+I<__?&OetXHL-1JFL3?b z(H^RoS(nCn=FL?h_CS=LKKjDNQrFbDe`21Q;A{>mM39Q?OK08Ui*m%eMo0tn`|`&s zEBCwUMrp@?y7jTR=L|g=b?0D_Vi>pQ@^8I`=aXM!!YJ2*@x~u3IueQ~KGHLxxv?1Z zTcvRfsnfz)%QoS7_!)aS`Bf_w_a{v;XT2gKotNsOqcGvLLrS8-cyaS z0-u=u4{>r$jIOT^r;2R5Pjo|0AnsQ8hkE zmQu$P`k%Gs4BOZ9{<}9!&PYrfmtX2F>E2(a$P1U*&ybK*6{T88&SyHgxERq^D>PK2 z4bWuei~eg*uH>iF)fVR-uNWWNcSMkwrB~C~n4N+bX7N?># z&Ubicc+o2CYi`T3zd5?{l2MCF7fV7vGRy3Wg?h*->@RBjFvre5rkM(iFPRp${j`zw zZI(RUo^?*OTOw?0BU+`A7k&8Y9?26a!(|>ZxM+$wWKnSLk2R~LaXE96pGxBMyJpS zXQ>O0sxi!C>YEzD4a7?pDX7iva_Z(CLx;8dfIaqM;=A!wI-+Tm-0|kQ4#roHFP*(gl4zB{X@)Df>>Irr6%XWjw6ocp@h4b zYNFa+&UY1=5<-cQ_{*-+bq=hgQ^c%q^CZOVbEcA>bnwDrG=`n7M{4?I(7%?@V{cJu8ghHRb$8~B=bDI+bE8?z;5=2ZoUAGDDqpwmDND(17|zjiayKH| z%%|BAsSY>^J!2(Vv_EGiMzzBdm|0D=t(L$lbw_sla?2|C!1mmEV#|Tz8p%Z a`<>`?K8ikM)qh6M(8`2PV||L>3h literal 1086 zcmV-E1i|}>P)!k_-MkN(7={koU^se}K+p#7O| z|Fez$rG5UvrvDxqP9GajtA+lpi2ksO{h@gNpm_cs8c(Hu{~Z=hm~a0c8crS>P97Rh z3IIqS8&9*4{k)d{9T`p@8crV@PaPRfARJLEBwnF-|87{W9vMv?8BQ7+P_&l(nt1;o z8crS>P9GXi9vV#@8crM-O&JwU92iI*8c!b^PNjYS9vV&_8%`b@P97RhxRw3Gq5hR^ z|G%C58WT<@Az3CNSXf1uQ9_MvREhdudvx}RZI)+(xn}R3#uWVdva6)j)XT;p?{w?K2Jn}GFy+`&{q)qqZapRo1+9r% zOGQ5!5%k^0y{VXwiB2gZ4f*!n+0xF;$iA_iV*1p!wvvyEhJJfrQ&DF!fRn2L00Le~ zL_t(Y$L-ZwcbY&L2H-d8sbijk>T5TsbJr3yvJs2Mv@Mukv&(_Ub+EzBu=JA+1b z3Xf^EG5C8`kW~5oYAPhu8o#IiI_)o}0pqiy@QO$H=xhvVG1{lEpEjexIz3zwIy|+Y z*^IZh1zIPpld#l@1zK$ZE*09jiu1L1%o@Xw4rk;XDs`yh3f9@k0ON;&#u%_^bzf^5 zxO^1o5)EH_3^r25@#8?psIqB>D@coWDlE6oF1pyDLcV4HcmX zv%eqV+%*Y7rMHJGm}VnQ+(x7CnJ7ocIXb^ZlTAyzf_rRa50j^XCeAePD<|8?^#N2g5=VO~Fzx;8PSE$VP7Q@@%pN55Z)jZ8GD_hq>0Jz8uFn2cTtj3z*f7TVL{ zQBmlgS2|#suRTl)(68uzN(DX#HtA_q2voJ6O%5PXj@ewckaje|sQq*yYjd$Ogj(M3 zoCY9o%)fFiNOUiDT)`plh-2rX3%QQg|0i2RLvd1lt%F56c|yHPYkb@FydWfxQ#0fp zk<*h($07*qoM6N<$ Ef_~@+MgRZ+ diff --git a/YuMi/Assets.xcassets/main/tab_message_selected.imageset/tab_message_selected@3x.png b/YuMi/Assets.xcassets/main/tab_message_selected.imageset/tab_message_selected@3x.png index f213e82fdd67779a708e76d3f1adc8ac54bc400d..643bbd8ea8990bb0602e59a2d1f0dfe2d87eb202 100644 GIT binary patch literal 3540 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 A{Qv*} literal 2240 zcmW+%2{hE*8y?w8e5I&iW*DNZWk1PQQTCY;MwT)a$~sxHL}eGU&NRb}#*(o%$Zo7* zNa;gbC`1cdeIlafcmF^CbKZOJx$pbD&->i>-g9m$0cR;8CM$+OASA4W6=b8Sv<`jV9_`X%Aqo0s|4(UtuCG4LIK^3t&lw0QC`MQ zS)OQl?3Opa9LBI?pvH92c<29k6uyHFI`Uwt{B9=y{&lD(1=QT$lEkF}IW%5Q8V`$y zn+bcW6QQ~-wS;aKzpn^x3vR0-3dbu3*!@n=*}zyk*wQfGNc$@6_p~j6L!qv%H!nVR zwW7kRGJ~c9T{x9-pe7m6BBtq)Gi3=&^0F|=77yGIsxP4UgIr(03Wtamx#h7?VI;(i z`pgOkaEK8CwNm)KC4YHr(8=Ue0zh6MaJI;0M17&aiB~{D1Skjt3K$#~We*c#;e(?H z@YNTP0Y=6ig|vlxD{}~K3qO~KVP|lTi1A1BQzK6X(&A$Hc|N}{FGYq4%_Xg_P6YW) z6zup+=D(*{3RPwOET-E0UZP}0_l%M?97-5W#s0}tI?^fwFI33^!CI`(8NbM$nSp zzA*pk)7!Tr{|*lh@Oqm$6~)x6KE^*6-%U>rcXFB3+hNwG#+quAZ4C{!wx&mq-_Z*| zAcQH_7AKs}_I;8DRSD7=yTHSfK^%jC6Z969*!mw_`yN9lt)n?h)&A;8mH%!_|p2e zsss6uN6vum!(-vMNbYH>kShN$#l?H0)67S8f3XzlB(vf|RuLrTgH9OB?TH=r-Dx(=t=o-iJs}LaY{vj ziW6tmZ7%OZWay24-=@h{w3k|6P%j@hoNf!)T>bo1CGToUZ}N@-o#ED)q(67d)QGXP zV>-VC6Ek-$3J;niZt8FZHCH>>h#r@P;Z)t6R2%HXZmOfo(QW}DrLJDLsRxShWxMi@ zW-lZA5PLmmyCm}~QH>Lea>j@e5ueMK@eUWo_2J}1Mk=Y*8;@G_a^9nbI=u=3Be(CG4&T7Crg-15h`8lbCa~k%lXkf zNAt4R>1kc_Pa_1l}_Jpl!j@*G+Z7zJeXX96jUwi z`A78pyvlhA(kuR=uJv%E)a);UX0ToC*7dGzB@{X8O;o=i-jVNLQv5g6U@ zZxh-vga0WJLO9;1MSBe0GO<^d|EslF7nspRx9pZFKk>QT;zyL|)xujlR$}+L+$fln zF8c5ycliUIbO(t8Bhp=APhC>+a-3kV&96S}OhGyuGMfInmMM+gx1N z|MIKi_v}oyo#$#!aJTh$c5^kINwK8PiTnOYr1G>8Zxf5`oeKCew1#$<@Qko^Y>*KT zeNAq$R{Ka=kF6GSOirBm2DOhG*|^(ubXgr9{MYm0n@=W6Ne4{H*0!pD1>;@IOz8Hb zVXrlV@hyV^`)17~f1gut`C%rKA3Kxe-G6(h&dF3iHD{)R?o@*ci{|%Oietdj6_fdp za&9dkd01g|q0Gxa$?m6#Mp_9l^`f1fz88IX@qU)+nHABb*c6MTE8hO_--56{g|nzR HNs9j;R{&Kk diff --git a/YuMi/Assets.xcassets/main/tab_mine_normal.imageset/tab_mine_normal@2x.png b/YuMi/Assets.xcassets/main/tab_mine_normal.imageset/tab_mine_normal@2x.png index e38a3c52c2375cc258ff3f602d4d7623347cbfb3..c8cdafa7c78f4046c49d744c566e339341dff6eb 100644 GIT binary patch literal 773 zcmV+g1N!`lP)<{*3;G2($v<{)Yj9~*4f$F($v<{)YjA0*3#70($m(`)YZ|{*3#40($v<{($v$_ z)zH<|($?0})Ykw1|JT{u-QVE+{QShm$ocvC_4fAe?(gK~=JE3L>+J2?+}+gH*y!o% z%FE5*;^XN_&T0Sv02OpnPE!CQ@8GwBQwI3=>(0!opqPkpTs$&wZ~Y?x00J#ZL_t(o z!?l=UlcF#ThFdBkxWF!&LV;Gm-T(g=&p8>-HA$=6+viiqabA)(X_5*a*`(!O6}w%b z_GQ{g@haK2Qt*JPw%H33$2tL$q&_|=aoB)|%|V2bNCL^o&|aiD1j*CPYsMQq#hb^N zZ30h{Y&ne&c!3XE;~ie&JwgMkU|*s<+QJWb*j<^x4@l&<81uwO+j`>VKI&2+S=?#R z7lxBtfF!+hCMQj>`VLDPl>c*x%sFTDH;f~*@s|5QU^T)5!NFt5NfVrSQ;vX{G|2>* z>s?m^;!87p0iymJBMClQqZtf7>LjBB{;XNfbnsVz7}n3)L9YzftP4O?7ZC-IbgRZ^ z-;dYj*!Q2SN{9ZggpjN^w(om)UAoKCvi?ZXFfoEf*jQ<(+#7xFj8qnu?7r&ZJnEJ4 zeESg)rP$LV7+z#A6ypwtbw`OJl)&LsF2oKHPJ3{G*ij;__RvxyMd&gKUnzx9fax?# z2N;Ep7@2|%!AD#IK|3%((gH!rl$_aU0y8tkrvZ}A5E>njG(rN+JRo0YppomPM6gT` zH~j)MYP}w5+R5BJnOfkeLY>L%CTk}*hq{z3fhdxUDPAylB$P!pT}GFQFJ5?ikEo!d za193ShHfoJ?PbKR1vbU$01g>~+AU;=*OXk+ji1p03~Kyv3)%+3Eogi*9N(754+#H# zREZy&;>Wl6K{9@%jUTS#$NcyQhxn(D-+Y9Le-8QszVI((b$KY!00000NkvXXu0mjf D7nq3p literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q3?%1AoYnzSjR8I(u0VR@#?+l~YE?gA>?erzXDcKh+P-gG~pBeY6_{DK+Sewe<$+j#B3>*Z_K zdkD{;*=w)=IYIs*k65ac3g3&HK`iID`bJICsLYxgUK-B8z@+Et;uzv_{B79rX>$w& zLKF^9ko@%I?$)3G`L{$Fr3G+X{J6P%?cofKl_I-#vpkXhFH!qy+8IATD}Q^Z*;B7S zaO>T4aCY5c>-AQC-|i&d=WxsOtxqWRd-AL2XWo-1H@~#;tY_bqoUrsx`W5rV$x`n= zZhSbO=U>+Dw~fCYPe}NDjxhEPwN*cdMQ?>C_&2q@Aca{F*WGA?l5 zl_IV+f7Z(tt!9lEW_H<#-+8)Ef60XBG0F#pIV~9^4qV*9(ayFw*w10=;r^C80uJ#7 zA14}!HP`eu7hhIZZ1wt^t$6R1CC~Xyy(z2beGDrsa1v|`>)GyF$?2-I%Sl8g*ve^! zxvx&-S5L0o9U<9UVj1F}E?M{|%I2kncV6xC>szzd#(ezVtz{YWWc|&mnGivy7*1!9Fz4qZdeg8>z z>edo+laHvbywbhZORuYvhdu7>jTDB{8kSBUkL*%EH9wL|E+%2A$2QJc`)d^fKlT1^ Zi`U4^k*rkz=mSh|44$rjF6*2UngFYtk_`X= diff --git a/YuMi/Assets.xcassets/main/tab_mine_normal.imageset/tab_mine_normal@3x.png b/YuMi/Assets.xcassets/main/tab_mine_normal.imageset/tab_mine_normal@3x.png index e34460df691746a46347a731f2ee54ebe1f1ae23..57465a0c0fb3582a700d02204bd1dbcd26712127 100644 GIT binary patch literal 1304 zcmV+z1?T#SP)%q!IB0{MsG7hI$nanf{Ew2cZ&=|55W-h!r@&aBU?Ztggt63GG6r*G(`1Q z<7O(~7jPGg?@ji}AcZ?g2gdv82V)h+LO%?>xCgE18Ts}%0WA^Vc$EP{YjD7+e1%T< z%BZB!2`Q;FfX)~Y)<@_Jyy*w7fDRGvja}J;PU&6UrxP1G#-3a=zkrSrgDWwacjY)% zqBtJ6+vBkiDvp68{S>dq3swY*os`iBQtk?1g%+3R&k7hYk3NwjFsv?41 znIk=;-ubz0E1*zWbc2lfL;Ea;5ws~~bQ4Ltj;QB5A-Q5jL{gCJ7HSpO1A=|Tum=Lq z{hPr$NG-4AWF%!DbpGVMYmf4=EMmzhfAiKKGC@Mf>>>kpgiI2A$n=plObhd1|Kt85 zh~L?n$?TBu={KulN&QM>2=%WnE0u{)Sf-3LI&NMWmxOivNfiNRgfrJZnj8+r*{(bs zl9~|V)U#pbXT)Uk+N%6~r#8;3v8auS=>&RjGTtl?)n{Y<*|-`XB<<6BhmNO&@#KZf zNz0rrWF+B8)3LRgvyoZL9JI_q%dnApzOhCL;m$P^r`2bRng>+lRF9<~0>OyP0rzL; z*Xbmp8sc^v23Jm!^7JKZEH%%Bu!)z zLS{;y0@y?b$+N(xl8wwd`+MX1-nM@88Xjj38Br}=}kSIroPR7}IH={x)TMUTz22nEx65$fZ znz4CuU`R&QA535xHQCj8NHh5mG16t7*2L_dJK5ujW-H(hSN_ih4aO(qZTrT_Qs=$dH4v8*Oa;)VMV{c;>A;GFZTmx>K_ha@cYOtItp4S7pJJvQO9V z(I_gSfKqEV{Cn$}Mekpuk+1;dzrqUAPo`Ts0KkETgK==_foJqCK~@MrhfhrqTUr$W z8vB9`5axyApAM)-I4O*fbCDTkmOoTTa-}dBLFt`n3Dj7|(r1uaz{%JGQ+ZN7LNX3J z^|j2DauM?u=9;N&isnSfZon(ZbfuOgO{mKIiRAnOuMwc4nuHk-TxFaJ&QCVc^sL@~ z$sM&(W>g|f-V7!Y8O!aP+N#{=LUE^Q=ZVpyaAm_Pk&7l-m!K(@a)lyI8EhgA+8m$g zPO7M=W1)uAoRj%oBC58T&ecz+pbY{l^L4N2CXlPqX+?Swq-d*Xr97BX&~HWBv-qlw zVwJ&bEnI_knAN!+=-l_3-ja04+a*yf8(_XAXbZEpnWk*VQ)|*GQRFCt#r#OStx3Cl zomEpEvQcZ&(WC6EdsJH(+!tE)$Apu%rBwA2i7fdAX_EbilPYc6>jvFkF3qFknpCuS zbGcv7nOK?hBr>XD?q3Nn6&PozXc-yCV)FVB^AXSehE>Y-km?!@-KTy*^rrRHiAtu{9L+w6^ju`X$zYq>wkY+FElJS#Rt93_1I4D zZ#z))PxqIJldr-1Lsx3|T3+Si(nDJ54W%?2x4$4dM@SPjC_Fmg9}tdnW#h}oA^1l) z7Pp{8$;y@kegSB!Ab|eMBn)FDhb|r;|&%50C}ex?t&xmoB#j-07*qoM6N<$ Ef*_>DrvLx| diff --git a/YuMi/Assets.xcassets/main/tab_mine_selected.imageset/tab_mine_selected@2x.png b/YuMi/Assets.xcassets/main/tab_mine_selected.imageset/tab_mine_selected@2x.png index 0fa93c24bbc639fd28f3f07c181d701e271de3d5..c47887308d25a141d4eb683ec4e3eb3cc9425569 100644 GIT binary patch literal 2301 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 xm285ilgeD-pi}YRv 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 diff --git a/YuMi/Assets.xcassets/main/tab_monents_normal.imageset/tab_monents_normal@2x.png b/YuMi/Assets.xcassets/main/tab_monents_normal.imageset/tab_monents_normal@2x.png index de7f4392df887b9533f0455052521dcc9627bb05..df659038086238eb004e28c55493518a1555bfa2 100644 GIT binary patch literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo3?%u_CN}`7-Tb1*Pt^?7fE7z`E zxq9o?t;<)g0ohP=6~+LG0M!6hUIS_Yv!PO#uUrKxzIgTO#fuj&T?MMSdhznLi7x#ZZxM_n8cg51`DrZNof`4|hRSXP_ z?>$`{Ln02ZopH11kO7aY?<`&q502c00o%0B9s2fvet4QyPxhP`Rg32n+l~7sq?}wN ztIr!=Xr?$T<)fC5?ZxSjGbUaXzL`|=X5kEV;jENNXRNjO=Ck~;;gEaZD{*hfiyz6; zBkpYMmpRvCWmtSmcClt@id9zen-%Q4(~etzRoYUZaco(#^WL9^NnZLNL}Jsu^bJb4 z$jrXzeWqrigfP2&%=2awugK@US2n5i@_%*oH&rig*z@A*kAj+sZWEokF8#=|={O^q zayjr>l}(YDtzP|JJxBJ3{gXPZv-i%wwr9z*|1A4veyC(W^W^`wsXFf_oe2}-d^mA! zi_FBb$s*6oJhcw#O?u?Az06Z1%wds;i|g(b%_N0Du3Zf?jwl(aE^B(hqcV|Wg3Hu5 zq8>~SolgGzSj?)TH!Y-}ujJH3mioSst-W^a?Aw486ZgL)(QCnsm+j0Zo#lDGGc7AU zbJYOI{%#mFVFwdwZOY;A$Y(qO4owztf)zMXoY+IT)LZjZ{t^?`9l z?BZ4nF6osRL@BJhmBH91;}ANF{ovziD|bwLwj-+llj4n{k7fYodVk=wT&+XA7W# zfF??o1o;Isd^ftXt2NSHLy2qC(v{ObzIk~!EyzlEc7@r=W(Nia#!^og#}JR>Z^Ld+ zYgXWi`Op@0<<_dN|LaS7cXV55zCGzYf0nvm!U+{gJ^T3IGfYDhH^;5C+w6LE5AW(Z zQGCl{zKXq>r<-u|uj-m};@3V|^=e!1&&%+(H9foJblHb_>wF$^?SEk;H}~<;>h9+| zu5C6--~aK??G&5R$IJ4x1UE0)x%!#<*QseYZC>{kJd>1lKGC;2*U!e;re~!_{j&Ei zs;BrrEfHPO!t*WJGIfFft#eBn+pf(ieZAs+P2RPCyq=uzO8PWDPwd|G?gzij$~s;H z*%@NFS=>wI8nO>+u9|mMXmYlr-L#2ElkLx`iA`@!n=@|6(OH&~wH zXKk2tS^6{s^U1~&%!TO;tV+j|Q`fQy$Z7v{oE9(p>9kj!?J50~pTY|DB~Q-J`I9)+ r{^_Ul&3|?){a5%HziEB#sXE4F5woceT;JsZV~N4j)z4*}Q$iB}>!A;L diff --git a/YuMi/Assets.xcassets/main/tab_monents_normal.imageset/tab_monents_normal@3x.png b/YuMi/Assets.xcassets/main/tab_monents_normal.imageset/tab_monents_normal@3x.png index ad47fd94dda71b65c5f80c4b2b73809255c102f3..12d00d1bb4d7cb01c1fae1c2e743a5c3e8f63e34 100644 GIT binary patch literal 1220 zcmV;#1UvhQP))z;S5($v=f|Nqd^)YR74+T7m#{r%nF;pFA#*4WzD+1v8+^WWj(`T6F;o{`i*xH29)Di#y04Q`)PE!E$^`-963I$Mzfk8kRb}0Di}>M#(1(*?>Ri^_fhH`Hk-Nm~kn z@Bd==%JEo~0FyNI`u+7Bztb?uOeVvK1hZCW-0=Fhz60R+w|%cM?zCnBvq-hs_9{*$ zd72>Xz$E1|b1GiDS+yj&8eBVopaj9W9$Xbx1k<)J5l({AZ%+%Y-izmQgtH)by%+P< zs&o;EV7Fqnc6av@w2=3A+LG4DO+k~?9X;z=YBylSO-*N?G&mT-8{~cTrzgP}+51DY zOdKeLGoe@(5(*+0=PmUF3X{~&S%wG}z~O1jBL^$+$CE3DUMf8CDcOck^A*dMYUqNh3ZkQ zTV*epyQ*jux*DO{6Wy<%4m^ZI)}c0QI0U`mQ!{l{ku3Bz;$0PN(@#yC6Mh-vUx&9p zH9jgdOB2mfp+WydG)KZjBckImJwTNvG(x4p!7k5S!(}ya{gHQ??xi(u^CQmS(i&(p z77X#y8XN{}Rx$sY)r$5tl^JU}rWz5yFKHU5#X6apMyxSP1Wl85*jSoqR+}^e$cP~z z$E?BiH6q6RKq6>(gLx@klP?$Spayj6v3^3<=$Qp-%j%E`<&L$*lKu?oE4lXq`ltokL;6%_hj#db8*kc>g zHNH+jzoDWgp#`+g_T23K88SiFBz=v;M)3S<6|Zs&>9C<6oo~_C)hc&Tk4}0b*hae# z;hTK-lM?|wt%;q5EAEJdv_?bU`TRhuRWv_$=v3{5M=C#~* zcTU}Y^S)l{Q$+a>EB2p>vPn6QUgbRD{r?9^d(W%CoL#LxZ&eLHgH1&p)n#`0MeblN}Y;bH&862BW0~=#-E@=#|_)y>c i*ihe`Hq=+rh~i(fQ3cSx%BNKT00004RKMbJ}w;aUfHs+SV}=MC*8yb z72^N^0?tW9K~z}7?O558sxS~WVG|6i0?IgQ7XJSiuOxuX%?3jiWlh3ny8N=w?9-7$q1#o`x}@48%d^u7GrW58#Jn7 zr!_~Tth}jTEoIzjJN4bGmSud8N5De~^YrSt uG>7Hk^>4pG z3AdPzBroCd=g(t!83RM(+g!|VhwoI|XDI0l(*A9*1y(bEHk<84Q6v&hpc1 z1vQkJhGj^EsP$&}dV@VNKeA}f??V8saZO?|^su+DzdwlObdIcH;EUS#t1t8ZnpU%Tm~;35hD~Ws5?mHKwq;0!Utr#1(tC~ zNT798l=t&)k)6dXovT94BwAQ_2?y2W!S#9~7E79YB?rxO4bcH7ODhZ!Blqc-6EI{V zz#WZ?YnD5F>YX(|mbvhWfqK_l_mW%GoGMBb`zlVfA}tN&v56^GEqpAsQY{#-V_L|s zdZ^3r{|NDF$qL1!ly;HHHIS#AjLlh!P~H)ssY<2YtTxrS3F+8EYuTT+TT7)>#Fx9O zG0VqjRHk|5B#~kwZ=uXla)*zX#jc!V)`6_IA>+ z=Q>dC28MQGZ+v&cP-yZ}ZhZC@UELccD^-i$=rFPV*t5|AZT(SlqeJidFuaVnac-LRew|PWZ|JOMp{;vH4yfmLR TjEBJR00000NkvXXu0mjfO0?bv diff --git a/YuMi/Assets.xcassets/main/tab_monents_select.imageset/tab_monents_select@2x.png b/YuMi/Assets.xcassets/main/tab_monents_select.imageset/tab_monents_select@2x.png index 0014b8495bb43bb6efdcefdc03214b090bb44806..111b2d0f302412f260979e6347a315bcd5ecaec9 100644 GIT binary patch literal 2034 zcmX9;2{_bS8y}yNCKKw`)zs}tw5Xe;rj7b6V~tWKX+bwv$x^tk8e21zEHg;LAX&y( zvWJ<&-d?s=XuV1&ig*U^LyX-cg}N?+%7smz)&y<1cEp@!mj`; z{O8ox1g!3$FA4e!49=f+r*Dh5L-yF*Oj6`MF<<9aql>G2*F8e6?gOl8qWvPyNjVNC14?uqu(F zoQhy2_bLHQ?{jV%S&>7M4acyni$$Z+tXJ*wXP<$C;)TGquMZgs14=@r1VGYaIX@W! z*8tm-!tH;?nF(b9shjeJD8T0NXTn#q-pOdutW>fhy<3idEB@y%=IaLOKs=|WSXfXm z$$YOEL$Z>3mGn>su|U|8EdXGX5lo;efRmKPL(x>7>AX0qD!ETJ6T$%El&4%wkD@1q zN5*nLByqD_W!WTYLms~Y$Nv_vT2v=p2w;>GL_;WcPP2?2#%#~vzvz-m+$4{ zNEUEwfUwmiqS_*14~E;D$ZgCMv}Owi(d>6w{P!9B%yxNhleD~C-0_0q*SSKEwW02sNuD+JC*k#gkHLsW%lM8850ZrOKl2lcSs!K&J`2uPI zzcZ7E`|pJu;IRgWU%BWGI-teAYGTBj9U8iN(ikikF1I$-7p7u;yb(rPQi)K&W~{BQ zEDa8}HZ_(O7v^D-lau1mNF>7MyyfxZn`APnRKVwQIcu}CRO;YhcXxM3OLKEw9Ufm; zkdu~%d5S_sMLrI>?R^bl4NE!a>Hz|+OL2l*BRqRvWqp4#dRwoz_K0sn+y6(@NU>il zWXDMZbI&gxbVEs<##Z{w_oIf{`;mB}();|;jyG(t+D96Ec;*o=%Xj{Z&5}cQB@Qr? zof=5jqUe1ovR?{g@0Z`E`poIk z9^|;p!A{oRXnLfs_Z!#@DbN)q9c1p_2^Jz`C{4OFUi_=wzj)Y zHy86W!5)}68a%#Y(ek4wao(A!Si(fVh=3+eg~)?!hQjV*JUpO}CTlE0K>F9HyDvGO zZi-4cR?=AX$=lo3KHs8APX0ky(usn=`!IN8P3Ob5SpI%!OGd`U{G4qQ?hD+J6RBM2 zsY|!oBXMgFx*cQtkr4O_6#R`d|5b|Hk#Z6jRvel)c{)EM!*Up6d_?bs12%JUF|fkD z;?5x=Bt|758XLf6>2mi;D|>tWD{i5LjG;^G_>QE`a4f>-#&n3XbI3nhcF=Q)`q0h@ z2J6Y*u2XQo*2dlpVy8Q>xC-q)elIl@AvQSfJ+#jvQ6S1CgbEfZzx}4+o`K_)#RYd5 z?sc`_b&llQE8N(Bv4-p-^^I~QRH75D3JE(m6ub_j?B1)7?ZRGgmeK);)1~VF&b_edQw8ynfs350Y}RQ<`WvP<5m%$e+v%^Zj5u z8;FL}PH!1;^m+g83}z{Ubd0>*W_xZ0P`j15Tdh^Fq+8^8>c0zZ%m0Hu zE?3%19-WV)@cJors4DzDJO(maDZWe-@ZPa71Hpz+Y|j z!s;ClJG5O8*bi_xV;Tlp-3qZxJ=HTUTh<6Lv&Kd_?=$yR%C?xD!4q#LP-reoB29EGBM#`@_H*LuT^(LgU|JT^vM(HmvwCJ z*9Ok{$;IQFdGY@Kd&_OkZ{y(G>+deMr;VO)gI`eX9V;UX9nhV%=KDr(bUZgG&geHC zK92RjrCZmQUj;GuK5HAa(U@fo*SrL7gX2uf^zZ0UwXf<)5g}EEk^P!4kzg_@A;WWS zBzJO(60j%E_w&;_7r55Vq|yXWu#Wl0!^8=_U;|J6A6nOotF$QLW=?tDKl=8x(Gfjc zHxW#HdL4~SU5q}h-yV93Z4>zWsj-9f5y(X7cmwpP%dual%9wgL;vIB?H&L$?hU)ra z`>|jYKRnlhpjCU>Hz?>pU*Ijj+*gT7ykATiNy#RcD=~HlRGKET_2*G#bz6Y{5aeWc K5nf|+JMMp;#Ej?w literal 1269 zcmVlMO{vR7pn{)rVl>fVy{k)j{pLhSVjQyQ;{-k{Wt%v`!j{c&1|D}HZsDb~rkp8ZS z{lA?3mTmtY8&0Z&{vH}m9ve=>p#B~jP8=Cdv5Ng598r~P|C(|C!JhuZp#7_a|G%65 z8X8TRZ~v5O|Gk_2m~a0d8c!Y@PnvN49~w^|8%`e^P9Gais)YU?8c!b^P97Oe9~n*` z8c!V=P9GXh9UV{`8&Rf!{{R40v5Wu0pZ&w2{lS|5JTh??7e*o-Q%*bK#qF{;h}ps)PQh zfc~$F{=1j{v5fqaYX8EY{I`?)qkjLvp!}kD|42E8OFW5#WY&yp;gN3Sk#gL!jQX{X z{~sGq2lv(b0001cbW%=J0Mw56D|}Rw6T_EQaUs-BNGM&q-{G9+zb5l^SPRpgLYq5CKd|{>ZhZF3i#^a z-`?Kd-PqL7&dA8dzPqxjs+NFaUsq5^MI#>W>e$uLwKX&bbQn$m00Om1L_t(Y$L-d6 zQ`$fj0PrWNwzS$-TjkQ8&&3=TT@mVNkkvj`!HT|XcrgbF}u>#gvGVq0Z@s{{c;;ZE@K|C0|MHELxN8Z*I7+Y@9pli}ZOH{wScDR$*S$hFm5%@C4Nc5@J9 z2&q@3jC;je7r64FVxn@m6rcn z4di)q`9RG>BVjmxsWMFz)3wMkgz2#d)Lb+YfulZZVxo^(Cq$gEuNpmq2o1PEjSXrP zI){fp2>atAacP)R;++s>!>W^b*jckA^2YaXV}~LUmul>(`aK{Lw|j0GMX7jjPWt=D z#`>8xk+;SoG{&8X!NIrV%qYx=I=78#XX19?2Kdt@B>8x5%yen|6%Bw}PBwINvn+38 zrd!J(S6dD@dBMQZ6DDU3^$JRp&+9!_iMe(rnVfCM63UPCALPr9j=8xGU698cw^oS#r-VzaU{L f^($El9^99I!UI-ROta-_00000NkvXXu0mjf5*UXF diff --git a/YuMi/Assets.xcassets/main/tab_monents_select.imageset/tab_monents_select@3x.png b/YuMi/Assets.xcassets/main/tab_monents_select.imageset/tab_monents_select@3x.png index f24e528604bcb18b6d174f4ab79e8cdc9086847e..790c9e93cc8f6c6f06d8105671851c09309527fe 100644 GIT binary patch literal 3277 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 LNkvXXu0mjf2sPY= literal 2701 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 diff --git a/YuMi/Global/YUMIHtmlUrl.m b/YuMi/Global/YUMIHtmlUrl.m index e204b886..79d135dc 100644 --- a/YuMi/Global/YUMIHtmlUrl.m +++ b/YuMi/Global/YUMIHtmlUrl.m @@ -22,7 +22,7 @@ NSString * const URLWithType(URLType type) { @(kGoldEarningsRecord) : @"modules/myincome/index.html#/GoldLog",///金币收益记录 @(kCandyTreeRuleURL) : @"modules/rule/newWishingWellRule.html",///糖果树规则 modules/rank/index.html#/wishingWellRule @(kChannelUrl) : @"modules/%@/index.html?channelType=%@&deviceId=%@", - @(kLUDOUrl) : @"molistar/modules/gameRank/index.html"///LUDO排行榜路径 + @(kLUDOUrl) : @"modules/gameRank/index.html"///LUDO排行榜路径 }; NSString * newUrl = [newDic objectForKey:@(type)]; if(newUrl != nil){ diff --git a/YuMi/Modules/YMMessage/Model/AttachmentModel.h b/YuMi/Modules/YMMessage/Model/AttachmentModel.h index c9a50cef..ba99a90d 100644 --- a/YuMi/Modules/YMMessage/Model/AttachmentModel.h +++ b/YuMi/Modules/YMMessage/Model/AttachmentModel.h @@ -671,7 +671,7 @@ typedef NS_ENUM(NSUInteger, CustomMessageTypeRoomGame) { Custom_Message_Sub_Room_Game_Match_Success = 1091,//匹配成功 Custom_Message_Sub_Room_Game_Match_Fail = 1092,//匹配失败 - + Custom_Message_Sub_Room_Game_Early_Exit = 1093,//提前退出游戏 }; ///家族新协议 diff --git a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m index 5cc51624..013a4b7d 100644 --- a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m +++ b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m @@ -90,7 +90,10 @@ _itemList = itemList; self.collectionView.scrollEnabled = _itemList.count > 2; self.collectionView.hidden = _itemList.count == 0; - [self.collectionView reloadData]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.collectionView reloadData]; + }); + if (_itemList.count == 0){ [self.collectionView mas_remakeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(0); diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.h b/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.h index 71b51f05..d846c1d4 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.h @@ -16,6 +16,8 @@ NS_ASSUME_NONNULL_BEGIN +(void)startMatchGame:(HttpRequestHelperCompletion)completion roomId:(NSString *)roomId mgId:(NSString *)mgId gameMode:(NSString *)gameMode; ///得到房间详情 +(void)getRoomGameDetails:(HttpRequestHelperCompletion)completion roomType:(NSString *)roomType; +///退出房间 ++(void)closeRoomGame:(HttpRequestHelperCompletion)completion roomId:(NSString *)roomId; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.m b/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.m index 93c6653d..e2097ad2 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/Api/Api+MSRoomGameApi.m @@ -20,4 +20,8 @@ +(void)getRoomGameDetails:(HttpRequestHelperCompletion)completion roomType:(NSString *)roomType{ [self makeRequest:@"chatRoom/getByType" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__,roomType,nil]; } +///退出房间 ++(void)closeRoomGame:(HttpRequestHelperCompletion)completion roomId:(NSString *)roomId{ + [self makeRequest:@"miniGame/nav/close" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__,roomId,nil]; +} @end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameModel.h b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameModel.h index 6dbac76f..c86d3132 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameModel.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameModel.h @@ -48,6 +48,7 @@ typedef enum : NSUInteger { @property(nonatomic,copy) NSArray *scores; @property(nonatomic,copy) NSString *configJson; @property(nonatomic,assign) MSRoomGameInfoModelType matchStatus; +@property(nonatomic,copy) NSString *matchRoundId; diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.h b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.h new file mode 100644 index 00000000..6ba0432b --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.h @@ -0,0 +1,20 @@ +// +// MSRoomGameResultsModel.h +// YuMi +// +// Created by duoban on 2024/5/30. +// + +#import "PIBaseModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MSRoomGameResultsModel : PIBaseModel +@property(nonatomic,assign) int rank; +@property(nonatomic,copy) NSString *uid; +@property(nonatomic,copy) NSString *avatar; +@property(nonatomic,copy) NSString *nick; +@property(nonatomic,strong) NSNumber *winNum; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.m b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.m new file mode 100644 index 00000000..41c0df41 --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSRoomGameResultsModel.m @@ -0,0 +1,12 @@ +// +// MSRoomGameResultsModel.m +// YuMi +// +// Created by duoban on 2024/5/30. +// + +#import "MSRoomGameResultsModel.h" + +@implementation MSRoomGameResultsModel + +@end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Model/MSTabbarRoomGameModel.h b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSTabbarRoomGameModel.h index 208e0022..4b4b3175 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/Model/MSTabbarRoomGameModel.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/Model/MSTabbarRoomGameModel.h @@ -26,5 +26,6 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic,copy) NSString *modeName; @property(nonatomic,copy) NSString *ruleUrl; @property(nonatomic,copy) NSString *ticket; +@property(nonatomic,copy) NSString *roomId; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.h b/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.h index 168eff2c..5ad0caab 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.h @@ -20,6 +20,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)enterNIMRoom:(NSString *)roomId user:(UserInfoModel *)userInfo; ///退出房间 - (void)exitNIMRoom:(NSString *)roomId; +///退出房间 +-(void)closeRoomGameWithRoomId:(NSString *)roomId; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.m b/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.m index 736b603c..7935d2f4 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/Presenter/MSRoomGamePresenter.m @@ -118,4 +118,10 @@ [[NIMSDK sharedSDK].chatroomManager exitChatroom:roomId completion:nil]; } +///退出房间 +-(void)closeRoomGameWithRoomId:(NSString *)roomId{ + [Api closeRoomGame:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + + } roomId:roomId]; +} @end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.h b/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.h index 58b0ab7e..bcf1627e 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.h @@ -6,11 +6,11 @@ // #import - +#import "MSRoomGameResultsModel.h" NS_ASSUME_NONNULL_BEGIN @interface MSRoomGameVictoryCell : UITableViewCell - +@property(nonatomic,strong) MSRoomGameResultsModel *resultsModel; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.m b/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.m index 97a2db87..0b522f13 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/Cell/MSRoomGameVictoryCell.m @@ -80,6 +80,18 @@ make.trailing.equalTo(self.coinView.mas_leading).mas_offset(-kGetScaleWidth(5)); }]; } +- (void)setResultsModel:(MSRoomGameResultsModel *)resultsModel{ + _resultsModel = resultsModel; + _rankView.image = _resultsModel.rank == 1 ? kImage(@"ms_room_game_victory_rank_first"):kImage(@"ms_room_game_victory_rank_second"); + _avatarView.image = nil; + [_avatarView loadImageWithUrl:_resultsModel.avatar completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { + self.avatarView.image = image; + }]; + _nameView.text = _resultsModel.nick; + _bgImageView.image = _resultsModel.rank == 1 ? kImage(@"ms_room_game_victory_bg_first"):kImage(@"ms_room_game_victory_bg_second"); + _bgCoinView.image = _resultsModel.rank == 1 ? kImage(@"ms_room_game_victory_coin_bg_first"):kImage(@"ms_room_game_victory_coin_bg_second"); + _coinNumView.text = _resultsModel.rank == 1 ? [NSString stringWithFormat:@"+%@",_resultsModel.winNum.stringValue]:_resultsModel.winNum.stringValue; +} #pragma mark - 懒加载 - (UIImageView *)bgImageView{ if(!_bgImageView){ diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/MSRoomGameVC.m b/YuMi/Modules/YMRoom/View/RoomGame/View/MSRoomGameVC.m index 6b5a90b1..82a2869e 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/MSRoomGameVC.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/MSRoomGameVC.m @@ -10,14 +10,19 @@ #import "MsRoomMessagChatHallView.h" #import "MSRoomGameMsgView.h" #import "MSRoomGameSendMsgView.h" -#import "XPRoomLittleGameContainerView.h" +#import #import "MSRoomGameVictoryView.h" #import "MSRoomGameQuitGameView.h" #import "MSRoomGamePresenter.h" #import "MSRoomGameProtocol.h" #import #import "AttachmentModel.h" -@interface MSRoomGameVC () +#import "MSRoomGameSendTextView.h" +#import "MSRoomGameView.h" +#import "MSRoomGameResultsModel.h" +#import "Api.h" +#import "XPIAPRechargeViewController.h" +@interface MSRoomGameVC () @property(nonatomic,strong) UIImageView *bgImageView; @property(nonatomic,strong) MSRoomGameHeadView *headView; @property(nonatomic,strong) MsRoomMessagChatHallView *chatView; @@ -25,7 +30,9 @@ @property(nonatomic,copy) NSString *roomId; @property(nonatomic,strong) MSRoomGameSendMsgView *sendMsgView; ///小游戏的容器 -@property (nonatomic,strong) XPRoomLittleGameContainerView *littleGameView; +@property(nonatomic,strong) MSRoomGameView *roomGameView; +@property(nonatomic,strong) WalletInfoModel *coinModel; +@property(nonatomic,assign) BOOL isShowResults; @end @implementation MSRoomGameVC @@ -37,7 +44,7 @@ [[NIMSDK sharedSDK].chatManager removeDelegate:self]; [[NIMSDK sharedSDK].loginManager removeDelegate:self]; [[NIMSDK sharedSDK].conversationManager removeDelegate:self]; - + [[NSNotificationCenter defaultCenter]removeObserver:self]; } - (void)viewDidLoad { [super viewDidLoad]; @@ -48,22 +55,32 @@ [[NIMSDK sharedSDK].chatManager addDelegate:self]; [[NIMSDK sharedSDK].loginManager addDelegate:self]; [[NIMSDK sharedSDK].conversationManager addDelegate:self]; - + [self getCoinNum]; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(appDidBecomeActive) name:@"kAppDidBecomeActive" object:nil]; + [self networkReachability]; +} +-(void)getCoinNum{ + NSString * uid = [AccountInfoStorage instance].getUid; + NSString * ticket = [AccountInfoStorage instance].getTicket; + [Api getUserWalletInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + WalletInfoModel * model = [WalletInfoModel modelWithDictionary:data.data]; + self.coinModel = model; + } uid:uid ticket:ticket]; } -(void)installUI{ [self.view addSubview:self.bgImageView]; - [self.view addSubview:self.littleGameView]; [self.view addSubview:self.headView]; [self.view addSubview:self.msgView]; [self.view addSubview:self.sendMsgView]; + + } + -(void)installConstraints{ [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; - [self.littleGameView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.equalTo(self.view); - }]; + [self.headView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(kGetScaleWidth(22)); make.leading.trailing.equalTo(self.view).inset(kGetScaleWidth(0)); @@ -82,48 +99,153 @@ - (BOOL)isHiddenNavBar { return YES; } - +-(void)appDidBecomeActive{ + if(self.headView.roomGameModel.data.roundStatus == 0 && self.headView.roomGameModel.data.matchStatus == 1){ + [self.presenter getRoomGameDetailWithRoomType:@"0"]; + } +} +///网络监听 +-(void)networkReachability{ + @kWeakify(self); + [[AFNetworkReachabilityManager sharedManager] startMonitoring]; + [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + @kStrongify(self); + switch (status) { + case AFNetworkReachabilityStatusUnknown: + + break; + case AFNetworkReachabilityStatusNotReachable: + + break; + case AFNetworkReachabilityStatusReachableViaWWAN: + case AFNetworkReachabilityStatusReachableViaWiFi: + { + if(self.headView.roomGameModel.data.roundStatus == 0 && self.headView.roomGameModel.data.matchStatus == 1){ + [self.presenter getRoomGameDetailWithRoomType:@"0"]; + } + } + break; + default: + break; + } + }]; +} +#pragma mark -MSRoomGameViewDelegate +- (void)getGameRsultsWithList:(NSArray *)list{ + if(self.isShowResults == YES)return; + self.isShowResults = YES; + MSRoomGameVictoryView *victoryView = [[MSRoomGameVictoryView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + for (MSRoomGameResultsModel *obj in list) { + if([obj.uid isEqualToString:self.headView.mineModel.uid]){ + obj.avatar = self.headView.mineModel.avatar; + obj.nick = self.headView.mineModel.nick; + + } + if([obj.uid isEqualToString:self.headView.rivalModel.uid]){ + obj.avatar = self.headView.rivalModel.avatar; + obj.nick = self.headView.rivalModel.nick; + } + obj.winNum = obj.rank == 1 ? self.chooseGameModel.scores.firstObject : self.chooseGameModel.scores.lastObject; + } + victoryView.delegate = self; + victoryView.resultsList = list; + [TTPopup popupView:victoryView style:TTPopupStyleAlert]; + [self.presenter exitNIMRoom:self.roomId]; + [self.roomGameView handleSelfInExitEvent]; + [self.roomGameView destroyMG]; + self.roomGameView = nil; + [self.headView setDataInNull]; +} +#pragma mark- MSRoomGameSendMsgViewDelegate +- (void)clickSendMsgAction{ + MSRoomGameSendTextView *sendTextView = [[MSRoomGameSendTextView alloc]initWithRoomId:self.roomId userInfo:self.userinfo]; + [self.view addSubview:sendTextView]; +} #pragma mark - MSRoomGameProtocol -(void)getRoomGameDetailsSuccessWithModel:(MSRoomGameModel *)model{ self.headView.roomGameModel = model; + self.headView.userInfo = self.userinfo; self.roomId = model.roomId; [self.presenter enterNIMRoom:model.roomId user:self.userinfo]; + if(model.data.matchStatus == MSRoomGameInfoModelMatchSuccessfully && model.data.roundStatus == 0){ + self.roomGameView.gameModel = model; + if(self.roomGameView.superview == nil){ + [self.bgImageView addSubview:self.roomGameView]; + [self.roomGameView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.bgImageView); + }]; + [self.roomGameView onRoomEntered]; + } + + + }else{ + [self.roomGameView handleSelfInExitEvent]; + [self.roomGameView destroyMG]; + self.roomGameView = nil; + [self.headView setDataInNull]; + + } } #pragma mark -MSRoomGameVictoryViewDelegate - (void)closeGameAction{ - + self.isShowResults = NO; + [self quitGameActionWtihIsColse:YES]; } -(void)rematchGameAction{ - + self.isShowResults = NO; + if(self.coinModel.diamonds.integerValue < self.chooseGameModel.ticket.integerValue){ + TTAlertConfig * config = [[TTAlertConfig alloc] init]; + config.message = YMLocalizedString(@"XPTreasureFairyViewController5"); + config.confirmButtonConfig.title = YMLocalizedString(@"XPTreasureFairyViewController6"); + [TTPopup alertWithConfig:config confirmHandler:^{ + XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init]; + rechargeVC.delegate = self; + [self.navigationController pushViewController:rechargeVC animated:YES]; + } cancelHandler:^{ + + }]; + return; + } + [self.presenter startMatchGameWithroomId:@"" mgId:self.headView.roomGameModel.data.mgId gameMode:self.chooseGameModel.gameMode]; +} +-(void)startMatchGameSuccess{ + [self.presenter getRoomGameDetailWithRoomType:@"0"]; +} +#pragma mark -XPIAPRechargeViewControllerDelegate +-(void)paySuccess{ + [self getCoinNum]; } #pragma mark - MSRoomGameQuitGameViewDelegate - (void)quitGameAction{ + [self quitGameActionWtihIsColse:YES]; + +} +-(void)quitGameActionWtihIsColse:(BOOL)isColse{ + self.isShowResults = YES; + if(isColse == YES){ + [self.presenter closeRoomGameWithRoomId:self.roomId]; + } + [self.presenter exitNIMRoom:self.roomId]; + [self.roomGameView handleSelfInExitEvent]; + [self.roomGameView destroyMG]; [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark -MSRoomGameHeadViewDelegate - (void)clickQuitGameAction{ + MSRoomGameQuitGameView *quitGameView = [[MSRoomGameQuitGameView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; quitGameView.delegate = self; [TTPopup popupView:quitGameView style:TTPopupStyleAlert]; -// MSRoomGameVictoryView *victoryView = [[MSRoomGameVictoryView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; -// victoryView.delegate = self; -// [TTPopup popupView:victoryView style:TTPopupStyleAlert]; - - } #pragma mark - NIMChatManagerDelegate - (void)onRecvMessages:(NSArray *)messages { for (NIMMessage * message in messages) { - - // 非房间内消息不处理 if (message.session.sessionType != NIMSessionTypeChatroom) { continue; } - if(![message.session.sessionId isEqualToString:self.roomId]){ - continue; } if (message.messageType == NIMMessageTypeNotification) { @@ -146,16 +268,44 @@ if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) { AttachmentModel * attachment = (AttachmentModel *)obj.attachment; if(attachment.first == CustomMessageType_Chat_Room_Game && attachment.second == Custom_Message_Sub_Room_Game_Match_Success){ - [self.presenter exitNIMRoom:self.roomId]; MSRoomGameModel *model = [MSRoomGameModel modelWithJSON:attachment.data]; + [self.presenter exitNIMRoom:self.roomId]; self.roomId = model.roomId; self.headView.roomGameModel = model; - [self.presenter enterNIMRoom:model.roomId user:self.userinfo]; + [self.presenter enterNIMRoom:model.roomId user:self.userinfo]; + self.roomGameView.gameModel = model; + if(self.roomGameView.superview == nil){ + [self.bgImageView addSubview:self.roomGameView]; + [self.roomGameView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.bgImageView); + }]; + [self.roomGameView onRoomEntered]; + + } + + + }if(attachment.first == CustomMessageType_Chat_Room_Game && attachment.second == Custom_Message_Sub_Room_Game_Match_Fail){ + + MSRoomGameQuitGameView *quitGameView = [[MSRoomGameQuitGameView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + quitGameView.delegate = self; + quitGameView.isNormalFail = YES; + [TTPopup popupView:quitGameView style:TTPopupStyleAlert]; + + }if(attachment.first == CustomMessageType_Chat_Room_Game && attachment.second == Custom_Message_Sub_Room_Game_Early_Exit){ + if(self.isShowResults == YES)return; + self.isShowResults = YES; + NSArray *list = [MSRoomGameResultsModel modelsWithArray:attachment.data[@"results"]]; + MSRoomGameVictoryView *victoryView = [[MSRoomGameVictoryView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + victoryView.delegate = self; + victoryView.resultsList = list; + [TTPopup popupView:victoryView style:TTPopupStyleAlert]; [self.presenter exitNIMRoom:self.roomId]; - [self showErrorToast:YMLocalizedString(@"MSRoomGameVC0")]; - [self dismissViewControllerAnimated:YES completion:nil]; + [self.roomGameView handleSelfInExitEvent]; + [self.roomGameView destroyMG]; + self.roomGameView = nil; + [self.headView setDataInNull]; } } @@ -168,7 +318,7 @@ //发送消息成功回调 - (void)sendMessage:(NIMMessage *)message didCompleteWithError:(NSError *)error { // 非本房间不处理 - if([message.session.sessionId isEqualToString:self.roomId]){ + if(![message.session.sessionId isEqualToString:self.roomId]){ return;; } if (message.messageType == NIMMessageTypeText) { @@ -203,14 +353,16 @@ - (MSRoomGameSendMsgView *)sendMsgView{ if(!_sendMsgView){ _sendMsgView = [[MSRoomGameSendMsgView alloc]initWithFrame:CGRectZero]; + _sendMsgView.delegate = self; } return _sendMsgView; } -- (XPRoomLittleGameContainerView *)littleGameView { - if (!_littleGameView) { - _littleGameView = [[XPRoomLittleGameContainerView alloc] initWithDelegate:self]; - _littleGameView.delegate = self; +- (MSRoomGameView *)roomGameView{ + if(!_roomGameView){ + _roomGameView = [[MSRoomGameView alloc]initWithFrame:CGRectZero]; + _roomGameView.delegate = self; + } - return _littleGameView; + return _roomGameView; } @end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/MSTabbarRoomGameVC.m b/YuMi/Modules/YMRoom/View/RoomGame/View/MSTabbarRoomGameVC.m index 766cbaa3..3564088c 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/MSTabbarRoomGameVC.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/MSTabbarRoomGameVC.m @@ -15,6 +15,7 @@ #import "MSRoomGameProtocol.h" #import "XPIAPRechargeViewController.h" #import "XPWebViewController.h" +#import "XPRoomHalfWebView.h" @interface MSTabbarRoomGameVC () @property(nonatomic,strong) UIImageView *bgImageView; @property(nonatomic,strong) MSTabbarRoomGameHeadView *headView; @@ -40,6 +41,7 @@ [self installConstraints]; } + -(void)installUI{ [self.view addSubview:self.bgImageView]; [self.view addSubview:self.headView]; @@ -79,6 +81,12 @@ } [self.presenter startMatchGameWithroomId:@"" mgId:self.gameModel.mgId gameMode:model.gameMode]; } +///规则 +-(void)clickRuleActionWithModel:(MSTabbarRoomGameItemModel *)model{ + XPRoomHalfWebView * webView = [[XPRoomHalfWebView alloc] init]; + webView.url = model.ruleUrl; + [TTPopup popupView:webView style:TTPopupStyleActionSheet]; +} #pragma mark - MSTabbarRoomGameHeadViewDelegate - (void)clickPayAction{ XPIAPRechargeViewController *iapVC = [XPIAPRechargeViewController new]; @@ -101,12 +109,14 @@ } -(void)startMatchGameSuccess{ + [self.presenter getRoomGameConfig]; MSRoomGameVC *gameVC = [MSRoomGameVC new]; gameVC.chooseGameModel = self.chooseGameModel; gameVC.userinfo = self.headView.userModel; BaseNavigationController *nav = [[BaseNavigationController alloc]initWithRootViewController:gameVC]; nav.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:nav animated:YES completion:nil]; + } #pragma mark - XPIAPRechargeViewControllerDelegate - (void)paySuccess{ @@ -118,6 +128,7 @@ self.headView.coinModel= coinModel; self.gameView.gameModel = gameModel; self.gameModel = gameModel; + } #pragma mark - 懒加载 - (UIImageView *)bgImageView{ diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.h index db1e8dd7..61c6f48a 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.h @@ -10,7 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @interface MSRoomGameHeadAvatarView : UIView -@property(nonatomic,copy) NSString *imageUrl; +@property(nonatomic,copy) NSString *__nullable imageUrl; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.m index ab2df97f..116f02fe 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadAvatarView.m @@ -35,8 +35,12 @@ }]; } --(void)setImageUrl:(NSString *)imageUrl{ +-(void)setImageUrl:(NSString *__nullable)imageUrl{ _imageUrl = imageUrl; + if(_imageUrl == nil){ + _avatarView.imageUrl = nil; + return; + } _avatarView.imageUrl = imageUrl; } #pragma mark - 懒加载 diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.h index d0054f3a..fe8c8b51 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.h @@ -8,6 +8,7 @@ #import #import "MSRoomGameModel.h" #import "MSTabbarRoomGameModel.h" +#import "UserInfoModel.h" NS_ASSUME_NONNULL_BEGIN @protocol MSRoomGameHeadViewDelegate @@ -15,9 +16,14 @@ NS_ASSUME_NONNULL_BEGIN @end @interface MSRoomGameHeadView : UIView +@property(nonatomic,copy) NSString *gainProfit; @property(nonatomic,weak) iddelegate; -@property(nonatomic,strong) MSRoomGameModel *roomGameModel; +@property(nonatomic,strong) MSRoomGameModel *__nullable roomGameModel; @property(nonatomic,strong) MSTabbarRoomGameItemModel *chooseGameModel; +@property(nonatomic,strong) HomePlayMicUserModel *mineModel; +@property(nonatomic,strong) HomePlayMicUserModel *rivalModel; +@property(nonatomic,strong) UserInfoModel *userInfo; +-(void)setDataInNull; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.m index 7a86feb0..472e682b 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameHeadView.m @@ -100,6 +100,16 @@ make.centerY.equalTo(self.bgCoinView); }]; } +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + for (NSInteger i = (self.subviews.count - 1) ; i >= 0 ; i--) { + UIView * subView = [self.subviews safeObjectAtIndex1:i]; + CGPoint convertPoint = [subView convertPoint:point fromView:self]; + if (CGRectContainsPoint(subView.bounds, convertPoint)) { + return [subView hitTest:convertPoint withEvent:event]; + } + } + return nil; +} -(void)clickBackBtnAction{ if(self.delegate && [self.delegate respondsToSelector:@selector(clickQuitGameAction)]){ [self.delegate clickQuitGameAction]; @@ -110,19 +120,30 @@ id coin = _chooseGameModel.scores.firstObject; if(coin != nil){ self.coinNumView.text = [NSString stringWithFormat:@"%@",coin]; + NSMutableAttributedString *attText = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:YMLocalizedString(@"MSRoomGameHeadView2"),self.coinNumView.text] attributes:@{NSFontAttributeName:kFontMedium(14),NSForegroundColorAttributeName:[UIColor whiteColor]}]; + [attText addAttributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0xFF6629)} range:[attText.string rangeOfString:[NSString stringWithFormat:YMLocalizedString(@"MSRoomGameHeadView3"),self.coinNumView.text]]]; + _hintView.attributedText = attText; } } -- (void)setRoomGameModel:(MSRoomGameModel *)roomGameModel{ +-(void)setDataInNull{ + self.titleView.text = YMLocalizedString(@"MSRoomGameHeadView0"); + self.rivalView.imageUrl = nil; +} +- (void)setRoomGameModel:(MSRoomGameModel *__nullable)roomGameModel{ _roomGameModel = roomGameModel; + + if(_roomGameModel == nil){ + + return; + } NSString *uid = [[AccountInfoStorage instance]getUid]; for (MSRoomGameMicModel *obj in _roomGameModel.roomMics) { - if([obj.micUser.uid isEqualToString:uid]){ - self.mineView.imageUrl = obj.micUser.avatar; - }else{ + if(![obj.micUser.uid isEqualToString:uid]){ + self.rivalModel = obj.micUser; self.rivalView.imageUrl = obj.micUser.avatar; } - } + MSRoomGameInfoModel *data = _roomGameModel.data; if(data != nil){ _topImageView.imageUrl = data.gameRoomIcon; @@ -133,6 +154,15 @@ } } } +- (void)setUserInfo:(UserInfoModel *)userInfo{ + _userInfo = userInfo; + HomePlayMicUserModel *mineModel = [HomePlayMicUserModel new]; + mineModel.uid = @(_userInfo.uid).stringValue; + mineModel.nick = _userInfo.nick; + mineModel.avatar = _userInfo.avatar; + self.mineView.imageUrl = mineModel.avatar; + self.mineModel = mineModel; +} #pragma mark - 懒加载 - (NetImageView *)topImageView{ if(!_topImageView){ @@ -177,9 +207,7 @@ - (UILabel *)hintView{ if(!_hintView){ _hintView = [UILabel new]; - NSMutableAttributedString *attText = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:YMLocalizedString(@"MSRoomGameHeadView0"),@"18"] attributes:@{NSFontAttributeName:kFontMedium(14),NSForegroundColorAttributeName:[UIColor whiteColor]}]; - [attText addAttributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0xFF6629)} range:[attText.string rangeOfString:@"18金币"]]; - _hintView.attributedText = attText; + _hintView.numberOfLines = 0; _hintView.textAlignment = NSTextAlignmentCenter; } diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.h index e3f1aa91..c4e3fe15 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.h @@ -8,12 +8,21 @@ #import NS_ASSUME_NONNULL_BEGIN +@class MSTabbarRoomGameItemModel; @protocol MSRoomGameQuitGameViewDelegate - +@optional +///退出游戏 - (void)quitGameAction; - +///继续游戏 +-(void)rematchGameAction; +///强杀app打开后,是否重新玩游戏 +-(void)replayTheGameWithModel:(MSTabbarRoomGameItemModel *)model; +///强杀app打开后,退出游戏 +- (void)closeGameActionWithModel:(MSTabbarRoomGameItemModel *)model; @end @interface MSRoomGameQuitGameView : UIView +@property(nonatomic,strong) MSTabbarRoomGameItemModel *chooseGameModel; +@property(nonatomic,assign) BOOL isNormalFail; @property(nonatomic,weak) iddelegate; @end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.m index 7e7f2466..f5265e54 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameQuitGameView.m @@ -51,14 +51,41 @@ make.top.mas_equalTo(kGetScaleWidth(48)); }]; } +-(void)setChooseGameModel:(MSTabbarRoomGameItemModel *)chooseGameModel{ + _chooseGameModel = chooseGameModel; + + _titleView.text = YMLocalizedString(@"MSRoomGameQuitGameView4"); + +} +- (void)setIsNormalFail:(BOOL)isNormalFail{ + _isNormalFail = isNormalFail; + _titleView.text = YMLocalizedString(@"MSRoomGameQuitGameView3"); + [_resumeBtn setTitle:YMLocalizedString(@"MSRoomGameVictoryView0") forState:UIControlStateNormal]; +} -(void)qutiBtnAction{ [TTPopup dismiss]; + if(self.chooseGameModel != nil){ + if(self.delegate && [self.delegate respondsToSelector:@selector(closeGameActionWithModel:)]){ + [self.delegate closeGameActionWithModel:self.chooseGameModel]; + } + return; + } if(self.delegate && [self.delegate respondsToSelector:@selector(quitGameAction)]){ [self.delegate quitGameAction]; } } -(void)resumeBtnAction{ [TTPopup dismiss]; + if(self.chooseGameModel != nil){ + if(self.delegate && [self.delegate respondsToSelector:@selector(replayTheGameWithModel:)]){ + [self.delegate replayTheGameWithModel:self.chooseGameModel]; + } + return; + } + if(self.isNormalFail == NO)return; + if(self.delegate && [self.delegate respondsToSelector:@selector(rematchGameAction)]){ + [self.delegate rematchGameAction]; + } } #pragma mark - 懒加载 - (UIView *)bgView{ diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.h index 997a4c4a..8de80282 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.h @@ -8,9 +8,13 @@ #import NS_ASSUME_NONNULL_BEGIN +@protocol MSRoomGameSendMsgViewDelegate +- (void)clickSendMsgAction; + +@end @interface MSRoomGameSendMsgView : UIView - +@property(nonatomic,weak) iddelegate; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.m index fff97e36..f9b407c8 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendMsgView.m @@ -38,6 +38,11 @@ make.centerY.equalTo(self.sendBtn); }]; } +-(void)clickSendBtnAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(clickSendMsgAction)]){ + [self.delegate clickSendMsgAction]; + } +} #pragma mark - 懒加载 - (UIButton *)sendBtn{ if(!_sendBtn){ @@ -45,6 +50,7 @@ _sendBtn.backgroundColor = UIColorRGBAlpha(0x0B032D , 0.1); _sendBtn.layer.cornerRadius = kGetScaleWidth(28)/2; _sendBtn.layer.masksToBounds = YES; + [_sendBtn addTarget:self action:@selector(clickSendBtnAction) forControlEvents:UIControlEventTouchUpInside]; } return _sendBtn; } diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.h new file mode 100644 index 00000000..7107cd9d --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.h @@ -0,0 +1,19 @@ +// +// MSRoomGameSendTextView.h +// YuMi +// +// Created by duoban on 2024/5/30. +// + +#import +#import "UserInfoModel.h" +NS_ASSUME_NONNULL_BEGIN + +@interface MSRoomGameSendTextView : UIView +///输入框 +@property (nonatomic, strong, readonly) UITextField *editTextFiled; +-(void)showInputView:(NSString *)text; +- (instancetype)initWithRoomId:(NSString *)roomId userInfo:(UserInfoModel *)userInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.m new file mode 100644 index 00000000..9b90dc61 --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameSendTextView.m @@ -0,0 +1,285 @@ +// +// MSRoomGameSendTextView.m +// YuMi +// +// Created by duoban on 2024/5/30. +// +#import +#import +#import "NSObject+MJExtension.h" +#import +///Tool +#import "ThemeColor+Room.h" +#import "UIImage+Utils.h" +#import "AccountInfoStorage.h" +///Model +#import "XPMessageRemoteExtModel.h" +#import "UserInfoModel.h" +#import "RoomInfoModel.h" +#import "ClientConfig.h" +#import "MSRoomGameSendTextView.h" +#import "MSRoomGameSendTextView.h" +//公屏限制最大字数 +#define MAX_STARWORDS_LENGTH 300 +@interface MSRoomGameSendTextView() +///输入框 +@property (nonatomic, strong) MSBaseTextField *editTextFiled; +@property (nonatomic, strong) UIView *bgEditTextFiled; +///发送按钮 +@property (nonatomic, strong) UIButton *sendButton; +///文本输入的内容 +@property (nonatomic,copy) NSString *inputMessage; +@property(nonatomic,strong) UserInfoModel * userInfo; +@property(nonatomic,copy) NSString *roomId; + +@end +@implementation MSRoomGameSendTextView +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (instancetype)initWithRoomId:(NSString *)roomId userInfo:(UserInfoModel *)userInfo { + self = [super initWithFrame:CGRectMake(0, KScreenHeight - 60, KScreenWidth, 60)]; + if (self) { + self.roomId = roomId; + self.userInfo = userInfo; + [self addNotification]; + [self initSubViews]; + [self initSubViewConstraints]; + [IQKeyboardManager sharedManager].enable = NO; + [self.editTextFiled becomeFirstResponder]; + } + return self; +} + +#pragma mark - Response + +- (void)sendButtonDidClick:(UIButton *)sender { + UserInfoModel * userInfo = self.userInfo; + XPMessageRemoteExtModel *extModel = [[XPMessageRemoteExtModel alloc] init]; + extModel.defUser = userInfo.defUser; + extModel.erbanNo = userInfo.erbanNo; + extModel.carName = userInfo.carName; + extModel.inRoomNameplatePic = userInfo.nameplatePic; + extModel.inRoomNameplateWord = userInfo.nameplateWord; + extModel.isCustomWord = userInfo.isCustomWord; + extModel.charmUrl = userInfo.userLevelVo.charmUrl; + extModel.experLevelSeq = userInfo.userLevelVo.experLevelSeq; + extModel.experUrl = userInfo.userLevelVo.experUrl; + extModel.newUser = userInfo.newUser; + extModel.vipIcon = userInfo.userVipInfoVO.vipIcon; + extModel.androidBubbleUrl = userInfo.androidBubbleUrl; + extModel.iosBubbleUrl = userInfo.iosBubbleUrl; + extModel.fromSayHelloChannel = userInfo.fromSayHelloChannel; + + + + NIMMessage * message = [[NIMMessage alloc] init]; + message.text = self.inputMessage; + NSMutableDictionary *remoteExt = [NSMutableDictionary dictionaryWithObject:extModel.model2dictionary forKey:[AccountInfoStorage instance].getUid]; + message.remoteExt = remoteExt; + + ///网易易盾 拦截高风险 + NIMAntiSpamOption *option = [[NIMAntiSpamOption alloc]init]; + option.yidunEnabled = YES; + option.businessId = KeyWithType(keyType_YiDunBussinessId); + message.antiSpamOption = option; + NSString * sessionId = self.roomId; + //构造会话 + self.sendButton.enabled = NO; + NIMSession *session = [NIMSession session:sessionId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session completion:^(NSError * _Nullable error) { + self.editTextFiled.text = @""; + [self.editTextFiled resignFirstResponder]; + self.inputMessage = nil; + }]; +} +-(void)showSendheadlineBtnAction{ + if(self.editTextFiled.text.length == 0){ + [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"MSSessionReleaseHeadlinesView0")]; + return; + } + if(self.editTextFiled.text.length > 100){ + [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"MSSessionReleaseHeadlinesView0")]; + return; + } + [self.editTextFiled resignFirstResponder]; + [[NSNotificationCenter defaultCenter]postNotificationName:@"kShowSendheadlineView" object:self.editTextFiled.text]; + self.editTextFiled.text = @""; +} +- (void)keyboardWillShow:(NSNotification *)notification { + [self.superview bringSubviewToFront:self]; + NSDictionary *info = [notification userInfo]; + NSValue *value = [info objectForKey:UIKeyboardFrameEndUserInfoKey]; + CGFloat keyBoardEndY = value.CGRectValue.origin.y; + NSNumber *curve = [info objectForKey:UIKeyboardAnimationCurveUserInfoKey]; + CGFloat duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]; + CGRect endKeyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + CGFloat h = endKeyboardRect.size.height; + [UIView animateWithDuration:duration animations:^{ + if(self.superview){ + [self mas_remakeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.equalTo(self.superview); + make.height.equalTo(@60); + make.bottom.equalTo(self.superview).offset(-h); + }]; + } + [UIView setAnimationBeginsFromCurrentState:YES]; + [UIView setAnimationCurve:[curve intValue]]; + self.center = CGPointMake(self.center.x, keyBoardEndY - statusbarHeight - self.bounds.size.height/2.0); + }]; +} + +//键盘隐藏 +- (void)keyboardWillHidden:(NSNotification *)notification { + + NSDictionary *info = [notification userInfo]; + CGFloat duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]; + [UIView animateWithDuration:duration animations:^{ + [self mas_remakeConstraints:^(MASConstraintMaker *make) { + make.bottom.leading.trailing.equalTo(self.superview); + make.height.equalTo(@60); + }]; + self.hidden = YES; + }]; +} + +-(void)textFieldEditChanged:(NSNotification *)notification{ + + UITextField *textField = (UITextField *)notification.object; + NSString *toBeString = textField.text; + NSString *lang = [textField.textInputMode primaryLanguage]; + if ([lang isEqualToString:@"zh-Hans"]){// 简体中文输入 + //获取高亮部分 + UITextRange *selectedRange = [textField markedTextRange]; + UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; + // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 + if (!position){ + if (toBeString.length > MAX_STARWORDS_LENGTH){ + NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:MAX_STARWORDS_LENGTH]; + if (rangeIndex.length == 1){ + + textField.text = [toBeString substringToIndex:MAX_STARWORDS_LENGTH]; + }else{ + NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, MAX_STARWORDS_LENGTH)]; + textField.text = [toBeString substringWithRange:rangeRange]; + } + } + } + }else{ // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况 + if (toBeString.length > MAX_STARWORDS_LENGTH){ + NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:MAX_STARWORDS_LENGTH]; + if (rangeIndex.length == 1){ + + textField.text = [toBeString substringToIndex:MAX_STARWORDS_LENGTH]; + }else{ + + NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, MAX_STARWORDS_LENGTH)]; + textField.text = [toBeString substringWithRange:rangeRange]; + } + } + } + + self.inputMessage = textField.text; + + if (self.inputMessage.length > 0) { + self.sendButton.enabled = YES; + } else { + self.sendButton.enabled = NO; + } +} + + + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = UIColorFromRGB(0x260159); + [self addSubview:self.bgEditTextFiled]; + [self.bgEditTextFiled addSubview:self.editTextFiled]; + [self addSubview:self.sendButton]; + +} + +- (void)initSubViewConstraints { + + + + + [self.bgEditTextFiled mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(6); + make.height.mas_equalTo(36); + make.top.mas_equalTo(12); + make.trailing.equalTo(self.sendButton.mas_leading).mas_offset(-8); + + }]; + [self.editTextFiled mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(20); + make.trailing.mas_equalTo(-kGetScaleWidth(20)); + make.top.bottom.mas_equalTo(0); + }]; + + + [self.sendButton mas_remakeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(58); + make.height.mas_equalTo(29); + make.trailing.mas_equalTo(-15); + make.centerY.equalTo(self); + }]; + + +} + +- (void)addNotification { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHidden:) name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:self.editTextFiled]; +} +-(void)showInputView:(NSString *)text{ + self.editTextFiled.text = text; + self.inputMessage = text; + if(text.length > 0){ + self.sendButton.enabled = YES; + } + +} +#pragma mark - Getters And Setters +- (MSBaseTextField *)editTextFiled{ + if (!_editTextFiled) { + _editTextFiled = [[MSBaseTextField alloc] init]; + NSAttributedString * attribute = [[NSAttributedString alloc] initWithString:YMLocalizedString(@"XPRoomSendTextView0") attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15], NSForegroundColorAttributeName : [UIColor colorWithWhite:1 alpha:0.5]}]; + _editTextFiled.attributedPlaceholder = attribute; + _editTextFiled.borderStyle = UITextBorderStyleNone; + _editTextFiled.textColor = [UIColor whiteColor]; + _editTextFiled.font = [UIFont systemFontOfSize:13 weight:UIFontWeightMedium]; + [_editTextFiled setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; + + } + return _editTextFiled; +} +- (UIButton *)sendButton{ + if (!_sendButton) { + _sendButton = [[UIButton alloc] init]; + [_sendButton setTitle:YMLocalizedString(@"XPRoomSendTextView1") forState:UIControlStateNormal]; + _sendButton.titleLabel.textColor = [UIColor whiteColor]; + _sendButton.titleLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightMedium]; + [_sendButton setBackgroundImage:[UIImage imageWithColor:[DJDKMIMOMColor disableButtonColor] ]forState:UIControlStateDisabled]; + [_sendButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[UIColorFromRGB(0x7E5AFF), UIColorFromRGB(0x52CAD3)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; + _sendButton.enabled = NO; + _sendButton.layer.cornerRadius = 7.5; + _sendButton.layer.masksToBounds = YES; + [_sendButton addTarget:self action:@selector(sendButtonDidClick:) forControlEvents:UIControlEventTouchUpInside]; + _sendButton.tag = 101; + } + return _sendButton; +} + +- (UIView *)bgEditTextFiled{ + if(!_bgEditTextFiled){ + _bgEditTextFiled = [UIView new]; + _bgEditTextFiled.backgroundColor = UIColorFromRGB(0x361661); + _bgEditTextFiled.layer.cornerRadius = 18; + _bgEditTextFiled.layer.masksToBounds = YES; + } + return _bgEditTextFiled; +} +@end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.h index 33743b90..d4051b16 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.h @@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN -(void)rematchGameAction; @end @interface MSRoomGameVictoryView : UIView +@property(nonatomic,copy) NSArray *resultsList; @property(nonatomic,weak) iddelegate; @end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.m index e71f26db..3be338a5 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameVictoryView.m @@ -7,6 +7,7 @@ #import "MSRoomGameVictoryView.h" #import "MSRoomGameVictoryCell.h" +#import "MSRoomGameResultsModel.h" @interface MSRoomGameVictoryView() @property(nonatomic,strong) UIView *bgView; @property(nonatomic,strong) UIView *bgSubView; @@ -71,11 +72,11 @@ } #pragma mark- UITableViewDelegate,UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ - return 2; + return self.resultsList.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ MSRoomGameVictoryCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([MSRoomGameVictoryCell class]) forIndexPath:indexPath]; - + cell.resultsModel = [self.resultsList safeObjectAtIndex1:indexPath.row]; return cell; } -(void)closeBtnAction{ @@ -90,6 +91,13 @@ [self.delegate rematchGameAction]; } } +-(void)setResultsList:(NSArray *)resultsList{ + _resultsList = resultsList; + MSRoomGameResultsModel *resultsModel = _resultsList.firstObject; + NSString *uid = [AccountInfoStorage instance].getUid; + self.topView.image = [resultsModel.uid isEqualToString:[AccountInfoStorage instance].getUid] ? kImage(@"ms_room_game_victory_top_icon") : kImage(@"ms_room_game_victory_top_fail_icon"); + [_tableView reloadData]; +} #pragma mark - 懒加载 - (UIView *)bgView{ if(!_bgView){ diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.h index c6f1e354..ca840169 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.h @@ -6,26 +6,25 @@ // #import -#import "RoomHostDelegate.h" -#import "RoomGuestDelegate.h" +#import "MSRoomGameModel.h" NS_ASSUME_NONNULL_BEGIN @protocol MSRoomGameViewDelegate -- (void)hiddenSudGamePostionView; +- (void)getGameRsultsWithList:(NSArray *)list; @end @interface MSRoomGameView : UIView -- (instancetype)initWithDelegate:(id)delegate; +@property(nonatomic,strong) MSRoomGameModel *gameModel; -///代理 -@property (nonatomic,weak) id delegate; +@property(nonatomic,weak) iddelegate; +- (void)onRoomEntered; ///销毁游戏的引擎 - (void)destroyMG; /// 退出游戏 - (void)handleSelfInExitEvent; - +- (void)handleNIMNotificationMessage:(NIMMessage *)message; //自己是否在游戏中 - (BOOL)isInSudGame; diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.m index 1d9e01e3..0657ac93 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSRoomGameView.m @@ -13,7 +13,7 @@ #import "AccountInfoStorage.h" - +#import "MSRoomGameResultsModel.h" #import "SudCommon.h" #import "SudGameConfig.h" ///Model @@ -31,838 +31,632 @@ #import #import #import "MSRoomGameView.h" -@interface MSRoomGameView() +@interface MSRoomGameView() ///当前小游戏ID @property (nonatomic, assign) int64_t currentmgId; ///小游戏code @property (nonatomic, copy) NSString *code; /// -@property(nonatomic,copy) NSString *mgId; + @property (nonatomic, strong) id fsmAPP2MG; -/// 你画我猜专用,游戏中选中的关键词,会回调出来,通过 DrawSomethingKeyWord 进行保存。 -@property (nonatomic, copy) NSString * DrawSomethingKeyWord; -/// 你画我猜,进入猜词环节,用来公屏识别关键字的状态标识 -@property (nonatomic, assign) BOOL keyWordHiting; ///游戏状态 @property (nonatomic, assign) LittleGamePlayStatus sudGameStatus; + +@property(nonatomic,strong) NSMutableArray *userList; @end @implementation MSRoomGameView -//- (instancetype)initWithmgId:(NSString *)mgId -//{ -// self = [super init]; -// if (self) { -// self.mgId = mgId; -// } -// return self; -//} -// -//#pragma mark - Private Method -//- (void)updateSudGame { -// -// -// if (self.currentmgId == 0) {//第一次加载游戏 -// self.currentmgId = roomInfo.mgId; -// if (self.currentmgId != 0) {//房间信息已加载 -// NSLog(@"initLittleGame---%lld", self.currentmgId); -// [self initLittleGame]; -// } -// } else { -// if (self.currentmgId != roomInfo.mgId) { -// //切换游戏玩法 -// self.currentmgId = roomInfo.mgId; -// NSLog(@"updateLittleGame---%lld", self.currentmgId); -// if (self.currentmgId != 0) { -// [self.fsmAPP2MG destroyMG]; -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_NoIn]; -// [self gameSetUp]; -// } -// } -// } -// -//} -// -//- (void)initLittleGame { -// [Api getSudGameCode:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { -// if (code == 200) { -// NSString * gameCode = data.data[@"code"]; -// self.code = gameCode; -// [self gameSetUp]; -// } else { -// [XNDJTDDLoadingTool showErrorWithMessage:msg]; -// } -// } uid:[AccountInfoStorage instance].getUid]; -//} -// -//- (void)gameSetUp { -// NSLog(@"小游戏的版本号是:%@", [SudMGP getVersion]); -// BOOL isTestEnv = NO; -//#ifdef DEBUG -// isTestEnv = YES; -//#else -// isTestEnv = NO; -//#endif -// if(isEnterprise == NO){ -// [[SudMGP getCfg]setBackgroundMode:NO]; -// } -// [SudMGP initSDK:KeyWithType(KeyType_SudGameAppID) appKey:KeyWithType(KeyType_SudGameAppKey) isTestEnv:isTestEnv listener:^(int retCode, const NSString *retMsg) { -// if (retCode == 0) { -// if (!self.currentmgId) { -// return; -// } -// NSString * userId = [AccountInfoStorage instance].getUid; -// NSString * roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; -// NSLog(@"用户ID:%@,房间ID:%@, 游戏ID:%lld, code:%@", userId, roomId, self.currentmgId, self.code); -//// -// -// NSString *language = [NSBundle getLanguageText]; -// if ([language hasPrefix:@"zh"]) { -// if ([language rangeOfString:@"Hans"].location != NSNotFound) { -// language = @"zh-CN"; // 简体中文 -// } else { -// language = @"zh-TW"; // 繁體中文 -// } -// }else{ -// language = @"en-US"; // 英文 -// } -// self.fsmAPP2MG = [SudMGP loadMG:userId roomId:roomId code:self.code mgId:self.currentmgId language:language fsmMG:self rootView:self]; -// } else { -// /// 初始化失败, 可根据业务重试 -// NSLog(@"ISudFSMMG:initGameSDKWithAppID:初始化sdk失败 :%@",retMsg); -// } -// }]; -//} -// -////判断是否在麦上 -//- (BOOL)isOnMicro:(NSInteger)uid{ -// NSArray *chatRoomMicSequences = [self.hostDelegate.getMicroQueue allValues] ; -// if (chatRoomMicSequences != nil && chatRoomMicSequences.count > 0) { -// for (int i = 0; i < chatRoomMicSequences.count; i ++) { -// MicroQueueModel *chatRoomMicSequence = chatRoomMicSequences[i]; -// if (chatRoomMicSequence.userInfo.uid == uid) { -// return YES; -// } -// } -// } -// return NO; -//} -// -//- (NSString *)findFreePosition{ -// NSMutableDictionary * micQueue = self.hostDelegate.getMicroQueue; -// if (micQueue != nil && micQueue.allKeys.count > 0) { -// NSArray *keys = [micQueue allKeys]; -// if (keys.count > 0) { -// ///重新排序,按照升序 -// NSArray *resultArr = [keys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { -// return [obj1 compare:obj2]; -// }]; -// for (NSString *key in resultArr) { -// UserInfoModel *userInfo = [[micQueue objectForKey:key] userInfo]; -// if ( !userInfo) { -// return key; -// } -// } -// } -// } -// return nil; -//} -// -////通过uid判断麦位 -//- (NSString *)findThePositionByUid:(NSInteger)uid{ -// if (uid > 0) { -// NSMutableDictionary * micQueue = self.hostDelegate.getMicroQueue; -// NSArray *keys = [micQueue allKeys]; -// if (keys.count > 0) { -// for (NSString *key in keys) { -// UserInfoModel *userInfo = [[micQueue objectForKey:key] userInfo]; -// if (userInfo.uid == uid) { -// return key; -// } -// } -// } -// } -// return nil; -//} -// -////上麦以加入游戏 -//- (void)upMicToJoinGame { -// NSString *position = [self findFreePosition]; -// if (position.length > 0) { -// NSString * userId = [AccountInfoStorage instance].getUid; -// UserInfoModel * userInfo = self.hostDelegate.getUserInfo; -// //清空该uid之前在队列中的信息 -// if ([self isOnMicro:userId.integerValue]) { -// if (position) { -// NSString *findOldPosition = [self findThePositionByUid:userInfo.uid]; -// NIMChatroomQueueRemoveRequest *request = [[NIMChatroomQueueRemoveRequest alloc]init]; -// request.key = findOldPosition; -// request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; -// if (findOldPosition) { -// [[NIMSDK sharedSDK].chatroomManager removeChatroomQueueObject:request completion:^(NSError * _Nullable error, NSDictionary * _Nullable element) { -// if (error == nil) { -// NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; -// request.key = position; -// request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; -// request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; -// request.transient = YES; -// [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { -// [self notifySelfInState:YES seatIndex:-1]; -// }]; -// } -// }]; -// } -// } -// }else{ -// NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; -// request.key = position; -// request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; -// request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; -// request.transient = YES; -// [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { -// [self notifySelfInState:YES seatIndex:-1]; -// }]; -// } -// } -//} -// -//- (void)updateMicInfoWithGameStatus:(LittleGamePlayStatus)status { -// NSString * position = [self findThePositionByUid:[AccountInfoStorage instance].getUid.integerValue]; -// if (position != nil) { -// UserInfoModel * userInfo = self.hostDelegate.getUserInfo; -// userInfo.gameStatus = status; -// NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; -// request.key = position; -// request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; -// request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; -// request.transient = YES; -// [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { -// -// }]; -// } -//} -// -///** -// * 麦位更新扩展字段。 -// */ -//- (NSDictionary *)userInfoToQueueExt:(UserInfoModel *)userInfo { -// MicroExtModel * extModel = [[MicroExtModel alloc] init]; -// extModel.gender = userInfo.gender; -// extModel.avatar = userInfo.avatar; -// extModel.uid = userInfo.uid; -// extModel.nick = userInfo.nick; -// extModel.gameStatus = userInfo.gameStatus; -// extModel.headWearUrl = userInfo.headwearEffect.length > 0 ? userInfo.headwearEffect : userInfo.headwearPic; -// extModel.preventKick = userInfo.userVipInfoVO.preventKick; -// extModel.enterHide = userInfo.userVipInfoVO.enterHide; -// return [extModel model2dictionary]; -//} -// -////自己是否在游戏中 -//- (BOOL)isInSudGame { -// BOOL isGamePlaying = NO; -// if (self.hostDelegate.getRoomInfo.type == RoomType_MiniGame) { -// for (int i = -1; i<5; i++) { -// NSMutableDictionary * micQueue = self.hostDelegate.getMicroQueue; -// MicroQueueModel *micSequence = [micQueue objectForKey:[NSString stringWithFormat:@"%d", i]]; -// if (micSequence == nil || micSequence.userInfo == nil) { -// continue; -// } -// if (micSequence.userInfo.uid == [AccountInfoStorage instance].getUid.integerValue && micSequence.userInfo.gameStatus == LittleGamePlayStatus_Plying) { -// isGamePlaying = YES; -// break; -// } -// } -// } -// return isGamePlaying; -//} -// -////游戏状态 -//- (LittleGamePlayStatus)getCurrentUserSudGameStatus { -// LittleGamePlayStatus gameStatus = LittleGamePlayStatus_NoIn; -// for (int i = -1; i<5; i++) { -// NSMutableDictionary * micQueue = self.hostDelegate.getMicroQueue; -// MicroQueueModel *micSequence = [micQueue objectForKey:[NSString stringWithFormat:@"%d", i]]; -// if (micSequence == nil || micSequence.userInfo == nil) { -// continue; -// } -// if (micSequence.userInfo.uid == [AccountInfoStorage instance].getUid.integerValue) { -// gameStatus = micSequence.userInfo.gameStatus; -// break; -// } -// } -// return gameStatus; -//} -// -/////下麦 -//- (void)onDownMic:(NSInteger)uid { -// if (uid == [AccountInfoStorage instance].getUid.integerValue) {//自己下麦 -// [self notifyIsPlayingState:false]; -// [self nofityPlayerPlaying:NO]; -// [self notifySetReady:false]; -// /// 下游戏麦 -// [self notifySelfInState:false seatIndex:-1]; -// } -//} -// -//#pragma mark =======ISudFSMMG Delegate======= -///** -//* 游戏日志 -//*/ -//-(void)onGameLog:(NSString*)dataJson { -// NSLog(@"ISudFSMMG:onGameLog:%@", dataJson); -// NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; -// NSString * msg_string = [dic objectForKey:@"msg"]; -// if (!msg_string) { -// return; -// } -//} -// -///** -//* 游戏开始 -//*/ -//-(void)onGameStarted { -// NSLog(@"ISudFSMMG:onGameStarted:游戏开始"); -//} -// -///** -// * 游戏销毁 -// */ -//-(void)onGameDestroyed { -// NSLog(@"ISudFSMMG:onGameDestroyed:游戏开始"); -//} -// -///** -// * Code过期 -// * @param dataJson {"code":"value"} -// */ -//-(void)onExpireCode:(id)handle dataJson:(NSString*)dataJson { -// NSLog(@"ISudFSMMG:onExpireCode:Code过期"); -// // 请求业务服务器刷新令牌 -// [Api getSudGameCode:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { -// if (code == 200) { -// NSString * gameCode = data.data[@"code"]; -// self.code = gameCode; -// [self.fsmAPP2MG updateCode:gameCode listener:^(int retCode, const NSString *retMsg, const NSString *dataJson) { -// NSLog(@"ISudFSMMG:updateGameCode retCode=%@ retMsg=%@ dataJson=%@", @(retCode), retMsg, dataJson); -// }]; -// // 回调结果 -// NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@(0), @"ret_code", @"return form APP onExpireCode", @"ret_msg", nil]; -// [handle success:[SudCommon dictionaryToJson:dict]]; -// } else { -// [XNDJTDDLoadingTool showErrorWithMessage:msg]; -// } -// } uid:[AccountInfoStorage instance].getUid]; -//} -// -///** -// * 获取游戏View信息 -// * @param handle 回调句柄 -// * @param dataJson {} -// */ -//-(void)onGetGameViewInfo:(id)handle dataJson:(NSString*)dataJson { -// CGRect rect = [[UIScreen mainScreen] bounds]; -// CGFloat scale = [[UIScreen mainScreen] nativeScale]; -// -// CGFloat top = (kNavigationHeight+105) * scale; -// CGFloat bottom; -// if (iPhoneXSeries) { -// bottom = (47+kSafeAreaBottomHeight+30 + 70) * scale; -// } else { -// bottom = (47+10+70 ) * scale; -// } -// CGFloat width = rect.size.width * scale; -// CGFloat height = rect.size.height * scale; -// NSDictionary *rectDict = [NSDictionary dictionaryWithObjectsAndKeys:@(top), @"top", @(0), @"left", @(bottom), @"bottom", @(0), @"right", nil]; -// NSDictionary *viewDict = [NSDictionary dictionaryWithObjectsAndKeys:@(width), @"width", @(height), @"height", nil]; -// NSDictionary *dataDict = [NSDictionary dictionaryWithObjectsAndKeys:@(0), @"ret_code", @"return form APP onGetGameViewInfo", @"ret_msg", viewDict, @"view_size", rectDict, @"view_game_rect", nil]; -// /// 回调 -// [handle success:[SudCommon dictionaryToJson:dataDict]]; -//} -// -///** -// * 获取游戏配置 -// * @param handle 回调句柄 -// * @param dataJson {} -// */ -//-(void)onGetGameCfg:(id)handle dataJson:(NSString*)dataJson { -// NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; -// dict[@"ret_code"] = @(0); -// dict[@"ret_msg"] = @"return form APP onGetGameCfg"; -// -// dict[@"ui"] = @{ -// @"join_btn" : @{@"custom": @(YES), @"hide": @(NO)},//加入游戏 -// @"start_btn" : @{@"custom": @(YES), @"hide": @(NO)},//开始游戏 -// @"lobby_players" : @{@"custom": @(YES), @"hide": @(NO)},//游戏中坑位点击 -// @"level" : @{@"custom": @(YES), @"hide" : @(YES)},//段位信息 -// }; -// NSString *dataJsonRet = @""; -// NSData *dataJsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil]; -// if (dataJsonData != nil) { -// dataJsonRet = [[NSString alloc]initWithData:dataJsonData encoding:NSUTF8StringEncoding]; -// } -// [handle success:dataJsonRet]; -//} -// -///** -// * 游戏状态变化 -// * @param handle 回调句柄 -// * @param state 游戏状态 -// * @param dataJson 回调json -// */ -//-(void)onGameStateChange:(id) handle state:(NSString*) state dataJson:(NSString*) dataJson { -// if ([state isEqualToString:MG_COMMON_PUBLIC_MESSAGE]) { -// NSLog(@"ISudFSMMG:onGameStateChange:游戏->APP:公屏消息"); -// } else if ([state isEqualToString:MG_COMMON_KEY_WORD_TO_HIT]) { -// NSDictionary *dic = [SudCommon turnStringToDictionary:dataJson]; -// NSString *word = [dic objectForKey:@"word"]; -// NSLog(@"ISudFSMMG:onGameStateChange:游戏->APP:你画我猜关键词获取:%@",word); -// /// 记录你画我猜关键字 -// self.DrawSomethingKeyWord = word; -// if (word == (id) [NSNull null] || [word isEqualToString:@""]) { -// /// 关闭公屏关键词hit状态 -// self.keyWordHiting = NO; -// } else { -// /// 开启公屏关键词hit状态 -// self.keyWordHiting = YES; -// } -// }else if ([state isEqualToString:MG_COMMON_SELF_CLICK_JOIN_BTN]) {//加入游戏按钮点击 -// NSDictionary *dic = [SudCommon turnStringToDictionary:dataJson]; -// int seatIndex = -1; -// if ([dic objectForKey:@"seatIndex"]) { -// seatIndex = [[dic objectForKey:@"seatIndex"] intValue]; -// } -// if (seatIndex == -1) { -// NSLog(@"来自加入按钮%d",seatIndex); -// }else { -// NSLog(@"来自麦位+入%d",seatIndex); -// } -// if ([self isOnMicro:[AccountInfoStorage instance].getUid.integerValue]) {//判断是否在麦上 -// [self notifySelfInState:YES seatIndex:seatIndex]; -// } else { -// //不在麦上 -// [self upMicToJoinGame]; -// } -// } else if([state isEqualToString:MG_COMMON_SELF_CLICK_START_BTN]) {//开始游戏按钮点击 -// [self notifyIsPlayingState:YES]; -// } else if ([state isEqualToString:MG_COMMON_SELF_CLICK_CANCEL_JOIN_BTN]) { -// /// 取消加入游戏(退出游戏按钮点击) -// [self handleSelfInExitEvent]; -// } else { -// /// 其他状态 -// NSLog(@"ISudFSMMG:onGameStateChange:游戏->APP:state:%@",MG_COMMON_PUBLIC_MESSAGE); -// } -//} -// -///** -// * 游戏玩家状态变化 -// * @param handle 回调句柄 -// * @param userId 用户id -// * @param state 玩家状态 -// * @param dataJson 回调JSON -// */ -//-(void)onPlayerStateChange:(nullable id) handle userId:(NSString*) userId state:(NSString*) state dataJson:(NSString*) dataJson { -// NSLog(@"ISudFSMMG:onPlayerStateChange:游戏->APP:游戏玩家状态变化:userId: %@ --state: %@ --dataJson: %@", userId, state, dataJson); -// /// 状态解析 -// NSString *dataStr = @""; -// if ([state isEqualToString:MG_COMMON_PLAYER_IN]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView0"); -// [self handleState_MG_COMMON_PLAYER_IN_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_COMMON_PLAYER_READY]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView1"); -// [self handleState_MG_COMMON_PLAYER_READY_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_COMMON_PLAYER_CAPTAIN]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView2"); -// [self handleState_MG_COMMON_PLAYER_CAPTAIN_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_COMMON_PLAYER_PLAYING]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView3"); -// [self handleState_MG_COMMON_PLAYER_PLAYING_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_DG_SELECTING]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView4"); -// [self handleState_MG_DG_SELECTING_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_DG_PAINTING]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView5"); -// [self handleState_MG_DG_PAINTING_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_DG_ERRORANSWER]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView6"); -// [self handleState_MG_DG_ERRORANSWER_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_DG_TOTALSCORE]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView7"); -// [self handleState_MG_DG_TOTALSCORE_WithUserId:userId dataJson:dataJson]; -// } else if ([state isEqualToString:MG_DG_SCORE]) { -// dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView8"); -// [self handleState_MG_DG_SCORE_WithUserId:userId dataJson:dataJson]; -// }else { -// NSLog(@"ISudFSMMG:onPlayerStateChange:未做解析状态:%@", MG_DG_SCORE); -// } -// NSLog(@"ISudFSMMG:onPlayerStateChange:dataStr:%@", dataStr); -// /// 回调 -// NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@(0), @"ret_code", @"return form APP onPlayerStateChange", @"ret_msg", nil]; -// [handle success:[SudCommon dictionaryToJson:dict]]; -//} -// -///// 退出游戏 -//- (void)handleSelfInExitEvent { -// if (self.hostDelegate.getRoomInfo.type != RoomType_MiniGame) { -// return; -// } -// /// 正在游戏中,只退出游戏 -// if ([self getCurrentUserSudGameStatus] == LittleGamePlayStatus_Plying) { -// [self notifyIsPlayingState:false]; -// [self nofityPlayerPlaying:NO]; -// [self notifySetReady:false]; -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_NoIn]; -// } else if ([self getCurrentUserSudGameStatus] == LittleGamePlayStatus_Ready) { /// 非游戏状态下 -// /// 如果已经准备先退出准备状态 -// [self notifySetReady:false]; -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_NoIn]; -// } else { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_NoIn]; -// } -// /// 下游戏麦 -// [self notifySelfInState:false seatIndex:-1]; -//} -// -///// 准备游戏 -//- (void)handleSelfReadyEvent { -// [self notifySetReady:true]; -//} -// -///// 取消准备 -//- (void)handleSelfCancelReadyEvent { -// [self notifySetReady:false]; -//} -// -///// 开始游戏 -//- (void)handleGameStartEvent { -// [self notifyIsPlayingState:YES]; -//} -// -//#pragma mark =======APP->游戏状态处理======= -///// 状态通知(app to mg) -///// @param state 状态名称 -///// @param dataJson 需传递的json -//- (void)notifyStateChange:(NSString *) state dataJson:(NSString*) dataJson { -// [self.fsmAPP2MG notifyStateChange:state dataJson:dataJson listener:^(int retCode, const NSString *retMsg, const NSString *dataJson) { -// NSLog(@"ISudFSMMG:notifyStateChange:retCode=%@ retMsg=%@ dataJson=%@", @(retCode), retMsg, dataJson); -// RoomInfoModel * roomInfo = self.hostDelegate.getRoomInfo; -// if (retCode == 0 && [state isEqualToString:APP_COMMON_SELF_PLAYING]) {//开始游戏 -// //上报游戏开始 -// NSString *mgid = [NSString stringWithFormat:@"%lld", self.currentmgId]; -// if (mgid.length <= 0) { -// return; -// } -// [Api startGameCheck:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { -// if (code != 200) { -// [XNDJTDDLoadingTool showErrorWithMessage:msg]; -// } -// } roomUid:[NSString stringWithFormat:@"%ld", roomInfo.uid] mgId:mgid]; -// } else if (retCode == 0 && [state isEqualToString:APP_COMMON_SELF_END]) {//结束游戏 -// -// } -// }]; -//} -// -///// 加入,退出游戏 -///// @param isIn YES:加入 NO:退出 -//- (void)notifySelfInState:(BOOL)isIn uid:(NSInteger)uid { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isIn), @"isIn", @(1), @"teamId", nil]; -// [self notifyStateChange:APP_COMMON_SELF_IN dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -///// 加入,退出游戏 -///// @param isIn YES:加入 NO:退出 -//- (void)notifySelfInState:(BOOL)isIn seatIndex:(int)seatIndex { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(seatIndex), @"seatIndex", @(isIn), @"isIn", @(1), @"teamId", nil]; -// [self notifyStateChange:APP_COMMON_SELF_IN dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -///// 踢出用户 -///// @param userId 踢出用户id -//- (void)notifyKickStateWithUserId:(NSString *)userId { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:userId, @"kickedUID", nil]; -// [self notifyStateChange:APP_COMMON_SELF_KICK dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -///// 设置用户为队长 -///// @param userId 被设置用户id -//- (void)notifySetCaptainStateWithUserId:(NSString *)userId { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:userId, @"curCaptainUID", nil]; -// [self notifyStateChange:APP_COMMON_SELF_CAPTAIN dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -///// 命中 关键词状态 (你画我猜) -//- (void)notifyChangeTextHitState:(NSString *)keyWord { -// if([keyWord isKindOfClass:[NSNull class]])return; -// if (keyWord.length && [keyWord containsString:self.DrawSomethingKeyWord]) { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(true), @"isHit", self.DrawSomethingKeyWord, @"keyWord", self.DrawSomethingKeyWord, @"text", nil]; -// [self notifyStateChange:APP_COMMON_SELF_TEXT_HIT dataJson:[SudCommon dictionaryToJson:dic]]; -// } -//} -// -///// 是否设置为准备状态 -//- (void)notifySetReady:(BOOL)isReady { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isReady), @"isReady", nil]; -// [self notifyStateChange:APP_COMMON_SELF_READY dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -///// 停止游戏状态设置 -//- (void)notifySetEnd { -// [self notifyStateChange:APP_COMMON_SELF_END dataJson:[SudCommon dictionaryToJson:@{}]]; -//} -// -///// 游戏中状态设置 -//- (void)notifyIsPlayingState:(BOOL)isPlaying { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isPlaying), @"isPlaying", nil]; -// [self notifyStateChange:APP_COMMON_SELF_PLAYING dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -/////游戏中退出游戏 -//- (void)nofityPlayerPlaying:(BOOL)isPlaying { -// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isPlaying), @"isPlaying", nil]; -// [self notifyStateChange:MG_COMMON_PLAYER_PLAYING dataJson:[SudCommon dictionaryToJson:dic]]; -//} -// -//#pragma mark =======游戏->APP状态处理======= -//- (void)handleState_MG_COMMON_PLAYER_IN_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; -// /// 加入状态:YES加入,NO退出 -// BOOL isIn = NO; -// if (dic) { -// NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; -// if (retCode != 0) { -// return; -// } -// isIn = [[dic objectForKey:@"isIn"] boolValue]; -// } -// if ([userId isEqualToString:[AccountInfoStorage instance].getUid]) {//是当前用户 -// if (isIn) {//加入了游戏 -// //判断是否在麦上 -// if ([self isOnMicro:[userId longLongValue]]) { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_IsIn]; -// } else {//不在麦上 -// [self upMicToJoinGame]; -// } -// //判断是否为房主,房主需要设为队长 -// if (self.hostDelegate.getRoomInfo.uid == userId.integerValue) { -// [self notifySetCaptainStateWithUserId:userId]; -// } -// self.sudGameStatus = LittleGamePlayStatus_IsIn; -// }else {//退出了游戏 -// //判断是否在麦上 -// if ([self isOnMicro:[userId longLongValue]]) { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_NoIn]; -// } -// self.sudGameStatus = LittleGamePlayStatus_NoIn; -// } -// } else {//退出游戏 -// if (self.sudGameStatus == LittleGamePlayStatus_Plying) {//游戏进行中,用户退出 -// ///自己是公会超管 -// BOOL meIsSuperAdmin = NO; -// for (GuildSuperAdminInfoModel *managerInfo in self.hostDelegate.getRoomSuperAdminList) { -// if ([managerInfo.uid isEqualToString:[AccountInfoStorage instance].getUid]) { -// meIsSuperAdmin = YES; -// break; -// } -// } -// NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init]; -// request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; -// request.userIds = @[[AccountInfoStorage instance].getUid]; -// [[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray * _Nullable members) { -// if (error == nil) { -// NIMChatroomMember *member = members.firstObject; -// if (member.type == NIMChatroomMemberTypeManager || member.type == NIMChatroomMemberTypeCreator || meIsSuperAdmin) { -// NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init]; -// request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; -// request.userIds = @[userId]; -// [[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray * _Nullable members) { -// if (error == nil) { -// NIMChatroomMember *member = members.firstObject; -// [XNDJTDDLoadingTool showErrorWithMessage:[NSString stringWithFormat:YMLocalizedString(@"XPRoomLittleGameContainerView9"), member.roomNickname]]; -// } -// }]; -// } -// } -// }]; -// -// } -// } -//} -// -//- (void)handleState_MG_COMMON_PLAYER_READY_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// /// 玩家是否准备,YES:已准备,NO:未准备 -// BOOL isReady = NO; -// NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; -// if (dic) { -// NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; -// if (retCode != 0) { -// return; -// } -// isReady = [[dic objectForKey:@"isReady"] boolValue]; -// } -// if ([userId isEqualToString:[AccountInfoStorage instance].getUid]) { -// if (isReady) { -// //判断是否在麦上 -// if ([self isOnMicro:[userId longLongValue]]) { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_Ready]; -// } -// self.sudGameStatus = LittleGamePlayStatus_Ready; -// }else { -// if ([self isOnMicro:[userId longLongValue]]) { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_IsIn]; -// } -// self.sudGameStatus = LittleGamePlayStatus_IsIn; -// } -// } -//} -// -//- (void)handleState_MG_COMMON_PLAYER_CAPTAIN_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// /// 是否是队长:YES:是队长 NO:不是队长 -// BOOL isCaptain = NO; -// NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; -// if (dic) { -// /// 错误处理 -// NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; -// if (retCode != 0) { -// return; -// } -// isCaptain = [[dic objectForKey:@"isCaptain"] boolValue]; -// } -//} -// -//- (void)handleState_MG_COMMON_PLAYER_PLAYING_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// /// 是否正在游戏中 -// BOOL isPlaying = NO; -// NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; -// if (dic) { -// /// 错误处理 -// NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; -// if (retCode != 0) { -// return; -// } -// isPlaying = [[dic objectForKey:@"isPlaying"] boolValue]; -// } -// if ([userId isEqualToString:[AccountInfoStorage instance].getUid]) { -// if (isPlaying) { -// //判断是否在麦上 -// if ([self isOnMicro:[userId longLongValue]]) { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_Plying]; -// } -// if (self.delegate && [self.delegate respondsToSelector:@selector(hiddenSudGamePostionView)]) { -// [self.delegate hiddenSudGamePostionView]; -// } -// self.sudGameStatus = LittleGamePlayStatus_Plying; -// }else { -// if ([self isOnMicro:[userId longLongValue]]) { -// [self updateMicInfoWithGameStatus:LittleGamePlayStatus_IsIn]; -// } -// self.sudGameStatus = LittleGamePlayStatus_IsIn; -// } -// } -//} -// -//- (void)handleState_MG_DG_SELECTING_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// NSLog(@"handleState_MG_DG_SELECTING_WithUserId%@",dataJson); -//} -// -//- (void)handleState_MG_DG_PAINTING_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// NSLog(@"handleState_MG_DG_PAINTING_WithUserId%@",dataJson); -// /// 设置麦位状态为作画中 -// NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; -// bool isPainting = NO; -// if (dic) { -// isPainting = [dic[@"isPainting"] boolValue]; -// } -//} -// -//- (void)handleState_MG_DG_ERRORANSWER_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// /// 错误答案 -// NSLog(@"handleState_MG_DG_ERRORANSWER_WithUserId%@",dataJson); -// -//} -// -//- (void)handleState_MG_DG_TOTALSCORE_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// /// 总积分 -// NSLog(@"handleState_MG_DG_TOTALSCORE_WithUserId%@",dataJson); -//} -// -//- (void)handleState_MG_DG_SCORE_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { -// /// 本次积分 -// NSLog(@"handleState_MG_DG_SCORE_WithUserId%@",dataJson); -//} -// -///// 销毁MG -//- (void)destroyMG { -// if (self.hostDelegate.getRoomInfo.type == RoomType_MiniGame) { -// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ -// [self.fsmAPP2MG destroyMG]; -// }); -// } -//} -// -//#pragma mark - RoomGuestDelegate -//- (void)onRoomEntered { -// if (self.hostDelegate.getRoomInfo.type != RoomType_MiniGame) { -// self.hidden = YES; -// return; -// } else { -// self.hidden = NO; -// } -// [self updateSudGame]; -//} -// -//- (void)onRoomUpdate { -// if (self.hostDelegate.getRoomInfo.type != RoomType_MiniGame) { -// self.hidden = YES; -// [self.fsmAPP2MG destroyMG]; -// } else { -// self.hidden = NO; -// } -// [self updateSudGame]; -//} -//#pragma mark - RoomGuestDelegate -//- (void)handleNIMCustomMessage:(NIMMessage *)message { -// if (self.hostDelegate.getRoomInfo.type != RoomType_MiniGame) { -// return; -// } -// NIMCustomObject *obj = (NIMCustomObject *)message.messageObject; -// if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) { -// AttachmentModel *attachment = (AttachmentModel *)obj.attachment; -// if (attachment.first == CustomMessageType_Kick_User) { -// XPKickUserModel * kickModel = [XPKickUserModel modelWithJSON:attachment.data]; -// [self onDownMic:kickModel.uid]; -// } else if(attachment.first == CustomMessageType_Queue && attachment.second == Custom_Message_Sub_Queue_Kick) { -// XPKickUserModel * kickModel = [XPKickUserModel modelWithJSON:attachment.data]; -// [self onDownMic:kickModel.uid]; -// } -// } -//} -// -//- (void)handleNIMNotificationMessage:(NIMMessage *)message { -// if (self.hostDelegate.getRoomInfo.type != RoomType_MiniGame) {return;} -// NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject; -// NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content; -// switch (content.eventType) { -// case NIMChatroomEventTypeQueueChange: // 麦序上下麦 -// { -// NSDictionary* data = (NSDictionary *)content.ext; -// UserInfoModel* userInfo = [UserInfoModel modelWithJSON:[data objectForKey:NIMChatroomEventInfoQueueChangeItemValueKey]]; -// NSInteger changeType = [data[NIMChatroomEventInfoQueueChangeTypeKey] integerValue]; -// if (changeType != 1) { -// [self onDownMic:userInfo.uid]; -// } -// } -// break; -// default: -// break; -// } -//} -// -//- (void)handleNIMTextMessage:(NIMMessage *)message { -// if (self.hostDelegate.getRoomInfo.type != RoomType_MiniGame) {return;} -// if (message.from.integerValue == [AccountInfoStorage instance].getUid.integerValue && [self isInSudGame]) { -// [self notifyChangeTextHitState:message.text]; -// } -//} +#pragma mark - Private Method +- (void)updateSudGame { + if(self.currentmgId == self.gameModel.data.mgId.integerValue)return; + self.currentmgId = self.gameModel.data.mgId.integerValue; + [self initLittleGame]; +} + +- (void)initLittleGame { + [Api getSudGameCode:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + NSString * gameCode = data.data[@"code"]; + self.code = gameCode; + [self gameSetUp]; + } else { + [XNDJTDDLoadingTool showErrorWithMessage:msg]; + } + } uid:[AccountInfoStorage instance].getUid]; +} + +- (void)gameSetUp { + NSLog(@"小游戏的版本号是:%@", [SudMGP getVersion]); + BOOL isTestEnv = NO; +#ifdef DEBUG + isTestEnv = YES; +#else + isTestEnv = NO; +#endif + if(isEnterprise == NO){ + [[SudMGP getCfg]setBackgroundMode:NO]; + } + [SudMGP initSDK:KeyWithType(KeyType_SudGameAppID) appKey:KeyWithType(KeyType_SudGameAppKey) isTestEnv:isTestEnv listener:^(int retCode, const NSString *retMsg) { + if (retCode == 0) { + if (!self.currentmgId) { + return; + } + NSString * userId = [AccountInfoStorage instance].getUid; + NSString * roomId = self.gameModel.roomId; + NSLog(@"用户ID:%@,房间ID:%@, 游戏ID:%lld, code:%@", userId, roomId, self.currentmgId, self.code); +// + + NSString *language = [NSBundle getLanguageText]; + if ([language hasPrefix:@"zh"]) { + if ([language rangeOfString:@"Hans"].location != NSNotFound) { + language = @"zh-CN"; // 简体中文 + } else { + language = @"zh-TW"; // 繁體中文 + } + }else{ + language = @"en-US"; // 英文 + } + self.fsmAPP2MG = [SudMGP loadMG:userId roomId:roomId code:self.code mgId:self.currentmgId language:language fsmMG:self rootView:self]; + + + + + + } else { + /// 初始化失败, 可根据业务重试 + NSLog(@"ISudFSMMG:initGameSDKWithAppID:初始化sdk失败 :%@",retMsg); + } + }]; +} + +//判断是否在麦上 + + +//通过uid判断麦位 + + +//上麦以加入游戏 +- (void)upMicToJoinGame { + +} + +- (void)updateMicInfoWithGameStatus:(LittleGamePlayStatus)status { + +} + +/** + * 麦位更新扩展字段。 + */ +- (NSDictionary *)userInfoToQueueExt:(UserInfoModel *)userInfo { + MicroExtModel * extModel = [[MicroExtModel alloc] init]; + extModel.gender = userInfo.gender; + extModel.avatar = userInfo.avatar; + extModel.uid = userInfo.uid; + extModel.nick = userInfo.nick; + extModel.gameStatus = userInfo.gameStatus; + extModel.headWearUrl = userInfo.headwearEffect.length > 0 ? userInfo.headwearEffect : userInfo.headwearPic; + extModel.preventKick = userInfo.userVipInfoVO.preventKick; + extModel.enterHide = userInfo.userVipInfoVO.enterHide; + return [extModel model2dictionary]; +} + + + + +///下麦 +- (void)onDownMic:(NSInteger)uid { + if (uid == [AccountInfoStorage instance].getUid.integerValue) {//自己下麦 + [self notifyIsPlayingState:false]; + [self nofityPlayerPlaying:NO]; + [self notifySetReady:false]; + /// 下游戏麦 + [self notifySelfInState:false seatIndex:-1]; + } +} + +#pragma mark =======ISudFSMMG Delegate======= +/** +* 游戏日志 +*/ +-(void)onGameLog:(NSString*)dataJson { + NSLog(@"ISudFSMMG:onGameLog:%@", dataJson); + NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; + NSString * msg_string = [dic objectForKey:@"msg"]; + if (!msg_string) { + return; + } +} + +/** +* 游戏开始 +*/ +-(void)onGameStarted { + NSLog(@"ISudFSMMG:onGameStarted:游戏开始"); + [self notifySelfInState:YES seatIndex:-1];///加入房间 + [self handleSelfReadyEvent];///准备游戏 + +} + +/** + * 游戏销毁 + */ +-(void)onGameDestroyed { + NSLog(@"ISudFSMMG:onGameDestroyed:游戏开始"); +} + +/** + * Code过期 + * @param dataJson {"code":"value"} + */ +-(void)onExpireCode:(id)handle dataJson:(NSString*)dataJson { + NSLog(@"ISudFSMMG:onExpireCode:Code过期"); + // 请求业务服务器刷新令牌 + [Api getSudGameCode:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + NSString * gameCode = data.data[@"code"]; + self.code = gameCode; + [self.fsmAPP2MG updateCode:gameCode listener:^(int retCode, const NSString *retMsg, const NSString *dataJson) { + NSLog(@"ISudFSMMG:updateGameCode retCode=%@ retMsg=%@ dataJson=%@", @(retCode), retMsg, dataJson); + }]; + // 回调结果 + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@(0), @"ret_code", @"return form APP onExpireCode", @"ret_msg", nil]; + [handle success:[SudCommon dictionaryToJson:dict]]; + } else { + [XNDJTDDLoadingTool showErrorWithMessage:msg]; + } + } uid:[AccountInfoStorage instance].getUid]; +} + +/** + * 获取游戏View信息 + * @param handle 回调句柄 + * @param dataJson {} + */ +-(void)onGetGameViewInfo:(id)handle dataJson:(NSString*)dataJson { + CGRect rect = [[UIScreen mainScreen] bounds]; + CGFloat scale = [[UIScreen mainScreen] nativeScale]; + + CGFloat top = kGetScaleWidth(185) * scale; + CGFloat bottom = kGetScaleWidth(175) *scale; + + CGFloat width = rect.size.width * scale; + CGFloat height = rect.size.height * scale; + NSDictionary *rectDict = [NSDictionary dictionaryWithObjectsAndKeys:@(top), @"top", @(0), @"left", @(bottom), @"bottom", @(0), @"right", nil]; + NSDictionary *viewDict = [NSDictionary dictionaryWithObjectsAndKeys:@(width), @"width", @(height), @"height", nil]; + NSDictionary *dataDict = [NSDictionary dictionaryWithObjectsAndKeys:@(0), @"ret_code", @"return form APP onGetGameViewInfo", @"ret_msg", viewDict, @"view_size", rectDict, @"view_game_rect", nil]; + /// 回调 + [handle success:[SudCommon dictionaryToJson:dataDict]]; +} + +/** + * 获取游戏配置 + * @param handle 回调句柄 + * @param dataJson {} + */ +-(void)onGetGameCfg:(id)handle dataJson:(NSString*)dataJson { + NSString *configJson = self.gameModel.data.configJson; + if(configJson != nil){ + [handle success:configJson]; + return; + } + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + dict[@"ret_code"] = @(0); + dict[@"ret_msg"] = @"return form APP onGetGameCfg"; + + dict[@"ui"] = @{ + @"join_btn" : @{@"custom": @(YES), @"hide": @(YES)},//加入游戏 + @"start_btn" : @{@"custom": @(YES), @"hide": @(YES)},//开始游戏 + @"ready_btn" : @{@"custom": @(YES), @"hide": @(YES)},//准备游戏 + @"lobby_players" : @{@"custom": @(YES), @"hide": @(YES)},//游戏中坑位点击 + @"level" : @{@"custom": @(YES), @"hide" : @(YES)},//段位信息 + @"cancel_join" : @{@"custom": @(YES), @"hide" : @(YES)},//退出游戏 + }; + NSString *dataJsonRet = @""; + NSData *dataJsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil]; + if (dataJsonData != nil) { + dataJsonRet = [[NSString alloc]initWithData:dataJsonData encoding:NSUTF8StringEncoding]; + } + [handle success:dataJsonRet]; +} + +/** + * 游戏状态变化 + * @param handle 回调句柄 + * @param state 游戏状态 + * @param dataJson 回调json + */ +-(void)onGameStateChange:(id) handle state:(NSString*) state dataJson:(NSString*) dataJson { + + if([state isEqualToString:MG_COMMON_GAME_SETTLE]){ + NSDictionary *data = @{@"value0":self.gameModel.data.matchRoundId ?: @""}; + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[data mj_JSONString] , @"reportGameInfoExtras",@"value0" , @"reportGameInfoKey" ,nil]; + [self notifyStateChange:MG_COMMON_GAME_SETTLE dataJson:[SudCommon dictionaryToJson:dic]]; + if([dataJson containsString:@"value0"]){ + return; + } + NSDictionary *results = [dataJson mj_JSONObject]; + NSArray *list = [MSRoomGameResultsModel modelsWithArray:results[@"results"]]; + if(self.delegate && [self.delegate respondsToSelector:@selector(getGameRsultsWithList:)]){ + [self.delegate getGameRsultsWithList:list]; + } + + + }else if ([state isEqualToString:MG_COMMON_PUBLIC_MESSAGE]) { + NSLog(@"ISudFSMMG:onGameStateChange:游戏->APP:公屏消息"); + } else if ([state isEqualToString:MG_COMMON_KEY_WORD_TO_HIT]) { + + }else if ([state isEqualToString:MG_COMMON_SELF_CLICK_JOIN_BTN]) {//加入游戏按钮点击 + NSDictionary *dic = [SudCommon turnStringToDictionary:dataJson]; + int seatIndex = -1; + if ([dic objectForKey:@"seatIndex"]) { + seatIndex = [[dic objectForKey:@"seatIndex"] intValue]; + } + if (seatIndex == -1) { + NSLog(@"来自加入按钮%d",seatIndex); + }else { + NSLog(@"来自麦位+入%d",seatIndex); + } + [self notifySelfInState:YES seatIndex:-1]; + } else if([state isEqualToString:MG_COMMON_SELF_CLICK_START_BTN]) {//开始游戏按钮点击 + [self notifyIsPlayingState:YES]; + } else if ([state isEqualToString:MG_COMMON_SELF_CLICK_CANCEL_JOIN_BTN]) { + /// 取消加入游戏(退出游戏按钮点击) + [self handleSelfInExitEvent]; + } else { + /// 其他状态 + NSLog(@"ISudFSMMG:onGameStateChange:游戏->APP:state:%@",MG_COMMON_PUBLIC_MESSAGE); + } +} + +/** + * 游戏玩家状态变化 + * @param handle 回调句柄 + * @param userId 用户id + * @param state 玩家状态 + * @param dataJson 回调JSON + */ +-(void)onPlayerStateChange:(nullable id) handle userId:(NSString*) userId state:(NSString*) state dataJson:(NSString*) dataJson { + NSLog(@"ISudFSMMG:onPlayerStateChange:游戏->APP:游戏玩家状态变化:userId: %@ --state: %@ --dataJson: %@", userId, state, dataJson); + /// 状态解析 + NSString *dataStr = @""; + if ([state isEqualToString:MG_COMMON_PLAYER_IN]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView0"); + [self handleState_MG_COMMON_PLAYER_IN_WithUserId:userId dataJson:dataJson]; + } else if ([state isEqualToString:MG_COMMON_PLAYER_READY]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView1"); + [self handleState_MG_COMMON_PLAYER_READY_WithUserId:userId dataJson:dataJson]; + if(userId != nil && ![self.userList containsObject:userId]){ + [self.userList addObject:userId]; + } + if(self.userList.count > 1 && self.sudGameStatus != LittleGamePlayStatus_Plying){ + [self handleGameStartEvent];///开始游戏 + [self.userList removeAllObjects]; + + self.sudGameStatus = LittleGamePlayStatus_Plying; + } + } else if ([state isEqualToString:MG_COMMON_PLAYER_CAPTAIN]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView2"); + [self handleState_MG_COMMON_PLAYER_CAPTAIN_WithUserId:userId dataJson:dataJson]; + + } else if ([state isEqualToString:MG_COMMON_PLAYER_PLAYING]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView3"); + [self handleState_MG_COMMON_PLAYER_PLAYING_WithUserId:userId dataJson:dataJson]; + } else if ([state isEqualToString:MG_DG_SELECTING]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView4"); + [self handleState_MG_DG_SELECTING_WithUserId:userId dataJson:dataJson]; + } else if ([state isEqualToString:MG_DG_PAINTING]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView5"); + [self handleState_MG_DG_PAINTING_WithUserId:userId dataJson:dataJson]; + } else if ([state isEqualToString:MG_DG_ERRORANSWER]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView6"); + [self handleState_MG_DG_ERRORANSWER_WithUserId:userId dataJson:dataJson]; + } else if ([state isEqualToString:MG_DG_TOTALSCORE]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView7"); + [self handleState_MG_DG_TOTALSCORE_WithUserId:userId dataJson:dataJson]; + } else if ([state isEqualToString:MG_DG_SCORE]) { + dataStr = YMLocalizedString(@"XPRoomLittleGameContainerView8"); + [self handleState_MG_DG_SCORE_WithUserId:userId dataJson:dataJson]; + }else { + NSLog(@"ISudFSMMG:onPlayerStateChange:未做解析状态:%@", MG_DG_SCORE); + } + NSLog(@"ISudFSMMG:onPlayerStateChange:dataStr:%@", dataStr); + /// 回调 + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@(0), @"ret_code", @"return form APP onPlayerStateChange", @"ret_msg", nil]; + [handle success:[SudCommon dictionaryToJson:dict]]; +} + +/// 退出游戏 +- (void)handleSelfInExitEvent { + + + /// 下游戏麦 + [self notifyIsPlayingState:false]; + [self nofityPlayerPlaying:NO]; + [self notifySetReady:false]; + [self notifySetEnd]; + /// 下游戏麦 + [self notifySelfInState:false seatIndex:-1]; + self.sudGameStatus = LittleGamePlayStatus_NoIn; +} + +/// 准备游戏 +- (void)handleSelfReadyEvent { + [self notifySetReady:true]; +} + +/// 取消准备 +- (void)handleSelfCancelReadyEvent { + [self notifySetReady:false]; +} + +/// 开始游戏 +- (void)handleGameStartEvent { + [self notifyIsPlayingState:YES]; +} + +#pragma mark =======APP->游戏状态处理======= +/// 状态通知(app to mg) +/// @param state 状态名称 +/// @param dataJson 需传递的json +- (void)notifyStateChange:(NSString *) state dataJson:(NSString*) dataJson { + [self.fsmAPP2MG notifyStateChange:state dataJson:dataJson listener:^(int retCode, const NSString *retMsg, const NSString *dataJson) { + NSLog(@"ISudFSMMG:notifyStateChange:retCode=%@ retMsg=%@ dataJson=%@", @(retCode), retMsg, dataJson); + + if (retCode == 0 && [state isEqualToString:APP_COMMON_SELF_PLAYING]) {//开始游戏 + //上报游戏开始 + NSString *mgid = [NSString stringWithFormat:@"%lld", self.currentmgId]; + if (mgid.length <= 0) { + return; + } + + } else if (retCode == 0 && [state isEqualToString:APP_COMMON_SELF_END]) {//结束游戏 + + } + }]; +} + +/// 加入,退出游戏 +/// @param isIn YES:加入 NO:退出 +- (void)notifySelfInState:(BOOL)isIn uid:(NSInteger)uid { + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isIn), @"isIn", @(1), @"teamId", nil]; + [self notifyStateChange:APP_COMMON_SELF_IN dataJson:[SudCommon dictionaryToJson:dic]]; +} + +/// 加入,退出游戏 +/// @param isIn YES:加入 NO:退出 +- (void)notifySelfInState:(BOOL)isIn seatIndex:(int)seatIndex { + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(seatIndex), @"seatIndex", @(isIn), @"isIn", @(1), @"teamId", nil]; + [self notifyStateChange:APP_COMMON_SELF_IN dataJson:[SudCommon dictionaryToJson:dic]]; +} + +/// 踢出用户 +/// @param userId 踢出用户id +- (void)notifyKickStateWithUserId:(NSString *)userId { + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:userId, @"kickedUID", nil]; + [self notifyStateChange:APP_COMMON_SELF_KICK dataJson:[SudCommon dictionaryToJson:dic]]; +} + +/// 设置用户为队长 +/// @param userId 被设置用户id +- (void)notifySetCaptainStateWithUserId:(NSString *)userId { + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:userId, @"curCaptainUID", nil]; + [self notifyStateChange:APP_COMMON_SELF_CAPTAIN dataJson:[SudCommon dictionaryToJson:dic]]; + +} + +/// 命中 关键词状态 (你画我猜) +- (void)notifyChangeTextHitState:(NSString *)keyWord { + +} + +/// 是否设置为准备状态 +- (void)notifySetReady:(BOOL)isReady { + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isReady), @"isReady", nil]; + [self notifyStateChange:APP_COMMON_SELF_READY dataJson:[SudCommon dictionaryToJson:dic]]; +} + +/// 停止游戏状态设置 +- (void)notifySetEnd { + [self notifyStateChange:APP_COMMON_SELF_END dataJson:[SudCommon dictionaryToJson:@{}]]; +} + +/// 游戏中状态设置 +- (void)notifyIsPlayingState:(BOOL)isPlaying { + NSDictionary *data = @{@"value0":self.gameModel.data.matchRoundId ?: @""}; + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isPlaying), @"isPlaying",[data mj_JSONString] , @"reportGameInfoExtras",@"value0", @"reportGameInfoKey" ,nil]; + [self notifyStateChange:APP_COMMON_SELF_PLAYING dataJson:[SudCommon dictionaryToJson:dic]]; +} + +///游戏中退出游戏 +- (void)nofityPlayerPlaying:(BOOL)isPlaying { + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@(isPlaying), @"isPlaying", nil]; + [self notifyStateChange:MG_COMMON_PLAYER_PLAYING dataJson:[SudCommon dictionaryToJson:dic]]; +} + +#pragma mark =======游戏->APP状态处理======= +- (void)handleState_MG_COMMON_PLAYER_IN_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; + /// 加入状态:YES加入,NO退出 + BOOL isIn = NO; + if (dic) { + NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; + if (retCode != 0) { + return; + } + isIn = [[dic objectForKey:@"isIn"] boolValue]; + } + if ([userId isEqualToString:[AccountInfoStorage instance].getUid]) {//是当前用户 + if (isIn) {//加入了游戏 + //判断是否在麦上 + + //判断是否为房主,房主需要设为队长 + if (self.gameModel.roomId.integerValue == userId.integerValue) { + [self notifySetCaptainStateWithUserId:userId]; + } + + + + }else {//退出了游戏 + + + } + } else {//退出游戏 + if (self.sudGameStatus == LittleGamePlayStatus_Plying) {//游戏进行中,用户退出 + + + + } + } +} + +- (void)handleState_MG_COMMON_PLAYER_READY_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + /// 玩家是否准备,YES:已准备,NO:未准备 + BOOL isReady = NO; + NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; + if (dic) { + NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; + if (retCode != 0) { + return; + } + isReady = [[dic objectForKey:@"isReady"] boolValue]; + } + if ([userId isEqualToString:[AccountInfoStorage instance].getUid]) { + if (isReady) { + //判断是否在麦上 + + + }else { + + + } + } +} + +- (void)handleState_MG_COMMON_PLAYER_CAPTAIN_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + /// 是否是队长:YES:是队长 NO:不是队长 + BOOL isCaptain = NO; + NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; + if (dic) { + /// 错误处理 + NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; + if (retCode != 0) { + return; + } + isCaptain = [[dic objectForKey:@"isCaptain"] boolValue]; + } +} + +- (void)handleState_MG_COMMON_PLAYER_PLAYING_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + /// 是否正在游戏中 + BOOL isPlaying = NO; + NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; + if (dic) { + /// 错误处理 + NSInteger retCode = [[dic objectForKey:@"retCode"] integerValue]; + if (retCode != 0) { + return; + } + isPlaying = [[dic objectForKey:@"isPlaying"] boolValue]; + } + if ([userId isEqualToString:[AccountInfoStorage instance].getUid]) { + if (isPlaying) { + + + }else { + + + } + } +} + +- (void)handleState_MG_DG_SELECTING_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + NSLog(@"handleState_MG_DG_SELECTING_WithUserId%@",dataJson); +} + +- (void)handleState_MG_DG_PAINTING_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + NSLog(@"handleState_MG_DG_PAINTING_WithUserId%@",dataJson); + /// 设置麦位状态为作画中 + NSDictionary * dic = [SudCommon turnStringToDictionary:dataJson]; + bool isPainting = NO; + if (dic) { + isPainting = [dic[@"isPainting"] boolValue]; + } +} + +- (void)handleState_MG_DG_ERRORANSWER_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + /// 错误答案 + NSLog(@"handleState_MG_DG_ERRORANSWER_WithUserId%@",dataJson); + +} + +- (void)handleState_MG_DG_TOTALSCORE_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + /// 总积分 + NSLog(@"handleState_MG_DG_TOTALSCORE_WithUserId%@",dataJson); +} + +- (void)handleState_MG_DG_SCORE_WithUserId:(NSString *)userId dataJson:(NSString *)dataJson { + /// 本次积分 + NSLog(@"handleState_MG_DG_SCORE_WithUserId%@",dataJson); +} + +/// 销毁MG +- (void)destroyMG { + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.fsmAPP2MG destroyMG]; + }); + +} + +#pragma mark - RoomGuestDelegate +- (void)onRoomEntered { + + [self updateSudGame]; +} + +- (void)onRoomUpdate { + + [self.fsmAPP2MG destroyMG]; + + [self updateSudGame]; +} +#pragma mark - RoomGuestDelegate +- (void)handleNIMCustomMessage:(NIMMessage *)message { + +} + +- (void)handleNIMNotificationMessage:(NIMMessage *)message { + + NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject; + NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content; + switch (content.eventType) { + case NIMChatroomEventTypeQueueChange: // 麦序上下麦 + { + NSDictionary* data = (NSDictionary *)content.ext; + UserInfoModel* userInfo = [UserInfoModel modelWithJSON:[data objectForKey:NIMChatroomEventInfoQueueChangeItemValueKey]]; + NSInteger changeType = [data[NIMChatroomEventInfoQueueChangeTypeKey] integerValue]; + if (changeType != 1) { + [self onDownMic:userInfo.uid]; + } + } + break; + default: + break; + } +} + +- (void)handleNIMTextMessage:(NIMMessage *)message { + if (message.from.integerValue == [AccountInfoStorage instance].getUid.integerValue && [self isInSudGame]) { + [self notifyChangeTextHitState:message.text]; + } +} + +- (NSMutableArray *)userList{ + if(!_userList){ + _userList = [NSMutableArray array]; + } + return _userList; +} @end diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.h b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.h index 345c5015..dd002add 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.h +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.h @@ -11,7 +11,8 @@ NS_ASSUME_NONNULL_BEGIN @protocol MSTabbarBeginGameViewDelegate //开始游戏 -(void)startMatchGameActionWithModel:(MSTabbarRoomGameItemModel *)model; - +///规则 +-(void)clickRuleActionWithModel:(MSTabbarRoomGameItemModel *)model; @end @interface MSTabbarBeginGameView : UIView @property(nonatomic,weak) iddelegate; diff --git a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.m b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.m index ea627122..d8792958 100644 --- a/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.m +++ b/YuMi/Modules/YMRoom/View/RoomGame/View/SubView/MSTabbarBeginGameView.m @@ -98,7 +98,11 @@ _coinNumView.text = _itemModel.ticket; _titleView.text = _itemModel.modeName; } - +-(void)ruleBtnAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(clickRuleActionWithModel:)]){ + [self.delegate clickRuleActionWithModel:self.itemModel]; + } +} #pragma mark - 懒加载 - (UIImageView *)bgImageView{ if(!_bgImageView){ @@ -155,6 +159,7 @@ _ruleBtn = [UIButton new]; [_ruleBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; [_ruleBtn setBackgroundImage:kImage(@"ms_room_game_begin_rule_icon") forState:UIControlStateNormal]; + [_ruleBtn addTarget:self action:@selector(ruleBtnAction) forControlEvents:UIControlEventTouchUpInside]; } return _ruleBtn; } diff --git a/YuMi/Modules/YMTabbar/View/TabbarViewController.m b/YuMi/Modules/YMTabbar/View/TabbarViewController.m index 6fc2f826..005016e9 100644 --- a/YuMi/Modules/YMTabbar/View/TabbarViewController.m +++ b/YuMi/Modules/YMTabbar/View/TabbarViewController.m @@ -34,7 +34,10 @@ #import "YYUtility.h" #import "XPWeakTimer.h" #import "PLTimeUtil.h" +#import "Api+MSRoomGameApi.h" + ///Model +#import "MSRoomGameModel.h" #import "AccountModel.h" #import "RoomInfoModel.h" #import "AttachmentModel.h" @@ -48,6 +51,7 @@ #import "XPRedPacketModel.h" #import "GiftReceiveInfoModel.h" #import "XPVersionUpdateModel.h" +#import "MSRoomGameQuitGameView.h" ///VC #import "TabbarViewController.h" #import "XPBlankViewController.h" @@ -66,6 +70,7 @@ #import "XPWebViewController.h" #import "XPMineUserInfoViewController.h" #import "MSTabbarRoomGameVC.h" +#import "MSRoomGameVC.h" #import "XPMonentsRecommendViewController.h" #import "XPMonentsViewController.h" @@ -82,7 +87,7 @@ #import #import "Api+Gift.h" #import "UploadFile.h" - +#import "XPTabBar.h" NSString * const kUserFirstLoginKey = @"kUserFirstLoginKey"; @@ -92,7 +97,7 @@ NSString * const kNetworkReachabilityKey = @"kNetworkReachabilityKey"; UIKIT_EXTERN NSString * kNewUserRechargeKey; UIKIT_EXTERN NSString *kTabShowAnchorCardKey; -@interface TabbarViewController () +@interface TabbarViewController () { NSTimer * timer; } @@ -136,7 +141,8 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; - (void)viewDidLoad { [super viewDidLoad]; - +// XPTabBar *tabbar = [[XPTabBar alloc]initWithFrame:CGRectMake(0, KScreenHeight - kTabBarHeight, KScreenWidth, kTabBarHeight)]; +// [self setValue:tabbar forKey:@"tabBar"]; [self.presenter autoLogin]; [self configTheme]; [self initTabs:NO]; @@ -248,7 +254,41 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; [[NSUserDefaults standardUserDefaults] synchronize]; } } +-(void)getRoomGameInfo{ + [Api getRoomGameDetails:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if(code == 200){ + MSRoomGameModel *model = [MSRoomGameModel modelWithJSON:data.data]; + if(model.data.matchStatus == 1 && model.data.roundStatus == 0){ + MSTabbarRoomGameItemModel *chooseGameModel = [MSTabbarRoomGameItemModel new]; + chooseGameModel.scores = model.data.scores; + chooseGameModel.roomId = model.roomId; + MSRoomGameQuitGameView *quitGameView = [[MSRoomGameQuitGameView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + quitGameView.chooseGameModel = chooseGameModel; + quitGameView.delegate = self; + [TTPopup popupView:quitGameView style:TTPopupStyleAlert]; + + } + } + } roomType:@"0"]; +} +#pragma mark -MSRoomGameQuitGameViewDelegate +///退出游戏 +- (void)closeGameActionWithModel:(MSTabbarRoomGameItemModel *)model{ + [Api closeRoomGame:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + + } roomId:model.roomId]; +} +///强杀app打开后,是否重新玩游戏 +-(void)replayTheGameWithModel:(MSTabbarRoomGameItemModel *)model{ + MSRoomGameVC *gameVC = [MSRoomGameVC new]; + + gameVC.chooseGameModel = model; + gameVC.userinfo = self.userInfo; + BaseNavigationController *nav = [[BaseNavigationController alloc]initWithRootViewController:gameVC]; + nav.modalPresentationStyle = UIModalPresentationFullScreen; + [self presentViewController:nav animated:YES completion:nil]; +} /// 获取用户信息后检查:1、是否绑定手机号;2、是否需要完善用户信息。 /// 该逻辑仅在刷新ticket后执行一次。 /// 当前服务端接口是有未完善信息的全局拦截的,在BaseMvpPresenter里会触发1415去完善用户信息。 @@ -261,6 +301,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; return; } self.userInfo = userInfo; + [self getRoomGameInfo]; [AccountInfoStorage instance].name = self.userInfo.nick; if ((userInfo.nick == nil || userInfo.avatar == nil) && self.isFormLogin == NO) { @@ -726,7 +767,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; } - (BaseNavigationController *)createTabBarItem:(UIViewController *)itemVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage{ - itemVc.title = title; + itemVc.title = @"" ; itemVc.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; itemVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [itemVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x1F1B4F)} forState:UIControlStateSelected]; @@ -760,7 +801,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; if (model.total > 99) { badge = @"99+"; } - NSUInteger index = 1; + NSUInteger index = 2; UITabBarItem *item = self.tabBar.items.count > index ? self.tabBar.items[index] : nil; [item setBadgeValue:badge]; } @@ -773,7 +814,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; unreadCount += obj.unreadCount; }]; if(unreadCount > 0){ - NSUInteger index = 2; + NSUInteger index = 3; UITabBarItem *item = self.tabBar.items.count > index ? self.tabBar.items[index] : nil; [item setBadgeValue:[NSString stringWithFormat:@"%ld",unreadCount]]; } diff --git a/YuMi/Modules/YMTabbar/View/XPTabBar.m b/YuMi/Modules/YMTabbar/View/XPTabBar.m index dd8499fb..266650cb 100644 --- a/YuMi/Modules/YMTabbar/View/XPTabBar.m +++ b/YuMi/Modules/YMTabbar/View/XPTabBar.m @@ -10,15 +10,14 @@ #import "YUMIMacroUitls.h" #import "DJDKMIMOMColor.h" -CGFloat tabBarHeight = 60.0; // TabBar高度 -CGFloat leftRightSpace = 8.0; // TabBar左右距离 + +CGFloat leftRightSpace = 20.0; // TabBar左右距离 CGFloat bottomSpace = 29.0; // TabBar离底部距离 -NSInteger itemCount = 4; // tabBarItem的数量 +NSInteger itemCount = 5; // tabBarItem的数量 @interface XPTabBar() -/// 背景 -@property (nonatomic, strong) UIView *bgView; + @end @@ -28,7 +27,7 @@ NSInteger itemCount = 4; // tabBarItem的数量 self = [super initWithFrame:frame]; if(self) { - [self addSubview:self.bgView]; + self.backgroundColor = [UIColor whiteColor]; // 去除顶部横线 [self setBackgroundImage:[UIImage new]]; [self setShadowImage:[UIImage new]]; @@ -57,7 +56,7 @@ NSInteger itemCount = 4; // tabBarItem的数量 - (void)layoutSubviews { [super layoutSubviews]; // 重设tabBar的位置 - self.frame = CGRectMake(0, KScreenHeight- tabBarHeight-bottomSpace, KScreenWidth, tabBarHeight); + self.frame = CGRectMake(0, KScreenHeight- kTabBarHeight, KScreenWidth, kTabBarHeight); // 设置其他tabbarbtn的frame CGFloat tabBarButtonW = (KScreenWidth-leftRightSpace*2)/itemCount; @@ -65,25 +64,13 @@ NSInteger itemCount = 4; // tabBarItem的数量 for (UIView *child in self.subviews) { Class class = NSClassFromString(@"UITabBarButton"); if ([child isKindOfClass:class]) { - CGRect frame = CGRectMake(tabBarButtonIndex * tabBarButtonW+leftRightSpace, (tabBarHeight-49)/2, tabBarButtonW, 49); + CGRect frame = CGRectMake(tabBarButtonIndex * tabBarButtonW+leftRightSpace, 17, 34, 34); child.frame = frame; tabBarButtonIndex ++; } } } -- (UIView *)bgView { - if (!_bgView) { - _bgView = [[UIView alloc] init]; - _bgView.backgroundColor = [[DJDKMIMOMColor tabbarViewColor] colorWithAlphaComponent:0.95]; - _bgView.frame = CGRectMake(leftRightSpace, 0, KScreenWidth-leftRightSpace*2, tabBarHeight); - _bgView.layer.cornerRadius = tabBarHeight/2.0; - _bgView.layer.shadowColor = [UIColor.blackColor colorWithAlphaComponent:0.5].CGColor; - _bgView.layer.shadowOffset = CGSizeMake(0, 0); - _bgView.layer.shadowOpacity = 0.2; - _bgView.layer.shadowRadius = 5; - } - return _bgView; -} + @end diff --git a/YuMi/Modules/YMWeb/XPWebViewController.h b/YuMi/Modules/YMWeb/XPWebViewController.h index 7e973917..d7683dfd 100644 --- a/YuMi/Modules/YMWeb/XPWebViewController.h +++ b/YuMi/Modules/YMWeb/XPWebViewController.h @@ -40,7 +40,7 @@ NS_ASSUME_NONNULL_BEGIN ///关闭webView 目前适用于半屏的情况下 @property (nonatomic,copy) void (^CloseWebViewBlock)(BOOL result); - (instancetype)initWithCustomizeNav:(BOOL)isCustom; - +- (instancetype)initWithGame; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/zh-Hans.lproj/Localizable.strings b/YuMi/zh-Hans.lproj/Localizable.strings index 8aa2925c..a305bf12 100644 --- a/YuMi/zh-Hans.lproj/Localizable.strings +++ b/YuMi/zh-Hans.lproj/Localizable.strings @@ -3274,15 +3274,21 @@ ///MSRoomGameVictoryView "MSRoomGameVictoryView0"="重新匹配"; ///MSRoomGameQuitGameView -"MSRoomGameQuitGameView0"="游戏已经开始,退出房间将默认 游戏失败,确认退出房间?"; +"MSRoomGameQuitGameView0"="游戏已经开始,退出房间将默认游戏失败,确认退出房间?"; "MSRoomGameQuitGameView1"="退出"; "MSRoomGameQuitGameView2"="继续游戏"; +"MSRoomGameQuitGameView3"="匹配失败,是否重新匹配?"; +"MSRoomGameQuitGameView4"="游戏进行中,是否返回房间?"; + + //MSRoomGameHeadView "MSRoomGameHeadView0"="匹配中"; "MSRoomGameHeadView1"="匹配成功"; "MSRoomGameHeadView2"="获胜奖励%@金币"; - +"MSRoomGameHeadView3"="%@金币"; //MSRoomGameVC "MSRoomGameVC0"="匹配失败"; +"MSRoomGameVC1"="钱包"; + diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index 1013d2ba..3d108710 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -3260,3 +3260,22 @@ "MSRoomSetingBackdropCell0"="使用中"; "MSRoomSetingBackdropCell1"="確認選擇這張圖片作為房間主題嗎?"; +///MSTabbarBeginGameView +"MSTabbarBeginGameView0"="开始"; +///MSRoomGameVictoryView +"MSRoomGameVictoryView0"="重新匹配"; +///MSRoomGameQuitGameView +"MSRoomGameQuitGameView0"="游戏已经开始,退出房间将默认游戏失败,确认退出房间?"; +"MSRoomGameQuitGameView1"="退出"; +"MSRoomGameQuitGameView2"="继续游戏"; +"MSRoomGameQuitGameView3"="匹配失败,是否重新匹配?"; +"MSRoomGameQuitGameView4"="游戏进行中,是否返回房间?"; + +//MSRoomGameHeadView +"MSRoomGameHeadView0"="匹配中"; +"MSRoomGameHeadView1"="匹配成功"; +"MSRoomGameHeadView2"="获胜奖励%@金币"; +"MSRoomGameHeadView3"="%@金币"; +//MSRoomGameVC +"MSRoomGameVC0"="匹配失败"; +"MSRoomGameVC1"="钱包";